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 );
2184 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2185 LightApp_Preferences::Bool, "language", "locale" );
2186 // ... "Language" group <<end>>
2188 // ... "Look and feel" group <<start>>
2189 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2190 pref->setItemProperty( "columns", 2, lookGroup );
2191 // .... -> show splash-screen
2192 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2193 // .... -> opaque resize
2194 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2195 // .... -> drop-down buttons
2196 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2197 // ... "Look and feel" group <<end>>
2199 // ... "Study properties" group <<start>>
2200 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2201 pref->setItemProperty( "columns", 2, studyGroup );
2202 // .... -> multi-file save
2203 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2204 // .... -> ascii save mode
2205 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2206 // .... -> store windows geometry
2207 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2208 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2209 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2210 // .... -> auto-save
2211 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2212 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2213 pref->setItemProperty( "min", 0, autoSaveInterval );
2214 pref->setItemProperty( "max", 1440, autoSaveInterval );
2215 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2216 // ... "Study properties" group <<end>>
2218 // ... "Help browser" group <<start>>
2219 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2221 QString platform = "winapplication";
2223 QString platform = "application";
2225 // .... -> browser application
2226 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2227 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2228 // .... -> browser parameters
2229 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2230 // ... "Help browser" group <<end>>
2232 // ... "Python console properties" group <<start>>
2233 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2235 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2236 // .... -> show banner
2237 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2238 // ... "Python console properties" group <<end>>
2240 // ... "MRU" preferences group <<start>>
2241 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2242 pref->setItemProperty( "columns", 4, mruGroup );
2243 // number of MRU items
2244 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2245 "MRU", "visible_count" );
2246 pref->setItemProperty( "min", 0, mruVisCount );
2247 pref->setItemProperty( "max", 100, mruVisCount );
2249 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2250 "MRU", "link_type" );
2251 aValuesList.clear();
2252 anIndicesList.clear();
2253 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2254 anIndicesList << 0 << 1 << 2 ;
2255 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2256 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2257 // ... "MRU" preferences group <<end>>
2258 // .. "General" preferences tab <<end>>
2260 // .. "3D viewer" group <<start>>
2261 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2262 // ... -> navigation mode
2263 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2264 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2265 aValuesList.clear();
2266 anIndicesList.clear();
2267 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2268 anIndicesList << 0 << 1;
2269 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2270 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2271 // ... -> zooming mode
2272 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2273 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2274 aValuesList.clear();
2275 anIndicesList.clear();
2276 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2277 anIndicesList << 0 << 1;
2278 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2279 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2280 // ... "Trihedron" group <<start>>
2281 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2282 pref->setItemProperty( "columns", 2, occTriGroup );
2283 // .... -> trihedron size
2284 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2285 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2286 pref->setItemProperty( "min", 1.0E-06, occTS );
2287 pref->setItemProperty( "max", 1000, occTS );
2288 // .... -> relative size of trihedron
2289 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2290 // .... -> show static trihedron
2291 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2292 // ... "Trihedron" group <<end>>
2293 // .. "3D viewer" group <<end>>
2297 #ifndef DISABLE_OCCVIEWER
2298 // .. "OCC viewer" group <<start>>
2299 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2301 // .... -> projection mode
2302 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2303 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2304 aValuesList.clear();
2305 anIndicesList.clear();
2306 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2307 anIndicesList << 0 << 1;
2308 pref->setItemProperty( "strings", aValuesList, occProjMode );
2309 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2310 // ... "Background" group <<start>>
2311 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2312 // pref->setItemProperty( "columns", 2, bgGroup );
2313 aValuesList.clear();
2314 anIndicesList.clear();
2316 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2317 foreach( int gid, idList ) anIndicesList << gid;
2318 // .... -> 3D viewer background
2319 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2320 LightApp_Preferences::Background, "OCCViewer", "background" );
2321 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2322 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2323 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2324 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2325 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2326 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2327 pref->setItemProperty( "custom_enabled", false, bgId );
2328 pref->setItemProperty( "image_formats", formats, bgId );
2329 // .... -> XZ viewer background
2330 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2331 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2332 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2333 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2334 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2335 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2336 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2337 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2338 pref->setItemProperty( "custom_enabled", false, bgId );
2339 pref->setItemProperty( "image_formats", formats, bgId );
2340 // .... -> YZ viewer background
2341 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2342 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2343 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2344 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2345 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2346 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2347 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2348 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2349 pref->setItemProperty( "custom_enabled", false, bgId );
2350 pref->setItemProperty( "image_formats", formats, bgId );
2351 // .... -> XY viewer background
2352 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2353 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2354 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2355 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2356 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2357 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2358 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2359 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2360 pref->setItemProperty( "custom_enabled", false, bgId );
2361 pref->setItemProperty( "image_formats", formats, bgId );
2362 // ... "Background" group <<end>>
2365 // ... "Selection" group <<start>>
2366 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2367 pref->setItemProperty( "columns", 2, occSelectionGroup );
2368 // .... -> enable preselection
2369 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2370 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2371 // .... -> enable selection
2372 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2373 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2374 // ... "Selection" group <<end>>
2376 // ... "Clipping" group <<start>>
2377 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2378 // .... -> clipping color
2379 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2380 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2381 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2382 pref->setItemProperty( "columns", 2, texturePref );
2383 // .... -> use default texture
2384 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2385 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2386 // .... -> clipping texture
2387 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2388 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2389 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2391 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2392 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2393 // .... -> scale factor
2394 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2395 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2396 pref->setItemProperty( "precision", 3, scaleFactor );
2397 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2398 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2399 pref->setItemProperty( "step", 0.1, scaleFactor );
2400 // ... "Clipping" group <<end>>
2402 // ... -> empty frame (for layout) <<start>>
2403 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2404 pref->setItemProperty( "margin", 0, occGen );
2405 pref->setItemProperty( "columns", 2, occGen );
2406 // ... -> empty frame (for layout) <<end>>
2407 // .. "OCC viewer" group <<end>>
2410 #ifndef DISABLE_VTKVIEWER
2411 // .. "VTK viewer" group <<start>>
2412 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2414 // ... -> empty frame (for layout) <<start>>
2415 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2416 //pref->setItemProperty( "columns", 2, vtkGen );
2417 // .... -> projection mode
2418 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2419 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2420 aValuesList.clear();
2421 anIndicesList.clear();
2422 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2423 anIndicesList << 0 << 1;
2424 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2425 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2426 // .... -> background
2427 aValuesList.clear();
2428 anIndicesList.clear();
2430 #ifndef DISABLE_SALOMEOBJECT
2431 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2433 foreach( int gid, idList ) anIndicesList << gid;
2434 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2435 LightApp_Preferences::Background, "VTKViewer", "background" );
2436 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2437 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2438 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2439 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2440 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2441 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2442 pref->setItemProperty( "custom_enabled", false, bgId );
2443 #ifndef DISABLE_SALOMEOBJECT
2444 pref->setItemProperty( "image_formats", formats, bgId );
2446 // .... -> speed increment
2447 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2448 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2449 pref->setItemProperty( "min", 1, vtkSpeed );
2450 pref->setItemProperty( "max", 1000, vtkSpeed );
2451 // .... -> speed mode
2452 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2453 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2454 aValuesList.clear();
2455 anIndicesList.clear();
2456 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2457 anIndicesList << 0 << 1;
2458 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2459 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2461 // ... "Selection" group <<start>>
2462 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2463 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2464 // .... -> preselection
2465 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2466 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2467 aValuesList.clear();
2468 anIndicesList.clear();
2469 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2470 anIndicesList << 0 << 1 << 2;
2471 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2472 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2473 // .... -> enable selection
2474 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2475 // ... "Selection" group <<end>>
2477 // ... -> empty frame (for layout) <<end>>
2479 // ... space mouse sub-group <<start>>
2480 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2481 //pref->setItemProperty( "columns", 2, vtkSM );
2482 // .... -> decrease speed increment
2483 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2484 LightApp_Preferences::Selector, "VTKViewer",
2485 "spacemouse_func1_btn" );
2486 // .... -> increase speed increment
2487 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2488 LightApp_Preferences::Selector, "VTKViewer",
2489 "spacemouse_func2_btn" );
2490 // .... -> dominant / combined switch
2491 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2492 LightApp_Preferences::Selector, "VTKViewer",
2493 "spacemouse_func5_btn" ); //
2494 aValuesList.clear();
2495 anIndicesList.clear();
2496 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2497 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2498 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2499 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2500 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2501 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2502 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2503 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2504 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2505 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2506 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2507 // ... space mouse sub-group <<end>>
2509 // ... avi recording sub-group <<start>>
2510 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2511 pref->setItemProperty( "columns", 2, vtkRec );
2512 // .... -> recording mode
2513 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2514 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2515 aValuesList.clear();
2516 anIndicesList.clear();
2517 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2518 anIndicesList << 0 << 1;
2519 pref->setItemProperty( "strings", aValuesList, modePref );
2520 pref->setItemProperty( "indexes", anIndicesList, modePref );
2522 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2523 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2524 pref->setItemProperty( "min", 0.1, fpsPref );
2525 pref->setItemProperty( "max", 100, fpsPref );
2527 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2528 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2529 pref->setItemProperty( "min", 1, qualityPref );
2530 pref->setItemProperty( "max", 100, qualityPref );
2531 // .... -> progressive mode
2532 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2533 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2534 // ... avi recording sub-group <<end>>
2536 // ... group names sub-group <<start>>
2537 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2538 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2539 pref->setItemProperty( "columns", 2, vtkGN );
2540 // .... -> text color
2541 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2542 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2543 // .... -> transparency
2544 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2545 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2546 pref->setItemProperty( "min", 0.0, transPref );
2547 pref->setItemProperty( "max", 1.0, transPref );
2548 pref->setItemProperty( "step", 0.1, transPref );
2549 // ... -> group names sub-group <<end>>
2550 // .. "VTK viewer" group <<end>>
2553 // .. "Plot2d viewer" group <<start>>
2554 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2555 //pref->setItemProperty( "columns", 2, plot2dGroup );
2557 // ... -> background
2558 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2559 LightApp_Preferences::Color, "Plot2d", "Background" );
2560 // ... -> selection color
2561 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2562 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2564 // ... "Viewer" group <<start>>
2565 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2567 // .... -> curve type
2568 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2569 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2570 aValuesList.clear();
2571 anIndicesList.clear();
2572 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2573 anIndicesList << 0 << 1 << 2 ;
2574 pref->setItemProperty( "strings", aValuesList, curveType );
2575 pref->setItemProperty( "indexes", anIndicesList, curveType );
2576 // .... -> marker size
2577 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2578 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2579 pref->setItemProperty( "min", 0, markerSize );
2580 pref->setItemProperty( "max", 100, markerSize );
2581 // .... -> horizontal scaling mode
2582 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2583 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2584 aValuesList.clear();
2585 anIndicesList.clear();
2586 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2587 anIndicesList << 0 << 1 ;
2588 pref->setItemProperty( "strings", aValuesList, horScale );
2589 pref->setItemProperty( "indexes", anIndicesList, horScale );
2590 // .... -> vertical scaling mode
2591 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2592 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2593 pref->setItemProperty( "strings", aValuesList, verScale );
2594 pref->setItemProperty( "indexes", anIndicesList, verScale );
2596 // .... -> errors/deviation colot
2597 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2598 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2599 // .... -> deviation markers line size
2600 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2601 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2602 pref->setItemProperty( "min", 1, deviationMarkerLw );
2603 pref->setItemProperty( "max", 5, deviationMarkerLw );
2604 // .... -> deviation markers tick mark size
2605 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2606 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2607 pref->setItemProperty( "min", 1, deviationMarkerTs );
2608 pref->setItemProperty( "max", 5, deviationMarkerTs );
2609 // .... "Viewer" group <<end>>
2611 // ... "Legend" group <<start>>
2612 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2614 // .... -> show legend
2615 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2616 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2617 // .... -> legend position
2618 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2619 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2620 aValuesList.clear();
2621 anIndicesList.clear();
2622 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2623 anIndicesList << 0 << 1 << 2 << 3 ;
2624 pref->setItemProperty( "strings", aValuesList, legendPosition );
2625 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2626 // .... -> Symbol type
2627 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2628 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2629 aValuesList.clear();
2630 anIndicesList.clear();
2631 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2632 anIndicesList << 0 << 1 ;
2633 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2634 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2635 // .... -> legend font
2636 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2637 // ... -> font color
2638 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2639 // ... -> selection font color
2640 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2641 // ... "Legend" group <<end>>
2643 // .. "Plot2d viewer" group <<end>>
2645 // .. "PyViewer" preferences tab <<start>>
2646 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2647 // ... "Font settings" group <<start>>
2648 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2649 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2650 LightApp_Preferences::Font, "PyEditor", "Font" );
2651 // ... "Font settings" group <<end>>
2652 // ... "Display settings" group <<start>>
2653 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2654 pref->setItemProperty( "columns", 2, pyDispGroup );
2655 // ... -> current line highlight
2656 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2657 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2658 // ... -> text wrapping
2659 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2660 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2661 // ... -> center cursor on scroll
2662 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2663 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2664 // ... -> line numbers area
2665 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2666 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2667 // ... "Display settings" group <<end>>
2668 // ... "Tab settings" group <<start>>
2669 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2670 pref->setItemProperty( "columns", 2, pyTabGroup );
2671 // ... -> tab whitespaces
2672 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2673 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2675 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2676 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2677 // ... "Tab settings" group <<end>>
2678 // ... "Vertical edge settings" group <<start>>
2679 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2680 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2681 // ... -> vertical edge
2682 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2683 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2684 // ... -> number of columns
2685 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2686 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2687 // ... "Vertical edge settings" group <<end>>
2688 // .. "PyEditor" preferences tab <<end>>
2690 // .. "Directories" preferences tab <<start>>
2691 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2692 // ... --> quick directories list
2693 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2694 pref->addPreference( tr( "" ), dirGroup,
2695 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2696 // .. "Directories" preferences tab <<end>>
2698 // .. "Object browser" preferences tab <<start>>
2699 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2701 // ... "Search tool" group <<start>>
2702 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2703 // .... --> auto-hide
2704 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2705 "ObjectBrowser", "auto_hide_search_tool" );
2706 // ... "Search tool" group <<end>>
2708 // ... "Object browser settings" group <<start>>
2709 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2710 pref->setItemProperty( "columns", 2, objSetGroup );
2711 // .... -> auto size first column
2712 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2713 "ObjectBrowser", "auto_size_first" );
2714 // .... -> auto size other columns
2715 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2716 "ObjectBrowser", "auto_size" );
2717 // .... -> resize columns on expand item
2718 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2719 "ObjectBrowser", "resize_on_expand_item" );
2720 // .... -> browse to published object
2721 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2722 "ObjectBrowser", "browse_published_object" );
2723 aValuesList.clear();
2724 anIndicesList.clear();
2725 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2726 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2727 pref->setItemProperty( "strings", aValuesList, browsePublished );
2728 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2729 // ... "Object browser settings" group <<end>>
2730 // .. "Object browser" preferences tab <<end>>
2732 // .. "Shortcuts" preferences tab <<start>>
2733 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2734 // ... "Shortcuts settings" group <<start>>
2735 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2736 pref->addPreference( tr( "" ), shortcutGroup,
2737 LightApp_Preferences::ShortcutTree, "shortcuts" );
2738 // ... "Shortcuts settings" group <<end>>
2739 // .. "Shortcuts" preferences tab <<end>>
2740 // . Top-level "SALOME" preferences group <<end>>
2746 Changes appearance of application according to changed preferences
2747 \param sec - section
2748 \param param - name of changed parameter
2750 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2752 SUIT_ResourceMgr* resMgr = resourceMgr();
2756 if ( sec == "viewers" && param == "drop_down_buttons" )
2758 ViewManagerList vmlist = viewManagers();
2759 foreach( SUIT_ViewManager* vm, vmlist )
2761 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2762 foreach( SUIT_ViewWindow* vw, vwlist )
2763 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2767 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2769 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2770 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2771 QList<SUIT_ViewManager*> lst;
2772 #ifndef DISABLE_OCCVIEWER
2773 viewManagers( OCCViewer_Viewer::Type(), lst );
2774 QListIterator<SUIT_ViewManager*> itOCC( lst );
2775 while ( itOCC.hasNext() && sz >= 0 )
2777 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2778 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2781 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2782 occVM->setTrihedronSize( sz, relative );
2783 occVM->getAISContext()->UpdateCurrentViewer();
2786 #ifndef DISABLE_VTKVIEWER
2787 #ifndef DISABLE_SALOMEOBJECT
2788 viewManagers( SVTK_Viewer::Type(), lst );
2789 QListIterator<SUIT_ViewManager*> itVTK( lst );
2790 while ( itVTK.hasNext() && sz >= 0 )
2792 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2793 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2796 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2799 vtkVM->setTrihedronSize( sz, relative );
2807 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2809 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2810 QList<SUIT_ViewManager*> lst;
2811 #ifndef DISABLE_OCCVIEWER
2812 viewManagers( OCCViewer_Viewer::Type(), lst );
2813 QListIterator<SUIT_ViewManager*> itOCC( lst );
2814 while ( itOCC.hasNext() )
2816 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2817 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2820 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2823 occVM->setStaticTrihedronDisplayed( isVisible );
2827 #ifndef DISABLE_VTKVIEWER
2828 #ifndef DISABLE_SALOMEOBJECT
2829 viewManagers( SVTK_Viewer::Type(), lst );
2830 QListIterator<SUIT_ViewManager*> itVTK( lst );
2831 while ( itVTK.hasNext() )
2833 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2834 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2837 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2840 vtkVM->setStaticTrihedronVisible( isVisible );
2848 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2850 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2851 QList<SUIT_ViewManager*> lst;
2852 #ifndef DISABLE_OCCVIEWER
2853 viewManagers( OCCViewer_Viewer::Type(), lst );
2854 QListIterator<SUIT_ViewManager*> itOCC( lst );
2855 while ( itOCC.hasNext() )
2857 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2858 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2861 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2862 occVM->setInteractionStyle( mode );
2865 #ifndef DISABLE_VTKVIEWER
2866 #ifndef DISABLE_SALOMEOBJECT
2867 viewManagers( SVTK_Viewer::Type(), lst );
2868 QListIterator<SUIT_ViewManager*> itVTK( lst );
2869 while ( itVTK.hasNext() )
2871 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2872 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2875 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2876 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2882 #ifndef DISABLE_OCCVIEWER
2883 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2885 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2886 QList<SUIT_ViewManager*> lst;
2887 viewManagers( OCCViewer_Viewer::Type(), lst );
2888 QListIterator<SUIT_ViewManager*> it( lst );
2889 while ( it.hasNext() )
2891 SUIT_ViewModel* vm = it.next()->getViewModel();
2892 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2895 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2896 occVM->enablePreselection( isToEnablePreselection );
2901 #ifndef DISABLE_OCCVIEWER
2902 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2904 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2905 QList<SUIT_ViewManager*> lst;
2906 viewManagers( OCCViewer_Viewer::Type(), lst );
2907 QListIterator<SUIT_ViewManager*> it( lst );
2908 while ( it.hasNext() )
2910 SUIT_ViewModel* vm = it.next()->getViewModel();
2911 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2914 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2915 occVM->enableSelection( isToEnableSelection );
2920 #ifndef DISABLE_OCCVIEWER
2921 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
2923 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
2924 QList<SUIT_ViewManager*> lst;
2925 viewManagers( OCCViewer_Viewer::Type(), lst );
2926 QListIterator<SUIT_ViewManager*> it( lst );
2927 while ( it.hasNext() )
2929 SUIT_ViewModel* vm = it.next()->getViewModel();
2930 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2933 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2934 occVM->setClippingColor( aColor );
2939 #ifndef DISABLE_OCCVIEWER
2940 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
2941 param == QString( "clipping_texture" ) ||
2942 param == QString( "clipping_modulate" ) ||
2943 param == QString( "clipping_scale" ) ) )
2945 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
2946 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
2947 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
2948 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
2949 QList<SUIT_ViewManager*> lst;
2950 viewManagers( OCCViewer_Viewer::Type(), lst );
2951 QListIterator<SUIT_ViewManager*> it( lst );
2952 while ( it.hasNext() )
2954 SUIT_ViewModel* vm = it.next()->getViewModel();
2955 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2958 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2959 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
2964 #ifndef DISABLE_OCCVIEWER
2965 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
2967 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
2968 QList<SUIT_ViewManager*> lst;
2969 viewManagers( OCCViewer_Viewer::Type(), lst );
2970 QListIterator<SUIT_ViewManager*> it( lst );
2971 while ( it.hasNext() )
2973 SUIT_ViewModel* vm = it.next()->getViewModel();
2974 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2977 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2978 occVM->setProjectionType( mode );
2983 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2985 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2986 QList<SUIT_ViewManager*> lst;
2987 #ifndef DISABLE_OCCVIEWER
2988 viewManagers( OCCViewer_Viewer::Type(), lst );
2989 QListIterator<SUIT_ViewManager*> itOCC( lst );
2990 while ( itOCC.hasNext() )
2992 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2993 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2996 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2997 occVM->setZoomingStyle( mode );
3000 #ifndef DISABLE_VTKVIEWER
3001 #ifndef DISABLE_SALOMEOBJECT
3002 viewManagers( SVTK_Viewer::Type(), lst );
3003 QListIterator<SUIT_ViewManager*> itVTK( lst );
3004 while ( itVTK.hasNext() )
3006 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3007 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3010 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3011 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3017 #ifndef DISABLE_VTKVIEWER
3018 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3020 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3021 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3022 QList<SUIT_ViewManager*> lst;
3023 #ifndef DISABLE_SALOMEOBJECT
3024 viewManagers( SVTK_Viewer::Type(), lst );
3025 QListIterator<SUIT_ViewManager*> it( lst );
3026 while ( it.hasNext() )
3028 SUIT_ViewModel* vm = it.next()->getViewModel();
3029 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3032 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3033 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3039 #ifndef DISABLE_VTKVIEWER
3040 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3042 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3043 QList<SUIT_ViewManager*> lst;
3044 #ifndef DISABLE_SALOMEOBJECT
3045 viewManagers( SVTK_Viewer::Type(), lst );
3046 QListIterator<SUIT_ViewManager*> it( lst );
3047 while ( it.hasNext() )
3049 SUIT_ViewModel* vm = it.next()->getViewModel();
3050 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3053 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3054 if( vtkVM ) vtkVM->setProjectionMode( mode );
3060 #ifndef DISABLE_VTKVIEWER
3061 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3063 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3064 QList<SUIT_ViewManager*> lst;
3065 #ifndef DISABLE_SALOMEOBJECT
3066 viewManagers( SVTK_Viewer::Type(), lst );
3067 QListIterator<SUIT_ViewManager*> it( lst );
3068 while ( it.hasNext() )
3070 SUIT_ViewModel* vm = it.next()->getViewModel();
3071 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3074 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3075 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3081 #ifndef DISABLE_VTKVIEWER
3082 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3084 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3085 QList<SUIT_ViewManager*> lst;
3086 #ifndef DISABLE_SALOMEOBJECT
3087 viewManagers( SVTK_Viewer::Type(), lst );
3088 QListIterator<SUIT_ViewManager*> it( lst );
3089 while ( it.hasNext() )
3091 SUIT_ViewModel* vm = it.next()->getViewModel();
3092 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3095 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3096 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3102 #ifndef DISABLE_VTKVIEWER
3103 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3104 param == QString( "spacemouse_func2_btn" ) ||
3105 param == QString( "spacemouse_func5_btn" ) ) )
3107 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3108 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3109 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3110 QList<SUIT_ViewManager*> lst;
3111 #ifndef DISABLE_SALOMEOBJECT
3112 viewManagers( SVTK_Viewer::Type(), lst );
3113 QListIterator<SUIT_ViewManager*> it( lst );
3114 while ( it.hasNext() )
3116 SUIT_ViewModel* vm = it.next()->getViewModel();
3117 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3120 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3121 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3126 if( sec=="ObjectBrowser" )
3128 SUIT_DataBrowser* ob = objectBrowser();
3132 if ( param=="auto_size_first" )
3134 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3135 ob->setAutoSizeFirstColumn( autoSizeFirst );
3136 if ( autoSizeFirst )
3137 ob->adjustFirstColumnWidth();
3139 else if ( param=="auto_size" ) {
3140 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3141 ob->setAutoSizeColumns(autoSize);
3143 ob->adjustColumnsWidth();
3145 else if ( param=="resize_on_expand_item" ) {
3146 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3147 ob->setResizeOnExpandItem(resizeOnExpandItem);
3149 else if ( param == "auto_hide_search_tool" ) {
3150 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3156 if( param=="auto_save_interval" ) {
3157 myAutoSaveTimer->stop();
3158 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3159 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3163 #ifndef DISABLE_PYCONSOLE
3164 if( sec=="PyConsole" && pythonConsole() )
3166 if ( param=="font" ) {
3167 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3169 else if ( param=="show_banner" ) {
3170 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3177 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3179 if ( param == "visible_count" )
3180 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3181 else if ( param == "max_count" )
3182 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3183 else if ( param == "insert_mode" )
3184 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3185 else if ( param == "link_type" )
3186 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3187 else if ( param == "show_clear" )
3188 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3189 else if ( param == "show_mru" )
3190 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3193 if ( sec == "language" && param == "language" )
3195 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3197 if ( sec == "language" && param == "locale")
3199 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3201 if ( sec == "desktop" && param == "opaque_resize" ) {
3202 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3203 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3204 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3205 else dopts &= ~QMainWindow::AnimatedDocks;
3206 desktop()->setDockOptions( dopts );
3207 desktop()->setOpaqueResize( opaqueResize );
3208 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3209 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3212 #ifndef DISABLE_PLOT2DVIEWER
3213 QList<SUIT_ViewManager*> lst;
3214 viewManagers( Plot2d_Viewer::Type(), lst );
3215 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3216 while ( itPlot2d.hasNext() ) {
3217 SUIT_ViewManager* viewMgr = itPlot2d.next();
3218 SUIT_ViewModel* vm = viewMgr->getViewModel();
3219 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3222 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3224 viewMgr->setViewModel( vm );
3225 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3227 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3228 frame->SetPreference();
3233 #ifndef DISABLE_PYVIEWER
3234 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3235 param == QString( "LineNumberArea" ) ||
3236 param == QString( "TextWrapping" ) ||
3237 param == QString( "CenterCursorOnScroll" ) ||
3238 param == QString( "TabSpaceVisible" ) ||
3239 param == QString( "TabSize" ) ||
3240 param == QString( "VerticalEdge" ) ||
3241 param == QString( "NumberColumns" ) ||
3242 param == QString( "Font" ) ) )
3244 QList<SUIT_ViewManager*> lst;
3245 viewManagers( PyViewer_Viewer::Type(), lst );
3246 QListIterator<SUIT_ViewManager*> itPy( lst );
3247 while ( itPy.hasNext() )
3249 SUIT_ViewManager* viewMgr = itPy.next();
3250 SUIT_ViewModel* vm = viewMgr->getViewModel();
3251 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3254 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3256 viewMgr->setViewModel( vm );
3257 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3260 pyView->setPreferences();
3270 void LightApp_Application::loadPreferences()
3272 CAM_Application::loadPreferences();
3274 SUIT_ResourceMgr* aResMgr = resourceMgr();
3279 static bool mru_load = true;
3282 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3284 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3285 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3286 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3287 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3288 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3289 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3290 mru->loadLinks( aResMgr, "MRU" );
3296 QStringList mods = aResMgr->parameters( "windows_visibility" );
3297 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3300 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3301 myWinVis.insert( *itr, arr );
3305 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3306 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3307 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3308 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3309 else dopts &= ~QMainWindow::AnimatedDocks;
3310 desktop()->setDockOptions( dopts );
3311 desktop()->setOpaqueResize( opaqueResize );
3312 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3313 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3320 void LightApp_Application::savePreferences()
3322 CAM_Application::savePreferences();
3324 saveDockWindowsState();
3326 SUIT_ResourceMgr* aResMgr = resourceMgr();
3331 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3333 mru->saveLinks( aResMgr, "MRU" );
3335 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3336 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3339 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3341 #if GUI_DEVELOPMENT > 0
3342 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3344 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3351 Updates desktop title
3353 void LightApp_Application::updateDesktopTitle()
3355 QString aTitle = applicationName();
3356 QString aVer = applicationVersion();
3357 if ( !aVer.isEmpty() )
3358 aTitle += QString( " " ) + aVer;
3360 if ( activeStudy() ) {
3361 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3362 aTitle += QString( " - [%1]" ).arg( sName );
3365 desktop()->setWindowTitle( aTitle );
3369 \brief Get map of the operations which can be performed
3370 on the module activation.
3372 The method should return the map of the kind \c {<id>:<name>}
3373 where \c <id> is an integer identifier of the operation and
3374 \c <name> is a title for the button to be added to the
3375 dialog box. After user selects the required operation by the
3376 clicking the corresponding button in the dialog box, its identifier
3377 is passed to the moduleActionSelected() method to process
3380 \return map of the operations
3381 \sa moduleActionSelected()
3383 QMap<int, QString> LightApp_Application::activateModuleActions() const
3385 QMap<int, QString> opmap;
3386 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3387 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3392 \brief Called when the used selectes required operation chosen
3393 from "Activate module" dialog box.
3395 Performs the required operation according to the user choice.
3397 \param id operation identifier
3398 \sa activateModuleActions()
3400 void LightApp_Application::moduleActionSelected( const int id )
3415 Updates windows after close document
3417 void LightApp_Application::afterCloseDoc()
3421 CAM_Application::afterCloseDoc();
3425 Updates actions of active module
3427 void LightApp_Application::updateModuleActions()
3430 if ( activeModule() ) {
3431 modName = activeModule()->moduleName();
3432 if ( !isModuleAccessible( modName ) ) {
3433 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3434 foreach( SUIT_Application* app, apps ) {
3435 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3436 if ( lapp && lapp != this )
3437 lapp->removeModuleAction( modName );
3442 LightApp_ModuleAction* moduleAction =
3443 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3445 moduleAction->setActiveModule( modName );
3448 void LightApp_Application::removeModuleAction( const QString& modName )
3450 LightApp_ModuleAction* moduleAction =
3451 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3453 moduleAction->removeModule( modName );
3457 Gets current windows.
3458 \param winMap - output current windows map.
3460 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3463 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3464 ((LightApp_Module*)activeModule())->windows( winMap );
3466 defaultWindows( winMap );
3470 Gets current view managers.
3471 \param lst - output current view managers list.
3473 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3476 if ( !activeStudy() )
3479 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3480 ((LightApp_Module*)activeModule())->viewManagers( lst );
3482 defaultViewManagers( lst );
3488 void LightApp_Application::updateWindows()
3490 QMap<int, int> winMap;
3491 currentWindows( winMap );
3493 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3495 if ( !dockWindow( it.key() ) )
3496 getWindow( it.key() );
3499 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3501 QWidget* wid = it.value();
3502 if ( winMap.contains( it.key() ) )
3503 wid->setVisible( true );
3508 loadDockWindowsState();
3512 Updates view managers
3514 void LightApp_Application::updateViewManagers()
3517 currentViewManagers( lst );
3519 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3520 getViewManager( *it, true );
3524 Loads windows geometry
3526 void LightApp_Application::loadDockWindowsState()
3530 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3531 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3532 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3535 if ( activeModule() )
3536 modName = activeModule()->name();
3537 else if ( activeStudy() )
3538 modName = "nomodule";
3540 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3541 QByteArray aDefaultState;
3542 aResMgr->value( "windows_geometry", modName, aDefaultState );
3543 QByteArray aDefaultVisibility;
3544 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3545 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3546 aResMgr->setWorkingMode( prevMode );
3548 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3551 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3552 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3554 if ( version > Qtx::versionToId( "7.4.1" ) )
3555 aResMgr->value( "windows_geometry", modName , arr );
3557 arr = aDefaultState;
3558 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3559 desktop()->restoreState( aTargetArray );
3562 QStringList mainToolbarsNames;
3563 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3564 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3565 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3567 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3570 QMap<QString, bool> *tbMap = 0;
3571 QMap<QString, bool> *dwMap = 0;
3573 QMap<QString, bool> userTbMap, userDwMap;
3574 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3576 QMap<QString, bool> defaultTbMap, defaultDwMap;
3577 if(hasDefaultVisibility) {
3578 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3584 if(hasDefaultVisibility){
3585 tbMap = &defaultTbMap;
3592 if(hasDefaultVisibility){
3593 dwMap = &defaultDwMap;
3598 QList<QToolBar*> tbList = findToolBars();
3599 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3601 QToolBar* tb = *tit;
3602 if ( tbMap->contains( tb->objectName() ) ) {
3603 tb->setVisible( (*tbMap)[tb->objectName()] );
3609 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3610 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3612 QDockWidget* dw = *dit;
3614 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3615 if ( po != desktop() )
3618 if ( dwMap->contains( dw->objectName() ) )
3619 dw->setVisible( (*dwMap)[dw->objectName()] );
3627 Saves windows geometry
3629 void LightApp_Application::saveDockWindowsState()
3634 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3635 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3637 if( !storeWin && !storeTb )
3641 if ( activeModule() )
3642 modName = activeModule()->name();
3643 else if ( activeStudy() )
3644 modName = "nomodule";
3646 QString versionId = GUI_VERSION_STR;
3647 #if GUI_DEVELOPMENT > 0
3651 QByteArray arr = desktop()->saveState();
3652 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3653 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3656 if ( myWinVis.contains( modName ) )
3657 visArr = myWinVis[modName];
3659 QMap<QString, bool> tbMap, dwMap;
3660 dockWindowsState( visArr, tbMap, dwMap );
3662 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3663 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3666 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3669 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3670 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3672 QDockWidget* wid = *it;
3673 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3676 visArr = dockWindowsState( tbMap, dwMap );
3678 myWinVis.insert( modName, visArr );
3681 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3684 QDataStream stream( &visArr, QIODevice::WriteOnly );
3686 stream << (uchar)ToolBarMarker;
3687 stream << tb.size();
3688 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3690 stream << tit.key();
3691 stream << (uchar)( tit.value() ? 1 : 0 );
3694 stream << (uchar)DockWidgetMarker;
3695 stream << dw.size();
3696 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3698 stream << wit.key();
3699 stream << (uchar)( wit.value() ? 1 : 0 );
3705 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3710 QByteArray visArr = arr;
3711 QDataStream stream( &visArr, QIODevice::ReadOnly );
3715 if ( marker != ToolBarMarker )
3720 for ( int i = 0; i < lines; ++i )
3723 stream >> objectName;
3726 tb.insert( objectName, shown );
3730 if ( marker != DockWidgetMarker )
3734 for ( int j = 0; j < lines; ++j )
3737 stream >> objectName;
3740 dw.insert( objectName, shown );
3745 Adds icon names for modules
3747 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3751 SUIT_ResourceMgr* resMgr = resourceMgr();
3755 QStringList modList;
3756 modules( modList, false );
3758 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3760 QString modName = *it;
3761 QString modIntr = moduleName( modName );
3762 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3764 if ( modIcon.isEmpty() )
3767 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3768 modIcon += QString( ".png" );
3770 iconMap.insert( modName, modIcon );
3775 Inserts items in popup, which necessary for current application
3777 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3780 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3781 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3782 selMgr->setSelectionCacheEnabled( true );
3784 SUIT_DataBrowser* ob = objectBrowser();
3786 CAM_Application::contextMenuPopup( type, thePopup, title );
3788 if ( ob && type == ob->popupClientType() ) {
3789 thePopup->addSeparator();
3790 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3791 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3792 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3795 #ifndef DISABLE_SALOMEOBJECT
3796 if ( selMgr && ob ) {
3797 SALOME_ListIO selected;
3798 selMgr->selectedObjects( selected );
3799 if(selected.Extent() == 1){
3800 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3801 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3802 if(obj && obj->renameAllowed()) {
3803 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3804 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3805 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3806 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3808 QList<QAction*> acts = thePopup->actions();
3809 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3810 thePopup->insertAction(firstAction,a);
3816 selMgr->setSelectionCacheEnabled( cacheIsOn );
3822 void LightApp_Application::createEmptyStudy()
3824 CAM_Application::createEmptyStudy();
3826 if ( objectBrowser() )
3827 objectBrowser()->updateTree();
3829 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3830 if ( aResMgr && activeStudy() ) {
3831 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3832 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3837 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3839 CAM_Application::setDesktop( desk );
3842 connect( desk, SIGNAL( message( const QString& ) ),
3843 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3844 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3845 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3851 \param mod - module to be activated
3853 bool LightApp_Application::activateModule( CAM_Module* mod )
3855 bool res = CAM_Application::activateModule( mod );
3857 if ( objectBrowser() )
3858 objectBrowser()->updateTree();
3864 \return keyborad accelerators manager object
3866 SUIT_Accel* LightApp_Application::accel() const
3872 Removes dead widget container from map
3874 void LightApp_Application::onWCDestroyed( QObject* ob )
3876 // remove destroyed widget container from windows map
3877 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3879 if ( itr.value() != ob )
3882 int key = itr.key();
3883 myWin.remove( key );
3888 void LightApp_Application::onMRUActivated( const QString& name )
3890 SUIT_Session* s = SUIT_Session::session();
3891 if ( s && s->activeApplication() == this )
3895 void LightApp_Application::onStylePreferences()
3897 Style_PrefDlg dlg( desktop() );
3900 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3903 void LightApp_Application::onFullScreen(){
3904 if(myScreenHelper) {
3905 if(desktop()->isFullScreen())
3906 myScreenHelper->switchToNormalScreen();
3908 myScreenHelper->switchToFullScreen();
3913 Connects just added view manager
3915 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3917 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3918 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3919 CAM_Application::addViewManager( vm );
3923 Remove view manager from memory
3925 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3927 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3928 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3929 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3931 aStudy->removeObjectProperties( vm->getGlobalId() );
3933 CAM_Application::removeViewManager( vm );
3935 LightApp_SelectionMgr* selMgr = selectionMgr();
3936 QList<SUIT_Selector*> selectors;
3937 selMgr->selectors( selectors );
3938 foreach( SUIT_Selector* selector, selectors ) {
3939 if ( selector->owner() == vm->getViewModel() ) {
3944 // IPAL22894: Crash on closing OCC view
3950 Renames active window of desktop
3952 void LightApp_Application::onRenameWindow()
3957 QWidget* w = desktop()->activeWindow();
3962 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3963 if( ok && !name.isEmpty() )
3964 w->setWindowTitle( name );
3968 Closes active window of desktop
3970 void LightApp_Application::onCloseWindow()
3975 QWidget* w = desktop()->activeWindow();
3983 Closes all windows of desktop
3985 void LightApp_Application::onCloseAllWindow()
3987 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3991 QList<SUIT_ViewWindow*> wndList = desk->windows();
3992 SUIT_ViewWindow* wnd;
3993 foreach( wnd, wndList )
4001 Groups all windows of desktop
4003 void LightApp_Application::onGroupAllWindow()
4005 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4009 QtxWorkstack* wgStack = desk->workstack();
4015 \return if the library of module exists
4016 \param moduleTitle - title of module
4018 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4020 if( moduleTitle.isEmpty() )
4023 QString lib = moduleLibrary( moduleTitle );
4025 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4026 bool isPythonModule = lib.contains("SalomePyQtGUI");
4027 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4031 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4033 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4036 bool isLibFound = false;
4037 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4038 for( ; anIt!=aLast; anIt++ )
4040 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4051 INFOS( "\n****************************************************************" << std::endl
4052 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4053 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4054 << "****************************************************************" << std::endl );
4056 else if ( !isPythonModule && !isPythonLightModule)
4059 if ( isPythonModule || isPythonLightModule)
4061 QString pylib = moduleName( moduleTitle ) + QString(".py");
4062 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4064 // Check the python library
4066 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4068 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4070 bool isPyLib = false, isPyGuiLib = false;
4071 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4072 for( ; anIt!=aLast; anIt++ )
4074 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4075 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4077 if(!isPythonLightModule)
4078 if( !isPyLib && inf.exists() )
4081 if( !isPyGuiLib && infgui.exists() )
4084 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4088 printf( "\n****************************************************************\n" );
4089 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4091 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4093 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4094 printf( "****************************************************************\n" );
4101 \return default name for an active study
4103 void LightApp_Application::setDefaultStudyName( const QString& theName )
4105 QStringList anInfoList;
4106 modules( anInfoList, false );
4108 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4109 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4110 !aStudy->isSaved() )
4112 aStudy->setStudyName( theName );
4113 updateDesktopTitle();
4118 Custom event handler
4120 bool LightApp_Application::event( QEvent* e )
4122 if( e && e->type()==2000 )
4124 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4125 QString* d = ( QString* )ce->data();
4126 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4128 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4129 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4130 showPreferences( tr( "PREF_APP" ) );
4135 return CAM_Application::event( e );
4138 /*! Check data object */
4139 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4143 bool isSuitable = !theObj->entry().isEmpty() &&
4144 !theObj->componentDataType().isEmpty() &&
4145 !theObj->name().isEmpty();
4152 int LightApp_Application::openChoice( const QString& aName )
4154 int choice = CAM_Application::openChoice( aName );
4156 if ( choice == OpenExist ) // The document is already open.
4158 // Do you want to reload it?
4159 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4160 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4161 choice = OpenReload;
4167 bool LightApp_Application::openAction( const int choice, const QString& aName )
4174 STD_Application* app = 0;
4175 SUIT_Session* session = SUIT_Session::session();
4176 QList<SUIT_Application*> appList = session->applications();
4177 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4179 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4180 app = ::qobject_cast<STD_Application*>( *it );
4185 app->onCloseDoc( false );
4186 appList = session->applications();
4187 STD_Application* other = 0;
4188 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4189 other = ::qobject_cast<STD_Application*>( *it );
4192 res = other->onOpenDoc( aName );
4197 res = CAM_Application::openAction( choice, aName );
4204 QStringList LightApp_Application::viewManagersTypes() const
4206 QStringList aTypesList;
4207 aTypesList += myUserWmTypes;
4208 #ifndef DISABLE_GLVIEWER
4209 aTypesList<<GLViewer_Viewer::Type();
4211 #ifndef DISABLE_PLOT2DVIEWER
4212 aTypesList<<Plot2d_Viewer::Type();
4214 #ifndef DISABLE_QXGRAPHVIEWER
4215 aTypesList<<QxScene_Viewer::Type();
4217 #ifndef DISABLE_PVVIEWER
4218 aTypesList<<PVViewer_Viewer::Type();
4220 #ifndef DISABLE_PYVIEWER
4221 aTypesList<<PyViewer_Viewer::Type();
4223 #ifndef DISABLE_OCCVIEWER
4224 aTypesList<<OCCViewer_Viewer::Type();
4226 #ifndef DISABLE_VTKVIEWER
4227 #ifndef DISABLE_SALOMEOBJECT
4228 aTypesList<<SVTK_Viewer::Type();
4230 aTypesList<<VTKViewer_Viewer::Type();
4236 * Removes all view managers of known types
4237 * Other view managers are ignored
4239 void LightApp_Application::clearKnownViewManagers()
4241 QStringList aTypesList = viewManagersTypes();
4242 QList<SUIT_ViewManager*> aMgrList;
4243 viewManagers( aMgrList );
4244 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4245 if (aTypesList.contains(aMgr->getType()))
4246 removeViewManager(aMgr);
4251 Copy of current selection
4253 void LightApp_Application::onCopy()
4255 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4261 Paste of current data in clipboard
4263 void LightApp_Application::onPaste()
4265 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4271 Browse (i.e. set focus on) the published objects
4272 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4273 has been accepted by Ok (or Apply & Close) button
4274 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4275 (to select the first published object only)
4276 \return entry of the selected object
4278 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4279 const bool theIsApplyAndClose,
4280 const bool theIsOptimizedBrowsing )
4283 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4285 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4286 switch( aBrowsePolicy )
4290 case BP_ApplyAndClose:
4291 if( !theIsApplyAndClose )
4299 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4303 SUIT_DataBrowser* anOB = objectBrowser();
4307 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4311 QStringListIterator anIter( theEntryList );
4312 if( theIsOptimizedBrowsing )
4314 // go to the last entry
4316 if( anIter.hasPrevious() )
4320 // scroll to each entry in the list
4321 // (in optimized mode - to the last entry only)
4323 LightApp_DataObject* anObject = 0;
4324 while( anIter.hasNext() )
4326 anEntry = anIter.next();
4327 if( !anEntry.isEmpty() )
4329 anObject = aStudy->findObjectByEntry( anEntry );
4332 QModelIndex anIndex = aModel->index( anObject );
4333 anOB->treeView()->scrollTo( anIndex );
4338 // always select the last object
4339 if( anObject && !anEntry.isEmpty() )
4341 QList<SUIT_Selector*> aSelectorList;
4342 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4343 if( !aSelectorList.isEmpty() )
4345 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4347 bool anIsAutoBlock = aSelector->autoBlock();
4349 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4350 aSelector->setAutoBlock( false );
4352 SUIT_DataOwnerPtrList aList;
4353 #ifndef DISABLE_SALOMEOBJECT
4354 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4355 ( anObject->entry().toLatin1().constData(),
4356 anObject->componentDataType().toLatin1().constData(),
4357 anObject->name().toLatin1().constData() );
4358 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4360 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4363 aList.append( owner );
4364 selectionMgr()->setSelected( aList );
4367 // restore auto block flag
4368 aSelector->setAutoBlock( anIsAutoBlock );
4376 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4378 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4379 return study ? study->findObjectByEntry( id ) : 0;
4383 Checks that an object can be renamed.
4384 \param entry entry of the object
4385 \brief Return \c true if object can be renamed
4387 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4392 Rename object by entry.
4393 \param entry entry of the object
4394 \param name new name of the object
4395 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4397 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4401 /*! Process standard messages from desktop */
4402 void LightApp_Application::onDesktopMessage( const QString& message )
4404 const QString sectionSeparator = "/";
4406 if ( message.toLower() == "updateobjectbrowser" ||
4407 message.toLower() == "updateobjbrowser" ) {
4408 // update object browser
4409 updateObjectBrowser();
4411 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4412 QString vtype = message.split( sectionSeparator ).last();
4413 if ( !vtype.isEmpty() )
4414 getViewManager( vtype, true );
4417 QStringList data = message.split( sectionSeparator );
4418 if ( data.count() > 1 ) {
4419 QString msgType = data[0].trimmed();
4420 LightApp_Module* sMod = 0;
4421 CAM_Module* mod = module( msgType );
4423 mod = module( moduleTitle( msgType ) );
4424 if ( mod && mod->inherits( "LightApp_Module" ) )
4425 sMod = (LightApp_Module*)mod;
4427 if ( msgType.toLower() == "preferences" ) {
4428 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4429 // for example "preferences/Study/multi_file_dump/true"
4430 if ( data.count() > 3 ) {
4431 QString section = data[1].trimmed();
4432 QString param = data[2].trimmed();
4433 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4434 resourceMgr()->setValue( section, param, value );
4438 // received message for the module
4439 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4440 sMod->message( msg );
4448 Returns all top level toolbars.
4449 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4451 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4453 QList<QToolBar*> aResult;
4454 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4455 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4456 QToolBar* tb = *tit;
4457 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4458 if ( po != desktop() )
4460 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4467 Internal method to parse toolbars and dockable windows state.
4469 QByteArray LightApp_Application::processState(QByteArray& input,
4470 const bool processWin,
4471 const bool processTb,
4472 const bool isRestoring,
4473 QByteArray defaultState) {
4476 bool hasDefaultState = !defaultState.isEmpty();
4477 bool isDockWinWriten = false;
4479 //Write date from users settings
4481 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4482 int marker, version;
4484 tmpInputData >> marker;
4485 tmpInputData >> version;
4486 tmpInputData >> dockmarker;
4487 tmpInputData >> nbDocWin;
4489 if(processWin && processTb && !isRestoring) {
4491 } else if(!processWin && !processTb ) {
4493 aRes = defaultState;
4495 QDataStream aData(&aRes, QIODevice::WriteOnly);
4496 QList<QToolBar*> aToolBars = findToolBars();
4499 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4500 QToolBar* tb = *tit;
4501 aNames.append(tb->objectName());
4504 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4505 if(toolBarMarkerIndex < 0)
4507 QDataStream anInputData(&input, QIODevice::ReadOnly);
4509 int toolBarMarkerIndexDef;
4510 if(hasDefaultState) {
4511 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4512 if(toolBarMarkerIndexDef < 0)
4515 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4517 QDataStream* aTargetData = 0;
4518 int aTargetIndex = -1;
4520 QByteArray currentArr = desktop()->saveState();
4521 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4522 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4523 if(processWin && useInputData) {
4524 aTargetData = &anInputData;
4525 aTargetIndex = toolBarMarkerIndex;
4527 //Write date from default settings
4528 if(hasDefaultState) {
4529 aTargetData = &anInputDataDef;
4530 aTargetIndex = toolBarMarkerIndexDef;
4532 //If no default state, write current snapshot of the dockable windows
4534 aTargetData = &anInputDataCur;
4535 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4536 aTargetIndex = toolBarMarkerIndexCur;
4541 if(aTargetData && aTargetIndex >= 0 ) {
4542 aTargetData->device()->seek(0);
4543 while( aTargetData->device()->pos() < aTargetIndex ) {
4548 isDockWinWriten = true;
4555 aTargetData = &anInputData;
4556 aTargetIndex = toolBarMarkerIndex;
4558 if(hasDefaultState) {
4559 aTargetData = &anInputDataDef;
4560 aTargetIndex = toolBarMarkerIndexDef;
4564 if(aTargetData && aTargetIndex >= 0) {
4566 if(!isDockWinWriten ) {
4567 //Write version marker
4568 int marker, version;
4569 aTargetData->device()->seek(0);
4570 *aTargetData >> marker;
4571 *aTargetData >> version;
4574 aData << (uchar) QDockWidgetMarker;
4576 int shift = 4*sizeof(int) + sizeof(QSize);
4577 index = aTargetIndex - shift;
4579 index = aTargetIndex;
4582 aTargetData->device()->seek(index);
4583 while(!aTargetData->atEnd()) {
4588 } else { // Not treat toolbars
4589 aData << (uchar) QToolBarMarker;
4590 aData << (int) 0; //Nb toolbars = 0
4597 \brief Emits operationFinished signal.
4598 \param theModuleName the name of the module which perfomed the operation
4599 \param theOperationName the operation name
4600 \param theEntryList the list of the created objects entries
4602 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4603 const QString& theOperationName,
4604 const QStringList& theEntryList )
4606 emit operationFinished( theModuleName, theOperationName, theEntryList );
4610 Update visibility state of given objects
4612 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4613 SUIT_ViewModel* theViewModel )
4615 if ( !theViewModel || theList.isEmpty() ) return;
4617 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4618 if ( !aStudy ) return;
4620 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4622 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4623 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4625 if ( !obj || aStudy->isComponent( obj->entry() ) )
4628 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4629 if ( anObjModule ) {
4630 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4632 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4633 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4634 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4635 anObjState = Qtx::ShownState;
4637 anObjState = Qtx::HiddenState;
4639 aStudy->setVisibilityState( obj->entry(), anObjState );
4646 * Called when window activated
4648 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4650 SUIT_DataBrowser* anOB = objectBrowser();
4653 SUIT_DataObject* rootObj = anOB->root();
4657 DataObjectList listObj = rootObj->children( true );
4659 SUIT_ViewModel* vmod = 0;
4660 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4661 vmod = vman->getViewModel();
4662 updateVisibilityState( listObj, vmod );
4666 Called then view manager removed
4668 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4670 ViewManagerList lst;
4671 viewManagers( lst );
4672 if ( lst.count() == 1) { // in case if closed last view window
4673 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4675 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4680 Check existing document.
4682 bool LightApp_Application::checkExistingDoc()
4685 if( activeStudy() ) {
4686 int answer = SUIT_MessageBox::question( desktop(),
4687 tr( "APPCLOSE_CAPTION" ),
4688 tr( "STUDYCLOSE_DESCRIPTION" ),
4689 tr( "APPCLOSE_SAVE" ),
4690 tr( "APPCLOSE_CLOSE" ),
4691 tr( "APPCLOSE_CANCEL" ), 0 );
4693 if ( activeStudy()->isSaved() ) {
4696 } else if ( onSaveAsDoc() ) {
4697 if( !closeDoc( false ) ) {
4704 else if( answer == 1 ) {
4706 } else if( answer == 2 ) {
4713 #ifndef DISABLE_PYCONSOLE
4715 PyConsole_Interp* LightApp_Application::getPyInterp()
4717 static PyConsole_Interp* myInterp = 0;
4719 myInterp = createPyInterp();
4723 PyConsole_Interp* LightApp_Application::createPyInterp()
4725 return new LightApp_PyInterp();
4728 #endif // DISABLE_PYCONSOLE