From: vsr Date: Mon, 15 Nov 2010 06:49:50 +0000 (+0000) Subject: Merge from PHASE_25_BR 14/11/2010 X-Git-Tag: RELIQUAT_5x_15112010~3 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=7250f116546c44743d9cf86ac2bae4823a2043e5;p=modules%2Fgui.git Merge from PHASE_25_BR 14/11/2010 --- diff --git a/doc/salome/gui/images/image111.png b/doc/salome/gui/images/image111.png new file mode 100755 index 000000000..8f3a48670 Binary files /dev/null and b/doc/salome/gui/images/image111.png differ diff --git a/doc/salome/gui/images/image157.png b/doc/salome/gui/images/image157.png index dec5836f9..3c4b5040b 100644 Binary files a/doc/salome/gui/images/image157.png and b/doc/salome/gui/images/image157.png differ diff --git a/doc/salome/gui/images/occviewer_toolbar.png b/doc/salome/gui/images/occviewer_toolbar.png index 23b236990..0cc7d3e80 100644 Binary files a/doc/salome/gui/images/occviewer_toolbar.png and b/doc/salome/gui/images/occviewer_toolbar.png differ diff --git a/doc/salome/gui/images/pref12.png b/doc/salome/gui/images/pref12.png index 5bea82dc1..bfbc61685 100755 Binary files a/doc/salome/gui/images/pref12.png and b/doc/salome/gui/images/pref12.png differ diff --git a/doc/salome/gui/input/occ_3d_viewer.doc b/doc/salome/gui/input/occ_3d_viewer.doc index b84fb3885..f1f3acba6 100644 --- a/doc/salome/gui/input/occ_3d_viewer.doc +++ b/doc/salome/gui/input/occ_3d_viewer.doc @@ -24,6 +24,12 @@ left mouse button, panning - by middle mouse button, zooming - by left and middl mouse buttons pressed simultaneously.
+\image html image111.png +\n
Zooming style switch - allows to switch between standard +(zooming at the center of the view) and advanced (zooming at the current cursor +position) zooming styles.
+
+ \image html image88.png \n
Show/Hide Trihedron - shows or hides coordinate axes.

diff --git a/doc/salome/gui/input/salome_preferences.doc b/doc/salome/gui/input/salome_preferences.doc index 2a6378900..8e4065d36 100644 --- a/doc/salome/gui/input/salome_preferences.doc +++ b/doc/salome/gui/input/salome_preferences.doc @@ -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. +
  • Zooming mode - this option allows to choose a zooming mode.
  • +
  • [+]/[-] Speed Increment - defines the number of units by which the speed increases or respectively decreases after pressing [+] or [-] keyboard buttons.
  • diff --git a/doc/salome/gui/input/vtk_3d_viewer.doc b/doc/salome/gui/input/vtk_3d_viewer.doc index a33ab8e16..e5b73f294 100644 --- a/doc/salome/gui/input/vtk_3d_viewer.doc +++ b/doc/salome/gui/input/vtk_3d_viewer.doc @@ -24,6 +24,13 @@ left mouse button, panning - by middle mouse button, zooming - by left and middl mouse buttons pressed simultaneously.
    +\image html image111.png +\n
    Zooming style switch - 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.
    +
    + \image html image88.png \n
    Show/Hide Trihedron - shows or hides coordinate axes.

    diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index 12b1e9c6b..8ad007ba5 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -54,6 +54,7 @@ #include "LightApp_OBSelector.h" #include "LightApp_SelectionMgr.h" #include "LightApp_DataObject.h" +#include "LightApp_WgViewModel.h" #include @@ -176,6 +177,14 @@ #include #endif +#include + +#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 lst; + viewManagers( OCCViewer_Viewer::Type(), lst ); + QListIterator 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 lst; +#ifndef DISABLE_SALOMEOBJECT + viewManagers( SVTK_Viewer::Type(), lst ); + QListIterator it( lst ); + while ( it.hasNext() ) + { + SUIT_ViewModel* vm = it.next()->getViewModel(); + if ( !vm || !vm->inherits( "SVTK_Viewer" ) ) + continue; + + SVTK_Viewer* vtkVM = dynamic_cast( 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< #include +#include 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 index 000000000..e4a337cb4 --- /dev/null +++ b/src/LightApp/LightApp_WgViewModel.cxx @@ -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 index 000000000..a75b628f3 --- /dev/null +++ b/src/LightApp/LightApp_WgViewModel.h @@ -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 diff --git a/src/LightApp/Makefile.am b/src/LightApp/Makefile.am index c1edf8b1b..a28fcc3bd 100755 --- a/src/LightApp/Makefile.am +++ b/src/LightApp/Makefile.am @@ -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 diff --git a/src/LightApp/resources/LightApp.xml b/src/LightApp/resources/LightApp.xml index 9395de3b3..cfe20ec81 100644 --- a/src/LightApp/resources/LightApp.xml +++ b/src/LightApp/resources/LightApp.xml @@ -123,6 +123,7 @@ +
    @@ -132,6 +133,7 @@ + diff --git a/src/LightApp/resources/LightApp_msg_en.ts b/src/LightApp/resources/LightApp_msg_en.ts index cc69e4730..7b3a8b008 100644 --- a/src/LightApp/resources/LightApp_msg_en.ts +++ b/src/LightApp/resources/LightApp_msg_en.ts @@ -134,6 +134,18 @@ The changes will be applied on the next application session. PREF_KEYFREE_STYLE Keyboard free style + + PREF_ZOOMING + Zooming: + + + PREF_ZOOMING_AT_CENTER + Relative to the view's center + + + PREF_ZOOMING_AT_CURSOR + Relative to the cursor + PREF_INCREMENTAL_SPEED Speed increment: diff --git a/src/OCCViewer/Makefile.am b/src/OCCViewer/Makefile.am index 4d56e731b..887374043 100755 --- a/src/OCCViewer/Makefile.am +++ b/src/OCCViewer/Makefile.am @@ -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 \ diff --git a/src/OCCViewer/OCCViewer_ViewModel.cxx b/src/OCCViewer/OCCViewer_ViewModel.cxx index caea77326..3e3c962aa 100755 --- a/src/OCCViewer/OCCViewer_ViewModel.cxx +++ b/src/OCCViewer/OCCViewer_ViewModel.cxx @@ -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 wins = myViewManager->getViews(); + for ( int i = 0; i < (int)wins.count(); i++ ) + { + OCCViewer_ViewWindow* win = ::qobject_cast( wins.at( i ) ); + if ( win ) + win->setZoomingStyle( theStyle ); + } +} + /*! Sets selection enabled status \param isEnabled - new status diff --git a/src/OCCViewer/OCCViewer_ViewModel.h b/src/OCCViewer/OCCViewer_ViewModel.h index fc0463e79..8a61c8b46 100755 --- a/src/OCCViewer/OCCViewer_ViewModel.h +++ b/src/OCCViewer/OCCViewer_ViewModel.h @@ -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; diff --git a/src/OCCViewer/OCCViewer_ViewPort3d.cxx b/src/OCCViewer/OCCViewer_ViewPort3d.cxx index f59075989..0703c8f80 100755 --- a/src/OCCViewer/OCCViewer_ViewPort3d.cxx +++ b/src/OCCViewer/OCCViewer_ViewPort3d.cxx @@ -51,6 +51,14 @@ static int sx = 0; static int sy = 0; static Standard_Boolean zRotation = Standard_False; +#include + +#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 ); } } diff --git a/src/OCCViewer/OCCViewer_ViewPort3d.h b/src/OCCViewer/OCCViewer_ViewPort3d.h index 469ce17cb..125fcfa93 100755 --- a/src/OCCViewer/OCCViewer_ViewPort3d.h +++ b/src/OCCViewer/OCCViewer_ViewPort3d.h @@ -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 diff --git a/src/OCCViewer/OCCViewer_ViewWindow.cxx b/src/OCCViewer/OCCViewer_ViewWindow.cxx index 3f542c61d..a1200fd76 100755 --- a/src/OCCViewer/OCCViewer_ViewWindow.cxx +++ b/src/OCCViewer/OCCViewer_ViewWindow.cxx @@ -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( 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 diff --git a/src/OCCViewer/OCCViewer_ViewWindow.h b/src/OCCViewer/OCCViewer_ViewWindow.h index 02300ef18..3850bb2a5 100755 --- a/src/OCCViewer/OCCViewer_ViewWindow.h +++ b/src/OCCViewer/OCCViewer_ViewWindow.h @@ -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 ); diff --git a/src/OCCViewer/resources/OCCViewer_images.ts b/src/OCCViewer/resources/OCCViewer_images.ts index bcc888b20..429a1ad1b 100644 --- a/src/OCCViewer/resources/OCCViewer_images.ts +++ b/src/OCCViewer/resources/OCCViewer_images.ts @@ -124,5 +124,9 @@ ICON_OCCVIEWER_STYLE_SWITCH occ_view_style_switch.png + + ICON_OCCVIEWER_ZOOMING_STYLE_SWITCH + occ_view_zooming_style_switch.png + diff --git a/src/OCCViewer/resources/OCCViewer_msg_en.ts b/src/OCCViewer/resources/OCCViewer_msg_en.ts index aea134ee6..c19bb5d05 100644 --- a/src/OCCViewer/resources/OCCViewer_msg_en.ts +++ b/src/OCCViewer/resources/OCCViewer_msg_en.ts @@ -231,6 +231,14 @@ MNU_STYLE_SWITCH Interaction style switch + + DSC_ZOOMING_STYLE_SWITCH + Zooming style switch + + + MNU_ZOOMING_STYLE_SWITCH + Zooming style switch + OCC_IMAGE_FILES Images Files (*.bmp *.png *.jpg *.jpeg) 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 index 000000000..8f3a48670 Binary files /dev/null and b/src/OCCViewer/resources/occ_view_zooming_style_switch.png differ diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx index 14bcf08bd..c89d9cc0b 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx @@ -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. diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h b/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h index 950f723ed..f4a35eaeb 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h +++ b/src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h @@ -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: diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx index 50861058a..675ac783b 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx @@ -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 )) { diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.h b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.h index 90fce3969..1fa012262 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.h +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.h @@ -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* ); diff --git a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx index bfda59f2d..f466eb966 100644 --- a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx +++ b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx @@ -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 diff --git a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h index 0aaa9f395..885b708db 100644 --- a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h +++ b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h @@ -230,10 +230,13 @@ public: static QList 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 ); diff --git a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip index 60bbb4f42..229c82736 100644 --- a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip +++ b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip @@ -317,9 +317,12 @@ public: static QList 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/ ; diff --git a/src/SUIT/SUIT_ViewManager.cxx b/src/SUIT/SUIT_ViewManager.cxx index 212702c5f..1e55aecef 100755 --- a/src/SUIT/SUIT_ViewManager.cxx +++ b/src/SUIT/SUIT_ViewManager.cxx @@ -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 view( theView ); + view->setClosable( false ); view->hide(); if ( !view->testAttribute( Qt::WA_DeleteOnClose ) ) diff --git a/src/SUIT/SUIT_ViewManager.h b/src/SUIT/SUIT_ViewManager.h index a011b11fb..07c8ca8bf 100755 --- a/src/SUIT/SUIT_ViewManager.h +++ b/src/SUIT/SUIT_ViewManager.h @@ -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*); diff --git a/src/SUIT/SUIT_ViewWindow.cxx b/src/SUIT/SUIT_ViewWindow.cxx index 68d27fb67..7ef4d882d 100755 --- a/src/SUIT/SUIT_ViewWindow.cxx +++ b/src/SUIT/SUIT_ViewWindow.cxx @@ -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"; } diff --git a/src/SUIT/SUIT_ViewWindow.h b/src/SUIT/SUIT_ViewWindow.h index 5b09273da..2bb6a39b4 100755 --- a/src/SUIT/SUIT_ViewWindow.h +++ b/src/SUIT/SUIT_ViewWindow.h @@ -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 myCustomData; }; -#endif // !defined(AFX_SUIT_VIEWWINDOW_H__82C3D51A_6F10_45B0_BCFE_3CB3EF596A4D__INCLUDED_) +#endif // SUIT_VIEWWINDOW_H diff --git a/src/SVTK/Makefile.am b/src/SVTK/Makefile.am index 3842a639f..232e9ef83 100755 --- a/src/SVTK/Makefile.am +++ b/src/SVTK/Makefile.am @@ -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 \ diff --git a/src/SVTK/SVTK_InteractorStyle.cxx b/src/SVTK/SVTK_InteractorStyle.cxx index b9cd1aec0..ec679bdcb 100644 --- a/src/SVTK/SVTK_InteractorStyle.cxx +++ b/src/SVTK/SVTK_InteractorStyle.cxx @@ -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(); diff --git a/src/SVTK/SVTK_InteractorStyle.h b/src/SVTK/SVTK_InteractorStyle.h index 51bb52657..f002752e5 100644 --- a/src/SVTK/SVTK_InteractorStyle.h +++ b/src/SVTK/SVTK_InteractorStyle.h @@ -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 diff --git a/src/SVTK/SVTK_ViewModel.cxx b/src/SVTK/SVTK_ViewModel.cxx index 35c168563..58d4e47d8 100644 --- a/src/SVTK/SVTK_ViewModel.cxx +++ b/src/SVTK/SVTK_ViewModel.cxx @@ -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 aViews = aViewManager->getViews(); + for ( uint i = 0; i < aViews.count(); i++ ) + { + if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) + aView->SetZoomingStyle( theStyle ); + } + } +} + /*! \return incremental speed value */ diff --git a/src/SVTK/SVTK_ViewModel.h b/src/SVTK/SVTK_ViewModel.h index cf4ca31fe..5e038d2c7 100644 --- a/src/SVTK/SVTK_ViewModel.h +++ b/src/SVTK/SVTK_ViewModel.h @@ -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]; }; diff --git a/src/SVTK/SVTK_ViewWindow.cxx b/src/SVTK/SVTK_ViewWindow.cxx index 440bf08ce..a0118be86 100755 --- a/src/SVTK/SVTK_ViewWindow.cxx +++ b/src/SVTK/SVTK_ViewWindow.cxx @@ -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 ); diff --git a/src/SVTK/SVTK_ViewWindow.h b/src/SVTK/SVTK_ViewWindow.h index 9d6e24707..9c2f82700 100755 --- a/src/SVTK/SVTK_ViewWindow.h +++ b/src/SVTK/SVTK_ViewWindow.h @@ -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 myDefaultInteractorStyle; vtkSmartPointer myKeyFreeInteractorStyle; QString myVisualParams; // used for delayed setting of view parameters diff --git a/src/SVTK/resources/SVTK_images.ts b/src/SVTK/resources/SVTK_images.ts index 2236a59ba..6150f90b3 100644 --- a/src/SVTK/resources/SVTK_images.ts +++ b/src/SVTK/resources/SVTK_images.ts @@ -56,6 +56,10 @@ ICON_SVTK_STYLE_SWITCH vtk_view_style_switch.png + + ICON_SVTK_ZOOMING_STYLE_SWITCH + vtk_view_zooming_style_switch.png + ICON_SVTK_RECORDING_START vtk_view_recording_start.png diff --git a/src/SVTK/resources/SVTK_msg_en.ts b/src/SVTK/resources/SVTK_msg_en.ts index 056572c0e..b717790b9 100644 --- a/src/SVTK/resources/SVTK_msg_en.ts +++ b/src/SVTK/resources/SVTK_msg_en.ts @@ -187,6 +187,14 @@ MNU_SVTK_STYLE_SWITCH Interaction Style Switch + + DSC_SVTK_ZOOMING_STYLE_SWITCH + Zooming style switch + + + MNU_SVTK_ZOOMING_STYLE_SWITCH + Zomming style switch + SVTK_FontWidget 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 index 000000000..8f3a48670 Binary files /dev/null and b/src/SVTK/resources/vtk_view_zooming_style_switch.png differ diff --git a/src/SalomeApp/resources/SalomeApp.xml b/src/SalomeApp/resources/SalomeApp.xml index fb80a99b1..a8c56320c 100644 --- a/src/SalomeApp/resources/SalomeApp.xml +++ b/src/SalomeApp/resources/SalomeApp.xml @@ -130,6 +130,7 @@ +
    @@ -146,6 +147,7 @@ +