1 
2 
3 #include "commandbar.h"
4 
5 // Tnz6 includes
6 #include "tapp.h"
7 #include "menubarcommandids.h"
8 #include "tsystem.h"
9 #include "commandbarpopup.h"
10 
11 // TnzQt includes
12 #include "toonzqt/menubarcommand.h"
13 #include "toonzqt/gutil.h"
14 
15 // TnzLib includes
16 #include "toonz/tscenehandle.h"
17 #include "toonz/toonzscene.h"
18 #include "toonz/childstack.h"
19 #include "toonz/toonzfolders.h"
20 // Qt includes
21 #include <QWidgetAction>
22 #include <QXmlStreamReader>
23 #include <QtDebug>
24 #include <QMenuBar>
25 #include <QContextMenuEvent>
26 
27 //=============================================================================
28 // Toolbar
29 //-----------------------------------------------------------------------------
30 
31 #if QT_VERSION >= 0x050500
CommandBar(QWidget * parent,Qt::WindowFlags flags,bool isCollapsible,bool isXsheetToolbar)32 CommandBar::CommandBar(QWidget *parent, Qt::WindowFlags flags,
33                        bool isCollapsible, bool isXsheetToolbar)
34 #else
35 CommandBar::CommandBar(QWidget *parent, Qt::WFlags flags)
36 #endif
37     : QToolBar(parent), m_isCollapsible(isCollapsible) {
38   setObjectName("cornerWidget");
39   setObjectName("CommandBar");
40   fillToolbar(this, isXsheetToolbar);
41   setIconSize(QSize(20, 20));
42 }
43 
44 //-----------------------------------------------------------------------------
45 
fillToolbar(CommandBar * toolbar,bool isXsheetToolbar)46 void CommandBar::fillToolbar(CommandBar *toolbar, bool isXsheetToolbar) {
47   toolbar->clear();
48   TFilePath personalPath;
49   if (isXsheetToolbar) {
50     personalPath =
51         ToonzFolder::getMyModuleDir() + TFilePath("xsheettoolbar.xml");
52   } else {
53     personalPath = ToonzFolder::getMyModuleDir() + TFilePath("commandbar.xml");
54   }
55   if (!TSystem::doesExistFileOrLevel(personalPath)) {
56     if (isXsheetToolbar) {
57       personalPath =
58           ToonzFolder::getTemplateModuleDir() + TFilePath("xsheettoolbar.xml");
59     } else {
60       personalPath =
61           ToonzFolder::getTemplateModuleDir() + TFilePath("commandbar.xml");
62     }
63   }
64   QFile file(toQString(personalPath));
65   if (!file.open(QFile::ReadOnly | QFile::Text)) {
66     qDebug() << "Cannot read file" << file.errorString();
67     buildDefaultToolbar(toolbar);
68     return;
69   }
70 
71   QXmlStreamReader reader(&file);
72 
73   if (reader.readNextStartElement()) {
74     if (reader.name() == "commandbar") {
75       while (reader.readNextStartElement()) {
76         if (reader.name() == "command") {
77           QString cmdName    = reader.readElementText();
78           std::string cmdStr = cmdName.toStdString();
79           QAction *action =
80               CommandManager::instance()->getAction(cmdStr.c_str());
81           if (action) toolbar->addAction(action);
82         } else if (reader.name() == "separator") {
83           toolbar->addSeparator();
84           reader.skipCurrentElement();
85         } else
86           reader.skipCurrentElement();
87       }
88     } else
89       reader.raiseError(QObject::tr("Incorrect file"));
90   } else {
91     reader.raiseError(QObject::tr("Cannot Read XML File"));
92   }
93 
94   if (reader.hasError()) {
95     buildDefaultToolbar(toolbar);
96     return;
97   }
98 }
99 
100 //-----------------------------------------------------------------------------
101 
buildDefaultToolbar(CommandBar * toolbar)102 void CommandBar::buildDefaultToolbar(CommandBar *toolbar) {
103   toolbar->clear();
104   TApp *app = TApp::instance();
105   {
106     QAction *newVectorLevel =
107         CommandManager::instance()->getAction("MI_NewVectorLevel");
108     toolbar->addAction(newVectorLevel);
109     QAction *newToonzRasterLevel =
110         CommandManager::instance()->getAction("MI_NewToonzRasterLevel");
111     toolbar->addAction(newToonzRasterLevel);
112     QAction *newRasterLevel =
113         CommandManager::instance()->getAction("MI_NewRasterLevel");
114     toolbar->addAction(newRasterLevel);
115     toolbar->addSeparator();
116     QAction *reframeOnes = CommandManager::instance()->getAction("MI_Reframe1");
117     toolbar->addAction(reframeOnes);
118     QAction *reframeTwos = CommandManager::instance()->getAction("MI_Reframe2");
119     toolbar->addAction(reframeTwos);
120     QAction *reframeThrees =
121         CommandManager::instance()->getAction("MI_Reframe3");
122     toolbar->addAction(reframeThrees);
123 
124     toolbar->addSeparator();
125 
126     QAction *repeat = CommandManager::instance()->getAction("MI_Dup");
127     toolbar->addAction(repeat);
128 
129     toolbar->addSeparator();
130 
131     QAction *collapse = CommandManager::instance()->getAction("MI_Collapse");
132     toolbar->addAction(collapse);
133     QAction *open = CommandManager::instance()->getAction("MI_OpenChild");
134     toolbar->addAction(open);
135     QAction *leave = CommandManager::instance()->getAction("MI_CloseChild");
136     toolbar->addAction(leave);
137     QAction *editInPlace =
138         CommandManager::instance()->getAction("MI_ToggleEditInPlace");
139     toolbar->addAction(editInPlace);
140   }
141 }
142 
143 //-----------------------------------------------------------------------------
144 
contextMenuEvent(QContextMenuEvent * event)145 void CommandBar::contextMenuEvent(QContextMenuEvent *event) {
146   QMenu *menu                  = new QMenu(this);
147   QAction *customizeCommandBar = menu->addAction(tr("Customize Command Bar"));
148   connect(customizeCommandBar, SIGNAL(triggered()),
149           SLOT(doCustomizeCommandBar()));
150   menu->exec(event->globalPos());
151 }
152 
153 //-----------------------------------------------------------------------------
154 
doCustomizeCommandBar()155 void CommandBar::doCustomizeCommandBar() {
156   CommandBarPopup *cbPopup = new CommandBarPopup();
157 
158   if (cbPopup->exec()) {
159     fillToolbar(this);
160   }
161   delete cbPopup;
162 }