Salome HOME
Issue #394 Undo-ing a Sketch element
[modules/shaper.git] / src / XGUI / XGUI_ViewerProxy.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
2
3 #include "XGUI_ViewerProxy.h"
4 #include "XGUI_Workshop.h"
5 #include "XGUI_SalomeConnector.h"
6 #include "XGUI_Displayer.h"
7
8 #include <AppElements_MainWindow.h>
9 #include <AppElements_ViewPort.h>
10 #include <AppElements_ViewWindow.h>
11 #include <AppElements_Viewer.h>
12
13 #include <QEvent>
14
15 XGUI_ViewerProxy::XGUI_ViewerProxy(XGUI_Workshop* theParent)
16     : ModuleBase_IViewer(theParent),
17       myWorkshop(theParent)
18 {
19 }
20
21 Handle(AIS_InteractiveContext) XGUI_ViewerProxy::AISContext() const
22 {
23   if (myWorkshop->isSalomeMode()) {
24     return myWorkshop->salomeConnector()->viewer()->AISContext();
25   } else {
26     return myWorkshop->mainWindow()->viewer()->AISContext();
27   }
28 }
29
30 Handle(V3d_Viewer) XGUI_ViewerProxy::v3dViewer() const
31 {
32   if (myWorkshop->isSalomeMode()) {
33     return myWorkshop->salomeConnector()->viewer()->v3dViewer();
34   } else {
35     return myWorkshop->mainWindow()->viewer()->v3dViewer();
36   }
37 }
38
39 Handle(V3d_View) XGUI_ViewerProxy::activeView() const
40 {
41   if (myWorkshop->isSalomeMode()) {
42     return myWorkshop->salomeConnector()->viewer()->activeView();
43   } else {
44     AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
45     return (aViewer->activeViewWindow()) ? aViewer->activeViewWindow()->viewPort()->getView() :
46     Handle(V3d_View)();
47   }
48 }
49
50 void XGUI_ViewerProxy::setViewProjection(double theX, double theY, double theZ)
51 {
52   Handle(V3d_View) aView3d = activeView();
53   if (!aView3d.IsNull()) {
54     aView3d->SetProj(theX, theY, theZ);
55     aView3d->FitAll(0.01, true);
56     aView3d->SetZSize(0.);
57   }
58 }
59
60 void XGUI_ViewerProxy::fitAll()
61 {
62   if (myWorkshop->isSalomeMode()) {
63     myWorkshop->salomeConnector()->viewer()->fitAll();
64   } else {
65     AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
66     if (aViewer->activeViewWindow())
67       aViewer->activeViewWindow()->viewPort()->fitAll();
68   }
69 }
70
71 void XGUI_ViewerProxy::connectToViewer()
72 {
73   if (myWorkshop->isSalomeMode()) {
74     ModuleBase_IViewer* aViewer = myWorkshop->salomeConnector()->viewer();
75
76     connect(aViewer, SIGNAL(lastViewClosed()), this, SIGNAL(lastViewClosed()));
77     connect(aViewer, SIGNAL(tryCloseView(ModuleBase_IViewWindow*)), 
78       this, SIGNAL(tryCloseView(ModuleBase_IViewWindow*)));
79
80     connect(aViewer, SIGNAL(deleteView(ModuleBase_IViewWindow*)), 
81       this, SIGNAL(deleteView(ModuleBase_IViewWindow*)));
82
83     connect(aViewer, SIGNAL(viewCreated(ModuleBase_IViewWindow*)), 
84       this, SIGNAL(viewCreated(ModuleBase_IViewWindow*)));
85
86     connect(aViewer, SIGNAL(activated(ModuleBase_IViewWindow*)), 
87       this, SIGNAL(activated(ModuleBase_IViewWindow*)));
88
89     connect(aViewer, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)), 
90       this, SIGNAL(mousePress(ModuleBase_IViewWindow*, QMouseEvent*)));
91
92     connect(aViewer, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)), 
93       this, SIGNAL(mouseRelease(ModuleBase_IViewWindow*, QMouseEvent*)));
94
95     connect(aViewer, SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)), this,
96             SIGNAL(mouseDoubleClick(ModuleBase_IViewWindow*, QMouseEvent*)));
97
98     connect(aViewer, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)), 
99       this, SIGNAL(mouseMove(ModuleBase_IViewWindow*, QMouseEvent*)));
100
101     connect(aViewer, SIGNAL(keyPress(ModuleBase_IViewWindow*, QKeyEvent*)), 
102       this, SIGNAL(keyPress(ModuleBase_IViewWindow*, QKeyEvent*)));
103
104     connect(aViewer, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)), 
105       this, SIGNAL(keyRelease(ModuleBase_IViewWindow*, QKeyEvent*)));
106
107     connect(aViewer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
108     connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
109             SIGNAL(contextMenuRequested(QContextMenuEvent*)));
110   } else {
111     AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
112
113     connect(aViewer, SIGNAL(lastViewClosed()), this, SIGNAL(lastViewClosed()));
114
115     connect(aViewer, SIGNAL(tryCloseView(AppElements_ViewWindow*)), 
116             this, SLOT(onTryCloseView(AppElements_ViewWindow*)));
117
118     connect(aViewer, SIGNAL(deleteView(AppElements_ViewWindow*)), 
119             this, SLOT(onDeleteView(AppElements_ViewWindow*)));
120
121     connect(aViewer, SIGNAL(viewCreated(AppElements_ViewWindow*)), 
122             this, SLOT(onViewCreated(AppElements_ViewWindow*)));
123
124     connect(aViewer, SIGNAL(activated(AppElements_ViewWindow*)), 
125             this, SLOT(onActivated(AppElements_ViewWindow*)));
126
127     connect(aViewer, SIGNAL(mousePress(AppElements_ViewWindow*, QMouseEvent*)), this,
128             SLOT(onMousePress(AppElements_ViewWindow*, QMouseEvent*)));
129
130     connect(aViewer, SIGNAL(mouseRelease(AppElements_ViewWindow*, QMouseEvent*)), this,
131             SLOT(onMouseRelease(AppElements_ViewWindow*, QMouseEvent*)));
132
133     connect(aViewer, SIGNAL(mouseDoubleClick(AppElements_ViewWindow*, QMouseEvent*)), this,
134             SLOT(onMouseDoubleClick(AppElements_ViewWindow*, QMouseEvent*)));
135
136     connect(aViewer, SIGNAL(mouseMove(AppElements_ViewWindow*, QMouseEvent*)), this,
137             SLOT(onMouseMove(AppElements_ViewWindow*, QMouseEvent*)));
138
139     connect(aViewer, SIGNAL(keyPress(AppElements_ViewWindow*, QKeyEvent*)), this,
140             SLOT(onKeyPress(AppElements_ViewWindow*, QKeyEvent*)));
141
142     connect(aViewer, SIGNAL(keyRelease(AppElements_ViewWindow*, QKeyEvent*)), this,
143             SLOT(onKeyRelease(AppElements_ViewWindow*, QKeyEvent*)));
144
145     connect(aViewer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
146     connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
147             SIGNAL(contextMenuRequested(QContextMenuEvent*)));
148   }
149 }
150
151 bool XGUI_ViewerProxy::eventFilter(QObject *theObject, QEvent *theEvent)
152 {
153   AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
154   bool isViewPort = theObject == aViewer->activeViewWindow()->viewPort();
155   if (isViewPort)
156   {
157     if (theEvent->type() == QEvent::Enter) {
158       emit enterViewPort();
159     }
160     else if (theEvent->type() == QEvent::Leave) {
161       emit leaveViewPort();
162     }
163   }
164   return ModuleBase_IViewer::eventFilter(theObject, theEvent);
165 }
166
167 void XGUI_ViewerProxy::onTryCloseView(AppElements_ViewWindow* theWnd)
168 {
169   emit tryCloseView(theWnd);
170 }
171
172 void XGUI_ViewerProxy::onDeleteView(AppElements_ViewWindow* theWnd)
173 {
174   emit deleteView(theWnd);
175 }
176
177 void XGUI_ViewerProxy::onViewCreated(AppElements_ViewWindow* theWnd)
178 {
179   theWnd->viewPort()->installEventFilter(this);
180
181   emit viewCreated(theWnd);
182 }
183
184 void XGUI_ViewerProxy::onActivated(AppElements_ViewWindow* theWnd)
185 {
186   emit activated(theWnd);
187 }
188
189 void XGUI_ViewerProxy::onMousePress(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
190 {
191   emit mousePress(theWnd, theEvent);
192 }
193
194 void XGUI_ViewerProxy::onMouseRelease(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
195 {
196   emit mouseRelease(theWnd, theEvent);
197 }
198
199 void XGUI_ViewerProxy::onMouseDoubleClick(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
200 {
201   emit mouseDoubleClick(theWnd, theEvent);
202 }
203
204 void XGUI_ViewerProxy::onMouseMove(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
205 {
206   emit mouseMove(theWnd, theEvent);
207 }
208
209 void XGUI_ViewerProxy::onKeyPress(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent)
210 {
211   emit keyPress(theWnd, theEvent);
212 }
213
214 void XGUI_ViewerProxy::onKeyRelease(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent)
215 {
216   emit keyRelease(theWnd, theEvent);
217 }
218
219
220
221 //***************************************
222 void XGUI_ViewerProxy::enableSelection(bool isEnabled)
223 {
224   if (myWorkshop->isSalomeMode()) {
225     myWorkshop->salomeConnector()->viewer()->enableSelection(isEnabled);
226   } else {
227     myWorkshop->mainWindow()->viewer()->setSelectionEnabled(isEnabled);
228   }
229 }
230
231 //***************************************
232 bool XGUI_ViewerProxy::isSelectionEnabled() const
233 {
234   if (myWorkshop->isSalomeMode()) {
235     return myWorkshop->salomeConnector()->viewer()->isSelectionEnabled();
236   } else {
237     return myWorkshop->mainWindow()->viewer()->isSelectionEnabled();
238   }
239 }
240
241 //***************************************
242 void XGUI_ViewerProxy::enableMultiselection(bool isEnable)
243 {
244   if (myWorkshop->isSalomeMode()) {
245     myWorkshop->salomeConnector()->viewer()->enableMultiselection(isEnable);
246   } else {
247     myWorkshop->mainWindow()->viewer()->setMultiSelectionEnabled(isEnable);
248   }
249 }
250
251 //***************************************
252 bool XGUI_ViewerProxy::isMultiSelectionEnabled() const
253 {
254   if (myWorkshop->isSalomeMode()) {
255     return myWorkshop->salomeConnector()->viewer()->isMultiSelectionEnabled();
256   } else {
257     return myWorkshop->mainWindow()->viewer()->isMultiSelectionEnabled();
258   }
259 }
260
261 //***************************************
262 void XGUI_ViewerProxy::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
263 {
264   myWorkshop->displayer()->addSelectionFilter(theFilter);
265 }
266
267 //***************************************
268 void XGUI_ViewerProxy::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
269 {
270   myWorkshop->displayer()->removeSelectionFilter(theFilter);
271 }
272
273 //***************************************
274 void XGUI_ViewerProxy::clearSelectionFilters()
275 {
276   myWorkshop->displayer()->removeFilters();
277 }
278
279 //***************************************
280 void XGUI_ViewerProxy::update()
281 {
282   myWorkshop->displayer()->updateViewer();
283 }
284
285 //***************************************
286 bool XGUI_ViewerProxy::canDragByMouse() const
287 {
288   if (myWorkshop->isSalomeMode()) {
289     ModuleBase_IViewer* aViewer = myWorkshop->salomeConnector()->viewer();
290     return aViewer->canDragByMouse();
291   } else {
292     return true;
293   }
294 }