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 <PyConsole_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 PyConsole_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<PyConsole_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 PyConsole_Console* pyCons = new PyConsole_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_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2254 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2255 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2256 // .... -> auto-save
2257 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2258 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2259 pref->setItemProperty( "min", 0, autoSaveInterval );
2260 pref->setItemProperty( "max", 1440, autoSaveInterval );
2261 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2262 // ... "Study properties" group <<end>>
2264 // ... "Help browser" group <<start>>
2265 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2267 QString platform = "winapplication";
2269 QString platform = "application";
2271 // .... -> browser application
2272 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2273 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2274 // .... -> browser parameters
2275 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2276 // ... "Help browser" group <<end>>
2278 // ... "Python console properties" group <<start>>
2279 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2281 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2282 // .... -> show banner
2283 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2284 // ... "Python console properties" group <<end>>
2286 // ... "MRU" preferences group <<start>>
2287 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2288 pref->setItemProperty( "columns", 4, mruGroup );
2289 // number of MRU items
2290 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2291 "MRU", "visible_count" );
2292 pref->setItemProperty( "min", 0, mruVisCount );
2293 pref->setItemProperty( "max", 100, mruVisCount );
2295 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2296 "MRU", "link_type" );
2297 aValuesList.clear();
2298 anIndicesList.clear();
2299 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2300 anIndicesList << 0 << 1 << 2 ;
2301 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2302 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2303 // ... "MRU" preferences group <<end>>
2305 // ... "Full-screen" group <<start>>
2306 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2307 pref->setItemProperty( "columns", 2, fullScreenGroup );
2308 // .... -> automatic hiding toolbars
2309 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2310 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2311 // ... "Full-screen" group <<end>>
2313 // .. "General" preferences tab <<end>>
2315 // .. "3D viewer" group <<start>>
2316 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2317 // ... -> navigation mode
2318 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2319 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2320 aValuesList.clear();
2321 anIndicesList.clear();
2322 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2323 anIndicesList << 0 << 1;
2324 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2325 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2326 // ... -> zooming mode
2327 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2328 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2329 aValuesList.clear();
2330 anIndicesList.clear();
2331 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2332 anIndicesList << 0 << 1;
2333 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2334 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2335 // ... "Trihedron" group <<start>>
2336 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2337 pref->setItemProperty( "columns", 2, occTriGroup );
2338 // .... -> trihedron size
2339 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2340 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2341 pref->setItemProperty( "min", 1.0E-06, occTS );
2342 pref->setItemProperty( "max", 1000, occTS );
2343 // .... -> relative size of trihedron
2344 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2345 // .... -> show static trihedron
2346 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2347 // ... "Trihedron" group <<end>>
2348 // .. "3D viewer" group <<end>>
2352 #ifndef DISABLE_OCCVIEWER
2353 // .. "OCC viewer" group <<start>>
2354 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2356 // .... -> Projection mode
2357 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2358 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2359 aValuesList.clear();
2360 anIndicesList.clear();
2361 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2362 anIndicesList << 0 << 1;
2363 pref->setItemProperty( "strings", aValuesList, occProjMode );
2364 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2365 #if OCC_VERSION_LARGE > 0x06090000
2366 // .... -> Stereo group
2367 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2368 pref->setItemProperty( "columns", 2, stereoGroup );
2369 // .... -> Stereo type
2370 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2371 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2372 aValuesList.clear();
2373 anIndicesList.clear();
2375 OCCViewer_Viewer::stereoData( aValuesList, idList);
2376 foreach( int gid, idList ) anIndicesList << gid;
2377 pref->setItemProperty( "strings", aValuesList, stereoType );
2378 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2380 // .... -> Anaglyph filter
2381 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2382 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2383 aValuesList.clear();
2384 anIndicesList.clear();
2385 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2386 anIndicesList << 0 << 1 << 2;
2388 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2389 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2391 // .... -> Convergence distance type
2392 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2393 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2394 aValuesList.clear();
2395 anIndicesList.clear();
2396 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2397 anIndicesList << 0 << 1;
2398 pref->setItemProperty( "strings", aValuesList, occFocusType );
2399 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2401 // .... -> Stereographic focus value
2402 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2403 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2404 pref->setItemProperty( "precision", 3, focusValue );
2405 pref->setItemProperty( "min", 1.0E-03, focusValue );
2406 pref->setItemProperty( "max", 1.0E03, focusValue );
2407 pref->setItemProperty( "step", 0.05, focusValue );
2410 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2411 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2412 aValuesList.clear();
2413 anIndicesList.clear();
2414 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2415 anIndicesList << 0 << 1;
2416 pref->setItemProperty( "strings", aValuesList, occIODType );
2417 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2419 // .... -> Interocular distance (IOD) value
2420 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2421 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2422 pref->setItemProperty( "precision", 3, IODValue );
2423 pref->setItemProperty( "min", 1.0E-03, IODValue );
2424 pref->setItemProperty( "max", 1.0E03, IODValue );
2425 pref->setItemProperty( "step", 0.05, IODValue );
2427 // .... -> Reverse stereo
2428 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2429 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2430 // .... -> Enable V-Sync
2431 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2432 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2433 // .... -> Enable quad-buffer support
2434 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2435 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2437 // ... "Background" group <<start>>
2438 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2439 // pref->setItemProperty( "columns", 2, bgGroup );
2440 aValuesList.clear();
2441 anIndicesList.clear();
2444 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2445 foreach( int gid, idList ) anIndicesList << gid;
2446 // .... -> 3D viewer background
2447 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2448 LightApp_Preferences::Background, "OCCViewer", "background" );
2449 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2450 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2451 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2452 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2453 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2454 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2455 pref->setItemProperty( "custom_enabled", false, bgId );
2456 pref->setItemProperty( "image_formats", formats, bgId );
2457 // .... -> XZ viewer background
2458 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2459 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2460 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2461 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2462 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2463 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2464 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2465 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2466 pref->setItemProperty( "custom_enabled", false, bgId );
2467 pref->setItemProperty( "image_formats", formats, bgId );
2468 // .... -> YZ viewer background
2469 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2470 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2471 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2472 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2473 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2474 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2475 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2476 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2477 pref->setItemProperty( "custom_enabled", false, bgId );
2478 pref->setItemProperty( "image_formats", formats, bgId );
2479 // .... -> XY viewer background
2480 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2481 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2482 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2483 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2484 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2485 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2486 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2487 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2488 pref->setItemProperty( "custom_enabled", false, bgId );
2489 pref->setItemProperty( "image_formats", formats, bgId );
2490 // ... "Background" group <<end>>
2493 // ... "Selection" group <<start>>
2494 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2495 pref->setItemProperty( "columns", 2, occSelectionGroup );
2496 // .... -> enable preselection
2497 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2498 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2499 // .... -> enable selection
2500 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2501 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2502 // ... "Selection" group <<end>>
2504 // ... "Clipping" group <<start>>
2505 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2506 // .... -> clipping color
2507 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2508 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2509 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2510 pref->setItemProperty( "columns", 2, texturePref );
2511 // .... -> use default texture
2512 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2513 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2514 // .... -> clipping texture
2515 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2516 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2517 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2519 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2520 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2521 // .... -> scale factor
2522 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2523 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2524 pref->setItemProperty( "precision", 3, scaleFactor );
2525 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2526 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2527 pref->setItemProperty( "step", 0.1, scaleFactor );
2528 // ... "Clipping" group <<end>>
2530 // ... "Ray tracing" group <<start>>
2531 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2532 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2533 pref->setItemProperty( "columns", 2, rtPref );
2535 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2536 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2537 pref->setItemProperty( "min", 1, rt_depth );
2538 pref->setItemProperty( "max", 10, rt_depth );
2539 pref->setItemProperty( "step", 1, rt_depth );
2540 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2541 // .... -> specular reflections
2542 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2543 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2544 // .... -> adaptive anti-aliasing
2545 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2546 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2547 // .... -> shadows rendering
2548 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2549 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2550 // .... -> transparent shadow
2551 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2552 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2553 // ... "Ray tracing" group <<end>>
2555 // ... "Light source" group <<start>>
2556 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2557 // .... -> light color
2558 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2559 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2560 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2561 pref->setItemProperty( "columns", 3, directionPref );
2562 // .... -> light direction (dx component)
2563 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2564 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2565 pref->setItemProperty( "precision", 2, light_dx );
2566 pref->setItemProperty( "min", -1.0E03, light_dx );
2567 pref->setItemProperty( "max", 1.0E03, light_dx );
2568 pref->setItemProperty( "step", 0.1, light_dx );
2569 // .... -> light direction (dy component)
2570 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2571 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2572 pref->setItemProperty( "precision", 2, light_dy );
2573 pref->setItemProperty( "min", -1.0E03, light_dy );
2574 pref->setItemProperty( "max", 1.0E03, light_dy );
2575 pref->setItemProperty( "step", 0.1, light_dy );
2576 // .... -> light direction (dz component)
2577 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2578 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2579 pref->setItemProperty( "precision", 2, light_dz );
2580 pref->setItemProperty( "min", -1.0E03, light_dz );
2581 pref->setItemProperty( "max", 1.0E03, light_dz );
2582 pref->setItemProperty( "step", 0.1, light_dz );
2583 // ... "Light source" group <<end>>
2585 // ... -> empty frame (for layout) <<start>>
2586 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2587 pref->setItemProperty( "margin", 0, occGen );
2588 pref->setItemProperty( "columns", 2, occGen );
2589 // ... -> empty frame (for layout) <<end>>
2591 // .. "OCC viewer" group <<end>>
2594 #ifndef DISABLE_VTKVIEWER
2595 // .. "VTK viewer" group <<start>>
2596 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2598 // ... -> empty frame (for layout) <<start>>
2599 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2600 //pref->setItemProperty( "columns", 2, vtkGen );
2601 // .... -> projection mode
2602 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2603 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2604 aValuesList.clear();
2605 anIndicesList.clear();
2606 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2607 anIndicesList << 0 << 1;
2608 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2609 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2611 // .... -> Stereo group
2612 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2613 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2614 // .... -> Stereo type
2615 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2616 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2617 aValuesList.clear();
2618 anIndicesList.clear();
2620 SVTK_Viewer::stereoData( aValuesList, idList);
2621 foreach( int gid, idList ) anIndicesList << gid;
2622 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2623 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2624 // .... -> Anaglyph filter
2625 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2626 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2627 aValuesList.clear();
2628 anIndicesList.clear();
2629 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2630 anIndicesList << 0 << 1 << 2;
2632 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2633 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2635 // .... -> Enable quad-buffer support
2636 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2637 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2639 // .... -> background
2640 aValuesList.clear();
2641 anIndicesList.clear();
2644 #ifndef DISABLE_SALOMEOBJECT
2645 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2647 foreach( int gid, idList ) anIndicesList << gid;
2648 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2649 LightApp_Preferences::Background, "VTKViewer", "background" );
2650 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2651 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2652 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2653 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2654 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2655 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2656 pref->setItemProperty( "custom_enabled", false, bgId );
2657 #ifndef DISABLE_SALOMEOBJECT
2658 pref->setItemProperty( "image_formats", formats, bgId );
2660 // .... -> speed increment
2661 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2662 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2663 pref->setItemProperty( "min", 1, vtkSpeed );
2664 pref->setItemProperty( "max", 1000, vtkSpeed );
2665 // .... -> speed mode
2666 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2667 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2668 aValuesList.clear();
2669 anIndicesList.clear();
2670 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2671 anIndicesList << 0 << 1;
2672 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2673 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2675 // ... "Selection" group <<start>>
2676 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2677 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2678 // .... -> preselection
2679 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2680 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2681 aValuesList.clear();
2682 anIndicesList.clear();
2683 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2684 anIndicesList << 0 << 1 << 2;
2685 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2686 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2687 // .... -> enable selection
2688 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2689 // ... "Selection" group <<end>>
2691 // ... -> empty frame (for layout) <<end>>
2693 // ... space mouse sub-group <<start>>
2694 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2695 //pref->setItemProperty( "columns", 2, vtkSM );
2696 // .... -> decrease speed increment
2697 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2698 LightApp_Preferences::Selector, "VTKViewer",
2699 "spacemouse_func1_btn" );
2700 // .... -> increase speed increment
2701 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2702 LightApp_Preferences::Selector, "VTKViewer",
2703 "spacemouse_func2_btn" );
2704 // .... -> dominant / combined switch
2705 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2706 LightApp_Preferences::Selector, "VTKViewer",
2707 "spacemouse_func5_btn" ); //
2708 aValuesList.clear();
2709 anIndicesList.clear();
2710 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2711 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2712 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2713 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2714 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2715 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2716 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2717 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2718 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2719 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2720 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2721 // ... space mouse sub-group <<end>>
2723 // ... avi recording sub-group <<start>>
2724 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2725 pref->setItemProperty( "columns", 2, vtkRec );
2726 // .... -> recording mode
2727 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2728 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2729 aValuesList.clear();
2730 anIndicesList.clear();
2731 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2732 anIndicesList << 0 << 1;
2733 pref->setItemProperty( "strings", aValuesList, modePref );
2734 pref->setItemProperty( "indexes", anIndicesList, modePref );
2736 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2737 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2738 pref->setItemProperty( "min", 0.1, fpsPref );
2739 pref->setItemProperty( "max", 100, fpsPref );
2741 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2742 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2743 pref->setItemProperty( "min", 1, qualityPref );
2744 pref->setItemProperty( "max", 100, qualityPref );
2745 // .... -> progressive mode
2746 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2747 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2748 // ... avi recording sub-group <<end>>
2750 // ... group names sub-group <<start>>
2751 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2752 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2753 pref->setItemProperty( "columns", 2, vtkGN );
2754 // .... -> text color
2755 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2756 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2757 // .... -> transparency
2758 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2759 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2760 pref->setItemProperty( "min", 0.0, transPref );
2761 pref->setItemProperty( "max", 1.0, transPref );
2762 pref->setItemProperty( "step", 0.1, transPref );
2763 // ... -> group names sub-group <<end>>
2764 // .. "VTK viewer" group <<end>>
2767 // .. "Plot2d viewer" group <<start>>
2768 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2769 //pref->setItemProperty( "columns", 2, plot2dGroup );
2771 // ... -> background
2772 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2773 LightApp_Preferences::Color, "Plot2d", "Background" );
2774 // ... -> selection color
2775 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2776 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2778 // ... "Viewer" group <<start>>
2779 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2781 // .... -> curve type
2782 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2783 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2784 aValuesList.clear();
2785 anIndicesList.clear();
2786 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2787 anIndicesList << 0 << 1 << 2 ;
2788 pref->setItemProperty( "strings", aValuesList, curveType );
2789 pref->setItemProperty( "indexes", anIndicesList, curveType );
2790 // .... -> marker size
2791 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2792 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2793 pref->setItemProperty( "min", 0, markerSize );
2794 pref->setItemProperty( "max", 100, markerSize );
2795 // .... -> horizontal scaling mode
2796 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2797 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2798 aValuesList.clear();
2799 anIndicesList.clear();
2800 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2801 anIndicesList << 0 << 1 ;
2802 pref->setItemProperty( "strings", aValuesList, horScale );
2803 pref->setItemProperty( "indexes", anIndicesList, horScale );
2804 // .... -> vertical scaling mode
2805 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2806 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2807 pref->setItemProperty( "strings", aValuesList, verScale );
2808 pref->setItemProperty( "indexes", anIndicesList, verScale );
2810 // .... -> errors/deviation colot
2811 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2812 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2813 // .... -> deviation markers line size
2814 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2815 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2816 pref->setItemProperty( "min", 1, deviationMarkerLw );
2817 pref->setItemProperty( "max", 5, deviationMarkerLw );
2818 // .... -> deviation markers tick mark size
2819 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2820 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2821 pref->setItemProperty( "min", 1, deviationMarkerTs );
2822 pref->setItemProperty( "max", 5, deviationMarkerTs );
2823 // .... "Viewer" group <<end>>
2825 // ... "Legend" group <<start>>
2826 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2828 // .... -> show legend
2829 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2830 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2831 // .... -> legend position
2832 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2833 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2834 aValuesList.clear();
2835 anIndicesList.clear();
2836 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2837 anIndicesList << 0 << 1 << 2 << 3 ;
2838 pref->setItemProperty( "strings", aValuesList, legendPosition );
2839 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2840 // .... -> Symbol type
2841 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2842 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2843 aValuesList.clear();
2844 anIndicesList.clear();
2845 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2846 anIndicesList << 0 << 1 ;
2847 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2848 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2849 // .... -> legend font
2850 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2851 // ... -> font color
2852 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2853 // ... -> selection font color
2854 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2855 // ... "Legend" group <<end>>
2857 // .. "Plot2d viewer" group <<end>>
2859 // .. "PyViewer" preferences tab <<start>>
2860 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2861 // ... "Font settings" group <<start>>
2862 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2863 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2864 LightApp_Preferences::Font, "PyEditor", "Font" );
2865 // ... "Font settings" group <<end>>
2866 // ... "Display settings" group <<start>>
2867 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2868 pref->setItemProperty( "columns", 2, pyDispGroup );
2869 // ... -> current line highlight
2870 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2871 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2872 // ... -> text wrapping
2873 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2874 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2875 // ... -> center cursor on scroll
2876 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2877 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2878 // ... -> line numbers area
2879 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2880 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2881 // ... "Display settings" group <<end>>
2882 // ... "Tab settings" group <<start>>
2883 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2884 pref->setItemProperty( "columns", 2, pyTabGroup );
2885 // ... -> tab whitespaces
2886 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2887 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2889 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2890 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2891 // ... "Tab settings" group <<end>>
2892 // ... "Vertical edge settings" group <<start>>
2893 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2894 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2895 // ... -> vertical edge
2896 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2897 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2898 // ... -> number of columns
2899 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2900 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2901 // ... "Vertical edge settings" group <<end>>
2902 // .. "PyEditor" preferences tab <<end>>
2904 // .. "Directories" preferences tab <<start>>
2905 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2906 // ... --> quick directories list
2907 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2908 pref->addPreference( tr( "" ), dirGroup,
2909 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2910 // .. "Directories" preferences tab <<end>>
2912 // .. "Object browser" preferences tab <<start>>
2913 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2915 // ... "Search tool" group <<start>>
2916 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2917 // .... --> auto-hide
2918 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2919 "ObjectBrowser", "auto_hide_search_tool" );
2920 // ... "Search tool" group <<end>>
2922 // ... "Object browser settings" group <<start>>
2923 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2924 pref->setItemProperty( "columns", 2, objSetGroup );
2925 // .... -> auto size first column
2926 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2927 "ObjectBrowser", "auto_size_first" );
2928 // .... -> auto size other columns
2929 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2930 "ObjectBrowser", "auto_size" );
2931 // .... -> resize columns on expand item
2932 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2933 "ObjectBrowser", "resize_on_expand_item" );
2934 // .... -> browse to published object
2935 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2936 "ObjectBrowser", "browse_published_object" );
2937 aValuesList.clear();
2938 anIndicesList.clear();
2939 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2940 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2941 pref->setItemProperty( "strings", aValuesList, browsePublished );
2942 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2943 // ... "Object browser settings" group <<end>>
2944 // .. "Object browser" preferences tab <<end>>
2946 // .. "Shortcuts" preferences tab <<start>>
2947 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2948 // ... "Shortcuts settings" group <<start>>
2949 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2950 pref->addPreference( tr( "" ), shortcutGroup,
2951 LightApp_Preferences::ShortcutTree, "shortcuts" );
2952 // ... "Shortcuts settings" group <<end>>
2953 // .. "Shortcuts" preferences tab <<end>>
2954 // . Top-level "SALOME" preferences group <<end>>
2960 Changes appearance of application according to changed preferences
2961 \param sec - section
2962 \param param - name of changed parameter
2964 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2966 SUIT_ResourceMgr* resMgr = resourceMgr();
2970 if ( sec == "viewers" && param == "drop_down_buttons" )
2972 ViewManagerList vmlist = viewManagers();
2973 foreach( SUIT_ViewManager* vm, vmlist )
2975 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2976 foreach( SUIT_ViewWindow* vw, vwlist )
2977 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2981 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2983 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2984 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2985 QList<SUIT_ViewManager*> lst;
2986 #ifndef DISABLE_OCCVIEWER
2987 viewManagers( OCCViewer_Viewer::Type(), lst );
2988 QListIterator<SUIT_ViewManager*> itOCC( lst );
2989 while ( itOCC.hasNext() && sz >= 0 )
2991 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2992 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2995 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2996 occVM->setTrihedronSize( sz, relative );
2997 occVM->getAISContext()->UpdateCurrentViewer();
3000 #ifndef DISABLE_VTKVIEWER
3001 #ifndef DISABLE_SALOMEOBJECT
3002 viewManagers( SVTK_Viewer::Type(), lst );
3003 QListIterator<SUIT_ViewManager*> itVTK( lst );
3004 while ( itVTK.hasNext() && sz >= 0 )
3006 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3007 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3010 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3013 vtkVM->setTrihedronSize( sz, relative );
3021 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3023 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3024 QList<SUIT_ViewManager*> lst;
3025 #ifndef DISABLE_OCCVIEWER
3026 viewManagers( OCCViewer_Viewer::Type(), lst );
3027 QListIterator<SUIT_ViewManager*> itOCC( lst );
3028 while ( itOCC.hasNext() )
3030 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3031 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3034 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3037 occVM->setStaticTrihedronDisplayed( isVisible );
3041 #ifndef DISABLE_VTKVIEWER
3042 #ifndef DISABLE_SALOMEOBJECT
3043 viewManagers( SVTK_Viewer::Type(), lst );
3044 QListIterator<SUIT_ViewManager*> itVTK( lst );
3045 while ( itVTK.hasNext() )
3047 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3048 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3051 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3054 vtkVM->setStaticTrihedronVisible( isVisible );
3062 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3064 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3065 QList<SUIT_ViewManager*> lst;
3066 #ifndef DISABLE_OCCVIEWER
3067 viewManagers( OCCViewer_Viewer::Type(), lst );
3068 QListIterator<SUIT_ViewManager*> itOCC( lst );
3069 while ( itOCC.hasNext() )
3071 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3072 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3075 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3076 occVM->setInteractionStyle( mode );
3079 #ifndef DISABLE_VTKVIEWER
3080 #ifndef DISABLE_SALOMEOBJECT
3081 viewManagers( SVTK_Viewer::Type(), lst );
3082 QListIterator<SUIT_ViewManager*> itVTK( lst );
3083 while ( itVTK.hasNext() )
3085 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3086 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3089 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3090 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3096 #ifndef DISABLE_OCCVIEWER
3097 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3099 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3100 QList<SUIT_ViewManager*> lst;
3101 viewManagers( OCCViewer_Viewer::Type(), lst );
3102 QListIterator<SUIT_ViewManager*> it( lst );
3103 while ( it.hasNext() )
3105 SUIT_ViewModel* vm = it.next()->getViewModel();
3106 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3109 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3110 occVM->enablePreselection( isToEnablePreselection );
3115 #ifndef DISABLE_OCCVIEWER
3116 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3118 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3119 QList<SUIT_ViewManager*> lst;
3120 viewManagers( OCCViewer_Viewer::Type(), lst );
3121 QListIterator<SUIT_ViewManager*> it( lst );
3122 while ( it.hasNext() )
3124 SUIT_ViewModel* vm = it.next()->getViewModel();
3125 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3128 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3129 occVM->enableSelection( isToEnableSelection );
3134 #ifndef DISABLE_OCCVIEWER
3135 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3137 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3138 QList<SUIT_ViewManager*> lst;
3139 viewManagers( OCCViewer_Viewer::Type(), lst );
3140 QListIterator<SUIT_ViewManager*> it( lst );
3141 while ( it.hasNext() )
3143 SUIT_ViewModel* vm = it.next()->getViewModel();
3144 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3147 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3148 occVM->setClippingColor( aColor );
3153 #ifndef DISABLE_OCCVIEWER
3154 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3155 param == QString( "clipping_texture" ) ||
3156 param == QString( "clipping_modulate" ) ||
3157 param == QString( "clipping_scale" ) ) )
3159 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3160 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3161 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3162 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3163 QList<SUIT_ViewManager*> lst;
3164 viewManagers( OCCViewer_Viewer::Type(), lst );
3165 QListIterator<SUIT_ViewManager*> it( lst );
3166 while ( it.hasNext() )
3168 SUIT_ViewModel* vm = it.next()->getViewModel();
3169 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3172 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3173 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3178 #ifndef DISABLE_OCCVIEWER
3179 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3181 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3182 QList<SUIT_ViewManager*> lst;
3183 viewManagers( OCCViewer_Viewer::Type(), lst );
3184 QListIterator<SUIT_ViewManager*> it( lst );
3185 while ( it.hasNext() )
3187 SUIT_ViewModel* vm = it.next()->getViewModel();
3188 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3191 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3192 occVM->setProjectionType( mode );
3196 #if OCC_VERSION_LARGE > 0x06090000
3197 #ifndef DISABLE_OCCVIEWER
3198 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3200 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3201 QList<SUIT_ViewManager*> lst;
3202 viewManagers( OCCViewer_Viewer::Type(), lst );
3203 QListIterator<SUIT_ViewManager*> it( lst );
3204 while ( it.hasNext() )
3206 SUIT_ViewModel* vm = it.next()->getViewModel();
3207 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3210 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3211 occVM->setStereoType( mode );
3216 #ifndef DISABLE_OCCVIEWER
3217 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3219 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3220 QList<SUIT_ViewManager*> lst;
3221 viewManagers( OCCViewer_Viewer::Type(), lst );
3222 QListIterator<SUIT_ViewManager*> it( lst );
3223 while ( it.hasNext() )
3225 SUIT_ViewModel* vm = it.next()->getViewModel();
3226 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3229 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3230 occVM->setAnaglyphFilter( mode );
3235 #ifndef DISABLE_OCCVIEWER
3236 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3237 param == QString( "focus_value" ) ) )
3239 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3240 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3241 QList<SUIT_ViewManager*> lst;
3242 viewManagers( OCCViewer_Viewer::Type(), lst );
3243 QListIterator<SUIT_ViewManager*> it( lst );
3244 while ( it.hasNext() )
3246 SUIT_ViewModel* vm = it.next()->getViewModel();
3247 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3250 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3251 occVM->setStereographicFocus( aType, aValue );
3256 #ifndef DISABLE_OCCVIEWER
3257 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3258 param == QString( "iod_value" ) ) )
3260 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3261 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3262 QList<SUIT_ViewManager*> lst;
3263 viewManagers( OCCViewer_Viewer::Type(), lst );
3264 QListIterator<SUIT_ViewManager*> it( lst );
3265 while ( it.hasNext() )
3267 SUIT_ViewModel* vm = it.next()->getViewModel();
3268 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3271 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3272 occVM->setInterocularDistance( aType, aValue );
3277 #ifndef DISABLE_OCCVIEWER
3278 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3280 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3281 QList<SUIT_ViewManager*> lst;
3282 viewManagers( OCCViewer_Viewer::Type(), lst );
3283 QListIterator<SUIT_ViewManager*> it( lst );
3284 while ( it.hasNext() )
3286 SUIT_ViewModel* vm = it.next()->getViewModel();
3287 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3290 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3291 occVM->setReverseStereo( reverse );
3296 #ifndef DISABLE_OCCVIEWER
3297 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3299 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3300 QList<SUIT_ViewManager*> lst;
3301 viewManagers( OCCViewer_Viewer::Type(), lst );
3302 QListIterator<SUIT_ViewManager*> it( lst );
3303 while ( it.hasNext() )
3305 SUIT_ViewModel* vm = it.next()->getViewModel();
3306 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3309 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3310 occVM->setVSync( enable );
3315 #ifndef DISABLE_OCCVIEWER
3316 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3318 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3319 QList<SUIT_ViewManager*> lst;
3320 viewManagers( OCCViewer_Viewer::Type(), lst );
3321 QListIterator<SUIT_ViewManager*> it( lst );
3322 while ( it.hasNext() )
3324 SUIT_ViewModel* vm = it.next()->getViewModel();
3325 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3328 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3329 occVM->setQuadBufferSupport( enable );
3334 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3336 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3337 QList<SUIT_ViewManager*> lst;
3338 #ifndef DISABLE_OCCVIEWER
3339 viewManagers( OCCViewer_Viewer::Type(), lst );
3340 QListIterator<SUIT_ViewManager*> itOCC( lst );
3341 while ( itOCC.hasNext() )
3343 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3344 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3347 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3348 occVM->setZoomingStyle( mode );
3351 #ifndef DISABLE_VTKVIEWER
3352 #ifndef DISABLE_SALOMEOBJECT
3353 viewManagers( SVTK_Viewer::Type(), lst );
3354 QListIterator<SUIT_ViewManager*> itVTK( lst );
3355 while ( itVTK.hasNext() )
3357 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3358 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3361 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3362 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3368 #ifndef DISABLE_VTKVIEWER
3369 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3371 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3372 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3373 QList<SUIT_ViewManager*> lst;
3374 #ifndef DISABLE_SALOMEOBJECT
3375 viewManagers( SVTK_Viewer::Type(), lst );
3376 QListIterator<SUIT_ViewManager*> it( lst );
3377 while ( it.hasNext() )
3379 SUIT_ViewModel* vm = it.next()->getViewModel();
3380 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3383 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3384 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3390 #ifndef DISABLE_VTKVIEWER
3391 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3393 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3394 QList<SUIT_ViewManager*> lst;
3395 #ifndef DISABLE_SALOMEOBJECT
3396 viewManagers( SVTK_Viewer::Type(), lst );
3397 QListIterator<SUIT_ViewManager*> it( lst );
3398 while ( it.hasNext() )
3400 SUIT_ViewModel* vm = it.next()->getViewModel();
3401 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3404 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3405 if( vtkVM ) vtkVM->setProjectionMode( mode );
3411 #ifndef DISABLE_VTKVIEWER
3412 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3414 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3415 QList<SUIT_ViewManager*> lst;
3416 #ifndef DISABLE_SALOMEOBJECT
3417 viewManagers( SVTK_Viewer::Type(), lst );
3418 QListIterator<SUIT_ViewManager*> it( lst );
3419 while ( it.hasNext() )
3421 SUIT_ViewModel* vm = it.next()->getViewModel();
3422 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3425 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3426 if( vtkVM ) vtkVM->setStereoType( mode );
3432 #ifndef DISABLE_VTKVIEWER
3433 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3435 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3436 QList<SUIT_ViewManager*> lst;
3437 #ifndef DISABLE_SALOMEOBJECT
3438 viewManagers( SVTK_Viewer::Type(), lst );
3439 QListIterator<SUIT_ViewManager*> it( lst );
3440 while ( it.hasNext() )
3442 SUIT_ViewModel* vm = it.next()->getViewModel();
3443 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3446 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3447 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3453 #ifndef DISABLE_VTKVIEWER
3454 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3456 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3457 QList<SUIT_ViewManager*> lst;
3458 #ifndef DISABLE_SALOMEOBJECT
3459 viewManagers( SVTK_Viewer::Type(), lst );
3460 QListIterator<SUIT_ViewManager*> it( lst );
3461 while ( it.hasNext() )
3463 SUIT_ViewModel* vm = it.next()->getViewModel();
3464 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3467 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3468 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3474 #ifndef DISABLE_VTKVIEWER
3475 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3477 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3478 QList<SUIT_ViewManager*> lst;
3479 #ifndef DISABLE_SALOMEOBJECT
3480 viewManagers( SVTK_Viewer::Type(), lst );
3481 QListIterator<SUIT_ViewManager*> it( lst );
3482 while ( it.hasNext() )
3484 SUIT_ViewModel* vm = it.next()->getViewModel();
3485 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3488 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3489 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3495 #ifndef DISABLE_VTKVIEWER
3496 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3498 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3499 QList<SUIT_ViewManager*> lst;
3500 #ifndef DISABLE_SALOMEOBJECT
3501 viewManagers( SVTK_Viewer::Type(), lst );
3502 QListIterator<SUIT_ViewManager*> it( lst );
3503 while ( it.hasNext() )
3505 SUIT_ViewModel* vm = it.next()->getViewModel();
3506 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3509 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3510 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3516 #ifndef DISABLE_VTKVIEWER
3517 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3518 param == QString( "spacemouse_func2_btn" ) ||
3519 param == QString( "spacemouse_func5_btn" ) ) )
3521 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3522 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3523 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3524 QList<SUIT_ViewManager*> lst;
3525 #ifndef DISABLE_SALOMEOBJECT
3526 viewManagers( SVTK_Viewer::Type(), lst );
3527 QListIterator<SUIT_ViewManager*> it( lst );
3528 while ( it.hasNext() )
3530 SUIT_ViewModel* vm = it.next()->getViewModel();
3531 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3534 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3535 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3540 if( sec=="ObjectBrowser" )
3542 SUIT_DataBrowser* ob = objectBrowser();
3546 if ( param=="auto_size_first" )
3548 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3549 ob->setAutoSizeFirstColumn( autoSizeFirst );
3550 if ( autoSizeFirst )
3551 ob->adjustFirstColumnWidth();
3553 else if ( param=="auto_size" ) {
3554 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3555 ob->setAutoSizeColumns(autoSize);
3557 ob->adjustColumnsWidth();
3559 else if ( param=="resize_on_expand_item" ) {
3560 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3561 ob->setResizeOnExpandItem(resizeOnExpandItem);
3563 else if ( param == "auto_hide_search_tool" ) {
3564 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3570 if( param=="auto_save_interval" ) {
3571 myAutoSaveTimer->stop();
3572 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3573 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3577 #ifndef DISABLE_PYCONSOLE
3578 if( sec=="PyConsole" && pythonConsole() )
3580 if ( param=="font" ) {
3581 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3583 else if ( param=="show_banner" ) {
3584 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3591 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3593 if ( param == "visible_count" )
3594 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3595 else if ( param == "max_count" )
3596 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3597 else if ( param == "insert_mode" )
3598 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3599 else if ( param == "link_type" )
3600 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3601 else if ( param == "show_clear" )
3602 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3603 else if ( param == "show_mru" )
3604 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3607 if ( sec == "language" && param == "language" )
3609 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3610 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3612 if ( sec == "language" && param == "locale")
3614 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3615 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3617 if ( sec == "desktop" && param == "opaque_resize" ) {
3618 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3619 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3620 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3621 else dopts &= ~QMainWindow::AnimatedDocks;
3622 desktop()->setDockOptions( dopts );
3623 desktop()->setOpaqueResize( opaqueResize );
3624 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3625 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3628 #ifndef DISABLE_PLOT2DVIEWER
3629 QList<SUIT_ViewManager*> lst;
3630 viewManagers( Plot2d_Viewer::Type(), lst );
3631 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3632 while ( itPlot2d.hasNext() ) {
3633 SUIT_ViewManager* viewMgr = itPlot2d.next();
3634 SUIT_ViewModel* vm = viewMgr->getViewModel();
3635 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3638 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3640 viewMgr->setViewModel( vm );
3641 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3643 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3644 frame->SetPreference();
3649 #ifndef DISABLE_PYVIEWER
3650 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3651 param == QString( "LineNumberArea" ) ||
3652 param == QString( "TextWrapping" ) ||
3653 param == QString( "CenterCursorOnScroll" ) ||
3654 param == QString( "TabSpaceVisible" ) ||
3655 param == QString( "TabSize" ) ||
3656 param == QString( "VerticalEdge" ) ||
3657 param == QString( "NumberColumns" ) ||
3658 param == QString( "Font" ) ) )
3660 QList<SUIT_ViewManager*> lst;
3661 viewManagers( PyViewer_Viewer::Type(), lst );
3662 QListIterator<SUIT_ViewManager*> itPy( lst );
3663 while ( itPy.hasNext() )
3665 SUIT_ViewManager* viewMgr = itPy.next();
3666 SUIT_ViewModel* vm = viewMgr->getViewModel();
3667 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3670 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3672 viewMgr->setViewModel( vm );
3673 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3676 pyView->setPreferences();
3686 void LightApp_Application::loadPreferences()
3688 CAM_Application::loadPreferences();
3690 SUIT_ResourceMgr* aResMgr = resourceMgr();
3695 static bool mru_load = true;
3698 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3700 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3701 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3702 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3703 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3704 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3705 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3706 mru->loadLinks( aResMgr, "MRU" );
3712 QStringList mods = aResMgr->parameters( "windows_visibility" );
3713 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3716 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3717 myWinVis.insert( *itr, arr );
3721 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3722 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3723 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3724 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3725 else dopts &= ~QMainWindow::AnimatedDocks;
3726 desktop()->setDockOptions( dopts );
3727 desktop()->setOpaqueResize( opaqueResize );
3728 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3729 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3736 void LightApp_Application::savePreferences()
3738 CAM_Application::savePreferences();
3740 saveDockWindowsState();
3742 SUIT_ResourceMgr* aResMgr = resourceMgr();
3747 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3749 mru->saveLinks( aResMgr, "MRU" );
3751 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3752 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3755 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3757 #if GUI_DEVELOPMENT > 0
3758 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3760 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3767 Updates desktop title
3769 void LightApp_Application::updateDesktopTitle()
3771 QString aTitle = applicationName();
3772 QString aVer = applicationVersion();
3773 if ( !aVer.isEmpty() )
3774 aTitle += QString( " " ) + aVer;
3776 if ( activeStudy() ) {
3777 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3778 aTitle += QString( " - [%1]" ).arg( sName );
3781 desktop()->setWindowTitle( aTitle );
3785 \brief Get map of the operations which can be performed
3786 on the module activation.
3788 The method should return the map of the kind \c {<id>:<name>}
3789 where \c <id> is an integer identifier of the operation and
3790 \c <name> is a title for the button to be added to the
3791 dialog box. After user selects the required operation by the
3792 clicking the corresponding button in the dialog box, its identifier
3793 is passed to the moduleActionSelected() method to process
3796 \return map of the operations
3797 \sa moduleActionSelected()
3799 QMap<int, QString> LightApp_Application::activateModuleActions() const
3801 QMap<int, QString> opmap;
3802 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3803 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3808 \brief Called when the used selectes required operation chosen
3809 from "Activate module" dialog box.
3811 Performs the required operation according to the user choice.
3813 \param id operation identifier
3814 \sa activateModuleActions()
3816 void LightApp_Application::moduleActionSelected( const int id )
3831 Updates windows after close document
3833 void LightApp_Application::afterCloseDoc()
3837 CAM_Application::afterCloseDoc();
3841 Updates actions of active module
3843 void LightApp_Application::updateModuleActions()
3846 if ( activeModule() ) {
3847 modName = activeModule()->moduleName();
3848 if ( !isModuleAccessible( modName ) ) {
3849 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3850 foreach( SUIT_Application* app, apps ) {
3851 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3852 if ( lapp && lapp != this )
3853 lapp->removeModuleAction( modName );
3858 LightApp_ModuleAction* moduleAction =
3859 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3861 moduleAction->setActiveModule( modName );
3864 void LightApp_Application::removeModuleAction( const QString& modName )
3866 LightApp_ModuleAction* moduleAction =
3867 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3869 moduleAction->removeModule( modName );
3873 Gets current windows.
3874 \param winMap - output current windows map.
3876 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3879 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3880 ((LightApp_Module*)activeModule())->windows( winMap );
3882 defaultWindows( winMap );
3886 Gets current view managers.
3887 \param lst - output current view managers list.
3889 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3892 if ( !activeStudy() )
3895 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3896 ((LightApp_Module*)activeModule())->viewManagers( lst );
3898 defaultViewManagers( lst );
3904 void LightApp_Application::updateWindows()
3906 QMap<int, int> winMap;
3907 currentWindows( winMap );
3909 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3911 if ( !dockWindow( it.key() ) )
3912 getWindow( it.key() );
3915 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3917 QWidget* wid = it.value();
3918 if ( winMap.contains( it.key() ) )
3919 wid->setVisible( true );
3924 loadDockWindowsState();
3928 Updates view managers
3930 void LightApp_Application::updateViewManagers()
3933 currentViewManagers( lst );
3935 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3936 getViewManager( *it, true );
3940 Loads windows geometry
3942 void LightApp_Application::loadDockWindowsState()
3946 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3947 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3948 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3951 if ( activeModule() )
3952 modName = activeModule()->name();
3953 else if ( activeStudy() )
3954 modName = "nomodule";
3956 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3957 QByteArray aDefaultState;
3958 aResMgr->value( "windows_geometry", modName, aDefaultState );
3959 QByteArray aDefaultVisibility;
3960 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3961 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3962 aResMgr->setWorkingMode( prevMode );
3964 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3967 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3968 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3970 if ( version > Qtx::versionToId( "7.4.1" ) )
3971 aResMgr->value( "windows_geometry", modName , arr );
3973 arr = aDefaultState;
3974 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3975 desktop()->restoreState( aTargetArray );
3978 QStringList mainToolbarsNames;
3979 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3980 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3981 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3983 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3986 QMap<QString, bool> *tbMap = 0;
3987 QMap<QString, bool> *dwMap = 0;
3989 QMap<QString, bool> userTbMap, userDwMap;
3990 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3992 QMap<QString, bool> defaultTbMap, defaultDwMap;
3993 if(hasDefaultVisibility) {
3994 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4000 if(hasDefaultVisibility){
4001 tbMap = &defaultTbMap;
4008 if(hasDefaultVisibility){
4009 dwMap = &defaultDwMap;
4014 QList<QToolBar*> tbList = findToolBars();
4015 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4017 QToolBar* tb = *tit;
4018 if ( tbMap->contains( tb->objectName() ) ) {
4019 tb->setVisible( (*tbMap)[tb->objectName()] );
4025 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
4026 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4028 QDockWidget* dw = *dit;
4030 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4031 if ( po != desktop() )
4034 if ( dwMap->contains( dw->objectName() ) )
4035 dw->setVisible( (*dwMap)[dw->objectName()] );
4043 Saves windows geometry
4045 void LightApp_Application::saveDockWindowsState()
4050 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4051 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4053 if( !storeWin && !storeTb )
4057 if ( activeModule() )
4058 modName = activeModule()->name();
4059 else if ( activeStudy() )
4060 modName = "nomodule";
4062 QString versionId = GUI_VERSION_STR;
4063 #if GUI_DEVELOPMENT > 0
4067 QByteArray arr = desktop()->saveState();
4068 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4069 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4072 if ( myWinVis.contains( modName ) )
4073 visArr = myWinVis[modName];
4075 QMap<QString, bool> tbMap, dwMap;
4076 dockWindowsState( visArr, tbMap, dwMap );
4078 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4079 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4082 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4085 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4086 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4088 QDockWidget* wid = *it;
4089 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4092 visArr = dockWindowsState( tbMap, dwMap );
4094 myWinVis.insert( modName, visArr );
4097 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4100 QDataStream stream( &visArr, QIODevice::WriteOnly );
4102 stream << (uchar)ToolBarMarker;
4103 stream << tb.size();
4104 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4106 stream << tit.key();
4107 stream << (uchar)( tit.value() ? 1 : 0 );
4110 stream << (uchar)DockWidgetMarker;
4111 stream << dw.size();
4112 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4114 stream << wit.key();
4115 stream << (uchar)( wit.value() ? 1 : 0 );
4121 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4126 QByteArray visArr = arr;
4127 QDataStream stream( &visArr, QIODevice::ReadOnly );
4131 if ( marker != ToolBarMarker )
4136 for ( int i = 0; i < lines; ++i )
4139 stream >> objectName;
4142 tb.insert( objectName, shown );
4146 if ( marker != DockWidgetMarker )
4150 for ( int j = 0; j < lines; ++j )
4153 stream >> objectName;
4156 dw.insert( objectName, shown );
4161 Adds icon names for modules
4163 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4167 SUIT_ResourceMgr* resMgr = resourceMgr();
4171 QStringList modList;
4172 modules( modList, false );
4174 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4176 QString modName = *it;
4177 QString modIntr = moduleName( modName );
4178 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4180 if ( modIcon.isEmpty() )
4183 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4184 modIcon += QString( ".png" );
4186 iconMap.insert( modName, modIcon );
4191 Inserts items in popup, which necessary for current application
4193 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4196 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4197 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4198 selMgr->setSelectionCacheEnabled( true );
4200 SUIT_DataBrowser* ob = objectBrowser();
4202 CAM_Application::contextMenuPopup( type, thePopup, title );
4204 if ( ob && type == ob->popupClientType() ) {
4205 thePopup->addSeparator();
4206 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4207 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4208 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4211 #ifndef DISABLE_SALOMEOBJECT
4212 if ( selMgr && ob ) {
4213 SALOME_ListIO selected;
4214 selMgr->selectedObjects( selected );
4215 if(selected.Extent() == 1){
4216 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4217 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4218 if(obj && obj->renameAllowed()) {
4219 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4220 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4221 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4222 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4224 QList<QAction*> acts = thePopup->actions();
4225 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4226 thePopup->insertAction(firstAction,a);
4232 selMgr->setSelectionCacheEnabled( cacheIsOn );
4238 void LightApp_Application::createEmptyStudy()
4240 CAM_Application::createEmptyStudy();
4242 if ( objectBrowser() )
4243 objectBrowser()->updateTree();
4245 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4246 if ( aResMgr && activeStudy() ) {
4247 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4248 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4253 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4255 CAM_Application::setDesktop( desk );
4258 connect( desk, SIGNAL( message( const QString& ) ),
4259 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4260 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4261 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4262 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4263 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4269 \param mod - module to be activated
4271 bool LightApp_Application::activateModule( CAM_Module* mod )
4273 bool res = CAM_Application::activateModule( mod );
4275 if ( objectBrowser() )
4276 objectBrowser()->updateTree();
4282 \return keyborad accelerators manager object
4284 SUIT_Accel* LightApp_Application::accel() const
4290 Removes dead widget container from map
4292 void LightApp_Application::onWCDestroyed( QObject* ob )
4294 // remove destroyed widget container from windows map
4295 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4297 if ( itr.value() != ob )
4300 int key = itr.key();
4301 myWin.remove( key );
4306 void LightApp_Application::onMRUActivated( const QString& name )
4308 SUIT_Session* s = SUIT_Session::session();
4309 if ( s && s->activeApplication() == this )
4313 void LightApp_Application::onStylePreferences()
4315 #ifdef USE_SALOME_STYLE
4316 Style_PrefDlg dlg( desktop() );
4319 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4320 #endif // USE_SALOME_STYLE
4323 void LightApp_Application::onFullScreen(){
4324 if(myScreenHelper) {
4325 if(desktop()->isFullScreen())
4326 myScreenHelper->switchToNormalScreen();
4328 myScreenHelper->switchToFullScreen();
4333 Connects just added view manager
4335 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4337 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4338 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4339 CAM_Application::addViewManager( vm );
4343 Remove view manager from memory
4345 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4347 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4348 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4349 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4351 aStudy->removeObjectProperties( vm->getGlobalId() );
4353 CAM_Application::removeViewManager( vm );
4355 LightApp_SelectionMgr* selMgr = selectionMgr();
4356 QList<SUIT_Selector*> selectors;
4357 selMgr->selectors( selectors );
4358 foreach( SUIT_Selector* selector, selectors ) {
4359 if ( selector->owner() == vm->getViewModel() ) {
4364 // IPAL22894: Crash on closing OCC view
4370 Renames active window of desktop
4372 void LightApp_Application::onRenameWindow()
4377 QWidget* w = desktop()->activeWindow();
4382 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4383 if( ok && !name.isEmpty() )
4384 w->setWindowTitle( name );
4388 Closes active window of desktop
4390 void LightApp_Application::onCloseWindow()
4395 QWidget* w = desktop()->activeWindow();
4403 Closes all windows of desktop
4405 void LightApp_Application::onCloseAllWindow()
4407 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4411 QList<SUIT_ViewWindow*> wndList = desk->windows();
4412 SUIT_ViewWindow* wnd;
4413 foreach( wnd, wndList )
4421 Groups all windows of desktop
4423 void LightApp_Application::onGroupAllWindow()
4425 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4429 QtxWorkstack* wgStack = desk->workstack();
4435 \return if the library of module exists
4436 \param moduleTitle - title of module
4438 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4440 if( moduleTitle.isEmpty() )
4443 QString lib = moduleLibrary( moduleTitle );
4445 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4446 bool isPythonModule = lib.contains("SalomePyQtGUI");
4447 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4451 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4453 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4456 bool isLibFound = false;
4457 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4458 for( ; anIt!=aLast; anIt++ )
4460 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4471 INFOS( "\n****************************************************************" << std::endl
4472 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4473 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4474 << "****************************************************************" << std::endl );
4476 else if ( !isPythonModule && !isPythonLightModule)
4479 if ( isPythonModule || isPythonLightModule)
4481 QString pylib = moduleName( moduleTitle ) + QString(".py");
4482 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4484 // Check the python library
4486 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4488 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4490 bool isPyLib = false, isPyGuiLib = false;
4491 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4492 for( ; anIt!=aLast; anIt++ )
4494 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4495 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4497 if(!isPythonLightModule)
4498 if( !isPyLib && inf.exists() )
4501 if( !isPyGuiLib && infgui.exists() )
4504 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4508 printf( "\n****************************************************************\n" );
4509 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4511 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4513 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4514 printf( "****************************************************************\n" );
4521 \return default name for an active study
4523 void LightApp_Application::setDefaultStudyName( const QString& theName )
4525 QStringList anInfoList;
4526 modules( anInfoList, false );
4528 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4529 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4530 !aStudy->isSaved() )
4532 aStudy->setStudyName( theName );
4533 updateDesktopTitle();
4538 Custom event handler
4540 bool LightApp_Application::event( QEvent* e )
4542 if( e && e->type()==2000 )
4544 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4545 QString* d = ( QString* )ce->data();
4546 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4548 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4549 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4550 showPreferences( tr( "PREF_APP" ) );
4555 return CAM_Application::event( e );
4558 /*! Check data object */
4559 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4563 bool isSuitable = !theObj->entry().isEmpty() &&
4564 !theObj->componentDataType().isEmpty() &&
4565 !theObj->name().isEmpty();
4572 int LightApp_Application::openChoice( const QString& aName )
4574 int choice = CAM_Application::openChoice( aName );
4576 if ( choice == OpenExist ) // The document is already open.
4578 // Do you want to reload it?
4579 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4580 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4581 choice = OpenReload;
4587 bool LightApp_Application::openAction( const int choice, const QString& aName )
4594 STD_Application* app = 0;
4595 SUIT_Session* session = SUIT_Session::session();
4596 QList<SUIT_Application*> appList = session->applications();
4597 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4599 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4600 app = ::qobject_cast<STD_Application*>( *it );
4605 app->onCloseDoc( false );
4606 appList = session->applications();
4607 STD_Application* other = 0;
4608 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4609 other = ::qobject_cast<STD_Application*>( *it );
4612 res = other->onOpenDoc( aName );
4617 res = CAM_Application::openAction( choice, aName );
4624 QStringList LightApp_Application::viewManagersTypes() const
4626 QStringList aTypesList;
4627 aTypesList += myUserWmTypes;
4628 #ifndef DISABLE_GLVIEWER
4629 aTypesList<<GLViewer_Viewer::Type();
4631 #ifndef DISABLE_PLOT2DVIEWER
4632 aTypesList<<Plot2d_Viewer::Type();
4634 #ifndef DISABLE_QXGRAPHVIEWER
4635 aTypesList<<QxScene_Viewer::Type();
4637 #ifndef DISABLE_PVVIEWER
4638 aTypesList<<PVViewer_Viewer::Type();
4640 #ifndef DISABLE_PYVIEWER
4641 aTypesList<<PyViewer_Viewer::Type();
4643 #ifndef DISABLE_OCCVIEWER
4644 aTypesList<<OCCViewer_Viewer::Type();
4646 #ifndef DISABLE_VTKVIEWER
4647 #ifndef DISABLE_SALOMEOBJECT
4648 aTypesList<<SVTK_Viewer::Type();
4650 aTypesList<<VTKViewer_Viewer::Type();
4656 * Removes all view managers of known types
4657 * Other view managers are ignored
4659 void LightApp_Application::clearKnownViewManagers()
4661 QStringList aTypesList = viewManagersTypes();
4662 QList<SUIT_ViewManager*> aMgrList;
4663 viewManagers( aMgrList );
4664 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4665 if (aTypesList.contains(aMgr->getType()))
4666 removeViewManager(aMgr);
4671 Copy of current selection
4673 void LightApp_Application::onCopy()
4675 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4681 Paste of current data in clipboard
4683 void LightApp_Application::onPaste()
4685 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4691 Browse (i.e. set focus on) the published objects
4692 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4693 has been accepted by Ok (or Apply & Close) button
4694 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4695 (to select the first published object only)
4696 \return entry of the selected object
4698 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4699 const bool theIsApplyAndClose,
4700 const bool theIsOptimizedBrowsing )
4703 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4705 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4706 switch( aBrowsePolicy )
4710 case BP_ApplyAndClose:
4711 if( !theIsApplyAndClose )
4719 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4723 SUIT_DataBrowser* anOB = objectBrowser();
4727 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4731 QStringListIterator anIter( theEntryList );
4732 if( theIsOptimizedBrowsing )
4734 // go to the last entry
4736 if( anIter.hasPrevious() )
4740 // scroll to each entry in the list
4741 // (in optimized mode - to the last entry only)
4743 LightApp_DataObject* anObject = 0;
4744 while( anIter.hasNext() )
4746 anEntry = anIter.next();
4747 if( !anEntry.isEmpty() )
4749 anObject = aStudy->findObjectByEntry( anEntry );
4752 QModelIndex anIndex = aModel->index( anObject );
4753 anOB->treeView()->scrollTo( anIndex );
4758 // always select the last object
4759 if( anObject && !anEntry.isEmpty() )
4761 QList<SUIT_Selector*> aSelectorList;
4762 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4763 if( !aSelectorList.isEmpty() )
4765 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4767 bool anIsAutoBlock = aSelector->autoBlock();
4769 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4770 aSelector->setAutoBlock( false );
4772 SUIT_DataOwnerPtrList aList;
4773 #ifndef DISABLE_SALOMEOBJECT
4774 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4775 ( anObject->entry().toLatin1().constData(),
4776 anObject->componentDataType().toLatin1().constData(),
4777 anObject->name().toLatin1().constData() );
4778 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4780 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4783 aList.append( owner );
4784 selectionMgr()->setSelected( aList );
4787 // restore auto block flag
4788 aSelector->setAutoBlock( anIsAutoBlock );
4796 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4798 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4799 return study ? study->findObjectByEntry( id ) : 0;
4803 Checks that an object can be renamed.
4804 \param entry entry of the object
4805 \brief Return \c true if object can be renamed
4807 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4812 Rename object by entry.
4813 \param entry entry of the object
4814 \param name new name of the object
4815 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4817 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4821 /*! Process standard messages from desktop */
4822 void LightApp_Application::onDesktopMessage( const QString& message )
4824 const QString sectionSeparator = "/";
4826 if ( message.toLower() == "updateobjectbrowser" ||
4827 message.toLower() == "updateobjbrowser" ) {
4828 // update object browser
4829 updateObjectBrowser();
4831 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4832 QString vtype = message.split( sectionSeparator ).last();
4833 if ( !vtype.isEmpty() )
4834 getViewManager( vtype, true );
4837 QStringList data = message.split( sectionSeparator );
4838 if ( data.count() > 1 ) {
4839 QString msgType = data[0].trimmed();
4840 LightApp_Module* sMod = 0;
4841 CAM_Module* mod = module( msgType );
4843 mod = module( moduleTitle( msgType ) );
4844 if ( mod && mod->inherits( "LightApp_Module" ) )
4845 sMod = (LightApp_Module*)mod;
4847 if ( msgType.toLower() == "preferences" ) {
4848 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4849 // for example "preferences/Study/multi_file_dump/true"
4850 if ( data.count() > 3 ) {
4851 QString section = data[1].trimmed();
4852 QString param = data[2].trimmed();
4853 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4854 resourceMgr()->setValue( section, param, value );
4858 // received message for the module
4859 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4860 sMod->message( msg );
4868 Returns all top level toolbars.
4869 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4871 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4873 QList<QToolBar*> aResult;
4874 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4875 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4876 QToolBar* tb = *tit;
4877 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4878 if ( po != desktop() )
4880 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4887 Internal method to parse toolbars and dockable windows state.
4889 QByteArray LightApp_Application::processState(QByteArray& input,
4890 const bool processWin,
4891 const bool processTb,
4892 const bool isRestoring,
4893 QByteArray defaultState) {
4896 bool hasDefaultState = !defaultState.isEmpty();
4897 bool isDockWinWriten = false;
4899 //Write date from users settings
4901 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4902 int marker, version;
4904 tmpInputData >> marker;
4905 tmpInputData >> version;
4906 tmpInputData >> dockmarker;
4907 tmpInputData >> nbDocWin;
4909 if(processWin && processTb && !isRestoring) {
4911 } else if(!processWin && !processTb ) {
4913 aRes = defaultState;
4915 QDataStream aData(&aRes, QIODevice::WriteOnly);
4916 QList<QToolBar*> aToolBars = findToolBars();
4919 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4920 QToolBar* tb = *tit;
4921 aNames.append(tb->objectName());
4924 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4925 if(toolBarMarkerIndex < 0)
4927 QDataStream anInputData(&input, QIODevice::ReadOnly);
4929 int toolBarMarkerIndexDef;
4930 if(hasDefaultState) {
4931 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4932 if(toolBarMarkerIndexDef < 0)
4935 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4937 QDataStream* aTargetData = 0;
4938 int aTargetIndex = -1;
4940 QByteArray currentArr = desktop()->saveState();
4941 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4942 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4943 if(processWin && useInputData) {
4944 aTargetData = &anInputData;
4945 aTargetIndex = toolBarMarkerIndex;
4947 //Write date from default settings
4948 if(hasDefaultState) {
4949 aTargetData = &anInputDataDef;
4950 aTargetIndex = toolBarMarkerIndexDef;
4952 //If no default state, write current snapshot of the dockable windows
4954 aTargetData = &anInputDataCur;
4955 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4956 aTargetIndex = toolBarMarkerIndexCur;
4961 if(aTargetData && aTargetIndex >= 0 ) {
4962 aTargetData->device()->seek(0);
4963 while( aTargetData->device()->pos() < aTargetIndex ) {
4968 isDockWinWriten = true;
4975 aTargetData = &anInputData;
4976 aTargetIndex = toolBarMarkerIndex;
4978 if(hasDefaultState) {
4979 aTargetData = &anInputDataDef;
4980 aTargetIndex = toolBarMarkerIndexDef;
4984 if(aTargetData && aTargetIndex >= 0) {
4986 if(!isDockWinWriten ) {
4987 //Write version marker
4988 int marker, version;
4989 aTargetData->device()->seek(0);
4990 *aTargetData >> marker;
4991 *aTargetData >> version;
4994 aData << (uchar) QDockWidgetMarker;
4996 int shift = 4*sizeof(int) + sizeof(QSize);
4997 index = aTargetIndex - shift;
4999 index = aTargetIndex;
5002 aTargetData->device()->seek(index);
5003 while(!aTargetData->atEnd()) {
5008 } else { // Not treat toolbars
5009 aData << (uchar) QToolBarMarker;
5010 aData << (int) 0; //Nb toolbars = 0
5017 \brief Emits operationFinished signal.
5018 \param theModuleName the name of the module which perfomed the operation
5019 \param theOperationName the operation name
5020 \param theEntryList the list of the created objects entries
5022 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5023 const QString& theOperationName,
5024 const QStringList& theEntryList )
5026 emit operationFinished( theModuleName, theOperationName, theEntryList );
5030 Update visibility state of given objects
5032 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5033 SUIT_ViewModel* theViewModel )
5035 if ( !theViewModel || theList.isEmpty() ) return;
5037 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5038 if ( !aStudy ) return;
5040 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5042 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5043 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5045 if ( !obj || aStudy->isComponent( obj->entry() ) )
5048 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5049 if ( anObjModule ) {
5050 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5052 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5053 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5054 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5055 anObjState = Qtx::ShownState;
5057 anObjState = Qtx::HiddenState;
5059 aStudy->setVisibilityState( obj->entry(), anObjState );
5066 * Called when window activated
5068 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5070 SUIT_DataBrowser* anOB = objectBrowser();
5073 SUIT_DataObject* rootObj = anOB->root();
5077 DataObjectList listObj = rootObj->children( true );
5079 SUIT_ViewModel* vmod = 0;
5080 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5081 vmod = vman->getViewModel();
5082 updateVisibilityState( listObj, vmod );
5086 Called then view manager removed
5088 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5090 ViewManagerList lst;
5091 viewManagers( lst );
5092 if ( lst.count() == 1) { // in case if closed last view window
5093 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5095 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5100 Check existing document.
5102 bool LightApp_Application::checkExistingDoc()
5105 if( activeStudy() ) {
5106 int answer = SUIT_MessageBox::question( desktop(),
5107 tr( "APPCLOSE_CAPTION" ),
5108 tr( "STUDYCLOSE_DESCRIPTION" ),
5109 tr( "APPCLOSE_SAVE" ),
5110 tr( "APPCLOSE_CLOSE" ),
5111 tr( "APPCLOSE_CANCEL" ), 0 );
5113 if ( activeStudy()->isSaved() ) {
5116 } else if ( onSaveAsDoc() ) {
5117 if( !closeDoc( false ) ) {
5124 else if( answer == 1 ) {
5126 } else if( answer == 2 ) {
5133 #ifndef DISABLE_PYCONSOLE
5135 PyConsole_Interp* LightApp_Application::getPyInterp()
5137 static PyConsole_Interp* myInterp = 0;
5139 myInterp = createPyInterp();
5143 PyConsole_Interp* LightApp_Application::createPyInterp()
5145 return new LightApp_PyInterp();
5148 #endif // DISABLE_PYCONSOLE