Vuo  2.0.0
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 {
24 public:
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((void *)(*it)->value));
102  menu->addAction(action);
103  action->setActionGroup(actionGroup);
104  }
105  }
106  }
107 
108 private:
109  json_object *value;
110  string title;
111  const QIcon *icon;
112  vector<VuoInputEditorMenuItem *> childItems;
113  bool isSeparator;
114  bool isEnabled;
115 };