##// END OF EJS Templates
Implements visit of graph...
Alexandre Leroux -
r213:946a2291304e
parent child
Show More
@@ -1,137 +1,167
1 1 #include "Visualization/operations/GenerateVariableMenuOperation.h"
2 2
3 3 #include "Visualization/VisualizationGraphWidget.h"
4 4 #include "Visualization/VisualizationTabWidget.h"
5 5 #include "Visualization/VisualizationZoneWidget.h"
6 6
7 7 #include <Variable/Variable.h>
8 8
9 9 #include <QMenu>
10 10 #include <QStack>
11 11
12 12 Q_LOGGING_CATEGORY(LOG_GenerateVariableMenuOperation, "GenerateVariableMenuOperation")
13 13
14 14 namespace {
15 15
16 16 /// Helper assigned to build the hierarchical menu associated with a variable
17 17 struct MenuBuilder {
18 18 /**
19 19 * Ctor
20 20 * @param menu the parent menu
21 21 */
22 22 explicit MenuBuilder(QMenu *menu)
23 23 {
24 24 if (menu) {
25 25 m_Menus.push(menu);
26 26 }
27 27 else {
28 28 qCCritical(LOG_GenerateVariableMenuOperation())
29 29 << QObject::tr("No parent menu has been defined");
30 30 }
31 31 }
32 32
33 33 /**
34 * Adds action to the current menu
35 * @param actionName the name of the action
36 * @param actionFunction the function that will be executed when the action is triggered
37 */
38 template <typename ActionFun>
39 void addAction(const QString &actionName, ActionFun actionFunction)
40 {
41 if (auto currMenu = currentMenu()) {
42 currMenu->addAction(actionName, actionFunction);
43 }
44 else {
45 qCCritical(LOG_GenerateVariableMenuOperation())
46 << QObject::tr("No current menu to attach the action");
47 }
48 }
49
50 /**
34 51 * Adds a new menu to the current menu
35 52 * @param name the name of the menu
36 53 */
37 54 void addMenu(const QString &name)
38 55 {
39 56 if (auto currMenu = currentMenu()) {
40 57 m_Menus.push(currMenu->addMenu(name));
41 58 }
42 59 else {
43 60 qCCritical(LOG_GenerateVariableMenuOperation())
44 61 << QObject::tr("No current menu to attach the new menu");
45 62 }
46 63 }
47 64
48 65 /// Closes the current menu
49 66 void closeMenu()
50 67 {
51 68 if (!m_Menus.isEmpty()) {
52 69 m_Menus.pop();
53 70 }
54 71 }
55 72
56 73 /// Gets the current menu (i.e. the top menu of the stack)
57 74 QMenu *currentMenu() const { return !m_Menus.isEmpty() ? m_Menus.top() : nullptr; }
58 75
59 76 /// Stack of all menus currently opened
60 77 QStack<QMenu *> m_Menus{};
61 78 };
62 79
63 80 } // namespace
64 81
65 82 struct GenerateVariableMenuOperation::GenerateVariableMenuOperationPrivate {
66 83 explicit GenerateVariableMenuOperationPrivate(QMenu *menu, std::shared_ptr<Variable> variable)
67 84 : m_Variable{variable}, m_MenuBuilder{menu}
68 85 {
69 86 }
70 87
71 88 void visitNodeEnter(const IVisualizationWidget &container)
72 89 {
73 90 // Opens a new menu associated to the node
74 91 m_MenuBuilder.addMenu(container.name());
75 92 }
76 93
77 94 template <typename ActionFun>
78 95 void visitNodeLeave()
79 96 {
80 97 // Closes the menu associated to the node
81 98 m_MenuBuilder.closeMenu();
82 99 }
83 100
101 template <typename ActionFun>
102 void visitLeaf(const IVisualizationWidget &container, const QString &actionName,
103 ActionFun actionFunction)
104 {
105 if (m_Variable && container.canDrop(*m_Variable)) {
106 m_MenuBuilder.addAction(actionName, actionFunction);
107 }
108 }
109
84 110 std::shared_ptr<Variable> m_Variable;
85 111 MenuBuilder m_MenuBuilder;
86 112 };
87 113
88 114 GenerateVariableMenuOperation::GenerateVariableMenuOperation(QMenu *menu,
89 115 std::shared_ptr<Variable> variable)
90 116 : impl{spimpl::make_unique_impl<GenerateVariableMenuOperationPrivate>(menu, variable)}
91 117 {
92 118 }
93 119
94 120 void GenerateVariableMenuOperation::visitEnter(VisualizationWidget *widget)
95 121 {
96 122 // VisualizationWidget is not intended to accommodate a variable
97 123 Q_UNUSED(widget)
98 124 }
99 125
100 126 void GenerateVariableMenuOperation::visitLeave(VisualizationWidget *widget)
101 127 {
102 128 // VisualizationWidget is not intended to accommodate a variable
103 129 Q_UNUSED(widget)
104 130 }
105 131
106 132 void GenerateVariableMenuOperation::visitEnter(VisualizationTabWidget *tabWidget)
107 133 {
108 134 if (tabWidget) {
109 135 impl->visitNodeEnter(*tabWidget);
110 136 }
111 137 }
112 138
113 139 void GenerateVariableMenuOperation::visitLeave(VisualizationTabWidget *tabWidget)
114 140 {
115 141 if (tabWidget) {
116 142 impl->visitNodeLeave();
117 143 }
118 144 }
119 145
120 146 void GenerateVariableMenuOperation::visitEnter(VisualizationZoneWidget *zoneWidget)
121 147 {
122 148 if (zoneWidget) {
123 149 impl->visitNodeEnter(*zoneWidget);
124 150 }
125 151 }
126 152
127 153 void GenerateVariableMenuOperation::visitLeave(VisualizationZoneWidget *zoneWidget)
128 154 {
129 155 if (zoneWidget) {
130 156 impl->visitNodeLeave();
131 157 }
132 158 }
133 159
134 160 void GenerateVariableMenuOperation::visit(VisualizationGraphWidget *graphWidget)
135 161 {
136 /// @todo ALX
162 if (graphWidget) {
163 impl->visitLeaf(
164 *graphWidget, QObject::tr("Open in %1").arg(graphWidget->name()),
165 [ var = impl->m_Variable, graphWidget ]() { graphWidget->addVariable(var); });
166 }
137 167 }
General Comments 0
You need to be logged in to leave comments. Login now