create custom menubar from xml file

This commit is contained in:
shun_iwasawa 2016-04-13 11:45:28 +09:00
parent b05ca51266
commit 7a9c88552b
3 changed files with 124 additions and 4 deletions

View file

@ -518,7 +518,9 @@ void MainWindow::readSettings(const QString &argumentLayoutFileName)
m_stackedWidget->addWidget(room);
roomTabWidget->addTab(room->getName());
stackedMenuBar->createMenuBarByName(room->getName());
/*- ここでMenuBarファイルをロードする -*/
std::string mbFileName = roomPath.getName() + "_menubar.xml";
stackedMenuBar->loadAndAddMenubar(ToonzFolder::getModuleFile(mbFileName));
//room->setDockOptions(QMainWindow::DockOptions(
// (QMainWindow::AnimatedDocks | QMainWindow::AllowNestedDocks) & ~QMainWindow::AllowTabbedDocks));
@ -529,6 +531,7 @@ void MainWindow::readSettings(const QString &argumentLayoutFileName)
//Read the flipbook history
FlipBookPool::instance()->load(ToonzFolder::getMyModuleDir() + TFilePath("fliphistory.ini"));
/*- レイアウト設定ファイルが見つからなかった場合、初期Roomの生成 -*/
//Se leggendo i settings non ho inizializzato le stanze lo faccio ora.
// Puo' accadere se si buttano i file di inizializzazione.
if (rooms.empty()) {
@ -567,11 +570,12 @@ void MainWindow::readSettings(const QString &argumentLayoutFileName)
m_stackedWidget->addWidget(browserRoom);
rooms.push_back(browserRoom);
stackedMenuBar->createMenuBarByName(browserRoom->getName());
makePrivate(rooms);
writeRoomList(rooms);
}
/*- If the layout files were loaded from template, then save them as private ones -*/
makePrivate(rooms);
writeRoomList(rooms);
// Imposto la stanza corrente
fp = ToonzFolder::getModuleFile(currentRoomFileName);
Tifstream is(fp);

View file

@ -11,6 +11,7 @@
#include "toonzqt/tselectionhandle.h"
#include "toonzqt/dvdialog.h"
#include "toonzqt/menubarcommand.h"
#include "toonzqt/gutil.h"
// TnzLib includes
#include "toonz/toonzscene.h"
@ -38,6 +39,8 @@
#include <QShortcut>
#include <QDesktopServices>
#include <QCheckBox>
#include <QtDebug>
#include <QXmlStreamReader>
void UrlOpener::open()
{
@ -236,6 +239,116 @@ void StackedMenuBar::createMenuBarByName(const QString &roomName)
addWidget(createFullMenuBar());
#endif
}
//---------------------------------------------------------------------------------
void StackedMenuBar::loadAndAddMenubar(const TFilePath & fp)
{
std::wcout << fp.getWideString() << std::endl;
QFile file(toQString(fp));
if (!file.open(QFile::ReadOnly | QFile::Text)){
qDebug() << "Cannot read file" << file.errorString();
addWidget(createFullMenuBar());
return;
}
QXmlStreamReader reader(&file);
QMenuBar* menuBar = new QMenuBar(this);
if (reader.readNextStartElement())
{
if (reader.name() == "menubar")
{
while (reader.readNextStartElement())
{
if (reader.name() == "menu")
{
QString title = reader.attributes().value("title").toString();
/*- Menu title will be translated if the title is registered in translation file -*/
QMenu* menu = new QMenu(tr(title.toStdString().c_str()));
if (readMenuRecursive(reader, menu))
menuBar->addMenu(menu);
else
{
reader.raiseError(tr("Failed to load menu %1").arg(title));
delete menu;
}
}
else if (reader.name() == "command")
{
QString cmdName = reader.readElementText();
QAction *action = CommandManager::instance()->getAction(cmdName.toStdString().c_str());
if (action)
menuBar->addAction(action);
else
reader.raiseError(tr("Failed to add command %1").arg(cmdName));
}
else
reader.skipCurrentElement();
}
}
else
reader.raiseError(QObject::tr("Incorrect file"));
}
if (reader.hasError())
{
delete menuBar;
addWidget(createFullMenuBar());
}
else
addWidget(menuBar);
}
//---------------------------------------------------------------------------------
bool StackedMenuBar::readMenuRecursive( QXmlStreamReader& reader, QMenu* menu)
{
while (reader.readNextStartElement())
{
if (reader.name() == "menu")
{
QString title = reader.attributes().value("title").toString();
QMenu* subMenu = new QMenu(tr(title.toStdString().c_str()));
if (readMenuRecursive(reader, subMenu))
menu->addMenu(subMenu);
else
{
reader.raiseError(tr("Failed to load menu %1").arg(title));
delete subMenu;
return false;
}
}
else if (reader.name() == "command")
{
QString cmdName = reader.readElementText();
addMenuItem(menu, cmdName.toStdString().c_str());
}
else if (reader.name() == "command_debug")
{
#ifndef NDEBUG
QString cmdName = reader.readElementText();
addMenuItem(menu, cmdName.toStdString().c_str());
#else
reader.skipCurrentElement();
#endif
}
else if (reader.name() == "separator")
{
menu->addSeparator();
reader.skipCurrentElement();
}
else
reader.skipCurrentElement();
}
return !reader.hasError();
}
//---------------------------------------------------------------------------------

View file

@ -24,6 +24,7 @@ class QPainterEvent;
class QHBoxLayout;
class SubXsheetRoomTabContainer;
class QCheckBox;
class QXmlStreamReader;
//-----------------------------------------------------------------------------
@ -154,6 +155,8 @@ public:
~StackedMenuBar(){};
void createMenuBarByName(const QString &roomName);
void loadAndAddMenubar(const TFilePath & fp);
bool readMenuRecursive( QXmlStreamReader&, QMenu*);
QMenu *addMenu(const QString &, QMenuBar *);
void addMenuItem(QMenu *, const char *);