Vuo  2.4.1
VuoInputEditorMenuItem.hh
Go to the documentation of this file.
1
10#pragma once
11
12#include <QtGui/QIcon>
13
14#pragma clang diagnostic push
15#pragma clang diagnostic ignored "-Wdocumentation"
16#include <json-c/json.h>
17#pragma clang diagnostic pop
18
23{
24public:
28 VuoInputEditorMenuItem(string title = "", json_object *value = NULL, const QIcon *icon = NULL, bool isEnabled = true)
29 {
30 this->value = value;
31 this->title = title;
32 this->icon = icon;
33 this->isSeparator = false;
34 this->isEnabled = isEnabled;
35 }
36
41 {
42 if (icon)
43 delete icon;
44 }
45
50 {
51 childItems.push_back(item);
52 }
53
57 void addSeparator(void)
58 {
60 sep->isSeparator = true;
61 childItems.push_back(sep);
62 }
63
67 static void buildMenu(QMenu *menu, QActionGroup *actionGroup, VuoInputEditorMenuItem *item)
68 {
69 for(std::vector<VuoInputEditorMenuItem *>::iterator it = item->childItems.begin(); it != item->childItems.end(); ++it)
70 {
71 QString title = QString::fromStdString((*it)->title);
72
73 // Qt uses '&' as a prefix for keyboard shortcuts.
74 // These menus never have shortcuts, so double the ampersands to ensure they're visible.
75 // Example: VuoTimeFormat
76 // https://doc.qt.io/qt-5/qmenubar.html#details
77 title.replace("&", "&&");
78
79 if ((*it)->childItems.size() > 0)
80 {
81 QMenu *submenu = new QMenu(menu);
82 submenu->setTitle(title);
83 if ((*it)->icon)
84 submenu->setIcon(*(*it)->icon);
85 menu->addMenu(submenu);
86 buildMenu(submenu, actionGroup, *it);
87 }
88 else
89 {
90 if ((*it)->isSeparator)
91 {
92 menu->addSeparator();
93 continue;
94 }
95
96 QAction *action = new QAction(title, menu);
97 if ((*it)->icon)
98 action->setIcon(*(*it)->icon);
99 action->setEnabled((*it)->isEnabled);
100 action->setCheckable((*it)->isEnabled);
101 action->setData(QVariant::fromValue((*it)->value));
102 menu->addAction(action);
103 action->setActionGroup(actionGroup);
104 }
105 }
106 }
107
108private:
109 json_object *value;
110 string title;
111 const QIcon *icon;
112 vector<VuoInputEditorMenuItem *> childItems;
113 bool isSeparator;
114 bool isEnabled;
115};