Salome HOME
Issue #676: ZFitall for display new object
[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()->viewPortApp()->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()->viewPortApp()->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, SLOT(onViewCreated(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     
109     connect(aViewer, SIGNAL(viewTransformed(int)), this, SIGNAL(viewTransformed(int)));
110
111     connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
112             SIGNAL(contextMenuRequested(QContextMenuEvent*)));
113   } else {
114     AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
115
116     connect(aViewer, SIGNAL(lastViewClosed()), this, SIGNAL(lastViewClosed()));
117
118     connect(aViewer, SIGNAL(tryCloseView(AppElements_ViewWindow*)), 
119             this, SLOT(onTryCloseView(AppElements_ViewWindow*)));
120
121     connect(aViewer, SIGNAL(deleteView(AppElements_ViewWindow*)), 
122             this, SLOT(onDeleteView(AppElements_ViewWindow*)));
123
124     connect(aViewer, SIGNAL(viewCreated(AppElements_ViewWindow*)), 
125             this, SLOT(onViewCreated(AppElements_ViewWindow*)));
126
127     connect(aViewer, SIGNAL(activated(AppElements_ViewWindow*)), 
128             this, SLOT(onActivated(AppElements_ViewWindow*)));
129
130     connect(aViewer, SIGNAL(mousePress(AppElements_ViewWindow*, QMouseEvent*)), this,
131             SLOT(onMousePress(AppElements_ViewWindow*, QMouseEvent*)));
132
133     connect(aViewer, SIGNAL(mouseRelease(AppElements_ViewWindow*, QMouseEvent*)), this,
134             SLOT(onMouseRelease(AppElements_ViewWindow*, QMouseEvent*)));
135
136     connect(aViewer, SIGNAL(mouseDoubleClick(AppElements_ViewWindow*, QMouseEvent*)), this,
137             SLOT(onMouseDoubleClick(AppElements_ViewWindow*, QMouseEvent*)));
138
139     connect(aViewer, SIGNAL(mouseMove(AppElements_ViewWindow*, QMouseEvent*)), this,
140             SLOT(onMouseMove(AppElements_ViewWindow*, QMouseEvent*)));
141
142     connect(aViewer, SIGNAL(keyPress(AppElements_ViewWindow*, QKeyEvent*)), this,
143             SLOT(onKeyPress(AppElements_ViewWindow*, QKeyEvent*)));
144
145     connect(aViewer, SIGNAL(keyRelease(AppElements_ViewWindow*, QKeyEvent*)), this,
146             SLOT(onKeyRelease(AppElements_ViewWindow*, QKeyEvent*)));
147
148     connect(aViewer, SIGNAL(selectionChanged()), this, SIGNAL(selectionChanged()));
149     connect(aViewer, SIGNAL(contextMenuRequested(QContextMenuEvent*)), this,
150             SIGNAL(contextMenuRequested(QContextMenuEvent*)));
151   }
152 }
153
154 bool XGUI_ViewerProxy::eventFilter(QObject *theObject, QEvent *theEvent)
155 {
156   if (theEvent->type() == QEvent::Enter) {
157     emit enterViewPort();
158   }
159   else if (theEvent->type() == QEvent::Leave) {
160     emit leaveViewPort();
161   }
162   return ModuleBase_IViewer::eventFilter(theObject, theEvent);
163 }
164
165 void XGUI_ViewerProxy::onTryCloseView(AppElements_ViewWindow* theWnd)
166 {
167   emit tryCloseView(theWnd);
168 }
169
170 void XGUI_ViewerProxy::onDeleteView(AppElements_ViewWindow* theWnd)
171 {
172   if (myWindowScale.contains(theWnd->v3dView()))
173     myWindowScale.remove (theWnd->v3dView());
174   emit deleteView(theWnd);
175 }
176
177 void XGUI_ViewerProxy::onViewCreated(ModuleBase_IViewWindow* theWnd)
178 {
179   theWnd->viewPort()->installEventFilter(this);
180
181   myWindowScale.insert (theWnd->v3dView(), theWnd->v3dView()->Camera()->Scale());
182
183   emit viewCreated(theWnd);
184 }
185
186 void XGUI_ViewerProxy::onViewCreated(AppElements_ViewWindow* theWnd)
187 {
188   theWnd->viewPort()->installEventFilter(this);
189
190   connect(theWnd, SIGNAL(vpTransformationFinished(AppElements_ViewWindow::OperationType)),
191     this, SLOT(onViewTransformed(AppElements_ViewWindow::OperationType)));
192
193   myWindowScale.insert (theWnd->v3dView(), theWnd->v3dView()->Camera()->Scale());
194
195   emit viewCreated(theWnd);
196 }
197
198 void XGUI_ViewerProxy::onActivated(AppElements_ViewWindow* theWnd)
199 {
200   emit activated(theWnd);
201 }
202
203 void XGUI_ViewerProxy::onMousePress(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
204 {
205   emit mousePress(theWnd, theEvent);
206 }
207
208 void XGUI_ViewerProxy::onMouseRelease(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
209 {
210   emit mouseRelease(theWnd, theEvent);
211 }
212
213 void XGUI_ViewerProxy::onMouseDoubleClick(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
214 {
215   emit mouseDoubleClick(theWnd, theEvent);
216 }
217
218 void XGUI_ViewerProxy::onMouseMove(AppElements_ViewWindow* theWnd, QMouseEvent* theEvent)
219 {
220   emit mouseMove(theWnd, theEvent);
221 }
222
223 void XGUI_ViewerProxy::onKeyPress(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent)
224 {
225   emit keyPress(theWnd, theEvent);
226 }
227
228 void XGUI_ViewerProxy::onKeyRelease(AppElements_ViewWindow* theWnd, QKeyEvent* theEvent)
229 {
230   emit keyRelease(theWnd, theEvent);
231 }
232
233
234
235 //***************************************
236 void XGUI_ViewerProxy::enableSelection(bool isEnabled)
237 {
238   if (myWorkshop->isSalomeMode()) {
239     myWorkshop->salomeConnector()->viewer()->enableSelection(isEnabled);
240   } else {
241     myWorkshop->mainWindow()->viewer()->setSelectionEnabled(isEnabled);
242   }
243 }
244
245 //***************************************
246 bool XGUI_ViewerProxy::isSelectionEnabled() const
247 {
248   if (myWorkshop->isSalomeMode()) {
249     return myWorkshop->salomeConnector()->viewer()->isSelectionEnabled();
250   } else {
251     return myWorkshop->mainWindow()->viewer()->isSelectionEnabled();
252   }
253 }
254
255 //***************************************
256 void XGUI_ViewerProxy::enableMultiselection(bool isEnable)
257 {
258   if (myWorkshop->isSalomeMode()) {
259     myWorkshop->salomeConnector()->viewer()->enableMultiselection(isEnable);
260   } else {
261     myWorkshop->mainWindow()->viewer()->setMultiSelectionEnabled(isEnable);
262   }
263 }
264
265 //***************************************
266 bool XGUI_ViewerProxy::isMultiSelectionEnabled() const
267 {
268   if (myWorkshop->isSalomeMode()) {
269     return myWorkshop->salomeConnector()->viewer()->isMultiSelectionEnabled();
270   } else {
271     return myWorkshop->mainWindow()->viewer()->isMultiSelectionEnabled();
272   }
273 }
274
275 //***************************************
276 void XGUI_ViewerProxy::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
277 {
278   myWorkshop->displayer()->addSelectionFilter(theFilter);
279 }
280
281 //***************************************
282 void XGUI_ViewerProxy::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
283 {
284   myWorkshop->displayer()->removeSelectionFilter(theFilter);
285 }
286
287 //***************************************
288 void XGUI_ViewerProxy::clearSelectionFilters()
289 {
290   myWorkshop->displayer()->removeFilters();
291 }
292
293 //***************************************
294 void XGUI_ViewerProxy::update()
295 {
296   myWorkshop->displayer()->updateViewer();
297 }
298
299 //***************************************
300 bool XGUI_ViewerProxy::canDragByMouse() const
301 {
302   if (myWorkshop->isSalomeMode()) {
303     ModuleBase_IViewer* aViewer = myWorkshop->salomeConnector()->viewer();
304     return aViewer->canDragByMouse();
305   } else {
306     return true;
307   }
308 }
309
310 //***************************************
311 void XGUI_ViewerProxy::onViewTransformed(AppElements_ViewWindow::OperationType theType)
312 {
313   emit viewTransformed((int) theType);
314 }
315
316
317 //***************************************
318 void XGUI_ViewerProxy::Zfitall()
319 {
320   if (myWorkshop->isSalomeMode()) {
321     myWorkshop->salomeConnector()->viewer()->Zfitall();
322   } else {
323     AppElements_Viewer* aViewer = myWorkshop->mainWindow()->viewer();
324     AppElements_ViewWindow* aView = aViewer->activeViewWindow();
325     if (aView)
326       aView->v3dView()->ZFitAll();
327   }
328 }