Salome HOME
Union of validator and filter functionalities.
[modules/shaper.git] / src / NewGeom / NewGeom_SalomeViewer.cpp
index 3a105024877175d8ef4dfc416e2dddeb9c627582..86e2d8f1b2e5b61d42ce62c760279ed70a5676a8 100644 (file)
 #include <QMouseEvent>
 #include <QContextMenuEvent>
 
+NewGeom_SalomeView::NewGeom_SalomeView(OCCViewer_Viewer* theViewer)
+: ModuleBase_IViewWindow(), myCurrentView(0)
+{
+  myViewer = theViewer;
+}
+
 
 Handle(V3d_View) NewGeom_SalomeView::v3dView() const
 {
-  SUIT_ViewManager* aMgr = myViewer->getViewManager();
-  OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(aMgr->getActiveView());
-  Handle(V3d_View) aView = aWnd->getViewPort()->getView();
+  Handle(V3d_View) aView;
+  if (myCurrentView) {
+    OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(myCurrentView);
+    aView = aWnd->getViewPort()->getView();
+  }
   return aView;
 }
 
+QWidget* NewGeom_SalomeView::viewPort() const
+{
+  QWidget* aViewPort = 0;
+  if (myCurrentView) {
+    OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(myCurrentView);
+    aViewPort = aWnd->getViewPort();
+  }
+  return aViewPort;
+}
+
 //**********************************************
 //**********************************************
 //**********************************************
@@ -52,16 +70,21 @@ Handle(AIS_InteractiveContext) NewGeom_SalomeViewer::AISContext() const
 //**********************************************
 Handle(V3d_Viewer) NewGeom_SalomeViewer::v3dViewer() const
 {
-  return mySelector->viewer()->getViewer3d();
+  if (mySelector)
+    return mySelector->viewer()->getViewer3d();
+  return Handle(V3d_Viewer)();
 }
 
 //**********************************************
 Handle(V3d_View) NewGeom_SalomeViewer::activeView() const
 {
-  OCCViewer_Viewer* aViewer = mySelector->viewer();
-  SUIT_ViewManager* aMgr = aViewer->getViewManager();
-  OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(aMgr->getActiveView());
-  return aWnd->getViewPort()->getView();
+  if (mySelector) {
+    OCCViewer_Viewer* aViewer = mySelector->viewer();
+    SUIT_ViewManager* aMgr = aViewer->getViewManager();
+    OCCViewer_ViewWindow* aWnd = static_cast<OCCViewer_ViewWindow*>(aMgr->getActiveView());
+    return aWnd->getViewPort()->getView();
+  }
+  return Handle(V3d_View)();
 }
 
 //**********************************************
@@ -122,14 +145,16 @@ void NewGeom_SalomeViewer::onSelectionChanged()
 }
 
 //**********************************************
-void NewGeom_SalomeViewer::onMousePress(SUIT_ViewWindow*, QMouseEvent* theEvent)
+void NewGeom_SalomeViewer::onMousePress(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
 {
+  myView->setCurrentView(theView);
   emit mousePress(myView, theEvent);
 }
 
 //**********************************************
-void NewGeom_SalomeViewer::onMouseRelease(SUIT_ViewWindow*, QMouseEvent* theEvent)
+void NewGeom_SalomeViewer::onMouseRelease(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
 {
+  myView->setCurrentView(theView);
   emit mouseRelease(myView, theEvent);
   if (myIsSelectionChanged) {
     emit selectionChanged();
@@ -138,21 +163,36 @@ void NewGeom_SalomeViewer::onMouseRelease(SUIT_ViewWindow*, QMouseEvent* theEven
 }
 
 //**********************************************
-void NewGeom_SalomeViewer::onMouseDoubleClick(SUIT_ViewWindow*, QMouseEvent* theEvent)
+void NewGeom_SalomeViewer::onMouseDoubleClick(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
 {
+  myView->setCurrentView(theView);
   emit mouseDoubleClick(myView, theEvent);
 }
 
 //**********************************************
 void NewGeom_SalomeViewer::onMouseMove(SUIT_ViewWindow* theView, QMouseEvent* theEvent)
 {
+  myView->setCurrentView(theView);
   OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(theView);
   Handle(AIS_InteractiveContext) aContext = AISContext();
-  if (aContext->HasDetected())
+  if (aContext->HasDetected()) // Set focus to provide key events in the view
     aViewWnd->getViewPort()->setFocus(Qt::MouseFocusReason);
   emit mouseMove(myView, theEvent);
 }
 
+//**********************************************
+bool NewGeom_SalomeViewer::canDragByMouse() const
+{
+  OCCViewer_Viewer* aViewer = mySelector->viewer();
+  SUIT_ViewWindow* aWnd = aViewer->getViewManager()->getActiveView();
+  OCCViewer_ViewWindow* aViewWnd = dynamic_cast<OCCViewer_ViewWindow*>(aWnd);
+  if (aViewWnd) {
+    return (aViewWnd->interactionStyle() == 0);
+  }
+  return true;
+}
+
+
 //**********************************************
 void NewGeom_SalomeViewer::onKeyPress(SUIT_ViewWindow* theView, QKeyEvent* theEvent)
 {
@@ -188,8 +228,9 @@ void NewGeom_SalomeViewer::onDeleteView(SUIT_ViewWindow*)
 }
 
 //**********************************************
-void NewGeom_SalomeViewer::onViewCreated(SUIT_ViewWindow*)
+void NewGeom_SalomeViewer::onViewCreated(SUIT_ViewWindow* theView)
 {
+  myView->setCurrentView(theView);
   emit viewCreated(myView);
 }
 
@@ -202,44 +243,54 @@ void NewGeom_SalomeViewer::onActivated(SUIT_ViewWindow*)
 //**********************************************
 void NewGeom_SalomeViewer::enableSelection(bool isEnabled)
 {
-  //mySelector->viewer()->enableSelection(isEnabled);
+  if (mySelector)
+    mySelector->viewer()->enableSelection(isEnabled);
   // The enableSelection() in SALOME 7.5 cause of forced Viewer update(we have blinking)
   // After this is corrected, the first row should be recommented, the last - removed
-  mySelector->viewer()->setInteractionStyle(isEnabled ? SUIT_ViewModel::STANDARD
-                                                      : SUIT_ViewModel::KEY_FREE);
+    //mySelector->viewer()->setInteractionStyle(isEnabled ? SUIT_ViewModel::STANDARD
+    //                                                    : SUIT_ViewModel::KEY_FREE);
 }
 
 //**********************************************
 bool NewGeom_SalomeViewer::isSelectionEnabled() const
 {
-  return mySelector->viewer()->isSelectionEnabled();
+  if (mySelector)
+    return mySelector->viewer()->isSelectionEnabled();
 }
 
 //**********************************************
 void NewGeom_SalomeViewer::enableMultiselection(bool isEnable)
 {
-  mySelector->viewer()->enableMultiselection(isEnable);
+  if (mySelector)
+    mySelector->viewer()->enableMultiselection(isEnable);
 }
 
 //**********************************************
 bool NewGeom_SalomeViewer::isMultiSelectionEnabled() const
 {
-  return mySelector->viewer()->isMultiSelectionEnabled();
+  if (mySelector)
+    return mySelector->viewer()->isMultiSelectionEnabled();
+  return false;
 }
 
 //**********************************************
 void NewGeom_SalomeViewer::fitAll()
 {
-  SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
-  OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
-  if (aVFrame) {
-    aVFrame->onFitAll();
+  if (mySelector) {
+    SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
+    OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
+    if (aVFrame) {
+      aVFrame->onFitAll();
+    }
   }
 }
 
 //**********************************************
 void NewGeom_SalomeViewer::setViewProjection(double theX, double theY, double theZ)
 {
+  if (!mySelector) 
+    return;
+
   SUIT_ViewManager* aMgr = mySelector->viewer()->getViewManager();
   OCCViewer_ViewFrame* aVFrame = dynamic_cast<OCCViewer_ViewFrame*>(aMgr->getActiveView());
   if (aVFrame) {