1 
2 
3 #include "menubar.h"
4 
5 // Tnz6 includes
6 #include "menubarcommandids.h"
7 #include "tapp.h"
8 #include "cellselection.h"
9 #include "mainwindow.h"
10 #include "menubarpopup.h"
11 
12 // TnzQt includes
13 #include "toonzqt/tselectionhandle.h"
14 #include "toonzqt/dvdialog.h"
15 #include "toonzqt/menubarcommand.h"
16 #include "toonzqt/gutil.h"
17 
18 // TnzLib includes
19 #include "toonz/toonzscene.h"
20 #include "toonz/childstack.h"
21 #include "toonz/tscenehandle.h"
22 #include "toonz/txsheethandle.h"
23 #include "toonz/tframehandle.h"
24 #include "toonz/tcolumnhandle.h"
25 #include "toonz/toonzfolders.h"
26 
27 // TnzTools includes
28 #include "tools/toolcommandids.h"
29 
30 // TnzBase includes
31 #include "tenv.h"
32 
33 // TnzCore includes
34 #include "tconvert.h"
35 #include "tsystem.h"
36 
37 // Qt includes
38 #include <QIcon>
39 #include <QPainter>
40 #include <QMouseEvent>
41 #include <QHBoxLayout>
42 #include <QMenuBar>
43 #include <QShortcut>
44 #include <QDesktopServices>
45 #include <QCheckBox>
46 #include <QtDebug>
47 #include <QXmlStreamReader>
48 
open()49 void UrlOpener::open() { QDesktopServices::openUrl(m_url); }
50 
51 UrlOpener dvHome(QUrl("http://www.toonz.com/"));
52 UrlOpener manual(QUrl("file:///C:/gmt/butta/M&C in EU.pdf"));
53 
54 TEnv::IntVar LockRoomTabToggle("LockRoomTabToggle", 0);
55 
56 //=============================================================================
57 // RoomTabWidget
58 //-----------------------------------------------------------------------------
59 
RoomTabWidget(QWidget * parent)60 RoomTabWidget::RoomTabWidget(QWidget *parent)
61     : QTabBar(parent)
62     , m_clickedTabIndex(-1)
63     , m_tabToDeleteIndex(-1)
64     , m_renameTabIndex(-1)
65     , m_renameTextField(new DVGui::LineEdit(this))
66     , m_isLocked(LockRoomTabToggle != 0) {
67   m_renameTextField->hide();
68   connect(m_renameTextField, SIGNAL(editingFinished()), this,
69           SLOT(updateTabName()));
70 }
71 
72 //-----------------------------------------------------------------------------
73 
~RoomTabWidget()74 RoomTabWidget::~RoomTabWidget() {}
75 
76 //-----------------------------------------------------------------------------
77 
swapIndex(int firstIndex,int secondIndex)78 void RoomTabWidget::swapIndex(int firstIndex, int secondIndex) {
79   QString firstText = tabText(firstIndex);
80   removeTab(firstIndex);
81   insertTab(secondIndex, firstText);
82   emit indexSwapped(firstIndex, secondIndex);
83 
84   setCurrentIndex(secondIndex);
85 }
86 
87 //-----------------------------------------------------------------------------
88 
mousePressEvent(QMouseEvent * event)89 void RoomTabWidget::mousePressEvent(QMouseEvent *event) {
90   m_renameTextField->hide();
91   if (event->button() == Qt::LeftButton) {
92     m_clickedTabIndex = tabAt(event->pos());
93     if (m_clickedTabIndex < 0) return;
94     setCurrentIndex(m_clickedTabIndex);
95   }
96 }
97 
98 //-----------------------------------------------------------------------------
99 
mouseMoveEvent(QMouseEvent * event)100 void RoomTabWidget::mouseMoveEvent(QMouseEvent *event) {
101   if (m_isLocked) return;
102   if (event->buttons()) {
103     int tabIndex = tabAt(event->pos());
104     if (tabIndex == m_clickedTabIndex || tabIndex < 0 || tabIndex >= count() ||
105         m_clickedTabIndex < 0)
106       return;
107     swapIndex(m_clickedTabIndex, tabIndex);
108     m_clickedTabIndex = tabIndex;
109   }
110 }
111 
112 //-----------------------------------------------------------------------------
113 
mouseReleaseEvent(QMouseEvent * event)114 void RoomTabWidget::mouseReleaseEvent(QMouseEvent *event) {
115   m_clickedTabIndex = -1;
116 }
117 
118 //-----------------------------------------------------------------------------
119 /*! Set a text field with focus in event position to edit tab name.
120  */
mouseDoubleClickEvent(QMouseEvent * event)121 void RoomTabWidget::mouseDoubleClickEvent(QMouseEvent *event) {
122   if (m_isLocked) return;
123   int index = tabAt(event->pos());
124   if (index < 0) return;
125   m_renameTabIndex     = index;
126   DVGui::LineEdit *fld = m_renameTextField;
127   fld->setText(tabText(index));
128   fld->setGeometry(tabRect(index));
129   fld->show();
130   fld->selectAll();
131   fld->setFocus(Qt::OtherFocusReason);
132 }
133 
134 //-----------------------------------------------------------------------------
135 
contextMenuEvent(QContextMenuEvent * event)136 void RoomTabWidget::contextMenuEvent(QContextMenuEvent *event) {
137   if (m_isLocked) return;
138   m_tabToDeleteIndex = -1;
139   QMenu *menu        = new QMenu(this);
140   QAction *newRoom   = menu->addAction(tr("New Room"));
141   connect(newRoom, SIGNAL(triggered()), SLOT(addNewTab()));
142 
143   int index = tabAt(event->pos());
144   if (index >= 0) {
145     m_tabToDeleteIndex = index;
146     if (index != currentIndex()) {
147       QAction *deleteRoom =
148           menu->addAction(tr("Delete Room \"%1\"").arg(tabText(index)));
149       connect(deleteRoom, SIGNAL(triggered()), SLOT(deleteTab()));
150     }
151 #if defined(_WIN32) || defined(_CYGWIN_)
152     /*- customize menubar -*/
153     QAction *customizeMenuBar = menu->addAction(
154         tr("Customize Menu Bar of Room \"%1\"").arg(tabText(index)));
155     connect(customizeMenuBar, SIGNAL(triggered()), SLOT(onCustomizeMenuBar()));
156 #endif
157   }
158   menu->exec(event->globalPos());
159 }
160 
161 //-----------------------------------------------------------------------------
162 
updateTabName()163 void RoomTabWidget::updateTabName() {
164   int index = m_renameTabIndex;
165   if (index < 0) return;
166   m_renameTabIndex = -1;
167   QString newName  = m_renameTextField->text();
168   setTabText(index, newName);
169   m_renameTextField->hide();
170   emit renameTabRoom(index, newName);
171 }
172 
173 //-----------------------------------------------------------------------------
174 
addNewTab()175 void RoomTabWidget::addNewTab() {
176   insertTab(0, tr("Room"));
177   emit insertNewTabRoom();
178 }
179 
180 //-----------------------------------------------------------------------------
181 
deleteTab()182 void RoomTabWidget::deleteTab() {
183   assert(m_tabToDeleteIndex != -1);
184 
185   QString question(tr("Are you sure you want to remove room %1")
186                        .arg(tabText(m_tabToDeleteIndex)));
187   int ret = DVGui::MsgBox(question, QObject::tr("Yes"), QObject::tr("No"));
188   if (ret == 0 || ret == 2) return;
189 
190   emit deleteTabRoom(m_tabToDeleteIndex);
191   removeTab(m_tabToDeleteIndex);
192   m_tabToDeleteIndex = -1;
193 }
194 
195 //-----------------------------------------------------------------------------
196 
setIsLocked(bool lock)197 void RoomTabWidget::setIsLocked(bool lock) {
198   m_isLocked        = lock;
199   LockRoomTabToggle = (lock) ? 1 : 0;
200 }
201 
202 //-----------------------------------------------------------------------------
203 
onCustomizeMenuBar()204 void RoomTabWidget::onCustomizeMenuBar() {
205   /*- use m_tabToDeleteIndex for index of a room of which menubar is to be
206    * customized -*/
207   assert(m_tabToDeleteIndex != -1);
208 
209   emit customizeMenuBar(m_tabToDeleteIndex);
210 }
211 
212 //=============================================================================
213 // StackedMenuBar
214 //-----------------------------------------------------------------------------
215 
StackedMenuBar(QWidget * parent)216 StackedMenuBar::StackedMenuBar(QWidget *parent) : QStackedWidget(parent) {
217   setObjectName("StackedMenuBar");
218 }
219 
220 //---------------------------------------------------------------------------------
221 
createMenuBarByName(const QString & roomName)222 void StackedMenuBar::createMenuBarByName(const QString &roomName) {
223   std::cout << "create " << roomName.toStdString() << std::endl;
224 #if defined(_WIN32) || defined(_CYGWIN_)
225   if (roomName == "Cleanup")
226     addWidget(createCleanupMenuBar());
227   else if (roomName == "PltEdit")
228     addWidget(createPltEditMenuBar());
229   else if (roomName == "InknPaint")
230     addWidget(createInknPaintMenuBar());
231   else if (roomName == "Xsheet" || roomName == "Schematic" ||
232            roomName == "QAR" || roomName == "Flip")
233     addWidget(createXsheetMenuBar());
234   else if (roomName == "Batches")
235     addWidget(createBatchesMenuBar());
236   else if (roomName == "Browser")
237     addWidget(createBrowserMenuBar());
238   else /*-- どれにもあてはまらない場合は全てのコマンドの入ったメニューバーを作る
239           --*/
240     addWidget(createFullMenuBar());
241 #else
242   /* OSX では stacked menu が動いていないのでとりあえず full のみ作成する */
243   addWidget(createFullMenuBar());
244 #endif
245 }
246 
247 //---------------------------------------------------------------------------------
248 
loadAndAddMenubar(const TFilePath & fp)249 void StackedMenuBar::loadAndAddMenubar(const TFilePath &fp) {
250 #if defined(_WIN32) || defined(_CYGWIN_)
251   QMenuBar *menuBar = loadMenuBar(fp);
252   if (menuBar)
253     addWidget(menuBar);
254   else
255     addWidget(createFullMenuBar());
256 #else
257   /* OSX では stacked menu が動いていないのでとりあえず full のみ作成する */
258   addWidget(createFullMenuBar());
259 #endif
260 }
261 
262 //---------------------------------------------------------------------------------
263 
loadMenuBar(const TFilePath & fp)264 QMenuBar *StackedMenuBar::loadMenuBar(const TFilePath &fp) {
265   QFile file(toQString(fp));
266   if (!file.open(QFile::ReadOnly | QFile::Text)) {
267     qDebug() << "Cannot read file" << file.errorString();
268     return 0;
269   }
270 
271   QXmlStreamReader reader(&file);
272 
273   QMenuBar *menuBar = new QMenuBar(this);
274   if (reader.readNextStartElement()) {
275     if (reader.name() == "menubar") {
276       while (reader.readNextStartElement()) {
277         if (reader.name() == "menu") {
278           QString title = reader.attributes().value("title").toString();
279           /*- Menu title will be translated if the title is registered in
280            * translation file -*/
281           QMenu *menu = new QMenu(tr(title.toStdString().c_str()));
282 
283           if (readMenuRecursive(reader, menu))
284             menuBar->addMenu(menu);
285           else {
286             reader.raiseError(tr("Failed to load menu %1").arg(title));
287             delete menu;
288           }
289 
290         } else if (reader.name() == "command") {
291           QString cmdName = reader.readElementText();
292 
293           QAction *action = CommandManager::instance()->getAction(
294               cmdName.toStdString().c_str());
295           if (action)
296             menuBar->addAction(action);
297           else
298             reader.raiseError(tr("Failed to add command %1").arg(cmdName));
299         } else
300           reader.skipCurrentElement();
301       }
302     } else
303       reader.raiseError(QObject::tr("Incorrect file"));
304   }
305 
306   if (reader.hasError()) {
307     delete menuBar;
308     return 0;
309   }
310   return menuBar;
311 }
312 
313 //---------------------------------------------------------------------------------
314 
readMenuRecursive(QXmlStreamReader & reader,QMenu * menu)315 bool StackedMenuBar::readMenuRecursive(QXmlStreamReader &reader, QMenu *menu) {
316   while (reader.readNextStartElement()) {
317     if (reader.name() == "menu") {
318       QString title  = reader.attributes().value("title").toString();
319       QMenu *subMenu = new QMenu(tr(title.toStdString().c_str()));
320 
321       if (readMenuRecursive(reader, subMenu))
322         menu->addMenu(subMenu);
323       else {
324         reader.raiseError(tr("Failed to load menu %1").arg(title));
325         delete subMenu;
326         return false;
327       }
328 
329     } else if (reader.name() == "command") {
330       QString cmdName = reader.readElementText();
331       addMenuItem(menu, cmdName.toStdString().c_str());
332     } else if (reader.name() == "command_debug") {
333 #ifndef NDEBUG
334       QString cmdName = reader.readElementText();
335       addMenuItem(menu, cmdName.toStdString().c_str());
336 #else
337       reader.skipCurrentElement();
338 #endif
339     } else if (reader.name() == "separator") {
340       menu->addSeparator();
341       reader.skipCurrentElement();
342     } else
343       reader.skipCurrentElement();
344   }
345 
346   return !reader.hasError();
347 }
348 
349 //---------------------------------------------------------------------------------
350 
createCleanupMenuBar()351 QMenuBar *StackedMenuBar::createCleanupMenuBar() {
352   QMenuBar *cleanupMenuBar = new QMenuBar(this);
353   //----Files Menu
354   QMenu *filesMenu = addMenu(tr("Files"), cleanupMenuBar);
355   addMenuItem(filesMenu, MI_LoadLevel);
356   addMenuItem(filesMenu, MI_LoadFolder);
357   addMenuItem(filesMenu, MI_SaveLevel);
358   addMenuItem(filesMenu, MI_SaveLevelAs);
359   addMenuItem(filesMenu, MI_ExportLevel);
360   addMenuItem(filesMenu, MI_OpenRecentLevel);
361   filesMenu->addSeparator();
362   addMenuItem(filesMenu, MI_LoadScene);
363   addMenuItem(filesMenu, MI_SaveScene);
364   addMenuItem(filesMenu, MI_SaveSceneAs);
365   addMenuItem(filesMenu, MI_SaveAll);
366   addMenuItem(filesMenu, MI_OpenRecentScene);
367   addMenuItem(filesMenu, MI_RevertScene);
368   filesMenu->addSeparator();
369   addMenuItem(filesMenu, MI_ConvertFileWithInput);
370   filesMenu->addSeparator();
371   addMenuItem(filesMenu, MI_NewScene);
372   filesMenu->addSeparator();
373   addMenuItem(filesMenu, MI_Quit);
374 
375   //----Scan Menu
376   QMenu *scanMenu = addMenu(tr("Scan"), cleanupMenuBar);
377   addMenuItem(scanMenu, MI_DefineScanner);
378   addMenuItem(scanMenu, MI_ScanSettings);
379   addMenuItem(scanMenu, MI_Scan);
380   addMenuItem(scanMenu, MI_SetScanCropbox);
381   addMenuItem(scanMenu, MI_ResetScanCropbox);
382 
383   //----Settings Menu
384   QMenu *settingsMenu = addMenu(tr("Settings"), cleanupMenuBar);
385   addMenuItem(settingsMenu, MI_CleanupSettings);
386   settingsMenu->addSeparator();
387   addMenuItem(settingsMenu, MI_OutputSettings);
388   addMenuItem(settingsMenu, MI_LevelSettings);
389 
390   //----Processing Menu
391   QMenu *processingMenu = addMenu(tr("Processing"), cleanupMenuBar);
392   addMenuItem(processingMenu, MI_CameraTest);
393   addMenuItem(processingMenu, MI_OpacityCheck);
394   addMenuItem(processingMenu, MI_CleanupPreview);
395   addMenuItem(processingMenu, MI_Cleanup);
396 
397   //---Edit Menu
398   QMenu *editMenu = addMenu(tr("Edit"), cleanupMenuBar);
399   addMenuItem(editMenu, MI_Undo);
400   addMenuItem(editMenu, MI_Redo);
401   editMenu->addSeparator();
402   addMenuItem(editMenu, MI_NextFrame);
403   addMenuItem(editMenu, MI_PrevFrame);
404   addMenuItem(editMenu, MI_FirstFrame);
405   addMenuItem(editMenu, MI_LastFrame);
406   addMenuItem(editMenu, MI_TestAnimation);
407   editMenu->addSeparator();
408   addMenuItem(editMenu, MI_Copy);
409   addMenuItem(editMenu, MI_Cut);
410   addMenuItem(editMenu, MI_Paste);
411   addMenuItem(editMenu, MI_PasteAbove);
412   addMenuItem(editMenu, MI_PasteInto);
413   editMenu->addSeparator();
414   addMenuItem(editMenu, MI_Clear);
415   addMenuItem(editMenu, MI_Insert);
416   addMenuItem(editMenu, MI_InsertAbove);
417   addMenuItem(editMenu, MI_SelectAll);
418   addMenuItem(editMenu, MI_InvertSelection);
419 
420   //----Windows Menu
421   QMenu *windowsMenu = addMenu(tr("Windows"), cleanupMenuBar);
422   addMenuItem(windowsMenu, MI_OpenFileBrowser);
423   addMenuItem(windowsMenu, MI_OpenStyleControl);
424   addMenuItem(windowsMenu, MI_OpenComboViewer);
425   addMenuItem(windowsMenu, MI_OpenXshView);
426   addMenuItem(windowsMenu, MI_OpenTimelineView);
427   windowsMenu->addSeparator();
428   QMenu *otherWindowsMenu = windowsMenu->addMenu(tr("Other Windows"));
429   {
430     addMenuItem(otherWindowsMenu, MI_OpenBatchServers);
431     addMenuItem(otherWindowsMenu, MI_OpenTasks);
432     addMenuItem(otherWindowsMenu, MI_OpenColorModel);
433     addMenuItem(otherWindowsMenu, MI_OpenFileViewer);
434     addMenuItem(otherWindowsMenu, MI_OpenFunctionEditor);
435     addMenuItem(otherWindowsMenu, MI_OpenFilmStrip);
436     addMenuItem(otherWindowsMenu, MI_OpenPalette);
437     addMenuItem(otherWindowsMenu, MI_OpenFileBrowser2);
438     addMenuItem(otherWindowsMenu, MI_OpenSchematic);
439     addMenuItem(otherWindowsMenu, MI_OpenStudioPalette);
440     addMenuItem(otherWindowsMenu, MI_OpenToolbar);
441     addMenuItem(otherWindowsMenu, MI_OpenToolOptionBar);
442     addMenuItem(otherWindowsMenu, MI_OpenHistoryPanel);
443     addMenuItem(otherWindowsMenu, MI_OpenTMessage);
444   }
445 
446   //----Customize Menu
447   QMenu *customizeMenu = addMenu(tr("Customize"), cleanupMenuBar);
448   addMenuItem(customizeMenu, MI_Preferences);
449   addMenuItem(customizeMenu, MI_ShortcutPopup);
450   addMenuItem(customizeMenu, MI_SceneSettings);
451   customizeMenu->addSeparator();
452   QMenu *viewPartsMenu = customizeMenu->addMenu(tr("View"));
453   {
454     addMenuItem(viewPartsMenu, MI_ViewCamera);
455     addMenuItem(viewPartsMenu, MI_ViewTable);
456     addMenuItem(viewPartsMenu, MI_FieldGuide);
457     addMenuItem(viewPartsMenu, MI_SafeArea);
458     addMenuItem(viewPartsMenu, MI_ViewBBox);
459     addMenuItem(viewPartsMenu, MI_ViewColorcard);
460   }
461   customizeMenu->addSeparator();
462   addMenuItem(customizeMenu, MI_DockingCheck);
463   customizeMenu->addSeparator();
464   addMenuItem(customizeMenu, "MI_RunScript");
465   addMenuItem(customizeMenu, "MI_OpenScriptConsole");
466 #ifndef NDEBUG
467   addMenuItem(customizeMenu, "MI_ReloadStyle");
468 #endif
469 
470   //----Help Menu
471   QMenu *helpMenu = addMenu(tr("Help"), cleanupMenuBar);
472   addMenuItem(helpMenu, MI_About);
473 
474   return cleanupMenuBar;
475 }
476 
477 //---------------------------------------------------------------------------------
478 
createPltEditMenuBar()479 QMenuBar *StackedMenuBar::createPltEditMenuBar() {
480   QMenuBar *pltEditMenuBar = new QMenuBar(this);
481 
482   //---Files Menu
483   QMenu *filesMenu = addMenu(tr("Files"), pltEditMenuBar);
484   addMenuItem(filesMenu, MI_LoadLevel);
485   addMenuItem(filesMenu, MI_LoadFolder);
486   addMenuItem(filesMenu, MI_SaveLevel);
487   addMenuItem(filesMenu, MI_SaveLevelAs);
488   addMenuItem(filesMenu, MI_ExportLevel);
489   addMenuItem(filesMenu, MI_OpenRecentLevel);
490   addMenuItem(filesMenu, MI_LevelSettings);
491   filesMenu->addSeparator();
492   addMenuItem(filesMenu, MI_NewLevel);
493   filesMenu->addSeparator();
494   addMenuItem(filesMenu, MI_OverwritePalette);
495   addMenuItem(filesMenu, MI_SavePaletteAs);
496   filesMenu->addSeparator();
497   addMenuItem(filesMenu, MI_LoadScene);
498   addMenuItem(filesMenu, MI_SaveScene);
499   addMenuItem(filesMenu, MI_SaveSceneAs);
500   addMenuItem(filesMenu, MI_SaveAll);
501   addMenuItem(filesMenu, MI_OpenRecentScene);
502   addMenuItem(filesMenu, MI_RevertScene);
503   filesMenu->addSeparator();
504   addMenuItem(filesMenu, MI_ConvertFileWithInput);
505   filesMenu->addSeparator();
506   addMenuItem(filesMenu, MI_NewScene);
507   filesMenu->addSeparator();
508   addMenuItem(filesMenu, MI_Quit);
509 
510   //---Tools Menu
511   QMenu *toolsMenu = addMenu(tr("Tools"), pltEditMenuBar);
512   addMenuItem(toolsMenu, T_StylePicker);
513   addMenuItem(toolsMenu, T_RGBPicker);
514   addMenuItem(toolsMenu, T_Tape);
515   toolsMenu->addSeparator();
516   addMenuItem(toolsMenu, T_Fill);
517   addMenuItem(toolsMenu, T_Brush);
518   addMenuItem(toolsMenu, T_PaintBrush);
519   addMenuItem(toolsMenu, T_Geometric);
520   addMenuItem(toolsMenu, T_Type);
521   toolsMenu->addSeparator();
522   addMenuItem(toolsMenu, T_Eraser);
523   QMenu *moreToolsMenu = toolsMenu->addMenu(tr("More Tools"));
524   {
525     addMenuItem(moreToolsMenu, T_Edit);
526     addMenuItem(moreToolsMenu, T_Selection);
527     moreToolsMenu->addSeparator();
528     addMenuItem(moreToolsMenu, T_ControlPointEditor);
529     addMenuItem(moreToolsMenu, T_Pinch);
530     addMenuItem(moreToolsMenu, T_Pump);
531     addMenuItem(moreToolsMenu, T_Magnet);
532     addMenuItem(moreToolsMenu, T_Bender);
533     addMenuItem(moreToolsMenu, T_Iron);
534     addMenuItem(moreToolsMenu, T_Cutter);
535     moreToolsMenu->addSeparator();
536     addMenuItem(moreToolsMenu, T_Skeleton);
537     addMenuItem(moreToolsMenu, T_Tracker);
538     addMenuItem(moreToolsMenu, T_Hook);
539     addMenuItem(moreToolsMenu, T_Plastic);
540     moreToolsMenu->addSeparator();
541     addMenuItem(moreToolsMenu, T_Zoom);
542     addMenuItem(moreToolsMenu, T_Rotate);
543     addMenuItem(moreToolsMenu, T_Hand);
544   }
545 
546   //---Edit Menu
547   QMenu *editMenu = addMenu(tr("Edit"), pltEditMenuBar);
548   addMenuItem(editMenu, MI_Undo);
549   addMenuItem(editMenu, MI_Redo);
550   editMenu->addSeparator();
551   addMenuItem(editMenu, MI_NextFrame);
552   addMenuItem(editMenu, MI_PrevFrame);
553   addMenuItem(editMenu, MI_FirstFrame);
554   addMenuItem(editMenu, MI_LastFrame);
555   addMenuItem(editMenu, MI_TestAnimation);
556   editMenu->addSeparator();
557   addMenuItem(editMenu, MI_Copy);
558   addMenuItem(editMenu, MI_Cut);
559   addMenuItem(editMenu, MI_Paste);
560   addMenuItem(editMenu, MI_PasteAbove);
561   addMenuItem(editMenu, MI_PasteInto);
562   editMenu->addSeparator();
563   addMenuItem(editMenu, MI_Clear);
564   addMenuItem(editMenu, MI_Insert);
565   addMenuItem(editMenu, MI_InsertAbove);
566   addMenuItem(editMenu, MI_SelectAll);
567   addMenuItem(editMenu, MI_InvertSelection);
568 
569   //---Checks Menu
570   QMenu *checksMenu = addMenu(tr("Checks"), pltEditMenuBar);
571   addMenuItem(checksMenu, MI_TCheck);
572   addMenuItem(checksMenu, MI_BCheck);
573   addMenuItem(checksMenu, MI_ICheck);
574   addMenuItem(checksMenu, MI_Ink1Check);
575   addMenuItem(checksMenu, MI_PCheck);
576 
577   //---Render Menu
578   QMenu *renderMenu = addMenu(tr("Render"), pltEditMenuBar);
579   addMenuItem(renderMenu, MI_PreviewSettings);
580   addMenuItem(renderMenu, MI_Preview);
581   addMenuItem(renderMenu, MI_SavePreviewedFrames);
582   renderMenu->addSeparator();
583   addMenuItem(renderMenu, MI_OutputSettings);
584   addMenuItem(renderMenu, MI_Render);
585 
586   //---Windows Menu
587   QMenu *windowsMenu = addMenu(tr("Windows"), pltEditMenuBar);
588   addMenuItem(windowsMenu, MI_OpenFileBrowser);
589   addMenuItem(windowsMenu, MI_OpenFileViewer);
590   addMenuItem(windowsMenu, MI_OpenFilmStrip);
591   addMenuItem(windowsMenu, MI_OpenPalette);
592   addMenuItem(windowsMenu, MI_OpenStudioPalette);
593   addMenuItem(windowsMenu, MI_OpenStyleControl);
594   addMenuItem(windowsMenu, MI_OpenLevelView);
595   addMenuItem(windowsMenu, MI_OpenComboViewer);
596   addMenuItem(windowsMenu, MI_OpenXshView);
597   addMenuItem(windowsMenu, MI_OpenTimelineView);
598   windowsMenu->addSeparator();
599   QMenu *otherWindowsMenu = windowsMenu->addMenu(tr("Other Windows"));
600   {
601     addMenuItem(otherWindowsMenu, MI_OpenBatchServers);
602     addMenuItem(otherWindowsMenu, MI_OpenColorModel);
603     addMenuItem(otherWindowsMenu, MI_OpenFunctionEditor);
604     addMenuItem(otherWindowsMenu, MI_OpenFileBrowser2);
605     addMenuItem(otherWindowsMenu, MI_OpenSchematic);
606     addMenuItem(otherWindowsMenu, MI_OpenTasks);
607     addMenuItem(otherWindowsMenu, MI_OpenToolbar);
608     addMenuItem(otherWindowsMenu, MI_OpenToolOptionBar);
609     addMenuItem(otherWindowsMenu, MI_OpenHistoryPanel);
610     addMenuItem(otherWindowsMenu, MI_OpenTMessage);
611   }
612 
613   //---Customize Menu
614   QMenu *customizeMenu = addMenu(tr("Customize"), pltEditMenuBar);
615   addMenuItem(customizeMenu, MI_Preferences);
616   addMenuItem(customizeMenu, MI_ShortcutPopup);
617   addMenuItem(customizeMenu, MI_SceneSettings);
618   customizeMenu->addSeparator();
619   QMenu *viewPartsMenu = customizeMenu->addMenu(tr("View"));
620   {
621     addMenuItem(viewPartsMenu, MI_ViewCamera);
622     addMenuItem(viewPartsMenu, MI_ViewTable);
623     addMenuItem(viewPartsMenu, MI_FieldGuide);
624     addMenuItem(viewPartsMenu, MI_SafeArea);
625     addMenuItem(viewPartsMenu, MI_ViewColorcard);
626   }
627   customizeMenu->addSeparator();
628   addMenuItem(customizeMenu, MI_DockingCheck);
629   customizeMenu->addSeparator();
630   addMenuItem(customizeMenu, "MI_RunScript");
631   addMenuItem(customizeMenu, "MI_OpenScriptConsole");
632 #ifndef NDEBUG
633   addMenuItem(customizeMenu, "MI_ReloadStyle");
634 #endif
635 
636   //---Help Menu
637   QMenu *helpMenu = addMenu(tr("Help"), pltEditMenuBar);
638   addMenuItem(helpMenu, MI_About);
639 
640   return pltEditMenuBar;
641 }
642 
643 //---------------------------------------------------------------------------------
644 
createInknPaintMenuBar()645 QMenuBar *StackedMenuBar::createInknPaintMenuBar() {
646   QMenuBar *inknPaintMenuBar = new QMenuBar(this);
647 
648   //---Files Menu
649   QMenu *filesMenu = addMenu(tr("Files"), inknPaintMenuBar);
650   addMenuItem(filesMenu, MI_LoadLevel);
651   addMenuItem(filesMenu, MI_LoadFolder);
652   addMenuItem(filesMenu, MI_SaveLevel);
653   addMenuItem(filesMenu, MI_SaveLevelAs);
654   addMenuItem(filesMenu, MI_OpenRecentLevel);
655   addMenuItem(filesMenu, MI_ExportLevel);
656   addMenuItem(filesMenu, MI_LevelSettings);
657   addMenuItem(filesMenu, MI_CanvasSize);
658   filesMenu->addSeparator();
659   addMenuItem(filesMenu, MI_NewLevel);
660   filesMenu->addSeparator();
661   addMenuItem(filesMenu, MI_OverwritePalette);
662   addMenuItem(filesMenu, MI_SavePaletteAs);
663   filesMenu->addSeparator();
664   addMenuItem(filesMenu, MI_LoadColorModel);
665   filesMenu->addSeparator();
666   addMenuItem(filesMenu, MI_ApplyMatchLines);
667   addMenuItem(filesMenu, MI_DeleteMatchLines);
668   addMenuItem(filesMenu, MI_DeleteInk);
669   addMenuItem(filesMenu, MI_MergeCmapped);
670   addMenuItem(filesMenu, MI_MergeColumns);
671   filesMenu->addSeparator();
672   addMenuItem(filesMenu, MI_LoadScene);
673   addMenuItem(filesMenu, MI_SaveScene);
674   addMenuItem(filesMenu, MI_SaveSceneAs);
675   addMenuItem(filesMenu, MI_SaveAll);
676   addMenuItem(filesMenu, MI_OpenRecentScene);
677   filesMenu->addSeparator();
678   addMenuItem(filesMenu, MI_NewScene);
679   filesMenu->addSeparator();
680   addMenuItem(filesMenu, MI_Quit);
681 
682   //---Tools Menu
683   QMenu *toolsMenu = addMenu(tr("Tools"), inknPaintMenuBar);
684   addMenuItem(toolsMenu, T_StylePicker);
685   addMenuItem(toolsMenu, T_RGBPicker);
686   addMenuItem(toolsMenu, T_Tape);
687   toolsMenu->addSeparator();
688   addMenuItem(toolsMenu, T_Fill);
689   addMenuItem(toolsMenu, T_Brush);
690   addMenuItem(toolsMenu, T_PaintBrush);
691   addMenuItem(toolsMenu, T_Geometric);
692   addMenuItem(toolsMenu, T_Type);
693   toolsMenu->addSeparator();
694   addMenuItem(toolsMenu, T_Eraser);
695   toolsMenu->addSeparator();
696   QMenu *moreToolsMenu = toolsMenu->addMenu(tr("More Tools"));
697   {
698     addMenuItem(moreToolsMenu, T_Edit);
699     addMenuItem(moreToolsMenu, T_Selection);
700     moreToolsMenu->addSeparator();
701     addMenuItem(moreToolsMenu, T_ControlPointEditor);
702     addMenuItem(moreToolsMenu, T_Pinch);
703     addMenuItem(moreToolsMenu, T_Pump);
704     addMenuItem(moreToolsMenu, T_Magnet);
705     addMenuItem(moreToolsMenu, T_Bender);
706     addMenuItem(moreToolsMenu, T_Iron);
707     addMenuItem(moreToolsMenu, T_Cutter);
708     moreToolsMenu->addSeparator();
709     addMenuItem(moreToolsMenu, T_Skeleton);
710     addMenuItem(moreToolsMenu, T_Tracker);
711     addMenuItem(moreToolsMenu, T_Hook);
712     addMenuItem(moreToolsMenu, T_Plastic);
713     moreToolsMenu->addSeparator();
714     addMenuItem(moreToolsMenu, T_Zoom);
715     addMenuItem(moreToolsMenu, T_Rotate);
716     addMenuItem(moreToolsMenu, T_Hand);
717   }
718 
719   //---Draw Menu
720   QMenu *drawMenu = addMenu(tr("Draw"), inknPaintMenuBar);
721   addMenuItem(drawMenu, MI_ShiftTrace);
722   addMenuItem(drawMenu, MI_EditShift);
723   addMenuItem(drawMenu, MI_NoShift);
724   addMenuItem(drawMenu, MI_ResetShift);
725   drawMenu->addSeparator();
726   addMenuItem(drawMenu, MI_RasterizePli);
727 
728   //---Edit Menu
729   QMenu *editMenu = addMenu(tr("Edit"), inknPaintMenuBar);
730   addMenuItem(editMenu, MI_Undo);
731   addMenuItem(editMenu, MI_Redo);
732   editMenu->addSeparator();
733   addMenuItem(editMenu, MI_NextFrame);
734   addMenuItem(editMenu, MI_PrevFrame);
735   addMenuItem(editMenu, MI_FirstFrame);
736   addMenuItem(editMenu, MI_LastFrame);
737   addMenuItem(editMenu, MI_TestAnimation);
738   editMenu->addSeparator();
739   addMenuItem(editMenu, MI_Copy);
740   addMenuItem(editMenu, MI_Cut);
741   addMenuItem(editMenu, MI_Paste);
742   addMenuItem(editMenu, MI_PasteAbove);
743   addMenuItem(editMenu, MI_PasteInto);
744   editMenu->addSeparator();
745   addMenuItem(editMenu, MI_Clear);
746   addMenuItem(editMenu, MI_Insert);
747   addMenuItem(editMenu, MI_InsertAbove);
748   addMenuItem(editMenu, MI_SelectAll);
749   addMenuItem(editMenu, MI_InvertSelection);
750 
751   //---Checks Menu
752   QMenu *checksMenu = addMenu(tr("Checks"), inknPaintMenuBar);
753   addMenuItem(checksMenu, MI_TCheck);
754   addMenuItem(checksMenu, MI_BCheck);
755   addMenuItem(checksMenu, MI_ICheck);
756   addMenuItem(checksMenu, MI_Ink1Check);
757   addMenuItem(checksMenu, MI_PCheck);
758   addMenuItem(checksMenu, MI_GCheck);
759   addMenuItem(checksMenu, MI_ACheck);
760   addMenuItem(checksMenu, MI_IOnly);
761 
762   //---Windows Menu
763   QMenu *windowsMenu = addMenu(tr("Windows"), inknPaintMenuBar);
764   addMenuItem(windowsMenu, MI_OpenStyleControl);
765   addMenuItem(windowsMenu, MI_OpenPltGizmo);
766   addMenuItem(windowsMenu, MI_OpenPalette);
767   addMenuItem(windowsMenu, MI_OpenStudioPalette);
768   addMenuItem(windowsMenu, MI_OpenComboViewer);
769   addMenuItem(windowsMenu, MI_OpenXshView);
770   addMenuItem(windowsMenu, MI_OpenTimelineView);
771   addMenuItem(windowsMenu, MI_OpenColorModel);
772   addMenuItem(windowsMenu, MI_OpenFileBrowser);
773   addMenuItem(windowsMenu, MI_OpenFilmStrip);
774   addMenuItem(windowsMenu, MI_OpenToolbar);
775   addMenuItem(windowsMenu, MI_OpenToolOptionBar);
776   windowsMenu->addSeparator();
777   QMenu *otherWindowsMenu = windowsMenu->addMenu(tr("Other Windows"));
778   {
779     addMenuItem(otherWindowsMenu, MI_OpenBatchServers);
780     addMenuItem(otherWindowsMenu, MI_OpenFileViewer);
781     addMenuItem(otherWindowsMenu, MI_OpenFunctionEditor);
782     addMenuItem(otherWindowsMenu, MI_OpenFileBrowser2);
783     addMenuItem(otherWindowsMenu, MI_OpenSchematic);
784     addMenuItem(otherWindowsMenu, MI_OpenTasks);
785     addMenuItem(otherWindowsMenu, MI_OpenHistoryPanel);
786     addMenuItem(otherWindowsMenu, MI_OpenTMessage);
787   }
788 
789   //---Customize Menu
790   QMenu *customizeMenu = addMenu(tr("Customize"), inknPaintMenuBar);
791   addMenuItem(customizeMenu, MI_Preferences);
792   addMenuItem(customizeMenu, MI_ShortcutPopup);
793   addMenuItem(customizeMenu, MI_SceneSettings);
794   customizeMenu->addSeparator();
795   QMenu *viewPartsMenu = customizeMenu->addMenu(tr("View"));
796   {
797     addMenuItem(viewPartsMenu, MI_ViewCamera);
798     addMenuItem(viewPartsMenu, MI_ViewTable);
799     addMenuItem(viewPartsMenu, MI_FieldGuide);
800     addMenuItem(viewPartsMenu, MI_SafeArea);
801     addMenuItem(viewPartsMenu, MI_ViewColorcard);
802   }
803   customizeMenu->addSeparator();
804   addMenuItem(customizeMenu, MI_DockingCheck);
805   customizeMenu->addSeparator();
806   addMenuItem(customizeMenu, "MI_RunScript");
807   addMenuItem(customizeMenu, "MI_OpenScriptConsole");
808 #ifndef NDEBUG
809   addMenuItem(customizeMenu, "MI_ReloadStyle");
810 #endif
811 
812   //---Help Menu
813   QMenu *helpMenu = addMenu(tr("Help"), inknPaintMenuBar);
814   addMenuItem(helpMenu, MI_About);
815 
816   return inknPaintMenuBar;
817 }
818 
819 //---------------------------------------------------------------------------------
820 
createXsheetMenuBar()821 QMenuBar *StackedMenuBar::createXsheetMenuBar() {
822   QMenuBar *xsheetMenuBar = new QMenuBar(this);
823   //----Xsheet Menu
824   QMenu *xsheetMenu = addMenu(tr("Xsheet"), xsheetMenuBar);
825   addMenuItem(xsheetMenu, MI_LoadScene);
826   addMenuItem(xsheetMenu, MI_SaveScene);
827   addMenuItem(xsheetMenu, MI_SaveSceneAs);
828   addMenuItem(xsheetMenu, MI_SaveAll);
829   addMenuItem(xsheetMenu, MI_OpenRecentScene);
830   addMenuItem(xsheetMenu, MI_RevertScene);
831   xsheetMenu->addSeparator();
832   addMenuItem(xsheetMenu, MI_NewScene);
833   xsheetMenu->addSeparator();
834   addMenuItem(xsheetMenu, MI_PrintXsheet);
835   addMenuItem(xsheetMenu, MI_Export);
836   xsheetMenu->addSeparator();
837   addMenuItem(xsheetMenu, MI_Quit);
838 
839   //----Subxsheet Menu
840   QMenu *subxsheetMenu = addMenu(tr("Subxsheet"), xsheetMenuBar);
841   addMenuItem(subxsheetMenu, MI_OpenChild);
842   addMenuItem(subxsheetMenu, MI_CloseChild);
843   addMenuItem(subxsheetMenu, MI_Collapse);
844   addMenuItem(subxsheetMenu, MI_ToggleEditInPlace);
845   addMenuItem(subxsheetMenu, MI_Resequence);
846   addMenuItem(subxsheetMenu, MI_SaveSubxsheetAs);
847   addMenuItem(subxsheetMenu, MI_LoadSubSceneFile);
848   addMenuItem(subxsheetMenu, MI_CloneChild);
849   addMenuItem(subxsheetMenu, MI_ExplodeChild);
850 
851   //----Levels Menu
852   QMenu *levelsMenu = addMenu(tr("Levels"), xsheetMenuBar);
853   addMenuItem(levelsMenu, MI_LoadLevel);
854   addMenuItem(levelsMenu, MI_LoadFolder);
855   addMenuItem(levelsMenu, MI_SaveLevel);
856   addMenuItem(levelsMenu, MI_SaveLevelAs);
857   addMenuItem(levelsMenu, MI_ExportLevel);
858   addMenuItem(levelsMenu, MI_OpenRecentLevel);
859   addMenuItem(levelsMenu, MI_LevelSettings);
860   addMenuItem(levelsMenu, MI_CanvasSize);
861   levelsMenu->addSeparator();
862   addMenuItem(levelsMenu, MI_NewLevel);
863   levelsMenu->addSeparator();
864   addMenuItem(levelsMenu, MI_ViewFile);
865   addMenuItem(levelsMenu, MI_FileInfo);
866   levelsMenu->addSeparator();
867   addMenuItem(levelsMenu, MI_CloneLevel);
868   addMenuItem(levelsMenu, MI_ReplaceLevel);
869   levelsMenu->addSeparator();
870   addMenuItem(levelsMenu, MI_AddFrames);
871   addMenuItem(levelsMenu, MI_Renumber);
872   addMenuItem(levelsMenu, MI_RevertToCleanedUp);
873   addMenuItem(levelsMenu, MI_ConvertToVectors);
874   addMenuItem(levelsMenu, MI_ConvertFileWithInput);
875   addMenuItem(levelsMenu, MI_Tracking);
876   addMenuItem(levelsMenu, MI_ExposeResource);
877   addMenuItem(levelsMenu, MI_EditLevel);
878   addMenuItem(levelsMenu, MI_RemoveUnused);
879 
880   //----Cells Menu
881   QMenu *cellsMenu = addMenu(tr("Cells"), xsheetMenuBar);
882   addMenuItem(cellsMenu, MI_Dup);
883   addMenuItem(cellsMenu, MI_Reverse);
884   addMenuItem(cellsMenu, MI_Rollup);
885   addMenuItem(cellsMenu, MI_Rolldown);
886   addMenuItem(cellsMenu, MI_Swing);
887   addMenuItem(cellsMenu, MI_Random);
888   addMenuItem(cellsMenu, MI_TimeStretch);
889   cellsMenu->addSeparator();
890   QMenu *reframeSubMenu = cellsMenu->addMenu(tr("Reframe"));
891   {
892     addMenuItem(reframeSubMenu, MI_Reframe1);
893     addMenuItem(reframeSubMenu, MI_Reframe2);
894     addMenuItem(reframeSubMenu, MI_Reframe3);
895     addMenuItem(reframeSubMenu, MI_Reframe4);
896   }
897   QMenu *stepMenu = cellsMenu->addMenu(tr("Step"));
898   {
899     addMenuItem(stepMenu, MI_Step2);
900     addMenuItem(stepMenu, MI_Step3);
901     addMenuItem(stepMenu, MI_Step4);
902   }
903   QMenu *eachMenu = cellsMenu->addMenu(tr("Each"));
904   {
905     addMenuItem(eachMenu, MI_Each2);
906     addMenuItem(eachMenu, MI_Each3);
907     addMenuItem(eachMenu, MI_Each4);
908   }
909 
910   //----Edit Menu
911   QMenu *editMenu = addMenu(tr("Edit"), xsheetMenuBar);
912   addMenuItem(editMenu, MI_Undo);
913   addMenuItem(editMenu, MI_Redo);
914   editMenu->addSeparator();
915   addMenuItem(editMenu, MI_Copy);
916   addMenuItem(editMenu, MI_Cut);
917   addMenuItem(editMenu, MI_Paste);
918   addMenuItem(editMenu, MI_PasteAbove);
919   addMenuItem(editMenu, MI_PasteInto);
920   editMenu->addSeparator();
921   addMenuItem(editMenu, MI_Clear);
922   addMenuItem(editMenu, MI_Insert);
923   addMenuItem(editMenu, MI_InsertAbove);
924   addMenuItem(editMenu, MI_SelectAll);
925   addMenuItem(editMenu, MI_InvertSelection);
926   editMenu->addSeparator();
927   addMenuItem(editMenu, MI_InsertSceneFrame);
928   addMenuItem(editMenu, MI_RemoveSceneFrame);
929   addMenuItem(editMenu, MI_InsertGlobalKeyframe);
930   addMenuItem(editMenu, MI_RemoveGlobalKeyframe);
931 
932   //---Render Menu
933   QMenu *renderMenu = addMenu(tr("Render"), xsheetMenuBar);
934   addMenuItem(renderMenu, MI_PreviewSettings);
935   addMenuItem(renderMenu, MI_Preview);
936   addMenuItem(renderMenu, MI_SavePreviewedFrames);
937   renderMenu->addSeparator();
938   addMenuItem(renderMenu, MI_OutputSettings);
939   addMenuItem(renderMenu, MI_Render);
940   renderMenu->addSeparator();
941   addMenuItem(renderMenu, MI_Link);
942 
943   //----Windows Menu
944   QMenu *windowsMenu = addMenu(tr("Windows"), xsheetMenuBar);
945   addMenuItem(windowsMenu, MI_OpenSchematic);
946   addMenuItem(windowsMenu, MI_OpenComboViewer);
947   addMenuItem(windowsMenu, MI_OpenFileBrowser);
948   addMenuItem(windowsMenu, MI_OpenFunctionEditor);
949   addMenuItem(windowsMenu, MI_OpenFileViewer);
950   addMenuItem(windowsMenu, MI_OpenFilmStrip);
951   addMenuItem(windowsMenu, MI_OpenLevelView);
952   addMenuItem(windowsMenu, MI_OpenXshView);
953   addMenuItem(windowsMenu, MI_OpenTimelineView);
954   windowsMenu->addSeparator();
955   QMenu *otherWindowsMenu = windowsMenu->addMenu(tr("Other Windows"));
956   {
957     addMenuItem(otherWindowsMenu, MI_OpenBatchServers);
958     addMenuItem(otherWindowsMenu, MI_OpenColorModel);
959     addMenuItem(otherWindowsMenu, MI_OpenPalette);
960     addMenuItem(otherWindowsMenu, MI_OpenFileBrowser2);
961     addMenuItem(otherWindowsMenu, MI_OpenStudioPalette);
962     addMenuItem(otherWindowsMenu, MI_OpenStyleControl);
963     addMenuItem(otherWindowsMenu, MI_OpenTasks);
964     addMenuItem(otherWindowsMenu, MI_OpenToolbar);
965     addMenuItem(otherWindowsMenu, MI_OpenToolOptionBar);
966     addMenuItem(otherWindowsMenu, MI_OpenHistoryPanel);
967     addMenuItem(otherWindowsMenu, MI_OpenTMessage);
968   }
969 
970   //---Customize Menu
971   QMenu *customizeMenu = addMenu(tr("Customize"), xsheetMenuBar);
972   addMenuItem(customizeMenu, MI_Preferences);
973   addMenuItem(customizeMenu, MI_ShortcutPopup);
974   addMenuItem(customizeMenu, MI_SceneSettings);
975   customizeMenu->addSeparator();
976   QMenu *viewPartsMenu = customizeMenu->addMenu(tr("View"));
977   {
978     addMenuItem(viewPartsMenu, MI_ViewCamera);
979     addMenuItem(viewPartsMenu, MI_ViewTable);
980     addMenuItem(viewPartsMenu, MI_FieldGuide);
981     addMenuItem(viewPartsMenu, MI_SafeArea);
982     addMenuItem(viewPartsMenu, MI_ViewBBox);
983     addMenuItem(viewPartsMenu, MI_ViewColorcard);
984   }
985   customizeMenu->addSeparator();
986   addMenuItem(customizeMenu, MI_DockingCheck);
987   customizeMenu->addSeparator();
988   addMenuItem(customizeMenu, "MI_RunScript");
989   addMenuItem(customizeMenu, "MI_OpenScriptConsole");
990 #ifndef NDEBUG
991   addMenuItem(customizeMenu, "MI_ReloadStyle");
992 #endif
993 
994   //---Help Menu
995   QMenu *helpMenu = addMenu(tr("Help"), xsheetMenuBar);
996   addMenuItem(helpMenu, MI_About);
997 
998   return xsheetMenuBar;
999 }
1000 
1001 //---------------------------------------------------------------------------------
1002 
createBatchesMenuBar()1003 QMenuBar *StackedMenuBar::createBatchesMenuBar() {
1004   QMenuBar *batchesMenuBar = new QMenuBar(this);
1005 
1006   //---Files Menu
1007   QMenu *filesMenu = addMenu(tr("Files"), batchesMenuBar);
1008   addMenuItem(filesMenu, MI_Quit);
1009 
1010   //----Windows Menu
1011   QMenu *windowsMenu = addMenu(tr("Windows"), batchesMenuBar);
1012   addMenuItem(windowsMenu, MI_OpenFileBrowser);
1013   addMenuItem(windowsMenu, MI_OpenBatchServers);
1014   addMenuItem(windowsMenu, MI_OpenTasks);
1015 
1016   //---Customize Menu
1017   QMenu *customizeMenu = addMenu(tr("Customize"), batchesMenuBar);
1018   addMenuItem(customizeMenu, MI_Preferences);
1019   addMenuItem(customizeMenu, MI_ShortcutPopup);
1020   customizeMenu->addSeparator();
1021   addMenuItem(customizeMenu, MI_DockingCheck);
1022   customizeMenu->addSeparator();
1023   addMenuItem(customizeMenu, "MI_RunScript");
1024   addMenuItem(customizeMenu, "MI_OpenScriptConsole");
1025 #ifndef NDEBUG
1026   addMenuItem(customizeMenu, "MI_ReloadStyle");
1027 #endif
1028 
1029   //---Help Menu
1030   QMenu *helpMenu = addMenu(tr("Help"), batchesMenuBar);
1031   addMenuItem(helpMenu, MI_About);
1032 
1033   return batchesMenuBar;
1034 }
1035 
1036 //---------------------------------------------------------------------------------
1037 
createBrowserMenuBar()1038 QMenuBar *StackedMenuBar::createBrowserMenuBar() {
1039   QMenuBar *browserMenuBar = new QMenuBar(this);
1040 
1041   //---Files Menu
1042   QMenu *filesMenu = addMenu(tr("Files"), browserMenuBar);
1043   addMenuItem(filesMenu, MI_NewProject);
1044   addMenuItem(filesMenu, MI_ProjectSettings);
1045   addMenuItem(filesMenu, MI_SaveDefaultSettings);
1046   filesMenu->addSeparator();
1047   addMenuItem(filesMenu, MI_Quit);
1048 
1049   //---Customize Menu
1050   QMenu *customizeMenu = addMenu(tr("Customize"), browserMenuBar);
1051   addMenuItem(customizeMenu, MI_Preferences);
1052   addMenuItem(customizeMenu, MI_ShortcutPopup);
1053   customizeMenu->addSeparator();
1054   addMenuItem(customizeMenu, MI_DockingCheck);
1055   customizeMenu->addSeparator();
1056   addMenuItem(customizeMenu, "MI_RunScript");
1057   addMenuItem(customizeMenu, "MI_OpenScriptConsole");
1058 #ifndef NDEBUG
1059   addMenuItem(customizeMenu, "MI_ReloadStyle");
1060 #endif
1061 
1062   // iwsw commented out temporarily
1063   // customizeMenu->addSeparator();
1064   // addMenuItem(customizeMenu, "MI_ToonShadedImageToTLVByFolder");
1065 
1066   //---Help Menu
1067   QMenu *helpMenu = addMenu(tr("Help"), browserMenuBar);
1068   addMenuItem(helpMenu, MI_About);
1069 
1070   return browserMenuBar;
1071 }
1072 
1073 //---------------------------------------------------------------------------------
1074 
createFullMenuBar()1075 QMenuBar *StackedMenuBar::createFullMenuBar() {
1076   QMenuBar *fullMenuBar = new QMenuBar(this);
1077   // Menu' FILE
1078   QMenu *fileMenu = addMenu(tr("File"), fullMenuBar);
1079   addMenuItem(fileMenu, MI_NewScene);
1080   addMenuItem(fileMenu, MI_LoadScene);
1081   addMenuItem(fileMenu, MI_SaveAll);
1082   addMenuItem(fileMenu, MI_SaveScene);
1083   addMenuItem(fileMenu, MI_SaveSceneAs);
1084   addMenuItem(fileMenu, MI_OpenRecentScene);
1085   addMenuItem(fileMenu, MI_RevertScene);
1086   fileMenu->addSeparator();
1087   addMenuItem(fileMenu, MI_LoadFolder);
1088   addMenuItem(fileMenu, MI_LoadSubSceneFile);
1089   fileMenu->addSeparator();
1090   addMenuItem(fileMenu, MI_ConvertFileWithInput);
1091   fileMenu->addSeparator();
1092   addMenuItem(fileMenu, MI_LoadColorModel);
1093   fileMenu->addSeparator();
1094   QMenu *projectManagementMenu = fileMenu->addMenu(tr("Project Management"));
1095   {
1096     addMenuItem(projectManagementMenu, MI_NewProject);
1097     addMenuItem(projectManagementMenu, MI_ProjectSettings);
1098     projectManagementMenu->addSeparator();
1099     addMenuItem(projectManagementMenu, MI_SaveDefaultSettings);
1100   }
1101   fileMenu->addSeparator();
1102   QMenu *importMenu = fileMenu->addMenu(tr("Import"));
1103   { addMenuItem(importMenu, MI_ImportMagpieFile); }
1104   QMenu *exportMenu = fileMenu->addMenu(tr("Export"));
1105   {
1106     addMenuItem(exportMenu, MI_SoundTrack);
1107     addMenuItem(exportMenu, MI_ExportXDTS);
1108 #if defined(x64)
1109     addMenuItem(exportMenu, MI_StopMotionExportImageSequence);
1110 #endif
1111   }
1112   fileMenu->addSeparator();
1113   addMenuItem(fileMenu, MI_PrintXsheet);
1114   addMenuItem(fileMenu, MI_Print);
1115   addMenuItem(fileMenu, MI_Export);
1116   fileMenu->addSeparator();
1117   QMenu *scriptMenu = fileMenu->addMenu(tr("Script"));
1118   {
1119     addMenuItem(scriptMenu, "MI_RunScript");
1120     addMenuItem(scriptMenu, "MI_OpenScriptConsole");
1121   }
1122   fileMenu->addSeparator();
1123   addMenuItem(fileMenu, MI_Preferences);
1124   addMenuItem(fileMenu, MI_ShortcutPopup);
1125   fileMenu->addSeparator();
1126   addMenuItem(fileMenu, MI_ClearCacheFolder);
1127   fileMenu->addSeparator();
1128   addMenuItem(fileMenu, MI_Quit);
1129 
1130   // Menu' EDIT
1131   QMenu *editMenu = addMenu(tr("Edit"), fullMenuBar);
1132   addMenuItem(editMenu, MI_Undo);
1133   addMenuItem(editMenu, MI_Redo);
1134   editMenu->addSeparator();
1135   addMenuItem(editMenu, MI_Cut);
1136   addMenuItem(editMenu, MI_Copy);
1137   addMenuItem(editMenu, MI_Paste);
1138   addMenuItem(editMenu, MI_PasteAbove);
1139   // addMenuItem(editMenu, MI_PasteNew);
1140   addMenuItem(editMenu, MI_PasteInto);
1141   addMenuItem(editMenu, MI_PasteDuplicate);
1142   addMenuItem(editMenu, MI_Insert);
1143   addMenuItem(editMenu, MI_InsertAbove);
1144   addMenuItem(editMenu, MI_Clear);
1145   editMenu->addSeparator();
1146   addMenuItem(editMenu, MI_SelectAll);
1147   addMenuItem(editMenu, MI_InvertSelection);
1148   editMenu->addSeparator();
1149   QMenu *groupMenu = editMenu->addMenu(tr("Group"));
1150   {
1151     addMenuItem(groupMenu, MI_Group);
1152     addMenuItem(groupMenu, MI_Ungroup);
1153     addMenuItem(groupMenu, MI_EnterGroup);
1154     addMenuItem(groupMenu, MI_ExitGroup);
1155   }
1156   editMenu->addSeparator();
1157   QMenu *arrangeMenu = editMenu->addMenu(tr("Arrange"));
1158   {
1159     addMenuItem(arrangeMenu, MI_BringToFront);
1160     addMenuItem(arrangeMenu, MI_BringForward);
1161     addMenuItem(arrangeMenu, MI_SendBackward);
1162     addMenuItem(arrangeMenu, MI_SendBack);
1163   }
1164 
1165   // Menu' SCAN CLEANUP
1166   QMenu *scanCleanupMenu = addMenu(tr("Scan && Cleanup"), fullMenuBar);
1167   addMenuItem(scanCleanupMenu, MI_DefineScanner);
1168   addMenuItem(scanCleanupMenu, MI_ScanSettings);
1169   addMenuItem(scanCleanupMenu, MI_Scan);
1170   addMenuItem(scanCleanupMenu, MI_SetScanCropbox);
1171   addMenuItem(scanCleanupMenu, MI_ResetScanCropbox);
1172   scanCleanupMenu->addSeparator();
1173   addMenuItem(scanCleanupMenu, MI_CleanupSettings);
1174   addMenuItem(scanCleanupMenu, MI_CleanupPreview);
1175   addMenuItem(scanCleanupMenu, MI_CameraTest);
1176   addMenuItem(scanCleanupMenu, MI_Cleanup);
1177   scanCleanupMenu->addSeparator();
1178   addMenuItem(scanCleanupMenu, MI_PencilTest);
1179 #ifdef LINETEST
1180   scanCleanupMenu->addSeparator();
1181   addMenuItem(scanCleanupMenu, MI_Autocenter);
1182 #endif
1183 
1184   // Menu' LEVEL
1185   QMenu *levelMenu = addMenu(tr("Level"), fullMenuBar);
1186   QMenu *newMenu   = levelMenu->addMenu(tr("New"));
1187   {
1188     addMenuItem(newMenu, MI_NewLevel);
1189     newMenu->addSeparator();
1190     addMenuItem(newMenu, MI_NewToonzRasterLevel);
1191     addMenuItem(newMenu, MI_NewVectorLevel);
1192     addMenuItem(newMenu, MI_NewRasterLevel);
1193     addMenuItem(newMenu, MI_NewNoteLevel);
1194   }
1195   addMenuItem(levelMenu, MI_LoadLevel);
1196   addMenuItem(levelMenu, MI_SaveLevel);
1197   addMenuItem(levelMenu, MI_SaveLevelAs);
1198   addMenuItem(levelMenu, MI_SaveAllLevels);
1199   addMenuItem(levelMenu, MI_OpenRecentLevel);
1200   addMenuItem(levelMenu, MI_ExportLevel);
1201   levelMenu->addSeparator();
1202   addMenuItem(levelMenu, MI_AddFrames);
1203   addMenuItem(levelMenu, MI_Renumber);
1204   addMenuItem(levelMenu, MI_ReplaceLevel);
1205   addMenuItem(levelMenu, MI_RevertToCleanedUp);
1206   addMenuItem(levelMenu, MI_RevertToLastSaved);
1207   addMenuItem(levelMenu, MI_Tracking);
1208   levelMenu->addSeparator();
1209   QMenu *adjustMenu = levelMenu->addMenu(tr("Adjust"));
1210   {
1211     addMenuItem(adjustMenu, MI_BrightnessAndContrast);
1212     addMenuItem(adjustMenu, MI_AdjustLevels);
1213     addMenuItem(adjustMenu, MI_AdjustThickness);
1214     addMenuItem(adjustMenu, MI_Antialias);
1215     addMenuItem(adjustMenu, MI_Binarize);
1216     addMenuItem(adjustMenu, MI_LinesFade);
1217   }
1218   QMenu *optimizeMenu = levelMenu->addMenu(tr("Optimize"));
1219   {
1220     addMenuItem(optimizeMenu, MI_RemoveEndpoints);
1221     addMenuItem(optimizeMenu, MI_ConvertVectorToVector);
1222   }
1223   QMenu *convertMenu = levelMenu->addMenu(tr("Convert"));
1224   {
1225     addMenuItem(convertMenu, MI_ConvertToVectors);
1226     addMenuItem(convertMenu, MI_ConvertToToonzRaster);
1227   }
1228   levelMenu->addSeparator();
1229   addMenuItem(levelMenu, MI_ExposeResource);
1230   addMenuItem(levelMenu, MI_EditLevel);
1231   levelMenu->addSeparator();
1232   addMenuItem(levelMenu, MI_CanvasSize);
1233   addMenuItem(levelMenu, MI_LevelSettings);
1234   addMenuItem(levelMenu, MI_FileInfo);
1235   addMenuItem(levelMenu, MI_ReplaceParentDirectory);
1236   levelMenu->addSeparator();
1237   addMenuItem(levelMenu, MI_RemoveUnused);
1238 
1239   // Menu' XSHEET
1240   QMenu *xsheetMenu = addMenu(tr("Xsheet"), fullMenuBar);
1241   addMenuItem(xsheetMenu, MI_SceneSettings);
1242   addMenuItem(xsheetMenu, MI_CameraSettings);
1243   xsheetMenu->addSeparator();
1244   addMenuItem(xsheetMenu, MI_OpenChild);
1245   addMenuItem(xsheetMenu, MI_CloseChild);
1246   addMenuItem(xsheetMenu, MI_SaveSubxsheetAs);
1247   addMenuItem(xsheetMenu, MI_Collapse);
1248   addMenuItem(xsheetMenu, MI_Resequence);
1249   addMenuItem(xsheetMenu, MI_CloneChild);
1250   addMenuItem(xsheetMenu, MI_ExplodeChild);
1251   addMenuItem(xsheetMenu, MI_ToggleEditInPlace);
1252   xsheetMenu->addSeparator();
1253   addMenuItem(xsheetMenu, MI_ApplyMatchLines);
1254   addMenuItem(xsheetMenu, MI_MergeCmapped);
1255   xsheetMenu->addSeparator();
1256   addMenuItem(xsheetMenu, MI_MergeColumns);
1257   addMenuItem(xsheetMenu, MI_DeleteMatchLines);
1258   addMenuItem(xsheetMenu, MI_DeleteInk);
1259   xsheetMenu->addSeparator();
1260   addMenuItem(xsheetMenu, MI_InsertFx);
1261   addMenuItem(xsheetMenu, MI_NewOutputFx);
1262   xsheetMenu->addSeparator();
1263   addMenuItem(xsheetMenu, MI_InsertSceneFrame);
1264   addMenuItem(xsheetMenu, MI_RemoveSceneFrame);
1265   addMenuItem(xsheetMenu, MI_InsertGlobalKeyframe);
1266   addMenuItem(xsheetMenu, MI_RemoveGlobalKeyframe);
1267   xsheetMenu->addSeparator();
1268   addMenuItem(xsheetMenu, MI_LipSyncPopup);
1269   xsheetMenu->addSeparator();
1270   addMenuItem(xsheetMenu, MI_RemoveEmptyColumns);
1271 
1272   // Menu' CELLS
1273   QMenu *cellsMenu = addMenu(tr("Cells"), fullMenuBar);
1274   addMenuItem(cellsMenu, MI_Reverse);
1275   addMenuItem(cellsMenu, MI_Swing);
1276   addMenuItem(cellsMenu, MI_Random);
1277   addMenuItem(cellsMenu, MI_Increment);
1278   addMenuItem(cellsMenu, MI_Dup);
1279   cellsMenu->addSeparator();
1280   QMenu *reframeMenu = cellsMenu->addMenu(tr("Reframe"));
1281   {
1282     addMenuItem(reframeMenu, MI_Reframe1);
1283     addMenuItem(reframeMenu, MI_Reframe2);
1284     addMenuItem(reframeMenu, MI_Reframe3);
1285     addMenuItem(reframeMenu, MI_Reframe4);
1286     addMenuItem(reframeMenu, MI_ReframeWithEmptyInbetweens);
1287   }
1288   QMenu *stepMenu = cellsMenu->addMenu(tr("Step"));
1289   {
1290     addMenuItem(stepMenu, MI_IncreaseStep);
1291     addMenuItem(stepMenu, MI_DecreaseStep);
1292     addMenuItem(stepMenu, MI_ResetStep);
1293     addMenuItem(stepMenu, MI_Step2);
1294     addMenuItem(stepMenu, MI_Step3);
1295     addMenuItem(stepMenu, MI_Step4);
1296   }
1297   QMenu *eachMenu = cellsMenu->addMenu(tr("Each"));
1298   {
1299     addMenuItem(eachMenu, MI_Each2);
1300     addMenuItem(eachMenu, MI_Each3);
1301     addMenuItem(eachMenu, MI_Each4);
1302   }
1303   addMenuItem(cellsMenu, MI_Rollup);
1304   addMenuItem(cellsMenu, MI_Rolldown);
1305   addMenuItem(cellsMenu, MI_TimeStretch);
1306   addMenuItem(cellsMenu, MI_AutoInputCellNumber);
1307   cellsMenu->addSeparator();
1308   QMenu *drawingSubMenu = cellsMenu->addMenu(tr("Drawing Substitution"));
1309   {
1310     addMenuItem(drawingSubMenu, MI_DrawingSubForward);
1311     addMenuItem(drawingSubMenu, MI_DrawingSubBackward);
1312     addMenuItem(drawingSubMenu, MI_DrawingSubGroupForward);
1313     addMenuItem(drawingSubMenu, MI_DrawingSubGroupBackward);
1314   }
1315   cellsMenu->addSeparator();
1316   addMenuItem(cellsMenu, MI_Autorenumber);
1317   addMenuItem(cellsMenu, MI_CreateBlankDrawing);
1318   addMenuItem(cellsMenu, MI_Duplicate);
1319   addMenuItem(cellsMenu, MI_MergeFrames);
1320   addMenuItem(cellsMenu, MI_CloneLevel);
1321   cellsMenu->addSeparator();
1322   addMenuItem(cellsMenu, MI_FillEmptyCell);
1323 
1324   // Menu' PLAY
1325   QMenu *playMenu = addMenu(tr("Play"), fullMenuBar);
1326   addMenuItem(playMenu, MI_Play);
1327   addMenuItem(playMenu, MI_Pause);
1328   addMenuItem(playMenu, MI_Loop);
1329   playMenu->addSeparator();
1330   addMenuItem(playMenu, MI_FirstFrame);
1331   addMenuItem(playMenu, MI_LastFrame);
1332   addMenuItem(playMenu, MI_PrevFrame);
1333   addMenuItem(playMenu, MI_NextFrame);
1334   addMenuItem(playMenu, MI_PrevStep);
1335   addMenuItem(playMenu, MI_NextStep);
1336   playMenu->addSeparator();
1337   addMenuItem(playMenu, MI_PrevDrawing);
1338   addMenuItem(playMenu, MI_NextDrawing);
1339   addMenuItem(playMenu, MI_PrevKeyframe);
1340   addMenuItem(playMenu, MI_NextKeyframe);
1341   playMenu->addSeparator();
1342   addMenuItem(playMenu, MI_Link);
1343 
1344   // Menu' RENDER
1345   QMenu *renderMenu = addMenu(tr("Render"), fullMenuBar);
1346   addMenuItem(renderMenu, MI_PreviewSettings);
1347   addMenuItem(renderMenu, MI_Preview);
1348   // addMenuItem(renderMenu, MI_SavePreview);
1349   addMenuItem(renderMenu, MI_SavePreviewedFrames);
1350   renderMenu->addSeparator();
1351   addMenuItem(renderMenu, MI_OutputSettings);
1352   addMenuItem(renderMenu, MI_Render);
1353   renderMenu->addSeparator();
1354   addMenuItem(renderMenu, MI_FastRender);
1355 
1356   // Menu' VIEW
1357   QMenu *viewMenu = addMenu(tr("View"), fullMenuBar);
1358   addMenuItem(viewMenu, MI_ViewTable);
1359   addMenuItem(viewMenu, MI_ViewCamera);
1360   addMenuItem(viewMenu, MI_ViewColorcard);
1361   addMenuItem(viewMenu, MI_ViewBBox);
1362   viewMenu->addSeparator();
1363   addMenuItem(viewMenu, MI_SafeArea);
1364   addMenuItem(viewMenu, MI_FieldGuide);
1365   addMenuItem(viewMenu, MI_ViewRuler);
1366   addMenuItem(viewMenu, MI_ViewGuide);
1367   viewMenu->addSeparator();
1368   addMenuItem(viewMenu, MI_TCheck);
1369   addMenuItem(viewMenu, MI_ICheck);
1370   addMenuItem(viewMenu, MI_Ink1Check);
1371   addMenuItem(viewMenu, MI_PCheck);
1372   addMenuItem(viewMenu, MI_IOnly);
1373   addMenuItem(viewMenu, MI_BCheck);
1374   addMenuItem(viewMenu, MI_GCheck);
1375   addMenuItem(viewMenu, MI_ACheck);
1376   viewMenu->addSeparator();
1377   addMenuItem(viewMenu, MI_ShiftTrace);
1378   addMenuItem(viewMenu, MI_EditShift);
1379   addMenuItem(viewMenu, MI_NoShift);
1380   addMenuItem(viewMenu, MI_ResetShift);
1381   viewMenu->addSeparator();
1382   addMenuItem(viewMenu, MI_VectorGuidedDrawing);
1383   viewMenu->addSeparator();
1384   addMenuItem(viewMenu, MI_RasterizePli);
1385 
1386   // Menu' WINDOWS
1387   QMenu *windowsMenu   = addMenu(tr("Windows"), fullMenuBar);
1388   QMenu *workspaceMenu = windowsMenu->addMenu(tr("Workspace"));
1389   {
1390     addMenuItem(workspaceMenu, MI_DockingCheck);
1391     workspaceMenu->addSeparator();
1392     addMenuItem(workspaceMenu, MI_ResetRoomLayout);
1393   }
1394   addMenuItem(windowsMenu, MI_OpenCommandToolbar);
1395   addMenuItem(windowsMenu, MI_OpenToolbar);
1396   addMenuItem(windowsMenu, MI_OpenToolOptionBar);
1397   windowsMenu->addSeparator();
1398   addMenuItem(windowsMenu, MI_OpenStyleControl);
1399   addMenuItem(windowsMenu, MI_OpenPalette);
1400   addMenuItem(windowsMenu, MI_OpenStudioPalette);
1401   addMenuItem(windowsMenu, MI_OpenColorModel);
1402   windowsMenu->addSeparator();
1403   addMenuItem(windowsMenu, MI_OpenComboViewer);
1404   addMenuItem(windowsMenu, MI_OpenLevelView);
1405   addMenuItem(windowsMenu, MI_OpenFileViewer);
1406   windowsMenu->addSeparator();
1407   addMenuItem(windowsMenu, MI_OpenXshView);
1408   addMenuItem(windowsMenu, MI_OpenTimelineView);
1409   addMenuItem(windowsMenu, MI_OpenFunctionEditor);
1410   addMenuItem(windowsMenu, MI_OpenSchematic);
1411   addMenuItem(windowsMenu, MI_FxParamEditor);
1412   addMenuItem(windowsMenu, MI_OpenFilmStrip);
1413   windowsMenu->addSeparator();
1414   addMenuItem(windowsMenu, MI_OpenFileBrowser);
1415   addMenuItem(windowsMenu, MI_OpenFileBrowser2);
1416   windowsMenu->addSeparator();
1417   addMenuItem(windowsMenu, MI_OpenCleanupSettings);
1418   addMenuItem(windowsMenu, MI_OpenTasks);
1419   addMenuItem(windowsMenu, MI_OpenBatchServers);
1420   addMenuItem(windowsMenu, MI_OpenTMessage);
1421   addMenuItem(windowsMenu, MI_OpenHistoryPanel);
1422   addMenuItem(windowsMenu, MI_AudioRecording);
1423 #if defined(x64)
1424   addMenuItem(windowsMenu, MI_OpenStopMotionPanel);
1425 #endif
1426   addMenuItem(windowsMenu, MI_StartupPopup);
1427   addMenuItem(windowsMenu, MI_OpenGuidedDrawingControls);
1428   // windowsMenu->addSeparator();
1429   // addMenuItem(windowsMenu, MI_OpenExport);
1430   windowsMenu->addSeparator();
1431   addMenuItem(windowsMenu, MI_MaximizePanel);
1432   addMenuItem(windowsMenu, MI_FullScreenWindow);
1433 
1434   // Menu' HELP
1435   QMenu *helpMenu = addMenu(tr("Help"), fullMenuBar);
1436   addMenuItem(helpMenu, MI_OpenOnlineManual);
1437   addMenuItem(helpMenu, MI_OpenWhatsNew);
1438   addMenuItem(helpMenu, MI_OpenCommunityForum);
1439   helpMenu->addSeparator();
1440   addMenuItem(helpMenu, MI_OpenReportABug);
1441   helpMenu->addSeparator();
1442   addMenuItem(helpMenu, MI_About);
1443 
1444 // addMenuItem(fileMenu, MI_TestAnimation);
1445 // fileMenu->addSeparator();
1446 #ifndef NDEBUG
1447   addMenuItem(fileMenu, "MI_ReloadStyle");
1448 #endif
1449 
1450   return fullMenuBar;
1451 }
1452 
1453 //-----------------------------------------------------------------------------
1454 
addMenu(const QString & menuName,QMenuBar * menuBar)1455 QMenu *StackedMenuBar::addMenu(const QString &menuName, QMenuBar *menuBar) {
1456   QMenu *menu = new QMenu(menuName, menuBar);
1457   menuBar->addMenu(menu);
1458   return menu;
1459 }
1460 
1461 //-----------------------------------------------------------------------------
1462 
addMenuItem(QMenu * menu,const char * cmdId)1463 void StackedMenuBar::addMenuItem(QMenu *menu, const char *cmdId) {
1464   QAction *action = CommandManager::instance()->getAction(cmdId);
1465   if (!action) return;
1466   assert(action);  // check MainWindow::defineActions() if assert fails
1467   menu->addAction(action);
1468 }
1469 
1470 //-----------------------------------------------------------------------------
1471 
onIndexSwapped(int firstIndex,int secondIndex)1472 void StackedMenuBar::onIndexSwapped(int firstIndex, int secondIndex) {
1473   assert(firstIndex >= 0 && secondIndex >= 0);
1474   QWidget *menuBar = widget(firstIndex);
1475   removeWidget(menuBar);
1476   insertWidget(secondIndex, menuBar);
1477 }
1478 
1479 //-----------------------------------------------------------------------------
1480 
insertNewMenuBar()1481 void StackedMenuBar::insertNewMenuBar() {
1482   insertWidget(0, createFullMenuBar());
1483 }
1484 
1485 //-----------------------------------------------------------------------------
1486 
deleteMenuBar(int index)1487 void StackedMenuBar::deleteMenuBar(int index) {
1488   QWidget *menuBar = widget(index);
1489   removeWidget(menuBar);
1490   delete menuBar;
1491 }
1492 
1493 //-----------------------------------------------------------------------------
1494 
doCustomizeMenuBar(int index)1495 void StackedMenuBar::doCustomizeMenuBar(int index) {
1496   MainWindow *mainWin =
1497       dynamic_cast<MainWindow *>(TApp::instance()->getMainWindow());
1498   assert(mainWin);
1499   Room *room = mainWin->getRoom(index);
1500   if (!room) return;
1501 
1502   MenuBarPopup mbPopup(room);
1503 
1504   if (mbPopup.exec()) {
1505     /*- OKが押され、roomname_menubar.xmlが更新された状態 -*/
1506     /*- xmlファイルからメニューバーを作り直して格納 -*/
1507     std::string mbFileName = room->getPath().getName() + "_menubar.xml";
1508     TFilePath mbPath       = ToonzFolder::getMyRoomsDir() + mbFileName;
1509     if (!TFileStatus(mbPath).isReadable()) {
1510       DVGui::warning(tr("Cannot open menubar settings file %1")
1511                          .arg(QString::fromStdString(mbFileName)));
1512       return;
1513     }
1514     QMenuBar *newMenu = loadMenuBar(mbPath);
1515     if (!newMenu) {
1516       DVGui::warning(tr("Failed to create menubar"));
1517       return;
1518     }
1519 
1520     QWidget *oldMenu = widget(index);
1521     removeWidget(oldMenu);
1522     insertWidget(index, newMenu);
1523     delete oldMenu;
1524 
1525     setCurrentIndex(index);
1526   }
1527 }
1528 
1529 //=============================================================================
1530 // DvTopBar
1531 //-----------------------------------------------------------------------------
1532 
TopBar(QWidget * parent)1533 TopBar::TopBar(QWidget *parent) : QToolBar(parent) {
1534   setAllowedAreas(Qt::TopToolBarArea);
1535   setMovable(false);
1536   setFloatable(false);
1537   setObjectName("TopBar");
1538 
1539   m_containerFrame = new QFrame(this);
1540   m_roomTabBar     = new RoomTabWidget(this);
1541   m_stackedMenuBar = new StackedMenuBar(this);
1542   m_lockRoomCB     = new QCheckBox(this);
1543 
1544   m_containerFrame->setObjectName("TopBarTabContainer");
1545   m_roomTabBar->setObjectName("TopBarTab");
1546   m_roomTabBar->setDrawBase(false);
1547   m_lockRoomCB->setObjectName("EditToolLockButton");
1548   m_lockRoomCB->setToolTip(tr("Lock Rooms Tab"));
1549   m_lockRoomCB->setChecked(m_roomTabBar->isLocked());
1550 
1551   QHBoxLayout *mainLayout = new QHBoxLayout();
1552   mainLayout->setSpacing(0);
1553   mainLayout->setMargin(0);
1554   {
1555     QVBoxLayout *menuLayout = new QVBoxLayout();
1556     menuLayout->setSpacing(0);
1557     menuLayout->setMargin(0);
1558     {
1559       menuLayout->addStretch(1);
1560       menuLayout->addWidget(m_stackedMenuBar, 0);
1561       menuLayout->addStretch(1);
1562     }
1563     mainLayout->addLayout(menuLayout);
1564     mainLayout->addStretch(1);
1565     mainLayout->addWidget(m_roomTabBar, 0);
1566     mainLayout->addSpacing(2);
1567     mainLayout->addWidget(m_lockRoomCB, 0);
1568   }
1569   m_containerFrame->setLayout(mainLayout);
1570   addWidget(m_containerFrame);
1571 
1572   bool ret = true;
1573   ret      = ret && connect(m_roomTabBar, SIGNAL(currentChanged(int)),
1574                        m_stackedMenuBar, SLOT(setCurrentIndex(int)));
1575 
1576   ret = ret && connect(m_roomTabBar, SIGNAL(indexSwapped(int, int)),
1577                        m_stackedMenuBar, SLOT(onIndexSwapped(int, int)));
1578   ret = ret && connect(m_roomTabBar, SIGNAL(insertNewTabRoom()),
1579                        m_stackedMenuBar, SLOT(insertNewMenuBar()));
1580   ret = ret && connect(m_roomTabBar, SIGNAL(deleteTabRoom(int)),
1581                        m_stackedMenuBar, SLOT(deleteMenuBar(int)));
1582   ret = ret && connect(m_roomTabBar, SIGNAL(customizeMenuBar(int)),
1583                        m_stackedMenuBar, SLOT(doCustomizeMenuBar(int)));
1584   ret = ret && connect(m_lockRoomCB, SIGNAL(toggled(bool)), m_roomTabBar,
1585                        SLOT(setIsLocked(bool)));
1586   assert(ret);
1587 }
1588