enable customizing menubar
This commit is contained in:
parent
7a9c88552b
commit
dde155b61c
7 changed files with 733 additions and 10 deletions
|
@ -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);
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
553
toonz/sources/toonz/menubarpopup.cpp
Normal file
553
toonz/sources/toonz/menubarpopup.cpp
Normal 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();
|
||||
}
|
75
toonz/sources/toonz/menubarpopup.h
Normal file
75
toonz/sources/toonz/menubarpopup.h
Normal 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
|
|
@ -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 "";
|
||||
}
|
||||
|
||||
/*
|
||||
//---------------------------------------------------------
|
||||
|
||||
|
|
Loading…
Reference in a new issue