]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
0022765: [EDF] Improvement of local selection mechanism ana/22765
authorana <ana@opencascade.com>
Wed, 19 Nov 2014 12:29:52 +0000 (15:29 +0300)
committerana <ana@opencascade.com>
Wed, 19 Nov 2014 12:29:52 +0000 (15:29 +0300)
First step

src/OCCViewer/OCCViewer_ViewWindow.cxx
src/Prs/SALOME_Prs.cxx
src/Prs/SALOME_Prs.h
src/SOCC/SOCC_ViewModel.cxx
src/SOCC/SOCC_ViewModel.h

index 4f38b4110457ec4c72197a4a339772a760272b08..f23e4975bb9fd81bb93b0ad903d835e3f76aa081 100755 (executable)
@@ -363,14 +363,26 @@ bool OCCViewer_ViewWindow::eventFilter( QObject* watched, QEvent* e )
     case QEvent::Wheel:
       {
         QWheelEvent* aEvent = (QWheelEvent*) e;
-  myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );
-  double delta = (double)( aEvent->delta() ) / ( 15 * 8 );
-  int x  = aEvent->x();
-  int y  = aEvent->y();
-  int x1 = (int)( aEvent->x() + width()*delta/100 );
-  int y1 = (int)( aEvent->y() + height()*delta/100 );
-  myViewPort->zoom( x, y, x1, y1 );
-  myViewPort->getView()->ZFitAll();
+     
+        if ( aEvent->modifiers().testFlag(Qt::ControlModifier) ) {
+          Handle(AIS_InteractiveContext) ic = myModel->getAISContext();
+          if ( ic->HasOpenedContext() ) {
+            if ( aEvent->delta() > 0 ) {
+              ic->HilightNextDetected( myViewPort->getView() );
+            } else {
+              ic->HilightPreviousDetected( myViewPort->getView() );
+            }
+          }
+        } else {
+          myViewPort->startZoomAtPoint( aEvent->x(), aEvent->y() );
+          double delta = (double)( aEvent->delta() ) / ( 15 * 8 );
+          int x  = aEvent->x();
+          int y  = aEvent->y();
+          int x1 = (int)( aEvent->x() + width()*delta/100 );
+          int y1 = (int)( aEvent->y() + height()*delta/100 );
+          myViewPort->zoom( x, y, x1, y1 );
+          myViewPort->getView()->ZFitAll();
+        }
       }
       return true;
 
index 871a4ca84f012dea4c8f81efcf336bd7ec7ffa15..480f4319563266a2c136e41f13a2072d06d49ead 100755 (executable)
 
 #include "SALOME_Prs.h"
 
+/*!
+  Dispatches operation of activation of sub-shapes selection
+*/
+void SALOME_Prs::LocalSelectionIn( SALOME_View*, const std::list<int> ) const
+{
+}
+
 /*!
   Dispatches display operation to proper Display() method of SALOME_View
 */
@@ -73,12 +80,22 @@ void SALOME_OCCPrs::AfterEraseIn( SALOME_Displayer* d, SALOME_View* v ) const
   d->AfterErase( v, this );
 }
 
+/*!
+  Dispatches operation to proper LocalSelectionIn() method of SALOME_View
+*/
+void SALOME_OCCPrs::LocalSelectionIn( SALOME_View* v, const std::list<int> modes ) const
+{
+  if ( v && !modes.empty() ) v->LocalSelection( this, modes );
+}
+
 /*!
   Dispatches operation to proper LocalSelectionIn() method of SALOME_View
 */
 void SALOME_OCCPrs::LocalSelectionIn( SALOME_View* v, const int mode ) const
 {
-  if ( v ) v->LocalSelection( this, mode );
+  std::list<int> modes;
+  modes.push_back( mode );
+  LocalSelectionIn( v, modes );
 }
 
 /*!
@@ -233,12 +250,22 @@ void SALOME_View::Erase( const SALOME_Prs* prs, const bool forced )
   prs->EraseIn( this, forced );
 }
 
+/*!
+  Gives control to SALOME_Prs object, so that it could perform double dispatch
+*/
+void SALOME_View::LocalSelection( const SALOME_Prs* prs, const std::list<int> modes )
+{
+  prs->LocalSelectionIn( this, modes );
+}
+
 /*!
   Gives control to SALOME_Prs object, so that it could perform double dispatch
 */
 void SALOME_View::LocalSelection( const SALOME_Prs* prs, const int mode )
 {
-  prs->LocalSelectionIn( this, mode );
+  std::list<int> modes;
+  modes.push_back( mode );
+  LocalSelection( prs, modes );
 }
 
 /*!
@@ -297,6 +324,15 @@ void SALOME_View::EraseAll( const bool )
 //  MESSAGE( "SALOME_View::EraseAll() called!" );
 }
 
+/*!
+  Virtual method, should be reimplemented in successors, by default issues a warning and does nothing.
+*/
+void SALOME_View::LocalSelection( const SALOME_OCCPrs*, const std::list<int> )
+{
+//  MESSAGE( "SALOME_View::LocalSelection( const SALOME_OCCPrs* ) called!
+//   Probably, selection is being activated in uncompatible viewframe." );
+}
+
 /*!
   Virtual method, should be reimplemented in successors, by default issues a warning and does nothing.
 */
index ebef97acdca832d3de29971f48cb83b26091bd65..4ca2ec00ca3f190521fa54addc27fad6c8e95c0e 100755 (executable)
@@ -33,6 +33,8 @@
 #define PRS_EXPORT
 #endif
 
+#include <list>
+
 class SALOME_View;
 class SALOME_Displayer;
 class SALOME_ListIO;
@@ -79,6 +81,7 @@ public:
 
   //! Key method for double dispatch of activation of sub-shapes selection
   virtual void LocalSelectionIn( SALOME_View*, const int ) const = 0;
+  virtual void LocalSelectionIn( SALOME_View*, const std::list<int> ) const;
 
     // checks if shape is clippable
   inline bool IsClippable() const
@@ -135,6 +138,7 @@ public:
   virtual void Update( SALOME_Displayer* );
 
   //! Key method for double dispatch of activation of sub-shapes selection
+  virtual void LocalSelectionIn( SALOME_View*, const std::list<int> ) const;
   virtual void LocalSelectionIn( SALOME_View*, const int ) const;
 };
 
@@ -243,6 +247,7 @@ public:
   //! This LocalSelection() method should be called to activate sub-shapes selection
   //! created anywhere by anybody. It simply passes control to SALOME_Prs object
   //! so that it could perform double dispatch.
+  void LocalSelection( const SALOME_Prs*, const std::list<int> );
   void LocalSelection( const SALOME_Prs*, const int );
 
   // Interface for derived views
@@ -261,9 +266,10 @@ public:
   // Add new Erase() methods here...
 
   // LocalSelection() methods for ALL kinds of presentation should appear here
-  virtual void LocalSelection( const SALOME_OCCPrs*, const int );//!< Local selection SALOME_OCCPrs
-  virtual void LocalSelection( const SALOME_VTKPrs*, const int );//!< Local selection SALOME_VTKPrs
-  virtual void LocalSelection( const SALOME_Prs2d* , const int );//!< Local selection SALOME_Prs2d
+  virtual void LocalSelection( const SALOME_OCCPrs*, const std::list<int> );//!< Local selection of different types of entities SALOME_OCCPrs
+  virtual void LocalSelection( const SALOME_OCCPrs*, const int );          //!< Local selection SALOME_OCCPrs
+  virtual void LocalSelection( const SALOME_VTKPrs*, const int );          //!< Local selection SALOME_VTKPrs
+  virtual void LocalSelection( const SALOME_Prs2d* , const int );          //!< Local selection SALOME_Prs2d
 
   //! Deactivates selection of sub-shapes (must be redefined with OCC viewer)
   virtual void GlobalSelection( const bool = false ) const;
index 985d1fed7a87d3bc415d62321e8619974926ba18..ae68073e7a8ef5119fe180243fb7fceffe69928d 100755 (executable)
@@ -549,7 +549,7 @@ SALOME_Prs* SOCC_Viewer::CreatePrs( const char* entry )
 /*!
   Activates selection of sub-shapes
 */
-void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode )
+void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const std::list<int> modes )
 {
   Handle(AIS_InteractiveContext) ic = getAISContext();
   
@@ -577,20 +577,33 @@ void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode
     Handle(AIS_InteractiveObject) anAIS = aIter.Value();
     if ( !anAIS.IsNull() )
     {
+      std::list<int>::const_iterator it;
       if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) )
       {
         ic->Load( anAIS, -1, false );
-        ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)theMode ) );
+        for( it = modes.begin(); it != modes.end(); ++it )
+          ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)*it ) );
       }
       else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) )
       {
         ic->Load( anAIS, -1, false );
-        ic->Activate( anAIS, theMode );
+        for( it = modes.begin(); it != modes.end(); ++it )
+          ic->Activate( anAIS, *it );
       }
     }
   }
 }
 
+/*!
+  Activates selection of sub-shapes
+*/
+void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode )
+{
+  std::list<int> modes;
+  modes.push_back( theMode );
+  LocalSelection( thePrs, modes );
+}
+
 /*!
   Deactivates selection of sub-shapes
 */
index e46e0bfe15f758d7abdbf5ab1baf990870c520e8..c53d37148d4b18beda630c9006cbbe79c71999bf 100755 (executable)
@@ -31,6 +31,8 @@
 #include "SALOME_Prs.h"
 #include "OCCViewer_ViewModel.h"
 
+#include <list>
+
 class SALOME_ListIO;
 class Handle(SALOME_InteractiveObject);
 
@@ -61,6 +63,7 @@ public:
   virtual void                EraseAll( const bool = false );
   virtual SALOME_Prs*         CreatePrs( const char* entry = 0 );
 
+  virtual void                LocalSelection( const SALOME_OCCPrs*, const std::list<int> );
   virtual void                LocalSelection( const SALOME_OCCPrs*, const int );
   virtual void                GlobalSelection( const bool = false ) const;
   virtual bool                isVisible( const Handle(SALOME_InteractiveObject)& );