enable customizing menubar

This commit is contained in:
shun_iwasawa 2016-04-18 12:17:03 +09:00
parent 7a9c88552b
commit dde155b61c
7 changed files with 733 additions and 10 deletions

View file

@ -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);
};
//-----------------------------------------------------------------------------

View file

@ -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

View file

@ -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 <QIcon>
@ -151,12 +155,20 @@ 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)));
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);
@ -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<MainWindow*>(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);
}

View file

@ -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);
};
//-----------------------------------------------------------------------------

View file

@ -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 <QMainWindow>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QHeaderView>
#include <QtDebug>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QDataStream>
#include <QMimeData>
#include <QDrag>
#include <QMouseEvent>
#include <QPainter>
#include <QApplication>
#include <QLabel>
//=============================================================================
// 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が存在するならファイルから読み込む。無ければテンプレートを読み込む -*/
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<MenuBarCommandItem*>(parentItem->child(c));
MenuBarSeparatorItem* sep = dynamic_cast<MenuBarSeparatorItem*>(parentItem->child(c));
MenuBarSubmenuItem* subMenu = dynamic_cast<MenuBarSubmenuItem*>(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<QAction *> 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<MenuBarCommandItem*>(itemAt(event->pos()));
MenuBarSeparatorItem *separatorItem = dynamic_cast<MenuBarSeparatorItem*>(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にツリーの状態を書き込む -*/
m_menuBarTree->saveMenuTree();
accept();
}

View file

@ -0,0 +1,75 @@
#ifndef MENUBARPOPUP_H
#define MENUBARPOPUP_H
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QAction>
#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

View file

@ -424,6 +424,17 @@ void CommandManager::setToggleTexts(CommandId id, const QString &onText, const Q
}
}
//---------------------------------------------------------
std::string CommandManager::getIdFromAction(QAction* action)
{
std::map<QAction *, Node *>::iterator it = m_qactionTable.find(action);
if (it != m_qactionTable.end())
return it->second->m_id;
else
return "";
}
/*
//---------------------------------------------------------