1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39 #include <SalomePyConsole_Console.h>
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
61 #include <GUI_version.h>
63 #include <SALOME_Event.h>
65 #ifdef USE_SALOME_STYLE
66 #include <Style_Salome.h>
67 #include <Style_PrefDlg.h>
68 #endif // USE_SALOME_STYLE
70 #include <CAM_Module.h>
71 #include <CAM_DataModel.h>
72 #include <CAM_Study.h>
73 #include <STD_TabDesktop.h>
75 #include <SUIT_DataBrowser.h>
76 #include <SUIT_Session.h>
77 #include <SUIT_Study.h>
78 #include <SUIT_FileDlg.h>
79 #include <SUIT_ResourceMgr.h>
80 #include <SUIT_ShortcutMgr.h>
81 #include <SUIT_Tools.h>
82 #include <SUIT_Accel.h>
83 #include <SUIT_MessageBox.h>
84 #include <SUIT_ViewWindow.h>
87 #include <QtxToolBar.h>
88 #include <QtxTreeView.h>
89 #include <QtxMRUAction.h>
90 #include <QtxDockAction.h>
91 #include <QtxDockWidget.h>
92 #include <QtxActionToolMgr.h>
93 #include <QtxSearchTool.h>
94 #include <QtxWorkstack.h>
97 #include <LogWindow.h>
99 #ifndef DISABLE_GLVIEWER
100 #include <GLViewer_Viewer.h>
101 #include <GLViewer_ViewManager.h>
102 #include "LightApp_GLSelector.h"
105 #ifndef DISABLE_PLOT2DVIEWER
106 #include <Plot2d_ViewManager.h>
107 #include <Plot2d_ViewModel.h>
108 #include <Plot2d_ViewWindow.h>
109 #include <Plot2d_ViewFrame.h>
110 #include "LightApp_Plot2dSelector.h"
111 #ifndef DISABLE_SALOMEOBJECT
112 #include <SPlot2d_ViewModel.h>
114 #include <Plot2d_ViewModel.h>
118 #ifndef DISABLE_OCCVIEWER
119 #include <OCCViewer_ViewManager.h>
120 #include <OCCViewer_ViewFrame.h>
121 #include <OCCViewer_ViewPort3d.h>
122 #ifndef DISABLE_SALOMEOBJECT
123 #include <SOCC_ViewModel.h>
125 #include <OCCViewer_ViewModel.h>
127 #include "LightApp_OCCSelector.h"
130 #ifndef DISABLE_VTKVIEWER
131 #ifndef DISABLE_SALOMEOBJECT
132 #include <SVTK_ViewModel.h>
133 #include <SVTK_ViewManager.h>
134 #include "LightApp_VTKSelector.h"
136 #include <VTKViewer_ViewModel.h>
137 #include <VTKViewer_ViewManager.h>
139 #include <VTKViewer_ViewModel.h>
142 #ifndef DISABLE_QXGRAPHVIEWER
143 #include <QxScene_ViewManager.h>
144 #include <QxScene_ViewModel.h>
145 #include <QxScene_ViewWindow.h>
148 #ifndef DISABLE_GRAPHICSVIEW
149 #include "GraphicsView_Viewer.h"
150 #include "GraphicsView_ViewManager.h"
151 #include "LightApp_GVSelector.h"
154 #ifndef DISABLE_PVVIEWER
155 #include "PVViewer_ViewManager.h"
156 #include "PVViewer_ViewWindow.h"
157 #include "PVViewer_ViewModel.h"
160 #ifndef DISABLE_PYVIEWER
161 #include <PyViewer_ViewManager.h>
162 #include <PyViewer_ViewModel.h>
163 #include <PyViewer_ViewWindow.h>
167 #define VISIBILITY_COLUMN_WIDTH 25
173 #include <QStringList>
175 #include <QApplication>
177 #include <QStatusBar>
179 #include <QObjectList>
181 #include <QInputDialog>
182 #include <QFontDatabase>
184 #include <QByteArray>
188 #include <QHeaderView>
193 #include <utilities.h>
195 #define FIRST_HELP_ID 1000000
197 #ifndef DISABLE_SALOMEOBJECT
198 #include <SALOME_InteractiveObject.hxx>
199 #include <SALOME_ListIO.hxx>
202 #include <Standard_Version.hxx>
204 #define ToolBarMarker 0
205 #define DockWidgetMarker 1
207 static const char* imageEmptyIcon[] = {
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "...................."};
231 int LightApp_Application::lastStudyId = 0;
233 // Markers used to parse array with dockable windows and toolbars state.
234 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
235 // in the Qt source code.
237 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
238 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
240 // Format of the Byte array with the windows and toolbar state is:
241 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
243 //Find toolbar marker position in the array in the following way:
244 //since the 'toolbar marker' is not unique, find index of first occurrence of the
245 //'toolbar marker' in the array and check that next string is name of the toolbar
247 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
248 int aResult = -1,tmp = 0;
249 int inputLen = input.length();
250 QDataStream anInputData(&input, QIODevice::ReadOnly);
251 while(tmp < inputLen) {
252 tmp = input.indexOf(QToolBarMarker, tmp + 1);
255 anInputData.device()->seek(tmp);
259 anInputData >> lines;
261 if(lines == 0 && anInputData.atEnd()){
262 //Case then array doesn't contain information about toolbars,
273 if(aFlags.contains(str)) {
282 \return last global id of study
284 int LightApp_Application::studyId()
286 return LightApp_Application::lastStudyId;
289 /*!Create new instance of LightApp_Application.*/
290 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
292 return new LightApp_Application();
295 /*! \var global preferences of LightApp */
296 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
300 \class LightApp_Application
301 Application containing LightApp module
305 LightApp_Application::LightApp_Application()
306 : CAM_Application( false ),
308 myScreenHelper(new LightApp_FullScreenHelper())
310 Q_INIT_RESOURCE( LightApp );
312 STD_TabDesktop* desk = new STD_TabDesktop();
313 desk->setFullScreenAllowed(false);
314 desk->setMinimizeAllowed(false);
318 // initialize auto save timer
319 myAutoSaveTimer = new QTimer( this );
320 myAutoSaveTimer->setSingleShot( true );
321 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
323 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
325 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
326 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
328 desktop()->setWindowIcon( aLogo );
329 desktop()->setDockableMenuBar( false );
330 desktop()->setDockableStatusBar( false );
332 // base logo (salome itself)
333 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
334 // extra logo (salome-based application)
335 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
339 mySelMgr = new LightApp_SelectionMgr( this );
341 myAccel = SUIT_Accel::getAccel();
343 #ifndef DISABLE_OCCVIEWER
344 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
351 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
354 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
355 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
357 #ifndef DISABLE_VTKVIEWER
358 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
371 #ifndef DISABLE_PLOT2DVIEWER
372 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
382 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
383 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
384 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
385 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
386 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
389 // Set existing font for the python console in resources
390 if( !aResMgr->hasValue( "PyConsole", "font" ) )
393 QFont f = aResMgr->fontValue( "PyConsole", "font" );
395 QStringList famdb = fdb.families();
397 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
400 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
402 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
405 if ( famdb.contains(aFamily) )
407 f.setFamily( aFamily );
408 aResMgr->setValue( "PyConsole", "font", f );
415 *\li Save window geometry.
416 *\li Save desktop geometry.
417 *\li Save resource maneger.
418 *\li Delete selection manager.
420 LightApp_Application::~LightApp_Application()
423 delete myScreenHelper;
426 /*!Start application.*/
427 void LightApp_Application::start()
429 CAM_Application::start();
432 updateViewManagers();
433 updateCommandsStatus();
436 desktop()->statusBar()->showMessage( "" );
438 LightApp_EventFilter::Init();
441 /*!Closeapplication.*/
442 void LightApp_Application::closeApplication()
444 QProcess::startDetached( "HelpBrowser",
445 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
447 CAM_Application::closeApplication();
450 /*!Gets application name.*/
451 QString LightApp_Application::applicationName() const
453 static QString _app_name;
454 if ( _app_name.isEmpty() )
455 _app_name = tr( "APP_NAME" );
459 /*!Gets application version.*/
460 QString LightApp_Application::applicationVersion() const
462 static QString _app_version;
464 if ( _app_version.isEmpty() )
466 QString resVersion = tr( "APP_VERSION" );
467 if ( resVersion != "APP_VERSION" )
469 _app_version = resVersion;
473 _app_version = GUI_VERSION_STR;
479 /*!Load module by \a name.*/
480 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
482 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
485 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
486 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
487 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
492 /*!Activate module by \a modName*/
493 bool LightApp_Application::activateModule( const QString& modName )
496 CAM_Module* prevMod = activeModule();
499 actName = prevMod->moduleName();
501 if ( actName == modName )
504 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
506 saveDockWindowsState();
508 bool status = CAM_Application::activateModule( modName );
510 updateModuleActions();
518 updateViewManagers();
520 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
521 if ( objectBrowser()->root() != activeStudy()->root() )
522 objectBrowser()->setRoot( activeStudy()->root() );
523 updateObjectBrowser( true );
526 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
531 /*!Gets selection manager.*/
532 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
537 /*!Creat action "New window" for certain type of viewer:*/
538 void LightApp_Application::createActionForViewer( const int id,
540 const QString& suffix,
543 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
544 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
545 QAction* a = createAction( id, // menu action id
552 false, // toggle flag
554 SLOT( onNewWindow() ) ); // slot
555 createMenu( a, parentId, -1 );
560 void LightApp_Application::createActions()
562 CAM_Application::createActions();
564 SUIT_Desktop* desk = desktop();
565 SUIT_ResourceMgr* resMgr = resourceMgr();
568 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
569 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
570 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
574 // - Help for modules
576 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
577 createMenu( separator(), helpMenu, -1, 10 );
578 QStringList aModuleList;
579 modules( aModuleList, false );
580 aModuleList.prepend( "GUI" );
581 aModuleList.prepend( "KERNEL" );
583 int id = LightApp_Application::UserID + FIRST_HELP_ID;
586 foreach( aModule, aModuleList ) {
587 if ( aModule.isEmpty() ) // module title (user name)
589 IMap <QString, QString> helpData; // list of help files for the module
590 QString helpSubMenu; // help submenu name (empty if not needed)
591 QString modName = moduleName( aModule ); // module name
592 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
593 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
594 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
596 if (resMgr->hasValue( modName, "documentation" ) )
597 docSection = resMgr->stringValue(modName, "documentation");
598 else if ( resMgr->hasSection( modName + "_documentation" ) )
599 docSection = modName + "_documentation";
600 if ( !docSection.isEmpty() ) {
601 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
602 QStringList listOfParam = resMgr->parameters( docSection );
603 foreach( QString paramName, listOfParam ) {
604 QString valueStr = resMgr->stringValue( docSection, paramName );
605 if ( !valueStr.isEmpty() ) {
606 QFileInfo fi( valueStr );
607 if ( fi.isRelative() && !modDir.isEmpty() )
608 valueStr = Qtx::addSlash( modDir ) + valueStr;
609 if ( QFile::exists( valueStr ) )
610 helpData.insert( paramName.arg( aModule ), valueStr );
615 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
616 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
617 QString indexFile = idxLst.join( QDir::separator() ); // index file
618 if ( QFile::exists( indexFile ) )
619 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
622 IMapConstIterator<QString, QString > fileIt;
623 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
624 QString helpFileName = fileIt.key();
625 // remove all '//' occurances
626 while ( helpFileName.contains( "//" ) )
627 helpFileName.replace( "//", "" );
628 // obtain submenus hierarchy if given
629 QStringList smenus = helpFileName.split( "/" );
630 helpFileName = smenus.last();
632 QAction* a = createAction( id, helpFileName,
633 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
634 helpFileName, helpFileName,
635 0, desk, false, this, SLOT( onHelpContentsModule() ) );
636 a->setData( fileIt.value() );
637 if ( !helpSubMenu.isEmpty() ) {
638 smenus.prepend( helpSubMenu );
640 // create sub-menus hierarchy
641 int menuId = helpMenu;
642 foreach ( QString subMenu, smenus ) {
643 menuId = createMenu( subMenu, menuId, -1, 0 );
645 createMenu( a, menuId, -1, 0 );
650 // - Additional help items
652 createMenu( separator(), helpMenu, -1, 5 );
654 QStringList addHelpItems = resMgr->parameters( "add_help" );
655 foreach ( QString addHelpItem, addHelpItems ) {
656 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
657 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
658 QAction* a = createAction( id, addHelpItem,
659 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
660 addHelpItem, addHelpItem,
661 0, desk, false, this, SLOT( onHelpContentsModule() ) );
662 a->setData( valueStr );
663 createMenu( a, helpMenu, -1, 5 );
669 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
670 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
671 registerAction( MRUId, mru );
673 // default icon for neutral point ('SALOME' module)
674 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
675 if ( defIcon.isNull() )
676 defIcon = QPixmap( imageEmptyIcon );
678 //! default icon for any module
679 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
680 if ( modIcon.isNull() )
681 modIcon = QPixmap( imageEmptyIcon );
684 modules( modList, false );
686 if ( modList.count() > 1 )
688 LightApp_ModuleAction* moduleAction =
689 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
691 QMap<QString, QString> iconMap;
692 moduleIconNames( iconMap );
694 const int iconSize = 20;
696 QStringList::Iterator it;
697 for ( it = modList.begin(); it != modList.end(); ++it )
699 if ( !isLibExists( *it ) )
702 QString modName = moduleName( *it );
704 if ( !isModuleAccessible( *it ) )
708 if ( iconMap.contains( *it ) )
709 iconName = iconMap[*it];
711 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
715 INFOS ( "\n****************************************************************" << std::endl
716 << "* Icon for " << (*it).toLatin1().constData()
717 << " not found. Using the default one." << std::endl
718 << "****************************************************************" << std::endl );
721 icon = Qtx::scaleIcon( icon, iconSize );
723 moduleAction->insertModule( *it, icon );
726 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
727 this, SLOT( onModuleActivation( const QString& ) ) );
728 registerAction( ModulesListId, moduleAction );
732 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
733 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
735 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
736 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
737 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
738 0, desk, false, this, SLOT( onCloseAllWindow() ) );
739 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
740 0, desk, false, this, SLOT( onGroupAllWindow() ) );
742 createMenu( CloseId, windowMenu, 0, -1 );
743 createMenu( CloseAllId, windowMenu, 0, -1 );
744 createMenu( GroupAllId, windowMenu, 0, -1 );
745 createMenu( separator(), windowMenu, -1, 0 );
747 #ifndef DISABLE_GLVIEWER
748 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
750 #ifndef DISABLE_PLOT2DVIEWER
751 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
753 #ifndef DISABLE_OCCVIEWER
754 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
756 #ifndef DISABLE_VTKVIEWER
757 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
759 #ifndef DISABLE_QXGRAPHVIEWER
760 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
762 #ifndef DISABLE_GRAPHICSVIEW
763 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
765 #ifndef DISABLE_PVVIEWER
766 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
768 #ifndef DISABLE_PYVIEWER
769 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
772 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
773 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
774 createMenu( RenameId, windowMenu, -1 );
776 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
777 createMenu( PreferencesId, fileMenu, 50, -1 );
778 createMenu( separator(), fileMenu, -1, 50, -1 );
780 createMenu( separator(), fileMenu, -1, 100, -1 );
781 createMenu( MRUId, fileMenu, 100, -1 );
782 createMenu( separator(), fileMenu, -1, 100, -1 );
784 #ifdef USE_SALOME_STYLE
785 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
786 0, desk, false, this, SLOT( onStylePreferences() ) );
787 #endif // USE_SALOME_STYLE
789 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
790 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
793 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
794 createMenu( separator(), viewMenu, -1, 20, -1 );
795 #ifdef USE_SALOME_STYLE
796 createMenu( StyleId, viewMenu, 20, -1 );
797 #endif // USE_SALOME_STYLE
798 createMenu( FullScreenId, viewMenu, 20, -1 );
800 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
801 QString( "SalomeModules" ) ); // name (language-independant)
802 createTool( ModulesListId, modTBar );
805 /*!On module activation action.*/
806 void LightApp_Application::onModuleActivation( const QString& modName )
808 // Force user to create/open a study before module activation
809 QMap<QString, QString> iconMap;
810 moduleIconNames( iconMap );
811 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
813 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
815 bool cancelled = false;
817 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
818 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
819 QMap<int, QString> opmap = activateModuleActions();
820 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
821 aDlg.addButton( it.value(), it.key() );
823 int res = aDlg.exec();
825 // some operation is selected
826 moduleActionSelected( res );
830 putInfo( tr("INF_CANCELLED") );
832 LightApp_ModuleAction* moduleAction =
833 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
835 moduleAction->setActiveModule( QString() );
841 activateModule( modName );
844 /*!Default module activation.*/
845 QString LightApp_Application::defaultModule() const
847 QStringList aModuleNames;
848 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
849 //! If there's the one and only module --> activate it automatically
850 //! TODO: Possible improvement - default module can be taken from preferences
851 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
854 /*!On new window slot.*/
855 void LightApp_Application::onNewWindow()
857 const QObject* obj = sender();
858 if ( !obj || !obj->inherits( "QAction" ) )
862 int id = actionId( (QAction*)obj );
865 #ifndef DISABLE_GLVIEWER
867 type = GLViewer_Viewer::Type();
870 #ifndef DISABLE_PLOT2DVIEWER
872 type = Plot2d_Viewer::Type();
875 #ifndef DISABLE_OCCVIEWER
877 type = OCCViewer_Viewer::Type();
880 #ifndef DISABLE_VTKVIEWER
882 type = VTKViewer_Viewer::Type();
885 #ifndef DISABLE_QXGRAPHVIEWER
886 case NewQxSceneViewId:
887 type = QxScene_Viewer::Type();
890 #ifndef DISABLE_GRAPHICSVIEW
891 case NewGraphicsViewId:
892 type = GraphicsView_Viewer::Type();
895 #ifndef DISABLE_PVVIEWER
897 type = PVViewer_Viewer::Type();
900 #ifndef DISABLE_PYVIEWER
902 type = PyViewer_Viewer::Type();
907 if ( !type.isEmpty() )
908 createViewManager( type );
912 SLOT: Creates new document
914 void LightApp_Application::onNewDoc()
916 #ifdef SINGLE_DESKTOP
917 if ( !checkExistingDoc() )
921 //asl: fix for 0020515
922 saveDockWindowsState();
924 CAM_Application::onNewDoc();
928 SLOT: Opens new document
930 void LightApp_Application::onOpenDoc()
932 SUIT_Study* study = activeStudy();
934 #ifdef SINGLE_DESKTOP
935 if ( !checkExistingDoc() )
939 CAM_Application::onOpenDoc();
941 if ( !study ) // new study will be create in THIS application
944 updateViewManagers();
949 SLOT: Opens new document.
950 \param aName - name of file
952 bool LightApp_Application::onOpenDoc( const QString& aName )
954 #ifdef SINGLE_DESKTOP
955 if ( !checkExistingDoc() )
959 saveDockWindowsState();
961 // We should take mru action first because this application instance can be deleted later.
962 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
964 bool res = CAM_Application::onOpenDoc( aName );
969 mru->insert( aName );
971 mru->remove( aName );
977 SLOT: Displays "About" message box
979 void LightApp_Application::onHelpAbout()
981 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
986 Private SLOT: Called on selection is changed
987 Dispatchs active module that selection is changed
989 void LightApp_Application::onSelection()
991 onSelectionChanged();
993 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
994 ((LightApp_Module*)activeModule())->selectionChanged();
999 \param study - SUIT_Study.
1001 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1003 CAM_Application::setActiveStudy( study );
1007 Enables/Disables menu items and toolbar buttons. Rebuild menu
1009 void LightApp_Application::updateCommandsStatus()
1011 CAM_Application::updateCommandsStatus();
1014 #ifndef DISABLE_GLVIEWER
1015 a = action( NewGLViewId );
1017 a->setEnabled( activeStudy() );
1020 #ifndef DISABLE_PLOT2DVIEWER
1021 a = action( NewPlot2dId );
1023 a->setEnabled( activeStudy() );
1026 #ifndef DISABLE_OCCVIEWER
1027 a = action( NewOCCViewId );
1029 a->setEnabled( activeStudy() );
1032 #ifndef DISABLE_VTKVIEWER
1033 a = action( NewVTKViewId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_QXGRAPHVIEWER
1039 a = action( NewQxSceneViewId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_GRAPHICSVIEW
1045 a = action( NewGraphicsViewId );
1047 a->setEnabled( activeStudy() );
1050 #ifndef DISABLE_PVVIEWER
1051 a = action( NewPVViewId );
1053 a->setEnabled( activeStudy() );
1056 #ifndef DISABLE_PYVIEWER
1057 a = action( NewPyViewerId );
1059 a->setEnabled( activeStudy() );
1065 Runs system command in separate thread
1067 class RunBrowser: public QThread
1070 RunBrowser( LightApp_Application* app,
1071 const QString& theApp,
1072 const QString& theParams,
1073 const QString& theHelpFile,
1074 const QString& theContext = QString() )
1076 myParams( theParams ),
1077 myContext( theContext ),
1081 //For the external browser always specify 'file://' protocol,
1082 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1083 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1088 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1089 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1091 QProcess* proc = new QProcess();
1093 proc->start( aCommand );
1094 if ( !proc->waitForStarted() ) {
1095 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1096 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1097 ce2000->setData( msg );
1098 QApplication::postEvent( myLApp, ce2000 );
1109 LightApp_Application* myLApp;
1113 SLOT: Displays help contents for choosen module
1115 void LightApp_Application::onHelpContentsModule()
1117 const QAction* a = (QAction*) sender();
1118 QString helpFile = a->data().toString();
1119 if ( helpFile.isEmpty() ) return;
1121 SUIT_ResourceMgr* resMgr = resourceMgr();
1124 platform = "winapplication";
1126 platform = "application";
1128 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1130 QString quote("\"");
1131 anApp.prepend( quote );
1132 anApp.append( quote );
1134 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1135 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1137 if( useExtBrowser ) {
1138 if ( !anApp.isEmpty() ) {
1139 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1143 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1144 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1145 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1147 showPreferences( tr( "PREF_APP" ) );
1151 QStringList parameters;
1152 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1153 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1154 parameters << helpFile;
1155 QProcess::startDetached( "HelpBrowser", parameters );
1160 SLOT: Displays help contents for choosen dialog
1162 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1163 const QString& theFileName,
1164 const QString& theContext )
1166 QString fileName = theFileName;
1167 QString context = theContext;
1168 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1169 // context might be passed within theFileName argument
1170 QStringList comps = fileName.split("#");
1171 if ( comps.count() > 1 ) {
1172 context = comps.last();
1174 fileName = comps.join("#");
1178 QString homeDir = "";
1179 if ( !theComponentName.isEmpty() ) {
1180 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1181 if ( !dir.isEmpty() )
1182 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1183 Qtx::addSlash( "share" ) +
1184 Qtx::addSlash( "doc" ) +
1185 Qtx::addSlash( "salome" ) +
1186 Qtx::addSlash( "gui" ) +
1187 Qtx::addSlash( theComponentName ) );
1190 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1191 SUIT_ResourceMgr* resMgr = resourceMgr();
1194 platform = "winapplication";
1196 platform = "application";
1198 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1200 QString quote("\"");
1201 anApp.prepend( quote );
1202 anApp.append( quote );
1205 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1208 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1210 if ( !anApp.isEmpty() ) {
1211 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1215 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1216 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1217 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1218 showPreferences( tr( "PREF_APP" ) );
1222 QStringList parameters;
1223 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1224 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1225 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1226 QProcess::startDetached( "HelpBrowser", parameters );
1231 Sets enable or disable some actions on selection changed.
1233 void LightApp_Application::onSelectionChanged()
1235 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1236 bool canCopy = m ? m->canCopy() : false;
1237 bool canPaste = m ? m->canPaste() : false;
1239 action( EditCopyId )->setEnabled(canCopy);
1240 action( EditPasteId )->setEnabled(canPaste);
1244 SLOT: Performs some actions when dockable windows are triggered
1246 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1250 QWidget* LightApp_Application::dockWindow( const int id ) const
1253 if ( myWin.contains( id ) )
1258 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1263 QDockWidget* dock = 0;
1264 QWidget* w = wid->parentWidget();
1265 while ( w && !dock )
1267 dock = ::qobject_cast<QDockWidget*>( w );
1268 w = w->parentWidget();
1273 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1278 if ( wid != dockWindow( id ) )
1279 removeDockWindow( id );
1281 myWin.insert( id, wid );
1283 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1284 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1286 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1287 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1288 QString( "%1Dock" ).arg( wid->objectName() ) );
1289 dock->setWidget( wid );
1290 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1291 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1292 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1294 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1295 if ( !accel.isEmpty() )
1296 dock->toggleViewAction()->setShortcut( accel );
1301 void LightApp_Application::removeDockWindow( const int id )
1303 QWidget* wid = dockWindow( id );
1309 QDockWidget* dock = windowDock( wid );
1313 dock->setWidget( 0 );
1314 wid->setParent( 0 );
1315 wid->setVisible( false );
1319 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1321 QDockWidget* dock = windowDock( dockWindow( id ) );
1322 if ( dock && desktop() ) {
1323 desktop()->addDockWidget( place, dock );
1324 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1325 if ( a ) a->update();
1331 \param flag - key for window
1332 \param studyId - study id
1333 Flag used how identificator of window in windows list.
1335 QWidget* LightApp_Application::getWindow( const int flag, const int )
1337 QWidget* wid = dockWindow( flag );
1339 insertDockWindow( flag, wid = createWindow( flag ) );
1341 QMap<int, int> winMap;
1342 currentWindows( winMap );
1343 if ( winMap.contains( flag ) )
1344 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1350 \return Object Browser
1352 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1354 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1360 LogWindow* LightApp_Application::logWindow()
1362 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1365 #ifndef DISABLE_PYCONSOLE
1367 This returns the python console integrated to the GUI. Depending
1368 when you request the python console, this function could return
1369 null. Then the optional parameter force (default to false) can be
1370 set to force the creation of the python console if it is not done
1372 \param force - if true, the pythonConsole is created if it does not exist yet
1373 \return Python Console
1375 SalomePyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1377 QWidget* wid = dockWindow( WT_PyConsole );
1378 if ( !wid && force==true) {
1379 wid = getWindow(WT_PyConsole);
1381 return qobject_cast<SalomePyConsole_Console*>( wid );
1386 Updates object browser and maybe data models
1387 \param updateModels - if it is true, then data models are updated
1389 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1391 // update existing data models
1394 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1395 if ( objectBrowser() )
1396 objectBrowser()->setAutoUpdate( false );
1398 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1400 CAM_Study::ModelList dm_list;
1401 study->dataModels( dm_list );
1402 QListIterator<CAM_DataModel*> it( dm_list );
1403 while ( it.hasNext() ) {
1404 CAM_DataModel* camDM = it.next();
1405 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1406 ((LightApp_DataModel*)camDM)->update();
1410 if( objectBrowser() )
1411 objectBrowser()->setAutoUpdate( isAutoUpdate );
1414 if ( objectBrowser() ) {
1415 objectBrowser()->updateGeometry();
1416 objectBrowser()->updateTree( 0, false );
1423 LightApp_Preferences* LightApp_Application::preferences() const
1425 return preferences( false );
1429 \return first view manager of some type
1430 \param vmType - type of view manager
1431 \param create - is it necessary to create view manager in case, when there is no manager of such type
1433 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1435 SUIT_ViewManager* aVM = viewManager( vmType );
1436 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1438 if ( anActiveVM && anActiveVM->getType() == vmType )
1441 if ( aVM && create )
1443 if ( !aVM->getActiveView() )
1446 desktop()->setActiveWindow( aVM->getActiveView() );
1449 aVM = createViewManager( vmType );
1455 Creates view manager of some type
1456 \param vmType - type of view manager
1458 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1460 SUIT_ResourceMgr* resMgr = resourceMgr();
1462 SUIT_ViewManager* viewMgr = 0;
1463 #ifndef DISABLE_GLVIEWER
1464 if( vmType == GLViewer_Viewer::Type() )
1466 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1467 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1470 #ifndef DISABLE_PLOT2DVIEWER
1471 if( vmType == Plot2d_Viewer::Type() )
1473 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1475 #ifndef DISABLE_SALOMEOBJECT
1476 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1478 new LightApp_Plot2dSelector( v, mySelMgr );
1480 vm = new Plot2d_Viewer();
1482 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1483 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1486 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1487 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1491 #ifndef DISABLE_QXGRAPHVIEWER
1492 if( vmType == QxScene_Viewer::Type() )
1494 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1495 QxScene_Viewer* vm = new QxScene_Viewer();
1496 viewMgr->setViewModel( vm );
1497 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1500 #ifndef DISABLE_GRAPHICSVIEW
1501 if( vmType == GraphicsView_Viewer::Type() )
1503 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1504 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1507 #ifndef DISABLE_PVVIEWER
1508 if( vmType == PVViewer_Viewer::Type() )
1510 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1511 viewMgr->getActiveView()->setFocus();
1514 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1518 #ifndef DISABLE_PYVIEWER
1519 if( vmType == PyViewer_Viewer::Type() )
1521 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1524 #ifndef DISABLE_OCCVIEWER
1525 if( vmType == OCCViewer_Viewer::Type() )
1527 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1528 OCCViewer_Viewer* vm;
1529 #ifndef DISABLE_SALOMEOBJECT
1530 vm = new SOCC_Viewer();
1532 vm = new OCCViewer_Viewer( true );
1534 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1535 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1536 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1537 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1538 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1539 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1540 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1541 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1543 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1544 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1545 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1546 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1547 #if OCC_VERSION_LARGE > 0x06090000
1548 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1549 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1550 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1551 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1552 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1553 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1555 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1556 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1557 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1559 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1560 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1561 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1562 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1563 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1564 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1565 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1566 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1569 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1570 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1573 #ifndef DISABLE_VTKVIEWER
1574 #ifndef DISABLE_SALOMEOBJECT
1575 if ( vmType == SVTK_Viewer::Type() )
1577 if ( vmType == VTKViewer_Viewer::Type() )
1580 #ifndef DISABLE_SALOMEOBJECT
1581 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1582 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1585 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1586 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1587 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1588 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1589 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1590 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1591 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1592 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1593 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1594 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1595 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1596 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1597 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1598 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1599 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1600 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1601 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1602 new LightApp_VTKSelector( vm, mySelMgr );
1605 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1606 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1608 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1616 addViewManager( viewMgr );
1617 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1619 if ( viewWin && desktop() ) {
1620 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1621 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1627 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1629 SUIT_ResourceMgr* resMgr = resourceMgr();
1631 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1633 new LightApp_WgViewModel( vmType, w ) );
1634 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1636 addViewManager( vm );
1637 SUIT_ViewWindow* vw = vm->createViewWindow();
1638 if ( vw && desktop() ) {
1639 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1640 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1643 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1644 myUserWmTypes << vmType;
1649 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1651 SUIT_ResourceMgr* resMgr = resourceMgr();
1653 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1657 QString vmType = vm->getType();
1659 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1661 addViewManager( vm );
1662 SUIT_ViewWindow* vw = vm->createViewWindow();
1663 if ( vw && desktop() ) {
1664 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1665 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1668 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1669 myUserWmTypes << vmType;
1675 SLOT: Removes view manager from application
1677 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1679 removeViewManager( theVM );
1683 Protected SLOT: On study created.
1684 \param theStudy - just created study
1686 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1688 SUIT_DataObject* aRoot = 0;
1689 if ( theStudy && theStudy->root() )
1691 aRoot = theStudy->root();
1692 //aRoot->setName( tr( "DATA_MODELS" ) );
1695 getWindow( WT_ObjectBrowser );
1697 loadDockWindowsState();
1699 if ( objectBrowser() )
1700 objectBrowser()->setRoot( aRoot );
1702 activateModule( defaultModule() );
1704 if ( objectBrowser() )
1705 objectBrowser()->openLevels();
1707 #ifndef DISABLE_PYCONSOLE
1708 if( pythonConsole() )
1709 getPyInterp()->initStudy();
1714 Protected SLOT: On study opened.
1715 \param theStudy - just opened study
1717 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1719 SUIT_DataObject* aRoot = 0;
1720 if ( theStudy && theStudy->root() )
1722 aRoot = theStudy->root();
1726 getWindow( WT_ObjectBrowser );
1728 loadDockWindowsState();
1730 if ( objectBrowser() )
1731 objectBrowser()->setRoot( aRoot );
1733 activateModule( defaultModule() );
1735 if ( objectBrowser() )
1736 objectBrowser()->openLevels();
1738 #ifndef DISABLE_PYCONSOLE
1739 if( pythonConsole() )
1740 getPyInterp()->initStudy();
1746 /*!Protected SLOT. On study saved.*/
1747 void LightApp_Application::onStudySaved( SUIT_Study* s )
1749 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1751 mru->insert( s->studyName() );
1756 /*!Protected SLOT. On study closed.*/
1757 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1760 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1761 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1764 // stop auto-save timer
1765 myAutoSaveTimer->stop();
1767 // Bug 10396: clear selection
1768 mySelMgr->clearSelected();
1770 // Bug 12944: emit signal only after clear selection
1773 activateModule( "" );
1776 /*!Protected SLOT.On desktop activated.*/
1777 void LightApp_Application::onDesktopActivated()
1779 CAM_Application::onDesktopActivated();
1780 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1782 aModule->studyActivated();
1785 void LightApp_Application::studyOpened( SUIT_Study* s )
1787 CAM_Application::studyOpened( s );
1790 updateViewManagers();
1793 void LightApp_Application::studySaved( SUIT_Study* s )
1795 CAM_Application::studyOpened( s );
1796 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1797 if ( aResMgr && activeStudy() ) {
1798 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1799 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1803 void LightApp_Application::studyCreated( SUIT_Study* s )
1805 CAM_Application::studyCreated( s );
1808 updateViewManagers();
1811 /*!Gets file filter.
1812 *\retval QString "(*.bin)"
1814 QString LightApp_Application::getFileFilter() const
1822 Shows file dialog and return user selected file name
1824 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1825 const QString& caption, QWidget* parent )
1829 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1830 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1833 /*! Gets directory*/
1834 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1838 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1841 /*! Get open file names*/
1842 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1843 const QString& caption, QWidget* parent )
1847 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1848 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1851 /*!Private SLOT. Update object browser.*/
1852 void LightApp_Application::onRefresh()
1854 updateObjectBrowser( true );
1857 /*!Private SLOT. Update actions after rename object.*/
1858 void LightApp_Application::onRenamed()
1860 activeStudy()->Modified();
1864 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1865 // To prevent reversion the window should be either aligned during movement and resize.
1866 /*!Private SLOT. Update actions after rename object.*/
1867 /*void LightApp_Application::onMoved()
1869 OCCViewer_ViewManager* viewMgr = 0;
1870 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1872 OCCViewer_ViewWindow* view = 0;
1873 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1875 view->getViewPort()->repaintViewAfterMove();
1880 /*!Private SLOT. Support drag-and-drop operation.*/
1881 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1883 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1887 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1889 aModule->dropObjects( objects, parentObj, row, action );
1892 /*!Private SLOT. On preferences.*/
1893 void LightApp_Application::onPreferences()
1895 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1898 /*!Private SLOT. On preferences.*/
1899 void LightApp_Application::showPreferences( const QString& itemText )
1901 QApplication::setOverrideCursor( Qt::WaitCursor );
1903 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1905 QApplication::restoreOverrideCursor();
1910 preferences()->activateItem( itemText );
1912 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1915 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1916 resourceMgr()->save();
1919 shortcutMgr()->updateShortcuts();
1925 /*!Protected SLOT. On preferences changed.*/
1926 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1928 LightApp_Module* sMod = 0;
1929 CAM_Module* mod = module( modName );
1930 if ( mod && mod->inherits( "LightApp_Module" ) )
1931 sMod = (LightApp_Module*)mod;
1934 sMod->preferencesChanged( section, param );
1936 preferencesChanged( section, param );
1937 // emit signal to allow additional preferences changing processing
1938 emit preferenceChanged( modName, section, param );
1941 /*!Remove all windows from study.*/
1942 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1944 saveDockWindowsState();
1946 if ( SUIT_DataBrowser* ob = objectBrowser() )
1949 CAM_Application::beforeCloseDoc( s );
1952 /*!Update actions.*/
1953 void LightApp_Application::updateActions()
1955 updateCommandsStatus();
1961 SUIT_Study* LightApp_Application::createNewStudy()
1963 LightApp_Application::lastStudyId++;
1965 LightApp_Study* aStudy = new LightApp_Study( this );
1967 // Set up processing of major study-related events
1968 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1969 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1970 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1971 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1977 Creates window by flag.
1978 \param flag - identificator of window type
1980 QWidget* LightApp_Application::createWindow( const int flag )
1984 SUIT_ResourceMgr* resMgr = resourceMgr();
1986 if ( flag == WT_ObjectBrowser )
1988 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1989 ob->setObjectName( "objectBrowser" );
1990 ob->setSortMenuEnabled( true );
1991 ob->setAutoUpdate( true );
1992 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1993 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1995 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1996 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1997 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1999 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2000 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2001 treeModel->setSearcher( this );
2002 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2003 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2005 // Mantis issue 0020136: Drag&Drop in OB
2006 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2008 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2009 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2010 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2011 this, SLOT( onRenamed( ) ) );
2015 // temporary commented
2017 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2019 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2022 // Create OBSelector
2023 new LightApp_OBSelector( ob, mySelMgr );
2024 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2025 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2027 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2029 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2030 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2031 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2033 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2035 #ifndef DISABLE_PYCONSOLE
2036 else if ( flag == WT_PyConsole )
2038 SalomePyConsole_Console* pyCons = new SalomePyConsole_EnhConsole( desktop(), getPyInterp() );
2039 pyCons->setObjectName( "pythonConsole" );
2040 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2041 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
2042 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
2043 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2046 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2049 else if ( flag == WT_LogWindow )
2051 LogWindow* logWin = new LogWindow( desktop() );
2052 logWin->setObjectName( "logWindow" );
2053 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2054 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2056 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2062 \return default windows( Object Browser, Python Console )
2063 Adds to map \a aMap.
2065 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2067 #ifndef DISABLE_PYCONSOLE
2068 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2070 if ( activeStudy() ) {
2071 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2072 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2076 /*!Default view managers*/
2077 void LightApp_Application::defaultViewManagers( QStringList& ) const
2083 \return preferences.
2084 Create preferences, if \a crt = true.
2086 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2091 LightApp_Application* that = (LightApp_Application*)this;
2093 bool toCreate = !_prefs_ && crt;
2096 _prefs_ = new LightApp_Preferences( resourceMgr() );
2097 that->createPreferences( _prefs_ );
2100 that->myPrefs = _prefs_;
2102 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2103 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2104 connect( myPrefs, SIGNAL( resetToDefaults() ),
2105 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2110 SUIT_ResourceMgr* resMgr = resourceMgr();
2112 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2113 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2115 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2119 QStringList modNameList;
2120 app->modules( modNameList, false );
2122 QMap<QString, QString> iconMap;
2123 app->moduleIconNames( iconMap );
2125 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2127 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2130 int modId = _prefs_->addPreference( *it );
2131 if ( iconMap.contains( *it ) )
2132 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2136 app->modules( modList );
2137 QListIterator<CAM_Module*> itr( modList );
2138 while ( itr.hasNext() )
2140 LightApp_Module* mod = 0;
2142 CAM_Module* anItem = itr.next();
2143 if ( anItem->inherits( "LightApp_Module" ) )
2144 mod = (LightApp_Module*)anItem;
2146 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2148 _prefs_->addPreference( mod->moduleName() );
2149 mod->createPreferences();
2150 that->emptyPreferences( mod->moduleName() );
2154 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2160 Adds new module to application
2162 void LightApp_Application::moduleAdded( CAM_Module* mod )
2164 CAM_Application::moduleAdded( mod );
2166 LightApp_Module* lightMod = 0;
2167 if ( mod && mod->inherits( "LightApp_Module" ) )
2168 lightMod = (LightApp_Module*)mod;
2170 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2172 myPrefs->addPreference( mod->moduleName() );
2173 lightMod->createPreferences();
2174 emptyPreferences( mod->moduleName() );
2178 void LightApp_Application::emptyPreferences( const QString& modName )
2180 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2181 if ( !item || !item->isEmpty() )
2184 // printf( "---------------------> Modify for empty module.\n" );
2186 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2187 frm->setIcon( item->icon() );
2188 frm->setStretch( false );
2189 item->parentItem()->insertItem( frm, item );
2190 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2197 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2202 QStringList aValuesList;
2203 QList<QVariant> anIndicesList;
2207 // . Top-level "SALOME" preferences group <<start>>
2208 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2209 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2211 // .. "General" preferences tab <<start>>
2212 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2214 // ... "Language" group <<start>>
2215 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2216 pref->setItemProperty( "columns", 2, langGroup );
2217 // .... -> application language
2218 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2219 LightApp_Preferences::Selector, "language", "language" );
2220 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2221 QList<QVariant> aIcons;
2222 foreach ( QString aLang, aLangs ) {
2223 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2225 pref->setItemProperty( "strings", aLangs, curLang );
2226 pref->setItemProperty( "icons", aIcons, curLang );
2227 pref->setItemProperty( "restart", true, curLang );
2229 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2230 LightApp_Preferences::Bool, "language", "locale" );
2231 pref->setItemProperty( "restart", true, curLocale );
2232 // ... "Language" group <<end>>
2234 // ... "Look and feel" group <<start>>
2235 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2236 pref->setItemProperty( "columns", 2, lookGroup );
2237 // .... -> show splash-screen
2238 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2239 // .... -> opaque resize
2240 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2241 // .... -> drop-down buttons
2242 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2243 // ... "Look and feel" group <<end>>
2245 // ... "Study properties" group <<start>>
2246 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2247 pref->setItemProperty( "columns", 2, studyGroup );
2248 // .... -> multi-file save
2249 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2250 // .... -> ascii save mode
2251 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2252 // .... -> store windows geometry
2253 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2254 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2255 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2256 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2257 // .... -> auto-save
2258 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2259 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2260 pref->setItemProperty( "min", 0, autoSaveInterval );
2261 pref->setItemProperty( "max", 1440, autoSaveInterval );
2262 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2263 // ... "Study properties" group <<end>>
2265 // ... "Help browser" group <<start>>
2266 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2268 QString platform = "winapplication";
2270 QString platform = "application";
2272 // .... -> browser application
2273 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2274 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2275 // .... -> browser parameters
2276 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2277 // ... "Help browser" group <<end>>
2279 // ... "Python console properties" group <<start>>
2280 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2282 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2283 // .... -> show banner
2284 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2285 // ... "Python console properties" group <<end>>
2287 // ... "MRU" preferences group <<start>>
2288 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2289 pref->setItemProperty( "columns", 4, mruGroup );
2290 // number of MRU items
2291 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2292 "MRU", "visible_count" );
2293 pref->setItemProperty( "min", 0, mruVisCount );
2294 pref->setItemProperty( "max", 100, mruVisCount );
2296 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2297 "MRU", "link_type" );
2298 aValuesList.clear();
2299 anIndicesList.clear();
2300 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2301 anIndicesList << 0 << 1 << 2 ;
2302 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2303 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2304 // ... "MRU" preferences group <<end>>
2306 // ... "Full-screen" group <<start>>
2307 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2308 pref->setItemProperty( "columns", 2, fullScreenGroup );
2309 // .... -> automatic hiding toolbars
2310 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2311 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2312 // ... "Full-screen" group <<end>>
2314 // .. "General" preferences tab <<end>>
2316 // .. "3D viewer" group <<start>>
2317 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2318 // ... -> navigation mode
2319 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2320 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2321 aValuesList.clear();
2322 anIndicesList.clear();
2323 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2324 anIndicesList << 0 << 1;
2325 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2326 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2327 // ... -> zooming mode
2328 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2329 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2330 aValuesList.clear();
2331 anIndicesList.clear();
2332 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2333 anIndicesList << 0 << 1;
2334 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2335 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2336 // ... "Trihedron" group <<start>>
2337 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2338 pref->setItemProperty( "columns", 2, occTriGroup );
2339 // .... -> trihedron size
2340 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2341 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2342 pref->setItemProperty( "min", 1.0E-06, occTS );
2343 pref->setItemProperty( "max", 1000, occTS );
2344 // .... -> relative size of trihedron
2345 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2346 // .... -> show static trihedron
2347 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2348 // ... "Trihedron" group <<end>>
2349 // .. "3D viewer" group <<end>>
2353 #ifndef DISABLE_OCCVIEWER
2354 // .. "OCC viewer" group <<start>>
2355 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2357 // .... -> Projection mode
2358 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2359 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2360 aValuesList.clear();
2361 anIndicesList.clear();
2362 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2363 anIndicesList << 0 << 1;
2364 pref->setItemProperty( "strings", aValuesList, occProjMode );
2365 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2366 #if OCC_VERSION_LARGE > 0x06090000
2367 // .... -> Stereo group
2368 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2369 pref->setItemProperty( "columns", 2, stereoGroup );
2370 // .... -> Stereo type
2371 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2372 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2373 aValuesList.clear();
2374 anIndicesList.clear();
2376 OCCViewer_Viewer::stereoData( aValuesList, idList);
2377 foreach( int gid, idList ) anIndicesList << gid;
2378 pref->setItemProperty( "strings", aValuesList, stereoType );
2379 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2381 // .... -> Anaglyph filter
2382 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2383 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2384 aValuesList.clear();
2385 anIndicesList.clear();
2386 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2387 anIndicesList << 0 << 1 << 2;
2389 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2390 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2392 // .... -> Convergence distance type
2393 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2394 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2395 aValuesList.clear();
2396 anIndicesList.clear();
2397 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2398 anIndicesList << 0 << 1;
2399 pref->setItemProperty( "strings", aValuesList, occFocusType );
2400 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2402 // .... -> Stereographic focus value
2403 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2404 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2405 pref->setItemProperty( "precision", 3, focusValue );
2406 pref->setItemProperty( "min", 1.0E-03, focusValue );
2407 pref->setItemProperty( "max", 1.0E03, focusValue );
2408 pref->setItemProperty( "step", 0.05, focusValue );
2411 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2412 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2413 aValuesList.clear();
2414 anIndicesList.clear();
2415 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2416 anIndicesList << 0 << 1;
2417 pref->setItemProperty( "strings", aValuesList, occIODType );
2418 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2420 // .... -> Interocular distance (IOD) value
2421 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2422 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2423 pref->setItemProperty( "precision", 3, IODValue );
2424 pref->setItemProperty( "min", 1.0E-03, IODValue );
2425 pref->setItemProperty( "max", 1.0E03, IODValue );
2426 pref->setItemProperty( "step", 0.05, IODValue );
2428 // .... -> Reverse stereo
2429 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2430 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2431 // .... -> Enable V-Sync
2432 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2433 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2434 // .... -> Enable quad-buffer support
2435 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2436 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2438 // ... "Background" group <<start>>
2439 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2440 // pref->setItemProperty( "columns", 2, bgGroup );
2441 aValuesList.clear();
2442 anIndicesList.clear();
2445 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2446 foreach( int gid, idList ) anIndicesList << gid;
2447 // .... -> 3D viewer background
2448 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2449 LightApp_Preferences::Background, "OCCViewer", "background" );
2450 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2451 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2452 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2453 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2454 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2455 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2456 pref->setItemProperty( "custom_enabled", false, bgId );
2457 pref->setItemProperty( "image_formats", formats, bgId );
2458 // .... -> XZ viewer background
2459 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2460 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2461 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2462 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2463 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2464 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2465 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2466 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2467 pref->setItemProperty( "custom_enabled", false, bgId );
2468 pref->setItemProperty( "image_formats", formats, bgId );
2469 // .... -> YZ viewer background
2470 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2471 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2472 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2473 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2474 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2475 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2476 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2477 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2478 pref->setItemProperty( "custom_enabled", false, bgId );
2479 pref->setItemProperty( "image_formats", formats, bgId );
2480 // .... -> XY viewer background
2481 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2482 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2483 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2484 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2485 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2486 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2487 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2488 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2489 pref->setItemProperty( "custom_enabled", false, bgId );
2490 pref->setItemProperty( "image_formats", formats, bgId );
2491 // ... "Background" group <<end>>
2494 // ... "Selection" group <<start>>
2495 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2496 pref->setItemProperty( "columns", 2, occSelectionGroup );
2497 // .... -> enable preselection
2498 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2499 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2500 // .... -> enable selection
2501 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2502 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2503 // ... "Selection" group <<end>>
2505 // ... "Clipping" group <<start>>
2506 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2507 // .... -> clipping color
2508 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2509 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2510 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2511 pref->setItemProperty( "columns", 2, texturePref );
2512 // .... -> use default texture
2513 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2514 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2515 // .... -> clipping texture
2516 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2517 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2518 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2520 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2521 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2522 // .... -> scale factor
2523 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2524 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2525 pref->setItemProperty( "precision", 3, scaleFactor );
2526 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2527 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2528 pref->setItemProperty( "step", 0.1, scaleFactor );
2529 // ... "Clipping" group <<end>>
2531 // ... "Ray tracing" group <<start>>
2532 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2533 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2534 pref->setItemProperty( "columns", 2, rtPref );
2536 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2537 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2538 pref->setItemProperty( "min", 1, rt_depth );
2539 pref->setItemProperty( "max", 10, rt_depth );
2540 pref->setItemProperty( "step", 1, rt_depth );
2541 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2542 // .... -> specular reflections
2543 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2544 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2545 // .... -> adaptive anti-aliasing
2546 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2547 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2548 // .... -> shadows rendering
2549 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2550 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2551 // .... -> transparent shadow
2552 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2553 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2554 // ... "Ray tracing" group <<end>>
2556 // ... "Light source" group <<start>>
2557 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2558 // .... -> light color
2559 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2560 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2561 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2562 pref->setItemProperty( "columns", 3, directionPref );
2563 // .... -> light direction (dx component)
2564 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2565 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2566 pref->setItemProperty( "precision", 2, light_dx );
2567 pref->setItemProperty( "min", -1.0E03, light_dx );
2568 pref->setItemProperty( "max", 1.0E03, light_dx );
2569 pref->setItemProperty( "step", 0.1, light_dx );
2570 // .... -> light direction (dy component)
2571 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2572 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2573 pref->setItemProperty( "precision", 2, light_dy );
2574 pref->setItemProperty( "min", -1.0E03, light_dy );
2575 pref->setItemProperty( "max", 1.0E03, light_dy );
2576 pref->setItemProperty( "step", 0.1, light_dy );
2577 // .... -> light direction (dz component)
2578 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2579 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2580 pref->setItemProperty( "precision", 2, light_dz );
2581 pref->setItemProperty( "min", -1.0E03, light_dz );
2582 pref->setItemProperty( "max", 1.0E03, light_dz );
2583 pref->setItemProperty( "step", 0.1, light_dz );
2584 // ... "Light source" group <<end>>
2586 // ... -> empty frame (for layout) <<start>>
2587 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2588 pref->setItemProperty( "margin", 0, occGen );
2589 pref->setItemProperty( "columns", 2, occGen );
2590 // ... -> empty frame (for layout) <<end>>
2592 // .. "OCC viewer" group <<end>>
2595 #ifndef DISABLE_VTKVIEWER
2596 // .. "VTK viewer" group <<start>>
2597 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2599 // ... -> empty frame (for layout) <<start>>
2600 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2601 //pref->setItemProperty( "columns", 2, vtkGen );
2602 // .... -> projection mode
2603 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2604 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2605 aValuesList.clear();
2606 anIndicesList.clear();
2607 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2608 anIndicesList << 0 << 1;
2609 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2610 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2612 // .... -> Stereo group
2613 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2614 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2615 // .... -> Stereo type
2616 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2617 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2618 aValuesList.clear();
2619 anIndicesList.clear();
2621 SVTK_Viewer::stereoData( aValuesList, idList);
2622 foreach( int gid, idList ) anIndicesList << gid;
2623 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2624 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2625 // .... -> Anaglyph filter
2626 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2627 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2628 aValuesList.clear();
2629 anIndicesList.clear();
2630 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2631 anIndicesList << 0 << 1 << 2;
2633 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2634 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2636 // .... -> Enable quad-buffer support
2637 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2638 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2640 // .... -> background
2641 aValuesList.clear();
2642 anIndicesList.clear();
2645 #ifndef DISABLE_SALOMEOBJECT
2646 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2648 foreach( int gid, idList ) anIndicesList << gid;
2649 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2650 LightApp_Preferences::Background, "VTKViewer", "background" );
2651 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2652 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2653 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2654 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2655 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2656 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2657 pref->setItemProperty( "custom_enabled", false, bgId );
2658 #ifndef DISABLE_SALOMEOBJECT
2659 pref->setItemProperty( "image_formats", formats, bgId );
2661 // .... -> speed increment
2662 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2663 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2664 pref->setItemProperty( "min", 1, vtkSpeed );
2665 pref->setItemProperty( "max", 1000, vtkSpeed );
2666 // .... -> speed mode
2667 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2668 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2669 aValuesList.clear();
2670 anIndicesList.clear();
2671 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2672 anIndicesList << 0 << 1;
2673 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2674 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2676 // ... "Selection" group <<start>>
2677 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2678 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2679 // .... -> preselection
2680 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2681 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2682 aValuesList.clear();
2683 anIndicesList.clear();
2684 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2685 anIndicesList << 0 << 1 << 2;
2686 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2687 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2688 // .... -> enable selection
2689 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2690 // ... "Selection" group <<end>>
2692 // ... -> empty frame (for layout) <<end>>
2694 // ... space mouse sub-group <<start>>
2695 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2696 //pref->setItemProperty( "columns", 2, vtkSM );
2697 // .... -> decrease speed increment
2698 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2699 LightApp_Preferences::Selector, "VTKViewer",
2700 "spacemouse_func1_btn" );
2701 // .... -> increase speed increment
2702 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2703 LightApp_Preferences::Selector, "VTKViewer",
2704 "spacemouse_func2_btn" );
2705 // .... -> dominant / combined switch
2706 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2707 LightApp_Preferences::Selector, "VTKViewer",
2708 "spacemouse_func5_btn" ); //
2709 aValuesList.clear();
2710 anIndicesList.clear();
2711 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2712 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2713 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2714 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2715 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2716 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2717 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2718 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2719 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2720 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2721 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2722 // ... space mouse sub-group <<end>>
2724 // ... avi recording sub-group <<start>>
2725 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2726 pref->setItemProperty( "columns", 2, vtkRec );
2727 // .... -> recording mode
2728 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2729 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2730 aValuesList.clear();
2731 anIndicesList.clear();
2732 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2733 anIndicesList << 0 << 1;
2734 pref->setItemProperty( "strings", aValuesList, modePref );
2735 pref->setItemProperty( "indexes", anIndicesList, modePref );
2737 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2738 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2739 pref->setItemProperty( "min", 0.1, fpsPref );
2740 pref->setItemProperty( "max", 100, fpsPref );
2742 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2743 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2744 pref->setItemProperty( "min", 1, qualityPref );
2745 pref->setItemProperty( "max", 100, qualityPref );
2746 // .... -> progressive mode
2747 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2748 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2749 // ... avi recording sub-group <<end>>
2751 // ... group names sub-group <<start>>
2752 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2753 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2754 pref->setItemProperty( "columns", 2, vtkGN );
2755 // .... -> text color
2756 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2757 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2758 // .... -> transparency
2759 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2760 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2761 pref->setItemProperty( "min", 0.0, transPref );
2762 pref->setItemProperty( "max", 1.0, transPref );
2763 pref->setItemProperty( "step", 0.1, transPref );
2764 // ... -> group names sub-group <<end>>
2765 // .. "VTK viewer" group <<end>>
2768 // .. "Plot2d viewer" group <<start>>
2769 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2770 //pref->setItemProperty( "columns", 2, plot2dGroup );
2772 // ... -> background
2773 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2774 LightApp_Preferences::Color, "Plot2d", "Background" );
2775 // ... -> selection color
2776 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2777 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2779 // ... "Viewer" group <<start>>
2780 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2782 // .... -> curve type
2783 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2784 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2785 aValuesList.clear();
2786 anIndicesList.clear();
2787 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2788 anIndicesList << 0 << 1 << 2 ;
2789 pref->setItemProperty( "strings", aValuesList, curveType );
2790 pref->setItemProperty( "indexes", anIndicesList, curveType );
2791 // .... -> marker size
2792 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2793 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2794 pref->setItemProperty( "min", 0, markerSize );
2795 pref->setItemProperty( "max", 100, markerSize );
2796 // .... -> horizontal scaling mode
2797 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2798 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2799 aValuesList.clear();
2800 anIndicesList.clear();
2801 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2802 anIndicesList << 0 << 1 ;
2803 pref->setItemProperty( "strings", aValuesList, horScale );
2804 pref->setItemProperty( "indexes", anIndicesList, horScale );
2805 // .... -> vertical scaling mode
2806 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2807 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2808 pref->setItemProperty( "strings", aValuesList, verScale );
2809 pref->setItemProperty( "indexes", anIndicesList, verScale );
2811 // .... -> errors/deviation colot
2812 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2813 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2814 // .... -> deviation markers line size
2815 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2816 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2817 pref->setItemProperty( "min", 1, deviationMarkerLw );
2818 pref->setItemProperty( "max", 5, deviationMarkerLw );
2819 // .... -> deviation markers tick mark size
2820 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2821 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2822 pref->setItemProperty( "min", 1, deviationMarkerTs );
2823 pref->setItemProperty( "max", 5, deviationMarkerTs );
2824 // .... "Viewer" group <<end>>
2826 // ... "Legend" group <<start>>
2827 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2829 // .... -> show legend
2830 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2831 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2832 // .... -> legend position
2833 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2834 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2835 aValuesList.clear();
2836 anIndicesList.clear();
2837 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2838 anIndicesList << 0 << 1 << 2 << 3 ;
2839 pref->setItemProperty( "strings", aValuesList, legendPosition );
2840 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2841 // .... -> Symbol type
2842 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2843 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2844 aValuesList.clear();
2845 anIndicesList.clear();
2846 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2847 anIndicesList << 0 << 1 ;
2848 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2849 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2850 // .... -> legend font
2851 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2852 // ... -> font color
2853 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2854 // ... -> selection font color
2855 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2856 // ... "Legend" group <<end>>
2858 // .. "Plot2d viewer" group <<end>>
2860 // .. "PyViewer" preferences tab <<start>>
2861 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2862 // ... "Font settings" group <<start>>
2863 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2864 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2865 LightApp_Preferences::Font, "PyEditor", "Font" );
2866 // ... "Font settings" group <<end>>
2867 // ... "Display settings" group <<start>>
2868 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2869 pref->setItemProperty( "columns", 2, pyDispGroup );
2870 // ... -> current line highlight
2871 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2872 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2873 // ... -> text wrapping
2874 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2875 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2876 // ... -> center cursor on scroll
2877 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2878 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2879 // ... -> line numbers area
2880 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2881 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2882 // ... "Display settings" group <<end>>
2883 // ... "Tab settings" group <<start>>
2884 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2885 pref->setItemProperty( "columns", 2, pyTabGroup );
2886 // ... -> tab whitespaces
2887 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2888 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2890 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2891 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2892 // ... "Tab settings" group <<end>>
2893 // ... "Vertical edge settings" group <<start>>
2894 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2895 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2896 // ... -> vertical edge
2897 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2898 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2899 // ... -> number of columns
2900 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2901 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2902 // ... "Vertical edge settings" group <<end>>
2903 // .. "PyEditor" preferences tab <<end>>
2905 // .. "Directories" preferences tab <<start>>
2906 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2907 // ... --> quick directories list
2908 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2909 pref->addPreference( tr( "" ), dirGroup,
2910 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2911 // .. "Directories" preferences tab <<end>>
2913 // .. "Object browser" preferences tab <<start>>
2914 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2916 // ... "Search tool" group <<start>>
2917 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2918 // .... --> auto-hide
2919 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2920 "ObjectBrowser", "auto_hide_search_tool" );
2921 // ... "Search tool" group <<end>>
2923 // ... "Object browser settings" group <<start>>
2924 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2925 pref->setItemProperty( "columns", 2, objSetGroup );
2926 // .... -> auto size first column
2927 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2928 "ObjectBrowser", "auto_size_first" );
2929 // .... -> auto size other columns
2930 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2931 "ObjectBrowser", "auto_size" );
2932 // .... -> resize columns on expand item
2933 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2934 "ObjectBrowser", "resize_on_expand_item" );
2935 // .... -> browse to published object
2936 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2937 "ObjectBrowser", "browse_published_object" );
2938 aValuesList.clear();
2939 anIndicesList.clear();
2940 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2941 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2942 pref->setItemProperty( "strings", aValuesList, browsePublished );
2943 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2944 // ... "Object browser settings" group <<end>>
2945 // .. "Object browser" preferences tab <<end>>
2947 // .. "Shortcuts" preferences tab <<start>>
2948 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2949 // ... "Shortcuts settings" group <<start>>
2950 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2951 pref->addPreference( tr( "" ), shortcutGroup,
2952 LightApp_Preferences::ShortcutTree, "shortcuts" );
2953 // ... "Shortcuts settings" group <<end>>
2954 // .. "Shortcuts" preferences tab <<end>>
2955 // . Top-level "SALOME" preferences group <<end>>
2961 Changes appearance of application according to changed preferences
2962 \param sec - section
2963 \param param - name of changed parameter
2965 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2967 SUIT_ResourceMgr* resMgr = resourceMgr();
2971 if ( sec == "viewers" && param == "drop_down_buttons" )
2973 ViewManagerList vmlist = viewManagers();
2974 foreach( SUIT_ViewManager* vm, vmlist )
2976 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2977 foreach( SUIT_ViewWindow* vw, vwlist )
2978 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2982 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2984 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2985 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2986 QList<SUIT_ViewManager*> lst;
2987 #ifndef DISABLE_OCCVIEWER
2988 viewManagers( OCCViewer_Viewer::Type(), lst );
2989 QListIterator<SUIT_ViewManager*> itOCC( lst );
2990 while ( itOCC.hasNext() && sz >= 0 )
2992 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2993 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2996 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2997 occVM->setTrihedronSize( sz, relative );
2998 occVM->getAISContext()->UpdateCurrentViewer();
3001 #ifndef DISABLE_VTKVIEWER
3002 #ifndef DISABLE_SALOMEOBJECT
3003 viewManagers( SVTK_Viewer::Type(), lst );
3004 QListIterator<SUIT_ViewManager*> itVTK( lst );
3005 while ( itVTK.hasNext() && sz >= 0 )
3007 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3008 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3011 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3014 vtkVM->setTrihedronSize( sz, relative );
3022 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3024 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3025 QList<SUIT_ViewManager*> lst;
3026 #ifndef DISABLE_OCCVIEWER
3027 viewManagers( OCCViewer_Viewer::Type(), lst );
3028 QListIterator<SUIT_ViewManager*> itOCC( lst );
3029 while ( itOCC.hasNext() )
3031 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3032 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3035 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3038 occVM->setStaticTrihedronDisplayed( isVisible );
3042 #ifndef DISABLE_VTKVIEWER
3043 #ifndef DISABLE_SALOMEOBJECT
3044 viewManagers( SVTK_Viewer::Type(), lst );
3045 QListIterator<SUIT_ViewManager*> itVTK( lst );
3046 while ( itVTK.hasNext() )
3048 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3049 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3052 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3055 vtkVM->setStaticTrihedronVisible( isVisible );
3063 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3065 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3066 QList<SUIT_ViewManager*> lst;
3067 #ifndef DISABLE_OCCVIEWER
3068 viewManagers( OCCViewer_Viewer::Type(), lst );
3069 QListIterator<SUIT_ViewManager*> itOCC( lst );
3070 while ( itOCC.hasNext() )
3072 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3073 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3076 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3077 occVM->setInteractionStyle( mode );
3080 #ifndef DISABLE_VTKVIEWER
3081 #ifndef DISABLE_SALOMEOBJECT
3082 viewManagers( SVTK_Viewer::Type(), lst );
3083 QListIterator<SUIT_ViewManager*> itVTK( lst );
3084 while ( itVTK.hasNext() )
3086 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3087 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3090 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3091 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3097 #ifndef DISABLE_OCCVIEWER
3098 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3100 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3101 QList<SUIT_ViewManager*> lst;
3102 viewManagers( OCCViewer_Viewer::Type(), lst );
3103 QListIterator<SUIT_ViewManager*> it( lst );
3104 while ( it.hasNext() )
3106 SUIT_ViewModel* vm = it.next()->getViewModel();
3107 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3110 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3111 occVM->enablePreselection( isToEnablePreselection );
3116 #ifndef DISABLE_OCCVIEWER
3117 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3119 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3120 QList<SUIT_ViewManager*> lst;
3121 viewManagers( OCCViewer_Viewer::Type(), lst );
3122 QListIterator<SUIT_ViewManager*> it( lst );
3123 while ( it.hasNext() )
3125 SUIT_ViewModel* vm = it.next()->getViewModel();
3126 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3129 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3130 occVM->enableSelection( isToEnableSelection );
3135 #ifndef DISABLE_OCCVIEWER
3136 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3138 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3139 QList<SUIT_ViewManager*> lst;
3140 viewManagers( OCCViewer_Viewer::Type(), lst );
3141 QListIterator<SUIT_ViewManager*> it( lst );
3142 while ( it.hasNext() )
3144 SUIT_ViewModel* vm = it.next()->getViewModel();
3145 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3148 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3149 occVM->setClippingColor( aColor );
3154 #ifndef DISABLE_OCCVIEWER
3155 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3156 param == QString( "clipping_texture" ) ||
3157 param == QString( "clipping_modulate" ) ||
3158 param == QString( "clipping_scale" ) ) )
3160 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3161 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3162 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3163 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3164 QList<SUIT_ViewManager*> lst;
3165 viewManagers( OCCViewer_Viewer::Type(), lst );
3166 QListIterator<SUIT_ViewManager*> it( lst );
3167 while ( it.hasNext() )
3169 SUIT_ViewModel* vm = it.next()->getViewModel();
3170 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3173 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3174 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3179 #ifndef DISABLE_OCCVIEWER
3180 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3182 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3183 QList<SUIT_ViewManager*> lst;
3184 viewManagers( OCCViewer_Viewer::Type(), lst );
3185 QListIterator<SUIT_ViewManager*> it( lst );
3186 while ( it.hasNext() )
3188 SUIT_ViewModel* vm = it.next()->getViewModel();
3189 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3192 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3193 occVM->setProjectionType( mode );
3197 #if OCC_VERSION_LARGE > 0x06090000
3198 #ifndef DISABLE_OCCVIEWER
3199 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3201 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3202 QList<SUIT_ViewManager*> lst;
3203 viewManagers( OCCViewer_Viewer::Type(), lst );
3204 QListIterator<SUIT_ViewManager*> it( lst );
3205 while ( it.hasNext() )
3207 SUIT_ViewModel* vm = it.next()->getViewModel();
3208 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3211 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3212 occVM->setStereoType( mode );
3217 #ifndef DISABLE_OCCVIEWER
3218 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3220 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3221 QList<SUIT_ViewManager*> lst;
3222 viewManagers( OCCViewer_Viewer::Type(), lst );
3223 QListIterator<SUIT_ViewManager*> it( lst );
3224 while ( it.hasNext() )
3226 SUIT_ViewModel* vm = it.next()->getViewModel();
3227 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3230 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3231 occVM->setAnaglyphFilter( mode );
3236 #ifndef DISABLE_OCCVIEWER
3237 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3238 param == QString( "focus_value" ) ) )
3240 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3241 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3242 QList<SUIT_ViewManager*> lst;
3243 viewManagers( OCCViewer_Viewer::Type(), lst );
3244 QListIterator<SUIT_ViewManager*> it( lst );
3245 while ( it.hasNext() )
3247 SUIT_ViewModel* vm = it.next()->getViewModel();
3248 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3251 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3252 occVM->setStereographicFocus( aType, aValue );
3257 #ifndef DISABLE_OCCVIEWER
3258 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3259 param == QString( "iod_value" ) ) )
3261 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3262 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3263 QList<SUIT_ViewManager*> lst;
3264 viewManagers( OCCViewer_Viewer::Type(), lst );
3265 QListIterator<SUIT_ViewManager*> it( lst );
3266 while ( it.hasNext() )
3268 SUIT_ViewModel* vm = it.next()->getViewModel();
3269 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3272 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3273 occVM->setInterocularDistance( aType, aValue );
3278 #ifndef DISABLE_OCCVIEWER
3279 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3281 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3282 QList<SUIT_ViewManager*> lst;
3283 viewManagers( OCCViewer_Viewer::Type(), lst );
3284 QListIterator<SUIT_ViewManager*> it( lst );
3285 while ( it.hasNext() )
3287 SUIT_ViewModel* vm = it.next()->getViewModel();
3288 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3291 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3292 occVM->setReverseStereo( reverse );
3297 #ifndef DISABLE_OCCVIEWER
3298 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3300 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3301 QList<SUIT_ViewManager*> lst;
3302 viewManagers( OCCViewer_Viewer::Type(), lst );
3303 QListIterator<SUIT_ViewManager*> it( lst );
3304 while ( it.hasNext() )
3306 SUIT_ViewModel* vm = it.next()->getViewModel();
3307 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3310 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3311 occVM->setVSync( enable );
3316 #ifndef DISABLE_OCCVIEWER
3317 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3319 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3320 QList<SUIT_ViewManager*> lst;
3321 viewManagers( OCCViewer_Viewer::Type(), lst );
3322 QListIterator<SUIT_ViewManager*> it( lst );
3323 while ( it.hasNext() )
3325 SUIT_ViewModel* vm = it.next()->getViewModel();
3326 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3329 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3330 occVM->setQuadBufferSupport( enable );
3335 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3337 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3338 QList<SUIT_ViewManager*> lst;
3339 #ifndef DISABLE_OCCVIEWER
3340 viewManagers( OCCViewer_Viewer::Type(), lst );
3341 QListIterator<SUIT_ViewManager*> itOCC( lst );
3342 while ( itOCC.hasNext() )
3344 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3345 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3348 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3349 occVM->setZoomingStyle( mode );
3352 #ifndef DISABLE_VTKVIEWER
3353 #ifndef DISABLE_SALOMEOBJECT
3354 viewManagers( SVTK_Viewer::Type(), lst );
3355 QListIterator<SUIT_ViewManager*> itVTK( lst );
3356 while ( itVTK.hasNext() )
3358 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3359 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3362 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3363 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3369 #ifndef DISABLE_VTKVIEWER
3370 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3372 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3373 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3374 QList<SUIT_ViewManager*> lst;
3375 #ifndef DISABLE_SALOMEOBJECT
3376 viewManagers( SVTK_Viewer::Type(), lst );
3377 QListIterator<SUIT_ViewManager*> it( lst );
3378 while ( it.hasNext() )
3380 SUIT_ViewModel* vm = it.next()->getViewModel();
3381 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3384 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3385 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3391 #ifndef DISABLE_VTKVIEWER
3392 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3394 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3395 QList<SUIT_ViewManager*> lst;
3396 #ifndef DISABLE_SALOMEOBJECT
3397 viewManagers( SVTK_Viewer::Type(), lst );
3398 QListIterator<SUIT_ViewManager*> it( lst );
3399 while ( it.hasNext() )
3401 SUIT_ViewModel* vm = it.next()->getViewModel();
3402 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3405 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3406 if( vtkVM ) vtkVM->setProjectionMode( mode );
3412 #ifndef DISABLE_VTKVIEWER
3413 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3415 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3416 QList<SUIT_ViewManager*> lst;
3417 #ifndef DISABLE_SALOMEOBJECT
3418 viewManagers( SVTK_Viewer::Type(), lst );
3419 QListIterator<SUIT_ViewManager*> it( lst );
3420 while ( it.hasNext() )
3422 SUIT_ViewModel* vm = it.next()->getViewModel();
3423 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3426 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3427 if( vtkVM ) vtkVM->setStereoType( mode );
3433 #ifndef DISABLE_VTKVIEWER
3434 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3436 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3437 QList<SUIT_ViewManager*> lst;
3438 #ifndef DISABLE_SALOMEOBJECT
3439 viewManagers( SVTK_Viewer::Type(), lst );
3440 QListIterator<SUIT_ViewManager*> it( lst );
3441 while ( it.hasNext() )
3443 SUIT_ViewModel* vm = it.next()->getViewModel();
3444 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3447 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3448 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3454 #ifndef DISABLE_VTKVIEWER
3455 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3457 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3458 QList<SUIT_ViewManager*> lst;
3459 #ifndef DISABLE_SALOMEOBJECT
3460 viewManagers( SVTK_Viewer::Type(), lst );
3461 QListIterator<SUIT_ViewManager*> it( lst );
3462 while ( it.hasNext() )
3464 SUIT_ViewModel* vm = it.next()->getViewModel();
3465 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3468 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3469 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3475 #ifndef DISABLE_VTKVIEWER
3476 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3478 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3479 QList<SUIT_ViewManager*> lst;
3480 #ifndef DISABLE_SALOMEOBJECT
3481 viewManagers( SVTK_Viewer::Type(), lst );
3482 QListIterator<SUIT_ViewManager*> it( lst );
3483 while ( it.hasNext() )
3485 SUIT_ViewModel* vm = it.next()->getViewModel();
3486 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3489 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3490 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3496 #ifndef DISABLE_VTKVIEWER
3497 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3499 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3500 QList<SUIT_ViewManager*> lst;
3501 #ifndef DISABLE_SALOMEOBJECT
3502 viewManagers( SVTK_Viewer::Type(), lst );
3503 QListIterator<SUIT_ViewManager*> it( lst );
3504 while ( it.hasNext() )
3506 SUIT_ViewModel* vm = it.next()->getViewModel();
3507 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3510 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3511 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3517 #ifndef DISABLE_VTKVIEWER
3518 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3519 param == QString( "spacemouse_func2_btn" ) ||
3520 param == QString( "spacemouse_func5_btn" ) ) )
3522 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3523 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3524 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3525 QList<SUIT_ViewManager*> lst;
3526 #ifndef DISABLE_SALOMEOBJECT
3527 viewManagers( SVTK_Viewer::Type(), lst );
3528 QListIterator<SUIT_ViewManager*> it( lst );
3529 while ( it.hasNext() )
3531 SUIT_ViewModel* vm = it.next()->getViewModel();
3532 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3535 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3536 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3541 if( sec=="ObjectBrowser" )
3543 SUIT_DataBrowser* ob = objectBrowser();
3547 if ( param=="auto_size_first" )
3549 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3550 ob->setAutoSizeFirstColumn( autoSizeFirst );
3551 if ( autoSizeFirst )
3552 ob->adjustFirstColumnWidth();
3554 else if ( param=="auto_size" ) {
3555 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3556 ob->setAutoSizeColumns(autoSize);
3558 ob->adjustColumnsWidth();
3560 else if ( param=="resize_on_expand_item" ) {
3561 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3562 ob->setResizeOnExpandItem(resizeOnExpandItem);
3564 else if ( param == "auto_hide_search_tool" ) {
3565 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3571 if( param=="auto_save_interval" ) {
3572 myAutoSaveTimer->stop();
3573 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3574 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3578 #ifndef DISABLE_PYCONSOLE
3579 if( sec=="PyConsole" && pythonConsole() )
3581 if ( param=="font" ) {
3582 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3584 else if ( param=="show_banner" ) {
3585 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3592 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3594 if ( param == "visible_count" )
3595 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3596 else if ( param == "max_count" )
3597 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3598 else if ( param == "insert_mode" )
3599 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3600 else if ( param == "link_type" )
3601 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3602 else if ( param == "show_clear" )
3603 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3604 else if ( param == "show_mru" )
3605 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3608 if ( sec == "language" && param == "language" )
3610 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3611 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3613 if ( sec == "language" && param == "locale")
3615 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3616 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3618 if ( sec == "desktop" && param == "opaque_resize" ) {
3619 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3620 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3621 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3622 else dopts &= ~QMainWindow::AnimatedDocks;
3623 desktop()->setDockOptions( dopts );
3624 desktop()->setOpaqueResize( opaqueResize );
3625 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3626 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3629 #ifndef DISABLE_PLOT2DVIEWER
3630 QList<SUIT_ViewManager*> lst;
3631 viewManagers( Plot2d_Viewer::Type(), lst );
3632 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3633 while ( itPlot2d.hasNext() ) {
3634 SUIT_ViewManager* viewMgr = itPlot2d.next();
3635 SUIT_ViewModel* vm = viewMgr->getViewModel();
3636 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3639 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3641 viewMgr->setViewModel( vm );
3642 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3644 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3645 frame->SetPreference();
3650 #ifndef DISABLE_PYVIEWER
3651 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3652 param == QString( "LineNumberArea" ) ||
3653 param == QString( "TextWrapping" ) ||
3654 param == QString( "CenterCursorOnScroll" ) ||
3655 param == QString( "TabSpaceVisible" ) ||
3656 param == QString( "TabSize" ) ||
3657 param == QString( "VerticalEdge" ) ||
3658 param == QString( "NumberColumns" ) ||
3659 param == QString( "Font" ) ) )
3661 QList<SUIT_ViewManager*> lst;
3662 viewManagers( PyViewer_Viewer::Type(), lst );
3663 QListIterator<SUIT_ViewManager*> itPy( lst );
3664 while ( itPy.hasNext() )
3666 SUIT_ViewManager* viewMgr = itPy.next();
3667 SUIT_ViewModel* vm = viewMgr->getViewModel();
3668 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3671 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3673 viewMgr->setViewModel( vm );
3674 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3677 pyView->setPreferences();
3687 void LightApp_Application::loadPreferences()
3689 CAM_Application::loadPreferences();
3691 SUIT_ResourceMgr* aResMgr = resourceMgr();
3696 static bool mru_load = true;
3699 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3701 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3702 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3703 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3704 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3705 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3706 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3707 mru->loadLinks( aResMgr, "MRU" );
3713 QStringList mods = aResMgr->parameters( "windows_visibility" );
3714 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3717 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3718 myWinVis.insert( *itr, arr );
3722 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3723 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3724 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3725 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3726 else dopts &= ~QMainWindow::AnimatedDocks;
3727 desktop()->setDockOptions( dopts );
3728 desktop()->setOpaqueResize( opaqueResize );
3729 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3730 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3737 void LightApp_Application::savePreferences()
3739 CAM_Application::savePreferences();
3741 saveDockWindowsState();
3743 SUIT_ResourceMgr* aResMgr = resourceMgr();
3748 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3750 mru->saveLinks( aResMgr, "MRU" );
3752 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3753 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3756 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3758 #if GUI_DEVELOPMENT > 0
3759 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3761 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3768 Updates desktop title
3770 void LightApp_Application::updateDesktopTitle()
3772 QString aTitle = applicationName();
3773 QString aVer = applicationVersion();
3774 if ( !aVer.isEmpty() )
3775 aTitle += QString( " " ) + aVer;
3777 if ( activeStudy() ) {
3778 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3779 aTitle += QString( " - [%1]" ).arg( sName );
3782 desktop()->setWindowTitle( aTitle );
3786 \brief Get map of the operations which can be performed
3787 on the module activation.
3789 The method should return the map of the kind \c {<id>:<name>}
3790 where \c <id> is an integer identifier of the operation and
3791 \c <name> is a title for the button to be added to the
3792 dialog box. After user selects the required operation by the
3793 clicking the corresponding button in the dialog box, its identifier
3794 is passed to the moduleActionSelected() method to process
3797 \return map of the operations
3798 \sa moduleActionSelected()
3800 QMap<int, QString> LightApp_Application::activateModuleActions() const
3802 QMap<int, QString> opmap;
3803 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3804 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3809 \brief Called when the used selectes required operation chosen
3810 from "Activate module" dialog box.
3812 Performs the required operation according to the user choice.
3814 \param id operation identifier
3815 \sa activateModuleActions()
3817 void LightApp_Application::moduleActionSelected( const int id )
3832 Updates windows after close document
3834 void LightApp_Application::afterCloseDoc()
3838 CAM_Application::afterCloseDoc();
3842 Updates actions of active module
3844 void LightApp_Application::updateModuleActions()
3847 if ( activeModule() ) {
3848 modName = activeModule()->moduleName();
3849 if ( !isModuleAccessible( modName ) ) {
3850 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3851 foreach( SUIT_Application* app, apps ) {
3852 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3853 if ( lapp && lapp != this )
3854 lapp->removeModuleAction( modName );
3859 LightApp_ModuleAction* moduleAction =
3860 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3862 moduleAction->setActiveModule( modName );
3865 void LightApp_Application::removeModuleAction( const QString& modName )
3867 LightApp_ModuleAction* moduleAction =
3868 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3870 moduleAction->removeModule( modName );
3874 Gets current windows.
3875 \param winMap - output current windows map.
3877 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3880 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3881 ((LightApp_Module*)activeModule())->windows( winMap );
3883 defaultWindows( winMap );
3887 Gets current view managers.
3888 \param lst - output current view managers list.
3890 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3893 if ( !activeStudy() )
3896 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3897 ((LightApp_Module*)activeModule())->viewManagers( lst );
3899 defaultViewManagers( lst );
3905 void LightApp_Application::updateWindows()
3907 QMap<int, int> winMap;
3908 currentWindows( winMap );
3910 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3912 if ( !dockWindow( it.key() ) )
3913 getWindow( it.key() );
3916 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3918 QWidget* wid = it.value();
3919 if ( winMap.contains( it.key() ) )
3920 wid->setVisible( true );
3925 loadDockWindowsState();
3929 Updates view managers
3931 void LightApp_Application::updateViewManagers()
3934 currentViewManagers( lst );
3936 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3937 getViewManager( *it, true );
3941 Loads windows geometry
3943 void LightApp_Application::loadDockWindowsState()
3947 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3948 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3949 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3952 if ( activeModule() )
3953 modName = activeModule()->name();
3954 else if ( activeStudy() )
3955 modName = "nomodule";
3957 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3958 QByteArray aDefaultState;
3959 aResMgr->value( "windows_geometry", modName, aDefaultState );
3960 QByteArray aDefaultVisibility;
3961 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3962 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3963 aResMgr->setWorkingMode( prevMode );
3965 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3968 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3969 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3971 if ( version > Qtx::versionToId( "7.4.1" ) )
3972 aResMgr->value( "windows_geometry", modName , arr );
3974 arr = aDefaultState;
3975 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3976 desktop()->restoreState( aTargetArray );
3979 QStringList mainToolbarsNames;
3980 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3981 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3982 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3984 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3987 QMap<QString, bool> *tbMap = 0;
3988 QMap<QString, bool> *dwMap = 0;
3990 QMap<QString, bool> userTbMap, userDwMap;
3991 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3993 QMap<QString, bool> defaultTbMap, defaultDwMap;
3994 if(hasDefaultVisibility) {
3995 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4001 if(hasDefaultVisibility){
4002 tbMap = &defaultTbMap;
4009 if(hasDefaultVisibility){
4010 dwMap = &defaultDwMap;
4015 QList<QToolBar*> tbList = findToolBars();
4016 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4018 QToolBar* tb = *tit;
4019 if ( tbMap->contains( tb->objectName() ) ) {
4020 tb->setVisible( (*tbMap)[tb->objectName()] );
4026 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4027 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4029 QDockWidget* dw = *dit;
4031 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4032 if ( po != desktop() )
4035 if ( dwMap->contains( dw->objectName() ) )
4036 dw->setVisible( (*dwMap)[dw->objectName()] );
4044 Saves windows geometry
4046 void LightApp_Application::saveDockWindowsState()
4051 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4052 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4054 if( !storeWin && !storeTb )
4058 if ( activeModule() )
4059 modName = activeModule()->name();
4060 else if ( activeStudy() )
4061 modName = "nomodule";
4063 QString versionId = GUI_VERSION_STR;
4064 #if GUI_DEVELOPMENT > 0
4068 QByteArray arr = desktop()->saveState();
4069 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4070 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4073 if ( myWinVis.contains( modName ) )
4074 visArr = myWinVis[modName];
4076 QMap<QString, bool> tbMap, dwMap;
4077 dockWindowsState( visArr, tbMap, dwMap );
4079 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4080 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4083 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4086 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4087 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4089 QDockWidget* wid = *it;
4090 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4093 visArr = dockWindowsState( tbMap, dwMap );
4095 myWinVis.insert( modName, visArr );
4098 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4101 QDataStream stream( &visArr, QIODevice::WriteOnly );
4103 stream << (uchar)ToolBarMarker;
4104 stream << tb.size();
4105 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4107 stream << tit.key();
4108 stream << (uchar)( tit.value() ? 1 : 0 );
4111 stream << (uchar)DockWidgetMarker;
4112 stream << dw.size();
4113 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4115 stream << wit.key();
4116 stream << (uchar)( wit.value() ? 1 : 0 );
4122 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4127 QByteArray visArr = arr;
4128 QDataStream stream( &visArr, QIODevice::ReadOnly );
4132 if ( marker != ToolBarMarker )
4137 for ( int i = 0; i < lines; ++i )
4140 stream >> objectName;
4143 tb.insert( objectName, shown );
4147 if ( marker != DockWidgetMarker )
4151 for ( int j = 0; j < lines; ++j )
4154 stream >> objectName;
4157 dw.insert( objectName, shown );
4162 Adds icon names for modules
4164 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4168 SUIT_ResourceMgr* resMgr = resourceMgr();
4172 QStringList modList;
4173 modules( modList, false );
4175 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4177 QString modName = *it;
4178 QString modIntr = moduleName( modName );
4179 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4181 if ( modIcon.isEmpty() )
4184 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4185 modIcon += QString( ".png" );
4187 iconMap.insert( modName, modIcon );
4192 Inserts items in popup, which necessary for current application
4194 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4197 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4198 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4199 selMgr->setSelectionCacheEnabled( true );
4201 SUIT_DataBrowser* ob = objectBrowser();
4203 CAM_Application::contextMenuPopup( type, thePopup, title );
4205 if ( ob && type == ob->popupClientType() ) {
4206 thePopup->addSeparator();
4207 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4208 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4209 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4212 #ifndef DISABLE_SALOMEOBJECT
4213 if ( selMgr && ob ) {
4214 SALOME_ListIO selected;
4215 selMgr->selectedObjects( selected );
4216 if(selected.Extent() == 1){
4217 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4218 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4219 if(obj && obj->renameAllowed()) {
4220 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4221 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4222 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4223 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4225 QList<QAction*> acts = thePopup->actions();
4226 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4227 thePopup->insertAction(firstAction,a);
4233 selMgr->setSelectionCacheEnabled( cacheIsOn );
4239 void LightApp_Application::createEmptyStudy()
4241 CAM_Application::createEmptyStudy();
4243 if ( objectBrowser() )
4244 objectBrowser()->updateTree();
4246 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4247 if ( aResMgr && activeStudy() ) {
4248 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4249 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4254 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4256 CAM_Application::setDesktop( desk );
4259 connect( desk, SIGNAL( message( const QString& ) ),
4260 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4261 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4262 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4263 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4264 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4270 \param mod - module to be activated
4272 bool LightApp_Application::activateModule( CAM_Module* mod )
4274 bool res = CAM_Application::activateModule( mod );
4276 if ( objectBrowser() )
4277 objectBrowser()->updateTree();
4283 \return keyborad accelerators manager object
4285 SUIT_Accel* LightApp_Application::accel() const
4291 Removes dead widget container from map
4293 void LightApp_Application::onWCDestroyed( QObject* ob )
4295 // remove destroyed widget container from windows map
4296 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4298 if ( itr.value() != ob )
4301 int key = itr.key();
4302 myWin.remove( key );
4307 void LightApp_Application::onMRUActivated( const QString& name )
4309 SUIT_Session* s = SUIT_Session::session();
4310 if ( s && s->activeApplication() == this )
4314 void LightApp_Application::onStylePreferences()
4316 #ifdef USE_SALOME_STYLE
4317 Style_PrefDlg dlg( desktop() );
4320 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4321 #endif // USE_SALOME_STYLE
4324 void LightApp_Application::onFullScreen(){
4325 if(myScreenHelper) {
4326 if(desktop()->isFullScreen())
4327 myScreenHelper->switchToNormalScreen();
4329 myScreenHelper->switchToFullScreen();
4334 Connects just added view manager
4336 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4338 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4339 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4340 CAM_Application::addViewManager( vm );
4344 Remove view manager from memory
4346 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4348 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4349 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4350 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4352 aStudy->removeObjectProperties( vm->getGlobalId() );
4354 CAM_Application::removeViewManager( vm );
4356 LightApp_SelectionMgr* selMgr = selectionMgr();
4357 QList<SUIT_Selector*> selectors;
4358 selMgr->selectors( selectors );
4359 foreach( SUIT_Selector* selector, selectors ) {
4360 if ( selector->owner() == vm->getViewModel() ) {
4365 // IPAL22894: Crash on closing OCC view
4371 Renames active window of desktop
4373 void LightApp_Application::onRenameWindow()
4378 QWidget* w = desktop()->activeWindow();
4383 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4384 if( ok && !name.isEmpty() )
4385 w->setWindowTitle( name );
4389 Closes active window of desktop
4391 void LightApp_Application::onCloseWindow()
4396 QWidget* w = desktop()->activeWindow();
4404 Closes all windows of desktop
4406 void LightApp_Application::onCloseAllWindow()
4408 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4412 QList<SUIT_ViewWindow*> wndList = desk->windows();
4413 SUIT_ViewWindow* wnd;
4414 foreach( wnd, wndList )
4422 Groups all windows of desktop
4424 void LightApp_Application::onGroupAllWindow()
4426 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4430 QtxWorkstack* wgStack = desk->workstack();
4436 \return if the library of module exists
4437 \param moduleTitle - title of module
4439 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4441 if( moduleTitle.isEmpty() )
4444 QString lib = moduleLibrary( moduleTitle );
4446 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4447 bool isPythonModule = lib.contains("SalomePyQtGUI");
4448 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4452 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4454 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4457 bool isLibFound = false;
4458 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4459 for( ; anIt!=aLast; anIt++ )
4461 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4472 INFOS( "\n****************************************************************" << std::endl
4473 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4474 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4475 << "****************************************************************" << std::endl );
4477 else if ( !isPythonModule && !isPythonLightModule)
4480 if ( isPythonModule || isPythonLightModule)
4482 QString pylib = moduleName( moduleTitle ) + QString(".py");
4483 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4485 // Check the python library
4487 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4489 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4491 bool isPyLib = false, isPyGuiLib = false;
4492 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4493 for( ; anIt!=aLast; anIt++ )
4495 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4496 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4498 if(!isPythonLightModule)
4499 if( !isPyLib && inf.exists() )
4502 if( !isPyGuiLib && infgui.exists() )
4505 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4509 printf( "\n****************************************************************\n" );
4510 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4512 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4514 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4515 printf( "****************************************************************\n" );
4522 \return default name for an active study
4524 void LightApp_Application::setDefaultStudyName( const QString& theName )
4526 QStringList anInfoList;
4527 modules( anInfoList, false );
4529 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4530 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4531 !aStudy->isSaved() )
4533 aStudy->setStudyName( theName );
4534 updateDesktopTitle();
4539 Custom event handler
4541 bool LightApp_Application::event( QEvent* e )
4543 if( e && e->type()==2000 )
4545 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4546 QString* d = ( QString* )ce->data();
4547 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4549 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4550 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4551 showPreferences( tr( "PREF_APP" ) );
4556 return CAM_Application::event( e );
4559 /*! Check data object */
4560 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4564 bool isSuitable = !theObj->entry().isEmpty() &&
4565 !theObj->componentDataType().isEmpty() &&
4566 !theObj->name().isEmpty();
4573 int LightApp_Application::openChoice( const QString& aName )
4575 int choice = CAM_Application::openChoice( aName );
4577 if ( choice == OpenExist ) // The document is already open.
4579 // Do you want to reload it?
4580 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4581 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4582 choice = OpenReload;
4588 bool LightApp_Application::openAction( const int choice, const QString& aName )
4595 STD_Application* app = 0;
4596 SUIT_Session* session = SUIT_Session::session();
4597 QList<SUIT_Application*> appList = session->applications();
4598 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4600 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4601 app = ::qobject_cast<STD_Application*>( *it );
4606 app->onCloseDoc( false );
4607 appList = session->applications();
4608 STD_Application* other = 0;
4609 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4610 other = ::qobject_cast<STD_Application*>( *it );
4613 res = other->onOpenDoc( aName );
4618 res = CAM_Application::openAction( choice, aName );
4625 QStringList LightApp_Application::viewManagersTypes() const
4627 QStringList aTypesList;
4628 aTypesList += myUserWmTypes;
4629 #ifndef DISABLE_GLVIEWER
4630 aTypesList<<GLViewer_Viewer::Type();
4632 #ifndef DISABLE_PLOT2DVIEWER
4633 aTypesList<<Plot2d_Viewer::Type();
4635 #ifndef DISABLE_QXGRAPHVIEWER
4636 aTypesList<<QxScene_Viewer::Type();
4638 #ifndef DISABLE_PVVIEWER
4639 aTypesList<<PVViewer_Viewer::Type();
4641 #ifndef DISABLE_PYVIEWER
4642 aTypesList<<PyViewer_Viewer::Type();
4644 #ifndef DISABLE_OCCVIEWER
4645 aTypesList<<OCCViewer_Viewer::Type();
4647 #ifndef DISABLE_VTKVIEWER
4648 #ifndef DISABLE_SALOMEOBJECT
4649 aTypesList<<SVTK_Viewer::Type();
4651 aTypesList<<VTKViewer_Viewer::Type();
4657 * Removes all view managers of known types
4658 * Other view managers are ignored
4660 void LightApp_Application::clearKnownViewManagers()
4662 QStringList aTypesList = viewManagersTypes();
4663 QList<SUIT_ViewManager*> aMgrList;
4664 viewManagers( aMgrList );
4665 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4666 if (aTypesList.contains(aMgr->getType()))
4667 removeViewManager(aMgr);
4672 Copy of current selection
4674 void LightApp_Application::onCopy()
4676 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4682 Paste of current data in clipboard
4684 void LightApp_Application::onPaste()
4686 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4692 Browse (i.e. set focus on) the published objects
4693 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4694 has been accepted by Ok (or Apply & Close) button
4695 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4696 (to select the first published object only)
4697 \return entry of the selected object
4699 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4700 const bool theIsApplyAndClose,
4701 const bool theIsOptimizedBrowsing )
4704 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4706 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4707 switch( aBrowsePolicy )
4711 case BP_ApplyAndClose:
4712 if( !theIsApplyAndClose )
4720 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4724 SUIT_DataBrowser* anOB = objectBrowser();
4728 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4732 QStringListIterator anIter( theEntryList );
4733 if( theIsOptimizedBrowsing )
4735 // go to the last entry
4737 if( anIter.hasPrevious() )
4741 // scroll to each entry in the list
4742 // (in optimized mode - to the last entry only)
4744 LightApp_DataObject* anObject = 0;
4745 while( anIter.hasNext() )
4747 anEntry = anIter.next();
4748 if( !anEntry.isEmpty() )
4750 anObject = aStudy->findObjectByEntry( anEntry );
4753 QModelIndex anIndex = aModel->index( anObject );
4754 anOB->treeView()->scrollTo( anIndex );
4759 // always select the last object
4760 if( anObject && !anEntry.isEmpty() )
4762 QList<SUIT_Selector*> aSelectorList;
4763 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4764 if( !aSelectorList.isEmpty() )
4766 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4768 bool anIsAutoBlock = aSelector->autoBlock();
4770 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4771 aSelector->setAutoBlock( false );
4773 SUIT_DataOwnerPtrList aList;
4774 #ifndef DISABLE_SALOMEOBJECT
4775 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4776 ( anObject->entry().toLatin1().constData(),
4777 anObject->componentDataType().toLatin1().constData(),
4778 anObject->name().toLatin1().constData() );
4779 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4781 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4784 aList.append( owner );
4785 selectionMgr()->setSelected( aList );
4788 // restore auto block flag
4789 aSelector->setAutoBlock( anIsAutoBlock );
4797 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4799 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4800 return study ? study->findObjectByEntry( id ) : 0;
4804 Checks that an object can be renamed.
4805 \param entry entry of the object
4806 \brief Return \c true if object can be renamed
4808 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4813 Rename object by entry.
4814 \param entry entry of the object
4815 \param name new name of the object
4816 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4818 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4822 /*! Process standard messages from desktop */
4823 void LightApp_Application::onDesktopMessage( const QString& message )
4825 const QString sectionSeparator = "/";
4827 if ( message.toLower() == "updateobjectbrowser" ||
4828 message.toLower() == "updateobjbrowser" ) {
4829 // update object browser
4830 updateObjectBrowser();
4832 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4833 QString vtype = message.split( sectionSeparator ).last();
4834 if ( !vtype.isEmpty() )
4835 getViewManager( vtype, true );
4838 QStringList data = message.split( sectionSeparator );
4839 if ( data.count() > 1 ) {
4840 QString msgType = data[0].trimmed();
4841 LightApp_Module* sMod = 0;
4842 CAM_Module* mod = module( msgType );
4844 mod = module( moduleTitle( msgType ) );
4845 if ( mod && mod->inherits( "LightApp_Module" ) )
4846 sMod = (LightApp_Module*)mod;
4848 if ( msgType.toLower() == "preferences" ) {
4849 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4850 // for example "preferences/Study/multi_file_dump/true"
4851 if ( data.count() > 3 ) {
4852 QString section = data[1].trimmed();
4853 QString param = data[2].trimmed();
4854 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4855 resourceMgr()->setValue( section, param, value );
4859 // received message for the module
4860 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4861 sMod->message( msg );
4869 Returns all top level toolbars.
4870 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4872 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4874 QList<QToolBar*> aResult;
4875 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4876 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4877 QToolBar* tb = *tit;
4878 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4879 if ( po != desktop() )
4881 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4888 Internal method to parse toolbars and dockable windows state.
4890 QByteArray LightApp_Application::processState(QByteArray& input,
4891 const bool processWin,
4892 const bool processTb,
4893 const bool isRestoring,
4894 QByteArray defaultState) {
4897 bool hasDefaultState = !defaultState.isEmpty();
4898 bool isDockWinWriten = false;
4900 //Write date from users settings
4902 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4903 int marker, version;
4905 tmpInputData >> marker;
4906 tmpInputData >> version;
4907 tmpInputData >> dockmarker;
4908 tmpInputData >> nbDocWin;
4910 if(processWin && processTb && !isRestoring) {
4912 } else if(!processWin && !processTb ) {
4914 aRes = defaultState;
4916 QDataStream aData(&aRes, QIODevice::WriteOnly);
4917 QList<QToolBar*> aToolBars = findToolBars();
4920 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4921 QToolBar* tb = *tit;
4922 aNames.append(tb->objectName());
4925 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4926 if(toolBarMarkerIndex < 0)
4928 QDataStream anInputData(&input, QIODevice::ReadOnly);
4930 int toolBarMarkerIndexDef;
4931 if(hasDefaultState) {
4932 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4933 if(toolBarMarkerIndexDef < 0)
4936 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4938 QDataStream* aTargetData = 0;
4939 int aTargetIndex = -1;
4941 QByteArray currentArr = desktop()->saveState();
4942 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4943 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4944 if(processWin && useInputData) {
4945 aTargetData = &anInputData;
4946 aTargetIndex = toolBarMarkerIndex;
4948 //Write date from default settings
4949 if(hasDefaultState) {
4950 aTargetData = &anInputDataDef;
4951 aTargetIndex = toolBarMarkerIndexDef;
4953 //If no default state, write current snapshot of the dockable windows
4955 aTargetData = &anInputDataCur;
4956 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4957 aTargetIndex = toolBarMarkerIndexCur;
4962 if(aTargetData && aTargetIndex >= 0 ) {
4963 aTargetData->device()->seek(0);
4964 while( aTargetData->device()->pos() < aTargetIndex ) {
4969 isDockWinWriten = true;
4976 aTargetData = &anInputData;
4977 aTargetIndex = toolBarMarkerIndex;
4979 if(hasDefaultState) {
4980 aTargetData = &anInputDataDef;
4981 aTargetIndex = toolBarMarkerIndexDef;
4985 if(aTargetData && aTargetIndex >= 0) {
4987 if(!isDockWinWriten ) {
4988 //Write version marker
4989 int marker, version;
4990 aTargetData->device()->seek(0);
4991 *aTargetData >> marker;
4992 *aTargetData >> version;
4995 aData << (uchar) QDockWidgetMarker;
4997 int shift = 4*sizeof(int) + sizeof(QSize);
4998 index = aTargetIndex - shift;
5000 index = aTargetIndex;
5003 aTargetData->device()->seek(index);
5004 while(!aTargetData->atEnd()) {
5009 } else { // Not treat toolbars
5010 aData << (uchar) QToolBarMarker;
5011 aData << (int) 0; //Nb toolbars = 0
5018 \brief Emits operationFinished signal.
5019 \param theModuleName the name of the module which perfomed the operation
5020 \param theOperationName the operation name
5021 \param theEntryList the list of the created objects entries
5023 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5024 const QString& theOperationName,
5025 const QStringList& theEntryList )
5027 emit operationFinished( theModuleName, theOperationName, theEntryList );
5031 Update visibility state of given objects
5033 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5034 SUIT_ViewModel* theViewModel )
5036 if ( !theViewModel || theList.isEmpty() ) return;
5038 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5039 if ( !aStudy ) return;
5041 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5043 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5044 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5046 if ( !obj || aStudy->isComponent( obj->entry() ) )
5049 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5050 if ( anObjModule ) {
5051 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5053 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5054 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5055 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5056 anObjState = Qtx::ShownState;
5058 anObjState = Qtx::HiddenState;
5060 aStudy->setVisibilityState( obj->entry(), anObjState );
5067 * Called when window activated
5069 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5071 SUIT_DataBrowser* anOB = objectBrowser();
5074 SUIT_DataObject* rootObj = anOB->root();
5078 DataObjectList listObj = rootObj->children( true );
5080 SUIT_ViewModel* vmod = 0;
5081 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5082 vmod = vman->getViewModel();
5083 updateVisibilityState( listObj, vmod );
5087 Called then view manager removed
5089 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5091 ViewManagerList lst;
5092 viewManagers( lst );
5093 if ( lst.count() == 1) { // in case if closed last view window
5094 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5096 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5101 Check existing document.
5103 bool LightApp_Application::checkExistingDoc()
5106 if( activeStudy() ) {
5107 int answer = SUIT_MessageBox::question( desktop(),
5108 tr( "APPCLOSE_CAPTION" ),
5109 tr( "STUDYCLOSE_DESCRIPTION" ),
5110 tr( "APPCLOSE_SAVE" ),
5111 tr( "APPCLOSE_CLOSE" ),
5112 tr( "APPCLOSE_CANCEL" ), 0 );
5114 if ( activeStudy()->isSaved() ) {
5117 } else if ( onSaveAsDoc() ) {
5118 if( !closeDoc( false ) ) {
5125 else if( answer == 1 ) {
5127 } else if( answer == 2 ) {
5134 #ifndef DISABLE_PYCONSOLE
5136 PyConsole_Interp* LightApp_Application::getPyInterp()
5138 static PyConsole_Interp* myInterp = 0;
5140 myInterp = createPyInterp();
5144 PyConsole_Interp* LightApp_Application::createPyInterp()
5146 return new LightApp_PyInterp();
5149 #endif // DISABLE_PYCONSOLE