Salome HOME
Constriction type for all sketch entities
[modules/shaper.git] / src / NewGeom / NewGeom_SalomeViewer.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 #include "NewGeom_SalomeViewer.h"
4 #include "NewGeom_OCCSelector.h"
5
6 #include <OCCViewer_ViewWindow.h>
7 #include <OCCViewer_ViewPort3d.h>
8 #include <OCCViewer_ViewFrame.h>
9
10 #include <SUIT_ViewManager.h>
11
12 #include <QMouseEvent>
13 #include <QContextMenuEvent>
14
15 NewGeom_SalomeView::NewGeom_SalomeView(OCCViewer_Viewer* theViewer)
16 : ModuleBase_IViewWindow(), myCurrentView(0)
17 {
18   myViewer = theViewer;
19 }
20
21
22 Handle(V3d_View) NewGeom_SalomeView::v3dView() const
23 {
24   Handle(V3d_View) aView;
25   if (myCurrentView) {
26     OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(myCurrentView);
27     aView = aWnd->getViewPort()->getView();
28   }
29   return aView;
30 }
31
32 QWidget* NewGeom_SalomeView::viewPort() const
33 {
34   QWidget* aViewPort = 0;
35   if (myCurrentView) {
36     OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(myCurrentView);
37     aViewPort = aWnd->getViewPort();
38   }
39   return aViewPort;
40 }
41
42 //**********************************************
43 //**********************************************
44 //**********************************************
45
46
47
48 NewGeom_SalomeViewer::NewGeom_SalomeViewer(QObject* theParent)
49     : ModuleBase_IViewer(theParent),
50       mySelector(0), myView(0), myIsSelectionChanged(false)
51 {
52 }
53
54 NewGeom_SalomeViewer::~NewGeom_SalomeViewer()
55 {
56   if (myView)
57     delete myView;
58 }
59
60
61 //**********************************************
62 Handle(AIS_InteractiveContext) NewGeom_SalomeViewer::AISContext() const
63 {
64   if (mySelector && mySelector->viewer())
65     return mySelector->viewer()->getAISContext();
66   Handle(AIS_InteractiveContext) aNull;
67   return aNull;
68 }
69
70 //**********************************************
71 Handle(V3d_Viewer) NewGeom_SalomeViewer::v3dViewer() const
72 {
73   if (mySelector)
74     return mySelector->viewer()->getViewer3d();
75   return Handle(V3d_Viewer)();
76 }
77
78 //**********************************************
79 Handle(V3d_View) NewGeom_SalomeViewer::activeView() const
80 {
81   if (mySelector) {
82     OCCViewer_Viewer* aViewer = mySelector->viewer();
83     SUIT_ViewManager* aMgr = aViewer->getViewManager();
84     OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(aMgr->getActiveView());
85     return aWnd->getViewPort()->getView();
86   }
87   return Handle(V3d_View)();
88 }
89
90 //**********************************************
91 void NewGeom_SalomeViewer::setSelector(NewGeom_OCCSelector* theSel)
92 {
93   if (mySelector) {
94     if (mySelector == theSel)
95       return;
96     else {
97       mySelector->viewer()->getViewManager()->disconnect(this);
98       OCCViewer_Viewer* aViewer = mySelector->viewer();
99       if (aViewer)
100         aViewer->disconnect(this);
101     }
102   }
103   mySelector = theSel;
104   if (!mySelector)
105     return;
106   OCCViewer_Viewer* aViewer = mySelector->viewer();
107   SUIT_ViewManager* aMgr = aViewer->getViewManager();
108
109   myView = new NewGeom_SalomeView(mySelector->viewer());
110
111   // TODO: Provide ModuleBase_IViewWindow interface
112   connect(aMgr, SIGNAL(lastViewClosed(SUIT_ViewManager*)), this, SIGNAL(lastViewClosed()));
113
114   connect(aMgr, SIGNAL(tryCloseView(SUIT_ViewWindow*)), 
115           this, SLOT(onTryCloseView(SUIT_ViewWindow*)));
116   connect(aMgr, SIGNAL(deleteView(SUIT_ViewWindow*)), 
117           this, SLOT(onDeleteView(SUIT_ViewWindow*)));
118   connect(aMgr, SIGNAL(viewCreated(SUIT_ViewWindow*)), 
119           this, SLOT(onViewCreated(SUIT_ViewWindow*)));
120   connect(aMgr, SIGNAL(activated(SUIT_ViewWindow*)), 
121           this, SLOT(onActivated(SUIT_ViewWindow*)));
122
123   connect(aMgr, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), this,
124           SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*)));
125   connect(aMgr, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), this,
126           SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
127   connect(aMgr, SIGNAL(mouseDoubleClick(SUIT_ViewWindow*, QMouseEvent*)), this,
128           SLOT(onMouseDoubleClick(SUIT_ViewWindow*, QMouseEvent*)));
129   connect(aMgr, SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)), this,
130           SLOT(onMouseMove(SUIT_ViewWindow*, QMouseEvent*)));
131
132   connect(aMgr, SIGNAL(keyPress(SUIT_ViewWindow*, QKeyEvent*)), this,
133           SLOT(onKeyPress(SUIT_ViewWindow*, QKeyEvent*)));
134   connect(aMgr, SIGNAL(keyRelease(SUIT_ViewWindow*, QKeyEvent*)), this,
135           SLOT(onKeyRelease(SUIT_ViewWindow*, QKeyEvent*)));
136
137   connect(aViewer, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
138 }
139
140 //**********************************************
141 void NewGeom_SalomeViewer::onSelectionChanged()
142 {
143   // Selection event must be sent only after mouse release
144   myIsSelectionChanged = true;
145 }
146
147 //**********************************************
148 void NewGeom_SalomeViewer::onMousePress(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
149 {
150   myView->setCurrentView(theView);
151   emit mousePress(myView, theEvent);
152 }
153
154 //**********************************************
155 void NewGeom_SalomeViewer::onMouseRelease(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
156 {
157   myView->setCurrentView(theView);
158   emit mouseRelease(myView, theEvent);
159   if (myIsSelectionChanged) {
160     emit selectionChanged();
161     myIsSelectionChanged = false;
162   }
163 }
164
165 //**********************************************
166 void NewGeom_SalomeViewer::onMouseDoubleClick(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
167 {
168   myView->setCurrentView(theView);
169   emit mouseDoubleClick(myView, theEvent);
170 }
171
172 //**********************************************
173 void NewGeom_SalomeViewer::onMouseMove(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
174 {
175   myView->setCurrentView(theView);
176   OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(theView);
177   Handle(AIS_InteractiveContext) aContext = AISContext();
178   if (aContext->HasDetected()) // Set focus to provide key events in the view
179     aViewWnd->getViewPort()->setFocus(Qt::MouseFocusReason);
180   emit mouseMove(myView, theEvent);
181 }
182
183 //**********************************************
184 bool NewGeom_SalomeViewer::canDragByMouse() const
185 {
186   OCCViewer_Viewer* aViewer = mySelector->viewer();
187   SUIT_ViewWindow* aWnd = aViewer->getViewManager()->getActiveView();
188   OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(aWnd);
189   if (aViewWnd) {
190     return (aViewWnd->interactionStyle() == 0);
191   }
192   return true;
193 }
194
195
196 //**********************************************
197 void NewGeom_SalomeViewer::onKeyPress(SUIT_ViewWindow* theView, QKeyEvent* theEvent)
198 {
199   OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(theView);
200   Handle(AIS_InteractiveContext) aContext = AISContext();
201   Handle(V3d_View) aView = aViewWnd->getViewPort()->getView();
202
203   bool noModifiers = (theEvent->modifiers() == Qt::NoModifier);
204   if ((theEvent->key() == Qt::Key_N) && noModifiers) {
205     aContext->HilightNextDetected(aView);
206   } else if ((theEvent->key() == Qt::Key_P) && noModifiers) {
207     aContext->HilightPreviousDetected(aView);
208   }
209   emit keyPress(myView, theEvent);
210 }
211
212 //**********************************************
213 void NewGeom_SalomeViewer::onKeyRelease(SUIT_ViewWindow* theView, QKeyEvent* theEvent)
214 {
215   emit keyRelease(myView, theEvent);
216 }
217
218 //**********************************************
219 void NewGeom_SalomeViewer::onTryCloseView(SUIT_ViewWindow*)
220 {
221   emit tryCloseView(myView);
222 }
223
224 //**********************************************
225 void NewGeom_SalomeViewer::onDeleteView(SUIT_ViewWindow*)
226 {
227   emit deleteView(myView);
228 }
229
230 //**********************************************
231 void NewGeom_SalomeViewer::onViewCreated(SUIT_ViewWindow* theView)
232 {
233   myView->setCurrentView(theView);
234   emit viewCreated(myView);
235 }
236
237 //**********************************************
238 void NewGeom_SalomeViewer::onActivated(SUIT_ViewWindow*)
239 {
240   emit activated(myView);
241 }
242
243 //**********************************************
244 void NewGeom_SalomeViewer::enableSelection(bool isEnabled)
245 {
246   if (mySelector)
247     mySelector->viewer()->enableSelection(isEnabled);
248   // The enableSelection() in SALOME 7.5 cause of forced Viewer update(we have blinking)
249   // After this is corrected, the first row should be recommented, the last - removed
250     //mySelector->viewer()->setInteractionStyle(isEnabled ? SUIT_ViewModel::STANDARD
251     //                                                    : SUIT_ViewModel::KEY_FREE);
252 }
253
254 //**********************************************
255 bool NewGeom_SalomeViewer::isSelectionEnabled() const
256 {
257   if (mySelector)
258     return mySelector->viewer()->isSelectionEnabled();
259 }
260
261 //**********************************************
262 void NewGeom_SalomeViewer::enableMultiselection(bool isEnable)
263 {
264   if (mySelector)
265     mySelector->viewer()->enableMultiselection(isEnable);
266 }
267
268 //**********************************************
269 bool NewGeom_SalomeViewer::isMultiSelectionEnabled() const
270 {
271   if (mySelector)
272     return mySelector->viewer()->isMultiSelectionEnabled();
273   return false;
274 }
275
276 //**********************************************
277 void NewGeom_SalomeViewer::fitAll()
278 {
279   if (mySelector) {
280     SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
281     OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
282     if (aVFrame) {
283       aVFrame->onFitAll();
284     }
285   }
286 }
287
288 //**********************************************
289 void NewGeom_SalomeViewer::setViewProjection(double theX, double theY, double theZ)
290 {
291   if (!mySelector) 
292     return;
293
294   SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
295   OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
296   if (aVFrame) {
297     Handle(V3d_View) aView3d = aVFrame->getViewPort()->getView();
298     if (!aView3d.IsNull()) {
299       aView3d->SetProj(theX, theY, theZ);
300       aView3d->FitAll(0.01, true);
301       aView3d->SetZSize(0.);
302     }
303   }
304 }
305
306 //***************************************
307 void NewGeom_SalomeViewer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
308 {
309   Handle(AIS_InteractiveContext) aContext = AISContext();
310   if (!aContext.IsNull()) {
311     aContext->AddFilter(theFilter);
312   }
313 }
314
315 //***************************************
316 void NewGeom_SalomeViewer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
317 {
318   Handle(AIS_InteractiveContext) aContext = AISContext();
319   if (!aContext.IsNull()) {
320     aContext->RemoveFilter(theFilter);
321   }
322 }
323
324 //***************************************
325 void NewGeom_SalomeViewer::clearSelectionFilters()
326 {
327   Handle(AIS_InteractiveContext) aContext = AISContext();
328   if (!aContext.IsNull()) {
329     aContext->RemoveFilters();
330   }
331 }
332
333 //***************************************
334 void NewGeom_SalomeViewer::update()
335 {
336   Handle(AIS_InteractiveContext) aContext = AISContext();
337   if (!aContext.IsNull()) {
338     aContext->UpdateCurrentViewer();
339   }
340 }