-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// 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
// Created: 6/20/2005 18:39:45 PM
// Author: Natalia Donis
-#ifdef WNT
+#ifdef WIN32
// E.A. : On windows with python 2.6, there is a conflict
// E.A. : between pymath.h and Standard_math.h which define
// E.A. : some same symbols : acosh, asinh, ...
#include "LightApp_Application.h"
#include "LightApp_Module.h"
#include "LightApp_DataModel.h"
+#include "LightApp_DataOwner.h"
#include "LightApp_Study.h"
#include "LightApp_Preferences.h"
#include "LightApp_PreferencesDlg.h"
#include "LightApp_AboutDlg.h"
#include "LightApp_ModuleAction.h"
// temporary commented
-//#include "LightApp_OBFilter.h"
#include "LightApp_EventFilter.h"
#include "LightApp_OBSelector.h"
#include "LightApp_SelectionMgr.h"
#include <VTKViewer_ViewModel.h>
#endif
-//#ifndef DISABLE_SUPERVGRAPHVIEWER
-// #include <SUPERVGraph_ViewModel.h>
-// #include <SUPERVGraph_ViewFrame.h>
-// #include <SUPERVGraph_ViewManager.h>
-//#endif
-
#ifndef DISABLE_QXGRAPHVIEWER
-//VSR: QxGraph has been replaced by QxScene
-// #include <QxGraph_ViewModel.h>
-// #include <QxGraph_ViewWindow.h>
-// #include <QxGraph_ViewManager.h>
#include <QxScene_ViewManager.h>
#include <QxScene_ViewModel.h>
#include <QxScene_ViewWindow.h>
#endif
+#ifndef DISABLE_GRAPHICSVIEW
+ #include "GraphicsView_Viewer.h"
+ #include "GraphicsView_ViewManager.h"
+ #include "LightApp_GVSelector.h"
+#endif
#define VISIBILITY_COLUMN_WIDTH 25
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.
+
+#define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
+#define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
+
+// Format of the Byte array with the windows and toolbar state is:
+// VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
+
+//Find toolbar marker position in the array in the following way:
+//since the 'toolbar marker' is not unique, find index of first occurrence of the
+//'toolbar marker' in the array and check that next string is name of the toolbar
+
+int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
+ int aResult = -1,tmp = 0;
+ int inputLen = input.length();
+ QDataStream anInputData(&input, QIODevice::ReadOnly);
+ while(tmp < inputLen) {
+ tmp = input.indexOf(QToolBarMarker, tmp + 1);
+ if(tmp < 0 )
+ break;
+ anInputData.device()->seek(tmp);
+ uchar mark;
+ anInputData>>mark;
+ int lines;
+ anInputData >> lines;
+
+ if(lines == 0 && anInputData.atEnd()){
+ //Case then array doesn't contain information about toolbars,
+ aResult = tmp;
+ break;
+ }
+
+ int pos;
+ anInputData >> pos;
+ int cnt;
+ anInputData >> cnt;
+ QString str;
+ anInputData>>str;
+ if(aFlags.contains(str)) {
+ aResult = tmp;
+ break;
+ }
+ }
+ return aResult;
+}
+
/*!
\return last global id of study
*/
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" ) );
myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
+ myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
+ myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
+ myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
#endif
connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
SUIT_Desktop* desk = desktop();
SUIT_ResourceMgr* resMgr = resourceMgr();
- //! Preferences
+ // Preferences
createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
- //! Help for modules
+ // Help menu:
+
+ // - Help for modules
+
int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
- createMenu( separator(), helpMenu, -1, 1 );
+ createMenu( separator(), helpMenu, -1, 10 );
QStringList aModuleList;
modules( aModuleList, false );
aModuleList.prepend( "GUI" );
int id = LightApp_Application::UserID + FIRST_HELP_ID;
- // help for other existing modules
-
QString aModule;
foreach( aModule, aModuleList ) {
if ( aModule.isEmpty() ) // module title (user name)
}
}
+ // - Additional help items
+
+ createMenu( separator(), helpMenu, -1, 5 );
+
+ QStringList addHelpItems = resMgr->parameters( "add_help" );
+ foreach ( QString addHelpItem, addHelpItems ) {
+ QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
+ if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
+ QAction* a = createAction( id, addHelpItem,
+ resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
+ addHelpItem, addHelpItem,
+ 0, desk, false, this, SLOT( onHelpContentsModule() ) );
+ a->setData( valueStr );
+ createMenu( a, helpMenu, -1, 5 );
+ id++;
+ }
+ }
+
//! MRU
static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
if ( icon.isNull() )
{
icon = modIcon;
- INFOS ( "****************************************************************" << std::endl
+ INFOS ( "\n****************************************************************" << std::endl
<< "* Icon for " << (*it).toLatin1().constData()
<< " not found. Using the default one." << std::endl
<< "****************************************************************" << std::endl );
createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
#endif
#ifndef DISABLE_QXGRAPHVIEWER
-//VSR: QxGraph has been replaced by QxScene
-// createActionForViewer( NewQxGraphViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_C );
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 );
+#endif
createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
break;
#endif
#ifndef DISABLE_QXGRAPHVIEWER
-//VSR: QxGraph has been replaced by QxScene
-// case NewQxGraphViewId:
-// type = QxGraph_Viewer::Type();
-// break;
case NewQxSceneViewId:
type = QxScene_Viewer::Type();
break;
+#endif
+#ifndef DISABLE_GRAPHICSVIEW
+ case NewGraphicsViewId:
+ type = GraphicsView_Viewer::Type();
+ break;
#endif
}
#endif
#ifndef DISABLE_QXGRAPHVIEWER
-//VSR: QxGraph has been replaced by QxScene
-// a = action( NewQxGraphViewId );
a = action( NewQxSceneViewId );
if( a )
a->setEnabled( activeStudy() );
#endif
+
+#ifndef DISABLE_GRAPHICSVIEW
+ a = action( NewGraphicsViewId );
+ if( a )
+ a->setEnabled( activeStudy() );
+#endif
}
/*!
// is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
QtxWebBrowser::loadUrl(helpFile);
#else
- QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile));
+ QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile));
#endif
}
}
#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);
+ QtxWebBrowser::loadUrl(helpFile, context);
#else
- QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile),context);
+ QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile), context);
#endif
}
}
}
#endif
- //#ifndef DISABLE_SUPERVGRAPHVIEWER
- // if( vmType == SUPERVGraph_Viewer::Type() )
- // {
- // viewMgr = new SUPERVGraph_ViewManager( activeStudy(), desktop(), new SUPERVGraph_Viewer() );
- // }
- //#endif
#ifndef DISABLE_QXGRAPHVIEWER
-//VSR: QxGraph has been replaced by QxScene
-// if( vmType == QxGraph_Viewer::Type() )
-// {
-// viewMgr = new QxGraph_ViewManager( activeStudy(), desktop(), new QxGraph_Viewer() );
-// }
if( vmType == QxScene_Viewer::Type() )
{
viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
//QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
}
#endif
+#ifndef DISABLE_GRAPHICSVIEW
+ if( vmType == GraphicsView_Viewer::Type() )
+ {
+ viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
+ new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
+ }
+#endif
#ifndef DISABLE_OCCVIEWER
if( vmType == OCCViewer_Viewer::Type() )
{
resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
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() ) );
+
viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
}
vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
- vm->setDynamicPreSelection( resMgr->booleanValue( "VTKViewer", "dynamic_preselection", vm->dynamicPreSelection() ) );
+ vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
+ vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
/*!Remove all windows from study.*/
void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
{
+ if ( SUIT_DataBrowser* ob = objectBrowser() )
+ ob->setModel(0);
+
CAM_Application::beforeCloseDoc( s );
}
OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
if( ob_list )
ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
-
- ob->setFilter( new LightApp_OBFilter( selectionMgr() ) );
*/
// Create OBSelector
pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
// .... -> store windows geometry
pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
+ pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
+ pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
// .... -> auto-save
int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
// ... "Trihedron" group <<end>>
// .. "3D viewer" group <<end>>
+ QString formats;
+ int bgId;
+#ifndef DISABLE_OCCVIEWER
// .. "OCC viewer" group <<start>>
int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
aValuesList.clear();
anIndicesList.clear();
txtList.clear();
- QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
+ 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 );
pref->setItemProperty( "image_formats", formats, bgId );
// ... "Background" group <<end>>
+
+ // ... "Selection" group <<start>>
+ int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
+ pref->setItemProperty( "columns", 2, occSelectionGroup );
+ // .... -> enable preselection
+ pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
+ LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
+ // .... -> enable selection
+ pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
+ LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
+ // ... "Selection" group <<end>>
+
// ... -> empty frame (for layout) <<start>>
int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
pref->setItemProperty( "margin", 0, occGen );
pref->setItemProperty( "columns", 2, occGen );
// ... -> empty frame (for layout) <<end>>
// .. "OCC viewer" group <<end>>
+#endif
+#ifndef DISABLE_VTKVIEWER
// .. "VTK viewer" group <<start>>
int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
aValuesList.clear();
anIndicesList.clear();
txtList.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" );
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" );
anIndicesList << 0 << 1;
pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
- // .... -> dynamic pre-selection
- pref->addPreference( tr( "PREF_DYNAMIC_PRESELECTION" ), vtkGen, LightApp_Preferences::Bool, "VTKViewer", "dynamic_preselection" );
+
+ // ... "Selection" group <<start>>
+ int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
+ pref->setItemProperty( "columns", 2, vtkSelectionGroup );
+ // .... -> preselection
+ int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
+ LightApp_Preferences::Selector, "VTKViewer", "preselection" );
+ aValuesList.clear();
+ anIndicesList.clear();
+ aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
+ anIndicesList << 0 << 1 << 2;
+ pref->setItemProperty( "strings", aValuesList, vtkPreselection );
+ pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
+ // .... -> enable selection
+ pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
+ // ... "Selection" group <<end>>
+
// ... -> empty frame (for layout) <<end>>
// ... space mouse sub-group <<start>>
pref->setItemProperty( "step", 0.1, transPref );
// ... -> group names sub-group <<end>>
// .. "VTK viewer" group <<end>>
+#endif
// .. "Plot2d viewer" group <<start>>
int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
#endif
}
+#ifndef DISABLE_OCCVIEWER
+ if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
+ {
+ bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
+ QList<SUIT_ViewManager*> lst;
+ viewManagers( OCCViewer_Viewer::Type(), lst );
+ QListIterator<SUIT_ViewManager*> it( lst );
+ while ( it.hasNext() )
+ {
+ SUIT_ViewModel* vm = it.next()->getViewModel();
+ if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+ continue;
+
+ OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+ occVM->enablePreselection( isToEnablePreselection );
+ }
+ }
+#endif
+
+#ifndef DISABLE_OCCVIEWER
+ if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
+ {
+ bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
+ QList<SUIT_ViewManager*> lst;
+ viewManagers( OCCViewer_Viewer::Type(), lst );
+ QListIterator<SUIT_ViewManager*> it( lst );
+ while ( it.hasNext() )
+ {
+ SUIT_ViewModel* vm = it.next()->getViewModel();
+ if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
+ continue;
+
+ OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
+ occVM->enableSelection( isToEnableSelection );
+ }
+ }
+#endif
+
if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
{
int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
#endif
#ifndef DISABLE_VTKVIEWER
- if ( sec == QString( "VTKViewer" ) && param == QString( "dynamic_preselection" ) )
+ if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
{
- bool mode = resMgr->booleanValue( "VTKViewer", "dynamic_preselection", true );
+ int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
QList<SUIT_ViewManager*> lst;
#ifndef DISABLE_SALOMEOBJECT
viewManagers( SVTK_Viewer::Type(), lst );
continue;
SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
- if( vtkVM ) vtkVM->setDynamicPreSelection( mode );
+ if( vtkVM ) vtkVM->setPreSelectionMode( mode );
+ }
+#endif
+ }
+#endif
+
+#ifndef DISABLE_VTKVIEWER
+ if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
+ {
+ bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
+ QList<SUIT_ViewManager*> lst;
+#ifndef DISABLE_SALOMEOBJECT
+ viewManagers( SVTK_Viewer::Type(), lst );
+ QListIterator<SUIT_ViewManager*> it( lst );
+ while ( it.hasNext() )
+ {
+ SUIT_ViewModel* vm = it.next()->getViewModel();
+ if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
+ continue;
+
+ SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
+ if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
}
#endif
}
if( sec=="Study" )
{
- if( param=="store_positions" )
- updateWindows();
if( param=="auto_save_interval" ) {
myAutoSaveTimer->stop();
int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
if ( sec == "ExternalBrowser" && param == "use_external_browser" ) {
if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) )
- {
- if(QtxWebBrowser::webBrowser())
- QtxWebBrowser::webBrowser()->close();
- }
+ {
+ QtxWebBrowser::shutdown();
+ }
}
#ifndef DISABLE_PLOT2DVIEWER
mru_load = false;
}
- myWinGeom.clear();
- QStringList mods = aResMgr->parameters( "windows_geometry" );
- for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it )
- {
- QByteArray arr;
- if ( aResMgr->value( "windows_geometry", *it, arr ) )
- myWinGeom.insert( *it, arr );
- }
-
myWinVis.clear();
- mods = aResMgr->parameters( "windows_visibility" );
+ QStringList mods = aResMgr->parameters( "windows_visibility" );
for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
{
QByteArray arr;
if ( mru )
mru->saveLinks( aResMgr, "MRU" );
- for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it )
- aResMgr->setValue( "windows_geometry", it.key(), it.value() );
-
for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
{
if ( !desktop() )
return;
-
- bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
- if( !store )
- return;
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
+ bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
QString modName;
if ( activeModule() )
modName = activeModule()->name();
- if ( myWinGeom.contains( modName ) )
- desktop()->restoreState( myWinGeom[modName] );
-
- if ( !myWinVis.contains( modName ) )
+ QtxResourceMgr::WorkingMode prevMode = aResMgr->workingMode();
+ aResMgr->setWorkingMode(QtxResourceMgr::IgnoreUserValues);
+ QByteArray aDefaultState;
+ aResMgr->value("windows_geometry", modName , aDefaultState );
+ QByteArray aDefaultVisibility;
+ aResMgr->value("windows_visibility", modName , aDefaultVisibility );
+ bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
+ aResMgr->setWorkingMode(prevMode);
+
+ if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
return;
- QMap<QString, bool> tbMap, dwMap;
- dockWindowsState( myWinVis[modName], tbMap, dwMap );
+ if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
+ QByteArray arr;
+ aResMgr->value("windows_geometry", modName , arr );
+ QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
+ desktop()->restoreState( aTargetArray );
+ }
- QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
- for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
- {
- QToolBar* tb = *tit;
+ if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
+ return;
- QObject* po = Qtx::findParent( tb, "QMainWindow" );
- if ( po != desktop() )
- continue;
+ QMap<QString, bool> *tbMap = 0;
+ QMap<QString, bool> *dwMap = 0;
+
+ QMap<QString, bool> userTbMap, userDwMap;
+ dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
- if ( tbMap.contains( tb->objectName() ) )
- tb->setVisible( tbMap[tb->objectName()] );
+ QMap<QString, bool> defaultTbMap, defaultDwMap;
+ if(hasDefaultVisibility) {
+ dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
}
- QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
- for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
- {
- QDockWidget* dw = *dit;
+ if(storeTb) {
+ tbMap = &userTbMap;
+ } else {
+ if(hasDefaultVisibility){
+ tbMap = &defaultTbMap;
+ }
+ }
- QObject* po = Qtx::findParent( dw, "QMainWindow" );
- if ( po != desktop() )
- continue;
+ if(storeWin) {
+ dwMap = &userDwMap;
+ } else {
+ if(hasDefaultVisibility){
+ dwMap = &defaultDwMap;
+ }
+ }
+
+ if(tbMap) {
+ QList<QToolBar*> tbList = findToolBars();
+ for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
+ {
+ QToolBar* tb = *tit;
+ if ( tbMap->contains( tb->objectName() ) ) {
+ tb->setVisible( (*tbMap)[tb->objectName()] );
+ }
+ }
+ }
- if ( dwMap.contains( dw->objectName() ) )
- dw->setVisible( dwMap[dw->objectName()] );
+ if(dwMap) {
+ QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
+ for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
+ {
+ QDockWidget* dw = *dit;
+
+ QObject* po = Qtx::findParent( dw, "QMainWindow" );
+ if ( po != desktop() )
+ continue;
+
+ if ( dwMap->contains( dw->objectName() ) )
+ dw->setVisible( (*dwMap)[dw->objectName()] );
+ }
}
}
+
/*!
Saves windows geometry
*/
if ( !desktop() )
return;
- bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
- if( !store )
+ bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
+ bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
+
+ if( !storeWin && !storeTb )
return;
QString modName;
if ( activeModule() )
modName = activeModule()->name();
- myWinGeom.insert( modName, desktop()->saveState() );
+ QByteArray arr = desktop()->saveState();
+ resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
QByteArray visArr;
if ( myWinVis.contains( modName ) )
a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
}
+#ifndef DISABLE_SALOMEOBJECT
if ( selMgr && ob ) {
SALOME_ListIO selected;
selMgr->selectedObjects( selected );
}
}
}
+#endif
selMgr->setSelectionCacheEnabled( cacheIsOn );
}
if ( !isLibFound )
{
- INFOS( "****************************************************************" << std::endl
+ INFOS( "\n****************************************************************" << std::endl
<< "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
<< "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
<< "****************************************************************" << std::endl );
return true;
}
- printf( "****************************************************************\n" );
+ printf( "\n****************************************************************\n" );
printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
if (!isPyLib)
printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
}
}
}
+
+/*!
+ Internal method.
+ Returns all top level toolbars.
+ Note : Result list contains only main window toolbars, not including toolbars from viewers.
+*/
+QList<QToolBar*> LightApp_Application::findToolBars() {
+ QList<QToolBar*> aResult;
+ QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
+ for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
+ QToolBar* tb = *tit;
+ QObject* po = Qtx::findParent( tb, "QMainWindow" );
+ if ( po != desktop() )
+ continue;
+ aResult.append(tb);
+ }
+ return aResult;
+}
+
+/*!
+ Internal method to parse toolbars and dockable windows state.
+ */
+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;
+ 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)
+ aRes = defaultState;
+ } else {
+ QDataStream aData(&aRes, QIODevice::WriteOnly);
+ QList<QToolBar*> aToolBars = findToolBars();
+
+ QStringList aNames;
+ for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
+ QToolBar* tb = *tit;
+ aNames.append(tb->objectName());
+ }
+
+ int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
+ QDataStream anInputData(&input, QIODevice::ReadOnly);
+ if(toolBarMarkerIndex < 0)
+ return aRes;
+
+ int toolBarMarkerIndexDef;
+ if(hasDefaultState) {
+ toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
+ if(toolBarMarkerIndexDef < 0)
+ return aRes;
+ }
+ QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
+
+ QDataStream* aTargetData = 0;
+ int aTargetIndex = -1;
+
+ 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;
+ } else {
+ //If no default state, write current snapshot of the dockable windows
+ if(isRestoring) {
+ aTargetData = &anInputDataCur;
+ int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
+ aTargetIndex = toolBarMarkerIndexCur;
+ }
+ }
+ }
+
+ if(aTargetData && aTargetIndex >= 0 ) {
+ aTargetData->device()->seek(0);
+ while( aTargetData->device()->pos() < aTargetIndex ) {
+ uchar ch;
+ *aTargetData >> ch;
+ aData<<ch;
+ }
+ isDockWinWriten = true;
+ }
+
+ aTargetData = 0;
+ aTargetIndex = -1;
+
+ if(processTb) {
+ aTargetData = &anInputData;
+ aTargetIndex = toolBarMarkerIndex;
+ } else {
+ if(hasDefaultState) {
+ aTargetData = &anInputDataDef;
+ aTargetIndex = toolBarMarkerIndexDef;
+ }
+ }
+
+ if(aTargetData && aTargetIndex >= 0) {
+ int index;
+ if(!isDockWinWriten ) {
+ //Write version marker
+ int marker, version;
+ aTargetData->device()->seek(0);
+ *aTargetData >> marker;
+ *aTargetData >> version;
+ aData << marker;
+ aData << version;
+ aData << (uchar) QDockWidgetMarker;
+ aData << (int) 0;
+ int shift = 4*sizeof(int) + sizeof(QSize);
+ index = aTargetIndex - shift;
+ } else {
+ index = aTargetIndex;
+ }
+
+ aTargetData->device()->seek(index);
+ while(!aTargetData->atEnd()) {
+ uchar ch;
+ *aTargetData >> ch;
+ aData << ch;
+ }
+ } else { // Not treat toolbars
+ aData << (uchar) QToolBarMarker;
+ aData << (int) 0; //Nb toolbars = 0
+ }
+ }
+ return aRes;
+}
+
+/*!
+ \brief Emits operationFinished signal.
+ \param theModuleName the name of the module which perfomed the operation
+ \param theOperationName the operation name
+ \param theEntryList the list of the created objects entries
+*/
+void LightApp_Application::emitOperationFinished( const QString& theModuleName,
+ const QString& theOperationName,
+ const QStringList& theEntryList )
+{
+ emit operationFinished( theModuleName, theOperationName, theEntryList );
+}