parent
bf5592abd0
commit
c36299253c
|
@ -12,7 +12,21 @@ CustomizeMenuDialog::CustomizeMenuDialog(QWidget* parent) :
|
|||
for(const auto & i : Config()->NamedMenuBuilders)
|
||||
{
|
||||
QString viewName;
|
||||
const char* id = i.first->getId();
|
||||
MenuBuilder* builder = nullptr;
|
||||
QList<QAction*>* mainMenuList = nullptr;
|
||||
const char* id;
|
||||
if(std::get<1>(i) == 1)
|
||||
{
|
||||
mainMenuList = reinterpret_cast<QList<QAction*>*>(std::get<0>(i));
|
||||
id = reinterpret_cast<const char*>(mainMenuList->first());
|
||||
}
|
||||
else if(std::get<1>(i) == 0)
|
||||
{
|
||||
builder = reinterpret_cast<MenuBuilder*>(std::get<0>(i));
|
||||
id = builder->getId();
|
||||
}
|
||||
else
|
||||
continue;
|
||||
if(strcmp(id, "CPUDisassembly") == 0)
|
||||
viewName = tr("Disassembler");
|
||||
else if(strcmp(id, "CPUDump") == 0)
|
||||
|
@ -27,19 +41,35 @@ CustomizeMenuDialog::CustomizeMenuDialog(QWidget* parent) :
|
|||
viewName = tr("Graph");
|
||||
else if(strcmp(id, "CPUStack") == 0)
|
||||
viewName = tr("Stack");
|
||||
else if(strcmp(id, "File") == 0)
|
||||
viewName = tr("File");
|
||||
else if(strcmp(id, "Debug") == 0)
|
||||
viewName = tr("Debug");
|
||||
else if(strcmp(id, "Option") == 0)
|
||||
viewName = tr("Option");
|
||||
else if(strcmp(id, "Favourite") == 0)
|
||||
viewName = tr("Favourite");
|
||||
else if(strcmp(id, "Help") == 0)
|
||||
viewName = tr("Help");
|
||||
else if(strcmp(id, "View") == 0)
|
||||
viewName = tr("View");
|
||||
else
|
||||
continue;
|
||||
QTreeWidgetItem* parentItem = new QTreeWidgetItem(ui->treeWidget);
|
||||
parentItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
|
||||
parentItem->setText(0, viewName);
|
||||
for(size_t j = 0; j < i.second; j++)
|
||||
for(size_t j = 0; j < std::get<2>(i); j++)
|
||||
{
|
||||
QString text = i.first->getText(j);
|
||||
QString text;
|
||||
if(std::get<1>(i) == 0)
|
||||
text = builder->getText(j);
|
||||
else if(std::get<1>(i) == 1)
|
||||
text = mainMenuList->at(j + 1)->text();
|
||||
if(!text.isEmpty())
|
||||
{
|
||||
QTreeWidgetItem* menuItem = new QTreeWidgetItem(parentItem, 0);
|
||||
menuItem->setText(0, text.replace(QChar('&'), ""));
|
||||
QString configString = QString("Menu%1Hidden%2").arg(i.first->getId()).arg(j);
|
||||
QString configString = QString("Menu%1Hidden%2").arg(id).arg(j);
|
||||
menuItem->setCheckState(0, Config()->getBool("Gui", configString) ? Qt::Checked : Qt::Unchecked);
|
||||
menuItem->setData(0, Qt::UserRole, QVariant(configString));
|
||||
menuItem->setFlags(Qt::ItemIsSelectable | Qt::ItemNeverHasChildren | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
|
||||
|
|
|
@ -63,6 +63,9 @@
|
|||
<property name="text">
|
||||
<string>&OK</string>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
|
|
@ -338,6 +338,8 @@ MainWindow::MainWindow(QWidget* parent)
|
|||
// Setup language menu
|
||||
setupLanguagesMenu();
|
||||
|
||||
setupMenuCustomization();
|
||||
|
||||
// Set default setttings (when not set)
|
||||
SettingsDialog defaultSettings;
|
||||
lastException = 0;
|
||||
|
@ -1760,6 +1762,7 @@ void MainWindow::customizeMenu()
|
|||
customMenuDialog.setWindowTitle(tr("Customize Menus"));
|
||||
customMenuDialog.setWindowIcon(DIcon("analysis.png"));
|
||||
customMenuDialog.exec();
|
||||
onMenuCustomized();
|
||||
}
|
||||
|
||||
#include "../src/bridge/Utf8Ini.h"
|
||||
|
@ -1816,3 +1819,80 @@ void MainWindow::on_actionExportdatabase_triggered()
|
|||
return;
|
||||
DbgCmdExec(QString("dbsave \"%1\"").arg(QDir::toNativeSeparators(filename)).toUtf8().constData());
|
||||
}
|
||||
|
||||
static void setupMenuCustomizationHelper(QMenu* parentMenu, QList<QAction*> & stringList)
|
||||
{
|
||||
for(int i = 0; i < parentMenu->actions().size(); i++)
|
||||
{
|
||||
QAction* action = parentMenu->actions().at(i);
|
||||
stringList.append(action);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::setupMenuCustomization()
|
||||
{
|
||||
mFileMenuStrings.append(reinterpret_cast<QAction*>("File"));
|
||||
setupMenuCustomizationHelper(ui->menuFile, mFileMenuStrings);
|
||||
mDebugMenuStrings.append(reinterpret_cast<QAction*>("Debug"));
|
||||
setupMenuCustomizationHelper(ui->menuDebug, mDebugMenuStrings);
|
||||
mOptionsMenuStrings.append(reinterpret_cast<QAction*>("Option"));
|
||||
setupMenuCustomizationHelper(ui->menuOptions, mOptionsMenuStrings);
|
||||
mHelpMenuStrings.append(reinterpret_cast<QAction*>("Help"));
|
||||
setupMenuCustomizationHelper(ui->menuHelp, mHelpMenuStrings);
|
||||
mViewMenuStrings.append(reinterpret_cast<QAction*>("View"));
|
||||
setupMenuCustomizationHelper(ui->menuView, mViewMenuStrings);
|
||||
onMenuCustomized();
|
||||
Config()->registerMainMenuStringList(&mFileMenuStrings);
|
||||
Config()->registerMainMenuStringList(&mDebugMenuStrings);
|
||||
Config()->registerMainMenuStringList(&mOptionsMenuStrings);
|
||||
Config()->registerMainMenuStringList(&mHelpMenuStrings);
|
||||
Config()->registerMainMenuStringList(&mViewMenuStrings);
|
||||
}
|
||||
|
||||
void MainWindow::onMenuCustomized()
|
||||
{
|
||||
QList<QMenu*> menus;
|
||||
QList<QString> menuNativeNames;
|
||||
QList<QList<QAction*>*> menuTextStrings;
|
||||
menus << ui->menuFile << ui->menuDebug << ui->menuOptions << ui->menuHelp << ui->menuView;
|
||||
menuNativeNames << "File" << "Debug" << "Option" << "Help" << "View";
|
||||
menuTextStrings << &mFileMenuStrings << &mDebugMenuStrings << &mOptionsMenuStrings << &mHelpMenuStrings << &mViewMenuStrings;
|
||||
for(int i = 0; i < menus.size(); i++)
|
||||
{
|
||||
QMenu* currentMenu = menus[i];
|
||||
QMenu* moreCommands = nullptr;
|
||||
bool moreCommandsUsed = false;
|
||||
moreCommands = currentMenu->actions().last()->menu();
|
||||
if(moreCommands && moreCommands->title().compare(tr("More Commands")) == 0)
|
||||
{
|
||||
for(auto & j : moreCommands->actions())
|
||||
moreCommands->removeAction(j);
|
||||
}
|
||||
else
|
||||
{
|
||||
moreCommands = new QMenu(tr("More Commands"), currentMenu);
|
||||
}
|
||||
for(auto & j : currentMenu->actions())
|
||||
currentMenu->removeAction(j);
|
||||
for(int j = 0; j < menuTextStrings.at(i)->size() - 1; j++)
|
||||
{
|
||||
QAction* a = menuTextStrings.at(i)->at(j + 1);
|
||||
if(Config()->getBool("Gui", QString("Menu%1Hidden%2").arg(menuNativeNames[i]).arg(j)))
|
||||
{
|
||||
moreCommands->addAction(a);
|
||||
moreCommandsUsed = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
currentMenu->addAction(a);
|
||||
}
|
||||
}
|
||||
if(moreCommandsUsed)
|
||||
{
|
||||
currentMenu->addSeparator();
|
||||
currentMenu->addMenu(moreCommands);
|
||||
}
|
||||
else
|
||||
delete moreCommands;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -190,8 +190,19 @@ private:
|
|||
void updateMRUMenu();
|
||||
QString getMRUEntry(int index);
|
||||
void setupLanguagesMenu();
|
||||
void onMenuCustomized();
|
||||
void setupMenuCustomization();
|
||||
QAction* makeCommandAction(QAction* action, const QString & command);
|
||||
|
||||
//lists for menu customization
|
||||
QList<QAction*> mFileMenuStrings;
|
||||
QList<QAction*> mViewMenuStrings;
|
||||
QList<QAction*> mDebugMenuStrings;
|
||||
//"Plugins" menu cannot be customized for item hiding.
|
||||
//"Favourites" menu cannot be customized for item hiding.
|
||||
QList<QAction*> mOptionsMenuStrings;
|
||||
QList<QAction*> mHelpMenuStrings;
|
||||
|
||||
//menu api
|
||||
struct MenuEntryInfo
|
||||
{
|
||||
|
|
|
@ -221,6 +221,12 @@ Configuration::Configuration() : QObject(), noMoreMsgbox(false)
|
|||
insertMenuBuilderBools(&guiBool, "ThreadView", 50); //Thread
|
||||
insertMenuBuilderBools(&guiBool, "CPUStack", 50); //Stack
|
||||
insertMenuBuilderBools(&guiBool, "DisassemblerGraphView", 50); //Graph
|
||||
insertMenuBuilderBools(&guiBool, "File", 50); //Main Menu : File
|
||||
insertMenuBuilderBools(&guiBool, "Debug", 50); //Main Menu : Debug
|
||||
insertMenuBuilderBools(&guiBool, "Option", 50); //Main Menu : Option
|
||||
//"Favourites" menu cannot be customized for item hiding.
|
||||
insertMenuBuilderBools(&guiBool, "Help", 50); //Main Menu : Help
|
||||
insertMenuBuilderBools(&guiBool, "View", 50); //Main Menu : View
|
||||
defaultBools.insert("Gui", guiBool);
|
||||
|
||||
QMap<QString, duint> guiUint;
|
||||
|
@ -1005,8 +1011,17 @@ void Configuration::registerMenuBuilder(MenuBuilder* menu, size_t count)
|
|||
bool exists = false;
|
||||
const char* id = menu->getId();
|
||||
for(const auto & i : NamedMenuBuilders)
|
||||
if(strcmp(i.first->getId() , id) == 0)
|
||||
{
|
||||
MenuBuilder* builder = reinterpret_cast<MenuBuilder*>(std::get<0>(i));
|
||||
if(std::get<1>(i) == 0 && strcmp(builder->getId() , id) == 0)
|
||||
exists = true;
|
||||
}
|
||||
int fuck = count; // workaround for compiling
|
||||
if(!exists)
|
||||
NamedMenuBuilders.push_back(std::make_pair(menu, count));
|
||||
NamedMenuBuilders.append(std::make_tuple<void*, int, size_t>((void*)menu, 0, size_t(fuck)));
|
||||
}
|
||||
|
||||
void Configuration::registerMainMenuStringList(QList<QAction*>* menu)
|
||||
{
|
||||
NamedMenuBuilders.append(std::make_tuple<void*, int, size_t>((void*)menu, 1, menu->size() - 1));
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#define ConfigVScrollBarStyle() "QScrollBar:vertical{border:1px solid grey;background:#f1f1f1;width:10px}QScrollBar::handle:vertical{background:#aaa;min-height:20px;margin:1px}QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical{width:0;height:0}"
|
||||
|
||||
class MenuBuilder;
|
||||
class QAction;
|
||||
|
||||
class Configuration : public QObject
|
||||
{
|
||||
|
@ -55,6 +56,7 @@ public:
|
|||
void writeShortcuts();
|
||||
void emitShortcutsUpdated();
|
||||
void registerMenuBuilder(MenuBuilder* menu, size_t count);
|
||||
void registerMainMenuStringList(QList<QAction*>* menu);
|
||||
|
||||
const QColor getColor(const QString id) const;
|
||||
const bool getBool(const QString category, const QString id) const;
|
||||
|
@ -80,7 +82,7 @@ public:
|
|||
QMap<QString, Shortcut> Shortcuts;
|
||||
|
||||
//custom menu maps
|
||||
QList<std::pair<MenuBuilder*, size_t>> NamedMenuBuilders;
|
||||
QList<std::tuple<void*, int, size_t>> NamedMenuBuilders;
|
||||
|
||||
static Configuration* mPtr;
|
||||
|
||||
|
|
Loading…
Reference in New Issue