1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
3 #include "NewGeom_SalomeViewer.h"
4 #include "NewGeom_OCCSelector.h"
6 #include <OCCViewer_ViewWindow.h>
7 #include <OCCViewer_ViewPort3d.h>
8 #include <OCCViewer_ViewFrame.h>
10 #include <SUIT_ViewManager.h>
12 #include <QMouseEvent>
13 #include <QContextMenuEvent>
15 NewGeom_SalomeView::NewGeom_SalomeView(OCCViewer_Viewer* theViewer)
16 : ModuleBase_IViewWindow(), myCurrentView(0)
22 Handle(V3d_View) NewGeom_SalomeView::v3dView() const
24 Handle(V3d_View) aView;
26 OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(myCurrentView);
27 aView = aWnd->getViewPort()->getView();
32 QWidget* NewGeom_SalomeView::viewPort() const
34 QWidget* aViewPort = 0;
36 OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(myCurrentView);
37 aViewPort = aWnd->getViewPort();
42 //**********************************************
43 //**********************************************
44 //**********************************************
48 NewGeom_SalomeViewer::NewGeom_SalomeViewer(QObject* theParent)
49 : ModuleBase_IViewer(theParent),
50 mySelector(0), myView(0), myIsSelectionChanged(false)
54 NewGeom_SalomeViewer::~NewGeom_SalomeViewer()
61 //**********************************************
62 Handle(AIS_InteractiveContext) NewGeom_SalomeViewer::AISContext() const
64 if (mySelector && mySelector->viewer())
65 return mySelector->viewer()->getAISContext();
66 Handle(AIS_InteractiveContext) aNull;
70 //**********************************************
71 Handle(V3d_Viewer) NewGeom_SalomeViewer::v3dViewer() const
74 return mySelector->viewer()->getViewer3d();
75 return Handle(V3d_Viewer)();
78 //**********************************************
79 Handle(V3d_View) NewGeom_SalomeViewer::activeView() const
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();
87 return Handle(V3d_View)();
90 //**********************************************
91 void NewGeom_SalomeViewer::setSelector(NewGeom_OCCSelector* theSel)
94 if (mySelector == theSel)
97 mySelector->viewer()->getViewManager()->disconnect(this);
98 OCCViewer_Viewer* aViewer = mySelector->viewer();
100 aViewer->disconnect(this);
106 OCCViewer_Viewer* aViewer = mySelector->viewer();
107 SUIT_ViewManager* aMgr = aViewer->getViewManager();
109 myView = new NewGeom_SalomeView(mySelector->viewer());
111 // TODO: Provide ModuleBase_IViewWindow interface
112 connect(aMgr, SIGNAL(lastViewClosed(SUIT_ViewManager*)), this, SIGNAL(lastViewClosed()));
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*)));
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*)));
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*)));
137 connect(aViewer, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
140 //**********************************************
141 void NewGeom_SalomeViewer::onSelectionChanged()
143 // Selection event must be sent only after mouse release
144 myIsSelectionChanged = true;
147 //**********************************************
148 void NewGeom_SalomeViewer::onMousePress(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
150 myView->setCurrentView(theView);
151 emit mousePress(myView, theEvent);
154 //**********************************************
155 void NewGeom_SalomeViewer::onMouseRelease(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
157 myView->setCurrentView(theView);
158 emit mouseRelease(myView, theEvent);
159 if (myIsSelectionChanged) {
160 emit selectionChanged();
161 myIsSelectionChanged = false;
165 //**********************************************
166 void NewGeom_SalomeViewer::onMouseDoubleClick(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
168 myView->setCurrentView(theView);
169 emit mouseDoubleClick(myView, theEvent);
172 //**********************************************
173 void NewGeom_SalomeViewer::onMouseMove(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
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);
183 //**********************************************
184 bool NewGeom_SalomeViewer::canDragByMouse() const
186 OCCViewer_Viewer* aViewer = mySelector->viewer();
187 SUIT_ViewWindow* aWnd = aViewer->getViewManager()->getActiveView();
188 OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(aWnd);
190 return (aViewWnd->interactionStyle() == 0);
196 //**********************************************
197 void NewGeom_SalomeViewer::onKeyPress(SUIT_ViewWindow* theView, QKeyEvent* theEvent)
199 OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(theView);
200 Handle(AIS_InteractiveContext) aContext = AISContext();
201 Handle(V3d_View) aView = aViewWnd->getViewPort()->getView();
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);
209 emit keyPress(myView, theEvent);
212 //**********************************************
213 void NewGeom_SalomeViewer::onKeyRelease(SUIT_ViewWindow* theView, QKeyEvent* theEvent)
215 emit keyRelease(myView, theEvent);
218 //**********************************************
219 void NewGeom_SalomeViewer::onTryCloseView(SUIT_ViewWindow*)
221 emit tryCloseView(myView);
224 //**********************************************
225 void NewGeom_SalomeViewer::onDeleteView(SUIT_ViewWindow*)
227 emit deleteView(myView);
230 //**********************************************
231 void NewGeom_SalomeViewer::onViewCreated(SUIT_ViewWindow* theView)
233 myView->setCurrentView(theView);
234 emit viewCreated(myView);
237 //**********************************************
238 void NewGeom_SalomeViewer::onActivated(SUIT_ViewWindow*)
240 emit activated(myView);
243 //**********************************************
244 void NewGeom_SalomeViewer::enableSelection(bool isEnabled)
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);
254 //**********************************************
255 bool NewGeom_SalomeViewer::isSelectionEnabled() const
258 return mySelector->viewer()->isSelectionEnabled();
261 //**********************************************
262 void NewGeom_SalomeViewer::enableMultiselection(bool isEnable)
265 mySelector->viewer()->enableMultiselection(isEnable);
268 //**********************************************
269 bool NewGeom_SalomeViewer::isMultiSelectionEnabled() const
272 return mySelector->viewer()->isMultiSelectionEnabled();
276 //**********************************************
277 void NewGeom_SalomeViewer::fitAll()
280 SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
281 OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
288 //**********************************************
289 void NewGeom_SalomeViewer::setViewProjection(double theX, double theY, double theZ)
294 SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
295 OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
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.);
306 //***************************************
307 void NewGeom_SalomeViewer::addSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
309 Handle(AIS_InteractiveContext) aContext = AISContext();
310 if (!aContext.IsNull()) {
311 aContext->AddFilter(theFilter);
315 //***************************************
316 void NewGeom_SalomeViewer::removeSelectionFilter(const Handle(SelectMgr_Filter)& theFilter)
318 Handle(AIS_InteractiveContext) aContext = AISContext();
319 if (!aContext.IsNull()) {
320 aContext->RemoveFilter(theFilter);
324 //***************************************
325 void NewGeom_SalomeViewer::clearSelectionFilters()
327 Handle(AIS_InteractiveContext) aContext = AISContext();
328 if (!aContext.IsNull()) {
329 aContext->RemoveFilters();
333 //***************************************
334 void NewGeom_SalomeViewer::update()
336 Handle(AIS_InteractiveContext) aContext = AISContext();
337 if (!aContext.IsNull()) {
338 aContext->UpdateCurrentViewer();