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 #include <Style_Salome.h>
66 #include <Style_PrefDlg.h>
68 #include <CAM_Module.h>
69 #include <CAM_DataModel.h>
70 #include <CAM_Study.h>
71 #include <STD_TabDesktop.h>
73 #include <SUIT_DataBrowser.h>
74 #include <SUIT_Session.h>
75 #include <SUIT_Study.h>
76 #include <SUIT_FileDlg.h>
77 #include <SUIT_ResourceMgr.h>
78 #include <SUIT_ShortcutMgr.h>
79 #include <SUIT_Tools.h>
80 #include <SUIT_Accel.h>
81 #include <SUIT_MessageBox.h>
82 #include <SUIT_ViewWindow.h>
85 #include <QtxToolBar.h>
86 #include <QtxTreeView.h>
87 #include <QtxMRUAction.h>
88 #include <QtxDockAction.h>
89 #include <QtxDockWidget.h>
90 #include <QtxActionToolMgr.h>
91 #include <QtxSearchTool.h>
92 #include <QtxWorkstack.h>
95 #include <LogWindow.h>
97 #ifndef DISABLE_GLVIEWER
98 #include <GLViewer_Viewer.h>
99 #include <GLViewer_ViewManager.h>
100 #include "LightApp_GLSelector.h"
103 #ifndef DISABLE_PLOT2DVIEWER
104 #include <Plot2d_ViewManager.h>
105 #include <Plot2d_ViewModel.h>
106 #include <Plot2d_ViewWindow.h>
107 #include <Plot2d_ViewFrame.h>
108 #include "LightApp_Plot2dSelector.h"
109 #ifndef DISABLE_SALOMEOBJECT
110 #include <SPlot2d_ViewModel.h>
112 #include <Plot2d_ViewModel.h>
116 #ifndef DISABLE_OCCVIEWER
117 #include <OCCViewer_ViewManager.h>
118 #include <OCCViewer_ViewFrame.h>
119 #ifndef DISABLE_SALOMEOBJECT
120 #include <SOCC_ViewModel.h>
122 #include <OCCViewer_ViewModel.h>
124 #include "LightApp_OCCSelector.h"
127 #ifndef DISABLE_VTKVIEWER
128 #ifndef DISABLE_SALOMEOBJECT
129 #include <SVTK_ViewModel.h>
130 #include <SVTK_ViewManager.h>
131 #include "LightApp_VTKSelector.h"
133 #include <VTKViewer_ViewModel.h>
134 #include <VTKViewer_ViewManager.h>
136 #include <VTKViewer_ViewModel.h>
139 #ifndef DISABLE_QXGRAPHVIEWER
140 #include <QxScene_ViewManager.h>
141 #include <QxScene_ViewModel.h>
142 #include <QxScene_ViewWindow.h>
145 #ifndef DISABLE_GRAPHICSVIEW
146 #include "GraphicsView_Viewer.h"
147 #include "GraphicsView_ViewManager.h"
148 #include "LightApp_GVSelector.h"
151 #ifndef DISABLE_PVVIEWER
152 #include "PVViewer_ViewManager.h"
153 #include "PVViewer_ViewWindow.h"
154 #include "PVViewer_ViewModel.h"
157 #ifndef DISABLE_PYVIEWER
158 #include <PyViewer_ViewManager.h>
159 #include <PyViewer_ViewModel.h>
160 #include <PyViewer_ViewWindow.h>
164 #define VISIBILITY_COLUMN_WIDTH 25
170 #include <QStringList>
172 #include <QApplication>
174 #include <QStatusBar>
176 #include <QObjectList>
178 #include <QInputDialog>
179 #include <QFontDatabase>
181 #include <QByteArray>
185 #include <QHeaderView>
190 #include <utilities.h>
192 #define FIRST_HELP_ID 1000000
194 #ifndef DISABLE_SALOMEOBJECT
195 #include <SALOME_InteractiveObject.hxx>
196 #include <SALOME_ListIO.hxx>
199 #include <Standard_Version.hxx>
201 #define ToolBarMarker 0
202 #define DockWidgetMarker 1
204 static const char* imageEmptyIcon[] = {
207 "....................",
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "...................."};
228 int LightApp_Application::lastStudyId = 0;
230 // Markers used to parse array with dockable windows and toolbars state.
231 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
232 // in the Qt source code.
234 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
235 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
237 // Format of the Byte array with the windows and toolbar state is:
238 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
240 //Find toolbar marker position in the array in the following way:
241 //since the 'toolbar marker' is not unique, find index of first occurrence of the
242 //'toolbar marker' in the array and check that next string is name of the toolbar
244 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
245 int aResult = -1,tmp = 0;
246 int inputLen = input.length();
247 QDataStream anInputData(&input, QIODevice::ReadOnly);
248 while(tmp < inputLen) {
249 tmp = input.indexOf(QToolBarMarker, tmp + 1);
252 anInputData.device()->seek(tmp);
256 anInputData >> lines;
258 if(lines == 0 && anInputData.atEnd()){
259 //Case then array doesn't contain information about toolbars,
270 if(aFlags.contains(str)) {
279 \return last global id of study
281 int LightApp_Application::studyId()
283 return LightApp_Application::lastStudyId;
286 /*!Create new instance of LightApp_Application.*/
287 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
289 return new LightApp_Application();
292 /*! \var global preferences of LightApp */
293 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
297 \class LightApp_Application
298 Application containing LightApp module
302 LightApp_Application::LightApp_Application()
303 : CAM_Application( false ),
305 myScreenHelper(new LightApp_FullScreenHelper())
307 Q_INIT_RESOURCE( LightApp );
309 STD_TabDesktop* desk = new STD_TabDesktop();
310 desk->setFullScreenAllowed(false);
311 desk->setMinimizeAllowed(false);
315 // initialize auto save timer
316 myAutoSaveTimer = new QTimer( this );
317 myAutoSaveTimer->setSingleShot( true );
318 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
320 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
321 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
323 desktop()->setWindowIcon( aLogo );
324 desktop()->setDockableMenuBar( false );
325 desktop()->setDockableStatusBar( false );
327 // base logo (salome itself)
328 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
329 // extra logo (salome-based application)
330 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
334 mySelMgr = new LightApp_SelectionMgr( this );
336 myAccel = SUIT_Accel::getAccel();
338 #ifndef DISABLE_OCCVIEWER
339 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
340 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
341 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
342 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
343 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
352 #ifndef DISABLE_VTKVIEWER
353 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
354 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
355 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
356 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
366 #ifndef DISABLE_PLOT2DVIEWER
367 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
377 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
378 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
379 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
380 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
381 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
384 // Set existing font for the python console in resources
385 if( !aResMgr->hasValue( "PyConsole", "font" ) )
388 QFont f = aResMgr->fontValue( "PyConsole", "font" );
390 QStringList famdb = fdb.families();
392 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
395 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
397 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
400 if ( famdb.contains(aFamily) )
402 f.setFamily( aFamily );
403 aResMgr->setValue( "PyConsole", "font", f );
410 *\li Save window geometry.
411 *\li Save desktop geometry.
412 *\li Save resource maneger.
413 *\li Delete selection manager.
415 LightApp_Application::~LightApp_Application()
418 delete myScreenHelper;
421 /*!Start application.*/
422 void LightApp_Application::start()
424 CAM_Application::start();
427 updateViewManagers();
428 updateCommandsStatus();
431 desktop()->statusBar()->showMessage( "" );
433 LightApp_EventFilter::Init();
436 /*!Closeapplication.*/
437 void LightApp_Application::closeApplication()
439 QProcess::startDetached( "HelpBrowser",
440 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
442 CAM_Application::closeApplication();
445 /*!Gets application name.*/
446 QString LightApp_Application::applicationName() const
448 static QString _app_name;
449 if ( _app_name.isEmpty() )
450 _app_name = tr( "APP_NAME" );
454 /*!Gets application version.*/
455 QString LightApp_Application::applicationVersion() const
457 static QString _app_version;
459 if ( _app_version.isEmpty() )
461 QString resVersion = tr( "APP_VERSION" );
462 if ( resVersion != "APP_VERSION" )
464 _app_version = resVersion;
468 _app_version = GUI_VERSION_STR;
474 /*!Load module by \a name.*/
475 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
477 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
480 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
481 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
482 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
487 /*!Activate module by \a modName*/
488 bool LightApp_Application::activateModule( const QString& modName )
491 CAM_Module* prevMod = activeModule();
494 actName = prevMod->moduleName();
496 if ( actName == modName )
499 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
501 saveDockWindowsState();
503 bool status = CAM_Application::activateModule( modName );
505 updateModuleActions();
513 updateViewManagers();
515 if ( activeStudy() && activeStudy()->root() && objectBrowser() && objectBrowser()->root() != activeStudy()->root() ) {
516 objectBrowser()->setRoot( activeStudy()->root() );
517 updateObjectBrowser( true );
522 /*!Gets selection manager.*/
523 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
528 /*!Creat action "New window" for certain type of viewer:*/
529 void LightApp_Application::createActionForViewer( const int id,
531 const QString& suffix,
534 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
535 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
536 QAction* a = createAction( id, // menu action id
543 false, // toggle flag
545 SLOT( onNewWindow() ) ); // slot
546 createMenu( a, parentId, -1 );
551 void LightApp_Application::createActions()
553 CAM_Application::createActions();
555 SUIT_Desktop* desk = desktop();
556 SUIT_ResourceMgr* resMgr = resourceMgr();
559 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
560 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
561 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
565 // - Help for modules
567 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
568 createMenu( separator(), helpMenu, -1, 10 );
569 QStringList aModuleList;
570 modules( aModuleList, false );
571 aModuleList.prepend( "GUI" );
572 aModuleList.prepend( "KERNEL" );
574 int id = LightApp_Application::UserID + FIRST_HELP_ID;
577 foreach( aModule, aModuleList ) {
578 if ( aModule.isEmpty() ) // module title (user name)
580 IMap <QString, QString> helpData; // list of help files for the module
581 QString helpSubMenu; // help submenu name (empty if not needed)
582 QString modName = moduleName( aModule ); // module name
583 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
584 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
585 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
587 if (resMgr->hasValue( modName, "documentation" ) )
588 docSection = resMgr->stringValue(modName, "documentation");
589 else if ( resMgr->hasSection( modName + "_documentation" ) )
590 docSection = modName + "_documentation";
591 if ( !docSection.isEmpty() ) {
592 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
593 QStringList listOfParam = resMgr->parameters( docSection );
594 foreach( QString paramName, listOfParam ) {
595 QString valueStr = resMgr->stringValue( docSection, paramName );
596 if ( !valueStr.isEmpty() ) {
597 QFileInfo fi( valueStr );
598 if ( fi.isRelative() && !modDir.isEmpty() )
599 valueStr = Qtx::addSlash( modDir ) + valueStr;
600 if ( QFile::exists( valueStr ) )
601 helpData.insert( paramName.arg( aModule ), valueStr );
606 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
607 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
608 QString indexFile = idxLst.join( QDir::separator() ); // index file
609 if ( QFile::exists( indexFile ) )
610 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
613 IMapConstIterator<QString, QString > fileIt;
614 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
615 QString helpFileName = fileIt.key();
616 // remove all '//' occurances
617 while ( helpFileName.contains( "//" ) )
618 helpFileName.replace( "//", "" );
619 // obtain submenus hierarchy if given
620 QStringList smenus = helpFileName.split( "/" );
621 helpFileName = smenus.last();
623 QAction* a = createAction( id, helpFileName,
624 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
625 helpFileName, helpFileName,
626 0, desk, false, this, SLOT( onHelpContentsModule() ) );
627 a->setData( fileIt.value() );
628 if ( !helpSubMenu.isEmpty() ) {
629 smenus.prepend( helpSubMenu );
631 // create sub-menus hierarchy
632 int menuId = helpMenu;
633 foreach ( QString subMenu, smenus ) {
634 menuId = createMenu( subMenu, menuId, -1, 0 );
636 createMenu( a, menuId, -1, 0 );
641 // - Additional help items
643 createMenu( separator(), helpMenu, -1, 5 );
645 QStringList addHelpItems = resMgr->parameters( "add_help" );
646 foreach ( QString addHelpItem, addHelpItems ) {
647 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
648 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
649 QAction* a = createAction( id, addHelpItem,
650 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
651 addHelpItem, addHelpItem,
652 0, desk, false, this, SLOT( onHelpContentsModule() ) );
653 a->setData( valueStr );
654 createMenu( a, helpMenu, -1, 5 );
660 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
661 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
662 registerAction( MRUId, mru );
664 // default icon for neutral point ('SALOME' module)
665 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
666 if ( defIcon.isNull() )
667 defIcon = QPixmap( imageEmptyIcon );
669 //! default icon for any module
670 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
671 if ( modIcon.isNull() )
672 modIcon = QPixmap( imageEmptyIcon );
675 modules( modList, false );
677 if ( modList.count() > 1 )
679 LightApp_ModuleAction* moduleAction =
680 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
682 QMap<QString, QString> iconMap;
683 moduleIconNames( iconMap );
685 const int iconSize = 20;
687 QStringList::Iterator it;
688 for ( it = modList.begin(); it != modList.end(); ++it )
690 if ( !isLibExists( *it ) )
693 QString modName = moduleName( *it );
695 if ( !isModuleAccessible( *it ) )
699 if ( iconMap.contains( *it ) )
700 iconName = iconMap[*it];
702 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
706 INFOS ( "\n****************************************************************" << std::endl
707 << "* Icon for " << (*it).toLatin1().constData()
708 << " not found. Using the default one." << std::endl
709 << "****************************************************************" << std::endl );
712 icon = Qtx::scaleIcon( icon, iconSize );
714 moduleAction->insertModule( *it, icon );
717 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
718 this, SLOT( onModuleActivation( const QString& ) ) );
719 registerAction( ModulesListId, moduleAction );
723 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
724 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
726 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
727 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
728 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
729 0, desk, false, this, SLOT( onCloseAllWindow() ) );
730 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
731 0, desk, false, this, SLOT( onGroupAllWindow() ) );
733 createMenu( CloseId, windowMenu, 0, -1 );
734 createMenu( CloseAllId, windowMenu, 0, -1 );
735 createMenu( GroupAllId, windowMenu, 0, -1 );
736 createMenu( separator(), windowMenu, -1, 0 );
738 #ifndef DISABLE_GLVIEWER
739 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
741 #ifndef DISABLE_PLOT2DVIEWER
742 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
744 #ifndef DISABLE_OCCVIEWER
745 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
747 #ifndef DISABLE_VTKVIEWER
748 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
750 #ifndef DISABLE_QXGRAPHVIEWER
751 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
753 #ifndef DISABLE_GRAPHICSVIEW
754 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
756 #ifndef DISABLE_PVVIEWER
757 QStringList aModuleNames;
758 modules( aModuleNames, false );
759 if ( aModuleNames.contains( "ParaViS", Qt::CaseInsensitive ) )
760 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
762 #ifndef DISABLE_PYVIEWER
763 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
766 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
767 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
768 createMenu( RenameId, windowMenu, -1 );
770 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
771 createMenu( PreferencesId, fileMenu, 50, -1 );
772 createMenu( separator(), fileMenu, -1, 50, -1 );
774 createMenu( separator(), fileMenu, -1, 100, -1 );
775 createMenu( MRUId, fileMenu, 100, -1 );
776 createMenu( separator(), fileMenu, -1, 100, -1 );
778 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
779 0, desk, false, this, SLOT( onStylePreferences() ) );
781 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
782 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
785 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
786 createMenu( separator(), viewMenu, -1, 20, -1 );
787 createMenu( StyleId, viewMenu, 20, -1 );
788 createMenu( FullScreenId, viewMenu, 20, -1 );
790 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
791 QString( "SalomeModules" ) ); // name (language-independant)
792 createTool( ModulesListId, modTBar );
795 /*!On module activation action.*/
796 void LightApp_Application::onModuleActivation( const QString& modName )
798 // Force user to create/open a study before module activation
799 QMap<QString, QString> iconMap;
800 moduleIconNames( iconMap );
801 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
803 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
805 bool cancelled = false;
807 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
808 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
809 QMap<int, QString> opmap = activateModuleActions();
810 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
811 aDlg.addButton( it.value(), it.key() );
813 int res = aDlg.exec();
815 // some operation is selected
816 moduleActionSelected( res );
820 putInfo( tr("INF_CANCELLED") );
822 LightApp_ModuleAction* moduleAction =
823 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
825 moduleAction->setActiveModule( QString() );
831 activateModule( modName );
834 /*!Default module activation.*/
835 QString LightApp_Application::defaultModule() const
837 QStringList aModuleNames;
838 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
839 //! If there's the one and only module --> activate it automatically
840 //! TODO: Possible improvement - default module can be taken from preferences
841 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
844 /*!On new window slot.*/
845 void LightApp_Application::onNewWindow()
847 const QObject* obj = sender();
848 if ( !obj || !obj->inherits( "QAction" ) )
852 int id = actionId( (QAction*)obj );
855 #ifndef DISABLE_GLVIEWER
857 type = GLViewer_Viewer::Type();
860 #ifndef DISABLE_PLOT2DVIEWER
862 type = Plot2d_Viewer::Type();
865 #ifndef DISABLE_OCCVIEWER
867 type = OCCViewer_Viewer::Type();
870 #ifndef DISABLE_VTKVIEWER
872 type = VTKViewer_Viewer::Type();
875 #ifndef DISABLE_QXGRAPHVIEWER
876 case NewQxSceneViewId:
877 type = QxScene_Viewer::Type();
880 #ifndef DISABLE_GRAPHICSVIEW
881 case NewGraphicsViewId:
882 type = GraphicsView_Viewer::Type();
885 #ifndef DISABLE_PVVIEWER
887 type = PVViewer_Viewer::Type();
890 #ifndef DISABLE_PYVIEWER
892 type = PyViewer_Viewer::Type();
897 if ( !type.isEmpty() )
898 createViewManager( type );
902 SLOT: Creates new document
904 void LightApp_Application::onNewDoc()
906 #ifdef SINGLE_DESKTOP
907 if ( !checkExistingDoc() )
911 //asl: fix for 0020515
912 saveDockWindowsState();
914 CAM_Application::onNewDoc();
918 SLOT: Opens new document
920 void LightApp_Application::onOpenDoc()
922 SUIT_Study* study = activeStudy();
924 #ifdef SINGLE_DESKTOP
925 if ( !checkExistingDoc() )
929 CAM_Application::onOpenDoc();
931 if ( !study ) // new study will be create in THIS application
934 updateViewManagers();
939 SLOT: Opens new document.
940 \param aName - name of file
942 bool LightApp_Application::onOpenDoc( const QString& aName )
944 #ifdef SINGLE_DESKTOP
945 if ( !checkExistingDoc() )
949 saveDockWindowsState();
951 // We should take mru action first because this application instance can be deleted later.
952 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
954 bool res = CAM_Application::onOpenDoc( aName );
959 mru->insert( aName );
961 mru->remove( aName );
967 SLOT: Displays "About" message box
969 void LightApp_Application::onHelpAbout()
971 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
976 Private SLOT: Called on selection is changed
977 Dispatchs active module that selection is changed
979 void LightApp_Application::onSelection()
981 onSelectionChanged();
983 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
984 ((LightApp_Module*)activeModule())->selectionChanged();
989 \param study - SUIT_Study.
991 void LightApp_Application::setActiveStudy( SUIT_Study* study )
993 CAM_Application::setActiveStudy( study );
997 Enables/Disables menu items and toolbar buttons. Rebuild menu
999 void LightApp_Application::updateCommandsStatus()
1001 CAM_Application::updateCommandsStatus();
1004 #ifndef DISABLE_GLVIEWER
1005 a = action( NewGLViewId );
1007 a->setEnabled( activeStudy() );
1010 #ifndef DISABLE_PLOT2DVIEWER
1011 a = action( NewPlot2dId );
1013 a->setEnabled( activeStudy() );
1016 #ifndef DISABLE_OCCVIEWER
1017 a = action( NewOCCViewId );
1019 a->setEnabled( activeStudy() );
1022 #ifndef DISABLE_VTKVIEWER
1023 a = action( NewVTKViewId );
1025 a->setEnabled( activeStudy() );
1028 #ifndef DISABLE_QXGRAPHVIEWER
1029 a = action( NewQxSceneViewId );
1031 a->setEnabled( activeStudy() );
1034 #ifndef DISABLE_GRAPHICSVIEW
1035 a = action( NewGraphicsViewId );
1037 a->setEnabled( activeStudy() );
1040 #ifndef DISABLE_PVVIEWER
1041 a = action( NewPVViewId );
1043 a->setEnabled( activeStudy() );
1046 #ifndef DISABLE_PYVIEWER
1047 a = action( NewPyViewerId );
1049 a->setEnabled( activeStudy() );
1055 Runs system command in separate thread
1057 class RunBrowser: public QThread
1060 RunBrowser( LightApp_Application* app,
1061 const QString& theApp,
1062 const QString& theParams,
1063 const QString& theHelpFile,
1064 const QString& theContext = QString() )
1066 myParams( theParams ),
1067 myContext( theContext ),
1071 //For the external browser always specify 'file://' protocol,
1072 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1073 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1078 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1079 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1081 QProcess* proc = new QProcess();
1083 proc->start( aCommand );
1084 if ( !proc->waitForStarted() ) {
1085 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1086 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1087 ce2000->setData( msg );
1088 QApplication::postEvent( myLApp, ce2000 );
1099 LightApp_Application* myLApp;
1103 SLOT: Displays help contents for choosen module
1105 void LightApp_Application::onHelpContentsModule()
1107 const QAction* a = (QAction*) sender();
1108 QString helpFile = a->data().toString();
1109 if ( helpFile.isEmpty() ) return;
1111 SUIT_ResourceMgr* resMgr = resourceMgr();
1114 platform = "winapplication";
1116 platform = "application";
1118 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1120 QString quote("\"");
1121 anApp.prepend( quote );
1122 anApp.append( quote );
1124 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1125 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1127 if( useExtBrowser ) {
1128 if ( !anApp.isEmpty() ) {
1129 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1133 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1134 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1135 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1137 showPreferences( tr( "PREF_APP" ) );
1141 QStringList parameters;
1142 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1143 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1144 parameters << helpFile;
1145 QProcess::startDetached( "HelpBrowser", parameters );
1150 SLOT: Displays help contents for choosen dialog
1152 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1153 const QString& theFileName,
1154 const QString& theContext )
1156 QString fileName = theFileName;
1157 QString context = theContext;
1158 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1159 // context might be passed within theFileName argument
1160 QStringList comps = fileName.split("#");
1161 if ( comps.count() > 1 ) {
1162 context = comps.last();
1164 fileName = comps.join("#");
1168 QString homeDir = "";
1169 if ( !theComponentName.isEmpty() ) {
1170 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1171 if ( !dir.isEmpty() )
1172 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1173 Qtx::addSlash( "share" ) +
1174 Qtx::addSlash( "doc" ) +
1175 Qtx::addSlash( "salome" ) +
1176 Qtx::addSlash( "gui" ) +
1177 Qtx::addSlash( theComponentName ) );
1180 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1181 SUIT_ResourceMgr* resMgr = resourceMgr();
1184 platform = "winapplication";
1186 platform = "application";
1188 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1190 QString quote("\"");
1191 anApp.prepend( quote );
1192 anApp.append( quote );
1195 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1198 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1200 if ( !anApp.isEmpty() ) {
1201 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1205 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1206 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1207 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1208 showPreferences( tr( "PREF_APP" ) );
1212 QStringList parameters;
1213 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1214 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1215 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1216 QProcess::startDetached( "HelpBrowser", parameters );
1221 Sets enable or disable some actions on selection changed.
1223 void LightApp_Application::onSelectionChanged()
1225 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1226 bool canCopy = m ? m->canCopy() : false;
1227 bool canPaste = m ? m->canPaste() : false;
1229 action( EditCopyId )->setEnabled(canCopy);
1230 action( EditPasteId )->setEnabled(canPaste);
1234 SLOT: Performs some actions when dockable windows are triggered
1236 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1240 QWidget* LightApp_Application::dockWindow( const int id ) const
1243 if ( myWin.contains( id ) )
1248 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1253 QDockWidget* dock = 0;
1254 QWidget* w = wid->parentWidget();
1255 while ( w && !dock )
1257 dock = ::qobject_cast<QDockWidget*>( w );
1258 w = w->parentWidget();
1263 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1268 if ( wid != dockWindow( id ) )
1269 removeDockWindow( id );
1271 myWin.insert( id, wid );
1273 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1274 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1276 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1277 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1278 QString( "%1Dock" ).arg( wid->objectName() ) );
1279 dock->setWidget( wid );
1280 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1281 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1282 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1284 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1285 if ( !accel.isEmpty() )
1286 dock->toggleViewAction()->setShortcut( accel );
1291 void LightApp_Application::removeDockWindow( const int id )
1293 QWidget* wid = dockWindow( id );
1299 QDockWidget* dock = windowDock( wid );
1303 dock->setWidget( 0 );
1304 wid->setParent( 0 );
1305 wid->setVisible( false );
1309 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1311 QDockWidget* dock = windowDock( dockWindow( id ) );
1312 if ( dock && desktop() ) {
1313 desktop()->addDockWidget( place, dock );
1314 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1315 if ( a ) a->update();
1321 \param flag - key for window
1322 \param studyId - study id
1323 Flag used how identificator of window in windows list.
1325 QWidget* LightApp_Application::getWindow( const int flag, const int )
1327 QWidget* wid = dockWindow( flag );
1329 insertDockWindow( flag, wid = createWindow( flag ) );
1331 QMap<int, int> winMap;
1332 currentWindows( winMap );
1333 if ( winMap.contains( flag ) )
1334 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1340 \return Object Browser
1342 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1344 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1350 LogWindow* LightApp_Application::logWindow()
1352 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1355 #ifndef DISABLE_PYCONSOLE
1357 This returns the python console integrated to the GUI. Depending
1358 when you request the python console, this function could return
1359 null. Then the optional parameter force (default to false) can be
1360 set to force the creation of the python console if it is not done
1362 \param force - if true, the pythonConsole is created if it does not exist yet
1363 \return Python Console
1365 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1367 QWidget* wid = dockWindow( WT_PyConsole );
1368 if ( !wid && force==true) {
1369 wid = getWindow(WT_PyConsole);
1371 return qobject_cast<PyConsole_Console*>( wid );
1376 Updates object browser and maybe data models
1377 \param updateModels - if it is true, then data models are updated
1379 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1381 // update existing data models
1384 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1385 if ( objectBrowser() )
1386 objectBrowser()->setAutoUpdate( false );
1388 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1390 CAM_Study::ModelList dm_list;
1391 study->dataModels( dm_list );
1392 QListIterator<CAM_DataModel*> it( dm_list );
1393 while ( it.hasNext() ) {
1394 CAM_DataModel* camDM = it.next();
1395 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1396 ((LightApp_DataModel*)camDM)->update();
1400 if( objectBrowser() )
1401 objectBrowser()->setAutoUpdate( isAutoUpdate );
1404 if ( objectBrowser() ) {
1405 objectBrowser()->updateGeometry();
1406 objectBrowser()->updateTree( 0, false );
1413 LightApp_Preferences* LightApp_Application::preferences() const
1415 return preferences( false );
1419 \return first view manager of some type
1420 \param vmType - type of view manager
1421 \param create - is it necessary to create view manager in case, when there is no manager of such type
1423 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1425 SUIT_ViewManager* aVM = viewManager( vmType );
1426 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1428 if ( anActiveVM && anActiveVM->getType() == vmType )
1431 if ( aVM && create )
1433 if ( !aVM->getActiveView() )
1436 desktop()->setActiveWindow( aVM->getActiveView() );
1439 aVM = createViewManager( vmType );
1445 Creates view manager of some type
1446 \param vmType - type of view manager
1448 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1450 SUIT_ResourceMgr* resMgr = resourceMgr();
1452 SUIT_ViewManager* viewMgr = 0;
1453 #ifndef DISABLE_GLVIEWER
1454 if( vmType == GLViewer_Viewer::Type() )
1456 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1457 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1460 #ifndef DISABLE_PLOT2DVIEWER
1461 if( vmType == Plot2d_Viewer::Type() )
1463 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1465 #ifndef DISABLE_SALOMEOBJECT
1466 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1468 new LightApp_Plot2dSelector( v, mySelMgr );
1470 vm = new Plot2d_Viewer();
1472 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1473 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1476 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1477 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1481 #ifndef DISABLE_QXGRAPHVIEWER
1482 if( vmType == QxScene_Viewer::Type() )
1484 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1485 QxScene_Viewer* vm = new QxScene_Viewer();
1486 viewMgr->setViewModel( vm );
1487 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1490 #ifndef DISABLE_GRAPHICSVIEW
1491 if( vmType == GraphicsView_Viewer::Type() )
1493 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1494 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1497 #ifndef DISABLE_PVVIEWER
1498 if( vmType == PVViewer_Viewer::Type() )
1500 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1501 viewMgr->getActiveView()->setFocus();
1504 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1508 #ifndef DISABLE_PYVIEWER
1509 if( vmType == PyViewer_Viewer::Type() )
1511 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1514 #ifndef DISABLE_OCCVIEWER
1515 if( vmType == OCCViewer_Viewer::Type() )
1517 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1518 OCCViewer_Viewer* vm;
1519 #ifndef DISABLE_SALOMEOBJECT
1520 vm = new SOCC_Viewer();
1522 vm = new OCCViewer_Viewer( true );
1524 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1525 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1526 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1527 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1528 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1529 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1530 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1531 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1533 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1534 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1535 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1536 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1537 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1538 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1539 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1540 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1541 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1542 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1543 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1544 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1547 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1548 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1551 #ifndef DISABLE_VTKVIEWER
1552 #ifndef DISABLE_SALOMEOBJECT
1553 if ( vmType == SVTK_Viewer::Type() )
1555 if ( vmType == VTKViewer_Viewer::Type() )
1558 #ifndef DISABLE_SALOMEOBJECT
1559 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1560 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1563 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1564 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1565 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1566 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1567 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1568 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1569 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1570 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1571 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1572 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1573 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1574 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1575 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1576 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1577 new LightApp_VTKSelector( vm, mySelMgr );
1580 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1581 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1583 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1591 addViewManager( viewMgr );
1592 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1594 if ( viewWin && desktop() ) {
1595 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1596 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1602 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1604 SUIT_ResourceMgr* resMgr = resourceMgr();
1606 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1608 new LightApp_WgViewModel( vmType, w ) );
1609 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1611 addViewManager( vm );
1612 SUIT_ViewWindow* vw = vm->createViewWindow();
1613 if ( vw && desktop() ) {
1614 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1615 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1618 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1619 myUserWmTypes << vmType;
1624 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1626 SUIT_ResourceMgr* resMgr = resourceMgr();
1628 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1632 QString vmType = vm->getType();
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;
1650 SLOT: Removes view manager from application
1652 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1654 removeViewManager( theVM );
1658 Protected SLOT: On study created.
1659 \param theStudy - just created study
1661 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1663 SUIT_DataObject* aRoot = 0;
1664 if ( theStudy && theStudy->root() )
1666 aRoot = theStudy->root();
1667 //aRoot->setName( tr( "DATA_MODELS" ) );
1670 getWindow( WT_ObjectBrowser );
1672 loadDockWindowsState();
1674 if ( objectBrowser() )
1675 objectBrowser()->setRoot( aRoot );
1677 activateModule( defaultModule() );
1679 if ( objectBrowser() )
1680 objectBrowser()->openLevels();
1682 #ifndef DISABLE_PYCONSOLE
1683 if( pythonConsole() )
1684 getPyInterp()->initStudy();
1689 Protected SLOT: On study opened.
1690 \param theStudy - just opened study
1692 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1694 SUIT_DataObject* aRoot = 0;
1695 if ( theStudy && theStudy->root() )
1697 aRoot = theStudy->root();
1701 getWindow( WT_ObjectBrowser );
1703 loadDockWindowsState();
1705 if ( objectBrowser() )
1706 objectBrowser()->setRoot( aRoot );
1708 activateModule( defaultModule() );
1710 if ( objectBrowser() )
1711 objectBrowser()->openLevels();
1713 #ifndef DISABLE_PYCONSOLE
1714 if( pythonConsole() )
1715 getPyInterp()->initStudy();
1721 /*!Protected SLOT. On study saved.*/
1722 void LightApp_Application::onStudySaved( SUIT_Study* s )
1724 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1726 mru->insert( s->studyName() );
1731 /*!Protected SLOT. On study closed.*/
1732 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1735 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1736 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1739 // stop auto-save timer
1740 myAutoSaveTimer->stop();
1742 // Bug 10396: clear selection
1743 mySelMgr->clearSelected();
1745 // Bug 12944: emit signal only after clear selection
1748 activateModule( "" );
1751 /*!Protected SLOT.On desktop activated.*/
1752 void LightApp_Application::onDesktopActivated()
1754 CAM_Application::onDesktopActivated();
1755 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1757 aModule->studyActivated();
1760 void LightApp_Application::studyOpened( SUIT_Study* s )
1762 CAM_Application::studyOpened( s );
1765 updateViewManagers();
1768 void LightApp_Application::studySaved( SUIT_Study* s )
1770 CAM_Application::studyOpened( s );
1771 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1772 if ( aResMgr && activeStudy() ) {
1773 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1774 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1778 void LightApp_Application::studyCreated( SUIT_Study* s )
1780 CAM_Application::studyCreated( s );
1783 updateViewManagers();
1786 /*!Gets file filter.
1787 *\retval QString "(*.bin)"
1789 QString LightApp_Application::getFileFilter() const
1797 Shows file dialog and return user selected file name
1799 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1800 const QString& caption, QWidget* parent )
1804 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1805 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1808 /*! Gets directory*/
1809 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1813 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1816 /*! Get open file names*/
1817 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1818 const QString& caption, QWidget* parent )
1822 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1823 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1826 /*!Private SLOT. Update object browser.*/
1827 void LightApp_Application::onRefresh()
1829 updateObjectBrowser( true );
1832 /*!Private SLOT. Update actions after rename object.*/
1833 void LightApp_Application::onRenamed()
1835 activeStudy()->Modified();
1839 /*!Private SLOT. Support drag-and-drop operation.*/
1840 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1842 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1846 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1848 aModule->dropObjects( objects, parentObj, row, action );
1851 /*!Private SLOT. On preferences.*/
1852 void LightApp_Application::onPreferences()
1854 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1857 /*!Private SLOT. On preferences.*/
1858 void LightApp_Application::showPreferences( const QString& itemText )
1860 QApplication::setOverrideCursor( Qt::WaitCursor );
1862 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1864 QApplication::restoreOverrideCursor();
1869 preferences()->activateItem( itemText );
1871 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1874 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1875 resourceMgr()->save();
1878 shortcutMgr()->updateShortcuts();
1884 /*!Protected SLOT. On preferences changed.*/
1885 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1887 LightApp_Module* sMod = 0;
1888 CAM_Module* mod = module( modName );
1889 if ( mod && mod->inherits( "LightApp_Module" ) )
1890 sMod = (LightApp_Module*)mod;
1893 sMod->preferencesChanged( section, param );
1895 preferencesChanged( section, param );
1896 // emit signal to allow additional preferences changing processing
1897 emit preferenceChanged( modName, section, param );
1900 /*!Remove all windows from study.*/
1901 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1903 saveDockWindowsState();
1905 if ( SUIT_DataBrowser* ob = objectBrowser() )
1908 CAM_Application::beforeCloseDoc( s );
1911 /*!Update actions.*/
1912 void LightApp_Application::updateActions()
1914 updateCommandsStatus();
1920 SUIT_Study* LightApp_Application::createNewStudy()
1922 LightApp_Application::lastStudyId++;
1924 LightApp_Study* aStudy = new LightApp_Study( this );
1926 // Set up processing of major study-related events
1927 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1928 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1929 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1930 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1936 Creates window by flag.
1937 \param flag - identificator of window type
1939 QWidget* LightApp_Application::createWindow( const int flag )
1943 SUIT_ResourceMgr* resMgr = resourceMgr();
1945 if ( flag == WT_ObjectBrowser )
1947 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1948 ob->setObjectName( "objectBrowser" );
1949 ob->setSortMenuEnabled( true );
1950 ob->setAutoUpdate( true );
1951 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1952 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1954 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1955 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1956 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1958 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1959 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1960 treeModel->setSearcher( this );
1961 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1962 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1964 // Mantis issue 0020136: Drag&Drop in OB
1965 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1967 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1968 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1969 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
1970 this, SLOT( onRenamed( ) ) );
1974 // temporary commented
1976 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1978 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1981 // Create OBSelector
1982 new LightApp_OBSelector( ob, mySelMgr );
1984 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1985 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1986 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1987 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1989 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1991 #ifndef DISABLE_PYCONSOLE
1992 else if ( flag == WT_PyConsole )
1994 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
1995 pyCons->setObjectName( "pythonConsole" );
1996 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1997 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1998 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1999 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2002 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2005 else if ( flag == WT_LogWindow )
2007 LogWindow* logWin = new LogWindow( desktop() );
2008 logWin->setObjectName( "logWindow" );
2009 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2010 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2012 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2018 \return default windows( Object Browser, Python Console )
2019 Adds to map \a aMap.
2021 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2023 #ifndef DISABLE_PYCONSOLE
2024 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2026 if ( activeStudy() ) {
2027 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2028 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2032 /*!Default view managers*/
2033 void LightApp_Application::defaultViewManagers( QStringList& ) const
2039 \return preferences.
2040 Create preferences, if \a crt = true.
2042 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2047 LightApp_Application* that = (LightApp_Application*)this;
2049 bool toCreate = !_prefs_ && crt;
2052 _prefs_ = new LightApp_Preferences( resourceMgr() );
2053 that->createPreferences( _prefs_ );
2056 that->myPrefs = _prefs_;
2058 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2059 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2060 connect( myPrefs, SIGNAL( resetToDefaults() ),
2061 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2066 SUIT_ResourceMgr* resMgr = resourceMgr();
2068 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2069 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2071 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2075 QStringList modNameList;
2076 app->modules( modNameList, false );
2078 QMap<QString, QString> iconMap;
2079 app->moduleIconNames( iconMap );
2081 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2083 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2086 int modId = _prefs_->addPreference( *it );
2087 if ( iconMap.contains( *it ) )
2088 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2092 app->modules( modList );
2093 QListIterator<CAM_Module*> itr( modList );
2094 while ( itr.hasNext() )
2096 LightApp_Module* mod = 0;
2098 CAM_Module* anItem = itr.next();
2099 if ( anItem->inherits( "LightApp_Module" ) )
2100 mod = (LightApp_Module*)anItem;
2102 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2104 _prefs_->addPreference( mod->moduleName() );
2105 mod->createPreferences();
2106 that->emptyPreferences( mod->moduleName() );
2110 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2116 Adds new module to application
2118 void LightApp_Application::moduleAdded( CAM_Module* mod )
2120 CAM_Application::moduleAdded( mod );
2122 LightApp_Module* lightMod = 0;
2123 if ( mod && mod->inherits( "LightApp_Module" ) )
2124 lightMod = (LightApp_Module*)mod;
2126 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2128 myPrefs->addPreference( mod->moduleName() );
2129 lightMod->createPreferences();
2130 emptyPreferences( mod->moduleName() );
2134 void LightApp_Application::emptyPreferences( const QString& modName )
2136 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2137 if ( !item || !item->isEmpty() )
2140 // printf( "---------------------> Modify for empty module.\n" );
2142 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2143 frm->setIcon( item->icon() );
2144 frm->setStretch( false );
2145 item->parentItem()->insertItem( frm, item );
2146 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2153 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2158 QStringList aValuesList;
2159 QList<QVariant> anIndicesList;
2163 // . Top-level "SALOME" preferences group <<start>>
2164 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2165 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2167 // .. "General" preferences tab <<start>>
2168 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2170 // ... "Language" group <<start>>
2171 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2172 pref->setItemProperty( "columns", 2, langGroup );
2173 // .... -> application language
2174 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2175 LightApp_Preferences::Selector, "language", "language" );
2176 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2177 QList<QVariant> aIcons;
2178 foreach ( QString aLang, aLangs ) {
2179 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2181 pref->setItemProperty( "strings", aLangs, curLang );
2182 pref->setItemProperty( "icons", aIcons, curLang );
2183 pref->setItemProperty( "restart", true, curLang );
2185 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2186 LightApp_Preferences::Bool, "language", "locale" );
2187 pref->setItemProperty( "restart", true, curLocale );
2188 // ... "Language" group <<end>>
2190 // ... "Look and feel" group <<start>>
2191 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2192 pref->setItemProperty( "columns", 2, lookGroup );
2193 // .... -> show splash-screen
2194 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2195 // .... -> opaque resize
2196 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2197 // .... -> drop-down buttons
2198 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2199 // ... "Look and feel" group <<end>>
2201 // ... "Study properties" group <<start>>
2202 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2203 pref->setItemProperty( "columns", 2, studyGroup );
2204 // .... -> multi-file save
2205 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2206 // .... -> ascii save mode
2207 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2208 // .... -> store windows geometry
2209 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2210 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2211 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2212 // .... -> auto-save
2213 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2214 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2215 pref->setItemProperty( "min", 0, autoSaveInterval );
2216 pref->setItemProperty( "max", 1440, autoSaveInterval );
2217 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2218 // ... "Study properties" group <<end>>
2220 // ... "Help browser" group <<start>>
2221 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2223 QString platform = "winapplication";
2225 QString platform = "application";
2227 // .... -> browser application
2228 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2229 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2230 // .... -> browser parameters
2231 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2232 // ... "Help browser" group <<end>>
2234 // ... "Python console properties" group <<start>>
2235 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2237 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2238 // .... -> show banner
2239 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2240 // ... "Python console properties" group <<end>>
2242 // ... "MRU" preferences group <<start>>
2243 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2244 pref->setItemProperty( "columns", 4, mruGroup );
2245 // number of MRU items
2246 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2247 "MRU", "visible_count" );
2248 pref->setItemProperty( "min", 0, mruVisCount );
2249 pref->setItemProperty( "max", 100, mruVisCount );
2251 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2252 "MRU", "link_type" );
2253 aValuesList.clear();
2254 anIndicesList.clear();
2255 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2256 anIndicesList << 0 << 1 << 2 ;
2257 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2258 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2259 // ... "MRU" preferences group <<end>>
2260 // .. "General" preferences tab <<end>>
2262 // .. "3D viewer" group <<start>>
2263 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2264 // ... -> navigation mode
2265 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2266 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2267 aValuesList.clear();
2268 anIndicesList.clear();
2269 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2270 anIndicesList << 0 << 1;
2271 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2272 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2273 // ... -> zooming mode
2274 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2275 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2276 aValuesList.clear();
2277 anIndicesList.clear();
2278 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2279 anIndicesList << 0 << 1;
2280 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2281 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2282 // ... "Trihedron" group <<start>>
2283 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2284 pref->setItemProperty( "columns", 2, occTriGroup );
2285 // .... -> trihedron size
2286 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2287 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2288 pref->setItemProperty( "min", 1.0E-06, occTS );
2289 pref->setItemProperty( "max", 1000, occTS );
2290 // .... -> relative size of trihedron
2291 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2292 // .... -> show static trihedron
2293 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2294 // ... "Trihedron" group <<end>>
2295 // .. "3D viewer" group <<end>>
2299 #ifndef DISABLE_OCCVIEWER
2300 // .. "OCC viewer" group <<start>>
2301 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2303 // .... -> projection mode
2304 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2305 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2306 aValuesList.clear();
2307 anIndicesList.clear();
2308 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2309 anIndicesList << 0 << 1;
2310 pref->setItemProperty( "strings", aValuesList, occProjMode );
2311 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2312 // ... "Background" group <<start>>
2313 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2314 // pref->setItemProperty( "columns", 2, bgGroup );
2315 aValuesList.clear();
2316 anIndicesList.clear();
2318 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2319 foreach( int gid, idList ) anIndicesList << gid;
2320 // .... -> 3D viewer background
2321 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2322 LightApp_Preferences::Background, "OCCViewer", "background" );
2323 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2324 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2325 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2326 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2327 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2328 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2329 pref->setItemProperty( "custom_enabled", false, bgId );
2330 pref->setItemProperty( "image_formats", formats, bgId );
2331 // .... -> XZ viewer background
2332 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2333 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2334 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2335 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2336 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2337 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2338 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2339 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2340 pref->setItemProperty( "custom_enabled", false, bgId );
2341 pref->setItemProperty( "image_formats", formats, bgId );
2342 // .... -> YZ viewer background
2343 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2344 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2345 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2346 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2347 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2348 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2349 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2350 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2351 pref->setItemProperty( "custom_enabled", false, bgId );
2352 pref->setItemProperty( "image_formats", formats, bgId );
2353 // .... -> XY viewer background
2354 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2355 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2356 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2357 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2358 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2359 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2360 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2361 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2362 pref->setItemProperty( "custom_enabled", false, bgId );
2363 pref->setItemProperty( "image_formats", formats, bgId );
2364 // ... "Background" group <<end>>
2367 // ... "Selection" group <<start>>
2368 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2369 pref->setItemProperty( "columns", 2, occSelectionGroup );
2370 // .... -> enable preselection
2371 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2372 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2373 // .... -> enable selection
2374 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2375 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2376 // ... "Selection" group <<end>>
2378 // ... "Clipping" group <<start>>
2379 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2380 // .... -> clipping color
2381 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2382 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2383 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2384 pref->setItemProperty( "columns", 2, texturePref );
2385 // .... -> use default texture
2386 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2387 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2388 // .... -> clipping texture
2389 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2390 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2391 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2393 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2394 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2395 // .... -> scale factor
2396 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2397 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2398 pref->setItemProperty( "precision", 3, scaleFactor );
2399 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2400 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2401 pref->setItemProperty( "step", 0.1, scaleFactor );
2402 // ... "Clipping" group <<end>>
2404 // ... -> empty frame (for layout) <<start>>
2405 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2406 pref->setItemProperty( "margin", 0, occGen );
2407 pref->setItemProperty( "columns", 2, occGen );
2408 // ... -> empty frame (for layout) <<end>>
2409 // .. "OCC viewer" group <<end>>
2412 #ifndef DISABLE_VTKVIEWER
2413 // .. "VTK viewer" group <<start>>
2414 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2416 // ... -> empty frame (for layout) <<start>>
2417 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2418 //pref->setItemProperty( "columns", 2, vtkGen );
2419 // .... -> projection mode
2420 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2421 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2422 aValuesList.clear();
2423 anIndicesList.clear();
2424 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2425 anIndicesList << 0 << 1;
2426 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2427 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2428 // .... -> background
2429 aValuesList.clear();
2430 anIndicesList.clear();
2432 #ifndef DISABLE_SALOMEOBJECT
2433 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2435 foreach( int gid, idList ) anIndicesList << gid;
2436 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2437 LightApp_Preferences::Background, "VTKViewer", "background" );
2438 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2439 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2440 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2441 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2442 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2443 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2444 pref->setItemProperty( "custom_enabled", false, bgId );
2445 #ifndef DISABLE_SALOMEOBJECT
2446 pref->setItemProperty( "image_formats", formats, bgId );
2448 // .... -> speed increment
2449 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2450 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2451 pref->setItemProperty( "min", 1, vtkSpeed );
2452 pref->setItemProperty( "max", 1000, vtkSpeed );
2453 // .... -> speed mode
2454 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2455 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2456 aValuesList.clear();
2457 anIndicesList.clear();
2458 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2459 anIndicesList << 0 << 1;
2460 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2461 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2463 // ... "Selection" group <<start>>
2464 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2465 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2466 // .... -> preselection
2467 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2468 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2469 aValuesList.clear();
2470 anIndicesList.clear();
2471 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2472 anIndicesList << 0 << 1 << 2;
2473 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2474 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2475 // .... -> enable selection
2476 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2477 // ... "Selection" group <<end>>
2479 // ... -> empty frame (for layout) <<end>>
2481 // ... space mouse sub-group <<start>>
2482 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2483 //pref->setItemProperty( "columns", 2, vtkSM );
2484 // .... -> decrease speed increment
2485 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2486 LightApp_Preferences::Selector, "VTKViewer",
2487 "spacemouse_func1_btn" );
2488 // .... -> increase speed increment
2489 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2490 LightApp_Preferences::Selector, "VTKViewer",
2491 "spacemouse_func2_btn" );
2492 // .... -> dominant / combined switch
2493 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2494 LightApp_Preferences::Selector, "VTKViewer",
2495 "spacemouse_func5_btn" ); //
2496 aValuesList.clear();
2497 anIndicesList.clear();
2498 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2499 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2500 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2501 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2502 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2503 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2504 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2505 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2506 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2507 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2508 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2509 // ... space mouse sub-group <<end>>
2511 // ... avi recording sub-group <<start>>
2512 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2513 pref->setItemProperty( "columns", 2, vtkRec );
2514 // .... -> recording mode
2515 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2516 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2517 aValuesList.clear();
2518 anIndicesList.clear();
2519 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2520 anIndicesList << 0 << 1;
2521 pref->setItemProperty( "strings", aValuesList, modePref );
2522 pref->setItemProperty( "indexes", anIndicesList, modePref );
2524 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2525 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2526 pref->setItemProperty( "min", 0.1, fpsPref );
2527 pref->setItemProperty( "max", 100, fpsPref );
2529 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2530 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2531 pref->setItemProperty( "min", 1, qualityPref );
2532 pref->setItemProperty( "max", 100, qualityPref );
2533 // .... -> progressive mode
2534 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2535 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2536 // ... avi recording sub-group <<end>>
2538 // ... group names sub-group <<start>>
2539 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2540 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2541 pref->setItemProperty( "columns", 2, vtkGN );
2542 // .... -> text color
2543 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2544 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2545 // .... -> transparency
2546 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2547 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2548 pref->setItemProperty( "min", 0.0, transPref );
2549 pref->setItemProperty( "max", 1.0, transPref );
2550 pref->setItemProperty( "step", 0.1, transPref );
2551 // ... -> group names sub-group <<end>>
2552 // .. "VTK viewer" group <<end>>
2555 // .. "Plot2d viewer" group <<start>>
2556 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2557 //pref->setItemProperty( "columns", 2, plot2dGroup );
2559 // ... -> background
2560 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2561 LightApp_Preferences::Color, "Plot2d", "Background" );
2562 // ... -> selection color
2563 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2564 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2566 // ... "Viewer" group <<start>>
2567 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2569 // .... -> curve type
2570 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2571 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2572 aValuesList.clear();
2573 anIndicesList.clear();
2574 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2575 anIndicesList << 0 << 1 << 2 ;
2576 pref->setItemProperty( "strings", aValuesList, curveType );
2577 pref->setItemProperty( "indexes", anIndicesList, curveType );
2578 // .... -> marker size
2579 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2580 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2581 pref->setItemProperty( "min", 0, markerSize );
2582 pref->setItemProperty( "max", 100, markerSize );
2583 // .... -> horizontal scaling mode
2584 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2585 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2586 aValuesList.clear();
2587 anIndicesList.clear();
2588 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2589 anIndicesList << 0 << 1 ;
2590 pref->setItemProperty( "strings", aValuesList, horScale );
2591 pref->setItemProperty( "indexes", anIndicesList, horScale );
2592 // .... -> vertical scaling mode
2593 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2594 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2595 pref->setItemProperty( "strings", aValuesList, verScale );
2596 pref->setItemProperty( "indexes", anIndicesList, verScale );
2598 // .... -> errors/deviation colot
2599 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2600 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2601 // .... -> deviation markers line size
2602 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2603 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2604 pref->setItemProperty( "min", 1, deviationMarkerLw );
2605 pref->setItemProperty( "max", 5, deviationMarkerLw );
2606 // .... -> deviation markers tick mark size
2607 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2608 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2609 pref->setItemProperty( "min", 1, deviationMarkerTs );
2610 pref->setItemProperty( "max", 5, deviationMarkerTs );
2611 // .... "Viewer" group <<end>>
2613 // ... "Legend" group <<start>>
2614 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2616 // .... -> show legend
2617 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2618 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2619 // .... -> legend position
2620 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2621 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2622 aValuesList.clear();
2623 anIndicesList.clear();
2624 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2625 anIndicesList << 0 << 1 << 2 << 3 ;
2626 pref->setItemProperty( "strings", aValuesList, legendPosition );
2627 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2628 // .... -> Symbol type
2629 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2630 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2631 aValuesList.clear();
2632 anIndicesList.clear();
2633 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2634 anIndicesList << 0 << 1 ;
2635 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2636 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2637 // .... -> legend font
2638 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2639 // ... -> font color
2640 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2641 // ... -> selection font color
2642 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2643 // ... "Legend" group <<end>>
2645 // .. "Plot2d viewer" group <<end>>
2647 // .. "PyViewer" preferences tab <<start>>
2648 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2649 // ... "Font settings" group <<start>>
2650 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2651 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2652 LightApp_Preferences::Font, "PyEditor", "Font" );
2653 // ... "Font settings" group <<end>>
2654 // ... "Display settings" group <<start>>
2655 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2656 pref->setItemProperty( "columns", 2, pyDispGroup );
2657 // ... -> current line highlight
2658 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2659 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2660 // ... -> text wrapping
2661 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2662 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2663 // ... -> center cursor on scroll
2664 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2665 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2666 // ... -> line numbers area
2667 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2668 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2669 // ... "Display settings" group <<end>>
2670 // ... "Tab settings" group <<start>>
2671 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2672 pref->setItemProperty( "columns", 2, pyTabGroup );
2673 // ... -> tab whitespaces
2674 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2675 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2677 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2678 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2679 // ... "Tab settings" group <<end>>
2680 // ... "Vertical edge settings" group <<start>>
2681 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2682 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2683 // ... -> vertical edge
2684 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2685 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2686 // ... -> number of columns
2687 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2688 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2689 // ... "Vertical edge settings" group <<end>>
2690 // .. "PyEditor" preferences tab <<end>>
2692 // .. "Directories" preferences tab <<start>>
2693 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2694 // ... --> quick directories list
2695 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2696 pref->addPreference( tr( "" ), dirGroup,
2697 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2698 // .. "Directories" preferences tab <<end>>
2700 // .. "Object browser" preferences tab <<start>>
2701 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2703 // ... "Search tool" group <<start>>
2704 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2705 // .... --> auto-hide
2706 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2707 "ObjectBrowser", "auto_hide_search_tool" );
2708 // ... "Search tool" group <<end>>
2710 // ... "Object browser settings" group <<start>>
2711 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2712 pref->setItemProperty( "columns", 2, objSetGroup );
2713 // .... -> auto size first column
2714 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2715 "ObjectBrowser", "auto_size_first" );
2716 // .... -> auto size other columns
2717 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2718 "ObjectBrowser", "auto_size" );
2719 // .... -> resize columns on expand item
2720 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2721 "ObjectBrowser", "resize_on_expand_item" );
2722 // .... -> browse to published object
2723 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2724 "ObjectBrowser", "browse_published_object" );
2725 aValuesList.clear();
2726 anIndicesList.clear();
2727 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2728 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2729 pref->setItemProperty( "strings", aValuesList, browsePublished );
2730 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2731 // ... "Object browser settings" group <<end>>
2732 // .. "Object browser" preferences tab <<end>>
2734 // .. "Shortcuts" preferences tab <<start>>
2735 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2736 // ... "Shortcuts settings" group <<start>>
2737 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2738 pref->addPreference( tr( "" ), shortcutGroup,
2739 LightApp_Preferences::ShortcutTree, "shortcuts" );
2740 // ... "Shortcuts settings" group <<end>>
2741 // .. "Shortcuts" preferences tab <<end>>
2742 // . Top-level "SALOME" preferences group <<end>>
2748 Changes appearance of application according to changed preferences
2749 \param sec - section
2750 \param param - name of changed parameter
2752 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2754 SUIT_ResourceMgr* resMgr = resourceMgr();
2758 if ( sec == "viewers" && param == "drop_down_buttons" )
2760 ViewManagerList vmlist = viewManagers();
2761 foreach( SUIT_ViewManager* vm, vmlist )
2763 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2764 foreach( SUIT_ViewWindow* vw, vwlist )
2765 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2769 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2771 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2772 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2773 QList<SUIT_ViewManager*> lst;
2774 #ifndef DISABLE_OCCVIEWER
2775 viewManagers( OCCViewer_Viewer::Type(), lst );
2776 QListIterator<SUIT_ViewManager*> itOCC( lst );
2777 while ( itOCC.hasNext() && sz >= 0 )
2779 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2780 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2783 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2784 occVM->setTrihedronSize( sz, relative );
2785 occVM->getAISContext()->UpdateCurrentViewer();
2788 #ifndef DISABLE_VTKVIEWER
2789 #ifndef DISABLE_SALOMEOBJECT
2790 viewManagers( SVTK_Viewer::Type(), lst );
2791 QListIterator<SUIT_ViewManager*> itVTK( lst );
2792 while ( itVTK.hasNext() && sz >= 0 )
2794 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2795 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2798 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2801 vtkVM->setTrihedronSize( sz, relative );
2809 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2811 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2812 QList<SUIT_ViewManager*> lst;
2813 #ifndef DISABLE_OCCVIEWER
2814 viewManagers( OCCViewer_Viewer::Type(), lst );
2815 QListIterator<SUIT_ViewManager*> itOCC( lst );
2816 while ( itOCC.hasNext() )
2818 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2819 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2822 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2825 occVM->setStaticTrihedronDisplayed( isVisible );
2829 #ifndef DISABLE_VTKVIEWER
2830 #ifndef DISABLE_SALOMEOBJECT
2831 viewManagers( SVTK_Viewer::Type(), lst );
2832 QListIterator<SUIT_ViewManager*> itVTK( lst );
2833 while ( itVTK.hasNext() )
2835 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2836 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2839 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2842 vtkVM->setStaticTrihedronVisible( isVisible );
2850 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2852 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2853 QList<SUIT_ViewManager*> lst;
2854 #ifndef DISABLE_OCCVIEWER
2855 viewManagers( OCCViewer_Viewer::Type(), lst );
2856 QListIterator<SUIT_ViewManager*> itOCC( lst );
2857 while ( itOCC.hasNext() )
2859 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2860 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2863 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2864 occVM->setInteractionStyle( mode );
2867 #ifndef DISABLE_VTKVIEWER
2868 #ifndef DISABLE_SALOMEOBJECT
2869 viewManagers( SVTK_Viewer::Type(), lst );
2870 QListIterator<SUIT_ViewManager*> itVTK( lst );
2871 while ( itVTK.hasNext() )
2873 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2874 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2877 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2878 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2884 #ifndef DISABLE_OCCVIEWER
2885 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2887 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2888 QList<SUIT_ViewManager*> lst;
2889 viewManagers( OCCViewer_Viewer::Type(), lst );
2890 QListIterator<SUIT_ViewManager*> it( lst );
2891 while ( it.hasNext() )
2893 SUIT_ViewModel* vm = it.next()->getViewModel();
2894 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2897 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2898 occVM->enablePreselection( isToEnablePreselection );
2903 #ifndef DISABLE_OCCVIEWER
2904 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2906 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2907 QList<SUIT_ViewManager*> lst;
2908 viewManagers( OCCViewer_Viewer::Type(), lst );
2909 QListIterator<SUIT_ViewManager*> it( lst );
2910 while ( it.hasNext() )
2912 SUIT_ViewModel* vm = it.next()->getViewModel();
2913 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2916 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2917 occVM->enableSelection( isToEnableSelection );
2922 #ifndef DISABLE_OCCVIEWER
2923 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
2925 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
2926 QList<SUIT_ViewManager*> lst;
2927 viewManagers( OCCViewer_Viewer::Type(), lst );
2928 QListIterator<SUIT_ViewManager*> it( lst );
2929 while ( it.hasNext() )
2931 SUIT_ViewModel* vm = it.next()->getViewModel();
2932 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2935 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2936 occVM->setClippingColor( aColor );
2941 #ifndef DISABLE_OCCVIEWER
2942 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
2943 param == QString( "clipping_texture" ) ||
2944 param == QString( "clipping_modulate" ) ||
2945 param == QString( "clipping_scale" ) ) )
2947 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
2948 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
2949 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
2950 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
2951 QList<SUIT_ViewManager*> lst;
2952 viewManagers( OCCViewer_Viewer::Type(), lst );
2953 QListIterator<SUIT_ViewManager*> it( lst );
2954 while ( it.hasNext() )
2956 SUIT_ViewModel* vm = it.next()->getViewModel();
2957 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2960 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2961 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
2966 #ifndef DISABLE_OCCVIEWER
2967 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
2969 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
2970 QList<SUIT_ViewManager*> lst;
2971 viewManagers( OCCViewer_Viewer::Type(), lst );
2972 QListIterator<SUIT_ViewManager*> it( lst );
2973 while ( it.hasNext() )
2975 SUIT_ViewModel* vm = it.next()->getViewModel();
2976 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2979 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2980 occVM->setProjectionType( mode );
2985 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2987 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2988 QList<SUIT_ViewManager*> lst;
2989 #ifndef DISABLE_OCCVIEWER
2990 viewManagers( OCCViewer_Viewer::Type(), lst );
2991 QListIterator<SUIT_ViewManager*> itOCC( lst );
2992 while ( itOCC.hasNext() )
2994 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2995 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2998 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2999 occVM->setZoomingStyle( mode );
3002 #ifndef DISABLE_VTKVIEWER
3003 #ifndef DISABLE_SALOMEOBJECT
3004 viewManagers( SVTK_Viewer::Type(), lst );
3005 QListIterator<SUIT_ViewManager*> itVTK( lst );
3006 while ( itVTK.hasNext() )
3008 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3009 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3012 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3013 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3019 #ifndef DISABLE_VTKVIEWER
3020 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3022 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3023 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3024 QList<SUIT_ViewManager*> lst;
3025 #ifndef DISABLE_SALOMEOBJECT
3026 viewManagers( SVTK_Viewer::Type(), lst );
3027 QListIterator<SUIT_ViewManager*> it( lst );
3028 while ( it.hasNext() )
3030 SUIT_ViewModel* vm = it.next()->getViewModel();
3031 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3034 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3035 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3041 #ifndef DISABLE_VTKVIEWER
3042 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3044 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3045 QList<SUIT_ViewManager*> lst;
3046 #ifndef DISABLE_SALOMEOBJECT
3047 viewManagers( SVTK_Viewer::Type(), lst );
3048 QListIterator<SUIT_ViewManager*> it( lst );
3049 while ( it.hasNext() )
3051 SUIT_ViewModel* vm = it.next()->getViewModel();
3052 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3055 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3056 if( vtkVM ) vtkVM->setProjectionMode( mode );
3062 #ifndef DISABLE_VTKVIEWER
3063 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3065 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3066 QList<SUIT_ViewManager*> lst;
3067 #ifndef DISABLE_SALOMEOBJECT
3068 viewManagers( SVTK_Viewer::Type(), lst );
3069 QListIterator<SUIT_ViewManager*> it( lst );
3070 while ( it.hasNext() )
3072 SUIT_ViewModel* vm = it.next()->getViewModel();
3073 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3076 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3077 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3083 #ifndef DISABLE_VTKVIEWER
3084 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3086 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3087 QList<SUIT_ViewManager*> lst;
3088 #ifndef DISABLE_SALOMEOBJECT
3089 viewManagers( SVTK_Viewer::Type(), lst );
3090 QListIterator<SUIT_ViewManager*> it( lst );
3091 while ( it.hasNext() )
3093 SUIT_ViewModel* vm = it.next()->getViewModel();
3094 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3097 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3098 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3104 #ifndef DISABLE_VTKVIEWER
3105 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3106 param == QString( "spacemouse_func2_btn" ) ||
3107 param == QString( "spacemouse_func5_btn" ) ) )
3109 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3110 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3111 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3112 QList<SUIT_ViewManager*> lst;
3113 #ifndef DISABLE_SALOMEOBJECT
3114 viewManagers( SVTK_Viewer::Type(), lst );
3115 QListIterator<SUIT_ViewManager*> it( lst );
3116 while ( it.hasNext() )
3118 SUIT_ViewModel* vm = it.next()->getViewModel();
3119 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3122 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3123 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3128 if( sec=="ObjectBrowser" )
3130 SUIT_DataBrowser* ob = objectBrowser();
3134 if ( param=="auto_size_first" )
3136 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3137 ob->setAutoSizeFirstColumn( autoSizeFirst );
3138 if ( autoSizeFirst )
3139 ob->adjustFirstColumnWidth();
3141 else if ( param=="auto_size" ) {
3142 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3143 ob->setAutoSizeColumns(autoSize);
3145 ob->adjustColumnsWidth();
3147 else if ( param=="resize_on_expand_item" ) {
3148 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3149 ob->setResizeOnExpandItem(resizeOnExpandItem);
3151 else if ( param == "auto_hide_search_tool" ) {
3152 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3158 if( param=="auto_save_interval" ) {
3159 myAutoSaveTimer->stop();
3160 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3161 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3165 #ifndef DISABLE_PYCONSOLE
3166 if( sec=="PyConsole" && pythonConsole() )
3168 if ( param=="font" ) {
3169 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3171 else if ( param=="show_banner" ) {
3172 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3179 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3181 if ( param == "visible_count" )
3182 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3183 else if ( param == "max_count" )
3184 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3185 else if ( param == "insert_mode" )
3186 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3187 else if ( param == "link_type" )
3188 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3189 else if ( param == "show_clear" )
3190 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3191 else if ( param == "show_mru" )
3192 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3195 if ( sec == "language" && param == "language" )
3197 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3198 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3200 if ( sec == "language" && param == "locale")
3202 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3203 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3205 if ( sec == "desktop" && param == "opaque_resize" ) {
3206 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3207 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3208 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3209 else dopts &= ~QMainWindow::AnimatedDocks;
3210 desktop()->setDockOptions( dopts );
3211 desktop()->setOpaqueResize( opaqueResize );
3212 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3213 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3216 #ifndef DISABLE_PLOT2DVIEWER
3217 QList<SUIT_ViewManager*> lst;
3218 viewManagers( Plot2d_Viewer::Type(), lst );
3219 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3220 while ( itPlot2d.hasNext() ) {
3221 SUIT_ViewManager* viewMgr = itPlot2d.next();
3222 SUIT_ViewModel* vm = viewMgr->getViewModel();
3223 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3226 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3228 viewMgr->setViewModel( vm );
3229 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3231 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3232 frame->SetPreference();
3237 #ifndef DISABLE_PYVIEWER
3238 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3239 param == QString( "LineNumberArea" ) ||
3240 param == QString( "TextWrapping" ) ||
3241 param == QString( "CenterCursorOnScroll" ) ||
3242 param == QString( "TabSpaceVisible" ) ||
3243 param == QString( "TabSize" ) ||
3244 param == QString( "VerticalEdge" ) ||
3245 param == QString( "NumberColumns" ) ||
3246 param == QString( "Font" ) ) )
3248 QList<SUIT_ViewManager*> lst;
3249 viewManagers( PyViewer_Viewer::Type(), lst );
3250 QListIterator<SUIT_ViewManager*> itPy( lst );
3251 while ( itPy.hasNext() )
3253 SUIT_ViewManager* viewMgr = itPy.next();
3254 SUIT_ViewModel* vm = viewMgr->getViewModel();
3255 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3258 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3260 viewMgr->setViewModel( vm );
3261 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3264 pyView->setPreferences();
3274 void LightApp_Application::loadPreferences()
3276 CAM_Application::loadPreferences();
3278 SUIT_ResourceMgr* aResMgr = resourceMgr();
3283 static bool mru_load = true;
3286 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3288 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3289 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3290 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3291 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3292 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3293 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3294 mru->loadLinks( aResMgr, "MRU" );
3300 QStringList mods = aResMgr->parameters( "windows_visibility" );
3301 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3304 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3305 myWinVis.insert( *itr, arr );
3309 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3310 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3311 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3312 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3313 else dopts &= ~QMainWindow::AnimatedDocks;
3314 desktop()->setDockOptions( dopts );
3315 desktop()->setOpaqueResize( opaqueResize );
3316 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3317 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3324 void LightApp_Application::savePreferences()
3326 CAM_Application::savePreferences();
3328 saveDockWindowsState();
3330 SUIT_ResourceMgr* aResMgr = resourceMgr();
3335 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3337 mru->saveLinks( aResMgr, "MRU" );
3339 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3340 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3343 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3345 #if GUI_DEVELOPMENT > 0
3346 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3348 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3355 Updates desktop title
3357 void LightApp_Application::updateDesktopTitle()
3359 QString aTitle = applicationName();
3360 QString aVer = applicationVersion();
3361 if ( !aVer.isEmpty() )
3362 aTitle += QString( " " ) + aVer;
3364 if ( activeStudy() ) {
3365 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3366 aTitle += QString( " - [%1]" ).arg( sName );
3369 desktop()->setWindowTitle( aTitle );
3373 \brief Get map of the operations which can be performed
3374 on the module activation.
3376 The method should return the map of the kind \c {<id>:<name>}
3377 where \c <id> is an integer identifier of the operation and
3378 \c <name> is a title for the button to be added to the
3379 dialog box. After user selects the required operation by the
3380 clicking the corresponding button in the dialog box, its identifier
3381 is passed to the moduleActionSelected() method to process
3384 \return map of the operations
3385 \sa moduleActionSelected()
3387 QMap<int, QString> LightApp_Application::activateModuleActions() const
3389 QMap<int, QString> opmap;
3390 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3391 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3396 \brief Called when the used selectes required operation chosen
3397 from "Activate module" dialog box.
3399 Performs the required operation according to the user choice.
3401 \param id operation identifier
3402 \sa activateModuleActions()
3404 void LightApp_Application::moduleActionSelected( const int id )
3419 Updates windows after close document
3421 void LightApp_Application::afterCloseDoc()
3425 CAM_Application::afterCloseDoc();
3429 Updates actions of active module
3431 void LightApp_Application::updateModuleActions()
3434 if ( activeModule() ) {
3435 modName = activeModule()->moduleName();
3436 if ( !isModuleAccessible( modName ) ) {
3437 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3438 foreach( SUIT_Application* app, apps ) {
3439 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3440 if ( lapp && lapp != this )
3441 lapp->removeModuleAction( modName );
3446 LightApp_ModuleAction* moduleAction =
3447 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3449 moduleAction->setActiveModule( modName );
3452 void LightApp_Application::removeModuleAction( const QString& modName )
3454 LightApp_ModuleAction* moduleAction =
3455 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3457 moduleAction->removeModule( modName );
3461 Gets current windows.
3462 \param winMap - output current windows map.
3464 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3467 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3468 ((LightApp_Module*)activeModule())->windows( winMap );
3470 defaultWindows( winMap );
3474 Gets current view managers.
3475 \param lst - output current view managers list.
3477 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3480 if ( !activeStudy() )
3483 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3484 ((LightApp_Module*)activeModule())->viewManagers( lst );
3486 defaultViewManagers( lst );
3492 void LightApp_Application::updateWindows()
3494 QMap<int, int> winMap;
3495 currentWindows( winMap );
3497 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3499 if ( !dockWindow( it.key() ) )
3500 getWindow( it.key() );
3503 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3505 QWidget* wid = it.value();
3506 if ( winMap.contains( it.key() ) )
3507 wid->setVisible( true );
3512 loadDockWindowsState();
3516 Updates view managers
3518 void LightApp_Application::updateViewManagers()
3521 currentViewManagers( lst );
3523 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3524 getViewManager( *it, true );
3528 Loads windows geometry
3530 void LightApp_Application::loadDockWindowsState()
3534 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3535 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3536 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3539 if ( activeModule() )
3540 modName = activeModule()->name();
3541 else if ( activeStudy() )
3542 modName = "nomodule";
3544 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3545 QByteArray aDefaultState;
3546 aResMgr->value( "windows_geometry", modName, aDefaultState );
3547 QByteArray aDefaultVisibility;
3548 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3549 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3550 aResMgr->setWorkingMode( prevMode );
3552 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3555 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3556 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3558 if ( version > Qtx::versionToId( "7.4.1" ) )
3559 aResMgr->value( "windows_geometry", modName , arr );
3561 arr = aDefaultState;
3562 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3563 desktop()->restoreState( aTargetArray );
3566 QStringList mainToolbarsNames;
3567 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3568 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3569 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3571 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3574 QMap<QString, bool> *tbMap = 0;
3575 QMap<QString, bool> *dwMap = 0;
3577 QMap<QString, bool> userTbMap, userDwMap;
3578 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3580 QMap<QString, bool> defaultTbMap, defaultDwMap;
3581 if(hasDefaultVisibility) {
3582 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3588 if(hasDefaultVisibility){
3589 tbMap = &defaultTbMap;
3596 if(hasDefaultVisibility){
3597 dwMap = &defaultDwMap;
3602 QList<QToolBar*> tbList = findToolBars();
3603 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3605 QToolBar* tb = *tit;
3606 if ( tbMap->contains( tb->objectName() ) ) {
3607 tb->setVisible( (*tbMap)[tb->objectName()] );
3613 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3614 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3616 QDockWidget* dw = *dit;
3618 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3619 if ( po != desktop() )
3622 if ( dwMap->contains( dw->objectName() ) )
3623 dw->setVisible( (*dwMap)[dw->objectName()] );
3631 Saves windows geometry
3633 void LightApp_Application::saveDockWindowsState()
3638 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3639 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3641 if( !storeWin && !storeTb )
3645 if ( activeModule() )
3646 modName = activeModule()->name();
3647 else if ( activeStudy() )
3648 modName = "nomodule";
3650 QString versionId = GUI_VERSION_STR;
3651 #if GUI_DEVELOPMENT > 0
3655 QByteArray arr = desktop()->saveState();
3656 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3657 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3660 if ( myWinVis.contains( modName ) )
3661 visArr = myWinVis[modName];
3663 QMap<QString, bool> tbMap, dwMap;
3664 dockWindowsState( visArr, tbMap, dwMap );
3666 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3667 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3670 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3673 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3674 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3676 QDockWidget* wid = *it;
3677 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3680 visArr = dockWindowsState( tbMap, dwMap );
3682 myWinVis.insert( modName, visArr );
3685 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3688 QDataStream stream( &visArr, QIODevice::WriteOnly );
3690 stream << (uchar)ToolBarMarker;
3691 stream << tb.size();
3692 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3694 stream << tit.key();
3695 stream << (uchar)( tit.value() ? 1 : 0 );
3698 stream << (uchar)DockWidgetMarker;
3699 stream << dw.size();
3700 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3702 stream << wit.key();
3703 stream << (uchar)( wit.value() ? 1 : 0 );
3709 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3714 QByteArray visArr = arr;
3715 QDataStream stream( &visArr, QIODevice::ReadOnly );
3719 if ( marker != ToolBarMarker )
3724 for ( int i = 0; i < lines; ++i )
3727 stream >> objectName;
3730 tb.insert( objectName, shown );
3734 if ( marker != DockWidgetMarker )
3738 for ( int j = 0; j < lines; ++j )
3741 stream >> objectName;
3744 dw.insert( objectName, shown );
3749 Adds icon names for modules
3751 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3755 SUIT_ResourceMgr* resMgr = resourceMgr();
3759 QStringList modList;
3760 modules( modList, false );
3762 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3764 QString modName = *it;
3765 QString modIntr = moduleName( modName );
3766 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3768 if ( modIcon.isEmpty() )
3771 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3772 modIcon += QString( ".png" );
3774 iconMap.insert( modName, modIcon );
3779 Inserts items in popup, which necessary for current application
3781 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3784 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3785 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3786 selMgr->setSelectionCacheEnabled( true );
3788 SUIT_DataBrowser* ob = objectBrowser();
3790 CAM_Application::contextMenuPopup( type, thePopup, title );
3792 if ( ob && type == ob->popupClientType() ) {
3793 thePopup->addSeparator();
3794 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3795 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3796 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3799 #ifndef DISABLE_SALOMEOBJECT
3800 if ( selMgr && ob ) {
3801 SALOME_ListIO selected;
3802 selMgr->selectedObjects( selected );
3803 if(selected.Extent() == 1){
3804 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3805 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3806 if(obj && obj->renameAllowed()) {
3807 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3808 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3809 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3810 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3812 QList<QAction*> acts = thePopup->actions();
3813 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3814 thePopup->insertAction(firstAction,a);
3820 selMgr->setSelectionCacheEnabled( cacheIsOn );
3826 void LightApp_Application::createEmptyStudy()
3828 CAM_Application::createEmptyStudy();
3830 if ( objectBrowser() )
3831 objectBrowser()->updateTree();
3833 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3834 if ( aResMgr && activeStudy() ) {
3835 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3836 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3841 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3843 CAM_Application::setDesktop( desk );
3846 connect( desk, SIGNAL( message( const QString& ) ),
3847 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3848 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3849 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3855 \param mod - module to be activated
3857 bool LightApp_Application::activateModule( CAM_Module* mod )
3859 bool res = CAM_Application::activateModule( mod );
3861 if ( objectBrowser() )
3862 objectBrowser()->updateTree();
3868 \return keyborad accelerators manager object
3870 SUIT_Accel* LightApp_Application::accel() const
3876 Removes dead widget container from map
3878 void LightApp_Application::onWCDestroyed( QObject* ob )
3880 // remove destroyed widget container from windows map
3881 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3883 if ( itr.value() != ob )
3886 int key = itr.key();
3887 myWin.remove( key );
3892 void LightApp_Application::onMRUActivated( const QString& name )
3894 SUIT_Session* s = SUIT_Session::session();
3895 if ( s && s->activeApplication() == this )
3899 void LightApp_Application::onStylePreferences()
3901 Style_PrefDlg dlg( desktop() );
3904 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3907 void LightApp_Application::onFullScreen(){
3908 if(myScreenHelper) {
3909 if(desktop()->isFullScreen())
3910 myScreenHelper->switchToNormalScreen();
3912 myScreenHelper->switchToFullScreen();
3917 Connects just added view manager
3919 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3921 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3922 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3923 CAM_Application::addViewManager( vm );
3927 Remove view manager from memory
3929 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3931 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3932 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3933 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3935 aStudy->removeObjectProperties( vm->getGlobalId() );
3937 CAM_Application::removeViewManager( vm );
3939 LightApp_SelectionMgr* selMgr = selectionMgr();
3940 QList<SUIT_Selector*> selectors;
3941 selMgr->selectors( selectors );
3942 foreach( SUIT_Selector* selector, selectors ) {
3943 if ( selector->owner() == vm->getViewModel() ) {
3948 // IPAL22894: Crash on closing OCC view
3954 Renames active window of desktop
3956 void LightApp_Application::onRenameWindow()
3961 QWidget* w = desktop()->activeWindow();
3966 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3967 if( ok && !name.isEmpty() )
3968 w->setWindowTitle( name );
3972 Closes active window of desktop
3974 void LightApp_Application::onCloseWindow()
3979 QWidget* w = desktop()->activeWindow();
3987 Closes all windows of desktop
3989 void LightApp_Application::onCloseAllWindow()
3991 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3995 QList<SUIT_ViewWindow*> wndList = desk->windows();
3996 SUIT_ViewWindow* wnd;
3997 foreach( wnd, wndList )
4005 Groups all windows of desktop
4007 void LightApp_Application::onGroupAllWindow()
4009 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4013 QtxWorkstack* wgStack = desk->workstack();
4019 \return if the library of module exists
4020 \param moduleTitle - title of module
4022 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4024 if( moduleTitle.isEmpty() )
4027 QString lib = moduleLibrary( moduleTitle );
4029 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4030 bool isPythonModule = lib.contains("SalomePyQtGUI");
4031 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4035 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4037 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4040 bool isLibFound = false;
4041 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4042 for( ; anIt!=aLast; anIt++ )
4044 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4055 INFOS( "\n****************************************************************" << std::endl
4056 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4057 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4058 << "****************************************************************" << std::endl );
4060 else if ( !isPythonModule && !isPythonLightModule)
4063 if ( isPythonModule || isPythonLightModule)
4065 QString pylib = moduleName( moduleTitle ) + QString(".py");
4066 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4068 // Check the python library
4070 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4072 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4074 bool isPyLib = false, isPyGuiLib = false;
4075 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4076 for( ; anIt!=aLast; anIt++ )
4078 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4079 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4081 if(!isPythonLightModule)
4082 if( !isPyLib && inf.exists() )
4085 if( !isPyGuiLib && infgui.exists() )
4088 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4092 printf( "\n****************************************************************\n" );
4093 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4095 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4097 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4098 printf( "****************************************************************\n" );
4105 \return default name for an active study
4107 void LightApp_Application::setDefaultStudyName( const QString& theName )
4109 QStringList anInfoList;
4110 modules( anInfoList, false );
4112 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4113 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4114 !aStudy->isSaved() )
4116 aStudy->setStudyName( theName );
4117 updateDesktopTitle();
4122 Custom event handler
4124 bool LightApp_Application::event( QEvent* e )
4126 if( e && e->type()==2000 )
4128 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4129 QString* d = ( QString* )ce->data();
4130 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4132 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4133 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4134 showPreferences( tr( "PREF_APP" ) );
4139 return CAM_Application::event( e );
4142 /*! Check data object */
4143 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4147 bool isSuitable = !theObj->entry().isEmpty() &&
4148 !theObj->componentDataType().isEmpty() &&
4149 !theObj->name().isEmpty();
4156 int LightApp_Application::openChoice( const QString& aName )
4158 int choice = CAM_Application::openChoice( aName );
4160 if ( choice == OpenExist ) // The document is already open.
4162 // Do you want to reload it?
4163 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4164 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4165 choice = OpenReload;
4171 bool LightApp_Application::openAction( const int choice, const QString& aName )
4178 STD_Application* app = 0;
4179 SUIT_Session* session = SUIT_Session::session();
4180 QList<SUIT_Application*> appList = session->applications();
4181 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4183 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4184 app = ::qobject_cast<STD_Application*>( *it );
4189 app->onCloseDoc( false );
4190 appList = session->applications();
4191 STD_Application* other = 0;
4192 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4193 other = ::qobject_cast<STD_Application*>( *it );
4196 res = other->onOpenDoc( aName );
4201 res = CAM_Application::openAction( choice, aName );
4208 QStringList LightApp_Application::viewManagersTypes() const
4210 QStringList aTypesList;
4211 aTypesList += myUserWmTypes;
4212 #ifndef DISABLE_GLVIEWER
4213 aTypesList<<GLViewer_Viewer::Type();
4215 #ifndef DISABLE_PLOT2DVIEWER
4216 aTypesList<<Plot2d_Viewer::Type();
4218 #ifndef DISABLE_QXGRAPHVIEWER
4219 aTypesList<<QxScene_Viewer::Type();
4221 #ifndef DISABLE_PVVIEWER
4222 aTypesList<<PVViewer_Viewer::Type();
4224 #ifndef DISABLE_PYVIEWER
4225 aTypesList<<PyViewer_Viewer::Type();
4227 #ifndef DISABLE_OCCVIEWER
4228 aTypesList<<OCCViewer_Viewer::Type();
4230 #ifndef DISABLE_VTKVIEWER
4231 #ifndef DISABLE_SALOMEOBJECT
4232 aTypesList<<SVTK_Viewer::Type();
4234 aTypesList<<VTKViewer_Viewer::Type();
4240 * Removes all view managers of known types
4241 * Other view managers are ignored
4243 void LightApp_Application::clearKnownViewManagers()
4245 QStringList aTypesList = viewManagersTypes();
4246 QList<SUIT_ViewManager*> aMgrList;
4247 viewManagers( aMgrList );
4248 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4249 if (aTypesList.contains(aMgr->getType()))
4250 removeViewManager(aMgr);
4255 Copy of current selection
4257 void LightApp_Application::onCopy()
4259 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4265 Paste of current data in clipboard
4267 void LightApp_Application::onPaste()
4269 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4275 Browse (i.e. set focus on) the published objects
4276 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4277 has been accepted by Ok (or Apply & Close) button
4278 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4279 (to select the first published object only)
4280 \return entry of the selected object
4282 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4283 const bool theIsApplyAndClose,
4284 const bool theIsOptimizedBrowsing )
4287 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4289 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4290 switch( aBrowsePolicy )
4294 case BP_ApplyAndClose:
4295 if( !theIsApplyAndClose )
4303 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4307 SUIT_DataBrowser* anOB = objectBrowser();
4311 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4315 QStringListIterator anIter( theEntryList );
4316 if( theIsOptimizedBrowsing )
4318 // go to the last entry
4320 if( anIter.hasPrevious() )
4324 // scroll to each entry in the list
4325 // (in optimized mode - to the last entry only)
4327 LightApp_DataObject* anObject = 0;
4328 while( anIter.hasNext() )
4330 anEntry = anIter.next();
4331 if( !anEntry.isEmpty() )
4333 anObject = aStudy->findObjectByEntry( anEntry );
4336 QModelIndex anIndex = aModel->index( anObject );
4337 anOB->treeView()->scrollTo( anIndex );
4342 // always select the last object
4343 if( anObject && !anEntry.isEmpty() )
4345 QList<SUIT_Selector*> aSelectorList;
4346 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4347 if( !aSelectorList.isEmpty() )
4349 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4351 bool anIsAutoBlock = aSelector->autoBlock();
4353 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4354 aSelector->setAutoBlock( false );
4356 SUIT_DataOwnerPtrList aList;
4357 #ifndef DISABLE_SALOMEOBJECT
4358 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4359 ( anObject->entry().toLatin1().constData(),
4360 anObject->componentDataType().toLatin1().constData(),
4361 anObject->name().toLatin1().constData() );
4362 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4364 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4367 aList.append( owner );
4368 selectionMgr()->setSelected( aList );
4371 // restore auto block flag
4372 aSelector->setAutoBlock( anIsAutoBlock );
4380 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4382 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4383 return study ? study->findObjectByEntry( id ) : 0;
4387 Checks that an object can be renamed.
4388 \param entry entry of the object
4389 \brief Return \c true if object can be renamed
4391 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4396 Rename object by entry.
4397 \param entry entry of the object
4398 \param name new name of the object
4399 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4401 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4405 /*! Process standard messages from desktop */
4406 void LightApp_Application::onDesktopMessage( const QString& message )
4408 const QString sectionSeparator = "/";
4410 if ( message.toLower() == "updateobjectbrowser" ||
4411 message.toLower() == "updateobjbrowser" ) {
4412 // update object browser
4413 updateObjectBrowser();
4415 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4416 QString vtype = message.split( sectionSeparator ).last();
4417 if ( !vtype.isEmpty() )
4418 getViewManager( vtype, true );
4421 QStringList data = message.split( sectionSeparator );
4422 if ( data.count() > 1 ) {
4423 QString msgType = data[0].trimmed();
4424 LightApp_Module* sMod = 0;
4425 CAM_Module* mod = module( msgType );
4427 mod = module( moduleTitle( msgType ) );
4428 if ( mod && mod->inherits( "LightApp_Module" ) )
4429 sMod = (LightApp_Module*)mod;
4431 if ( msgType.toLower() == "preferences" ) {
4432 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4433 // for example "preferences/Study/multi_file_dump/true"
4434 if ( data.count() > 3 ) {
4435 QString section = data[1].trimmed();
4436 QString param = data[2].trimmed();
4437 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4438 resourceMgr()->setValue( section, param, value );
4442 // received message for the module
4443 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4444 sMod->message( msg );
4452 Returns all top level toolbars.
4453 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4455 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4457 QList<QToolBar*> aResult;
4458 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4459 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4460 QToolBar* tb = *tit;
4461 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4462 if ( po != desktop() )
4464 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4471 Internal method to parse toolbars and dockable windows state.
4473 QByteArray LightApp_Application::processState(QByteArray& input,
4474 const bool processWin,
4475 const bool processTb,
4476 const bool isRestoring,
4477 QByteArray defaultState) {
4480 bool hasDefaultState = !defaultState.isEmpty();
4481 bool isDockWinWriten = false;
4483 //Write date from users settings
4485 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4486 int marker, version;
4488 tmpInputData >> marker;
4489 tmpInputData >> version;
4490 tmpInputData >> dockmarker;
4491 tmpInputData >> nbDocWin;
4493 if(processWin && processTb && !isRestoring) {
4495 } else if(!processWin && !processTb ) {
4497 aRes = defaultState;
4499 QDataStream aData(&aRes, QIODevice::WriteOnly);
4500 QList<QToolBar*> aToolBars = findToolBars();
4503 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4504 QToolBar* tb = *tit;
4505 aNames.append(tb->objectName());
4508 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4509 if(toolBarMarkerIndex < 0)
4511 QDataStream anInputData(&input, QIODevice::ReadOnly);
4513 int toolBarMarkerIndexDef;
4514 if(hasDefaultState) {
4515 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4516 if(toolBarMarkerIndexDef < 0)
4519 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4521 QDataStream* aTargetData = 0;
4522 int aTargetIndex = -1;
4524 QByteArray currentArr = desktop()->saveState();
4525 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4526 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4527 if(processWin && useInputData) {
4528 aTargetData = &anInputData;
4529 aTargetIndex = toolBarMarkerIndex;
4531 //Write date from default settings
4532 if(hasDefaultState) {
4533 aTargetData = &anInputDataDef;
4534 aTargetIndex = toolBarMarkerIndexDef;
4536 //If no default state, write current snapshot of the dockable windows
4538 aTargetData = &anInputDataCur;
4539 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4540 aTargetIndex = toolBarMarkerIndexCur;
4545 if(aTargetData && aTargetIndex >= 0 ) {
4546 aTargetData->device()->seek(0);
4547 while( aTargetData->device()->pos() < aTargetIndex ) {
4552 isDockWinWriten = true;
4559 aTargetData = &anInputData;
4560 aTargetIndex = toolBarMarkerIndex;
4562 if(hasDefaultState) {
4563 aTargetData = &anInputDataDef;
4564 aTargetIndex = toolBarMarkerIndexDef;
4568 if(aTargetData && aTargetIndex >= 0) {
4570 if(!isDockWinWriten ) {
4571 //Write version marker
4572 int marker, version;
4573 aTargetData->device()->seek(0);
4574 *aTargetData >> marker;
4575 *aTargetData >> version;
4578 aData << (uchar) QDockWidgetMarker;
4580 int shift = 4*sizeof(int) + sizeof(QSize);
4581 index = aTargetIndex - shift;
4583 index = aTargetIndex;
4586 aTargetData->device()->seek(index);
4587 while(!aTargetData->atEnd()) {
4592 } else { // Not treat toolbars
4593 aData << (uchar) QToolBarMarker;
4594 aData << (int) 0; //Nb toolbars = 0
4601 \brief Emits operationFinished signal.
4602 \param theModuleName the name of the module which perfomed the operation
4603 \param theOperationName the operation name
4604 \param theEntryList the list of the created objects entries
4606 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4607 const QString& theOperationName,
4608 const QStringList& theEntryList )
4610 emit operationFinished( theModuleName, theOperationName, theEntryList );
4614 Update visibility state of given objects
4616 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4617 SUIT_ViewModel* theViewModel )
4619 if ( !theViewModel || theList.isEmpty() ) return;
4621 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4622 if ( !aStudy ) return;
4624 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4626 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4627 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4629 if ( !obj || aStudy->isComponent( obj->entry() ) )
4632 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4633 if ( anObjModule ) {
4634 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4636 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4637 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4638 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4639 anObjState = Qtx::ShownState;
4641 anObjState = Qtx::HiddenState;
4643 aStudy->setVisibilityState( obj->entry(), anObjState );
4650 * Called when window activated
4652 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4654 SUIT_DataBrowser* anOB = objectBrowser();
4657 SUIT_DataObject* rootObj = anOB->root();
4661 DataObjectList listObj = rootObj->children( true );
4663 SUIT_ViewModel* vmod = 0;
4664 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4665 vmod = vman->getViewModel();
4666 updateVisibilityState( listObj, vmod );
4670 Called then view manager removed
4672 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4674 ViewManagerList lst;
4675 viewManagers( lst );
4676 if ( lst.count() == 1) { // in case if closed last view window
4677 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4679 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4684 Check existing document.
4686 bool LightApp_Application::checkExistingDoc()
4689 if( activeStudy() ) {
4690 int answer = SUIT_MessageBox::question( desktop(),
4691 tr( "APPCLOSE_CAPTION" ),
4692 tr( "STUDYCLOSE_DESCRIPTION" ),
4693 tr( "APPCLOSE_SAVE" ),
4694 tr( "APPCLOSE_CLOSE" ),
4695 tr( "APPCLOSE_CANCEL" ), 0 );
4697 if ( activeStudy()->isSaved() ) {
4700 } else if ( onSaveAsDoc() ) {
4701 if( !closeDoc( false ) ) {
4708 else if( answer == 1 ) {
4710 } else if( answer == 2 ) {
4717 #ifndef DISABLE_PYCONSOLE
4719 PyConsole_Interp* LightApp_Application::getPyInterp()
4721 static PyConsole_Interp* myInterp = 0;
4723 myInterp = createPyInterp();
4727 PyConsole_Interp* LightApp_Application::createPyInterp()
4729 return new LightApp_PyInterp();
4732 #endif // DISABLE_PYCONSOLE