X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FLightApp%2FLightApp_Application.cxx;h=3093f12fca6760f089daac4080e26e01de75965e;hb=77a9b7ac9d8b364358e1760e74a44e86557b79aa;hp=bb0e4a26f9d05579d6df7202a1d2efee93eea2e2;hpb=8d6c9d3695d4adf44b3465908fca687f40e1ce16;p=modules%2Fgui.git diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index bb0e4a26f..3093f12fc 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -116,6 +116,7 @@ #ifndef DISABLE_OCCVIEWER #include #include + #include #ifndef DISABLE_SALOMEOBJECT #include #else @@ -154,6 +155,12 @@ #include "PVViewer_ViewModel.h" #endif +#ifndef DISABLE_PYVIEWER + #include + #include + #include +#endif + #define VISIBILITY_COLUMN_WIDTH 25 @@ -311,6 +318,8 @@ LightApp_Application::LightApp_Application() myAutoSaveTimer->setSingleShot( true ); connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) ); + //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) ); + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ); @@ -427,6 +436,15 @@ void LightApp_Application::start() LightApp_EventFilter::Init(); } +/*!Closeapplication.*/ +void LightApp_Application::closeApplication() +{ + QProcess::startDetached( "HelpBrowser", + QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) ); + + CAM_Application::closeApplication(); +} + /*!Gets application name.*/ QString LightApp_Application::applicationName() const { @@ -497,8 +515,9 @@ bool LightApp_Application::activateModule( const QString& modName ) updateWindows(); updateViewManagers(); - if ( activeStudy() && activeStudy()->root() && objectBrowser() && objectBrowser()->root() != activeStudy()->root() ) { - objectBrowser()->setRoot( activeStudy()->root() ); + if ( activeStudy() && activeStudy()->root() && objectBrowser() ) { + if ( objectBrowser()->root() != activeStudy()->root() ) + objectBrowser()->setRoot( activeStudy()->root() ); updateObjectBrowser( true ); } return true; @@ -736,10 +755,13 @@ void LightApp_Application::createActions() createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S ); #endif #ifndef DISABLE_GRAPHICSVIEW - createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_R ); + createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C ); #endif #ifndef DISABLE_PVVIEWER - createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_W ); + createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A ); +#endif +#ifndef DISABLE_PYVIEWER + createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y ); #endif createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ), @@ -865,6 +887,11 @@ void LightApp_Application::onNewWindow() case NewPVViewId: type = PVViewer_Viewer::Type(); break; +#endif +#ifndef DISABLE_PYVIEWER + case NewPyViewerId: + type = PyViewer_Viewer::Type(); + break; #endif } @@ -1016,6 +1043,12 @@ void LightApp_Application::updateCommandsStatus() if( a ) a->setEnabled( activeStudy() ); #endif + +#ifndef DISABLE_PYVIEWER + a = action( NewPyViewerId ); + if( a ) + a->setEnabled( activeStudy() ); +#endif } /*! @@ -1108,6 +1141,7 @@ void LightApp_Application::onHelpContentsModule() else { QStringList parameters; parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) ); + parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() ); parameters << helpFile; QProcess::startDetached( "HelpBrowser", parameters ); } @@ -1178,6 +1212,7 @@ void LightApp_Application::onHelpContextModule( const QString& theComponentName, else { QStringList parameters; parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) ); + parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() ); parameters << QString( "%1#%2" ).arg( helpFile ).arg( context ); QProcess::startDetached( "HelpBrowser", parameters ); } @@ -1196,6 +1231,13 @@ void LightApp_Application::onSelectionChanged() action( EditPasteId )->setEnabled(canPaste); } +/*! + SLOT: Performs some actions when dockable windows are triggered +*/ +void LightApp_Application::onDockWindowVisibilityChanged( bool ) +{ +} + QWidget* LightApp_Application::dockWindow( const int id ) const { QWidget* wid = 0; @@ -1236,6 +1278,9 @@ void LightApp_Application::insertDockWindow( const int id, QWidget* wid ) dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) : QString( "%1Dock" ).arg( wid->objectName() ) ); dock->setWidget( wid ); + dock->toggleViewAction()->setData( QVariant( wid->objectName() ) ); + connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ), + this, SLOT( onDockWindowVisibilityChanged( bool ) ) ); QKeySequence accel = wid->property( "shortcut" ).value(); if ( !accel.isEmpty() ) @@ -1389,7 +1434,7 @@ SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, c if ( !aVM->getActiveView() ) aVM->createView(); else - aVM->getActiveView()->setFocus(); + desktop()->setActiveWindow( aVM->getActiveView() ); } else if ( create ) aVM = createViewManager( vmType ); @@ -1453,7 +1498,18 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType #ifndef DISABLE_PVVIEWER if( vmType == PVViewer_Viewer::Type() ) { - viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() ); + if ( viewMgr = dynamic_cast( getViewManager( vmType, false ) ) ) { + viewMgr->getActiveView()->setFocus(); + return 0; + } else { + viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() ); + } + } +#endif +#ifndef DISABLE_PYVIEWER + if( vmType == PyViewer_Viewer::Type() ) + { + viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() ); } #endif #ifndef DISABLE_OCCVIEWER @@ -1478,9 +1534,28 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ), resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() )); vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) ); + vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) ); + #if OCC_VERSION_LARGE > 0x06090000 + vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) ); + vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) ); + vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ), + resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() )); + vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ), + resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() )); + + vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) ); + vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) ); + vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) ); + #endif vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) ); vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) ); vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) ); + vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) ); + vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ), + resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ), + resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ), + resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) ); + viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr ); @@ -1499,6 +1574,9 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType if( vm ) { vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) ); + vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) ); + vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) ); + vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) ); vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) ); vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ), resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) ); @@ -1767,6 +1845,29 @@ void LightApp_Application::onRefresh() updateObjectBrowser( true ); } +/*!Private SLOT. Update actions after rename object.*/ +void LightApp_Application::onRenamed() +{ + activeStudy()->Modified(); + updateActions(); +} + +// IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position. +// To prevent reversion the window should be either aligned during movement and resize. +/*!Private SLOT. Update actions after rename object.*/ +/*void LightApp_Application::onMoved() +{ + OCCViewer_ViewManager* viewMgr = 0; + viewMgr = dynamic_cast( getViewManager( OCCViewer_Viewer::Type(), false ) ); + if (viewMgr) { + OCCViewer_ViewWindow* view = 0; + view = dynamic_cast( viewMgr->getActiveView() ); + if (view) { + view->getViewPort()->repaintViewAfterMove(); + } + } +} +*/ /*!Private SLOT. Support drag-and-drop operation.*/ void LightApp_Application::onDropped( const QList& objects, SUIT_DataObject* parent, int row, Qt::DropAction action ) { @@ -1897,6 +1998,9 @@ QWidget* LightApp_Application::createWindow( const int flag ) if ( proxyModel ) { connect( proxyModel, SIGNAL( dropped( const QList&, SUIT_DataObject*, int, Qt::DropAction ) ), this, SLOT( onDropped( const QList&, SUIT_DataObject*, int, Qt::DropAction ) ) ); + connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ), + this, SLOT( onRenamed( ) ) ); + } // temporary commented @@ -2108,9 +2212,11 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) } pref->setItemProperty( "strings", aLangs, curLang ); pref->setItemProperty( "icons", aIcons, curLang ); + pref->setItemProperty( "restart", true, curLang ); int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup, LightApp_Preferences::Bool, "language", "locale" ); + pref->setItemProperty( "restart", true, curLocale ); // ... "Language" group <> // ... "Look and feel" group <> @@ -2183,6 +2289,15 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "strings", aValuesList, mruLinkType ); pref->setItemProperty( "indexes", anIndicesList, mruLinkType ); // ... "MRU" preferences group <> + + // ... "Full-screen" group <> + int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab ); + pref->setItemProperty( "columns", 2, fullScreenGroup ); + // .... -> automatic hiding toolbars + pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup, + LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" ); + // ... "Full-screen" group <> + // .. "General" preferences tab <> // .. "3D viewer" group <> @@ -2226,12 +2341,94 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) // .. "OCC viewer" group <> int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat ); + // .... -> Projection mode + int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup, + LightApp_Preferences::Selector, "OCCViewer", "projection_mode" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE"); + anIndicesList << 0 << 1; + pref->setItemProperty( "strings", aValuesList, occProjMode ); + pref->setItemProperty( "indexes", anIndicesList, occProjMode ); +#if OCC_VERSION_LARGE > 0x06090000 + // .... -> Stereo group + int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup); + pref->setItemProperty( "columns", 2, stereoGroup ); + // .... -> Stereo type + int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup, + LightApp_Preferences::Selector, "OCCViewer", "stereo_type" ); + aValuesList.clear(); + anIndicesList.clear(); + idList.clear(); + OCCViewer_Viewer::stereoData( aValuesList, idList); + foreach( int gid, idList ) anIndicesList << gid; + pref->setItemProperty( "strings", aValuesList, stereoType ); + pref->setItemProperty( "indexes", anIndicesList, stereoType ); + + // .... -> Anaglyph filter + int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup, + LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA"); + anIndicesList << 0 << 1 << 2; + + pref->setItemProperty( "strings", aValuesList, anaglyphFilter ); + pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter ); + + // .... -> Convergence distance type + int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup, + LightApp_Preferences::Selector, "OCCViewer", "focus_type" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE"); + anIndicesList << 0 << 1; + pref->setItemProperty( "strings", aValuesList, occFocusType ); + pref->setItemProperty( "indexes", anIndicesList, occFocusType ); + + // .... -> Stereographic focus value + int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup, + LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" ); + pref->setItemProperty( "precision", 3, focusValue ); + pref->setItemProperty( "min", 1.0E-03, focusValue ); + pref->setItemProperty( "max", 1.0E03, focusValue ); + pref->setItemProperty( "step", 0.05, focusValue ); + + // .... -> IOD type + int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup, + LightApp_Preferences::Selector, "OCCViewer", "iod_type" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE"); + anIndicesList << 0 << 1; + pref->setItemProperty( "strings", aValuesList, occIODType ); + pref->setItemProperty( "indexes", anIndicesList, occIODType ); + + // .... -> Interocular distance (IOD) value + int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup, + LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" ); + pref->setItemProperty( "precision", 3, IODValue ); + pref->setItemProperty( "min", 1.0E-03, IODValue ); + pref->setItemProperty( "max", 1.0E03, IODValue ); + pref->setItemProperty( "step", 0.05, IODValue ); + + // .... -> Reverse stereo + pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup, + LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" ); + // .... -> Enable V-Sync + pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup, + LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" ); + // .... -> Enable quad-buffer support + pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup, + LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" ); +#endif // ... "Background" group <> int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup ); // pref->setItemProperty( "columns", 2, bgGroup ); aValuesList.clear(); anIndicesList.clear(); txtList.clear(); + idList.clear(); formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList ); foreach( int gid, idList ) anIndicesList << gid; // .... -> 3D viewer background @@ -2292,11 +2489,93 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) LightApp_Preferences::Bool, "OCCViewer", "enable_selection" ); // ... "Selection" group <> + // ... "Clipping" group <> + int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup ); + // .... -> clipping color + pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup, + LightApp_Preferences::Color, "OCCViewer", "clipping_color" ); + int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame ); + pref->setItemProperty( "columns", 2, texturePref ); + // .... -> use default texture + pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref, + LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" ); + // .... -> clipping texture + int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref, + LightApp_Preferences::File, "OCCViewer", "clipping_texture" ); + pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref ); + // .... -> modulate + pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref, + LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" ); + // .... -> scale factor + int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref, + LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" ); + pref->setItemProperty( "precision", 3, scaleFactor ); + pref->setItemProperty( "min", 1.0E-03, scaleFactor ); + pref->setItemProperty( "max", 1.0E03, scaleFactor ); + pref->setItemProperty( "step", 0.1, scaleFactor ); + // ... "Clipping" group <> + + // ... "Ray tracing" group <> + int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup ); + int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame ); + pref->setItemProperty( "columns", 2, rtPref ); + // .... -> depth + int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref, + LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" ); + pref->setItemProperty( "min", 1, rt_depth ); + pref->setItemProperty( "max", 10, rt_depth ); + pref->setItemProperty( "step", 1, rt_depth ); + pref->addPreference( "", rtPref, LightApp_Preferences::Frame ); + // .... -> specular reflections + pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref, + LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" ); + // .... -> adaptive anti-aliasing + pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref, + LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" ); + // .... -> shadows rendering + pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref, + LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" ); + // .... -> transparent shadow + pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref, + LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" ); + // ... "Ray tracing" group <> + + // ... "Light source" group <> + int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup ); + // .... -> light color + pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup, + LightApp_Preferences::Color, "OCCViewer", "light_color" ); + int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame ); + pref->setItemProperty( "columns", 3, directionPref ); + // .... -> light direction (dx component) + int light_dx = pref->addPreference( tr( "Dx" ), directionPref, + LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" ); + pref->setItemProperty( "precision", 2, light_dx ); + pref->setItemProperty( "min", -1.0E03, light_dx ); + pref->setItemProperty( "max", 1.0E03, light_dx ); + pref->setItemProperty( "step", 0.1, light_dx ); + // .... -> light direction (dy component) + int light_dy = pref->addPreference( tr( "Dy" ), directionPref, + LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" ); + pref->setItemProperty( "precision", 2, light_dy ); + pref->setItemProperty( "min", -1.0E03, light_dy ); + pref->setItemProperty( "max", 1.0E03, light_dy ); + pref->setItemProperty( "step", 0.1, light_dy ); + // .... -> light direction (dz component) + int light_dz = pref->addPreference( tr( "Dz" ), directionPref, + LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" ); + pref->setItemProperty( "precision", 2, light_dz ); + pref->setItemProperty( "min", -1.0E03, light_dz ); + pref->setItemProperty( "max", 1.0E03, light_dz ); + pref->setItemProperty( "step", 0.1, light_dz ); + // ... "Light source" group <> + // ... -> empty frame (for layout) <> int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame ); pref->setItemProperty( "margin", 0, occGen ); pref->setItemProperty( "columns", 2, occGen ); // ... -> empty frame (for layout) <> + // .. "OCC viewer" group <> #endif @@ -2316,10 +2595,40 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) anIndicesList << 0 << 1; pref->setItemProperty( "strings", aValuesList, vtkProjMode ); pref->setItemProperty( "indexes", anIndicesList, vtkProjMode ); + + // .... -> Stereo group + int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup); + pref->setItemProperty( "columns", 2, vtkStereoGroup ); + // .... -> Stereo type + int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup, + LightApp_Preferences::Selector, "VTKViewer", "stereo_type" ); + aValuesList.clear(); + anIndicesList.clear(); + idList.clear(); + SVTK_Viewer::stereoData( aValuesList, idList); + foreach( int gid, idList ) anIndicesList << gid; + pref->setItemProperty( "strings", aValuesList, vtkStereoType ); + pref->setItemProperty( "indexes", anIndicesList, vtkStereoType ); + // .... -> Anaglyph filter + int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup, + LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA"); + anIndicesList << 0 << 1 << 2; + + pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter ); + pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter ); + + // .... -> Enable quad-buffer support + pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup, + LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" ); + // .... -> background aValuesList.clear(); anIndicesList.clear(); txtList.clear(); + idList.clear(); #ifndef DISABLE_SALOMEOBJECT formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList ); #endif @@ -2535,6 +2844,51 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) // .. "Plot2d viewer" group <> + // .. "PyViewer" preferences tab <> + int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat ); + // ... "Font settings" group <> + int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab ); + pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup, + LightApp_Preferences::Font, "PyEditor", "Font" ); + // ... "Font settings" group <> + // ... "Display settings" group <> + int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab ); + pref->setItemProperty( "columns", 2, pyDispGroup ); + // ... -> current line highlight + pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup, + LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" ); + // ... -> text wrapping + pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup, + LightApp_Preferences::Bool, "PyEditor", "TextWrapping" ); + // ... -> center cursor on scroll + pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup, + LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" ); + // ... -> line numbers area + pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup, + LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" ); + // ... "Display settings" group <> + // ... "Tab settings" group <> + int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab ); + pref->setItemProperty( "columns", 2, pyTabGroup ); + // ... -> tab whitespaces + pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup, + LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" ); + // ... -> tab size + pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup, + LightApp_Preferences::IntSpin, "PyEditor", "TabSize" ); + // ... "Tab settings" group <> + // ... "Vertical edge settings" group <> + int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab ); + pref->setItemProperty( "columns", 2, pyVertEdgeGroup ); + // ... -> vertical edge + pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup, + LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" ); + // ... -> number of columns + pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup, + LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" ); + // ... "Vertical edge settings" group <> + // .. "PyEditor" preferences tab <> + // .. "Directories" preferences tab <> int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat ); // ... --> quick directories list @@ -2765,6 +3119,206 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } #endif +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) ) + { + QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) ); + 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->setClippingColor( aColor ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) || + param == QString( "clipping_texture" ) || + param == QString( "clipping_modulate" ) || + param == QString( "clipping_scale" ) ) ) + { + bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" ); + QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" ); + bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" ); + double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" ); + 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->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) ) + { + int mode = resMgr->integerValue( "OCCViewer", "projection_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->setProjectionType( mode ); + } + } +#endif +#if OCC_VERSION_LARGE > 0x06090000 +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) ) + { + int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 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->setStereoType( mode ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) ) + { + int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 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->setAnaglyphFilter( mode ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) || + param == QString( "focus_value" ) ) ) + { + int aType = resMgr->integerValue( "OCCViewer", "focus_type" ); + double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" ); + 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->setStereographicFocus( aType, aValue ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) || + param == QString( "iod_value" ) ) ) + { + int aType = resMgr->integerValue( "OCCViewer", "iod_type" ); + double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" ); + 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->setInterocularDistance( aType, aValue ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) ) + { + bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false ); + 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->setReverseStereo( reverse ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) ) + { + bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true ); + 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->setVSync( enable ); + } + } +#endif + +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) ) + { + bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false ); + 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->setQuadBufferSupport( enable ); + } + } +#endif +#endif if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) ) { int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 ); @@ -2842,6 +3396,69 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } #endif +#ifndef DISABLE_VTKVIEWER + if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) ) + { + int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 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->setStereoType( mode ); + } +#endif + } +#endif + +#ifndef DISABLE_VTKVIEWER + if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) ) + { + int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 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->setAnaglyphFilter( mode ); + } +#endif + } +#endif + +#ifndef DISABLE_VTKVIEWER + if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) ) + { + int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false ); + 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->setQuadBufferSupport( enable ); + } +#endif + } +#endif + #ifndef DISABLE_VTKVIEWER if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) ) { @@ -2977,11 +3594,13 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } if ( sec == "language" && param == "language" ) { - SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) ); + // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg + //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) ); } if ( sec == "language" && param == "locale") { - SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) ); + // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg + //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) ); } if ( sec == "desktop" && param == "opaque_resize" ) { bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false ); @@ -3014,6 +3633,39 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } } #endif + +#ifndef DISABLE_PYVIEWER + if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) || + param == QString( "LineNumberArea" ) || + param == QString( "TextWrapping" ) || + param == QString( "CenterCursorOnScroll" ) || + param == QString( "TabSpaceVisible" ) || + param == QString( "TabSize" ) || + param == QString( "VerticalEdge" ) || + param == QString( "NumberColumns" ) || + param == QString( "Font" ) ) ) + { + QList lst; + viewManagers( PyViewer_Viewer::Type(), lst ); + QListIterator itPy( lst ); + while ( itPy.hasNext() ) + { + SUIT_ViewManager* viewMgr = itPy.next(); + SUIT_ViewModel* vm = viewMgr->getViewModel(); + if ( !vm || !vm->inherits( "PyViewer_Viewer" ) ) + continue; + + PyViewer_Viewer* pyEditVM = dynamic_cast( vm ); + + viewMgr->setViewModel( vm ); + PyViewer_ViewWindow* pyView = dynamic_cast( viewMgr->getActiveView() ); + if( pyView ) + { + pyView->setPreferences(); + } + } + } +#endif } /*! @@ -3595,6 +4247,8 @@ void LightApp_Application::setDesktop( SUIT_Desktop* desk ) this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection ); connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ), this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); + /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ), + this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */ } } @@ -3969,6 +4623,9 @@ QStringList LightApp_Application::viewManagersTypes() const #ifndef DISABLE_PVVIEWER aTypesList<