History

implement support for menu item positioning

ZappoMan committed 12 years ago

Commit 00480991 parent 0b6e81b8 files · +111 −61Browse files

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

Unified · Split

interface/src/Menu.cpp+45−13
@@ -690,13 +690,28 @@ QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu, · 689 unmodified lines
690690 const char* member,
691691 QAction::MenuRole role,
692692 int menuItemLocation) {
693− QAction* action;
693+ QAction* action = NULL;
694+ QAction* actionBefore = NULL;
695+
696+ if (menuItemLocation >= 0 && destinationMenu->actions().size() > menuItemLocation) {
697+ actionBefore = destinationMenu->actions()[menuItemLocation];
698+ }
694699
695− if (receiver && member) {
696− action = destinationMenu->addAction(actionName, receiver, member, shortcut);
700+ if (!actionBefore) {
701+ if (receiver && member) {
702+ action = destinationMenu->addAction(actionName, receiver, member, shortcut);
703+ } else {
704+ action = destinationMenu->addAction(actionName);
705+ action->setShortcut(shortcut);
706+ }
697707 } else {
698− action = destinationMenu->addAction(actionName);
708+ action = new QAction(actionName, destinationMenu);
699709 action->setShortcut(shortcut);
710+ destinationMenu->insertAction(actionBefore, action);
711+
712+ if (receiver && member) {
713+ connect(action, SIGNAL(triggered()), receiver, member);
714+ }
700715 }
701716 action->setMenuRole(role);
702717
@@ -1366,6 +1381,17 @@ QAction* Menu::getMenuAction(const QString& menuName) { · 663 unmodified lines
13661381 return action;
13671382 }
13681383
1384+int Menu::findPositionOfMenuItem(QMenu* menu, const QString& searchMenuItem) {
1385+ int position = 0;
1386+ foreach(QAction* action, menu->actions()) {
1387+ if (action->text() == searchMenuItem) {
1388+ return position;
1389+ }
1390+ position++;
1391+ }
1392+ return UNSPECIFIED_POSITION; // not found
1393+}
1394+
13691395 QMenu* Menu::addMenu(const QString& menuName) {
13701396 QStringList menuTree = menuName.split(">");
13711397 QMenu* addTo = NULL;
@@ -1416,24 +1442,30 @@ void Menu::addMenuItem(const MenuItemProperties& properties) { · 44 unmodified lines
14161442 if (menuObj) {
14171443 QShortcut* shortcut = NULL;
14181444 if (!properties.shortcutKeySequence.isEmpty()) {
1419− shortcut = new QShortcut(properties.shortcutKey, this);
1445+ shortcut = new QShortcut(properties.shortcutKeySequence, this);
14201446 }
14211447
1422− /**
1423− // test insert in middle of menu...
1424− QAction* physics = getMenuAction("Edit>Physics");
1425− QAction* testHack = new QAction("test", editMenu);
1426− editMenu->insertAction(gravity, testHack);
1427− **/
1448+ // check for positioning requests
1449+ int requestedPosition = properties.position;
1450+ if (requestedPosition == UNSPECIFIED_POSITION && !properties.beforeItem.isEmpty()) {
1451+ requestedPosition = findPositionOfMenuItem(menuObj, properties.beforeItem);
1452+ }
1453+ if (requestedPosition == UNSPECIFIED_POSITION && !properties.afterItem.isEmpty()) {
1454+ int afterPosition = findPositionOfMenuItem(menuObj, properties.afterItem);
1455+ if (afterPosition != UNSPECIFIED_POSITION) {
1456+ requestedPosition = afterPosition + 1;
1457+ }
1458+ }
14281459
14291460 QAction* menuItemAction;
14301461 if (properties.isCheckable) {
14311462 menuItemAction = addCheckableActionToQMenuAndActionHash(menuObj, properties.menuItemName,
14321463 properties.shortcutKeySequence, properties.isChecked,
1433− MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
1464+ MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()), requestedPosition);
14341465 } else {
14351466 menuItemAction = addActionToQMenuAndActionHash(menuObj, properties.menuItemName, properties.shortcutKeySequence,
1436− MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()));
1467+ MenuScriptingInterface::getInstance(), SLOT(menuItemTriggered()),
1468+ QAction::NoRole, requestedPosition);
14371469 }
14381470 if (shortcut) {
14391471 connect(shortcut, SIGNAL(activated()), menuItemAction, SLOT(trigger()));