swift
menuaction.h
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #ifndef SWIFT_GUI_MENUS_MENUACTION_H
5 #define SWIFT_GUI_MENUS_MENUACTION_H
6 
7 #include <QIcon>
8 #include <QKeySequence>
9 #include <QList>
10 #include <QMap>
11 #include <QMultiMap>
12 #include <QString>
13 
14 #include "misc/slot.h"
15 
16 class QAction;
17 class QMenu;
18 class QObject;
19 
20 namespace swift::gui::menus
21 {
26  {
27  public:
29  CMenuAction(const QIcon &icon, const QString &title, const QString &path = pathNone(), bool separator = false);
30 
32  CMenuAction(const QString &path = pathNone(), bool separator = false);
33 
35  CMenuAction(QAction *action, const QString &path = pathNone(), bool separator = false);
36 
38  void setTitle(const QString &title) { m_title = title; }
39 
41  void setIcon(const QIcon &icon) { m_icon = icon; }
42 
44  void setPath(const QString &path) { m_path = path; }
45 
47  QAction *getQAction() const { return m_action; }
48 
50  bool isCheckableQAction() const;
51 
53  void setActionChecked(bool checked);
54 
56  bool isActionEnabled() const;
57 
59  void setActionEnabled(bool enabled);
60 
62  const QString &getPath() const { return m_path; }
63 
65  QString getLastPathPart() const;
66 
68  const QString &getTitle() const { return m_title; }
69 
71  bool hasTitle() const { return !m_title.isEmpty(); }
72 
74  bool isSubMenu() const { return m_isMenu; }
75 
77  bool isSeparator() const { return m_title == "_SEP_"; }
78 
80  void setSubMenu(bool menu) { m_isMenu = menu; }
81 
83  bool hasNoPathWithSeparator() const;
84 
86  bool hasNoPath() const;
87 
89  const QIcon &getIcon() const { return m_icon; }
90 
92  QPixmap getPixmap() const;
93 
95  bool hasIcon() const { return !m_icon.isNull(); }
96 
98  void setEnabled(bool enabled);
99 
101  operator QAction *() const { return this->m_action; }
102 
103  // ---- paths for menus ----
106 
108  static const QString &pathNone()
109  {
110  static const QString p("_NONE");
111  return p;
112  }
113 
115  static const QString &pathSeparator()
116  {
117  static const QString p("_SEPARATOR");
118  return p;
119  }
120 
122  static const QString &pathSimulator()
123  {
124  static const QString p("Custom.10.Simulator/Simulator");
125  return p;
126  }
127 
129  static const QString &pathSimulatorModelsReload()
130  {
131  static const QString p("Custom.10.Simulator/Simulator/Reload models");
132  return p;
133  }
134 
136  static const QString &pathSimulatorModelsClearCache()
137  {
138  static const QString p("Custom.10.Simulator/Simulator/Clear model caches");
139  return p;
140  }
141 
143  static const QString &pathModel()
144  {
145  static const QString p("Custom.11.Model");
146  return p;
147  }
148 
150  static const QString &pathModelSet()
151  {
152  static const QString p("Custom.11.Model/Model set");
153  return p;
154  }
155 
157  static const QString &pathModelSetNew()
158  {
159  static const QString p("Custom.11.Model/Model set/New set");
160  return p;
161  }
162 
164  static const QString &pathModelConsolidate()
165  {
166  static const QString p("Custom.11.Model/Consolidate");
167  return p;
168  }
169 
171  static const QString &pathModelStash()
172  {
173  static const QString p("Custom.11.Model/Stash/Stash");
174  return p;
175  }
176 
178  static const QString &pathModelStashEditor()
179  {
180  static const QString p("Custom.11.Model/Stash/Editor");
181  return p;
182  }
183 
186  static const QString &pathVPilot()
187  {
188  static const QString p("Custom.14.vPilot/vPilot");
189  return p;
190  }
191 
193  static const QString &pathLog()
194  {
195  static const QString p("Custom15.Log");
196  return p;
197  }
198 
200  static const QString &pathFont()
201  {
202  static const QString p("Custom20.Font");
203  return p;
204  }
205 
206  // ---- client ----
207 
209  static const QString &pathClientCom()
210  {
211  static const QString p("Client.ATC/COM");
212  return p;
213  }
214 
216  static const QString &pathClientFlightPlan()
217  {
218  static const QString p("Client.FlightPlan");
219  return p;
220  }
221 
223  static const QString &pathClientFollowInSim()
224  {
225  static const QString p("Client.FollowInSim");
226  return p;
227  }
228 
230  static const QString &pathClientSimulation()
231  {
232  static const QString p("ClientSimulation");
233  return p;
234  }
235 
237  static const QString &pathClientSimulationDisplay()
238  {
239  static const QString p("ClientSimulation.Display/Display");
240  return p;
241  }
242 
244  static const QString &pathClientSimulationRender()
245  {
246  static const QString p("ClientSimulation.Display/Render");
247  return p;
248  }
249 
251  static const QString &pathClientSimulationTransfer()
252  {
253  static const QString p("ClientSimulation.Transfer/Transfer");
254  return p;
255  }
256 
258  static const QString &pathClientModelSet()
259  {
260  static const QString p("Client.Model set");
261  return p;
262  }
263 
265  static const QString &pathClientNetwork()
266  {
267  static const QString p("ClientNetwork/Network");
268  return p;
269  }
270 
271  // ---- standard view paths --------
272 
274  static const QString &pathViewDatabase()
275  {
276  static const QString p("View.10.Database/Database");
277  return p;
278  }
279 
281  static const QString &pathViewAddRemove()
282  {
283  static const QString p("View.12.AddRemove");
284  return p;
285  }
286 
288  static const QString &pathViewSelection()
289  {
290  static const QString p("View.13.Selection/Selection");
291  return p;
292  }
293 
295  static const QString &pathViewOrder()
296  {
297  static const QString p("View.14.Order/Order");
298  return p;
299  }
300 
302  static const QString &pathViewResize()
303  {
304  static const QString p("View.15.Resize");
305  return p;
306  }
307 
309  static const QString &pathViewWordWrap()
310  {
311  static const QString p("View.16.WordWrap");
312  return p;
313  }
314 
316  static const QString &pathViewClearHighlighting()
317  {
318  static const QString p("View.17.ClearHighlight");
319  return p;
320  }
321 
323  static const QString &pathViewFilter()
324  {
325  static const QString p("View.18.Filter");
326  return p;
327  }
328 
330  static const QString &pathViewUpdates()
331  {
332  static const QString p("View.19.Updates");
333  return p;
334  }
335 
337  static const QString &pathViewLoadSave()
338  {
339  static const QString p("View.19.LoadSave");
340  return p;
341  }
342 
344  static const QString &pathViewCutPaste()
345  {
346  static const QString p("View.19.CutPaste");
347  return p;
348  }
349 
350  // ---- nested dock widgets ----
351 
353  static const QString &pathDockWidgetNested()
354  {
355  static const QString p("DockWidget.Nested");
356  return p;
357  }
359 
362  static const CMenuAction &subMenuDatabase();
363  static const CMenuAction &subMenuSimulator();
364  static const CMenuAction &subMenuConsolidateModels();
365  static const CMenuAction &subMenuCom();
366  static const CMenuAction &subMenuDisplayModels();
367  static const CMenuAction &subMenuRenderModels();
368  static const CMenuAction &subMenuDataTransfer();
370 
371  private:
372  QAction *m_action = nullptr;
373  QIcon m_icon;
374  QString m_title;
375  QString m_path;
376  bool m_separator = false;
377  bool m_isMenu = false;
378  };
379 
384  {
385  public:
388 
390  CMenuActions(const QList<CMenuAction> &actions);
391 
393  CMenuActions getActions() const { return m_actions.values(); }
394 
396  QList<QAction *> getQActions() const;
397 
399  CMenuActions getMenuActions(const QString &path) const;
400 
402  bool containsMenu(const QString &path) const;
403 
405  bool isEmpty() const { return m_actions.isEmpty(); }
406 
408  int size() const { return m_actions.size(); }
409 
411  CMenuAction addMenu(const CMenuAction &subdirAction);
412 
414  CMenuAction addMenu(const QString &title, const QString &path);
415 
417  void addSeparator(const QString &path);
418 
420  CMenuAction addMenu(const QIcon &icon, const QString &title, const QString &path);
421 
423  CMenuAction addAction(const CMenuAction &menuAction);
424 
426  CMenuActions addActions(const CMenuActions &actions);
427 
429  CMenuAction addAction(QAction *action, const QString &path);
430 
432  CMenuActions addActions(const QList<QAction *> &actions, const QString &path);
433 
435  CMenuAction addAction(QAction *action, const QString &text, const QString &path,
436  const swift::misc::CSlot<void()> &slot, const QKeySequence &shortcut = 0);
437 
439  CMenuAction addAction(QAction *action, const QString &text, const QString &path, QObject *actionOwner,
440  const swift::misc::CSlot<void()> &slot, const QKeySequence &shortcut = 0);
441 
443  CMenuAction addAction(QAction *action, const QIcon &icon, const QString &text, const QString &path,
444  const swift::misc::CSlot<void()> &slot, const QKeySequence &shortcut = 0);
445 
447  CMenuAction addAction(QAction *action, const QIcon &icon, const QString &text, const QString &path,
448  QObject *actionOwner, const swift::misc::CSlot<void()> &slot,
449  const QKeySequence &shortcut = 0);
450 
452  CMenuAction addAction(const QString &text, const QString &path, QObject *actionOwner,
453  const QKeySequence &shortcut = 0);
454 
456  CMenuAction addAction(const QIcon &actionIcon, const QString &text, const QString &path, QObject *actionOwner,
457  const QKeySequence &shortcut = 0);
458 
460  CMenuAction addAction(const QIcon &actionIcon, const QString &text, const QString &path, QObject *actionOwner,
461  const swift::misc::CSlot<void()> &slot, const QKeySequence &shortcut = 0);
462 
464  CMenuAction addAction(const QIcon &actionIcon, const QString &text, const QString &path);
465 
467  CMenuAction addAction(const QIcon &actionIcon, const QString &text, const QString &path,
468  const swift::misc::CSlot<void()> &slot, const QKeySequence &shortcut = 0);
469 
471  CMenuAction addAction(const QString &text, const QString &path, const swift::misc::CSlot<void()> &slot,
472  const QKeySequence &shortcut = 0);
473 
475  CMenuAction addAction(const QString &text, const QString &path, QObject *actionOwner,
476  const swift::misc::CSlot<void()> &slot, const QKeySequence &shortcut = 0);
477 
479  void toQMenu(QMenu &menu, bool separateGroups) const;
480 
482  QList<CMenuAction> toQList() const;
483 
485  CMenuAction first() const { return m_actions.first(); }
486 
488  CMenuAction last() const { return m_actions.last(); }
489 
491  operator QList<QAction *>() const;
492 
494  operator QList<CMenuAction>() const { return toQList(); }
495 
498 
501 
504 
507 
510 
513 
516 
519 
522 
525 
528 
531 
534 
536 
537  private:
538  QMultiMap<QString, CMenuAction> m_actions;
539 
541  void splitSubMenus(const QString &key, QList<CMenuAction> &actions, QList<CMenuAction> &menus) const;
542 
544  static int pathDepth(const QString &path);
545 
547  static QMenu *currentMenuForAction(QMenu &menu, const CMenuAction &menuAction, const QList<CMenuAction> &menus,
548  QMap<QString, QMenu *> &subMenus, const QString &key, int pd);
549 
551  static QString parentPath(const QString &cuurentPath);
552 
554  static QString keyRoot(const QString &key);
555 
557  static bool isSameKeyRoot(const QString &key1, const QString &key2);
558 
560  static QMenu *findUpwardsInMenus(const QString &key, const QMap<QString, QMenu *> &menus);
561  };
562 } // namespace swift::gui::menus
563 
564 #endif // SWIFT_GUI_MENUS_MENUACTION_H
Wraps a QAction with extra metadata to allow proper sorting for a QMenu.
Definition: menuaction.h:26
static const QString & pathModelSet()
Model set.
Definition: menuaction.h:150
bool hasNoPathWithSeparator() const
No path and separator wanted.
Definition: menuaction.cpp:56
void setSubMenu(bool menu)
Is menu?
Definition: menuaction.h:80
void setEnabled(bool enabled)
Set enabled / disabled (allows to gray out)
Definition: menuaction.cpp:66
QAction * getQAction() const
Action.
Definition: menuaction.h:47
static const QString & pathModelStashEditor()
Stash editor sub menu.
Definition: menuaction.h:178
void setIcon(const QIcon &icon)
Icon.
Definition: menuaction.h:41
static const QString & pathViewClearHighlighting()
View clear highlighting.
Definition: menuaction.h:316
static const QString & pathViewSelection()
View selection mode.
Definition: menuaction.h:288
static const QString & pathViewDatabase()
Database.
Definition: menuaction.h:274
static const QString & pathViewLoadSave()
View load/save.
Definition: menuaction.h:337
static const CMenuAction & subMenuRenderModels()
Predefined sub sub menus.
Definition: menuaction.cpp:98
static const CMenuAction & subMenuConsolidateModels()
Predefined sub sub menus.
Definition: menuaction.cpp:78
CMenuAction(const QIcon &icon, const QString &title, const QString &path=pathNone(), bool separator=false)
Constructor.
Definition: menuaction.cpp:23
static const CMenuAction & subMenuDataTransfer()
Predefined sub sub menus.
Definition: menuaction.cpp:105
static const QString & pathClientCom()
Client COM related.
Definition: menuaction.h:209
static const QString & pathClientFollowInSim()
Client follow in simulator.
Definition: menuaction.h:223
static const QString & pathViewResize()
View resizing.
Definition: menuaction.h:302
static const QString & pathViewWordWrap()
View word wrap.
Definition: menuaction.h:309
static const QString & pathViewFilter()
View filter.
Definition: menuaction.h:323
static const QString & pathClientNetwork()
Network data.
Definition: menuaction.h:265
static const QString & pathNone()
No key.
Definition: menuaction.h:108
static const QString & pathModelConsolidate()
Consolidate.
Definition: menuaction.h:164
const QString & getPath() const
Path.
Definition: menuaction.h:62
void setActionEnabled(bool enabled)
Enable action (allow gray out)
Definition: menuaction.cpp:51
bool hasIcon() const
Has icon?
Definition: menuaction.h:95
bool hasTitle() const
Has title?
Definition: menuaction.h:71
static const CMenuAction & subMenuSimulator()
Predefined sub sub menus.
Definition: menuaction.cpp:112
bool isSubMenu() const
Is menu?
Definition: menuaction.h:74
static const QString & pathClientModelSet()
Client model set related.
Definition: menuaction.h:258
static const QString & pathFont()
Font menus (font size etc.)
Definition: menuaction.h:200
const QIcon & getIcon() const
Icon.
Definition: menuaction.h:89
static const QString & pathViewOrder()
Order submenus.
Definition: menuaction.h:295
static const QString & pathViewCutPaste()
View cut and paste.
Definition: menuaction.h:344
static const QString & pathModel()
Model.
Definition: menuaction.h:143
QPixmap getPixmap() const
Icon as pixmap.
Definition: menuaction.cpp:60
const QString & getTitle() const
Title.
Definition: menuaction.h:68
static const QString & pathSimulatorModelsClearCache()
Simulator sub menu reload models.
Definition: menuaction.h:136
static const QString & pathClientSimulation()
Client simulation related.
Definition: menuaction.h:230
bool hasNoPath() const
No path?
Definition: menuaction.cpp:58
static const QString & pathVPilot()
vPilot data
Definition: menuaction.h:186
static const QString & pathSeparator()
Path converter into separator.
Definition: menuaction.h:115
static const CMenuAction & subMenuDatabase()
Predefined sub sub menus.
Definition: menuaction.cpp:72
void setTitle(const QString &title)
Title.
Definition: menuaction.h:38
static const QString & pathClientSimulationDisplay()
Client simulation/display related.
Definition: menuaction.h:237
static const CMenuAction & subMenuDisplayModels()
Predefined sub sub menus.
Definition: menuaction.cpp:91
static const QString & pathClientFlightPlan()
Client flight plan.
Definition: menuaction.h:216
static const QString & pathLog()
Log functionality.
Definition: menuaction.h:193
bool isCheckableQAction() const
Checkable QAction.
Definition: menuaction.cpp:34
bool isSeparator() const
Is separator?
Definition: menuaction.h:77
static const QString & pathSimulator()
Simulator sub menu.
Definition: menuaction.h:122
static const QString & pathViewUpdates()
View update.
Definition: menuaction.h:330
static const CMenuAction & subMenuCom()
Predefined sub sub menus.
Definition: menuaction.cpp:85
static const QString & pathDockWidgetNested()
Nested dock widget.
Definition: menuaction.h:353
void setActionChecked(bool checked)
Set a checkable action, QAction::setChecked.
Definition: menuaction.cpp:40
bool isActionEnabled() const
Enabled action?
Definition: menuaction.cpp:45
static const QString & pathViewAddRemove()
Select add remove.
Definition: menuaction.h:281
static const QString & pathModelStash()
Stash sub menu.
Definition: menuaction.h:171
static const QString & pathModelSetNew()
Model set, new set.
Definition: menuaction.h:157
static const QString & pathClientSimulationTransfer()
Client simulation/display related.
Definition: menuaction.h:251
static const QString & pathClientSimulationRender()
Client simulation/display related.
Definition: menuaction.h:244
QString getLastPathPart() const
Last part of the path, e.g. "Foo/Bar" -> "Bar".
Definition: menuaction.cpp:118
static const QString & pathSimulatorModelsReload()
Simulator sub menu reload models.
Definition: menuaction.h:129
void setPath(const QString &path)
Path.
Definition: menuaction.h:44
Bunch of CMenuAction objects.
Definition: menuaction.h:384
CMenuAction addMenuSimulator()
Simulator menu.
Definition: menuaction.cpp:428
QList< QAction * > getQActions() const
QActions.
Definition: menuaction.cpp:152
CMenuActions getActions() const
All actions.
Definition: menuaction.h:393
CMenuAction addMenuConsolidateModels()
Consolidate models menu.
Definition: menuaction.cpp:455
void addSeparator(const QString &path)
Add a separator.
Definition: menuaction.cpp:187
int size() const
Elements.
Definition: menuaction.h:408
CMenuAction addMenuDisplayModels()
Add display model menu.
Definition: menuaction.cpp:473
CMenuAction addMenuStash()
Stash menu.
Definition: menuaction.cpp:434
CMenuActions getMenuActions(const QString &path) const
All menu actions.
Definition: menuaction.cpp:159
CMenuAction last() const
Last action.
Definition: menuaction.h:488
CMenuActions addActions(const CMenuActions &actions)
Add menu actions, returns last valid QAction.
Definition: menuaction.cpp:217
CMenuAction addMenuCom()
Add COM model menu.
Definition: menuaction.cpp:467
CMenuAction addMenuModelConverterX()
Add ModelConverterX menu (optional)
void toQMenu(QMenu &menu, bool separateGroups) const
Insert the sorted actions to the menu.
Definition: menuaction.cpp:326
CMenuAction addAction(const CMenuAction &menuAction)
Add menu action.
Definition: menuaction.cpp:210
CMenuAction addMenuStashEditor()
Stash menu.
Definition: menuaction.cpp:443
CMenuAction addMenuViewOrder()
View order menu.
Definition: menuaction.cpp:422
CMenuAction addMenu(const CMenuAction &subdirAction)
Add a sub menu.
Definition: menuaction.cpp:177
CMenuAction addMenuModelSet()
Model set menu.
Definition: menuaction.cpp:461
bool isEmpty() const
Empty?
Definition: menuaction.h:405
CMenuAction addMenuDatabase()
Database menu.
Definition: menuaction.cpp:449
QList< CMenuAction > toQList() const
To QList.
Definition: menuaction.cpp:409
CMenuAction addMenuRenderModels()
Add render model menu.
Definition: menuaction.cpp:479
bool containsMenu(const QString &path) const
Menu already available?
Definition: menuaction.cpp:171
CMenuAction first() const
First action.
Definition: menuaction.h:485
CMenuAction addMenuDataTransfer()
Add data transfer menu.
Definition: menuaction.cpp:485
Callable wrapper for a member function with function signature F.
Definition: slot.h:62