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