History

added checkable menus and sub menus

ZappoMan committed 12 years ago

Commit 374b1291 parent a3d0c203 files · +238 −72Browse files

Showing the changes to interface/src/Menu.cpp (1 of 3 files). Show all

Unified · Split

interface/src/Menu.cpp+180−43
@@ -1286,63 +1286,162 @@ QString Menu::replaceLastOccurrence(QChar search, QChar replace, QString string) · 1285 unmodified lines
12861286 return string;
12871287 }
12881288
1289−void Menu::addTopMenu(const QString& menu) {
1290− addMenu(menu);
1289+QAction* Menu::getActionFromName(const QString& menuName, QMenu* menu) {
1290+ QList<QAction*> menuActions;
1291+ if (menu) {
1292+ menuActions = menu->actions();
1293+ } else {
1294+ menuActions = actions();
1295+ }
1296+
1297+ foreach (QAction* menuAction, menuActions) {
1298+ if (menuName == menuAction->text()) {
1299+ return menuAction;
1300+ }
1301+ }
1302+ return NULL;
1303+}
12911304
1292− QMenuBar::repaint();
1305+QMenu* Menu::getSubMenuFromName(const QString& menuName, QMenu* menu) {
1306+ QAction* action = getActionFromName(menuName, menu);
1307+ if (action) {
1308+ return action->menu();
1309+ }
1310+ return NULL;
1311+}
1312+
1313+QMenu* Menu::getMenuParent(const QString& menuName, QString& finalMenuPart) {
1314+ QStringList menuTree = menuName.split(">");
1315+ QMenu* parent = NULL;
1316+ QMenu* menu = NULL;
1317+ foreach (QString menuTreePart, menuTree) {
1318+ parent = menu;
1319+ finalMenuPart = menuTreePart.trimmed();
1320+ menu = getSubMenuFromName(finalMenuPart, parent);
1321+ if (!menu) {
1322+ break;
1323+ }
1324+ }
1325+ return parent;
1326+}
1327+
1328+QMenu* Menu::getMenu(const QString& menuName) {
1329+ QStringList menuTree = menuName.split(">");
1330+ QMenu* parent = NULL;
1331+ QMenu* menu = NULL;
1332+ int item = 0;
1333+ foreach (QString menuTreePart, menuTree) {
1334+ menu = getSubMenuFromName(menuTreePart.trimmed(), parent);
1335+ if (!menu) {
1336+ break;
1337+ }
1338+ parent = menu;
1339+ item++;
1340+ }
1341+ return menu;
1342+}
12931343
1294− QList<QAction*> topLevelMenus = actions();
1295− foreach (QAction* topLevelMenuAction, topLevelMenus) {
1296− qDebug() << "menu:" << topLevelMenuAction->text();
1344+QAction* Menu::getMenuAction(const QString& menuName) {
1345+ QStringList menuTree = menuName.split(">");
1346+ QMenu* parent = NULL;
1347+ QAction* action = NULL;
1348+ foreach (QString menuTreePart, menuTree) {
1349+ action = getActionFromName(menuTreePart.trimmed(), parent);
1350+ if (!action) {
1351+ break;
1352+ }
1353+ parent = action->menu();
12971354 }
1355+ return action;
12981356 }
12991357
1300−void Menu::removeTopMenu(const QString& menu) {
1301− QList<QAction*> topLevelMenus = actions();
1302− foreach (QAction* topLevelMenuAction, topLevelMenus) {
1303− if (topLevelMenuAction->text() == menu) {
1304− QMenuBar::removeAction(topLevelMenuAction);
1358+QMenu* Menu::addMenu(const QString& menuName) {
1359+ QStringList menuTree = menuName.split(">");
1360+ QMenu* addTo = NULL;
1361+ QMenu* menu = NULL;
1362+ foreach (QString menuTreePart, menuTree) {
1363+ menu = getSubMenuFromName(menuTreePart.trimmed(), addTo);
1364+ if (!menu) {
1365+ if (!addTo) {
1366+ menu = QMenuBar::addMenu(menuTreePart.trimmed());
1367+ } else {
1368+ menu = addTo->addMenu(menuTreePart.trimmed());
1369+ }
13051370 }
1371+ addTo = menu;
13061372 }
1373+
1374+ QMenuBar::repaint();
1375+ return menu;
13071376 }
13081377
1309−void Menu::addMenuItem(const QString& menu, const QString& menuitem) {
1310− KeyEvent noKey;
1311− addMenuItem(menu, menuitem, noKey);
1378+void Menu::removeMenu(const QString& menuName) {
1379+ QAction* action = getMenuAction(menuName);
1380+
1381+ // only proceed if the menu actually exists
1382+ if (action) {
1383+ QString finalMenuPart;
1384+ QMenu* parent = getMenuParent(menuName, finalMenuPart);
1385+
1386+ if (parent) {
1387+ removeAction(parent, finalMenuPart);
1388+ } else {
1389+ QMenuBar::removeAction(action);
1390+ }
1391+
1392+ QMenuBar::repaint();
1393+ }
13121394 }
13131395
1314−void Menu::addMenuItem(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey) {
1315− QKeySequence shortcut(shortcutKey);
1316− addMenuItem(menu, menuitem, shortcut);
1396+void Menu::addMenuItem(const QString& menuName, const QString& menuitem, bool checkable, bool checked) {
1397+ QMenu* menuObj = getMenu(menuName);
1398+ if (menuObj) {
1399+ if (checkable) {
1400+ addCheckableActionToQMenuAndActionHash(menuObj, menuitem, 0, checked,
1401+ MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
1402+ } else {
1403+ addActionToQMenuAndActionHash(menuObj, menuitem, 0,
1404+ MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
1405+ }
1406+ QMenuBar::repaint();
1407+ }
13171408 }
13181409
1319−void Menu::addMenuItem(const QString& menu, const QString& menuitem, const QString& shortcutKey) {
1410+void Menu::addMenuItem(const QString& menuName, const QString& menuitem, const KeyEvent& shortcutKey, bool checkable, bool checked) {
13201411 QKeySequence shortcut(shortcutKey);
1321− addMenuItem(menu, menuitem, shortcut);
1412+ addMenuItem(menuName, menuitem, shortcut, checkable, checked);
13221413 }
13231414
1324−void Menu::addMenuItem(const QString& menu, const QString& menuitem, const QKeySequence& shortcutKey) {
1325− QList<QAction*> topLevelMenus = actions();
1326− foreach (QAction* topLevelMenuAction, topLevelMenus) {
1327− if (topLevelMenuAction->text() == menu) {
1328− // add the menu item here...
1329− QMenu* menuObj = topLevelMenuAction->menu();
1330− if (menuObj) {
1331− QShortcut* shortcut = new QShortcut(shortcutKey, this);
1332− QAction* menuItemAction = addActionToQMenuAndActionHash(menuObj, menuitem, shortcutKey,
1333− MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
1415+void Menu::addMenuItem(const QString& menuName, const QString& menuitem, const QString& shortcutKey, bool checkable, bool checked) {
1416+ QKeySequence shortcut(shortcutKey);
1417+ addMenuItem(menuName, menuitem, shortcut, checkable, checked);
1418+}
13341419
1335− connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger()));
1336− }
1420+void Menu::addMenuItem(const QString& menuName, const QString& menuitem, const QKeySequence& shortcutKey, bool checkable, bool checked) {
1421+ QMenu* menuObj = getMenu(menuName);
1422+ if (menuObj) {
1423+ QShortcut* shortcut = new QShortcut(shortcutKey, this);
1424+ QAction* menuItemAction;
1425+ if (checkable) {
1426+ menuItemAction = addCheckableActionToQMenuAndActionHash(menuObj, menuitem, shortcutKey, checked,
1427+ MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
1428+ } else {
1429+ menuItemAction = addActionToQMenuAndActionHash(menuObj, menuitem, shortcutKey,
1430+ MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
13371431 }
1432+ connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger()));
1433+ QMenuBar::repaint();
13381434 }
1339− QMenuBar::repaint();
13401435 }
13411436
13421437 void Menu::removeMenuItem(const QString& menu, const QString& menuitem) {
1438+ QMenu* menuObj = getMenu(menu);
1439+ if (menuObj) {
1440+ removeAction(menuObj, menuitem);
1441+ }
1442+ QMenuBar::repaint();
13431443 };
13441444
1345−
13461445 MenuScriptingInterface* MenuScriptingInterface::_instance = NULL;
13471446 QMutex MenuScriptingInterface::_instanceMutex;
13481447
@@ -1373,34 +1472,64 @@ void MenuScriptingInterface::menuItemTriggered() { · 24 unmodified lines
13731472 }
13741473 }
13751474
1376−
1377−
1378−void MenuScriptingInterface::addTopMenu(const QString& menu) {
1379− QMetaObject::invokeMethod(Menu::getInstance(), "addTopMenu", Q_ARG(const QString&, menu));
1475+void MenuScriptingInterface::addMenu(const QString& menu) {
1476+ QMetaObject::invokeMethod(Menu::getInstance(), "addMenu", Q_ARG(const QString&, menu));
13801477 }
13811478
1382−void MenuScriptingInterface::removeTopMenu(const QString& menu) {
1383− QMetaObject::invokeMethod(Menu::getInstance(), "removeTopMenu", Q_ARG(const QString&, menu));
1479+void MenuScriptingInterface::removeMenu(const QString& menu) {
1480+ QMetaObject::invokeMethod(Menu::getInstance(), "removeMenu", Q_ARG(const QString&, menu));
13841481 }
13851482
13861483 void MenuScriptingInterface::addMenuItemWithKeyEvent(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey) {
1387− QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
1484+ QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
13881485 Q_ARG(const QString&, menu),
13891486 Q_ARG(const QString&, menuitem),
1390− Q_ARG(const KeyEvent&, shortcutKey));
1487+ Q_ARG(const KeyEvent&, shortcutKey),
1488+ Q_ARG(bool, false),
1489+ Q_ARG(bool, false));
13911490 }
13921491
13931492 void MenuScriptingInterface::addMenuItem(const QString& menu, const QString& menuitem, const QString& shortcutKey) {
13941493 QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
13951494 Q_ARG(const QString&, menu),
13961495 Q_ARG(const QString&, menuitem),
1397− Q_ARG(const QString&, shortcutKey));
1496+ Q_ARG(const QString&, shortcutKey),
1497+ Q_ARG(bool, false),
1498+ Q_ARG(bool, false));
13981499 }
13991500
14001501 void MenuScriptingInterface::addMenuItem(const QString& menu, const QString& menuitem) {
14011502 QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
14021503 Q_ARG(const QString&, menu),
1403− Q_ARG(const QString&, menuitem));
1504+ Q_ARG(const QString&, menuitem),
1505+ Q_ARG(bool, false),
1506+ Q_ARG(bool, false));
1507+}
1508+
1509+void MenuScriptingInterface::addCheckableMenuItemWithKeyEvent(const QString& menu, const QString& menuitem, const KeyEvent& shortcutKey, bool checked) {
1510+ QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
1511+ Q_ARG(const QString&, menu),
1512+ Q_ARG(const QString&, menuitem),
1513+ Q_ARG(const KeyEvent&, shortcutKey),
1514+ Q_ARG(bool, true),
1515+ Q_ARG(bool, checked));
1516+}
1517+
1518+void MenuScriptingInterface::addCheckableMenuItem(const QString& menu, const QString& menuitem, const QString& shortcutKey, bool checked) {
1519+ QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
1520+ Q_ARG(const QString&, menu),
1521+ Q_ARG(const QString&, menuitem),
1522+ Q_ARG(const QString&, shortcutKey),
1523+ Q_ARG(bool, true),
1524+ Q_ARG(bool, checked));
1525+}
1526+
1527+void MenuScriptingInterface::addCheckableMenuItem(const QString& menu, const QString& menuitem, bool checked) {
1528+ QMetaObject::invokeMethod(Menu::getInstance(), "addMenuItem",
1529+ Q_ARG(const QString&, menu),
1530+ Q_ARG(const QString&, menuitem),
1531+ Q_ARG(bool, true),
1532+ Q_ARG(bool, checked));
14041533 }
14051534
14061535 void MenuScriptingInterface::removeMenuItem(const QString& menu, const QString& menuitem) {
@@ -1408,3 +1537,11 @@ void MenuScriptingInterface::removeMenuItem(const QString& menu, const QString& · 1 unmodified line
14081537 Q_ARG(const QString&, menu),
14091538 Q_ARG(const QString&, menuitem));
14101539 };
1540+
1541+bool MenuScriptingInterface::isOptionChecked(const QString& menuOption) {
1542+ return Menu::getInstance()->isOptionChecked(menuOption);
1543+}
1544+
1545+void MenuScriptingInterface::setIsOptionChecked(const QString& menuOption, bool isChecked) {
1546+ return Menu::getInstance()->setIsOptionChecked(menuOption, isChecked);
1547+}