]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Merge from PHASE_25_BR 14/11/2010
authorvsr <vsr@opencascade.com>
Mon, 15 Nov 2010 06:49:50 +0000 (06:49 +0000)
committervsr <vsr@opencascade.com>
Mon, 15 Nov 2010 06:49:50 +0000 (06:49 +0000)
46 files changed:
doc/salome/gui/images/image111.png [new file with mode: 0755]
doc/salome/gui/images/image157.png
doc/salome/gui/images/occviewer_toolbar.png
doc/salome/gui/images/pref12.png
doc/salome/gui/input/occ_3d_viewer.doc
doc/salome/gui/input/salome_preferences.doc
doc/salome/gui/input/vtk_3d_viewer.doc
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/LightApp/LightApp_WgViewModel.cxx [new file with mode: 0644]
src/LightApp/LightApp_WgViewModel.h [new file with mode: 0644]
src/LightApp/Makefile.am
src/LightApp/resources/LightApp.xml
src/LightApp/resources/LightApp_msg_en.ts
src/OCCViewer/Makefile.am
src/OCCViewer/OCCViewer_ViewModel.cxx
src/OCCViewer/OCCViewer_ViewModel.h
src/OCCViewer/OCCViewer_ViewPort3d.cxx
src/OCCViewer/OCCViewer_ViewPort3d.h
src/OCCViewer/OCCViewer_ViewWindow.cxx
src/OCCViewer/OCCViewer_ViewWindow.h
src/OCCViewer/resources/OCCViewer_images.ts
src/OCCViewer/resources/OCCViewer_msg_en.ts
src/OCCViewer/resources/occ_view_zooming_style_switch.png [new file with mode: 0755]
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip
src/SUIT/SUIT_ViewManager.cxx
src/SUIT/SUIT_ViewManager.h
src/SUIT/SUIT_ViewWindow.cxx
src/SUIT/SUIT_ViewWindow.h
src/SVTK/Makefile.am
src/SVTK/SVTK_InteractorStyle.cxx
src/SVTK/SVTK_InteractorStyle.h
src/SVTK/SVTK_ViewModel.cxx
src/SVTK/SVTK_ViewModel.h
src/SVTK/SVTK_ViewWindow.cxx
src/SVTK/SVTK_ViewWindow.h
src/SVTK/resources/SVTK_images.ts
src/SVTK/resources/SVTK_msg_en.ts
src/SVTK/resources/vtk_view_zooming_style_switch.png [new file with mode: 0755]
src/SalomeApp/resources/SalomeApp.xml

diff --git a/doc/salome/gui/images/image111.png b/doc/salome/gui/images/image111.png
new file mode 100755 (executable)
index 0000000..8f3a486
Binary files /dev/null and b/doc/salome/gui/images/image111.png differ
index dec5836f9145a7163d595a2cd7867d52e3ae0945..3c4b5040bc9c8ba5800295471a26bef8c78bcadc 100644 (file)
Binary files a/doc/salome/gui/images/image157.png and b/doc/salome/gui/images/image157.png differ
index 23b236990676eba7f87592c4608cb482e2cd8855..0cc7d3e80db6864f35ccf2b3cbd2c730d7f67a79 100644 (file)
Binary files a/doc/salome/gui/images/occviewer_toolbar.png and b/doc/salome/gui/images/occviewer_toolbar.png differ
index 5bea82dc130751062dc605345e67f6c66499b088..bfbc61685ac58ba2ccb2a52c83f04d1f2e88c8f9 100755 (executable)
Binary files a/doc/salome/gui/images/pref12.png and b/doc/salome/gui/images/pref12.png differ
index b84fb3885696510c85b2b76407dd82611d8f9ae7..f1f3acba628cdfa47311b8555ef2135b91c448b5 100644 (file)
@@ -24,6 +24,12 @@ left mouse button, panning - by middle mouse button, zooming - by left and middl
 mouse buttons pressed simultaneously.</center>
 <hr>
 
+\image html image111.png
+\n <center><b>Zooming style switch</b> - allows to switch between standard
+(zooming at the center of the view) and advanced (zooming at the current cursor
+position) zooming styles.</center>
+<hr>
+
 \image html image88.png
 \n <center><b>Show/Hide Trihedron</b> - shows or hides coordinate axes.</center>
 <hr>
index 2a6378900b6d124bbdab16fe4668d0d890809d62..8e4065d36960e4c4e9b1644947a51e4a1fe979e2 100644 (file)
@@ -97,6 +97,13 @@ operations are assigned to the buttons differently: rotation is made
 with the left button, translation with the right and zoom with both
 pressed in the same time.</li>
 </ul>
+<li><b>Zooming mode</b> - this option allows to choose a zooming mode.</li>
+<ul>
+<li><b>Relative to the view's center</b> - allows to zoom the view 
+relatively to its center.</li>
+<li><b>Relative to the cursor</b> - allows to zoom the view
+relatively to the current cursor position..</li>
+</ul>
 <li><b>[+]/[-] Speed Increment</b> - defines the number of units by
 which the speed increases or respectively decreases after pressing [+]
 or [-] keyboard buttons.</li>
index a33ab8e162fcc471f130d1637eea2403e639804e..e5b73f2943b0ac6eeabe82af3988da11d4a5df3f 100644 (file)
@@ -24,6 +24,13 @@ left mouse button, panning - by middle mouse button, zooming - by left and middl
 mouse buttons pressed simultaneously.</center>
 <hr>
 
+\image html image111.png
+\n <center><b>Zooming style switch</b> - allows to switch between standard
+(zooming at the center of the view) and advanced (zooming at the current cursor
+position) zooming styles. The second mode is available only for parallel
+(non-perspective) view's mode.</center>
+<hr>
+
 \image html image88.png
 \n <center><b>Show/Hide Trihedron</b> - shows or hides coordinate axes.</center>
 <hr>
index 12b1e9c6b05f0a465d2a69b795461997c2545e71..8ad007ba55c0b4d0ae2068c5a1e7ed0b58f450c9 100644 (file)
@@ -54,6 +54,7 @@
 #include "LightApp_OBSelector.h"
 #include "LightApp_SelectionMgr.h"
 #include "LightApp_DataObject.h"
+#include "LightApp_WgViewModel.h"
 
 #include <SALOME_Event.h>
 
   #include <SALOME_ListIO.hxx>
 #endif
 
+#include <Standard_Version.hxx>
+
+#ifdef OCC_VERSION_SERVICEPACK
+#define OCC_VERSION_LARGE (OCC_VERSION_MAJOR << 24 | OCC_VERSION_MINOR << 16 | OCC_VERSION_MAINTENANCE << 8 | OCC_VERSION_SERVICEPACK)
+#else
+#define OCC_VERSION_LARGE (OCC_VERSION_MAJOR << 24 | OCC_VERSION_MINOR << 16 | OCC_VERSION_MAINTENANCE << 8)
+#endif
+
 #define ToolBarMarker    0
 #define DockWidgetMarker 1
 
@@ -1354,6 +1363,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
     v = resMgr->integerValue( "OCCViewer", "iso_number_v", v );
     vm->setIsos( u, v );
     vm->setInteractionStyle( resMgr->integerValue( "OCCViewer", "navigation_mode", vm->interactionStyle() ) );
+    vm->setZoomingStyle( resMgr->integerValue( "OCCViewer", "zooming_mode", vm->zoomingStyle() ) );
     viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
     new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
   }
@@ -1376,6 +1386,7 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
                             resMgr->booleanValue( "VTKViewer", "relative_size", vm->trihedronRelative() ) );
       vm->setStaticTrihedronVisible( resMgr->booleanValue( "VTKViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
       vm->setInteractionStyle( resMgr->integerValue( "VTKViewer", "navigation_mode", vm->interactionStyle() ) );
+      vm->setZoomingStyle( resMgr->integerValue( "VTKViewer", "zooming_mode", vm->zoomingStyle() ) );
       vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
                                resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
       vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
@@ -1404,6 +1415,24 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType
   return viewMgr;
 }
 
+SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
+{
+  SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(), 
+                                              desktop(),
+                                              new LightApp_WgViewModel( vmType, w ) );
+  vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
+  addViewManager( vm );
+  SUIT_ViewWindow* vw = vm->createViewWindow();
+  if ( vw && desktop() )
+    vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
+
+  if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
+    myUserWmTypes << vmType;
+
+  return vm;
+}
+
 /*!
   SLOT: Removes view manager from application
 */
@@ -1949,6 +1978,17 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aStyleModeList, occStyleMode );
   pref->setItemProperty( "indexes", aModeIndexesList, occStyleMode );
 
+#if OCC_VERSION_LARGE > 0x06030010 // available only with OCC-6.3-sp11 and higher version
+  int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), occGroup,
+                                                 LightApp_Preferences::Selector, "OCCViewer", "zooming_mode" );
+  QStringList anOCCZoomingStyleModeList;
+  anOCCZoomingStyleModeList.append( tr("PREF_ZOOMING_AT_CENTER") );
+  anOCCZoomingStyleModeList.append( tr("PREF_ZOOMING_AT_CURSOR") );
+
+  pref->setItemProperty( "strings", anOCCZoomingStyleModeList, occZoomingStyleMode );
+  pref->setItemProperty( "indexes", aModeIndexesList, occZoomingStyleMode );
+#endif
+
   // VTK Viewer
   int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
   pref->setItemProperty( "columns", 2, vtkGen );
@@ -1979,7 +2019,15 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref )
   pref->setItemProperty( "strings", aStyleModeList, vtkStyleMode );
   pref->setItemProperty( "indexes", aModeIndexesList, vtkStyleMode );
 
-  pref->addPreference( "", vtkGroup, LightApp_Preferences::Space );
+  int vtkZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), vtkGen,
+                                                 LightApp_Preferences::Selector, "VTKViewer", "zooming_mode" );
+
+  QStringList aVTKZoomingStyleModeList;
+  aVTKZoomingStyleModeList.append( tr("PREF_ZOOMING_AT_CENTER") );
+  aVTKZoomingStyleModeList.append( tr("PREF_ZOOMING_AT_CURSOR") );
+
+  pref->setItemProperty( "strings", aVTKZoomingStyleModeList, vtkZoomingStyleMode );
+  pref->setItemProperty( "indexes", aModeIndexesList, vtkZoomingStyleMode );
 
   int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
                                       LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
@@ -2235,6 +2283,25 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
+#ifndef DISABLE_OCCVIEWER
+  if ( sec == QString( "OCCViewer" ) && param == QString( "zooming_mode" ) )
+  {
+    int mode = resMgr->integerValue( "OCCViewer", "zooming_mode", 0 );
+    QList<SUIT_ViewManager*> lst;
+    viewManagers( OCCViewer_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+        continue;
+
+      OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+      occVM->setZoomingStyle( mode );
+    }
+  }
+#endif
+
 #ifndef DISABLE_VTKVIEWER
   if ( sec == QString( "VTKViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )) )
   {
@@ -2325,6 +2392,27 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
   }
 #endif
 
+#ifndef DISABLE_VTKVIEWER
+  if ( sec == QString( "VTKViewer" ) && param == QString( "zooming_mode" ) )
+  {
+    int mode = resMgr->integerValue( "VTKViewer", "zooming_mode", 0 );
+    QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_SALOMEOBJECT
+    viewManagers( SVTK_Viewer::Type(), lst );
+    QListIterator<SUIT_ViewManager*> it( lst );
+    while ( it.hasNext() )
+    {
+      SUIT_ViewModel* vm = it.next()->getViewModel();
+      if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+        continue;
+
+      SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+      if( vtkVM ) vtkVM->setZoomingStyle( mode );
+    }
+#endif
+  }
+#endif
+
 #ifndef DISABLE_VTKVIEWER
   if ( sec == QString( "VTKViewer" ) && param == QString( "show_static_trihedron" ) )
   {
@@ -3281,6 +3369,7 @@ bool LightApp_Application::openAction( const int choice, const QString& aName )
 QStringList LightApp_Application::viewManagersTypes() const
 {
   QStringList aTypesList;
+  aTypesList += myUserWmTypes;
 #ifndef DISABLE_GLVIEWER
   aTypesList<<GLViewer_Viewer::Type();
 #endif
index f905b03f274e3762e83b1c0a6c1a775e3548499f..4561c4d779c1b3ce3aa57e85fa66f12b89e737ca 100644 (file)
@@ -35,6 +35,7 @@
 #include <CAM_Application.h>
 
 #include <QPointer>
+#include <QStringList>
 
 class LogWindow;
 #ifndef DISABLE_PYCONSOLE
@@ -124,6 +125,7 @@ public:
   virtual void                        addViewManager( SUIT_ViewManager* );
   virtual void                        removeViewManager( SUIT_ViewManager* );
   virtual SUIT_ViewManager*           createViewManager( const QString& vmType );
+  virtual SUIT_ViewManager*           createViewManager( const QString& vmType, QWidget* w );
 
   QWidget*                            getWindow( const int, const int = -1 );
   QWidget*                            dockWindow( const int ) const;
@@ -285,6 +287,7 @@ protected:
   static LightApp_Preferences*        _prefs_;
 
   static int                          lastStudyId;
+  QStringList                         myUserWmTypes;
 };
 
 #ifdef WIN32
diff --git a/src/LightApp/LightApp_WgViewModel.cxx b/src/LightApp/LightApp_WgViewModel.cxx
new file mode 100644 (file)
index 0000000..e4a337c
--- /dev/null
@@ -0,0 +1,55 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File   : LightApp_LightApp_WgViewModel.cxx
+// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
+
+#include "LightApp_WgViewModel.h"
+#include "SUIT_ViewWindow.h"
+
+LightApp_WgViewModel::LightApp_WgViewModel( const QString& type, QWidget* w )
+  : SUIT_ViewModel(),
+    myType( type ),
+    myWidget( w ),
+    myCreated( false )
+{
+}
+
+LightApp_WgViewModel::~LightApp_WgViewModel()
+{
+}
+
+SUIT_ViewWindow* LightApp_WgViewModel::createView( SUIT_Desktop* d )
+{
+  SUIT_ViewWindow* vw = 0;
+  if ( !myCreated ) {
+    vw = new SUIT_ViewWindow( d );
+    vw->setCentralWidget( myWidget );
+    myCreated = true;
+    vw->setClosable( false );///////////////////
+  }
+  return vw;
+}
+
+QString LightApp_WgViewModel::getType() const
+{
+  return myType;
+}
diff --git a/src/LightApp/LightApp_WgViewModel.h b/src/LightApp/LightApp_WgViewModel.h
new file mode 100644 (file)
index 0000000..a75b628
--- /dev/null
@@ -0,0 +1,47 @@
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File   : LightApp_LightApp_WgViewModel.h
+// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
+
+#ifndef LIGHTAPP_WGVIEWMODEL_H
+#define LIGHTAPP_WGVIEWMODEL_H
+
+#include "SUIT_ViewModel.h"
+#include "SUIT_ViewManager.h"
+
+class LightApp_WgViewModel : public SUIT_ViewModel
+{
+  Q_OBJECT
+
+public:
+  LightApp_WgViewModel( const QString& type, QWidget* w );
+  virtual ~LightApp_WgViewModel();
+
+  virtual SUIT_ViewWindow*  createView( SUIT_Desktop* d );
+  virtual QString           getType() const;
+
+private:
+  QString  myType;
+  QWidget* myWidget;
+  bool     myCreated;
+};
+#endif // LIGHTAPP_WGVIEWMODEL_H
index c1edf8b1ba81e603898d2ce5b09c273ccaf41fc3..a28fcc3bdd61ba836c371f67a7bc46939ad34a3c 100755 (executable)
@@ -59,7 +59,8 @@ salomeinclude_HEADERS =                       \
        LightApp_SwitchOp.h             \
        LightApp_Preferences.h          \
        LightApp_PreferencesDlg.h       \
-       LightApp_UpdateFlags.h
+       LightApp_UpdateFlags.h          \
+       LightApp_WgViewModel.h
 
 if ENABLE_PYCONSOLE
   salomeinclude_HEADERS += LightApp_PyInterp.h
@@ -106,7 +107,8 @@ dist_libLightApp_la_SOURCES =               \
        LightApp_Study.cxx              \
        LightApp_SwitchOp.cxx           \
        LightApp_Preferences.cxx        \
-       LightApp_PreferencesDlg.cxx
+       LightApp_PreferencesDlg.cxx     \
+       LightApp_WgViewModel.cxx
 
 if ENABLE_PYCONSOLE
   dist_libLightApp_la_SOURCES += LightApp_PyInterp.cxx
@@ -145,7 +147,8 @@ MOC_FILES =                         \
        LightApp_Study_moc.cxx          \
        LightApp_SwitchOp_moc.cxx       \
        LightApp_Preferences_moc.cxx    \
-       LightApp_PreferencesDlg_moc.cxx
+       LightApp_PreferencesDlg_moc.cxx \
+       LightApp_WgViewModel_moc.cxx
 
 if ENABLE_VTKVIEWER
 if ENABLE_SALOMEOBJECT
index 9395de3b3f3bad6d9acef9277390e57f3664e10a..cfe20ec817df3b313663541509f99c771967dd9e 100644 (file)
     <parameter name="iso_number_v"   value="1" />
     <parameter name="trihedron_size" value="100" />
     <parameter name="navigation_mode" value="0" />
+    <parameter name="zooming_mode"   value="0" />
  </section>
  <section name="VTKViewer" >
     <!-- VTK viewer preferences -->
     <parameter name="relative_size"  value="true" />
     <parameter name="use_advanced_selection_algorithm" value="true" />
     <parameter name="navigation_mode" value="0" />
+    <parameter name="zooming_mode" value="0" />
     <parameter name="speed_value" value="10" />
     <parameter name="speed_mode" value="0" />
     <parameter name="show_static_trihedron" value="true" />
index cc69e4730a2e1242ed92d66fdce7cb659f621467..7b3a8b0085aa4a2c8889baed34769c53e6a59ee3 100644 (file)
@@ -134,6 +134,18 @@ The changes will be applied on the next application session.</translation>
         <source>PREF_KEYFREE_STYLE</source>
         <translation>Keyboard free style</translation>
     </message>
+    <message>
+        <source>PREF_ZOOMING</source>
+        <translation>Zooming:</translation>
+    </message>
+    <message>
+        <source>PREF_ZOOMING_AT_CENTER</source>
+        <translation>Relative to the view's center</translation>
+    </message>
+    <message>
+        <source>PREF_ZOOMING_AT_CURSOR</source>
+        <translation>Relative to the cursor</translation>
+    </message>
     <message>
         <source>PREF_INCREMENTAL_SPEED</source>
         <translation>Speed increment:</translation>
index 4d56e731b0ce9afc015ca386115c0bc02f08dd8b..887374043e28933afd4ea211e47f55da45ba2b64 100755 (executable)
@@ -108,7 +108,9 @@ dist_salomeres_DATA =                               \
        resources/occ_view_top.png              \
        resources/occ_view_triedre.png          \
        resources/occ_view_zoom.png             \
-       resources/occ_view_rotation_point.png
+       resources/occ_view_rotation_point.png   \
+       resources/occ_view_style_switch.png     \
+       resources/occ_view_zooming_style_switch.png
 
 nodist_salomeres_DATA =                \
        OCCViewer_images.qm     \
index caea7732622cc0079fde91928e4af40e6dde6e0a..3e3c962aa2b9ac3a995d28a8fee22ae71a900012 100755 (executable)
@@ -119,6 +119,9 @@ OCCViewer_Viewer::OCCViewer_Viewer( bool DisplayTrihedron, bool DisplayStaticTri
   // set interaction style to standard
   myInteractionStyle = 0;
 
+  // set zooming style to standard
+  myZoomingStyle = 0;
+
   // selection
   mySelectionEnabled = true;
   myMultiSelectionEnabled = true;
@@ -159,6 +162,7 @@ void OCCViewer_Viewer::initView( OCCViewer_ViewWindow* view )
     view->initLayout();
     view->initSketchers();
     view->setInteractionStyle( interactionStyle() );
+    view->setZoomingStyle( zoomingStyle() );
     
     OCCViewer_ViewPort3d* vp3d = view->getViewPort();
     if ( vp3d )
@@ -328,6 +332,34 @@ void OCCViewer_Viewer::setInteractionStyle( const int theStyle )
   }
 }
 
+/*!
+  \return zooming style
+*/
+int OCCViewer_Viewer::zoomingStyle() const
+{
+  return myZoomingStyle;
+}
+
+/*!
+  Sets zooming style: 0 - standard, 1 - advanced (at cursor)
+  \param theStyle - new zooming style
+*/
+void OCCViewer_Viewer::setZoomingStyle( const int theStyle )
+{
+  myZoomingStyle = theStyle;
+  //!! To be done for view windows
+  if ( !myViewManager )
+    return;
+
+  QVector<SUIT_ViewWindow*> wins = myViewManager->getViews();
+  for ( int i = 0; i < (int)wins.count(); i++ )
+  {
+    OCCViewer_ViewWindow* win = ::qobject_cast<OCCViewer_ViewWindow*>( wins.at( i ) );
+    if ( win )
+      win->setZoomingStyle( theStyle );
+  }
+}
+
 /*!
   Sets selection enabled status
   \param isEnabled - new status
index fc0463e79e91c73f27af2f1f25f4dfa6a13c6b9a..8a61c8b467b1620f706e1cbc2f10c8bcba3c412e 100755 (executable)
@@ -170,6 +170,9 @@ public:
   int                             interactionStyle() const;
   void                            setInteractionStyle( const int );
 
+  int                             zoomingStyle() const;
+  void                            setZoomingStyle( const int );
+
   void                            enableSelection(bool isEnabled);
   bool                            isSelectionEnabled() const { return mySelectionEnabled; }
 
@@ -217,6 +220,7 @@ private:
   viewAspectList                  myViewAspects;
 
   int                             myInteractionStyle;
+  int                             myZoomingStyle;
 
   bool                            mySelectionEnabled;
   bool                            myMultiSelectionEnabled;
index f590759895ff4aaed69f33c10d4676292c1843d2..0703c8f80d1d378c0c58a72ac100793bbc010e21 100755 (executable)
@@ -51,6 +51,14 @@ static int sx = 0;
 static int sy = 0;
 static Standard_Boolean zRotation = Standard_False;
 
+#include <Standard_Version.hxx>
+
+#ifdef OCC_VERSION_SERVICEPACK
+#define OCC_VERSION_LARGE (OCC_VERSION_MAJOR << 24 | OCC_VERSION_MINOR << 16 | OCC_VERSION_MAINTENANCE << 8 | OCC_VERSION_SERVICEPACK)
+#else
+#define OCC_VERSION_LARGE (OCC_VERSION_MAJOR << 24 | OCC_VERSION_MINOR << 16 | OCC_VERSION_MAINTENANCE << 8)
+#endif
+
 /*!
   Constructor
 */
@@ -59,7 +67,8 @@ OCCViewer_ViewPort3d::OCCViewer_ViewPort3d( QWidget* parent, const Handle( V3d_V
     myScale( 1.0 ),
     myDegenerated( true ),
     myAnimate( false ),
-    myBusy( true )
+    myBusy( true ),
+    myIsAdvancedZoomingEnabled( false )
 {
   selectVisualId();
 
@@ -308,6 +317,17 @@ void OCCViewer_ViewPort3d::fitRect( const QRect& rect )
     activeView()->WindowFit( rect.left(), rect.top(), rect.right(), rect.bottom() );
 }
 
+/*!
+  Inits 'zoom' transformation. [ protected ]
+*/
+void OCCViewer_ViewPort3d::startZoomAtPoint( int x, int y )
+{
+#if OCC_VERSION_LARGE > 0x06030010 // available only with OCC-6.3-sp11 and higher version
+  if ( !activeView().IsNull() && isAdvancedZoomingEnabled() )
+    activeView()->StartZoomAtPoint( x, y );
+#endif
+}
+
 /*!
   Called at 'zoom' transformation. [ virtual protected ]
 */
@@ -317,7 +337,12 @@ void OCCViewer_ViewPort3d::zoom( int x0, int y0, int x, int y )
     // as OCCT respects a sign of only dx,
     // but we want both signes to be taken into account
     //activeView()->Zoom( x0, y0, x, y );
-    activeView()->Zoom( x0 + y0, 0, x + y, 0 );
+#if OCC_VERSION_LARGE > 0x06030010 // available only with OCC-6.3-sp11 and higher version
+    if ( isAdvancedZoomingEnabled() )
+      activeView()->ZoomAtPoint( x0, y0, x, y );
+    else
+#endif
+      activeView()->Zoom( x0 + y0, 0, x + y, 0 );
   }
 }
 
index 469ce17cb1777cd981bbe318d705bd29d98b9e92..125fcfa938082e75d0c7cff44c4ace48a565ed39 100755 (executable)
@@ -69,6 +69,7 @@ public:
   virtual void          pan( int , int );
   virtual void          setCenter( int , int );
   virtual void          fitRect( const QRect& );
+  virtual void          startZoomAtPoint( int, int );
   virtual void          zoom( int, int, int, int );
   virtual void          fitAll( bool keepScale = false, bool withZ = true, bool upd = true );
 
@@ -77,6 +78,9 @@ public:
   virtual void          endRotation();
   bool                  isBusy() {return myBusy;} // check that View Port is fully initialized
 
+  void                  setAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; }
+  bool                  isAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; }
+
 protected:
     // EVENTS
   virtual void          paintEvent( QPaintEvent* );
@@ -100,6 +104,7 @@ private:
   bool                  myAnimate;
   bool                  myBusy;
   double                myScale;
+  bool                  myIsAdvancedZoomingEnabled;
 };
 
 #ifdef WIN32
index 3f542c61def99f06bcc5548e65b0a0e22025d671..a1200fd76555fb58e39ac83a344b09e5cc374b01 100755 (executable)
@@ -385,20 +385,26 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
     break;
 
   case ZOOMVIEW:
-    if ( theEvent->button() == Qt::LeftButton )
+    if ( theEvent->button() == Qt::LeftButton ) {
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
       emit vpTransformationStarted ( ZOOMVIEW );
+    }
     break;
 
   case PANVIEW:
-    if ( aSwitchToZoom )
+    if ( aSwitchToZoom ) {
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
       activateZoom();
+    }
     else if ( theEvent->button() == Qt::LeftButton )
       emit vpTransformationStarted ( PANVIEW );
     break;
 
   case ROTATE:
-    if ( aSwitchToZoom )
+    if ( aSwitchToZoom ) {
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
       activateZoom();
+    }
     else if ( theEvent->button() == Qt::LeftButton ) {
       myViewPort->startRotation(myStartX, myStartY, myCurrPointType, mySelectedPoint);
       emit vpTransformationStarted ( ROTATE );
@@ -409,7 +415,8 @@ void OCCViewer_ViewWindow::vpMousePressEvent( QMouseEvent* theEvent )
   /*  Try to activate a transformation */
     switch ( getButtonState(theEvent, anInteractionStyle) ) {
     case ZOOMVIEW:
-            activateZoom();
+      myViewPort->startZoomAtPoint( myStartX, myStartY );
+      activateZoom();
       break;
     case PANVIEW:
             activatePanning();
@@ -1160,12 +1167,20 @@ void OCCViewer_ViewWindow::createActions()
   toolMgr()->registerAction( aAction, AmbientId );
 
   // Switch between interaction styles
-  aAction = new QtxAction(tr("MNU_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_SVTK_STYLE_SWITCH" ) ),
+  aAction = new QtxAction(tr("MNU_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_STYLE_SWITCH" ) ),
                           tr( "MNU_STYLE_SWITCH" ), 0, this);
   aAction->setStatusTip(tr("DSC_STYLE_SWITCH"));
   aAction->setCheckable(true);
   connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchInteractionStyle(bool)));
   toolMgr()->registerAction( aAction, SwitchInteractionStyleId );
+
+  // Switch between zooming styles
+  aAction = new QtxAction(tr("MNU_ZOOMING_STYLE_SWITCH"), aResMgr->loadPixmap( "OCCViewer", tr( "ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH" ) ),
+                          tr( "MNU_ZOOMING_STYLE_SWITCH" ), 0, this);
+  aAction->setStatusTip(tr("DSC_ZOOMING_STYLE_SWITCH"));
+  aAction->setCheckable(true);
+  connect(aAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));
+  toolMgr()->registerAction( aAction, SwitchZoomingStyleId );
 }
 
 /*!
@@ -1177,6 +1192,9 @@ void OCCViewer_ViewWindow::createToolBar()
 
   toolMgr()->append( DumpId, tid );
   toolMgr()->append( SwitchInteractionStyleId, tid );
+#if OCC_VERSION_LARGE > 0x06030010 // available only with OCC-6.3-sp11 and higher version
+  toolMgr()->append( SwitchZoomingStyleId, tid );
+#endif
   if( myModel->trihedronActivated() ) 
     toolMgr()->append( TrihedronShowId, tid );
 
@@ -1566,6 +1584,19 @@ void OCCViewer_ViewWindow::onSwitchInteractionStyle( bool on )
     a->setChecked( on );
 }
 
+/*!
+  \brief Toogles advanced zooming style (relatively to the cursor position) on/off
+*/
+void OCCViewer_ViewWindow::onSwitchZoomingStyle( bool on )
+{
+  myViewPort->setAdvancedZoomingEnabled( on );
+
+  // update action state if method is called outside
+  QtxAction* a = dynamic_cast<QtxAction*>( toolMgr()->action( SwitchZoomingStyleId ) );
+  if ( a->isChecked() != on )
+    a->setChecked( on );
+}
+
 /*!
   \brief Get current interaction style
   \return interaction style
@@ -1584,6 +1615,24 @@ void OCCViewer_ViewWindow::setInteractionStyle( const int theStyle )
   onSwitchInteractionStyle( theStyle == (int)SUIT_ViewModel::KEY_FREE );
 }
 
+/*!
+  \brief Get current zooming style
+  \return zooming style
+*/
+int OCCViewer_ViewWindow::zoomingStyle() const
+{
+  return myViewPort->isAdvancedZoomingEnabled() ? 1 : 0;
+}
+
+/*!
+  \brief Set current zooming style
+  \param theStyle zooming style
+*/
+void OCCViewer_ViewWindow::setZoomingStyle( const int theStyle )
+{
+  onSwitchZoomingStyle( theStyle == 1 );
+}
+
 /*!
   \brief Dump view window contents to the pixmap.
   \return pixmap containing all scene rendered in the window
index 02300ef18aa6e7f647addfef69c74adbfaae2dbc..3850bb2a58c8341d72e3b98648a6f66829561409 100755 (executable)
@@ -51,7 +51,7 @@ public:
   enum { DumpId, FitAllId, FitRectId, ZoomId, PanId, GlobalPanId,
          ChangeRotationPointId, RotationId,
          FrontId, BackId, TopId, BottomId, LeftId, RightId, ResetId, CloneId, ClippingId, MemId, RestoreId,
-         TrihedronShowId, AxialScaleId, GraduatedAxesId, AmbientId, SwitchInteractionStyleId };
+         TrihedronShowId, AxialScaleId, GraduatedAxesId, AmbientId, SwitchInteractionStyleId, SwitchZoomingStyleId };
 
   enum OperationType{ NOTHING, PANVIEW, ZOOMVIEW, ROTATE, 
                       PANGLOBAL, WINDOWFIT, FITALLVIEW, RESETVIEW,
@@ -90,6 +90,9 @@ public:
   int                     interactionStyle() const;
   void                    setInteractionStyle( const int );
  
+  int                     zoomingStyle() const;
+  void                    setZoomingStyle( const int );
   void setTransformEnabled( const OperationType, const bool );
   bool transformEnabled( const OperationType ) const;
 
@@ -119,6 +122,7 @@ public slots:
   void onTrihedronShow();
   void setRestoreFlag();
   void onSwitchInteractionStyle( bool on );
+  void onSwitchZoomingStyle( bool on );
 
   void activateSetRotationGravity();
   void activateSetRotationSelected( double theX, double theY, double theZ );
index bcc888b208a90cf8899c4a7902d5e16907b5fffc..429a1ad1bccd6ff66510d62168ace1c16d684498 100644 (file)
         <source>ICON_OCCVIEWER_STYLE_SWITCH</source>
         <translation>occ_view_style_switch.png</translation>
     </message>
+    <message>
+        <source>ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH</source>
+        <translation>occ_view_zooming_style_switch.png</translation>
+    </message>
 </context>
 </TS>
index aea134ee6cb04865dca17317b3f8c51cfcba71a2..c19bb5d053752216dea9dc8e6e9382d994b27fbe 100644 (file)
         <source>MNU_STYLE_SWITCH</source>
         <translation>Interaction style switch</translation>
     </message>
+    <message>
+        <source>DSC_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zooming style switch</translation>
+    </message>
+    <message>
+        <source>MNU_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zooming style switch</translation>
+    </message>
     <message>
         <source>OCC_IMAGE_FILES</source>
         <translation>Images Files (*.bmp *.png *.jpg *.jpeg)</translation>
diff --git a/src/OCCViewer/resources/occ_view_zooming_style_switch.png b/src/OCCViewer/resources/occ_view_zooming_style_switch.png
new file mode 100755 (executable)
index 0000000..8f3a486
Binary files /dev/null and b/src/OCCViewer/resources/occ_view_zooming_style_switch.png differ
index 14bcf08bd1f45e187d10887ed6850266efc5793d..c89d9cc0b534f16aadd13318f955e1dcc038b687 100644 (file)
@@ -197,6 +197,15 @@ void SALOME_PYQT_Module::onViewClosed( SUIT_ViewWindow* pview )
   SALOME_PYQT_ModuleLight::onViewClosed( pview );
 }
 
+/*!
+  \brief Signal handler tryClose(SUIT_ViewWindow*) of a view
+  \param pview view user tries to close
+*/
+void SALOME_PYQT_Module::onViewTryClose( SUIT_ViewWindow* pview )
+{
+  SALOME_PYQT_ModuleLight::onViewTryClose( pview );
+}
+
 /*!
   \breif Process application preferences changing.
 
index 950f723ed01091bbbc5a6235780b1c6a5d25e219..f4a35eaeb6370311804891130fa224366ed87bac 100644 (file)
@@ -54,6 +54,7 @@ public slots:
   void                       onGUIEvent();
   void                       onActiveViewChanged( SUIT_ViewWindow* );
   void                       onViewClosed( SUIT_ViewWindow* );
+  void                       onViewTryClose( SUIT_ViewWindow* );
   void                       onViewCloned( SUIT_ViewWindow* );
 
 protected:
index 50861058ac3a4b190904f563c328decf56d32655..675ac783b9a56cbd3d12656e99d96eebcee27bd0 100644 (file)
@@ -862,7 +862,7 @@ void SALOME_PYQT_ModuleLight::init( CAM_Application* app )
   PyLockWrapper aLock = myInterp->GetLockWrapper();
   // ... (the Python module is already imported)
   // ... finally call Python module's initialize() method
-  if ( PyObject_HasAttrString( myModule, "initialize" ) ) {
+  if ( PyObject_HasAttrString( myModule, (char*)"initialize" ) ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"initialize", (char*)"" ) );
     if ( !res ) {
       PyErr_Print();
@@ -876,7 +876,7 @@ void SALOME_PYQT_ModuleLight::init( CAM_Application* app )
   myWindowsMap.insert( LightApp_Application::WT_PyConsole,     Qt::BottomDockWidgetArea );
   myWindowsMap.insert( LightApp_Application::WT_LogWindow,     Qt::BottomDockWidgetArea );
 
-  if ( PyObject_HasAttrString( myModule , "windows" ) ) {
+  if ( PyObject_HasAttrString( myModule , (char*)"windows" ) ) {
     PyObjWrapper res1( PyObject_CallMethod( myModule, (char*)"windows", (char*)"" ) );
     if ( !res1 ) {
       PyErr_Print();
@@ -903,7 +903,7 @@ void SALOME_PYQT_ModuleLight::init( CAM_Application* app )
 
   // get compatible view windows types from the Python module 
   // by calling views() method
-  if ( PyObject_HasAttrString( myModule , "views" ) ) {
+  if ( PyObject_HasAttrString( myModule , (char*)"views" ) ) {
     PyObjWrapper res2( PyObject_CallMethod( myModule, (char*)"views", (char*)"" ) );
     if ( !res2 ) {
       PyErr_Print();
@@ -966,7 +966,7 @@ void SALOME_PYQT_ModuleLight::activate( SUIT_Study* theStudy )
   PyLockWrapper aLock = myInterp->GetLockWrapper();
 
   // call Python module's activate() method (for the new modules)
-  if ( PyObject_HasAttrString( myModule , "activate" ) ) {
+  if ( PyObject_HasAttrString( myModule , (char*)"activate" ) ) {
     PyObject* res1 = PyObject_CallMethod( myModule, (char*)"activate", (char*)"" );
     if ( !res1 || !PyBool_Check( res1 ) ) {
       PyErr_Print();
@@ -1039,7 +1039,7 @@ void SALOME_PYQT_ModuleLight::customize( SUIT_Study* theStudy )
 
   if ( IsCallOldMethods ) {
     // call Python module's setSettings() method (obsolete)
-    if ( PyObject_HasAttrString( myModule , "setSettings" ) ) {
+    if ( PyObject_HasAttrString( myModule , (char*)"setSettings" ) ) {
       PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"setSettings", (char*)"" ) );
       if( !res ) {
         PyErr_Print();
@@ -1066,7 +1066,7 @@ void SALOME_PYQT_ModuleLight::deactivate( SUIT_Study* theStudy )
     return;
   }
   // then call Python module's deactivate() method
-  if ( PyObject_HasAttrString( myModule , "deactivate" ) ) {
+  if ( PyObject_HasAttrString( myModule , (char*)"deactivate" ) ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"deactivate", (char*)"" ) );
     if( !res ) {
       PyErr_Print();
@@ -1120,7 +1120,7 @@ void SALOME_PYQT_ModuleLight::studyChanged( SUIT_Study* theStudy )
   PyLockWrapper aLock = myInterp->GetLockWrapper();
 
   // call Python module's activeStudyChanged() method
-  if ( PyObject_HasAttrString( myModule, "activeStudyChanged" ) ) {
+  if ( PyObject_HasAttrString( myModule, (char*)"activeStudyChanged" ) ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"activeStudyChanged", (char*)"i", aStudyId ) );
     if( !res ) {
       PyErr_Print();
@@ -1154,7 +1154,7 @@ void SALOME_PYQT_ModuleLight::contextMenu( const QString& theContext, QMenu* the
 
   QString aContext( "" ), aObject( "" ), aParent( theContext );
 
-  if ( IsCallOldMethods && PyObject_HasAttrString( myModule, "definePopup" ) ) {
+  if ( IsCallOldMethods && PyObject_HasAttrString( myModule, (char*)"definePopup" ) ) {
     // call definePopup() Python module's function
     // this is obsolete function, used only for compatibility reasons
     PyObjWrapper res( PyObject_CallMethod( myModule,
@@ -1189,7 +1189,7 @@ void SALOME_PYQT_ModuleLight::contextMenu( const QString& theContext, QMenu* the
 #endif
 
   // then call Python module's createPopupMenu() method (for new modules)
-  if ( PyObject_HasAttrString( myModule, "createPopupMenu" ) ) {
+  if ( PyObject_HasAttrString( myModule, (char*)"createPopupMenu" ) ) {
     PyObjWrapper res1( PyObject_CallMethod( myModule,
                                             (char*)"createPopupMenu",
                                             (char*)"Os",
@@ -1200,7 +1200,7 @@ void SALOME_PYQT_ModuleLight::contextMenu( const QString& theContext, QMenu* the
     }
   }
 
-  if ( IsCallOldMethods && PyObject_HasAttrString( myModule, "customPopup" ) ) {
+  if ( IsCallOldMethods && PyObject_HasAttrString( myModule, (char*)"customPopup" ) ) {
     // call customPopup() Python module's function
     // this is obsolete function, used only for compatibility reasons
     PyObjWrapper res2( PyObject_CallMethod( myModule,
@@ -1233,7 +1233,7 @@ void SALOME_PYQT_ModuleLight::guiEvent( const int theId )
   if ( !myInterp || !myModule )
     return;
 
-  if ( PyObject_HasAttrString( myModule, "OnGUIEvent" ) ) {
+  if ( PyObject_HasAttrString( myModule, (char*)"OnGUIEvent" ) ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"OnGUIEvent", (char*)"i", theId ) );
     if( !res ) {
       PyErr_Print();
@@ -1260,7 +1260,7 @@ void SALOME_PYQT_ModuleLight::initPreferences()
   // might be called during the module intialization process
   myInitModule = this;
 
-  if ( PyObject_HasAttrString( myModule, "createPreferences" ) ) {
+  if ( PyObject_HasAttrString( myModule, (char*)"createPreferences" ) ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"createPreferences", (char*)"" ) );
     if( !res ) {
       PyErr_Print();
@@ -1404,7 +1404,7 @@ void SALOME_PYQT_ModuleLight::setWorkSpace()
     PyObjWrapper pyws( sipBuildResult( 0, "D", aWorkspace, sipType_QWidget , NULL) );
 #endif
     // ... and finally call Python module's setWorkspace() method (obsolete)
-    if ( PyObject_HasAttrString( myModule, "setWorkSpace" ) ) {
+    if ( PyObject_HasAttrString( myModule, (char*)"setWorkSpace" ) ) {
       PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"setWorkSpace", (char*)"O", pyws.get() ) );
       if( !res ) {
         PyErr_Print();
@@ -1431,7 +1431,7 @@ void SALOME_PYQT_ModuleLight::prefChanged( const QString& section, const QString
   if ( !myInterp || !myModule )
     return;
 
-  if ( PyObject_HasAttrString( myModule, "preferenceChanged" ) ) {
+  if ( PyObject_HasAttrString( myModule, (char*)"preferenceChanged" ) ) {
     PyObjWrapper res( PyObject_CallMethod( myModule,
                                            (char*)"preferenceChanged", 
                                            (char*)"ss", 
@@ -1829,7 +1829,7 @@ void SALOME_PYQT_ModuleLight::activeViewChanged( const SUIT_ViewWindow* pview )
   
   connectView( pview );
 
-  if ( PyObject_HasAttrString( myModule, "activeViewChanged" ) ) 
+  if ( PyObject_HasAttrString( myModule, (char*)"activeViewChanged" ) ) 
   {
     if ( !pview ) 
       return;   
@@ -1876,7 +1876,7 @@ void SALOME_PYQT_ModuleLight::viewCloned( const SUIT_ViewWindow* pview )
   if ( !myInterp || !myModule || !pview ) 
     return;  
 
-  if ( PyObject_HasAttrString( myModule, "viewCloned" ) ) 
+  if ( PyObject_HasAttrString( myModule, (char*)"viewCloned" ) ) 
   {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"viewCloned", (char*)"i", pview->getId() ) );
     if( !res )
@@ -1884,6 +1884,52 @@ void SALOME_PYQT_ModuleLight::viewCloned( const SUIT_ViewWindow* pview )
   }
 }
 
+/*!
+  \brief Signal handler tryClose(SUIT_ViewWindow*) of a view
+  \param pview view being closed
+*/
+void SALOME_PYQT_ModuleLight::onViewTryClose( SUIT_ViewWindow* pview )
+{
+  class ViewTryClose : public PyInterp_LockRequest
+  {
+  public:
+    ViewTryClose( PyInterp_Interp* _py_interp, SALOME_PYQT_ModuleLight* _obj, const SUIT_ViewWindow* _pview )
+      : PyInterp_LockRequest( _py_interp, 0, true ),
+        myObj(_obj),myView(_pview) {}
+
+  protected:
+    virtual void execute()
+    {
+      myObj->viewTryClose( myView );
+    }
+
+  private:
+    SALOME_PYQT_ModuleLight* myObj;
+    const SUIT_ViewWindow * myView;    
+  };
+
+  PyInterp_Dispatcher::Get()->Exec( new ViewTryClose( myInterp, this, pview ) );
+}
+
+/*!
+  \brief Processes the view closing attempt, calls Python module's viewTryClose() method
+  \param pview view user tries to close
+*/
+void SALOME_PYQT_ModuleLight::viewTryClose( const SUIT_ViewWindow* pview )
+{
+  if ( !myInterp || !myModule ) 
+    return;  
+
+  if ( PyObject_HasAttrString( myModule, (char*)"viewTryClose" ) ) 
+  {
+    PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"viewTryClose", (char*)"i", pview->getId() ) );
+    if ( !res )
+    {
+      PyErr_Print();
+    }
+  }
+}
+
 /*!
   \brief Signal handler closing(SUIT_ViewWindow*) of a view
   \param pview view being closed
@@ -1920,7 +1966,7 @@ void SALOME_PYQT_ModuleLight::viewClosed( const SUIT_ViewWindow* pview )
   if ( !myInterp || !myModule ) 
     return;  
 
-  if ( PyObject_HasAttrString( myModule, "viewClosed" ) ) 
+  if ( PyObject_HasAttrString( myModule, (char*)"viewClosed" ) ) 
   {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"viewClosed", (char*)"i", pview->getId() ) );
     if ( !res )
@@ -1941,9 +1987,13 @@ void SALOME_PYQT_ModuleLight::connectView( const SUIT_ViewWindow* pview )
       
   if ( viewMgr )
   {
+    disconnect( viewMgr, SIGNAL( tryCloseView( SUIT_ViewWindow* ) ),
+               this, SLOT( onViewTryClose( SUIT_ViewWindow* ) ) );
     disconnect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
-               this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
+               this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
   
+    connect( viewMgr, SIGNAL( tryCloseView( SUIT_ViewWindow* ) ),
+            this, SLOT( onViewTryClose( SUIT_ViewWindow* ) ) );
     connect( viewMgr, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
              this, SLOT( onViewClosed( SUIT_ViewWindow* ) ) );
   }
@@ -2388,7 +2438,7 @@ void SALOME_PYQT_ModuleLight::saveEvent(QStringList& theListOfFiles)
   if ( !myInterp || !myModule || (it == theListOfFiles.end()))
     return;
 
-  if ( PyObject_HasAttrString(myModule, "saveFiles") ) {
+  if ( PyObject_HasAttrString(myModule, (char*)"saveFiles") ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"saveFiles",
                                            (char*)"s", (*it).toLatin1().constData()));
     if( !res ) {
@@ -2470,7 +2520,7 @@ void SALOME_PYQT_ModuleLight::openEvent(QStringList theListOfFiles, bool &opened
 #else
   PyObjWrapper sipList( sipBuildResult( 0, "D", theList,  sipType_QStringList , NULL) );
 #endif
-  if ( PyObject_HasAttrString(myModule , "openFiles") ) {
+  if ( PyObject_HasAttrString(myModule , (char*)"openFiles") ) {
     PyObjWrapper res( PyObject_CallMethod( myModule, (char*)"openFiles",
                                            (char*)"O", sipList.get()));
     if( !res || !PyBool_Check( res )) {
index 90fce396956d1d17c45ea190280b62724923e330..1fa012262cd67d37410db94702c241c5398d2f36 100644 (file)
@@ -158,12 +158,13 @@ public slots:
   void                       onGUIEvent();
 
   void                       onActiveViewChanged( SUIT_ViewWindow* );
+  void                       onViewTryClose( SUIT_ViewWindow* );
   void                       onViewClosed( SUIT_ViewWindow* );
   void                       onViewCloned( SUIT_ViewWindow* );
 
 protected:
   /* create data model */
-  virtual CAM_DataModel*          createDataModel();
+  virtual CAM_DataModel*     createDataModel();
 
 private:
   void                       init( CAM_Application* );
@@ -182,6 +183,7 @@ private:
   void                       setWorkSpace();
   
   void                       activeViewChanged( const SUIT_ViewWindow* );
+  void                       viewTryClose( const SUIT_ViewWindow* );
   void                       viewClosed( const SUIT_ViewWindow* );
   void                       viewCloned( const SUIT_ViewWindow* );
   void                       connectView( const SUIT_ViewWindow* );
index bfda59f2dd1e6386088370fd2949cc52f9215d86..f466eb9662967140f3b9e6f8f74b67b58cb36968 100644 (file)
@@ -2365,6 +2365,45 @@ int SalomePyQt::createView( const QString& type )
   return ProcessEvent( new TCreateView( type ) );
 }
 
+/*!
+  \fn int SalomePyQt::createView( const QString& type, QWidget* w )
+  \brief Create new view with custom widget embedded and activate it
+  \param type viewer type
+  \param w custom widget
+  \return integer identifier of created view (or -1 if view could not be created)
+*/
+
+class TCreateViewWg: public SALOME_Event
+{
+public:
+  typedef int TResult;
+  TResult myResult;
+  QString myType;
+  QWidget* myWidget;
+  TCreateViewWg( const QString& theType, QWidget* w )
+    : myResult( -1 ),
+      myType( theType ),
+      myWidget( w ) {}
+  virtual void Execute() 
+  {
+    LightApp_Application* app  = getApplication();
+    if ( app )
+    {
+      SUIT_ViewManager* viewMgr = app->createViewManager( myType, myWidget );
+      if ( viewMgr )
+      {
+        SUIT_ViewWindow* wnd = viewMgr->getActiveView();
+        if ( wnd )
+          myResult = wnd->getId();
+      }
+    }
+  }
+};
+int SalomePyQt::createView( const QString& type, QWidget* w )
+{
+  return ProcessEvent( new TCreateViewWg( type, w ) );
+}
+
 /*!
   \fn bool SalomePyQt::closeView( const int id )
   \brief Close view
@@ -2483,6 +2522,61 @@ bool SalomePyQt::isViewVisible( const int id )
   return ProcessEvent( new TIsViewVisible( id ) );
 }
   
+/*!
+  \fn bool SalomePyQt::setViewClosable( const int id, const bool on )
+  \brief Set / clear view's "closable" option. By default any view is closable
+        (i.e. can be closed by the user).
+  \param id window identifier
+  \param on new "closable" option's value
+*/
+
+void SalomePyQt::setViewClosable( const int id, const bool on )
+{
+  class TEvent: public SALOME_Event
+  {
+    int myWndId;
+    bool myOn;
+  public:
+    TEvent( const int id, const bool on )
+      : myWndId( id ), myOn( on ) {}
+    virtual void Execute()
+    {
+      SUIT_ViewWindow* wnd = getWnd( myWndId );
+      if ( wnd ) wnd->setClosable( myOn );
+    }
+  };
+  ProcessVoidEvent( new TEvent( id, on ) );
+}
+
+/*!
+  \fn bool SalomePyQt::isViewClosable( const int id )
+  \brief Check whether view is closable (i.e. can be closed by the user)
+  \param id window identifier
+  \return \c true if view is closable or \c false otherwise 
+*/
+
+class TIsViewClosable: public SALOME_Event
+{
+public:
+  typedef bool TResult;
+  TResult myResult;
+  int myWndId;
+  TIsViewClosable( const int id )
+    : myResult( true ),
+      myWndId( id ) {}
+  virtual void Execute() 
+  {
+    SUIT_ViewWindow* wnd = getWnd( myWndId );
+    if ( wnd )
+      myResult = wnd->closable();
+  }
+};
+
+bool SalomePyQt::isViewClosable( const int id )
+{
+  return ProcessEvent( new TIsViewClosable( id ) );
+}
+
 /*!
   \fn bool SalomePyQt::groupAllViews()
   \brief Group all views to the single tab area
index 0aaa9f395cb0772080c90bfa7e8cb4475cbf8dd0..885b708db24f60ed7caee549d5525758bbeba5d9 100644 (file)
@@ -230,10 +230,13 @@ public:
   static QList<int>        findViews( const QString& );
   static bool              activateView( const int );
   static int               createView( const QString& );
+  static int               createView( const QString&, QWidget* );
   static bool              closeView( const int );
   static int               cloneView( const int );
-  static bool              isViewVisible( const int id );
-  
+  static bool              isViewVisible( const int );
+  static void              setViewClosable( const int, const bool );
+  static bool              isViewClosable( const int );
+
   static bool              groupAllViews();
   static bool              splitView( const int, const Orientation, const Action );
   static bool              moveView( const int, const int, const bool );
index 60bbb4f420ac7de3c64d4312399eea3548fea43f..229c82736250d03c224fedeae4a8c229a3201826 100644 (file)
@@ -317,9 +317,12 @@ public:
   static QList<int>        findViews( const QString& ) /ReleaseGIL/ ;
   static bool              activateView( const int ) /ReleaseGIL/ ;
   static int               createView( const QString& ) /ReleaseGIL/ ;
+  static int               createView( const QString&, QWidget* ) /ReleaseGIL/ ;
   static bool              closeView( const int ) /ReleaseGIL/ ;
   static int               cloneView( const int ) /ReleaseGIL/ ;
   static bool              isViewVisible( const int id ) /ReleaseGIL/ ;
+  static void              setViewClosable( const int id, const bool ) /ReleaseGIL/ ;
+  static bool              isViewClosable( const int id ) /ReleaseGIL/ ;
   
   static bool              groupAllViews() /ReleaseGIL/ ;
   static bool              splitView( const int, Orientation, Action ) /ReleaseGIL/ ;
index 212702c5fabc301bd74c6e3dac37f7afcbf04ef8..1e55aecef99c4849abfa6fe2a640b1e73897c159 100755 (executable)
@@ -46,9 +46,9 @@ SUIT_ViewManager::SUIT_ViewManager( SUIT_Study* theStudy,
                                     SUIT_Desktop* theDesktop,
                                     SUIT_ViewModel* theViewModel )
 : QObject( 0 ),
-myDesktop( theDesktop ),
-myTitle( "Default: %M - viewer %V" ),
-myStudy( NULL )
+  myDesktop( theDesktop ),
+  myTitle( "Default: %M - viewer %V" ),
+  myStudy( NULL )
 {
   myViewModel = 0;
   myActiveView = 0;
@@ -209,6 +209,9 @@ bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
   connect(theView, SIGNAL(closing(SUIT_ViewWindow*)),
           this,    SLOT(onClosingView(SUIT_ViewWindow*)));
 
+  connect(theView, SIGNAL(tryClosing(SUIT_ViewWindow*)),
+          this,    SIGNAL(tryCloseView(SUIT_ViewWindow*)));
+
   connect(theView, SIGNAL(mousePressed(SUIT_ViewWindow*, QMouseEvent*)),
           this,    SLOT(onMousePressed(SUIT_ViewWindow*, QMouseEvent*)));
 
@@ -261,6 +264,7 @@ void SUIT_ViewManager::closeView( SUIT_ViewWindow* theView )
 
   QPointer<SUIT_ViewWindow> view( theView );
 
+  view->setClosable( false );
   view->hide();
 
   if ( !view->testAttribute( Qt::WA_DeleteOnClose ) )
index a011b11fb2a869fc4f2781e732a82ed61a69f268..07c8ca8bf5bc1bcf1aa662ec1daf817229f07276 100755 (executable)
@@ -89,6 +89,7 @@ public slots:
 
 signals:
   void             lastViewClosed(SUIT_ViewManager*);
+  void             tryCloseView(SUIT_ViewWindow*);
   void             deleteView(SUIT_ViewWindow*);
   void             viewCreated(SUIT_ViewWindow*);
   void             mousePress(SUIT_ViewWindow*, QMouseEvent*);
index 68d27fb67e197549bf8b59a9881af77a834930fc..7ef4d882d190eef54e4f3f005dfdd49a00f89139 100755 (executable)
@@ -136,7 +136,8 @@ void SUIT_ViewWindow::setDestructiveClose( const bool on )
 void SUIT_ViewWindow::closeEvent( QCloseEvent* e )
 {
   e->ignore();
-  emit closing( this );
+  emit tryClosing( this );
+  if ( closable() ) emit closing( this );
 }
 
 /*! Context menu requested for event \a e.
@@ -215,10 +216,25 @@ bool SUIT_ViewWindow::action( const int  )
   return true;
 }
 
+/*! Returns \c true if view window can be closed by the user
+*/
+bool SUIT_ViewWindow::closable() const
+{
+  QVariant val = property( "closable" );
+  return !val.isValid() || val.toBool();
+}
+
+/*! Set / reset "closable" option of the view window
+*/
+bool SUIT_ViewWindow::setClosable( const bool on )
+{
+  setProperty( "closable", on );
+}
+
 /*!
   \return string containing visual parameters of window
 */
-QString   SUIT_ViewWindow::getVisualParameters()
+QString SUIT_ViewWindow::getVisualParameters()
 {
   return "empty";
 }
index 5b09273dab913c222b9fcf11b6e265b55e69a774..2bb6a39b457936950218862186738c5cd54f714d 100755 (executable)
@@ -53,6 +53,9 @@ public:
 
   bool              onAccelAction( int );
 
+  bool              closable() const;
+  bool              setClosable( const bool );
+
   virtual QString   getVisualParameters();
   virtual void      setVisualParameters( const QString& parameters );
 
@@ -70,6 +73,7 @@ public slots:
   virtual void      onDumpView();
 
 signals:
+  void              tryClosing( SUIT_ViewWindow* );
   void              closing( SUIT_ViewWindow* );
   void              mousePressed( SUIT_ViewWindow*, QMouseEvent* );
   void              mouseReleased( SUIT_ViewWindow*, QMouseEvent* );
@@ -95,4 +99,4 @@ private:
   QMap<QString, QVariant> myCustomData;
 };
 
-#endif // !defined(AFX_SUIT_VIEWWINDOW_H__82C3D51A_6F10_45B0_BCFE_3CB3EF596A4D__INCLUDED_)
+#endif // SUIT_VIEWWINDOW_H
index 3842a639f648364983a395d892007ed9cad74a7f..232e9ef8354ae17caf9e5ca925764cabbdc1a120 100755 (executable)
@@ -128,6 +128,7 @@ dist_salomeres_DATA=\
        resources/vtk_view_perspective.png \
        resources/vtk_view_parameters.png \
        resources/vtk_view_style_switch.png \
+       resources/vtk_view_zooming_style_switch.png \
        resources/vtk_view_recording_start.png \
        resources/vtk_view_recording_play.png \
        resources/vtk_view_recording_pause.png \
index b9cd1aec049192d1333e833e98d0e8a6dc6c7d9d..ec679bdcb1e093efaa15bdffd82f80ea3e019eee 100644 (file)
@@ -93,7 +93,8 @@ SVTK_InteractorStyle::SVTK_InteractorStyle():
   myControllerIncrement(SVTK_ControllerIncrement::New()),
   myControllerOnKeyDown(SVTK_ControllerOnKeyDown::New()),
   myHighlightSelectionPointActor(SVTK_Actor::New()),
-  myRectBand(0)
+  myRectBand(0),
+  myIsAdvancedZoomingEnabled(false)
 {
   myPointPicker->Delete();
 
@@ -289,8 +290,22 @@ void SVTK_InteractorStyle::DollyXY(int dx, int dy)
   double zoomFactor = pow((double)1.1, dxf + dyf);
   
   vtkCamera *aCam = GetCurrentRenderer()->GetActiveCamera();
-  if (aCam->GetParallelProjection())
+  if (aCam->GetParallelProjection()) {
+    int x0 = 0, y0 = 0, x1 = 0, y1 = 0;
+    if( IsAdvancedZoomingEnabled() ) { // zoom relatively to the cursor
+      int* aSize = GetCurrentRenderer()->GetRenderWindow()->GetSize();
+      int w = aSize[0];
+      int h = aSize[1];
+      x0 = w / 2;
+      y0 = h / 2;
+      x1 = myOtherPoint.x();
+      y1 = h - myOtherPoint.y();
+      TranslateView( x0, y0, x1, y1 );
+    }
     aCam->SetParallelScale(aCam->GetParallelScale()/zoomFactor);
+    if( IsAdvancedZoomingEnabled() )
+      TranslateView( x1, y1, x0, y0 );
+  }
   else{
     aCam->Dolly(zoomFactor); // Move camera in/out along projection direction
     GetCurrentRenderer()->ResetCameraClippingRange(); 
index 51bb52657bb64af18e714aa6ce37f77ea4927c07..f002752e5a61e307969d3d8fc937a1de0bb2e90c 100644 (file)
@@ -228,6 +228,9 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
 
   int   CurrentState() const { return State; }
 
+  void SetAdvancedZoomingEnabled( const bool theState ) { myIsAdvancedZoomingEnabled = theState; }
+  bool IsAdvancedZoomingEnabled() const { return myIsAdvancedZoomingEnabled; }
+
   protected:
   SVTK_InteractorStyle();
   ~SVTK_InteractorStyle();
@@ -350,6 +353,8 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   bool                            myBBFirstCheck;
 
   QRubberBand*                    myRectBand; //!< selection rectangle rubber band
+
+  bool                            myIsAdvancedZoomingEnabled;
 };
 
 #ifdef WIN32
index 35c168563f9cd3980c9b897a508f84bab3c2b293..58d4e47d86df71669c2c964cad2d23c3aa8d01af 100644 (file)
@@ -80,6 +80,7 @@ SVTK_Viewer::SVTK_Viewer()
   myIncrementMode = 0;
   myProjMode = 0;
   myStyle = 0;
+  myZoomingStyle = 0;
   mySpaceBtn[0] = 1;
   mySpaceBtn[1] = 2;
   mySpaceBtn[2] = 9;
@@ -134,6 +135,7 @@ SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop )
   aViewWindow->SetStaticTrihedronVisible( isStaticTrihedronVisible() );
   aViewWindow->SetProjectionMode( projectionMode() );
   aViewWindow->SetInteractionStyle( interactionStyle() );
+  aViewWindow->SetZoomingStyle( zoomingStyle() );
   aViewWindow->SetIncrementalSpeed( incrementalSpeed(), incrementalSpeedMode() );
   aViewWindow->SetSpacemouseButtons( spacemouseBtn(1), spacemouseBtn(2), spacemouseBtn(3) );
 
@@ -262,6 +264,32 @@ void SVTK_Viewer::setInteractionStyle( const int theStyle )
   }
 }
 
+/*!
+  \return zooming style
+*/
+int SVTK_Viewer::zoomingStyle() const
+{
+  return myZoomingStyle;
+}
+
+/*!
+  Sets zooming style: 0 - standard, 1 - advanced (at cursor)
+  \param theStyle - new zooming style
+*/
+void SVTK_Viewer::setZoomingStyle( const int theStyle )
+{
+  myZoomingStyle = theStyle;
+  
+  if (SUIT_ViewManager* aViewManager = getViewManager()) {
+    QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
+    for ( uint i = 0; i < aViews.count(); i++ )
+    {
+      if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
+        aView->SetZoomingStyle( theStyle );
+    }
+  }
+}
+
 /*!
   \return incremental speed value
 */
index cf4ca31fe06ab50ffd0db1e647d7e387a8cead7c..5e038d2c79d3f92d4531c729ed71044b243c6b7a 100644 (file)
@@ -96,6 +96,12 @@ public:
   //! Sets interaction style
   void setInteractionStyle( const int );
 
+  //! Gets zooming style
+  int zoomingStyle() const;
+
+  //! Sets zooming style
+  void setZoomingStyle( const int );
+
   //! Get incremental speed (see #SVTK_InteractorStyle::ControllerIncrement)
   int incrementalSpeed() const;
 
@@ -175,6 +181,7 @@ private:
   int    myIncrementMode;
   int    myProjMode;
   int    myStyle;
+  int    myZoomingStyle;
   int    mySpaceBtn[3];
 };
 
index 440bf08cedf48ba3edf07fc020545093c48138f6..a0118be865f5ac2373de72d6313b144dd8746e9d 100755 (executable)
@@ -171,9 +171,9 @@ void SVTK_ViewWindow::Initialize(SVTK_ViewModelBase* theModel)
   myViewParameterDlg = new SVTK_ViewParameterDlg
     ( getAction( ViewParametersId ), this, "SVTK_ViewParameterDlg" );
   
-  SVTK_InteractorStyle* aStyle = SVTK_InteractorStyle::New();
-  myInteractor->PushInteractorStyle(aStyle);
-  aStyle->Delete();
+  myDefaultInteractorStyle = SVTK_InteractorStyle::New();
+  myInteractor->PushInteractorStyle(myDefaultInteractorStyle);
+  myDefaultInteractorStyle->Delete();
   
   myRecorder = SVTK_Recorder::New();
   
@@ -680,6 +680,15 @@ void SVTK_ViewWindow::SetInteractionStyle(const int theStyle)
   onSwitchInteractionStyle( theStyle==1 );
 }
 
+/*!
+  Sets actual zooming style
+  \param theStyle - type of zooming style ( 0 - standard, 1 - advanced (at cursor) )
+*/
+void SVTK_ViewWindow::SetZoomingStyle(const int theStyle)
+{
+  onSwitchZoomingStyle( theStyle==1 );
+}
+
 /*!
   Switches "keyboard free" interaction style on/off
 */
@@ -710,6 +719,22 @@ void SVTK_ViewWindow::onSwitchInteractionStyle(bool theOn)
   if ( a->isChecked() != theOn ) a->setChecked( theOn );
 }
 
+/*!
+  Toogles advanced zooming style (relatively to the cursor position) on/off
+*/
+void SVTK_ViewWindow::onSwitchZoomingStyle( bool theOn )
+{
+  if( myDefaultInteractorStyle.GetPointer() )
+    myDefaultInteractorStyle->SetAdvancedZoomingEnabled( theOn );
+  if( myKeyFreeInteractorStyle.GetPointer() )
+    myKeyFreeInteractorStyle->SetAdvancedZoomingEnabled( theOn );
+
+  // update action state if method is called outside
+  QtxAction* a = getAction( SwitchZoomingStyleId );
+  if ( a->isChecked() != theOn )
+    a->setChecked( theOn );
+}
+
 /*!
   Sets incremental speed
   \param theValue - new incremental speed
@@ -1549,8 +1574,14 @@ void SVTK_ViewWindow::activateStartPointSelection()
 */
 void SVTK_ViewWindow::onPerspectiveMode()
 {
+  bool anIsParallelMode = toolMgr()->action( ParallelModeId )->isChecked();
+
+  // advanced zooming is not available in perspective mode
+  if( QtxAction* anAction = getAction( SwitchZoomingStyleId ) )
+    anAction->setEnabled( anIsParallelMode );
+
   vtkCamera* aCamera = getRenderer()->GetActiveCamera();
-  aCamera->SetParallelProjection(toolMgr()->action( ParallelModeId )->isChecked());
+  aCamera->SetParallelProjection(anIsParallelMode);
   GetInteractor()->GetDevice()->CreateTimer(VTKI_TIMER_FIRST);
 }
 
@@ -1764,6 +1795,15 @@ void SVTK_ViewWindow::createActions(SUIT_ResourceMgr* theResourceMgr)
   connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchInteractionStyle(bool)));
   mgr->registerAction( anAction, SwitchInteractionStyleId );
 
+  // Switch between zomming styles
+  anAction = new QtxAction(tr("MNU_SVTK_ZOOMING_STYLE_SWITCH"), 
+                           theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_ZOOMING_STYLE_SWITCH" ) ),
+                           tr( "MNU_SVTK_ZOOMING_STYLE_SWITCH" ), 0, this);
+  anAction->setStatusTip(tr("DSC_SVTK_ZOOMING_STYLE_SWITCH"));
+  anAction->setCheckable(true);
+  connect(anAction, SIGNAL(toggled(bool)), this, SLOT(onSwitchZoomingStyle(bool)));
+  mgr->registerAction( anAction, SwitchZoomingStyleId );
+
   // Start recording
   myStartAction = new QtxAction(tr("MNU_SVTK_RECORDING_START"), 
                                 theResourceMgr->loadPixmap( "VTKViewer", tr( "ICON_SVTK_RECORDING_START" ) ),
@@ -1809,6 +1849,7 @@ void SVTK_ViewWindow::createToolBar()
   
   mgr->append( DumpId, myToolBar );
   mgr->append( SwitchInteractionStyleId, myToolBar );
+  mgr->append( SwitchZoomingStyleId, myToolBar );
   mgr->append( ViewTrihedronId, myToolBar );
 
   QtxMultiAction* aScaleAction = new QtxMultiAction( this );
index 9d6e2470740f81d3429783504b4c033cc5f673a9..9c2f827009fccb05ea49371907ca9601518f7ebe 100755 (executable)
@@ -59,6 +59,7 @@ class SVTK_NonIsometricDlg;
 class SVTK_UpdateRateDlg;
 class SVTK_CubeAxesDlg;
 class SVTK_SetRotationPointDlg;
+class SVTK_InteractorStyle;
 class SVTK_KeyFreeInteractorStyle;
 class SVTK_ViewParameterDlg;
 class SVTK_Recorder;
@@ -220,6 +221,9 @@ class SVTK_EXPORT SVTK_ViewWindow : public SUIT_ViewWindow
   //! Redirect the request to #SVTK_MainWindow::SetInteractionStyle
   virtual void SetInteractionStyle( const int );
 
+  //! Redirect the request to #SVTK_MainWindow::SetZoomingStyle
+  virtual void SetZoomingStyle( const int );
+
   //! Redirect the request to #SVTK_MainWindow::SetSpacemouseButtons
   virtual void SetSpacemouseButtons( const int, const int, const int );
 
@@ -294,6 +298,7 @@ public slots:
   void onViewParameters(bool theIsActivate);
 
   void onSwitchInteractionStyle(bool theOn);
+  void onSwitchZoomingStyle(bool theOn);
 
   void onStartRecording();
   void onPlayRecording();
@@ -373,6 +378,7 @@ protected:
          FrontId, BackId, TopId, BottomId, LeftId, RightId, ResetId, 
          ViewTrihedronId, NonIsometric, GraduatedAxes, UpdateRate,
          ParallelModeId, ProjectionModeId, ViewParametersId, SwitchInteractionStyleId,
+         SwitchZoomingStyleId,
          StartRecordingId, PlayRecordingId, PauseRecordingId, StopRecordingId };
 
 
@@ -381,6 +387,7 @@ protected:
   SVTK_ViewModelBase* myModel;
 
   SVTK_RenderWindowInteractor* myInteractor;
+  vtkSmartPointer<SVTK_InteractorStyle> myDefaultInteractorStyle;
   vtkSmartPointer<SVTK_KeyFreeInteractorStyle> myKeyFreeInteractorStyle;
 
   QString myVisualParams; // used for delayed setting of view parameters 
index 2236a59bae8f5b8ae3def0ee936b0f91bcf786a1..6150f90b3501c67ba6c96c9143ab73678d075db5 100644 (file)
         <source>ICON_SVTK_STYLE_SWITCH</source>
         <translation>vtk_view_style_switch.png</translation>
     </message>
+    <message>
+        <source>ICON_SVTK_ZOOMING_STYLE_SWITCH</source>
+        <translation>vtk_view_zooming_style_switch.png</translation>
+    </message>
     <message>
         <source>ICON_SVTK_RECORDING_START</source>
         <translation>vtk_view_recording_start.png</translation>
index 056572c0e928d8f700a804acdf263b6f5102b1f8..b717790b966b0adb9ec72dc38b15158bca29ca9e 100644 (file)
         <source>MNU_SVTK_STYLE_SWITCH</source>
         <translation>Interaction Style Switch</translation>
     </message>
+    <message>
+        <source>DSC_SVTK_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zooming style switch</translation>
+    </message>
+    <message>
+        <source>MNU_SVTK_ZOOMING_STYLE_SWITCH</source>
+        <translation>Zomming style switch</translation>
+    </message>
 </context>
 <context>
     <name>SVTK_FontWidget</name>
diff --git a/src/SVTK/resources/vtk_view_zooming_style_switch.png b/src/SVTK/resources/vtk_view_zooming_style_switch.png
new file mode 100755 (executable)
index 0000000..8f3a486
Binary files /dev/null and b/src/SVTK/resources/vtk_view_zooming_style_switch.png differ
index fb80a99b18d799edc90f7bf3cfb6a75d82002623..a8c56320c57f512d6215ce3cc254bf39f8a8c48e 100644 (file)
     <parameter name="iso_number_v"   value="1" />
     <parameter name="trihedron_size" value="100" />
     <parameter name="navigation_mode" value="0"/>
+    <parameter name="zooming_mode"   value="0" />
  </section>
  <section name="VTKViewer" >
     <!-- VTK viewer preferences -->
     <parameter name="group_names_transparency" value="0.5"/>
     <parameter name="projection_mode" value="0"/>
     <parameter name="navigation_mode" value="0"/>
+    <parameter name="zooming_mode" value="0" />
     <parameter name="speed_mode" value="0"/>
     <parameter name="speed_value" value="10"/>
     <parameter name="show_static_trihedron" value="true" />