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() ) {
516 if ( objectBrowser()->root() != activeStudy()->root() )
517 objectBrowser()->setRoot( activeStudy()->root() );
518 updateObjectBrowser( true );
523 /*!Gets selection manager.*/
524 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
529 /*!Creat action "New window" for certain type of viewer:*/
530 void LightApp_Application::createActionForViewer( const int id,
532 const QString& suffix,
535 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
536 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
537 QAction* a = createAction( id, // menu action id
544 false, // toggle flag
546 SLOT( onNewWindow() ) ); // slot
547 createMenu( a, parentId, -1 );
552 void LightApp_Application::createActions()
554 CAM_Application::createActions();
556 SUIT_Desktop* desk = desktop();
557 SUIT_ResourceMgr* resMgr = resourceMgr();
560 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
561 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
562 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
566 // - Help for modules
568 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
569 createMenu( separator(), helpMenu, -1, 10 );
570 QStringList aModuleList;
571 modules( aModuleList, false );
572 aModuleList.prepend( "GUI" );
573 aModuleList.prepend( "KERNEL" );
575 int id = LightApp_Application::UserID + FIRST_HELP_ID;
578 foreach( aModule, aModuleList ) {
579 if ( aModule.isEmpty() ) // module title (user name)
581 IMap <QString, QString> helpData; // list of help files for the module
582 QString helpSubMenu; // help submenu name (empty if not needed)
583 QString modName = moduleName( aModule ); // module name
584 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
585 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
586 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
588 if (resMgr->hasValue( modName, "documentation" ) )
589 docSection = resMgr->stringValue(modName, "documentation");
590 else if ( resMgr->hasSection( modName + "_documentation" ) )
591 docSection = modName + "_documentation";
592 if ( !docSection.isEmpty() ) {
593 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
594 QStringList listOfParam = resMgr->parameters( docSection );
595 foreach( QString paramName, listOfParam ) {
596 QString valueStr = resMgr->stringValue( docSection, paramName );
597 if ( !valueStr.isEmpty() ) {
598 QFileInfo fi( valueStr );
599 if ( fi.isRelative() && !modDir.isEmpty() )
600 valueStr = Qtx::addSlash( modDir ) + valueStr;
601 if ( QFile::exists( valueStr ) )
602 helpData.insert( paramName.arg( aModule ), valueStr );
607 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
608 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
609 QString indexFile = idxLst.join( QDir::separator() ); // index file
610 if ( QFile::exists( indexFile ) )
611 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
614 IMapConstIterator<QString, QString > fileIt;
615 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
616 QString helpFileName = fileIt.key();
617 // remove all '//' occurances
618 while ( helpFileName.contains( "//" ) )
619 helpFileName.replace( "//", "" );
620 // obtain submenus hierarchy if given
621 QStringList smenus = helpFileName.split( "/" );
622 helpFileName = smenus.last();
624 QAction* a = createAction( id, helpFileName,
625 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
626 helpFileName, helpFileName,
627 0, desk, false, this, SLOT( onHelpContentsModule() ) );
628 a->setData( fileIt.value() );
629 if ( !helpSubMenu.isEmpty() ) {
630 smenus.prepend( helpSubMenu );
632 // create sub-menus hierarchy
633 int menuId = helpMenu;
634 foreach ( QString subMenu, smenus ) {
635 menuId = createMenu( subMenu, menuId, -1, 0 );
637 createMenu( a, menuId, -1, 0 );
642 // - Additional help items
644 createMenu( separator(), helpMenu, -1, 5 );
646 QStringList addHelpItems = resMgr->parameters( "add_help" );
647 foreach ( QString addHelpItem, addHelpItems ) {
648 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
649 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
650 QAction* a = createAction( id, addHelpItem,
651 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
652 addHelpItem, addHelpItem,
653 0, desk, false, this, SLOT( onHelpContentsModule() ) );
654 a->setData( valueStr );
655 createMenu( a, helpMenu, -1, 5 );
661 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
662 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
663 registerAction( MRUId, mru );
665 // default icon for neutral point ('SALOME' module)
666 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
667 if ( defIcon.isNull() )
668 defIcon = QPixmap( imageEmptyIcon );
670 //! default icon for any module
671 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
672 if ( modIcon.isNull() )
673 modIcon = QPixmap( imageEmptyIcon );
676 modules( modList, false );
678 if ( modList.count() > 1 )
680 LightApp_ModuleAction* moduleAction =
681 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
683 QMap<QString, QString> iconMap;
684 moduleIconNames( iconMap );
686 const int iconSize = 20;
688 QStringList::Iterator it;
689 for ( it = modList.begin(); it != modList.end(); ++it )
691 if ( !isLibExists( *it ) )
694 QString modName = moduleName( *it );
696 if ( !isModuleAccessible( *it ) )
700 if ( iconMap.contains( *it ) )
701 iconName = iconMap[*it];
703 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
707 INFOS ( "\n****************************************************************" << std::endl
708 << "* Icon for " << (*it).toLatin1().constData()
709 << " not found. Using the default one." << std::endl
710 << "****************************************************************" << std::endl );
713 icon = Qtx::scaleIcon( icon, iconSize );
715 moduleAction->insertModule( *it, icon );
718 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
719 this, SLOT( onModuleActivation( const QString& ) ) );
720 registerAction( ModulesListId, moduleAction );
724 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
725 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
727 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
728 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
729 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
730 0, desk, false, this, SLOT( onCloseAllWindow() ) );
731 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
732 0, desk, false, this, SLOT( onGroupAllWindow() ) );
734 createMenu( CloseId, windowMenu, 0, -1 );
735 createMenu( CloseAllId, windowMenu, 0, -1 );
736 createMenu( GroupAllId, windowMenu, 0, -1 );
737 createMenu( separator(), windowMenu, -1, 0 );
739 #ifndef DISABLE_GLVIEWER
740 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
742 #ifndef DISABLE_PLOT2DVIEWER
743 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
745 #ifndef DISABLE_OCCVIEWER
746 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
748 #ifndef DISABLE_VTKVIEWER
749 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
751 #ifndef DISABLE_QXGRAPHVIEWER
752 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
754 #ifndef DISABLE_GRAPHICSVIEW
755 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
757 #ifndef DISABLE_PVVIEWER
758 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
760 #ifndef DISABLE_PYVIEWER
761 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
764 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
765 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
766 createMenu( RenameId, windowMenu, -1 );
768 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
769 createMenu( PreferencesId, fileMenu, 50, -1 );
770 createMenu( separator(), fileMenu, -1, 50, -1 );
772 createMenu( separator(), fileMenu, -1, 100, -1 );
773 createMenu( MRUId, fileMenu, 100, -1 );
774 createMenu( separator(), fileMenu, -1, 100, -1 );
776 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
777 0, desk, false, this, SLOT( onStylePreferences() ) );
779 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
780 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
783 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
784 createMenu( separator(), viewMenu, -1, 20, -1 );
785 createMenu( StyleId, viewMenu, 20, -1 );
786 createMenu( FullScreenId, viewMenu, 20, -1 );
788 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
789 QString( "SalomeModules" ) ); // name (language-independant)
790 createTool( ModulesListId, modTBar );
793 /*!On module activation action.*/
794 void LightApp_Application::onModuleActivation( const QString& modName )
796 // Force user to create/open a study before module activation
797 QMap<QString, QString> iconMap;
798 moduleIconNames( iconMap );
799 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
801 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
803 bool cancelled = false;
805 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
806 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
807 QMap<int, QString> opmap = activateModuleActions();
808 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
809 aDlg.addButton( it.value(), it.key() );
811 int res = aDlg.exec();
813 // some operation is selected
814 moduleActionSelected( res );
818 putInfo( tr("INF_CANCELLED") );
820 LightApp_ModuleAction* moduleAction =
821 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
823 moduleAction->setActiveModule( QString() );
829 activateModule( modName );
832 /*!Default module activation.*/
833 QString LightApp_Application::defaultModule() const
835 QStringList aModuleNames;
836 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
837 //! If there's the one and only module --> activate it automatically
838 //! TODO: Possible improvement - default module can be taken from preferences
839 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
842 /*!On new window slot.*/
843 void LightApp_Application::onNewWindow()
845 const QObject* obj = sender();
846 if ( !obj || !obj->inherits( "QAction" ) )
850 int id = actionId( (QAction*)obj );
853 #ifndef DISABLE_GLVIEWER
855 type = GLViewer_Viewer::Type();
858 #ifndef DISABLE_PLOT2DVIEWER
860 type = Plot2d_Viewer::Type();
863 #ifndef DISABLE_OCCVIEWER
865 type = OCCViewer_Viewer::Type();
868 #ifndef DISABLE_VTKVIEWER
870 type = VTKViewer_Viewer::Type();
873 #ifndef DISABLE_QXGRAPHVIEWER
874 case NewQxSceneViewId:
875 type = QxScene_Viewer::Type();
878 #ifndef DISABLE_GRAPHICSVIEW
879 case NewGraphicsViewId:
880 type = GraphicsView_Viewer::Type();
883 #ifndef DISABLE_PVVIEWER
885 type = PVViewer_Viewer::Type();
888 #ifndef DISABLE_PYVIEWER
890 type = PyViewer_Viewer::Type();
895 if ( !type.isEmpty() )
896 createViewManager( type );
900 SLOT: Creates new document
902 void LightApp_Application::onNewDoc()
904 #ifdef SINGLE_DESKTOP
905 if ( !checkExistingDoc() )
909 //asl: fix for 0020515
910 saveDockWindowsState();
912 CAM_Application::onNewDoc();
916 SLOT: Opens new document
918 void LightApp_Application::onOpenDoc()
920 SUIT_Study* study = activeStudy();
922 #ifdef SINGLE_DESKTOP
923 if ( !checkExistingDoc() )
927 CAM_Application::onOpenDoc();
929 if ( !study ) // new study will be create in THIS application
932 updateViewManagers();
937 SLOT: Opens new document.
938 \param aName - name of file
940 bool LightApp_Application::onOpenDoc( const QString& aName )
942 #ifdef SINGLE_DESKTOP
943 if ( !checkExistingDoc() )
947 saveDockWindowsState();
949 // We should take mru action first because this application instance can be deleted later.
950 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
952 bool res = CAM_Application::onOpenDoc( aName );
957 mru->insert( aName );
959 mru->remove( aName );
965 SLOT: Displays "About" message box
967 void LightApp_Application::onHelpAbout()
969 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
974 Private SLOT: Called on selection is changed
975 Dispatchs active module that selection is changed
977 void LightApp_Application::onSelection()
979 onSelectionChanged();
981 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
982 ((LightApp_Module*)activeModule())->selectionChanged();
987 \param study - SUIT_Study.
989 void LightApp_Application::setActiveStudy( SUIT_Study* study )
991 CAM_Application::setActiveStudy( study );
995 Enables/Disables menu items and toolbar buttons. Rebuild menu
997 void LightApp_Application::updateCommandsStatus()
999 CAM_Application::updateCommandsStatus();
1002 #ifndef DISABLE_GLVIEWER
1003 a = action( NewGLViewId );
1005 a->setEnabled( activeStudy() );
1008 #ifndef DISABLE_PLOT2DVIEWER
1009 a = action( NewPlot2dId );
1011 a->setEnabled( activeStudy() );
1014 #ifndef DISABLE_OCCVIEWER
1015 a = action( NewOCCViewId );
1017 a->setEnabled( activeStudy() );
1020 #ifndef DISABLE_VTKVIEWER
1021 a = action( NewVTKViewId );
1023 a->setEnabled( activeStudy() );
1026 #ifndef DISABLE_QXGRAPHVIEWER
1027 a = action( NewQxSceneViewId );
1029 a->setEnabled( activeStudy() );
1032 #ifndef DISABLE_GRAPHICSVIEW
1033 a = action( NewGraphicsViewId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_PVVIEWER
1039 a = action( NewPVViewId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_PYVIEWER
1045 a = action( NewPyViewerId );
1047 a->setEnabled( activeStudy() );
1053 Runs system command in separate thread
1055 class RunBrowser: public QThread
1058 RunBrowser( LightApp_Application* app,
1059 const QString& theApp,
1060 const QString& theParams,
1061 const QString& theHelpFile,
1062 const QString& theContext = QString() )
1064 myParams( theParams ),
1065 myContext( theContext ),
1069 //For the external browser always specify 'file://' protocol,
1070 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1071 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1076 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1077 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1079 QProcess* proc = new QProcess();
1081 proc->start( aCommand );
1082 if ( !proc->waitForStarted() ) {
1083 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1084 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1085 ce2000->setData( msg );
1086 QApplication::postEvent( myLApp, ce2000 );
1097 LightApp_Application* myLApp;
1101 SLOT: Displays help contents for choosen module
1103 void LightApp_Application::onHelpContentsModule()
1105 const QAction* a = (QAction*) sender();
1106 QString helpFile = a->data().toString();
1107 if ( helpFile.isEmpty() ) return;
1109 SUIT_ResourceMgr* resMgr = resourceMgr();
1112 platform = "winapplication";
1114 platform = "application";
1116 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1118 QString quote("\"");
1119 anApp.prepend( quote );
1120 anApp.append( quote );
1122 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1123 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1125 if( useExtBrowser ) {
1126 if ( !anApp.isEmpty() ) {
1127 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1131 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1132 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1133 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1135 showPreferences( tr( "PREF_APP" ) );
1139 QStringList parameters;
1140 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1141 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1142 parameters << helpFile;
1143 QProcess::startDetached( "HelpBrowser", parameters );
1148 SLOT: Displays help contents for choosen dialog
1150 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1151 const QString& theFileName,
1152 const QString& theContext )
1154 QString fileName = theFileName;
1155 QString context = theContext;
1156 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1157 // context might be passed within theFileName argument
1158 QStringList comps = fileName.split("#");
1159 if ( comps.count() > 1 ) {
1160 context = comps.last();
1162 fileName = comps.join("#");
1166 QString homeDir = "";
1167 if ( !theComponentName.isEmpty() ) {
1168 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1169 if ( !dir.isEmpty() )
1170 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1171 Qtx::addSlash( "share" ) +
1172 Qtx::addSlash( "doc" ) +
1173 Qtx::addSlash( "salome" ) +
1174 Qtx::addSlash( "gui" ) +
1175 Qtx::addSlash( theComponentName ) );
1178 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1179 SUIT_ResourceMgr* resMgr = resourceMgr();
1182 platform = "winapplication";
1184 platform = "application";
1186 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1188 QString quote("\"");
1189 anApp.prepend( quote );
1190 anApp.append( quote );
1193 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1196 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1198 if ( !anApp.isEmpty() ) {
1199 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1203 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1204 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1205 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1206 showPreferences( tr( "PREF_APP" ) );
1210 QStringList parameters;
1211 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1212 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1213 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1214 QProcess::startDetached( "HelpBrowser", parameters );
1219 Sets enable or disable some actions on selection changed.
1221 void LightApp_Application::onSelectionChanged()
1223 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1224 bool canCopy = m ? m->canCopy() : false;
1225 bool canPaste = m ? m->canPaste() : false;
1227 action( EditCopyId )->setEnabled(canCopy);
1228 action( EditPasteId )->setEnabled(canPaste);
1232 SLOT: Performs some actions when dockable windows are triggered
1234 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1238 QWidget* LightApp_Application::dockWindow( const int id ) const
1241 if ( myWin.contains( id ) )
1246 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1251 QDockWidget* dock = 0;
1252 QWidget* w = wid->parentWidget();
1253 while ( w && !dock )
1255 dock = ::qobject_cast<QDockWidget*>( w );
1256 w = w->parentWidget();
1261 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1266 if ( wid != dockWindow( id ) )
1267 removeDockWindow( id );
1269 myWin.insert( id, wid );
1271 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1272 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1274 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1275 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1276 QString( "%1Dock" ).arg( wid->objectName() ) );
1277 dock->setWidget( wid );
1278 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1279 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1280 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1282 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1283 if ( !accel.isEmpty() )
1284 dock->toggleViewAction()->setShortcut( accel );
1289 void LightApp_Application::removeDockWindow( const int id )
1291 QWidget* wid = dockWindow( id );
1297 QDockWidget* dock = windowDock( wid );
1301 dock->setWidget( 0 );
1302 wid->setParent( 0 );
1303 wid->setVisible( false );
1307 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1309 QDockWidget* dock = windowDock( dockWindow( id ) );
1310 if ( dock && desktop() ) {
1311 desktop()->addDockWidget( place, dock );
1312 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1313 if ( a ) a->update();
1319 \param flag - key for window
1320 \param studyId - study id
1321 Flag used how identificator of window in windows list.
1323 QWidget* LightApp_Application::getWindow( const int flag, const int )
1325 QWidget* wid = dockWindow( flag );
1327 insertDockWindow( flag, wid = createWindow( flag ) );
1329 QMap<int, int> winMap;
1330 currentWindows( winMap );
1331 if ( winMap.contains( flag ) )
1332 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1338 \return Object Browser
1340 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1342 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1348 LogWindow* LightApp_Application::logWindow()
1350 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1353 #ifndef DISABLE_PYCONSOLE
1355 This returns the python console integrated to the GUI. Depending
1356 when you request the python console, this function could return
1357 null. Then the optional parameter force (default to false) can be
1358 set to force the creation of the python console if it is not done
1360 \param force - if true, the pythonConsole is created if it does not exist yet
1361 \return Python Console
1363 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1365 QWidget* wid = dockWindow( WT_PyConsole );
1366 if ( !wid && force==true) {
1367 wid = getWindow(WT_PyConsole);
1369 return qobject_cast<PyConsole_Console*>( wid );
1374 Updates object browser and maybe data models
1375 \param updateModels - if it is true, then data models are updated
1377 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1379 // update existing data models
1382 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1383 if ( objectBrowser() )
1384 objectBrowser()->setAutoUpdate( false );
1386 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1388 CAM_Study::ModelList dm_list;
1389 study->dataModels( dm_list );
1390 QListIterator<CAM_DataModel*> it( dm_list );
1391 while ( it.hasNext() ) {
1392 CAM_DataModel* camDM = it.next();
1393 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1394 ((LightApp_DataModel*)camDM)->update();
1398 if( objectBrowser() )
1399 objectBrowser()->setAutoUpdate( isAutoUpdate );
1402 if ( objectBrowser() ) {
1403 objectBrowser()->updateGeometry();
1404 objectBrowser()->updateTree( 0, false );
1411 LightApp_Preferences* LightApp_Application::preferences() const
1413 return preferences( false );
1417 \return first view manager of some type
1418 \param vmType - type of view manager
1419 \param create - is it necessary to create view manager in case, when there is no manager of such type
1421 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1423 SUIT_ViewManager* aVM = viewManager( vmType );
1424 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1426 if ( anActiveVM && anActiveVM->getType() == vmType )
1429 if ( aVM && create )
1431 if ( !aVM->getActiveView() )
1434 desktop()->setActiveWindow( aVM->getActiveView() );
1437 aVM = createViewManager( vmType );
1443 Creates view manager of some type
1444 \param vmType - type of view manager
1446 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1448 SUIT_ResourceMgr* resMgr = resourceMgr();
1450 SUIT_ViewManager* viewMgr = 0;
1451 #ifndef DISABLE_GLVIEWER
1452 if( vmType == GLViewer_Viewer::Type() )
1454 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1455 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1458 #ifndef DISABLE_PLOT2DVIEWER
1459 if( vmType == Plot2d_Viewer::Type() )
1461 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1463 #ifndef DISABLE_SALOMEOBJECT
1464 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1466 new LightApp_Plot2dSelector( v, mySelMgr );
1468 vm = new Plot2d_Viewer();
1470 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1471 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1474 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1475 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1479 #ifndef DISABLE_QXGRAPHVIEWER
1480 if( vmType == QxScene_Viewer::Type() )
1482 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1483 QxScene_Viewer* vm = new QxScene_Viewer();
1484 viewMgr->setViewModel( vm );
1485 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1488 #ifndef DISABLE_GRAPHICSVIEW
1489 if( vmType == GraphicsView_Viewer::Type() )
1491 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1492 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1495 #ifndef DISABLE_PVVIEWER
1496 if( vmType == PVViewer_Viewer::Type() )
1498 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1499 viewMgr->getActiveView()->setFocus();
1502 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1506 #ifndef DISABLE_PYVIEWER
1507 if( vmType == PyViewer_Viewer::Type() )
1509 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1512 #ifndef DISABLE_OCCVIEWER
1513 if( vmType == OCCViewer_Viewer::Type() )
1515 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1516 OCCViewer_Viewer* vm;
1517 #ifndef DISABLE_SALOMEOBJECT
1518 vm = new SOCC_Viewer();
1520 vm = new OCCViewer_Viewer( true );
1522 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1523 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1524 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1525 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1526 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1527 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1528 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1529 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1531 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1532 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1533 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1534 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1535 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1536 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1537 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1538 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1539 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1540 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1541 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1542 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1545 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1546 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1549 #ifndef DISABLE_VTKVIEWER
1550 #ifndef DISABLE_SALOMEOBJECT
1551 if ( vmType == SVTK_Viewer::Type() )
1553 if ( vmType == VTKViewer_Viewer::Type() )
1556 #ifndef DISABLE_SALOMEOBJECT
1557 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1558 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1561 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1562 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1563 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1564 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1565 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1566 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1567 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1568 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1569 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1570 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1571 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1572 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1573 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1574 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1575 new LightApp_VTKSelector( vm, mySelMgr );
1578 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1579 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1581 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1589 addViewManager( viewMgr );
1590 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1592 if ( viewWin && desktop() ) {
1593 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1594 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1600 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1602 SUIT_ResourceMgr* resMgr = resourceMgr();
1604 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1606 new LightApp_WgViewModel( vmType, w ) );
1607 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1609 addViewManager( vm );
1610 SUIT_ViewWindow* vw = vm->createViewWindow();
1611 if ( vw && desktop() ) {
1612 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1613 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1616 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1617 myUserWmTypes << vmType;
1622 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1624 SUIT_ResourceMgr* resMgr = resourceMgr();
1626 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1630 QString vmType = vm->getType();
1632 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1634 addViewManager( vm );
1635 SUIT_ViewWindow* vw = vm->createViewWindow();
1636 if ( vw && desktop() ) {
1637 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1638 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1641 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1642 myUserWmTypes << vmType;
1648 SLOT: Removes view manager from application
1650 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1652 removeViewManager( theVM );
1656 Protected SLOT: On study created.
1657 \param theStudy - just created study
1659 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1661 SUIT_DataObject* aRoot = 0;
1662 if ( theStudy && theStudy->root() )
1664 aRoot = theStudy->root();
1665 //aRoot->setName( tr( "DATA_MODELS" ) );
1668 getWindow( WT_ObjectBrowser );
1670 loadDockWindowsState();
1672 if ( objectBrowser() )
1673 objectBrowser()->setRoot( aRoot );
1675 activateModule( defaultModule() );
1677 if ( objectBrowser() )
1678 objectBrowser()->openLevels();
1680 #ifndef DISABLE_PYCONSOLE
1681 if( pythonConsole() )
1682 getPyInterp()->initStudy();
1687 Protected SLOT: On study opened.
1688 \param theStudy - just opened study
1690 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1692 SUIT_DataObject* aRoot = 0;
1693 if ( theStudy && theStudy->root() )
1695 aRoot = theStudy->root();
1699 getWindow( WT_ObjectBrowser );
1701 loadDockWindowsState();
1703 if ( objectBrowser() )
1704 objectBrowser()->setRoot( aRoot );
1706 activateModule( defaultModule() );
1708 if ( objectBrowser() )
1709 objectBrowser()->openLevels();
1711 #ifndef DISABLE_PYCONSOLE
1712 if( pythonConsole() )
1713 getPyInterp()->initStudy();
1719 /*!Protected SLOT. On study saved.*/
1720 void LightApp_Application::onStudySaved( SUIT_Study* s )
1722 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1724 mru->insert( s->studyName() );
1729 /*!Protected SLOT. On study closed.*/
1730 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1733 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1734 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1737 // stop auto-save timer
1738 myAutoSaveTimer->stop();
1740 // Bug 10396: clear selection
1741 mySelMgr->clearSelected();
1743 // Bug 12944: emit signal only after clear selection
1746 activateModule( "" );
1749 /*!Protected SLOT.On desktop activated.*/
1750 void LightApp_Application::onDesktopActivated()
1752 CAM_Application::onDesktopActivated();
1753 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1755 aModule->studyActivated();
1758 void LightApp_Application::studyOpened( SUIT_Study* s )
1760 CAM_Application::studyOpened( s );
1763 updateViewManagers();
1766 void LightApp_Application::studySaved( SUIT_Study* s )
1768 CAM_Application::studyOpened( s );
1769 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1770 if ( aResMgr && activeStudy() ) {
1771 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1772 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1776 void LightApp_Application::studyCreated( SUIT_Study* s )
1778 CAM_Application::studyCreated( s );
1781 updateViewManagers();
1784 /*!Gets file filter.
1785 *\retval QString "(*.bin)"
1787 QString LightApp_Application::getFileFilter() const
1795 Shows file dialog and return user selected file name
1797 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1798 const QString& caption, QWidget* parent )
1802 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1803 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1806 /*! Gets directory*/
1807 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1811 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1814 /*! Get open file names*/
1815 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1816 const QString& caption, QWidget* parent )
1820 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1821 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1824 /*!Private SLOT. Update object browser.*/
1825 void LightApp_Application::onRefresh()
1827 updateObjectBrowser( true );
1830 /*!Private SLOT. Update actions after rename object.*/
1831 void LightApp_Application::onRenamed()
1833 activeStudy()->Modified();
1837 /*!Private SLOT. Support drag-and-drop operation.*/
1838 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1840 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1844 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1846 aModule->dropObjects( objects, parentObj, row, action );
1849 /*!Private SLOT. On preferences.*/
1850 void LightApp_Application::onPreferences()
1852 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1855 /*!Private SLOT. On preferences.*/
1856 void LightApp_Application::showPreferences( const QString& itemText )
1858 QApplication::setOverrideCursor( Qt::WaitCursor );
1860 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1862 QApplication::restoreOverrideCursor();
1867 preferences()->activateItem( itemText );
1869 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1872 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1873 resourceMgr()->save();
1876 shortcutMgr()->updateShortcuts();
1882 /*!Protected SLOT. On preferences changed.*/
1883 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1885 LightApp_Module* sMod = 0;
1886 CAM_Module* mod = module( modName );
1887 if ( mod && mod->inherits( "LightApp_Module" ) )
1888 sMod = (LightApp_Module*)mod;
1891 sMod->preferencesChanged( section, param );
1893 preferencesChanged( section, param );
1894 // emit signal to allow additional preferences changing processing
1895 emit preferenceChanged( modName, section, param );
1898 /*!Remove all windows from study.*/
1899 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1901 saveDockWindowsState();
1903 if ( SUIT_DataBrowser* ob = objectBrowser() )
1906 CAM_Application::beforeCloseDoc( s );
1909 /*!Update actions.*/
1910 void LightApp_Application::updateActions()
1912 updateCommandsStatus();
1918 SUIT_Study* LightApp_Application::createNewStudy()
1920 LightApp_Application::lastStudyId++;
1922 LightApp_Study* aStudy = new LightApp_Study( this );
1924 // Set up processing of major study-related events
1925 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1926 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1927 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1928 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1934 Creates window by flag.
1935 \param flag - identificator of window type
1937 QWidget* LightApp_Application::createWindow( const int flag )
1941 SUIT_ResourceMgr* resMgr = resourceMgr();
1943 if ( flag == WT_ObjectBrowser )
1945 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1946 ob->setObjectName( "objectBrowser" );
1947 ob->setSortMenuEnabled( true );
1948 ob->setAutoUpdate( true );
1949 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1950 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1952 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1953 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1954 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1956 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1957 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1958 treeModel->setSearcher( this );
1959 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1960 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1962 // Mantis issue 0020136: Drag&Drop in OB
1963 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1965 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1966 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1967 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
1968 this, SLOT( onRenamed( ) ) );
1972 // temporary commented
1974 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1976 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1979 // Create OBSelector
1980 new LightApp_OBSelector( ob, mySelMgr );
1982 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1983 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1984 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1985 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1987 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1989 #ifndef DISABLE_PYCONSOLE
1990 else if ( flag == WT_PyConsole )
1992 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
1993 pyCons->setObjectName( "pythonConsole" );
1994 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1995 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1996 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1997 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2000 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2003 else if ( flag == WT_LogWindow )
2005 LogWindow* logWin = new LogWindow( desktop() );
2006 logWin->setObjectName( "logWindow" );
2007 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2008 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2010 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2016 \return default windows( Object Browser, Python Console )
2017 Adds to map \a aMap.
2019 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2021 #ifndef DISABLE_PYCONSOLE
2022 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2024 if ( activeStudy() ) {
2025 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2026 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2030 /*!Default view managers*/
2031 void LightApp_Application::defaultViewManagers( QStringList& ) const
2037 \return preferences.
2038 Create preferences, if \a crt = true.
2040 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2045 LightApp_Application* that = (LightApp_Application*)this;
2047 bool toCreate = !_prefs_ && crt;
2050 _prefs_ = new LightApp_Preferences( resourceMgr() );
2051 that->createPreferences( _prefs_ );
2054 that->myPrefs = _prefs_;
2056 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2057 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2058 connect( myPrefs, SIGNAL( resetToDefaults() ),
2059 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2064 SUIT_ResourceMgr* resMgr = resourceMgr();
2066 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2067 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2069 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2073 QStringList modNameList;
2074 app->modules( modNameList, false );
2076 QMap<QString, QString> iconMap;
2077 app->moduleIconNames( iconMap );
2079 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2081 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2084 int modId = _prefs_->addPreference( *it );
2085 if ( iconMap.contains( *it ) )
2086 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2090 app->modules( modList );
2091 QListIterator<CAM_Module*> itr( modList );
2092 while ( itr.hasNext() )
2094 LightApp_Module* mod = 0;
2096 CAM_Module* anItem = itr.next();
2097 if ( anItem->inherits( "LightApp_Module" ) )
2098 mod = (LightApp_Module*)anItem;
2100 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2102 _prefs_->addPreference( mod->moduleName() );
2103 mod->createPreferences();
2104 that->emptyPreferences( mod->moduleName() );
2108 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2114 Adds new module to application
2116 void LightApp_Application::moduleAdded( CAM_Module* mod )
2118 CAM_Application::moduleAdded( mod );
2120 LightApp_Module* lightMod = 0;
2121 if ( mod && mod->inherits( "LightApp_Module" ) )
2122 lightMod = (LightApp_Module*)mod;
2124 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2126 myPrefs->addPreference( mod->moduleName() );
2127 lightMod->createPreferences();
2128 emptyPreferences( mod->moduleName() );
2132 void LightApp_Application::emptyPreferences( const QString& modName )
2134 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2135 if ( !item || !item->isEmpty() )
2138 // printf( "---------------------> Modify for empty module.\n" );
2140 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2141 frm->setIcon( item->icon() );
2142 frm->setStretch( false );
2143 item->parentItem()->insertItem( frm, item );
2144 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2151 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2156 QStringList aValuesList;
2157 QList<QVariant> anIndicesList;
2161 // . Top-level "SALOME" preferences group <<start>>
2162 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2163 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2165 // .. "General" preferences tab <<start>>
2166 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2168 // ... "Language" group <<start>>
2169 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2170 pref->setItemProperty( "columns", 2, langGroup );
2171 // .... -> application language
2172 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2173 LightApp_Preferences::Selector, "language", "language" );
2174 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2175 QList<QVariant> aIcons;
2176 foreach ( QString aLang, aLangs ) {
2177 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2179 pref->setItemProperty( "strings", aLangs, curLang );
2180 pref->setItemProperty( "icons", aIcons, curLang );
2181 pref->setItemProperty( "restart", true, curLang );
2183 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2184 LightApp_Preferences::Bool, "language", "locale" );
2185 pref->setItemProperty( "restart", true, curLocale );
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 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3196 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3198 if ( sec == "language" && param == "locale")
3200 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3201 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3203 if ( sec == "desktop" && param == "opaque_resize" ) {
3204 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3205 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3206 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3207 else dopts &= ~QMainWindow::AnimatedDocks;
3208 desktop()->setDockOptions( dopts );
3209 desktop()->setOpaqueResize( opaqueResize );
3210 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3211 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3214 #ifndef DISABLE_PLOT2DVIEWER
3215 QList<SUIT_ViewManager*> lst;
3216 viewManagers( Plot2d_Viewer::Type(), lst );
3217 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3218 while ( itPlot2d.hasNext() ) {
3219 SUIT_ViewManager* viewMgr = itPlot2d.next();
3220 SUIT_ViewModel* vm = viewMgr->getViewModel();
3221 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3224 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3226 viewMgr->setViewModel( vm );
3227 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3229 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3230 frame->SetPreference();
3235 #ifndef DISABLE_PYVIEWER
3236 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3237 param == QString( "LineNumberArea" ) ||
3238 param == QString( "TextWrapping" ) ||
3239 param == QString( "CenterCursorOnScroll" ) ||
3240 param == QString( "TabSpaceVisible" ) ||
3241 param == QString( "TabSize" ) ||
3242 param == QString( "VerticalEdge" ) ||
3243 param == QString( "NumberColumns" ) ||
3244 param == QString( "Font" ) ) )
3246 QList<SUIT_ViewManager*> lst;
3247 viewManagers( PyViewer_Viewer::Type(), lst );
3248 QListIterator<SUIT_ViewManager*> itPy( lst );
3249 while ( itPy.hasNext() )
3251 SUIT_ViewManager* viewMgr = itPy.next();
3252 SUIT_ViewModel* vm = viewMgr->getViewModel();
3253 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3256 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3258 viewMgr->setViewModel( vm );
3259 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3262 pyView->setPreferences();
3272 void LightApp_Application::loadPreferences()
3274 CAM_Application::loadPreferences();
3276 SUIT_ResourceMgr* aResMgr = resourceMgr();
3281 static bool mru_load = true;
3284 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3286 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3287 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3288 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3289 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3290 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3291 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3292 mru->loadLinks( aResMgr, "MRU" );
3298 QStringList mods = aResMgr->parameters( "windows_visibility" );
3299 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3302 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3303 myWinVis.insert( *itr, arr );
3307 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3308 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3309 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3310 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3311 else dopts &= ~QMainWindow::AnimatedDocks;
3312 desktop()->setDockOptions( dopts );
3313 desktop()->setOpaqueResize( opaqueResize );
3314 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3315 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3322 void LightApp_Application::savePreferences()
3324 CAM_Application::savePreferences();
3326 saveDockWindowsState();
3328 SUIT_ResourceMgr* aResMgr = resourceMgr();
3333 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3335 mru->saveLinks( aResMgr, "MRU" );
3337 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3338 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3341 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3343 #if GUI_DEVELOPMENT > 0
3344 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3346 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3353 Updates desktop title
3355 void LightApp_Application::updateDesktopTitle()
3357 QString aTitle = applicationName();
3358 QString aVer = applicationVersion();
3359 if ( !aVer.isEmpty() )
3360 aTitle += QString( " " ) + aVer;
3362 if ( activeStudy() ) {
3363 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3364 aTitle += QString( " - [%1]" ).arg( sName );
3367 desktop()->setWindowTitle( aTitle );
3371 \brief Get map of the operations which can be performed
3372 on the module activation.
3374 The method should return the map of the kind \c {<id>:<name>}
3375 where \c <id> is an integer identifier of the operation and
3376 \c <name> is a title for the button to be added to the
3377 dialog box. After user selects the required operation by the
3378 clicking the corresponding button in the dialog box, its identifier
3379 is passed to the moduleActionSelected() method to process
3382 \return map of the operations
3383 \sa moduleActionSelected()
3385 QMap<int, QString> LightApp_Application::activateModuleActions() const
3387 QMap<int, QString> opmap;
3388 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3389 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3394 \brief Called when the used selectes required operation chosen
3395 from "Activate module" dialog box.
3397 Performs the required operation according to the user choice.
3399 \param id operation identifier
3400 \sa activateModuleActions()
3402 void LightApp_Application::moduleActionSelected( const int id )
3417 Updates windows after close document
3419 void LightApp_Application::afterCloseDoc()
3423 CAM_Application::afterCloseDoc();
3427 Updates actions of active module
3429 void LightApp_Application::updateModuleActions()
3432 if ( activeModule() ) {
3433 modName = activeModule()->moduleName();
3434 if ( !isModuleAccessible( modName ) ) {
3435 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3436 foreach( SUIT_Application* app, apps ) {
3437 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3438 if ( lapp && lapp != this )
3439 lapp->removeModuleAction( modName );
3444 LightApp_ModuleAction* moduleAction =
3445 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3447 moduleAction->setActiveModule( modName );
3450 void LightApp_Application::removeModuleAction( const QString& modName )
3452 LightApp_ModuleAction* moduleAction =
3453 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3455 moduleAction->removeModule( modName );
3459 Gets current windows.
3460 \param winMap - output current windows map.
3462 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3465 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3466 ((LightApp_Module*)activeModule())->windows( winMap );
3468 defaultWindows( winMap );
3472 Gets current view managers.
3473 \param lst - output current view managers list.
3475 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3478 if ( !activeStudy() )
3481 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3482 ((LightApp_Module*)activeModule())->viewManagers( lst );
3484 defaultViewManagers( lst );
3490 void LightApp_Application::updateWindows()
3492 QMap<int, int> winMap;
3493 currentWindows( winMap );
3495 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3497 if ( !dockWindow( it.key() ) )
3498 getWindow( it.key() );
3501 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3503 QWidget* wid = it.value();
3504 if ( winMap.contains( it.key() ) )
3505 wid->setVisible( true );
3510 loadDockWindowsState();
3514 Updates view managers
3516 void LightApp_Application::updateViewManagers()
3519 currentViewManagers( lst );
3521 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3522 getViewManager( *it, true );
3526 Loads windows geometry
3528 void LightApp_Application::loadDockWindowsState()
3532 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3533 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3534 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3537 if ( activeModule() )
3538 modName = activeModule()->name();
3539 else if ( activeStudy() )
3540 modName = "nomodule";
3542 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3543 QByteArray aDefaultState;
3544 aResMgr->value( "windows_geometry", modName, aDefaultState );
3545 QByteArray aDefaultVisibility;
3546 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3547 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3548 aResMgr->setWorkingMode( prevMode );
3550 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3553 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3554 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3556 if ( version > Qtx::versionToId( "7.4.1" ) )
3557 aResMgr->value( "windows_geometry", modName , arr );
3559 arr = aDefaultState;
3560 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3561 desktop()->restoreState( aTargetArray );
3564 QStringList mainToolbarsNames;
3565 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3566 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3567 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3569 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3572 QMap<QString, bool> *tbMap = 0;
3573 QMap<QString, bool> *dwMap = 0;
3575 QMap<QString, bool> userTbMap, userDwMap;
3576 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3578 QMap<QString, bool> defaultTbMap, defaultDwMap;
3579 if(hasDefaultVisibility) {
3580 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3586 if(hasDefaultVisibility){
3587 tbMap = &defaultTbMap;
3594 if(hasDefaultVisibility){
3595 dwMap = &defaultDwMap;
3600 QList<QToolBar*> tbList = findToolBars();
3601 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3603 QToolBar* tb = *tit;
3604 if ( tbMap->contains( tb->objectName() ) ) {
3605 tb->setVisible( (*tbMap)[tb->objectName()] );
3611 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3612 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3614 QDockWidget* dw = *dit;
3616 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3617 if ( po != desktop() )
3620 if ( dwMap->contains( dw->objectName() ) )
3621 dw->setVisible( (*dwMap)[dw->objectName()] );
3629 Saves windows geometry
3631 void LightApp_Application::saveDockWindowsState()
3636 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3637 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3639 if( !storeWin && !storeTb )
3643 if ( activeModule() )
3644 modName = activeModule()->name();
3645 else if ( activeStudy() )
3646 modName = "nomodule";
3648 QString versionId = GUI_VERSION_STR;
3649 #if GUI_DEVELOPMENT > 0
3653 QByteArray arr = desktop()->saveState();
3654 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3655 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3658 if ( myWinVis.contains( modName ) )
3659 visArr = myWinVis[modName];
3661 QMap<QString, bool> tbMap, dwMap;
3662 dockWindowsState( visArr, tbMap, dwMap );
3664 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3665 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3668 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3671 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3672 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3674 QDockWidget* wid = *it;
3675 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3678 visArr = dockWindowsState( tbMap, dwMap );
3680 myWinVis.insert( modName, visArr );
3683 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3686 QDataStream stream( &visArr, QIODevice::WriteOnly );
3688 stream << (uchar)ToolBarMarker;
3689 stream << tb.size();
3690 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3692 stream << tit.key();
3693 stream << (uchar)( tit.value() ? 1 : 0 );
3696 stream << (uchar)DockWidgetMarker;
3697 stream << dw.size();
3698 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3700 stream << wit.key();
3701 stream << (uchar)( wit.value() ? 1 : 0 );
3707 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3712 QByteArray visArr = arr;
3713 QDataStream stream( &visArr, QIODevice::ReadOnly );
3717 if ( marker != ToolBarMarker )
3722 for ( int i = 0; i < lines; ++i )
3725 stream >> objectName;
3728 tb.insert( objectName, shown );
3732 if ( marker != DockWidgetMarker )
3736 for ( int j = 0; j < lines; ++j )
3739 stream >> objectName;
3742 dw.insert( objectName, shown );
3747 Adds icon names for modules
3749 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3753 SUIT_ResourceMgr* resMgr = resourceMgr();
3757 QStringList modList;
3758 modules( modList, false );
3760 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3762 QString modName = *it;
3763 QString modIntr = moduleName( modName );
3764 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3766 if ( modIcon.isEmpty() )
3769 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3770 modIcon += QString( ".png" );
3772 iconMap.insert( modName, modIcon );
3777 Inserts items in popup, which necessary for current application
3779 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3782 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3783 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3784 selMgr->setSelectionCacheEnabled( true );
3786 SUIT_DataBrowser* ob = objectBrowser();
3788 CAM_Application::contextMenuPopup( type, thePopup, title );
3790 if ( ob && type == ob->popupClientType() ) {
3791 thePopup->addSeparator();
3792 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3793 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3794 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3797 #ifndef DISABLE_SALOMEOBJECT
3798 if ( selMgr && ob ) {
3799 SALOME_ListIO selected;
3800 selMgr->selectedObjects( selected );
3801 if(selected.Extent() == 1){
3802 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3803 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3804 if(obj && obj->renameAllowed()) {
3805 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3806 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3807 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3808 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3810 QList<QAction*> acts = thePopup->actions();
3811 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3812 thePopup->insertAction(firstAction,a);
3818 selMgr->setSelectionCacheEnabled( cacheIsOn );
3824 void LightApp_Application::createEmptyStudy()
3826 CAM_Application::createEmptyStudy();
3828 if ( objectBrowser() )
3829 objectBrowser()->updateTree();
3831 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3832 if ( aResMgr && activeStudy() ) {
3833 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3834 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3839 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3841 CAM_Application::setDesktop( desk );
3844 connect( desk, SIGNAL( message( const QString& ) ),
3845 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3846 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3847 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3853 \param mod - module to be activated
3855 bool LightApp_Application::activateModule( CAM_Module* mod )
3857 bool res = CAM_Application::activateModule( mod );
3859 if ( objectBrowser() )
3860 objectBrowser()->updateTree();
3866 \return keyborad accelerators manager object
3868 SUIT_Accel* LightApp_Application::accel() const
3874 Removes dead widget container from map
3876 void LightApp_Application::onWCDestroyed( QObject* ob )
3878 // remove destroyed widget container from windows map
3879 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3881 if ( itr.value() != ob )
3884 int key = itr.key();
3885 myWin.remove( key );
3890 void LightApp_Application::onMRUActivated( const QString& name )
3892 SUIT_Session* s = SUIT_Session::session();
3893 if ( s && s->activeApplication() == this )
3897 void LightApp_Application::onStylePreferences()
3899 Style_PrefDlg dlg( desktop() );
3902 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3905 void LightApp_Application::onFullScreen(){
3906 if(myScreenHelper) {
3907 if(desktop()->isFullScreen())
3908 myScreenHelper->switchToNormalScreen();
3910 myScreenHelper->switchToFullScreen();
3915 Connects just added view manager
3917 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3919 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3920 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3921 CAM_Application::addViewManager( vm );
3925 Remove view manager from memory
3927 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3929 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3930 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3931 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3933 aStudy->removeObjectProperties( vm->getGlobalId() );
3935 CAM_Application::removeViewManager( vm );
3937 LightApp_SelectionMgr* selMgr = selectionMgr();
3938 QList<SUIT_Selector*> selectors;
3939 selMgr->selectors( selectors );
3940 foreach( SUIT_Selector* selector, selectors ) {
3941 if ( selector->owner() == vm->getViewModel() ) {
3946 // IPAL22894: Crash on closing OCC view
3952 Renames active window of desktop
3954 void LightApp_Application::onRenameWindow()
3959 QWidget* w = desktop()->activeWindow();
3964 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3965 if( ok && !name.isEmpty() )
3966 w->setWindowTitle( name );
3970 Closes active window of desktop
3972 void LightApp_Application::onCloseWindow()
3977 QWidget* w = desktop()->activeWindow();
3985 Closes all windows of desktop
3987 void LightApp_Application::onCloseAllWindow()
3989 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3993 QList<SUIT_ViewWindow*> wndList = desk->windows();
3994 SUIT_ViewWindow* wnd;
3995 foreach( wnd, wndList )
4003 Groups all windows of desktop
4005 void LightApp_Application::onGroupAllWindow()
4007 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4011 QtxWorkstack* wgStack = desk->workstack();
4017 \return if the library of module exists
4018 \param moduleTitle - title of module
4020 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4022 if( moduleTitle.isEmpty() )
4025 QString lib = moduleLibrary( moduleTitle );
4027 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4028 bool isPythonModule = lib.contains("SalomePyQtGUI");
4029 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4033 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4035 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4038 bool isLibFound = false;
4039 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4040 for( ; anIt!=aLast; anIt++ )
4042 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4053 INFOS( "\n****************************************************************" << std::endl
4054 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4055 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4056 << "****************************************************************" << std::endl );
4058 else if ( !isPythonModule && !isPythonLightModule)
4061 if ( isPythonModule || isPythonLightModule)
4063 QString pylib = moduleName( moduleTitle ) + QString(".py");
4064 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4066 // Check the python library
4068 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4070 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4072 bool isPyLib = false, isPyGuiLib = false;
4073 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4074 for( ; anIt!=aLast; anIt++ )
4076 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4077 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4079 if(!isPythonLightModule)
4080 if( !isPyLib && inf.exists() )
4083 if( !isPyGuiLib && infgui.exists() )
4086 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4090 printf( "\n****************************************************************\n" );
4091 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4093 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4095 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4096 printf( "****************************************************************\n" );
4103 \return default name for an active study
4105 void LightApp_Application::setDefaultStudyName( const QString& theName )
4107 QStringList anInfoList;
4108 modules( anInfoList, false );
4110 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4111 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4112 !aStudy->isSaved() )
4114 aStudy->setStudyName( theName );
4115 updateDesktopTitle();
4120 Custom event handler
4122 bool LightApp_Application::event( QEvent* e )
4124 if( e && e->type()==2000 )
4126 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4127 QString* d = ( QString* )ce->data();
4128 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4130 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4131 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4132 showPreferences( tr( "PREF_APP" ) );
4137 return CAM_Application::event( e );
4140 /*! Check data object */
4141 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4145 bool isSuitable = !theObj->entry().isEmpty() &&
4146 !theObj->componentDataType().isEmpty() &&
4147 !theObj->name().isEmpty();
4154 int LightApp_Application::openChoice( const QString& aName )
4156 int choice = CAM_Application::openChoice( aName );
4158 if ( choice == OpenExist ) // The document is already open.
4160 // Do you want to reload it?
4161 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4162 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4163 choice = OpenReload;
4169 bool LightApp_Application::openAction( const int choice, const QString& aName )
4176 STD_Application* app = 0;
4177 SUIT_Session* session = SUIT_Session::session();
4178 QList<SUIT_Application*> appList = session->applications();
4179 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4181 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4182 app = ::qobject_cast<STD_Application*>( *it );
4187 app->onCloseDoc( false );
4188 appList = session->applications();
4189 STD_Application* other = 0;
4190 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4191 other = ::qobject_cast<STD_Application*>( *it );
4194 res = other->onOpenDoc( aName );
4199 res = CAM_Application::openAction( choice, aName );
4206 QStringList LightApp_Application::viewManagersTypes() const
4208 QStringList aTypesList;
4209 aTypesList += myUserWmTypes;
4210 #ifndef DISABLE_GLVIEWER
4211 aTypesList<<GLViewer_Viewer::Type();
4213 #ifndef DISABLE_PLOT2DVIEWER
4214 aTypesList<<Plot2d_Viewer::Type();
4216 #ifndef DISABLE_QXGRAPHVIEWER
4217 aTypesList<<QxScene_Viewer::Type();
4219 #ifndef DISABLE_PVVIEWER
4220 aTypesList<<PVViewer_Viewer::Type();
4222 #ifndef DISABLE_PYVIEWER
4223 aTypesList<<PyViewer_Viewer::Type();
4225 #ifndef DISABLE_OCCVIEWER
4226 aTypesList<<OCCViewer_Viewer::Type();
4228 #ifndef DISABLE_VTKVIEWER
4229 #ifndef DISABLE_SALOMEOBJECT
4230 aTypesList<<SVTK_Viewer::Type();
4232 aTypesList<<VTKViewer_Viewer::Type();
4238 * Removes all view managers of known types
4239 * Other view managers are ignored
4241 void LightApp_Application::clearKnownViewManagers()
4243 QStringList aTypesList = viewManagersTypes();
4244 QList<SUIT_ViewManager*> aMgrList;
4245 viewManagers( aMgrList );
4246 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4247 if (aTypesList.contains(aMgr->getType()))
4248 removeViewManager(aMgr);
4253 Copy of current selection
4255 void LightApp_Application::onCopy()
4257 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4263 Paste of current data in clipboard
4265 void LightApp_Application::onPaste()
4267 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4273 Browse (i.e. set focus on) the published objects
4274 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4275 has been accepted by Ok (or Apply & Close) button
4276 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4277 (to select the first published object only)
4278 \return entry of the selected object
4280 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4281 const bool theIsApplyAndClose,
4282 const bool theIsOptimizedBrowsing )
4285 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4287 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4288 switch( aBrowsePolicy )
4292 case BP_ApplyAndClose:
4293 if( !theIsApplyAndClose )
4301 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4305 SUIT_DataBrowser* anOB = objectBrowser();
4309 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4313 QStringListIterator anIter( theEntryList );
4314 if( theIsOptimizedBrowsing )
4316 // go to the last entry
4318 if( anIter.hasPrevious() )
4322 // scroll to each entry in the list
4323 // (in optimized mode - to the last entry only)
4325 LightApp_DataObject* anObject = 0;
4326 while( anIter.hasNext() )
4328 anEntry = anIter.next();
4329 if( !anEntry.isEmpty() )
4331 anObject = aStudy->findObjectByEntry( anEntry );
4334 QModelIndex anIndex = aModel->index( anObject );
4335 anOB->treeView()->scrollTo( anIndex );
4340 // always select the last object
4341 if( anObject && !anEntry.isEmpty() )
4343 QList<SUIT_Selector*> aSelectorList;
4344 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4345 if( !aSelectorList.isEmpty() )
4347 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4349 bool anIsAutoBlock = aSelector->autoBlock();
4351 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4352 aSelector->setAutoBlock( false );
4354 SUIT_DataOwnerPtrList aList;
4355 #ifndef DISABLE_SALOMEOBJECT
4356 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4357 ( anObject->entry().toLatin1().constData(),
4358 anObject->componentDataType().toLatin1().constData(),
4359 anObject->name().toLatin1().constData() );
4360 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4362 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4365 aList.append( owner );
4366 selectionMgr()->setSelected( aList );
4369 // restore auto block flag
4370 aSelector->setAutoBlock( anIsAutoBlock );
4378 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4380 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4381 return study ? study->findObjectByEntry( id ) : 0;
4385 Checks that an object can be renamed.
4386 \param entry entry of the object
4387 \brief Return \c true if object can be renamed
4389 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4394 Rename object by entry.
4395 \param entry entry of the object
4396 \param name new name of the object
4397 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4399 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4403 /*! Process standard messages from desktop */
4404 void LightApp_Application::onDesktopMessage( const QString& message )
4406 const QString sectionSeparator = "/";
4408 if ( message.toLower() == "updateobjectbrowser" ||
4409 message.toLower() == "updateobjbrowser" ) {
4410 // update object browser
4411 updateObjectBrowser();
4413 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4414 QString vtype = message.split( sectionSeparator ).last();
4415 if ( !vtype.isEmpty() )
4416 getViewManager( vtype, true );
4419 QStringList data = message.split( sectionSeparator );
4420 if ( data.count() > 1 ) {
4421 QString msgType = data[0].trimmed();
4422 LightApp_Module* sMod = 0;
4423 CAM_Module* mod = module( msgType );
4425 mod = module( moduleTitle( msgType ) );
4426 if ( mod && mod->inherits( "LightApp_Module" ) )
4427 sMod = (LightApp_Module*)mod;
4429 if ( msgType.toLower() == "preferences" ) {
4430 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4431 // for example "preferences/Study/multi_file_dump/true"
4432 if ( data.count() > 3 ) {
4433 QString section = data[1].trimmed();
4434 QString param = data[2].trimmed();
4435 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4436 resourceMgr()->setValue( section, param, value );
4440 // received message for the module
4441 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4442 sMod->message( msg );
4450 Returns all top level toolbars.
4451 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4453 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4455 QList<QToolBar*> aResult;
4456 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4457 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4458 QToolBar* tb = *tit;
4459 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4460 if ( po != desktop() )
4462 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4469 Internal method to parse toolbars and dockable windows state.
4471 QByteArray LightApp_Application::processState(QByteArray& input,
4472 const bool processWin,
4473 const bool processTb,
4474 const bool isRestoring,
4475 QByteArray defaultState) {
4478 bool hasDefaultState = !defaultState.isEmpty();
4479 bool isDockWinWriten = false;
4481 //Write date from users settings
4483 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4484 int marker, version;
4486 tmpInputData >> marker;
4487 tmpInputData >> version;
4488 tmpInputData >> dockmarker;
4489 tmpInputData >> nbDocWin;
4491 if(processWin && processTb && !isRestoring) {
4493 } else if(!processWin && !processTb ) {
4495 aRes = defaultState;
4497 QDataStream aData(&aRes, QIODevice::WriteOnly);
4498 QList<QToolBar*> aToolBars = findToolBars();
4501 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4502 QToolBar* tb = *tit;
4503 aNames.append(tb->objectName());
4506 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4507 if(toolBarMarkerIndex < 0)
4509 QDataStream anInputData(&input, QIODevice::ReadOnly);
4511 int toolBarMarkerIndexDef;
4512 if(hasDefaultState) {
4513 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4514 if(toolBarMarkerIndexDef < 0)
4517 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4519 QDataStream* aTargetData = 0;
4520 int aTargetIndex = -1;
4522 QByteArray currentArr = desktop()->saveState();
4523 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4524 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4525 if(processWin && useInputData) {
4526 aTargetData = &anInputData;
4527 aTargetIndex = toolBarMarkerIndex;
4529 //Write date from default settings
4530 if(hasDefaultState) {
4531 aTargetData = &anInputDataDef;
4532 aTargetIndex = toolBarMarkerIndexDef;
4534 //If no default state, write current snapshot of the dockable windows
4536 aTargetData = &anInputDataCur;
4537 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4538 aTargetIndex = toolBarMarkerIndexCur;
4543 if(aTargetData && aTargetIndex >= 0 ) {
4544 aTargetData->device()->seek(0);
4545 while( aTargetData->device()->pos() < aTargetIndex ) {
4550 isDockWinWriten = true;
4557 aTargetData = &anInputData;
4558 aTargetIndex = toolBarMarkerIndex;
4560 if(hasDefaultState) {
4561 aTargetData = &anInputDataDef;
4562 aTargetIndex = toolBarMarkerIndexDef;
4566 if(aTargetData && aTargetIndex >= 0) {
4568 if(!isDockWinWriten ) {
4569 //Write version marker
4570 int marker, version;
4571 aTargetData->device()->seek(0);
4572 *aTargetData >> marker;
4573 *aTargetData >> version;
4576 aData << (uchar) QDockWidgetMarker;
4578 int shift = 4*sizeof(int) + sizeof(QSize);
4579 index = aTargetIndex - shift;
4581 index = aTargetIndex;
4584 aTargetData->device()->seek(index);
4585 while(!aTargetData->atEnd()) {
4590 } else { // Not treat toolbars
4591 aData << (uchar) QToolBarMarker;
4592 aData << (int) 0; //Nb toolbars = 0
4599 \brief Emits operationFinished signal.
4600 \param theModuleName the name of the module which perfomed the operation
4601 \param theOperationName the operation name
4602 \param theEntryList the list of the created objects entries
4604 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4605 const QString& theOperationName,
4606 const QStringList& theEntryList )
4608 emit operationFinished( theModuleName, theOperationName, theEntryList );
4612 Update visibility state of given objects
4614 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4615 SUIT_ViewModel* theViewModel )
4617 if ( !theViewModel || theList.isEmpty() ) return;
4619 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4620 if ( !aStudy ) return;
4622 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4624 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4625 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4627 if ( !obj || aStudy->isComponent( obj->entry() ) )
4630 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4631 if ( anObjModule ) {
4632 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4634 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4635 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4636 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4637 anObjState = Qtx::ShownState;
4639 anObjState = Qtx::HiddenState;
4641 aStudy->setVisibilityState( obj->entry(), anObjState );
4648 * Called when window activated
4650 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4652 SUIT_DataBrowser* anOB = objectBrowser();
4655 SUIT_DataObject* rootObj = anOB->root();
4659 DataObjectList listObj = rootObj->children( true );
4661 SUIT_ViewModel* vmod = 0;
4662 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4663 vmod = vman->getViewModel();
4664 updateVisibilityState( listObj, vmod );
4668 Called then view manager removed
4670 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4672 ViewManagerList lst;
4673 viewManagers( lst );
4674 if ( lst.count() == 1) { // in case if closed last view window
4675 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4677 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4682 Check existing document.
4684 bool LightApp_Application::checkExistingDoc()
4687 if( activeStudy() ) {
4688 int answer = SUIT_MessageBox::question( desktop(),
4689 tr( "APPCLOSE_CAPTION" ),
4690 tr( "STUDYCLOSE_DESCRIPTION" ),
4691 tr( "APPCLOSE_SAVE" ),
4692 tr( "APPCLOSE_CLOSE" ),
4693 tr( "APPCLOSE_CANCEL" ), 0 );
4695 if ( activeStudy()->isSaved() ) {
4698 } else if ( onSaveAsDoc() ) {
4699 if( !closeDoc( false ) ) {
4706 else if( answer == 1 ) {
4708 } else if( answer == 2 ) {
4715 #ifndef DISABLE_PYCONSOLE
4717 PyConsole_Interp* LightApp_Application::getPyInterp()
4719 static PyConsole_Interp* myInterp = 0;
4721 myInterp = createPyInterp();
4725 PyConsole_Interp* LightApp_Application::createPyInterp()
4727 return new LightApp_PyInterp();
4730 #endif // DISABLE_PYCONSOLE