]> SALOME platform Git repositories - modules/shaper.git/blob - src/XGUI/XGUI_ContextMenuMgr.cpp
Salome HOME
Key_Delete shortcut for both delete action - 1. workshop, 2. partset module.
[modules/shaper.git] / src / XGUI / XGUI_ContextMenuMgr.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
2
3 #include "XGUI_ContextMenuMgr.h"
4 #include "XGUI_Workshop.h"
5 #include "XGUI_ObjectsBrowser.h"
6 #include "XGUI_SelectionMgr.h"
7 #include "XGUI_Displayer.h"
8 #include "XGUI_ViewerProxy.h"
9 #include "XGUI_Selection.h"
10 #include "XGUI_SalomeConnector.h"
11
12 #include <AppElements_MainWindow.h>
13
14 //#include "PartSetPlugin_Part.h"
15
16 #include <ModelAPI_Data.h>
17 #include <ModelAPI_AttributeDocRef.h>
18 #include <ModelAPI_Object.h>
19 #include <ModelAPI_ResultPart.h>
20 #include <ModelAPI_Session.h>
21 #include <ModelAPI_ResultGroup.h>
22
23 #include <ModuleBase_IModule.h>
24
25 #include <QAction>
26 #include <QContextMenuEvent>
27 #include <QMenu>
28 #include <QMdiArea>
29
30 XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent)
31     : QObject(theParent),
32       myWorkshop(theParent)
33 {
34 }
35
36 XGUI_ContextMenuMgr::~XGUI_ContextMenuMgr()
37 {
38 }
39
40 void XGUI_ContextMenuMgr::createActions()
41 {
42   QAction* aAction = new QAction(QIcon(":pictures/edit.png"), tr("Edit..."), this);
43   addAction("EDIT_CMD", aAction);
44
45   aAction = new QAction(QIcon(":pictures/activate.png"), tr("Activate"), this);
46   addAction("ACTIVATE_PART_CMD", aAction);
47
48   aAction = new QAction(QIcon(":pictures/assembly.png"), tr("Deactivate"), this);
49   addAction("DEACTIVATE_PART_CMD", aAction);
50
51   aAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
52   QMainWindow* aDesktop = myWorkshop->mainWindow();
53   if (!aDesktop)
54     aDesktop = myWorkshop->salomeConnector()->desktop();
55   aDesktop->addAction(aAction);
56   addAction("DELETE_CMD", aAction);
57   aAction->setShortcut(Qt::Key_Delete);
58   aAction->setShortcutContext(Qt::ApplicationShortcut);
59
60   aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show"), this);
61   addAction("SHOW_CMD", aAction);
62
63   aAction = new QAction(QIcon(":pictures/eye_pencil.png"), tr("Show only"), this);
64   addAction("SHOW_ONLY_CMD", aAction);
65
66   aAction = new QAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide"), this);
67   addAction("HIDE_CMD", aAction);
68
69   aAction = new QAction(QIcon(":pictures/eye_pencil_closed.png"), tr("Hide all"), this);
70   addAction("HIDEALL_CMD", aAction);
71
72   aAction = new QAction(QIcon(":pictures/shading.png"), tr("Shading"), this);
73   addAction("SHADING_CMD", aAction);
74
75   aAction = new QAction(QIcon(":pictures/wireframe.png"), tr("Wireframe"), this);
76   addAction("WIREFRAME_CMD", aAction);
77 }
78
79 void XGUI_ContextMenuMgr::addAction(const QString& theId, QAction* theAction)
80 {
81   if (myActions.contains(theId))
82     qCritical("A command with Id = '%s' already defined!", qPrintable(theId));
83   theAction->setData(theId);
84   connect(theAction, SIGNAL(triggered(bool)), this, SLOT(onAction(bool)));
85   myActions[theId] = theAction;
86 }
87
88 QAction* XGUI_ContextMenuMgr::action(const QString& theId) const
89 {
90   if (myActions.contains(theId))
91     return myActions[theId];
92   return 0;
93 }
94
95 QStringList XGUI_ContextMenuMgr::actionIds() const
96 {
97   return myActions.keys();
98 }
99
100 void XGUI_ContextMenuMgr::onAction(bool isChecked)
101 {
102   QAction* aAction = static_cast<QAction*>(sender());
103   emit actionTriggered(aAction->data().toString(), isChecked);
104 }
105
106 void XGUI_ContextMenuMgr::updateCommandsStatus()
107 {
108 }
109
110 void XGUI_ContextMenuMgr::onContextMenuRequest(QContextMenuEvent* theEvent)
111 {
112   QMenu* aMenu = 0;
113   if (sender() == myWorkshop->objectBrowser())
114     aMenu = objectBrowserMenu();
115   else if (sender() == myWorkshop->viewer()) {
116     aMenu = viewerMenu();
117   }
118
119   if (aMenu && (aMenu->actions().size() > 0)) {
120     aMenu->exec(theEvent->globalPos());
121     delete aMenu;
122   }
123 }
124
125 QMenu* XGUI_ContextMenuMgr::objectBrowserMenu() const
126 {
127   QMenu* aMenu = new QMenu();
128   XGUI_SelectionMgr* aSelMgr = myWorkshop->selector();
129   QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects();
130   int aSelected = aObjects.size();
131   if (aSelected > 0) {
132     SessionPtr aMgr = ModelAPI_Session::get();
133     XGUI_Displayer* aDisplayer = myWorkshop->displayer();
134     bool hasResult = false;
135     bool hasFeature = false;
136     foreach(ObjectPtr aObj, aObjects)
137     {
138       FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObj);
139       ResultPtr aResult = std::dynamic_pointer_cast<ModelAPI_Result>(aObj);
140       if (aResult)
141         hasResult = true;
142       if (aFeature)
143         hasFeature = true;
144       if (hasFeature && hasResult) // && hasGroup)
145         break;
146     }
147     //Process Feature
148     if (aSelected == 1) {
149       ObjectPtr aObject = aObjects.first();
150       if (aObject) {
151         ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
152         if (aPart) {
153           if (aMgr->activeDocument() == aPart->partDoc())
154             aMenu->addAction(action("DEACTIVATE_PART_CMD"));
155           else
156             aMenu->addAction(action("ACTIVATE_PART_CMD"));
157         } else if (hasFeature && aObject->document() == aMgr->activeDocument()) {
158           aMenu->addAction(action("EDIT_CMD"));
159         } else {
160           if (aDisplayer->isVisible(aObject)) {
161             if (aDisplayer->canBeShaded(aObject)) {
162               if (aDisplayer->displayMode(aObject) == XGUI_Displayer::Shading)
163                 aMenu->addAction(action("WIREFRAME_CMD"));
164               else
165                 aMenu->addAction(action("SHADING_CMD"));
166             }
167             aMenu->addSeparator();
168             aMenu->addAction(action("HIDE_CMD"));
169           } else {
170             aMenu->addAction(action("SHOW_CMD"));
171           }
172           aMenu->addAction(action("SHOW_ONLY_CMD"));
173         }
174       } else {  // If feature is 0 the it means that selected root object (document)
175         if (aMgr->activeDocument() != aMgr->moduleDocument())
176           aMenu->addAction(action("ACTIVATE_PART_CMD"));
177       }
178     } else {
179       if (hasResult) {
180         aMenu->addAction(action("SHOW_CMD"));
181         aMenu->addAction(action("HIDE_CMD"));
182         aMenu->addAction(action("SHOW_ONLY_CMD"));
183         aMenu->addSeparator();
184         aMenu->addAction(action("SHADING_CMD"));
185         aMenu->addAction(action("WIREFRAME_CMD"));
186       }
187     }
188     if (hasFeature)
189       aMenu->addAction(action("DELETE_CMD"));
190   }
191   aMenu->addSeparator();
192   aMenu->addActions(myWorkshop->objectBrowser()->actions());
193
194   ModuleBase_IModule* aModule = myWorkshop->module();
195   if (aModule)
196     aModule->addObjectBrowserItems(aMenu);
197
198   if (aMenu->actions().size() > 0) {
199     return aMenu;
200   }
201   delete aMenu;
202   return 0;
203 }
204
205 QMenu* XGUI_ContextMenuMgr::viewerMenu() const
206 {
207   QMenu* aMenu = new QMenu();
208   addViewerItems(aMenu);
209   if (aMenu->actions().size() > 0) {
210     return aMenu;
211   }
212   delete aMenu;
213   return 0;
214 }
215
216 void XGUI_ContextMenuMgr::addViewerItems(QMenu* theMenu) const
217 {
218   XGUI_SelectionMgr* aSelMgr = myWorkshop->selector();
219   QObjectPtrList aObjects = aSelMgr->selection()->selectedObjects();
220   if (aObjects.size() > 0) {
221     //if (aObjects.size() == 1)
222     //  theMenu->addAction(action("EDIT_CMD"));
223     bool isVisible = false;
224     bool isShading = false;
225     bool canBeShaded = false;
226     foreach(ObjectPtr aObject, aObjects)
227     {
228       ResultPtr aRes = std::dynamic_pointer_cast<ModelAPI_Result>(aObject);
229       if (aRes && myWorkshop->displayer()->isVisible(aRes)) {
230         isVisible = true;
231         canBeShaded = myWorkshop->displayer()->canBeShaded(aObject);
232         isShading = (myWorkshop->displayer()->displayMode(aObject) == XGUI_Displayer::Shading);      
233         break;
234       }
235     }
236     if (isVisible) {
237       if (canBeShaded) {
238         if (isShading)
239           theMenu->addAction(action("WIREFRAME_CMD"));
240         else
241           theMenu->addAction(action("SHADING_CMD"));
242       }
243       theMenu->addSeparator();
244       theMenu->addAction(action("SHOW_ONLY_CMD"));
245       theMenu->addAction(action("HIDE_CMD"));
246     } else
247       theMenu->addAction(action("SHOW_CMD"));
248     //theMenu->addAction(action("DELETE_CMD"));
249   }
250   if (myWorkshop->displayer()->objectsCount() > 0)
251     theMenu->addAction(action("HIDEALL_CMD"));
252   if (!myWorkshop->isSalomeMode()) {
253     theMenu->addSeparator();
254     QMdiArea* aMDI = myWorkshop->mainWindow()->mdiArea();
255     if (aMDI->actions().size() > 0) {
256       QMenu* aSubMenu = theMenu->addMenu(tr("Windows"));
257       aSubMenu->addActions(aMDI->actions());
258     }
259   }
260
261   ModuleBase_IModule* aModule = myWorkshop->module();
262   if (aModule)
263     aModule->addViewerItems(theMenu);
264 }
265
266 void XGUI_ContextMenuMgr::connectObjectBrowser() const
267 {
268   connect(myWorkshop->objectBrowser(), SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
269           SLOT(onContextMenuRequest(QContextMenuEvent*)));
270 }
271
272 void XGUI_ContextMenuMgr::connectViewer() const
273 {
274   connect(myWorkshop->viewer(), SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
275           SLOT(onContextMenuRequest(QContextMenuEvent*)));
276 }
277