diff --git a/toonz/sources/include/toonzqt/menubarcommand.h b/toonz/sources/include/toonzqt/menubarcommand.h index 8bb6e9b0..8891923d 100644 --- a/toonz/sources/include/toonzqt/menubarcommand.h +++ b/toonz/sources/include/toonzqt/menubarcommand.h @@ -170,6 +170,8 @@ public: // use setToggleTexts for toggle commands that have two names according to the current status. e.g. show/hide something void setToggleTexts(CommandId id, const QString &onText, const QString &offText); + + std::string getIdFromAction(QAction* action); }; //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 0b114d13..53cb6f92 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -72,6 +72,7 @@ set(MOC_HEADERS mainwindow.h matchline.h menubar.h + menubarpopup.h menubarcommandids.h meshifypopup.h messagepanel.h @@ -159,6 +160,7 @@ set(SOURCES mainwindow.cpp matchline.cpp menubar.cpp + menubarpopup.cpp mergecolumns.cpp moviegenerator.cpp pane.cpp diff --git a/toonz/sources/toonz/menubar.cpp b/toonz/sources/toonz/menubar.cpp index 94181881..866880ff 100644 --- a/toonz/sources/toonz/menubar.cpp +++ b/toonz/sources/toonz/menubar.cpp @@ -6,6 +6,8 @@ #include "menubarcommandids.h" #include "tapp.h" #include "cellselection.h" +#include "mainwindow.h" +#include "menubarpopup.h" // TnzQt includes #include "toonzqt/tselectionhandle.h" @@ -20,6 +22,7 @@ #include "toonz/txsheethandle.h" #include "toonz/tframehandle.h" #include "toonz/tcolumnhandle.h" +#include "toonz/toonzfolders.h" // TnzTools includes #include "tools/toolcommandids.h" @@ -29,6 +32,7 @@ // TnzCore includes #include "tconvert.h" +#include "tsystem.h" // Qt includes #include @@ -151,11 +155,19 @@ void RoomTabWidget::contextMenuEvent(QContextMenuEvent *event) connect(newRoom, SIGNAL(triggered()), SLOT(addNewTab())); int index = tabAt(event->pos()); - if (index != currentIndex() && index >= 0) + if (index >= 0) { m_tabToDeleteIndex = index; - QAction* deleteRoom = menu->addAction(tr("Delete Room %1").arg(tabText(index))); - connect(deleteRoom, SIGNAL(triggered()), SLOT(deleteTab())); + if (index != currentIndex()) + { + QAction* deleteRoom = menu->addAction(tr("Delete Room \"%1\"").arg(tabText(index))); + connect(deleteRoom, SIGNAL(triggered()), SLOT(deleteTab())); + } +#if defined(_WIN32) || defined(_CYGWIN_) + /*- customize menubar -*/ + QAction* customizeMenuBar = menu->addAction(tr("Customize Menu Bar of Room \"%1\"").arg(tabText(index))); + connect(customizeMenuBar, SIGNAL(triggered()), SLOT(onCustomizeMenuBar())); +#endif } menu->exec(event->globalPos()); } @@ -204,6 +216,16 @@ void RoomTabWidget::setIsLocked(bool lock) LockRoomTabToggle = (lock) ? 1 : 0; } +//----------------------------------------------------------------------------- + +void RoomTabWidget::onCustomizeMenuBar() +{ + /*- use m_tabToDeleteIndex for index of a room of which menubar is to be customized -*/ + assert(m_tabToDeleteIndex != -1); + + emit customizeMenuBar(m_tabToDeleteIndex); +} + //============================================================================= // StackedMenuBar //----------------------------------------------------------------------------- @@ -239,17 +261,32 @@ void StackedMenuBar::createMenuBarByName(const QString &roomName) addWidget(createFullMenuBar()); #endif } + //--------------------------------------------------------------------------------- void StackedMenuBar::loadAndAddMenubar(const TFilePath & fp) { - std::wcout << fp.getWideString() << std::endl; +#if defined(_WIN32) || defined(_CYGWIN_) + QMenuBar* menuBar = loadMenuBar(fp); + if (menuBar) + addWidget(menuBar); + else + addWidget(createFullMenuBar()); +#else + /* OSX では stacked menu が動いていないのでとりあえず full のみ作成する */ + addWidget(createFullMenuBar()); +#endif +} + +//--------------------------------------------------------------------------------- + +QMenuBar* StackedMenuBar::loadMenuBar(const TFilePath & fp) +{ QFile file(toQString(fp)); if (!file.open(QFile::ReadOnly | QFile::Text)){ qDebug() << "Cannot read file" << file.errorString(); - addWidget(createFullMenuBar()); - return; + return 0; } QXmlStreamReader reader(&file); @@ -284,7 +321,7 @@ void StackedMenuBar::loadAndAddMenubar(const TFilePath & fp) if (action) menuBar->addAction(action); else - reader.raiseError(tr("Failed to add command %1").arg(cmdName)); + reader.raiseError(tr("Failed to add command %1").arg(cmdName)); } else reader.skipCurrentElement(); @@ -297,10 +334,9 @@ void StackedMenuBar::loadAndAddMenubar(const TFilePath & fp) if (reader.hasError()) { delete menuBar; - addWidget(createFullMenuBar()); + return 0; } - else - addWidget(menuBar); + return menuBar; } //--------------------------------------------------------------------------------- @@ -1394,6 +1430,45 @@ void StackedMenuBar::deleteMenuBar(int index) delete menuBar; } +//----------------------------------------------------------------------------- + +void StackedMenuBar::doCustomizeMenuBar(int index) +{ + MainWindow* mainWin = dynamic_cast(TApp::instance()->getMainWindow()); + assert(mainWin); + Room* room = mainWin->getRoom(index); + if (!room) return; + + MenuBarPopup mbPopup(room); + + if (mbPopup.exec()) + { + /*- OKが押され、roomname_menubar.xmlが更新された状態 -*/ + /*- xmlファイルからメニューバーを作り直して格納 -*/ + std::string mbFileName = room->getPath().getName() + "_menubar.xml"; + TFilePath mbPath = ToonzFolder::getMyModuleDir() + mbFileName; + if (!TFileStatus(mbPath).isReadable()) + { + DVGui::MsgBox(WARNING, tr("Cannot open menubar settings file %1").arg(QString::fromStdString(mbFileName))); + return; + } + QMenuBar* newMenu = loadMenuBar(mbPath); + if (!newMenu) + { + DVGui::MsgBox(WARNING, tr("Failed to create menubar")); + return; + } + + QWidget* oldMenu = widget(index); + removeWidget(oldMenu); + insertWidget(index, newMenu); + delete oldMenu; + + setCurrentIndex(index); + } +} + + //============================================================================= // DvTopBar //----------------------------------------------------------------------------- @@ -1446,6 +1521,7 @@ TopBar::TopBar(QWidget *parent) ret = ret && connect(m_roomTabBar, SIGNAL(indexSwapped(int, int)), m_stackedMenuBar, SLOT(onIndexSwapped(int, int))); ret = ret && connect(m_roomTabBar, SIGNAL(insertNewTabRoom()), m_stackedMenuBar, SLOT(insertNewMenuBar())); ret = ret && connect(m_roomTabBar, SIGNAL(deleteTabRoom(int)), m_stackedMenuBar, SLOT(deleteMenuBar(int))); + ret = ret && connect(m_roomTabBar, SIGNAL(customizeMenuBar(int)), m_stackedMenuBar, SLOT(doCustomizeMenuBar(int))); ret = ret && connect(m_lockRoomCB, SIGNAL(toggled(bool)), m_roomTabBar, SLOT(setIsLocked(bool))); assert(ret); } diff --git a/toonz/sources/toonz/menubar.h b/toonz/sources/toonz/menubar.h index b941f064..e4b6d1a1 100644 --- a/toonz/sources/toonz/menubar.h +++ b/toonz/sources/toonz/menubar.h @@ -58,12 +58,14 @@ protected slots: void addNewTab(); void deleteTab(); void setIsLocked(bool lock); + void onCustomizeMenuBar(); signals: void indexSwapped(int firstIndex, int secondIndex); void insertNewTabRoom(); void deleteTabRoom(int index); void renameTabRoom(int index, const QString name); + void customizeMenuBar(int index); }; //----------------------------------------------------------------------------- @@ -149,6 +151,7 @@ class StackedMenuBar : public QStackedWidget QMenuBar* createBatchesMenuBar(); QMenuBar* createBrowserMenuBar(); QMenuBar* createFullMenuBar(); + QMenuBar* loadMenuBar(const TFilePath & fp); public: StackedMenuBar(QWidget *parent); @@ -165,6 +168,7 @@ protected slots: void onIndexSwapped(int firstIndex, int secondIndex); void insertNewMenuBar(); void deleteMenuBar(int index); + void doCustomizeMenuBar(int index); }; //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/menubarpopup.cpp b/toonz/sources/toonz/menubarpopup.cpp new file mode 100644 index 00000000..da21fcc5 --- /dev/null +++ b/toonz/sources/toonz/menubarpopup.cpp @@ -0,0 +1,553 @@ +#include "menubarpopup.h" + +// Tnz includes +#include "tapp.h" +#include "mainwindow.h" +#include "menubar.h" +#include "shortcutpopup.h" + +// TnzQt includes +#include "toonzqt/gutil.h" + +// TnzLib includes +#include "toonz/toonzfolders.h" + +// TnzCore includes +#include "tsystem.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//============================================================================= +// MenuBarCommandItem +//----------------------------------------------------------------------------- + +class MenuBarCommandItem : public QTreeWidgetItem +{ + QAction *m_action; +public: + MenuBarCommandItem(QTreeWidgetItem *parent, QAction *action) + : QTreeWidgetItem(parent, UserType), m_action(action) + { + setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren); + setText(0, m_action->text().remove("&")); + setToolTip(0, QObject::tr("[Drag] to move position")); + } + QAction *getAction() const { return m_action; } + +}; + +//============================================================================= +// MenuBarSeparatorItem +//----------------------------------------------------------------------------- + +class MenuBarSeparatorItem : public QTreeWidgetItem +{ +public: + MenuBarSeparatorItem(QTreeWidgetItem *parent) + : QTreeWidgetItem(parent, UserType) + { + setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemNeverHasChildren); + setText(0, QObject::tr("----Separator----")); + setToolTip(0, QObject::tr("[Drag] to move position")); + } +}; + +//============================================================================= +// MenuBarSubmenuItem +//----------------------------------------------------------------------------- + +class MenuBarSubmenuItem : public QTreeWidgetItem +{ +public: + MenuBarSubmenuItem(QTreeWidgetItem *parent, QString & title) + : QTreeWidgetItem(parent, UserType) + { + setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsEnabled); + /*- Menu title will be translated if the title is registered in translation file -*/ + setText(0, StackedMenuBar::tr(title.toStdString().c_str())); + QIcon subMenuIcon(":Resources/browser_folder_close.png"); + subMenuIcon.addFile(":Resources/browser_folder_open.png", QSize(), QIcon::Normal, QIcon::On); + setIcon(0, subMenuIcon); + setToolTip(0, QObject::tr("[Drag] to move position, [Double Click] to edit title")); + } +}; + +//============================================================================= +// MenuBarTree +//----------------------------------------------------------------------------- + +MenuBarTree::MenuBarTree(TFilePath & path, QWidget* parent) + : QTreeWidget(parent) + , m_path(path) +{ + setObjectName("SolidLineFrame"); + setAlternatingRowColors(true); + setDragEnabled(true); + setDropIndicatorShown(true); + setDefaultDropAction(Qt::MoveAction); + setDragDropMode(QAbstractItemView::DragDrop); + + setColumnCount(1); + header()->close(); + + /*- m_path݂Ȃt@CǂݍށB΃ev[gǂݍ -*/ + TFilePath fp; + if (TFileStatus(path).isWritable()) + fp = m_path; + else + { + fp = m_path.withParentDir(ToonzFolder::getTemplateModuleDir()); + if (!TFileStatus(path).isReadable()) + fp = ToonzFolder::getTemplateModuleDir() + "menubar_template.xml"; + } + + loadMenuTree(fp); +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::loadMenuTree(const TFilePath& fp) +{ + QFile file(toQString(fp)); + if (!file.open(QFile::ReadOnly | QFile::Text)){ + qDebug() << "Cannot read file" << file.errorString(); + return; + } + + QXmlStreamReader reader(&file); + + if (reader.readNextStartElement()) + { + if (reader.name() == "menubar") + { + while (reader.readNextStartElement()) + { + if (reader.name() == "menu") + { + QString title = reader.attributes().value("title").toString(); + MenuBarSubmenuItem *menu = new MenuBarSubmenuItem(0, title); + addTopLevelItem(menu); + loadMenuRecursive(reader, menu); + } + else if (reader.name() == "command") + { + QString cmdName = reader.readElementText(); + + QAction *action = CommandManager::instance()->getAction(cmdName.toStdString().c_str()); + if (action) + { + MenuBarCommandItem* item = new MenuBarCommandItem(0, action); + addTopLevelItem(item); + } + } + else + reader.skipCurrentElement(); + } + } + else + reader.raiseError(QObject::tr("Incorrect file")); + } + + if (reader.hasError()) + { + qDebug() << "Cannot read menubar xml"; + } +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::loadMenuRecursive(QXmlStreamReader& reader, QTreeWidgetItem* parentItem) +{ + while (reader.readNextStartElement()) + { + if (reader.name() == "menu") + { + QString title = reader.attributes().value("title").toString(); + MenuBarSubmenuItem *subMenu = new MenuBarSubmenuItem(parentItem, title); + loadMenuRecursive(reader, subMenu); + } + else if (reader.name() == "command") + { + QString cmdName = reader.readElementText(); + QAction* action = CommandManager::instance()->getAction(cmdName.toStdString().c_str()); + if (action) + MenuBarCommandItem* item = new MenuBarCommandItem(parentItem, action); + } + else if (reader.name() == "command_debug") + { +#ifndef NDEBUG + QString cmdName = reader.readElementText(); + QAction* action = CommandManager::instance()->getAction(cmdName.toStdString().c_str()); + if (action) + MenuBarCommandItem* item = new MenuBarCommandItem(parentItem, action); +#else + reader.skipCurrentElement(); +#endif + } + else if (reader.name() == "separator") + { + MenuBarSeparatorItem* sep = new MenuBarSeparatorItem(parentItem); + reader.skipCurrentElement(); + } + else + reader.skipCurrentElement(); + } +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::saveMenuTree() +{ + QFile file(toQString(m_path)); + if (!file.open(QFile::WriteOnly | QFile::Text)){ + qDebug() << "Cannot read file" << file.errorString(); + return; + } + + QXmlStreamWriter writer(&file); + writer.setAutoFormatting(true); + writer.writeStartDocument(); + + writer.writeStartElement("menubar"); + { + saveMenuRecursive(writer, invisibleRootItem()); + + } + writer.writeEndElement(); // menubar + + writer.writeEndDocument(); + +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::saveMenuRecursive(QXmlStreamWriter& writer, QTreeWidgetItem* parentItem) +{ + for (int c = 0; c < parentItem->childCount(); c++) + { + MenuBarCommandItem* command = dynamic_cast(parentItem->child(c)); + MenuBarSeparatorItem* sep = dynamic_cast(parentItem->child(c)); + MenuBarSubmenuItem* subMenu = dynamic_cast(parentItem->child(c)); + if (command) + writer.writeTextElement("command", QString::fromStdString(CommandManager::instance()->getIdFromAction(command->getAction()))); + else if (sep) + writer.writeEmptyElement("separator"); + else if (subMenu) + { + writer.writeStartElement("menu"); + writer.writeAttribute("title", subMenu->text(0)); + + saveMenuRecursive(writer, subMenu); + + writer.writeEndElement(); // menu + } + else + {} + } +} + +//----------------------------------------------------------------------------- + +bool MenuBarTree::dropMimeData(QTreeWidgetItem * parent, int index, const QMimeData * data, Qt::DropAction action) +{ + + if (data->hasText()) + { + QString txt = data->text(); + QTreeWidgetItem* item; + if (txt == "separator") + item = new MenuBarSeparatorItem(0); + else + { + QAction * act = CommandManager::instance()->getAction(txt.toStdString().c_str()); + if (!act) return false; + item = new MenuBarCommandItem(0, act); + } + + + if (parent) + parent->insertChild(index, item); + else + insertTopLevelItem(index, item); + + + return true; + + } + + return false; + +} + +//----------------------------------------------------------------------------- + +QStringList MenuBarTree::mimeTypes() const +{ + QStringList qstrList; + qstrList.append("text/plain"); + return qstrList; +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::contextMenuEvent(QContextMenuEvent * event) +{ + QTreeWidgetItem* item = itemAt(event->pos()); + if (item != currentItem()) + setCurrentItem(item); + QMenu* menu = new QMenu(this); + QAction * action; + if (!item || indexOfTopLevelItem(item) >= 0) + action = menu->addAction(tr("Insert Menu")); + else + action = menu->addAction(tr("Insert Submenu")); + + connect(action, SIGNAL(triggered()), this, SLOT(insertMenu())); + + if (item) + { + action = menu->addAction(tr("Remove \"%1\"").arg(item->text(0))); + connect(action, SIGNAL(triggered()), this, SLOT(removeItem())); + } + + menu->exec(event->globalPos()); + delete menu; +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::insertMenu() +{ + QTreeWidgetItem* item = currentItem(); + + MenuBarSubmenuItem * insItem = new MenuBarSubmenuItem(0, tr("New Menu")); + if (!item) + addTopLevelItem(insItem); + else if (indexOfTopLevelItem(item) >= 0) + insertTopLevelItem(indexOfTopLevelItem(item), insItem); + else + item->parent()->insertChild(item->parent()->indexOfChild(item), insItem); +} + +//----------------------------------------------------------------------------- + +void MenuBarTree::removeItem() +{ + QTreeWidgetItem* item = currentItem(); + if (!item) return; + + if (indexOfTopLevelItem(item) >= 0) + takeTopLevelItem(indexOfTopLevelItem(item)); + else + item->parent()->removeChild(item); + + delete item; +} + +//============================================================================= +// CommandListTree +//----------------------------------------------------------------------------- + +CommandListTree::CommandListTree(QWidget* parent) + : QTreeWidget(parent) +{ + setObjectName("SolidLineFrame"); + setAlternatingRowColors(true); + setDragEnabled(true); + setDragDropMode(QAbstractItemView::DragOnly); + setColumnCount(1); + header()->close(); + + QIcon menuFolderIcon(":Resources/browser_project_close.png"); + menuFolderIcon.addFile(":Resources/browser_project_open.png", QSize(), QIcon::Normal, QIcon::On); + invisibleRootItem()->setIcon(0, menuFolderIcon); + + QTreeWidgetItem *menuCommandFolder = new QTreeWidgetItem(this); + menuCommandFolder->setFlags( Qt::ItemIsEnabled ); + menuCommandFolder->setText(0, ShortcutTree::tr("Menu Commands")); + menuCommandFolder->setExpanded(true); + menuCommandFolder->setIcon(0,invisibleRootItem()->icon(0)); + + addFolder(ShortcutTree::tr("File"), MenuFileCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("Edit"), MenuEditCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("Scan & Cleanup"), MenuScanCleanupCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("Level"), MenuLevelCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("Xsheet"), MenuXsheetCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("Cells"), MenuCellsCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("View"), MenuViewCommandType, menuCommandFolder); + addFolder(ShortcutTree::tr("Windows"), MenuWindowsCommandType, menuCommandFolder); + + addFolder(ShortcutTree::tr("Tools"), ToolCommandType); + + MenuBarSeparatorItem* sep = new MenuBarSeparatorItem(0); + sep->setToolTip(0, QObject::tr("[Drag&Drop] to copy separator to menu bar")); + addTopLevelItem(sep); + +} + +//----------------------------------------------------------------------------- + +void CommandListTree::addFolder(const QString &title, int commandType, QTreeWidgetItem *parentFolder) +{ + QTreeWidgetItem *folder; + if (!parentFolder) + folder = new QTreeWidgetItem(this); + else + folder = new QTreeWidgetItem(parentFolder); + assert(folder); + folder->setText(0, title); + folder->setIcon(0, invisibleRootItem()->icon(0)); + + std::vector actions; + CommandManager::instance()->getActions((CommandType)commandType, actions); + for (int i = 0; i < (int)actions.size(); i++) { + MenuBarCommandItem *item = new MenuBarCommandItem(folder, actions[i]); + item->setToolTip(0, QObject::tr("[Drag&Drop] to copy command to menu bar")); + } +} + +//----------------------------------------------------------------------------- + +void CommandListTree::mousePressEvent(QMouseEvent *event) +{ + setCurrentItem(itemAt(event->pos())); + MenuBarCommandItem *commandItem = dynamic_cast(itemAt(event->pos())); + MenuBarSeparatorItem *separatorItem = dynamic_cast(itemAt(event->pos())); + + if (commandItem || separatorItem) + { + std::string dragStr; + QString dragPixmapTxt; + if (commandItem) + { + dragStr = CommandManager::instance()->getIdFromAction(commandItem->getAction()); + dragPixmapTxt = commandItem->getAction()->text(); + dragPixmapTxt.remove("&"); + } + else + { + dragStr = "separator"; + dragPixmapTxt = tr("----Separator----"); + } + + QMimeData *mimeData = new QMimeData; + mimeData->setText(QString::fromStdString(dragStr)); + + QFontMetrics fm(QApplication::font()); + QPixmap pix(fm.boundingRect(dragPixmapTxt).adjusted(-2,-2,2,2).size()); + QPainter painter(&pix); + painter.fillRect(pix.rect(),Qt::white); + painter.setPen(Qt::black); + painter.drawText(pix.rect(), Qt::AlignCenter, dragPixmapTxt); + + QDrag *drag = new QDrag(this); + drag->setMimeData(mimeData); + drag->setPixmap(pix); + + drag->exec(Qt::CopyAction); + } + + QTreeWidget::mousePressEvent(event); +} + +//============================================================================= +// MenuBarPopup +//----------------------------------------------------------------------------- + +MenuBarPopup::MenuBarPopup(Room* room) + : Dialog(TApp::instance()->getMainWindow(), true, false, "CustomizeMenuBar") +{ + setWindowTitle(tr("Customize Menu Bar of Room \"%1\"").arg(room->getName())); + + /*- get menubar setting file path -*/ + std::string mbFileName = room->getPath().getName() + "_menubar.xml"; + TFilePath mbPath = ToonzFolder::getMyModuleDir() + mbFileName; + + m_commandListTree = new CommandListTree(this); + m_menuBarTree = new MenuBarTree(mbPath, this); + + QPushButton *okBtn = new QPushButton(tr("OK"), this); + QPushButton *cancelBtn = new QPushButton(tr("Cancel"), this); + + okBtn->setFocusPolicy(Qt::NoFocus); + cancelBtn->setFocusPolicy(Qt::NoFocus); + + QLabel* menuBarLabel = new QLabel(tr("%1 Menu Bar").arg(room->getName()), this); + QLabel* menuItemListLabel = new QLabel(tr("Menu Items"), this); + + QFont f("Arial", 15, QFont::Bold); + menuBarLabel->setFont(f); + menuItemListLabel->setFont(f); + + QLabel* noticeLabel = new QLabel(tr("N.B. If you put unique title to submenu, it may not be translated to another language.\nN.B. Duplicated commands will be ignored. Only the last one will appear in the menu bar."),this); + QFont nf("Arial", 9, QFont::Normal); + nf.setItalic(true); + noticeLabel->setFont(nf); + + //--- layout + QVBoxLayout* mainLay = new QVBoxLayout(); + m_topLayout->setMargin(0); + m_topLayout->setSpacing(0); + { + QGridLayout* mainUILay = new QGridLayout(); + mainUILay->setMargin(5); + mainUILay->setHorizontalSpacing(8); + mainUILay->setVerticalSpacing(5); + { + mainUILay->addWidget(menuBarLabel, 0, 0); + mainUILay->addWidget(menuItemListLabel, 0, 1); + mainUILay->addWidget(m_menuBarTree, 1, 0); + mainUILay->addWidget(m_commandListTree, 1, 1); + + mainUILay->addWidget(noticeLabel, 2, 0, 1, 2); + } + mainUILay->setRowStretch(0, 0); + mainUILay->setRowStretch(1, 1); + mainUILay->setRowStretch(2, 0); + mainUILay->setColumnStretch(0, 1); + mainUILay->setColumnStretch(1, 1); + + m_topLayout->addLayout(mainUILay, 1); + } + + m_buttonLayout->setMargin(0); + m_buttonLayout->setSpacing(30); + { + m_buttonLayout->addStretch(1); + m_buttonLayout->addWidget(okBtn, 0); + m_buttonLayout->addWidget(cancelBtn, 0); + m_buttonLayout->addStretch(1); + } + + //--- signal/slot connections + + bool ret = connect(okBtn, SIGNAL(clicked()), this, SLOT(onOkPressed())); + ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); + assert(ret); +} + +//----------------------------------------------------------------------------- + +void MenuBarPopup::onOkPressed() +{ + /*- TODO: xmlɃc[̏Ԃ -*/ + m_menuBarTree->saveMenuTree(); + + accept(); +} \ No newline at end of file diff --git a/toonz/sources/toonz/menubarpopup.h b/toonz/sources/toonz/menubarpopup.h new file mode 100644 index 00000000..26703316 --- /dev/null +++ b/toonz/sources/toonz/menubarpopup.h @@ -0,0 +1,75 @@ +#ifndef MENUBARPOPUP_H +#define MENUBARPOPUP_H + +#include +#include +#include + +#include "toonzqt/dvdialog.h" +#include "tfilepath.h" + +class Room; +class QXmlStreamReader; +class QXmlStreamWriter; + +//============================================================================= +// MenuBarTree +//----------------------------------------------------------------------------- + +class MenuBarTree : public QTreeWidget +{ + Q_OBJECT + + TFilePath m_path; + + void loadMenuTree(const TFilePath& fp); + void loadMenuRecursive(QXmlStreamReader& reader, QTreeWidgetItem* parentItem); + void saveMenuRecursive(QXmlStreamWriter& writer, QTreeWidgetItem* parentItem); +public: + MenuBarTree(TFilePath & path, QWidget* parent = 0); + void saveMenuTree(); +protected: + bool dropMimeData(QTreeWidgetItem * parent, int index, const QMimeData * data, Qt::DropAction action); + QStringList mimeTypes() const; + void contextMenuEvent(QContextMenuEvent * event); +protected slots: + void insertMenu(); + void removeItem(); +}; + +//============================================================================= +// CommandListTree +//----------------------------------------------------------------------------- + +class CommandListTree : public QTreeWidget +{ + Q_OBJECT + + void addFolder(const QString &title, int commandType, QTreeWidgetItem *parentFolder=0); +public: + CommandListTree(QWidget* parent = 0); +protected: + void mousePressEvent(QMouseEvent*); +}; + + +//============================================================================= +// MenuBarPopup +//----------------------------------------------------------------------------- + +class MenuBarPopup : public Dialog +{ + Q_OBJECT + CommandListTree* m_commandListTree; + MenuBarTree* m_menuBarTree; + +public: + MenuBarPopup(Room* room); +protected slots: + void onOkPressed(); + +}; + + + +#endif \ No newline at end of file diff --git a/toonz/sources/toonzqt/menubarcommand.cpp b/toonz/sources/toonzqt/menubarcommand.cpp index 864f897b..eea1883c 100644 --- a/toonz/sources/toonzqt/menubarcommand.cpp +++ b/toonz/sources/toonzqt/menubarcommand.cpp @@ -424,6 +424,17 @@ void CommandManager::setToggleTexts(CommandId id, const QString &onText, const Q } } +//--------------------------------------------------------- + +std::string CommandManager::getIdFromAction(QAction* action) +{ + std::map::iterator it = m_qactionTable.find(action); + if (it != m_qactionTable.end()) + return it->second->m_id; + else + return ""; +} + /* //---------------------------------------------------------