X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FLightApp%2FLightApp_Application.cxx;h=3093f12fca6760f089daac4080e26e01de75965e;hb=77a9b7ac9d8b364358e1760e74a44e86557b79aa;hp=f1f7c78d8a9e53ecd2292a2db4b80a98a40c84ab;hpb=aff8765b1aa57fbe9b0163341cde44799807b054;p=modules%2Fgui.git diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index f1f7c78d8..3093f12fc 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 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 @@ -6,7 +6,7 @@ // 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. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -42,6 +42,8 @@ #include "LightApp_Application.h" #include "LightApp_Module.h" #include "LightApp_DataModel.h" +#include "LightApp_DataOwner.h" +#include "LightApp_Displayer.h" #include "LightApp_Study.h" #include "LightApp_Preferences.h" #include "LightApp_PreferencesDlg.h" @@ -56,9 +58,7 @@ #include "LightApp_WgViewModel.h" #include "LightApp_FullScreenHelper.h" - #include -#include #include @@ -91,7 +91,6 @@ #include #include #include -#include #include @@ -117,6 +116,7 @@ #ifndef DISABLE_OCCVIEWER #include #include + #include #ifndef DISABLE_SALOMEOBJECT #include #else @@ -149,6 +149,19 @@ #include "LightApp_GVSelector.h" #endif +#ifndef DISABLE_PVVIEWER + #include "PVViewer_ViewManager.h" + #include "PVViewer_ViewWindow.h" + #include "PVViewer_ViewModel.h" +#endif + +#ifndef DISABLE_PYVIEWER + #include + #include + #include +#endif + + #define VISIBILITY_COLUMN_WIDTH 25 #include @@ -215,7 +228,6 @@ static const char* imageEmptyIcon[] = { int LightApp_Application::lastStudyId = 0; - // Markers used to parse array with dockable windows and toolbars state. // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp // in the Qt source code. @@ -306,22 +318,11 @@ 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 ); - QtxWebBrowser::setResourceManager( aResMgr ); - QtxWebBrowser::setData("browser:icon", aResMgr->loadPixmap( "LightApp", tr( "BROWSER_ICON" ) ) ); - QtxWebBrowser::setData("browser:title", tr( "BROWSER_TITLE" ) ); - QtxWebBrowser::setData("toolbar:title", tr( "BROWSER_TOOLBAR_TITLE" ) ); - QtxWebBrowser::setData("menu:file:title", tr( "BROWSER_FILEMENU" ) ); - QtxWebBrowser::setData("action:close:title", tr( "BROWSER_CLOSE" ) ); - QtxWebBrowser::setData("action:close:icon", aResMgr->loadPixmap( "LightApp", tr( "BROWSER_CLOSE_ICON" ) ) ); - QtxWebBrowser::setData("action:back:title", tr( "BROWSER_BACK" ) ); - QtxWebBrowser::setData("action:forward:title", tr( "BROWSER_FORWARD" ) ); - QtxWebBrowser::setData("action:find:title", tr( "BROWSER_FIND" ) ); - QtxWebBrowser::setData("action:findnext:title", tr( "BROWSER_FINDNEXT" ) ); - QtxWebBrowser::setData("action:findprev:title", tr( "BROWSER_FINDPREV" ) ); - desktop()->setWindowIcon( aLogo ); desktop()->setDockableMenuBar( false ); desktop()->setDockableStatusBar( false ); @@ -377,6 +378,11 @@ LightApp_Application::LightApp_Application() #endif connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) ); + connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ), + this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); + connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection ); + // Set existing font for the python console in resources if( !aResMgr->hasValue( "PyConsole", "font" ) ) @@ -422,6 +428,7 @@ void LightApp_Application::start() updateWindows(); updateViewManagers(); + updateCommandsStatus(); putInfo( "" ); desktop()->statusBar()->showMessage( "" ); @@ -429,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 { @@ -499,6 +515,11 @@ bool LightApp_Application::activateModule( const QString& modName ) updateWindows(); updateViewManagers(); + if ( activeStudy() && activeStudy()->root() && objectBrowser() ) { + if ( objectBrowser()->root() != activeStudy()->root() ) + objectBrowser()->setRoot( activeStudy()->root() ); + updateObjectBrowser( true ); + } return true; } @@ -734,7 +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_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" ), @@ -761,7 +788,8 @@ void LightApp_Application::createActions() createMenu( StyleId, viewMenu, 20, -1 ); createMenu( FullScreenId, viewMenu, 20, -1 ); - int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ) ); + int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant) + QString( "SalomeModules" ) ); // name (language-independant) createTool( ModulesListId, modTBar ); } @@ -854,6 +882,16 @@ void LightApp_Application::onNewWindow() case NewGraphicsViewId: type = GraphicsView_Viewer::Type(); break; +#endif +#ifndef DISABLE_PVVIEWER + case NewPVViewId: + type = PVViewer_Viewer::Type(); + break; +#endif +#ifndef DISABLE_PYVIEWER + case NewPyViewerId: + type = PyViewer_Viewer::Type(); + break; #endif } @@ -866,10 +904,14 @@ void LightApp_Application::onNewWindow() */ void LightApp_Application::onNewDoc() { - //asl: fix for 0020515 - if ( activeStudy() ) - saveDockWindowsState(); +#ifdef SINGLE_DESKTOP + if ( !checkExistingDoc() ) + return; +#endif + //asl: fix for 0020515 + saveDockWindowsState(); + CAM_Application::onNewDoc(); } @@ -879,10 +921,14 @@ void LightApp_Application::onNewDoc() void LightApp_Application::onOpenDoc() { SUIT_Study* study = activeStudy(); - saveDockWindowsState(); - + +#ifdef SINGLE_DESKTOP + if ( !checkExistingDoc() ) + return; +#endif + CAM_Application::onOpenDoc(); - + if ( !study ) // new study will be create in THIS application { updateWindows(); @@ -896,9 +942,16 @@ void LightApp_Application::onOpenDoc() */ bool LightApp_Application::onOpenDoc( const QString& aName ) { +#ifdef SINGLE_DESKTOP + if ( !checkExistingDoc() ) + return false; +#endif + + saveDockWindowsState(); + // We should take mru action first because this application instance can be deleted later. QtxMRUAction* mru = ::qobject_cast( action( MRUId ) ); - + bool res = CAM_Application::onOpenDoc( aName ); if ( mru ) @@ -984,6 +1037,18 @@ void LightApp_Application::updateCommandsStatus() if( a ) a->setEnabled( activeStudy() ); #endif + +#ifndef DISABLE_PVVIEWER + a = action( NewPVViewId ); + if( a ) + a->setEnabled( activeStudy() ); +#endif + +#ifndef DISABLE_PYVIEWER + a = action( NewPyViewerId ); + if( a ) + a->setEnabled( activeStudy() ); +#endif } /*! @@ -1074,13 +1139,11 @@ void LightApp_Application::onHelpContentsModule() } } else { -#ifdef WIN32 - // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol - // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol. - QtxWebBrowser::loadUrl(helpFile); -#else - QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile)); -#endif + 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 ); } } @@ -1147,14 +1210,11 @@ void LightApp_Application::onHelpContextModule( const QString& theComponentName, } } else { -#ifdef WIN32 - // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol - // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol. - QtxWebBrowser::loadUrl(helpFile, context); -#else - QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile), context); -#endif - + 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 ); } } @@ -1172,72 +1232,11 @@ void LightApp_Application::onSelectionChanged() } /*! - Adds window to application. - \param wid - QWidget - \param flag - key for window - \param studyId - study id - Flag used how identificator of window in windows list. + SLOT: Performs some actions when dockable windows are triggered */ -/* -void LightApp_Application::addWindow( QWidget* wid, const int flag, const int studyId ) +void LightApp_Application::onDockWindowVisibilityChanged( bool ) { - if ( !wid ) - return; - - int sId = studyId; - if ( sId < 0 ) - { - if ( !activeStudy() ) - return; - else - sId = activeStudy()->id(); - } - - if ( !myWindows.contains( flag ) ) - { - QMap winMap; - currentWindows( winMap ); - - LightApp_WidgetContainer* newWC = new LightApp_WidgetContainer( flag, desktop() ); - connect( newWC, SIGNAL( destroyed ( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) ); - // asv: connecting a slot for storing visibility flag of a window - connect( newWC, SIGNAL( visibilityChanged ( bool ) ), SLOT( onVisibilityChanged( bool ) ) ); - myWindows.insert( flag, newWC ); - if ( winMap.contains( flag ) ) { - //desktop()->removeDockWidget( myWindows[flag] ); - desktop()->addDockWidget( (Qt::DockWidgetArea)winMap[flag], myWindows[flag] ); - } - - //myWindows[flag]->setResizeEnabled( true ); - myWindows[flag]->setFeatures( QDockWidget::AllDockWidgetFeatures ); - myWindows[flag]->setObjectName( QString( "dock_window_%1" ).arg( flag ) ); - //myWindows[flag]->setFixedExtentWidth( wid->width() ); - //myWindows[flag]->setFixedExtentHeight( wid->height() ); - myWindows[flag]->resize( wid->width(), wid->height() ); - } - - QFont f; -#ifndef DISABLE_PYCONSOLE - if( wid->inherits( "PyConsole_Console" ) ) - { - if( resourceMgr()->hasValue( "PyConsole", "font" ) ) - f = resourceMgr()->fontValue( "PyConsole", "font" ); - else - { - f = ( ( PyConsole_Console* )wid )->font(); - resourceMgr()->setValue( "PyConsole", "font", f ); - } - } - else -#endif - f = wid->font(); - - myWindows[flag]->insert( sId, wid ); - wid->setFont( f ); - - setWindowShown( flag, !myWindows[flag]->isEmpty() ); } -*/ QWidget* LightApp_Application::dockWindow( const int id ) const { @@ -1276,8 +1275,12 @@ void LightApp_Application::insertDockWindow( const int id, QWidget* wid ) connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) ); dock->setFeatures( QDockWidget::AllDockWidgetFeatures ); - dock->setObjectName( QString( "window_%1" ).arg( id ) ); + 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() ) @@ -1431,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 ); @@ -1492,6 +1495,23 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr ); } #endif +#ifndef DISABLE_PVVIEWER + if( vmType == PVViewer_Viewer::Type() ) + { + 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 if( vmType == OCCViewer_Viewer::Type() ) { @@ -1514,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 ); @@ -1535,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() ) ); @@ -1595,6 +1637,31 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType return vm; } +SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel ) +{ + SUIT_ResourceMgr* resMgr = resourceMgr(); + + SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(), + desktop(), + theModel ); + + QString vmType = vm->getType(); + + 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 ) ); + vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) ); + } + + if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) ) + myUserWmTypes << vmType; + + return vm; +} + /*! SLOT: Removes view manager from application */ @@ -1627,6 +1694,11 @@ void LightApp_Application::onStudyCreated( SUIT_Study* theStudy ) if ( objectBrowser() ) objectBrowser()->openLevels(); + +#ifndef DISABLE_PYCONSOLE + if( pythonConsole() ) + getPyInterp()->initStudy(); +#endif } /*! @@ -1654,6 +1726,11 @@ void LightApp_Application::onStudyOpened( SUIT_Study* theStudy ) if ( objectBrowser() ) objectBrowser()->openLevels(); +#ifndef DISABLE_PYCONSOLE + if( pythonConsole() ) + getPyInterp()->initStudy(); +#endif + emit studyOpened(); } @@ -1670,6 +1747,11 @@ void LightApp_Application::onStudySaved( SUIT_Study* s ) /*!Protected SLOT. On study closed.*/ void LightApp_Application::onStudyClosed( SUIT_Study* s ) { + /* + disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ), + this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) ); + */ + // stop auto-save timer myAutoSaveTimer->stop(); @@ -1763,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 ) { @@ -1827,6 +1932,11 @@ void LightApp_Application::onPreferenceChanged( QString& modName, QString& secti /*!Remove all windows from study.*/ void LightApp_Application::beforeCloseDoc( SUIT_Study* s ) { + saveDockWindowsState(); + + if ( SUIT_DataBrowser* ob = objectBrowser() ) + ob->setModel(0); + CAM_Application::beforeCloseDoc( s ); } @@ -1867,6 +1977,7 @@ QWidget* LightApp_Application::createWindow( const int flag ) if ( flag == WT_ObjectBrowser ) { SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() ); + ob->setObjectName( "objectBrowser" ); ob->setSortMenuEnabled( true ); ob->setAutoUpdate( true ); if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) ) @@ -1887,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 @@ -1909,7 +2023,8 @@ QWidget* LightApp_Application::createWindow( const int flag ) #ifndef DISABLE_PYCONSOLE else if ( flag == WT_PyConsole ) { - PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(),new LightApp_PyInterp()); + PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() ); + pyCons->setObjectName( "pythonConsole" ); pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) ); pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" )); pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true )); @@ -1922,6 +2037,7 @@ QWidget* LightApp_Application::createWindow( const int flag ) else if ( flag == WT_LogWindow ) { LogWindow* logWin = new LogWindow( desktop() ); + logWin->setObjectName( "logWindow" ); logWin->setWindowTitle( tr( "LOG_WINDOW" ) ); logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) ); wid = logWin; @@ -1936,11 +2052,13 @@ QWidget* LightApp_Application::createWindow( const int flag ) */ void LightApp_Application::defaultWindows( QMap& aMap ) const { - aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea ); #ifndef DISABLE_PYCONSOLE aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea ); #endif - // aMap.insert( WT_LogWindow, Qt::DockBottom ); + if ( activeStudy() ) { + aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea ); + // aMap.insert( WT_LogWindow, Qt::DockBottom ); + } } /*!Default view managers*/ @@ -1970,7 +2088,9 @@ LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const that->myPrefs = _prefs_; connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ), - this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ) ); + this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection ); + connect( myPrefs, SIGNAL( resetToDefaults() ), + this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection ); if ( !crt ) return myPrefs; @@ -2092,6 +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 <> @@ -2164,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 <> @@ -2178,16 +2312,14 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "strings", aValuesList, vtkStyleMode ); pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode ); // ... -> zooming mode - #if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version - int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup, - LightApp_Preferences::Selector, "3DViewer", "zooming_mode" ); - aValuesList.clear(); - anIndicesList.clear(); - aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR"); - anIndicesList << 0 << 1; - pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode ); - pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode ); - #endif + int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup, + LightApp_Preferences::Selector, "3DViewer", "zooming_mode" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR"); + anIndicesList << 0 << 1; + pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode ); + pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode ); // ... "Trihedron" group <> int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup ); pref->setItemProperty( "columns", 2, occTriGroup ); @@ -2203,19 +2335,104 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) // ... "Trihedron" group <> // .. "3D viewer" group <> + QString formats; + int bgId; +#ifndef DISABLE_OCCVIEWER // .. "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(); - QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList ); + idList.clear(); + formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList ); foreach( int gid, idList ) anIndicesList << gid; // .... -> 3D viewer background - int bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup, + bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup, LightApp_Preferences::Background, "OCCViewer", "background" ); pref->setItemProperty( "gradient_names", aValuesList, bgId ); pref->setItemProperty( "gradient_ids", anIndicesList, bgId ); @@ -2272,13 +2489,97 @@ 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 +#ifndef DISABLE_VTKVIEWER // .. "VTK viewer" group <> int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab @@ -2294,11 +2595,43 @@ 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 foreach( int gid, idList ) anIndicesList << gid; bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen, LightApp_Preferences::Background, "VTKViewer", "background" ); @@ -2309,7 +2642,9 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId ); pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId ); pref->setItemProperty( "custom_enabled", false, bgId ); +#ifndef DISABLE_SALOMEOBJECT pref->setItemProperty( "image_formats", formats, bgId ); +#endif // .... -> speed increment int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen, LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" ); @@ -2415,27 +2750,24 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "step", 0.1, transPref ); // ... -> group names sub-group <> // .. "VTK viewer" group <> +#endif // .. "Plot2d viewer" group <> int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab //pref->setItemProperty( "columns", 2, plot2dGroup ); - // ... -> show legend - pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup, - LightApp_Preferences::Bool, "Plot2d", "ShowLegend" ); - // ... -> legend position - int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup, - LightApp_Preferences::Selector, "Plot2d", "LegendPos" ); - aValuesList.clear(); - anIndicesList.clear(); - aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM"); - anIndicesList << 0 << 1 << 2 << 3 ; - pref->setItemProperty( "strings", aValuesList, legendPosition ); - pref->setItemProperty( "indexes", anIndicesList, legendPosition ); - // ... -> legend font - pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" ); - // ... -> curve type - int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup, + // ... -> background + pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup, + LightApp_Preferences::Color, "Plot2d", "Background" ); + // ... -> selection color + pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup, + LightApp_Preferences::Color, "Plot2d", "SelectionColor" ); + + // ... "Viewer" group <> + int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup ); + + // .... -> curve type + int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup, LightApp_Preferences::Selector, "Plot2d", "CurveType" ); aValuesList.clear(); anIndicesList.clear(); @@ -2443,13 +2775,13 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) anIndicesList << 0 << 1 << 2 ; pref->setItemProperty( "strings", aValuesList, curveType ); pref->setItemProperty( "indexes", anIndicesList, curveType ); - // ... -> marker size - int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup, + // .... -> marker size + int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup, LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" ); pref->setItemProperty( "min", 0, markerSize ); pref->setItemProperty( "max", 100, markerSize ); - // ... -> horizontal scaling mode - int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup, + // .... -> horizontal scaling mode + int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup, LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" ); aValuesList.clear(); anIndicesList.clear(); @@ -2457,36 +2789,106 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) anIndicesList << 0 << 1 ; pref->setItemProperty( "strings", aValuesList, horScale ); pref->setItemProperty( "indexes", anIndicesList, horScale ); - // ... -> vertical scaling mode - int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup, + // .... -> vertical scaling mode + int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup, LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" ); pref->setItemProperty( "strings", aValuesList, verScale ); pref->setItemProperty( "indexes", anIndicesList, verScale ); - // ... -> background - pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup, - LightApp_Preferences::Color, "Plot2d", "Background" ); - // ... -> font color - pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" ); - // ... -> selection font color - pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" ); - // ... -> selection color - pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup, - LightApp_Preferences::Color, "Plot2d", "SelectionColor" ); - // ... -> errors/deviation colot - pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup, + + // .... -> errors/deviation colot + pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup, LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" ); - // ... -> deviation markers line size - int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup, + // .... -> deviation markers line size + int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup, LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" ); pref->setItemProperty( "min", 1, deviationMarkerLw ); pref->setItemProperty( "max", 5, deviationMarkerLw ); - // ... -> deviation markers tick mark size - int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup, + // .... -> deviation markers tick mark size + int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup, LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" ); pref->setItemProperty( "min", 1, deviationMarkerTs ); pref->setItemProperty( "max", 5, deviationMarkerTs ); + // .... "Viewer" group <> + + // ... "Legend" group <> + int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup ); + + // .... -> show legend + pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup, + LightApp_Preferences::Bool, "Plot2d", "ShowLegend" ); + // .... -> legend position + int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup, + LightApp_Preferences::Selector, "Plot2d", "LegendPos" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM"); + anIndicesList << 0 << 1 << 2 << 3 ; + pref->setItemProperty( "strings", aValuesList, legendPosition ); + pref->setItemProperty( "indexes", anIndicesList, legendPosition ); + // .... -> Symbol type + int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup, + LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" ); + aValuesList.clear(); + anIndicesList.clear(); + aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE"); + anIndicesList << 0 << 1 ; + pref->setItemProperty( "strings", aValuesList, legendSymbolType ); + pref->setItemProperty( "indexes", anIndicesList, legendSymbolType ); + // .... -> legend font + pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" ); + // ... -> font color + pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" ); + // ... -> selection font color + pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" ); + // ... "Legend" group <> + // .. "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 @@ -2717,41 +3119,241 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString } #endif - if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) ) +#ifndef DISABLE_OCCVIEWER + if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) ) { - int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 ); + QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) ); QList lst; -#ifndef DISABLE_OCCVIEWER viewManagers( OCCViewer_Viewer::Type(), lst ); - QListIterator itOCC( lst ); - while ( itOCC.hasNext() ) + QListIterator it( lst ); + while ( it.hasNext() ) { - SUIT_ViewModel* vm = itOCC.next()->getViewModel(); + SUIT_ViewModel* vm = it.next()->getViewModel(); if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) ) continue; OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm; - occVM->setZoomingStyle( mode ); + occVM->setClippingColor( aColor ); } + } #endif -#ifndef DISABLE_VTKVIEWER -#ifndef DISABLE_SALOMEOBJECT - viewManagers( SVTK_Viewer::Type(), lst ); - QListIterator itVTK( lst ); - while ( itVTK.hasNext() ) + +#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 = itVTK.next()->getViewModel(); - if ( !vm || !vm->inherits( "SVTK_Viewer" ) ) + SUIT_ViewModel* vm = it.next()->getViewModel(); + if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) ) continue; - SVTK_Viewer* vtkVM = dynamic_cast( vm ); - if( vtkVM ) vtkVM->setZoomingStyle( mode ); + OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm; + occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale ); } -#endif -#endif } +#endif -#ifndef DISABLE_VTKVIEWER +#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 ); + QList lst; +#ifndef DISABLE_OCCVIEWER + viewManagers( OCCViewer_Viewer::Type(), lst ); + QListIterator itOCC( lst ); + while ( itOCC.hasNext() ) + { + SUIT_ViewModel* vm = itOCC.next()->getViewModel(); + if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) ) + continue; + + OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm; + occVM->setZoomingStyle( mode ); + } +#endif +#ifndef DISABLE_VTKVIEWER +#ifndef DISABLE_SALOMEOBJECT + viewManagers( SVTK_Viewer::Type(), lst ); + QListIterator itVTK( lst ); + while ( itVTK.hasNext() ) + { + SUIT_ViewModel* vm = itVTK.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( "speed_value" ) || param == QString( "speed_mode" )) ) { int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 ); @@ -2794,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" ) ) { @@ -2929,7 +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") + { + // 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 ); @@ -2942,22 +3613,56 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString dynamic_cast( desktop() )->workstack()->setOpaqueResize( opaqueResize ); } - if ( sec == "ExternalBrowser" && param == "use_external_browser" ) { - if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) ) - { - QtxWebBrowser::shutdown(); +#ifndef DISABLE_PLOT2DVIEWER + QList lst; + viewManagers( Plot2d_Viewer::Type(), lst ); + QListIterator itPlot2d( lst ); + while ( itPlot2d.hasNext() ) { + SUIT_ViewManager* viewMgr = itPlot2d.next(); + SUIT_ViewModel* vm = viewMgr->getViewModel(); + if ( !vm || !vm->inherits( "Plot2d_Viewer" ) ) + continue; + + Plot2d_Viewer* Plot2dVM = dynamic_cast( vm ); + + viewMgr->setViewModel( vm ); + Plot2d_ViewWindow* wnd = dynamic_cast( viewMgr->getActiveView() ); + if( wnd ) { + Plot2d_ViewFrame* frame = wnd->getViewFrame(); + frame->SetPreference(); } } +#endif -#ifndef DISABLE_PLOT2DVIEWER - if ( sec == "Plot2d" ) { - if( param == "SelectionColor" ) { - QColor c = resMgr->colorValue( sec, param ); - Plot2d_Object::setSelectionColor(c); - } - else if (param == "SelectedLegendFontColor") { - QColor c = resMgr->colorValue( sec, param ); - Plot2d_Object::setHighlightedLegendTextColor(c); +#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 @@ -3037,6 +3742,12 @@ void LightApp_Application::savePreferences() if ( desktop() ) aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() ); +#if GUI_DEVELOPMENT > 0 + aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" ); +#else + aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) ); +#endif + aResMgr->save(); } @@ -3153,9 +3864,6 @@ void LightApp_Application::removeModuleAction( const QString& modName ) void LightApp_Application::currentWindows( QMap& winMap ) const { winMap.clear(); - if ( !activeStudy() ) - return; - if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) ) ((LightApp_Module*)activeModule())->windows( winMap ); else @@ -3186,28 +3894,22 @@ void LightApp_Application::updateWindows() QMap winMap; currentWindows( winMap ); - if ( activeStudy() ) + for ( QMap::ConstIterator it = winMap.begin(); it != winMap.end(); ++it ) { - for ( QMap::ConstIterator it = winMap.begin(); it != winMap.end(); ++it ) - { - if ( !dockWindow( it.key() ) ) - getWindow( it.key() ); - } + if ( !dockWindow( it.key() ) ) + getWindow( it.key() ); } for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it ) { QWidget* wid = it.value(); - if ( activeStudy() ) - wid->setVisible( winMap.contains( it.key() ) ); + if ( winMap.contains( it.key() ) ) + wid->setVisible( true ); else delete wid; } - if ( activeStudy() ) - loadDockWindowsState(); - else - myWin.clear(); + loadDockWindowsState(); } /*! @@ -3236,26 +3938,36 @@ void LightApp_Application::loadDockWindowsState() QString modName; if ( activeModule() ) modName = activeModule()->name(); + else if ( activeStudy() ) + modName = "nomodule"; - QtxResourceMgr::WorkingMode prevMode = aResMgr->workingMode(); - aResMgr->setWorkingMode(QtxResourceMgr::IgnoreUserValues); + QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues ); QByteArray aDefaultState; - aResMgr->value("windows_geometry", modName , aDefaultState ); + aResMgr->value( "windows_geometry", modName, aDefaultState ); QByteArray aDefaultVisibility; - aResMgr->value("windows_visibility", modName , aDefaultVisibility ); + aResMgr->value( "windows_visibility", modName, aDefaultVisibility ); bool hasDefaultVisibility = !aDefaultVisibility.isEmpty(); - aResMgr->setWorkingMode(prevMode); + aResMgr->setWorkingMode( prevMode ); if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility) return; if ( aResMgr->hasValue("windows_geometry" ,modName ) ) { + long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) ); QByteArray arr; - aResMgr->value("windows_geometry", modName , arr ); - QByteArray aTargetArray = processState(arr, storeWin, storeTb, aDefaultState); + if ( version > Qtx::versionToId( "7.4.1" ) ) + aResMgr->value( "windows_geometry", modName , arr ); + else + arr = aDefaultState; + QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState); desktop()->restoreState( aTargetArray ); } + QStringList mainToolbarsNames; + mainToolbarsNames << "SalomeStandard" << "SalomeModules"; + QList mainToolbars = findToolBars( mainToolbarsNames ); + foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true ); + /* if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty()) return; @@ -3285,7 +3997,7 @@ void LightApp_Application::loadDockWindowsState() dwMap = &defaultDwMap; } } - + if(tbMap) { QList tbList = findToolBars(); for ( QList::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) @@ -3311,6 +4023,7 @@ void LightApp_Application::loadDockWindowsState() dw->setVisible( (*dwMap)[dw->objectName()] ); } } + */ } @@ -3331,9 +4044,17 @@ void LightApp_Application::saveDockWindowsState() QString modName; if ( activeModule() ) modName = activeModule()->name(); + else if ( activeStudy() ) + modName = "nomodule"; + + QString versionId = GUI_VERSION_STR; +#if GUI_DEVELOPMENT > 0 + versionId += "dev"; +#endif QByteArray arr = desktop()->saveState(); - resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb) ); + resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) ); + resourceMgr()->setValue( "windows_geometry_version", modName, versionId ); QByteArray visArr; if ( myWinVis.contains( modName ) ) @@ -3475,6 +4196,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopu a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) ); } +#ifndef DISABLE_SALOMEOBJECT if ( selMgr && ob ) { SALOME_ListIO selected; selMgr->selectedObjects( selected ); @@ -3493,6 +4215,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopu } } } +#endif selMgr->setSelectionCacheEnabled( cacheIsOn ); } @@ -3522,6 +4245,10 @@ void LightApp_Application::setDesktop( SUIT_Desktop* desk ) if ( desk ) { connect( desk, SIGNAL( message( const QString& ) ), 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 ); */ } } @@ -3607,7 +4334,7 @@ void LightApp_Application::removeViewManager( SUIT_ViewManager* vm ) this, SLOT( onCloseView( SUIT_ViewManager* ) ) ); LightApp_Study* aStudy = dynamic_cast(activeStudy()); if (aStudy ) - aStudy->removeViewMgr(vm->getGlobalId()); + aStudy->removeObjectProperties( vm->getGlobalId() ); CAM_Application::removeViewManager( vm ); @@ -3893,6 +4620,12 @@ QStringList LightApp_Application::viewManagersTypes() const #ifndef DISABLE_QXGRAPHVIEWER aTypesList< 1 ) { @@ -4116,7 +4854,8 @@ void LightApp_Application::onDesktopMessage( const QString& message ) Returns all top level toolbars. Note : Result list contains only main window toolbars, not including toolbars from viewers. */ -QList LightApp_Application::findToolBars() { +QList LightApp_Application::findToolBars( const QStringList& names ) +{ QList aResult; QList tbList = qFindChildren( desktop() ); for ( QList::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) { @@ -4124,7 +4863,8 @@ QList LightApp_Application::findToolBars() { QObject* po = Qtx::findParent( tb, "QMainWindow" ); if ( po != desktop() ) continue; - aResult.append(tb); + if ( names.isEmpty() || names.contains( tb->objectName() ) ) + aResult.append(tb); } return aResult; } @@ -4132,12 +4872,27 @@ QList LightApp_Application::findToolBars() { /*! Internal method to parse toolbars and dockable windows state. */ -QByteArray LightApp_Application::processState(QByteArray& input, const bool processWin,const bool processTb, QByteArray defaultState) { +QByteArray LightApp_Application::processState(QByteArray& input, + const bool processWin, + const bool processTb, + const bool isRestoring, + QByteArray defaultState) { QByteArray aRes; bool hasDefaultState = !defaultState.isEmpty(); bool isDockWinWriten = false; - if(processWin && processTb) { + int nbDocWin = -1; + //Write date from users settings + if(isRestoring){ + QDataStream tmpInputData(&input, QIODevice::ReadOnly); + int marker, version; + uchar dockmarker; + tmpInputData >> marker; + tmpInputData >> version; + tmpInputData >> dockmarker; + tmpInputData >> nbDocWin; + } + if(processWin && processTb && !isRestoring) { aRes = input; } else if(!processWin && !processTb ) { if(hasDefaultState) @@ -4153,9 +4908,9 @@ QByteArray LightApp_Application::processState(QByteArray& input, const bool proc } int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames); - QDataStream anInputData(&input, QIODevice::ReadOnly); if(toolBarMarkerIndex < 0) return aRes; + QDataStream anInputData(&input, QIODevice::ReadOnly); int toolBarMarkerIndexDef; if(hasDefaultState) { @@ -4168,15 +4923,24 @@ QByteArray LightApp_Application::processState(QByteArray& input, const bool proc QDataStream* aTargetData = 0; int aTargetIndex = -1; - if(processWin) { - //Write date from users settings + QByteArray currentArr = desktop()->saveState(); + QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly); + bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0); + if(processWin && useInputData) { aTargetData = &anInputData; aTargetIndex = toolBarMarkerIndex; } else { //Write date from default settings if(hasDefaultState) { aTargetData = &anInputDataDef; - aTargetIndex = toolBarMarkerIndexDef; + aTargetIndex = toolBarMarkerIndexDef; + } else { + //If no default state, write current snapshot of the dockable windows + if(isRestoring) { + aTargetData = &anInputDataCur; + int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames); + aTargetIndex = toolBarMarkerIndexCur; + } } } @@ -4247,3 +5011,124 @@ void LightApp_Application::emitOperationFinished( const QString& theModuleName, { emit operationFinished( theModuleName, theOperationName, theEntryList ); } + +/*! + Update visibility state of given objects +*/ +void LightApp_Application::updateVisibilityState( DataObjectList& theList, + SUIT_ViewModel* theViewModel ) +{ + if ( !theViewModel || theList.isEmpty() ) return; + + LightApp_Study* aStudy = dynamic_cast(activeStudy()); + if ( !aStudy ) return; + + SALOME_View* aView = dynamic_cast( theViewModel ); + + for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) { + LightApp_DataObject* obj = dynamic_cast(*itr); + + if ( !obj || aStudy->isComponent( obj->entry() ) ) + continue; + + LightApp_Module* anObjModule = dynamic_cast(obj->module()); + if ( anObjModule ) { + LightApp_Displayer* aDisplayer = anObjModule->displayer(); + if ( aDisplayer ) { + Qtx::VisibilityState anObjState = Qtx::UnpresentableState; + if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) { + if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) ) + anObjState = Qtx::ShownState; + else + anObjState = Qtx::HiddenState; + } + aStudy->setVisibilityState( obj->entry(), anObjState ); + } + } + } +} + +/*! + * Called when window activated + */ +void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow ) +{ + SUIT_DataBrowser* anOB = objectBrowser(); + if ( !anOB ) + return; + SUIT_DataObject* rootObj = anOB->root(); + if ( !rootObj ) + return; + + DataObjectList listObj = rootObj->children( true ); + + SUIT_ViewModel* vmod = 0; + if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() ) + vmod = vman->getViewModel(); + updateVisibilityState( listObj, vmod ); +} + +/*! + Called then view manager removed +*/ +void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* ) +{ + ViewManagerList lst; + viewManagers( lst ); + if ( lst.count() == 1) { // in case if closed last view window + LightApp_Study* aStudy = dynamic_cast( activeStudy() ); + if ( aStudy ) + aStudy->setVisibilityStateForAll( Qtx::UnpresentableState ); + } +} + +/*! + Check existing document. +*/ +bool LightApp_Application::checkExistingDoc() +{ + bool result = true; + if( activeStudy() ) { + int answer = SUIT_MessageBox::question( desktop(), + tr( "APPCLOSE_CAPTION" ), + tr( "STUDYCLOSE_DESCRIPTION" ), + tr( "APPCLOSE_SAVE" ), + tr( "APPCLOSE_CLOSE" ), + tr( "APPCLOSE_CANCEL" ), 0 ); + if(answer == 0) { + if ( activeStudy()->isSaved() ) { + onSaveDoc(); + closeDoc( false ); + } else if ( onSaveAsDoc() ) { + if( !closeDoc( false ) ) { + result = false; + } + } else { + result = false; + } + } + else if( answer == 1 ) { + closeDoc( false ); + } else if( answer == 2 ) { + result = false; + } + } + return result; +} + +#ifndef DISABLE_PYCONSOLE + +PyConsole_Interp* LightApp_Application::getPyInterp() +{ + static PyConsole_Interp* myInterp = 0; + if ( !myInterp ) + myInterp = createPyInterp(); + return myInterp; +} + +PyConsole_Interp* LightApp_Application::createPyInterp() +{ + return new LightApp_PyInterp(); +} + +#endif // DISABLE_PYCONSOLE