1
0
Fork 0
* buggy implementation of 1179

* fixed
This commit is contained in:
Torusrxxx 2016-10-23 12:18:36 +00:00 committed by Duncan Ogilvie
parent bf5592abd0
commit c36299253c
6 changed files with 148 additions and 7 deletions

View File

@ -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);

View File

@ -63,6 +63,9 @@
<property name="text">
<string>&amp;OK</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item>

View File

@ -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;
}
}

View File

@ -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
{

View File

@ -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));
}

View File

@ -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;