1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39 #include <PyConsole_Console.h>
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
61 #include <GUI_version.h>
63 #include <SALOME_Event.h>
65 #include <Style_Salome.h>
66 #include <Style_PrefDlg.h>
68 #include <CAM_Module.h>
69 #include <CAM_DataModel.h>
70 #include <CAM_Study.h>
71 #include <STD_TabDesktop.h>
73 #include <SUIT_DataBrowser.h>
74 #include <SUIT_Session.h>
75 #include <SUIT_Study.h>
76 #include <SUIT_FileDlg.h>
77 #include <SUIT_ResourceMgr.h>
78 #include <SUIT_ShortcutMgr.h>
79 #include <SUIT_Tools.h>
80 #include <SUIT_Accel.h>
81 #include <SUIT_MessageBox.h>
82 #include <SUIT_ViewWindow.h>
85 #include <QtxToolBar.h>
86 #include <QtxTreeView.h>
87 #include <QtxMRUAction.h>
88 #include <QtxDockAction.h>
89 #include <QtxDockWidget.h>
90 #include <QtxActionToolMgr.h>
91 #include <QtxSearchTool.h>
92 #include <QtxWorkstack.h>
95 #include <LogWindow.h>
97 #ifndef DISABLE_GLVIEWER
98 #include <GLViewer_Viewer.h>
99 #include <GLViewer_ViewManager.h>
100 #include "LightApp_GLSelector.h"
103 #ifndef DISABLE_PLOT2DVIEWER
104 #include <Plot2d_ViewManager.h>
105 #include <Plot2d_ViewModel.h>
106 #include <Plot2d_ViewWindow.h>
107 #include <Plot2d_ViewFrame.h>
108 #include "LightApp_Plot2dSelector.h"
109 #ifndef DISABLE_SALOMEOBJECT
110 #include <SPlot2d_ViewModel.h>
112 #include <Plot2d_ViewModel.h>
116 #ifndef DISABLE_OCCVIEWER
117 #include <OCCViewer_ViewManager.h>
118 #include <OCCViewer_ViewFrame.h>
119 #ifndef DISABLE_SALOMEOBJECT
120 #include <SOCC_ViewModel.h>
122 #include <OCCViewer_ViewModel.h>
124 #include "LightApp_OCCSelector.h"
127 #ifndef DISABLE_VTKVIEWER
128 #ifndef DISABLE_SALOMEOBJECT
129 #include <SVTK_ViewModel.h>
130 #include <SVTK_ViewManager.h>
131 #include "LightApp_VTKSelector.h"
133 #include <VTKViewer_ViewModel.h>
134 #include <VTKViewer_ViewManager.h>
136 #include <VTKViewer_ViewModel.h>
139 #ifndef DISABLE_QXGRAPHVIEWER
140 #include <QxScene_ViewManager.h>
141 #include <QxScene_ViewModel.h>
142 #include <QxScene_ViewWindow.h>
145 #ifndef DISABLE_GRAPHICSVIEW
146 #include "GraphicsView_Viewer.h"
147 #include "GraphicsView_ViewManager.h"
148 #include "LightApp_GVSelector.h"
151 #ifndef DISABLE_PVVIEWER
152 #include "PVViewer_ViewManager.h"
153 #include "PVViewer_ViewWindow.h"
154 #include "PVViewer_ViewModel.h"
157 #ifndef DISABLE_PYVIEWER
158 #include <PyViewer_ViewManager.h>
159 #include <PyViewer_ViewModel.h>
160 #include <PyViewer_ViewWindow.h>
164 #define VISIBILITY_COLUMN_WIDTH 25
170 #include <QStringList>
172 #include <QApplication>
174 #include <QStatusBar>
176 #include <QObjectList>
178 #include <QInputDialog>
179 #include <QFontDatabase>
181 #include <QByteArray>
185 #include <QHeaderView>
190 #include <utilities.h>
192 #define FIRST_HELP_ID 1000000
194 #ifndef DISABLE_SALOMEOBJECT
195 #include <SALOME_InteractiveObject.hxx>
196 #include <SALOME_ListIO.hxx>
199 #include <Standard_Version.hxx>
201 #define ToolBarMarker 0
202 #define DockWidgetMarker 1
204 static const char* imageEmptyIcon[] = {
207 "....................",
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "...................."};
228 int LightApp_Application::lastStudyId = 0;
230 // Markers used to parse array with dockable windows and toolbars state.
231 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
232 // in the Qt source code.
234 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
235 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
237 // Format of the Byte array with the windows and toolbar state is:
238 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
240 //Find toolbar marker position in the array in the following way:
241 //since the 'toolbar marker' is not unique, find index of first occurrence of the
242 //'toolbar marker' in the array and check that next string is name of the toolbar
244 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
245 int aResult = -1,tmp = 0;
246 int inputLen = input.length();
247 QDataStream anInputData(&input, QIODevice::ReadOnly);
248 while(tmp < inputLen) {
249 tmp = input.indexOf(QToolBarMarker, tmp + 1);
252 anInputData.device()->seek(tmp);
256 anInputData >> lines;
258 if(lines == 0 && anInputData.atEnd()){
259 //Case then array doesn't contain information about toolbars,
270 if(aFlags.contains(str)) {
279 \return last global id of study
281 int LightApp_Application::studyId()
283 return LightApp_Application::lastStudyId;
286 /*!Create new instance of LightApp_Application.*/
287 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
289 return new LightApp_Application();
292 /*! \var global preferences of LightApp */
293 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
297 \class LightApp_Application
298 Application containing LightApp module
302 LightApp_Application::LightApp_Application()
303 : CAM_Application( false ),
305 myScreenHelper(new LightApp_FullScreenHelper())
307 Q_INIT_RESOURCE( LightApp );
309 STD_TabDesktop* desk = new STD_TabDesktop();
310 desk->setFullScreenAllowed(false);
311 desk->setMinimizeAllowed(false);
315 // initialize auto save timer
316 myAutoSaveTimer = new QTimer( this );
317 myAutoSaveTimer->setSingleShot( true );
318 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
320 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
321 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
323 desktop()->setWindowIcon( aLogo );
324 desktop()->setDockableMenuBar( false );
325 desktop()->setDockableStatusBar( false );
327 // base logo (salome itself)
328 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
329 // extra logo (salome-based application)
330 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
334 mySelMgr = new LightApp_SelectionMgr( this );
336 myAccel = SUIT_Accel::getAccel();
338 #ifndef DISABLE_OCCVIEWER
339 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
340 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
341 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
342 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
343 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
352 #ifndef DISABLE_VTKVIEWER
353 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
354 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
355 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
356 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
366 #ifndef DISABLE_PLOT2DVIEWER
367 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
377 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
378 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
379 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
380 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
381 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
384 // Set existing font for the python console in resources
385 if( !aResMgr->hasValue( "PyConsole", "font" ) )
388 QFont f = aResMgr->fontValue( "PyConsole", "font" );
390 QStringList famdb = fdb.families();
392 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
395 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
397 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
400 if ( famdb.contains(aFamily) )
402 f.setFamily( aFamily );
403 aResMgr->setValue( "PyConsole", "font", f );
410 *\li Save window geometry.
411 *\li Save desktop geometry.
412 *\li Save resource maneger.
413 *\li Delete selection manager.
415 LightApp_Application::~LightApp_Application()
418 delete myScreenHelper;
421 /*!Start application.*/
422 void LightApp_Application::start()
424 CAM_Application::start();
427 updateViewManagers();
428 updateCommandsStatus();
431 desktop()->statusBar()->showMessage( "" );
433 LightApp_EventFilter::Init();
436 /*!Closeapplication.*/
437 void LightApp_Application::closeApplication()
439 QProcess::startDetached( "HelpBrowser",
440 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
442 CAM_Application::closeApplication();
445 /*!Gets application name.*/
446 QString LightApp_Application::applicationName() const
448 static QString _app_name;
449 if ( _app_name.isEmpty() )
450 _app_name = tr( "APP_NAME" );
454 /*!Gets application version.*/
455 QString LightApp_Application::applicationVersion() const
457 static QString _app_version;
459 if ( _app_version.isEmpty() )
461 QString resVersion = tr( "APP_VERSION" );
462 if ( resVersion != "APP_VERSION" )
464 _app_version = resVersion;
468 _app_version = GUI_VERSION_STR;
474 /*!Load module by \a name.*/
475 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
477 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
480 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
481 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
482 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
487 /*!Activate module by \a modName*/
488 bool LightApp_Application::activateModule( const QString& modName )
491 CAM_Module* prevMod = activeModule();
494 actName = prevMod->moduleName();
496 if ( actName == modName )
499 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
501 saveDockWindowsState();
503 bool status = CAM_Application::activateModule( modName );
505 updateModuleActions();
513 updateViewManagers();
515 if ( activeStudy() && activeStudy()->root() && objectBrowser() && objectBrowser()->root() != activeStudy()->root() ) {
516 objectBrowser()->setRoot( activeStudy()->root() );
517 updateObjectBrowser( true );
522 /*!Gets selection manager.*/
523 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
528 /*!Creat action "New window" for certain type of viewer:*/
529 void LightApp_Application::createActionForViewer( const int id,
531 const QString& suffix,
534 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
535 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
536 QAction* a = createAction( id, // menu action id
543 false, // toggle flag
545 SLOT( onNewWindow() ) ); // slot
546 createMenu( a, parentId, -1 );
551 void LightApp_Application::createActions()
553 CAM_Application::createActions();
555 SUIT_Desktop* desk = desktop();
556 SUIT_ResourceMgr* resMgr = resourceMgr();
559 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
560 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
561 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
565 // - Help for modules
567 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
568 createMenu( separator(), helpMenu, -1, 10 );
569 QStringList aModuleList;
570 modules( aModuleList, false );
571 aModuleList.prepend( "GUI" );
572 aModuleList.prepend( "KERNEL" );
574 int id = LightApp_Application::UserID + FIRST_HELP_ID;
577 foreach( aModule, aModuleList ) {
578 if ( aModule.isEmpty() ) // module title (user name)
580 IMap <QString, QString> helpData; // list of help files for the module
581 QString helpSubMenu; // help submenu name (empty if not needed)
582 QString modName = moduleName( aModule ); // module name
583 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
584 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
585 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
587 if (resMgr->hasValue( modName, "documentation" ) )
588 docSection = resMgr->stringValue(modName, "documentation");
589 else if ( resMgr->hasSection( modName + "_documentation" ) )
590 docSection = modName + "_documentation";
591 if ( !docSection.isEmpty() ) {
592 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
593 QStringList listOfParam = resMgr->parameters( docSection );
594 foreach( QString paramName, listOfParam ) {
595 QString valueStr = resMgr->stringValue( docSection, paramName );
596 if ( !valueStr.isEmpty() ) {
597 QFileInfo fi( valueStr );
598 if ( fi.isRelative() && !modDir.isEmpty() )
599 valueStr = Qtx::addSlash( modDir ) + valueStr;
600 if ( QFile::exists( valueStr ) )
601 helpData.insert( paramName.arg( aModule ), valueStr );
606 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
607 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
608 QString indexFile = idxLst.join( QDir::separator() ); // index file
609 if ( QFile::exists( indexFile ) )
610 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
613 IMapConstIterator<QString, QString > fileIt;
614 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
615 QString helpFileName = fileIt.key();
616 // remove all '//' occurances
617 while ( helpFileName.contains( "//" ) )
618 helpFileName.replace( "//", "" );
619 // obtain submenus hierarchy if given
620 QStringList smenus = helpFileName.split( "/" );
621 helpFileName = smenus.last();
623 QAction* a = createAction( id, helpFileName,
624 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
625 helpFileName, helpFileName,
626 0, desk, false, this, SLOT( onHelpContentsModule() ) );
627 a->setData( fileIt.value() );
628 if ( !helpSubMenu.isEmpty() ) {
629 smenus.prepend( helpSubMenu );
631 // create sub-menus hierarchy
632 int menuId = helpMenu;
633 foreach ( QString subMenu, smenus ) {
634 menuId = createMenu( subMenu, menuId, -1, 0 );
636 createMenu( a, menuId, -1, 0 );
641 // - Additional help items
643 createMenu( separator(), helpMenu, -1, 5 );
645 QStringList addHelpItems = resMgr->parameters( "add_help" );
646 foreach ( QString addHelpItem, addHelpItems ) {
647 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
648 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
649 QAction* a = createAction( id, addHelpItem,
650 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
651 addHelpItem, addHelpItem,
652 0, desk, false, this, SLOT( onHelpContentsModule() ) );
653 a->setData( valueStr );
654 createMenu( a, helpMenu, -1, 5 );
660 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
661 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
662 registerAction( MRUId, mru );
664 // default icon for neutral point ('SALOME' module)
665 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
666 if ( defIcon.isNull() )
667 defIcon = QPixmap( imageEmptyIcon );
669 //! default icon for any module
670 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
671 if ( modIcon.isNull() )
672 modIcon = QPixmap( imageEmptyIcon );
675 modules( modList, false );
677 if ( modList.count() > 1 )
679 LightApp_ModuleAction* moduleAction =
680 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
682 QMap<QString, QString> iconMap;
683 moduleIconNames( iconMap );
685 const int iconSize = 20;
687 QStringList::Iterator it;
688 for ( it = modList.begin(); it != modList.end(); ++it )
690 if ( !isLibExists( *it ) )
693 QString modName = moduleName( *it );
695 if ( !isModuleAccessible( *it ) )
699 if ( iconMap.contains( *it ) )
700 iconName = iconMap[*it];
702 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
706 INFOS ( "\n****************************************************************" << std::endl
707 << "* Icon for " << (*it).toLatin1().constData()
708 << " not found. Using the default one." << std::endl
709 << "****************************************************************" << std::endl );
712 icon = Qtx::scaleIcon( icon, iconSize );
714 moduleAction->insertModule( *it, icon );
717 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
718 this, SLOT( onModuleActivation( const QString& ) ) );
719 registerAction( ModulesListId, moduleAction );
723 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
724 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
726 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
727 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
728 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
729 0, desk, false, this, SLOT( onCloseAllWindow() ) );
730 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
731 0, desk, false, this, SLOT( onGroupAllWindow() ) );
733 createMenu( CloseId, windowMenu, 0, -1 );
734 createMenu( CloseAllId, windowMenu, 0, -1 );
735 createMenu( GroupAllId, windowMenu, 0, -1 );
736 createMenu( separator(), windowMenu, -1, 0 );
738 #ifndef DISABLE_GLVIEWER
739 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
741 #ifndef DISABLE_PLOT2DVIEWER
742 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
744 #ifndef DISABLE_OCCVIEWER
745 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
747 #ifndef DISABLE_VTKVIEWER
748 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
750 #ifndef DISABLE_QXGRAPHVIEWER
751 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
753 #ifndef DISABLE_GRAPHICSVIEW
754 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
756 #ifndef DISABLE_PVVIEWER
757 QStringList aModuleNames;
758 modules( aModuleNames, false );
759 if ( aModuleNames.contains( "ParaViS", Qt::CaseInsensitive ) )
760 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
762 #ifndef DISABLE_PYVIEWER
763 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
766 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
767 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
768 createMenu( RenameId, windowMenu, -1 );
770 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
771 createMenu( PreferencesId, fileMenu, 50, -1 );
772 createMenu( separator(), fileMenu, -1, 50, -1 );
774 createMenu( separator(), fileMenu, -1, 100, -1 );
775 createMenu( MRUId, fileMenu, 100, -1 );
776 createMenu( separator(), fileMenu, -1, 100, -1 );
778 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
779 0, desk, false, this, SLOT( onStylePreferences() ) );
781 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
782 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
785 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
786 createMenu( separator(), viewMenu, -1, 20, -1 );
787 createMenu( StyleId, viewMenu, 20, -1 );
788 createMenu( FullScreenId, viewMenu, 20, -1 );
790 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
791 QString( "SalomeModules" ) ); // name (language-independant)
792 createTool( ModulesListId, modTBar );
795 /*!On module activation action.*/
796 void LightApp_Application::onModuleActivation( const QString& modName )
798 // Force user to create/open a study before module activation
799 QMap<QString, QString> iconMap;
800 moduleIconNames( iconMap );
801 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
803 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
805 bool cancelled = false;
807 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
808 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
809 QMap<int, QString> opmap = activateModuleActions();
810 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
811 aDlg.addButton( it.value(), it.key() );
813 int res = aDlg.exec();
815 // some operation is selected
816 moduleActionSelected( res );
820 putInfo( tr("INF_CANCELLED") );
822 LightApp_ModuleAction* moduleAction =
823 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
825 moduleAction->setActiveModule( QString() );
831 activateModule( modName );
834 /*!Default module activation.*/
835 QString LightApp_Application::defaultModule() const
837 QStringList aModuleNames;
838 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
839 //! If there's the one and only module --> activate it automatically
840 //! TODO: Possible improvement - default module can be taken from preferences
841 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
844 /*!On new window slot.*/
845 void LightApp_Application::onNewWindow()
847 const QObject* obj = sender();
848 if ( !obj || !obj->inherits( "QAction" ) )
852 int id = actionId( (QAction*)obj );
855 #ifndef DISABLE_GLVIEWER
857 type = GLViewer_Viewer::Type();
860 #ifndef DISABLE_PLOT2DVIEWER
862 type = Plot2d_Viewer::Type();
865 #ifndef DISABLE_OCCVIEWER
867 type = OCCViewer_Viewer::Type();
870 #ifndef DISABLE_VTKVIEWER
872 type = VTKViewer_Viewer::Type();
875 #ifndef DISABLE_QXGRAPHVIEWER
876 case NewQxSceneViewId:
877 type = QxScene_Viewer::Type();
880 #ifndef DISABLE_GRAPHICSVIEW
881 case NewGraphicsViewId:
882 type = GraphicsView_Viewer::Type();
885 #ifndef DISABLE_PVVIEWER
887 type = PVViewer_Viewer::Type();
890 #ifndef DISABLE_PYVIEWER
892 type = PyViewer_Viewer::Type();
897 if ( !type.isEmpty() )
898 createViewManager( type );
902 SLOT: Creates new document
904 void LightApp_Application::onNewDoc()
906 #ifdef SINGLE_DESKTOP
907 if ( !checkExistingDoc() )
911 //asl: fix for 0020515
912 saveDockWindowsState();
914 CAM_Application::onNewDoc();
918 SLOT: Opens new document
920 void LightApp_Application::onOpenDoc()
922 SUIT_Study* study = activeStudy();
924 #ifdef SINGLE_DESKTOP
925 if ( !checkExistingDoc() )
929 CAM_Application::onOpenDoc();
931 if ( !study ) // new study will be create in THIS application
934 updateViewManagers();
939 SLOT: Opens new document.
940 \param aName - name of file
942 bool LightApp_Application::onOpenDoc( const QString& aName )
944 #ifdef SINGLE_DESKTOP
945 if ( !checkExistingDoc() )
949 saveDockWindowsState();
951 // We should take mru action first because this application instance can be deleted later.
952 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
954 bool res = CAM_Application::onOpenDoc( aName );
959 mru->insert( aName );
961 mru->remove( aName );
967 SLOT: Displays "About" message box
969 void LightApp_Application::onHelpAbout()
971 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
976 Private SLOT: Called on selection is changed
977 Dispatchs active module that selection is changed
979 void LightApp_Application::onSelection()
981 onSelectionChanged();
983 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
984 ((LightApp_Module*)activeModule())->selectionChanged();
989 \param study - SUIT_Study.
991 void LightApp_Application::setActiveStudy( SUIT_Study* study )
993 CAM_Application::setActiveStudy( study );
997 Enables/Disables menu items and toolbar buttons. Rebuild menu
999 void LightApp_Application::updateCommandsStatus()
1001 CAM_Application::updateCommandsStatus();
1004 #ifndef DISABLE_GLVIEWER
1005 a = action( NewGLViewId );
1007 a->setEnabled( activeStudy() );
1010 #ifndef DISABLE_PLOT2DVIEWER
1011 a = action( NewPlot2dId );
1013 a->setEnabled( activeStudy() );
1016 #ifndef DISABLE_OCCVIEWER
1017 a = action( NewOCCViewId );
1019 a->setEnabled( activeStudy() );
1022 #ifndef DISABLE_VTKVIEWER
1023 a = action( NewVTKViewId );
1025 a->setEnabled( activeStudy() );
1028 #ifndef DISABLE_QXGRAPHVIEWER
1029 a = action( NewQxSceneViewId );
1031 a->setEnabled( activeStudy() );
1034 #ifndef DISABLE_GRAPHICSVIEW
1035 a = action( NewGraphicsViewId );
1037 a->setEnabled( activeStudy() );
1040 #ifndef DISABLE_PVVIEWER
1041 a = action( NewPVViewId );
1043 a->setEnabled( activeStudy() );
1046 #ifndef DISABLE_PYVIEWER
1047 a = action( NewPyViewerId );
1049 a->setEnabled( activeStudy() );
1055 Runs system command in separate thread
1057 class RunBrowser: public QThread
1060 RunBrowser( LightApp_Application* app,
1061 const QString& theApp,
1062 const QString& theParams,
1063 const QString& theHelpFile,
1064 const QString& theContext = QString() )
1066 myParams( theParams ),
1067 myContext( theContext ),
1071 //For the external browser always specify 'file://' protocol,
1072 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1073 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1078 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1079 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1081 QProcess* proc = new QProcess();
1083 proc->start( aCommand );
1084 if ( !proc->waitForStarted() ) {
1085 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1086 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1087 ce2000->setData( msg );
1088 QApplication::postEvent( myLApp, ce2000 );
1099 LightApp_Application* myLApp;
1103 SLOT: Displays help contents for choosen module
1105 void LightApp_Application::onHelpContentsModule()
1107 const QAction* a = (QAction*) sender();
1108 QString helpFile = a->data().toString();
1109 if ( helpFile.isEmpty() ) return;
1111 SUIT_ResourceMgr* resMgr = resourceMgr();
1114 platform = "winapplication";
1116 platform = "application";
1118 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1120 QString quote("\"");
1121 anApp.prepend( quote );
1122 anApp.append( quote );
1124 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1125 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1127 if( useExtBrowser ) {
1128 if ( !anApp.isEmpty() ) {
1129 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1133 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1134 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1135 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1137 showPreferences( tr( "PREF_APP" ) );
1141 QStringList parameters;
1142 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1143 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1144 parameters << helpFile;
1145 QProcess::startDetached( "HelpBrowser", parameters );
1150 SLOT: Displays help contents for choosen dialog
1152 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1153 const QString& theFileName,
1154 const QString& theContext )
1156 QString fileName = theFileName;
1157 QString context = theContext;
1158 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1159 // context might be passed within theFileName argument
1160 QStringList comps = fileName.split("#");
1161 if ( comps.count() > 1 ) {
1162 context = comps.last();
1164 fileName = comps.join("#");
1168 QString homeDir = "";
1169 if ( !theComponentName.isEmpty() ) {
1170 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1171 if ( !dir.isEmpty() )
1172 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1173 Qtx::addSlash( "share" ) +
1174 Qtx::addSlash( "doc" ) +
1175 Qtx::addSlash( "salome" ) +
1176 Qtx::addSlash( "gui" ) +
1177 Qtx::addSlash( theComponentName ) );
1180 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1181 SUIT_ResourceMgr* resMgr = resourceMgr();
1184 platform = "winapplication";
1186 platform = "application";
1188 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1190 QString quote("\"");
1191 anApp.prepend( quote );
1192 anApp.append( quote );
1195 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1198 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1200 if ( !anApp.isEmpty() ) {
1201 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1205 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1206 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1207 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1208 showPreferences( tr( "PREF_APP" ) );
1212 QStringList parameters;
1213 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1214 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1215 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1216 QProcess::startDetached( "HelpBrowser", parameters );
1221 Sets enable or disable some actions on selection changed.
1223 void LightApp_Application::onSelectionChanged()
1225 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1226 bool canCopy = m ? m->canCopy() : false;
1227 bool canPaste = m ? m->canPaste() : false;
1229 action( EditCopyId )->setEnabled(canCopy);
1230 action( EditPasteId )->setEnabled(canPaste);
1234 SLOT: Performs some actions when dockable windows are triggered
1236 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1240 QWidget* LightApp_Application::dockWindow( const int id ) const
1243 if ( myWin.contains( id ) )
1248 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1253 QDockWidget* dock = 0;
1254 QWidget* w = wid->parentWidget();
1255 while ( w && !dock )
1257 dock = ::qobject_cast<QDockWidget*>( w );
1258 w = w->parentWidget();
1263 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1268 if ( wid != dockWindow( id ) )
1269 removeDockWindow( id );
1271 myWin.insert( id, wid );
1273 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1274 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1276 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1277 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1278 QString( "%1Dock" ).arg( wid->objectName() ) );
1279 dock->setWidget( wid );
1280 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1281 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1282 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1284 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1285 if ( !accel.isEmpty() )
1286 dock->toggleViewAction()->setShortcut( accel );
1291 void LightApp_Application::removeDockWindow( const int id )
1293 QWidget* wid = dockWindow( id );
1299 QDockWidget* dock = windowDock( wid );
1303 dock->setWidget( 0 );
1304 wid->setParent( 0 );
1305 wid->setVisible( false );
1309 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1311 QDockWidget* dock = windowDock( dockWindow( id ) );
1312 if ( dock && desktop() ) {
1313 desktop()->addDockWidget( place, dock );
1314 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1315 if ( a ) a->update();
1321 \param flag - key for window
1322 \param studyId - study id
1323 Flag used how identificator of window in windows list.
1325 QWidget* LightApp_Application::getWindow( const int flag, const int )
1327 QWidget* wid = dockWindow( flag );
1329 insertDockWindow( flag, wid = createWindow( flag ) );
1331 QMap<int, int> winMap;
1332 currentWindows( winMap );
1333 if ( winMap.contains( flag ) )
1334 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1340 \return Object Browser
1342 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1344 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1350 LogWindow* LightApp_Application::logWindow()
1352 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1355 #ifndef DISABLE_PYCONSOLE
1357 This returns the python console integrated to the GUI. Depending
1358 when you request the python console, this function could return
1359 null. Then the optional parameter force (default to false) can be
1360 set to force the creation of the python console if it is not done
1362 \param force - if true, the pythonConsole is created if it does not exist yet
1363 \return Python Console
1365 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1367 QWidget* wid = dockWindow( WT_PyConsole );
1368 if ( !wid && force==true) {
1369 wid = getWindow(WT_PyConsole);
1371 return qobject_cast<PyConsole_Console*>( wid );
1376 Updates object browser and maybe data models
1377 \param updateModels - if it is true, then data models are updated
1379 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1381 // update existing data models
1384 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1385 if ( objectBrowser() )
1386 objectBrowser()->setAutoUpdate( false );
1388 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1390 CAM_Study::ModelList dm_list;
1391 study->dataModels( dm_list );
1392 QListIterator<CAM_DataModel*> it( dm_list );
1393 while ( it.hasNext() ) {
1394 CAM_DataModel* camDM = it.next();
1395 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1396 ((LightApp_DataModel*)camDM)->update();
1400 if( objectBrowser() )
1401 objectBrowser()->setAutoUpdate( isAutoUpdate );
1404 if ( objectBrowser() ) {
1405 objectBrowser()->updateGeometry();
1406 objectBrowser()->updateTree( 0, false );
1413 LightApp_Preferences* LightApp_Application::preferences() const
1415 return preferences( false );
1419 \return first view manager of some type
1420 \param vmType - type of view manager
1421 \param create - is it necessary to create view manager in case, when there is no manager of such type
1423 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1425 SUIT_ViewManager* aVM = viewManager( vmType );
1426 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1428 if ( anActiveVM && anActiveVM->getType() == vmType )
1431 if ( aVM && create )
1433 if ( !aVM->getActiveView() )
1436 desktop()->setActiveWindow( aVM->getActiveView() );
1439 aVM = createViewManager( vmType );
1445 Creates view manager of some type
1446 \param vmType - type of view manager
1448 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1450 SUIT_ResourceMgr* resMgr = resourceMgr();
1452 SUIT_ViewManager* viewMgr = 0;
1453 #ifndef DISABLE_GLVIEWER
1454 if( vmType == GLViewer_Viewer::Type() )
1456 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1457 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1460 #ifndef DISABLE_PLOT2DVIEWER
1461 if( vmType == Plot2d_Viewer::Type() )
1463 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1465 #ifndef DISABLE_SALOMEOBJECT
1466 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1468 new LightApp_Plot2dSelector( v, mySelMgr );
1470 vm = new Plot2d_Viewer();
1472 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1473 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1476 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1477 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1481 #ifndef DISABLE_QXGRAPHVIEWER
1482 if( vmType == QxScene_Viewer::Type() )
1484 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1485 QxScene_Viewer* vm = new QxScene_Viewer();
1486 viewMgr->setViewModel( vm );
1487 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1490 #ifndef DISABLE_GRAPHICSVIEW
1491 if( vmType == GraphicsView_Viewer::Type() )
1493 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1494 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1497 #ifndef DISABLE_PVVIEWER
1498 if( vmType == PVViewer_Viewer::Type() )
1500 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1501 viewMgr->getActiveView()->setFocus();
1504 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1508 #ifndef DISABLE_PYVIEWER
1509 if( vmType == PyViewer_Viewer::Type() )
1511 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1514 #ifndef DISABLE_OCCVIEWER
1515 if( vmType == OCCViewer_Viewer::Type() )
1517 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1518 OCCViewer_Viewer* vm;
1519 #ifndef DISABLE_SALOMEOBJECT
1520 vm = new SOCC_Viewer();
1522 vm = new OCCViewer_Viewer( true );
1524 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1525 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1526 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1527 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1528 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1529 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1530 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1531 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1533 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1534 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1535 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1536 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1537 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1538 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1539 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1540 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1541 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1542 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1543 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1546 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1547 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1550 #ifndef DISABLE_VTKVIEWER
1551 #ifndef DISABLE_SALOMEOBJECT
1552 if ( vmType == SVTK_Viewer::Type() )
1554 if ( vmType == VTKViewer_Viewer::Type() )
1557 #ifndef DISABLE_SALOMEOBJECT
1558 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1559 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1562 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1563 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1564 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1565 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1566 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1567 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1568 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1569 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1570 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1571 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1572 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1573 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1574 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1575 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1576 new LightApp_VTKSelector( vm, mySelMgr );
1579 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1580 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1582 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1590 addViewManager( viewMgr );
1591 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1593 if ( viewWin && desktop() ) {
1594 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1595 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1601 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1603 SUIT_ResourceMgr* resMgr = resourceMgr();
1605 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1607 new LightApp_WgViewModel( vmType, w ) );
1608 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1610 addViewManager( vm );
1611 SUIT_ViewWindow* vw = vm->createViewWindow();
1612 if ( vw && desktop() ) {
1613 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1614 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1617 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1618 myUserWmTypes << vmType;
1623 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1625 SUIT_ResourceMgr* resMgr = resourceMgr();
1627 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1631 QString vmType = vm->getType();
1633 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1635 addViewManager( vm );
1636 SUIT_ViewWindow* vw = vm->createViewWindow();
1637 if ( vw && desktop() ) {
1638 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1639 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1642 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1643 myUserWmTypes << vmType;
1649 SLOT: Removes view manager from application
1651 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1653 removeViewManager( theVM );
1657 Protected SLOT: On study created.
1658 \param theStudy - just created study
1660 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1662 SUIT_DataObject* aRoot = 0;
1663 if ( theStudy && theStudy->root() )
1665 aRoot = theStudy->root();
1666 //aRoot->setName( tr( "DATA_MODELS" ) );
1669 getWindow( WT_ObjectBrowser );
1671 loadDockWindowsState();
1673 if ( objectBrowser() )
1674 objectBrowser()->setRoot( aRoot );
1676 activateModule( defaultModule() );
1678 if ( objectBrowser() )
1679 objectBrowser()->openLevels();
1681 #ifndef DISABLE_PYCONSOLE
1682 if( pythonConsole() )
1683 getPyInterp()->initStudy();
1688 Protected SLOT: On study opened.
1689 \param theStudy - just opened study
1691 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1693 SUIT_DataObject* aRoot = 0;
1694 if ( theStudy && theStudy->root() )
1696 aRoot = theStudy->root();
1700 getWindow( WT_ObjectBrowser );
1702 loadDockWindowsState();
1704 if ( objectBrowser() )
1705 objectBrowser()->setRoot( aRoot );
1707 activateModule( defaultModule() );
1709 if ( objectBrowser() )
1710 objectBrowser()->openLevels();
1712 #ifndef DISABLE_PYCONSOLE
1713 if( pythonConsole() )
1714 getPyInterp()->initStudy();
1720 /*!Protected SLOT. On study saved.*/
1721 void LightApp_Application::onStudySaved( SUIT_Study* s )
1723 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1725 mru->insert( s->studyName() );
1730 /*!Protected SLOT. On study closed.*/
1731 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1734 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1735 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1738 // stop auto-save timer
1739 myAutoSaveTimer->stop();
1741 // Bug 10396: clear selection
1742 mySelMgr->clearSelected();
1744 // Bug 12944: emit signal only after clear selection
1747 activateModule( "" );
1750 /*!Protected SLOT.On desktop activated.*/
1751 void LightApp_Application::onDesktopActivated()
1753 CAM_Application::onDesktopActivated();
1754 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1756 aModule->studyActivated();
1759 void LightApp_Application::studyOpened( SUIT_Study* s )
1761 CAM_Application::studyOpened( s );
1764 updateViewManagers();
1767 void LightApp_Application::studySaved( SUIT_Study* s )
1769 CAM_Application::studyOpened( s );
1770 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1771 if ( aResMgr && activeStudy() ) {
1772 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1773 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1777 void LightApp_Application::studyCreated( SUIT_Study* s )
1779 CAM_Application::studyCreated( s );
1782 updateViewManagers();
1785 /*!Gets file filter.
1786 *\retval QString "(*.bin)"
1788 QString LightApp_Application::getFileFilter() const
1796 Shows file dialog and return user selected file name
1798 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1799 const QString& caption, QWidget* parent )
1803 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1804 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1807 /*! Gets directory*/
1808 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1812 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1815 /*! Get open file names*/
1816 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1817 const QString& caption, QWidget* parent )
1821 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1822 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1825 /*!Private SLOT. Update object browser.*/
1826 void LightApp_Application::onRefresh()
1828 updateObjectBrowser( true );
1831 /*!Private SLOT. Update actions after rename object.*/
1832 void LightApp_Application::onRenamed()
1834 activeStudy()->Modified();
1838 /*!Private SLOT. Support drag-and-drop operation.*/
1839 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1841 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1845 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1847 aModule->dropObjects( objects, parentObj, row, action );
1850 /*!Private SLOT. On preferences.*/
1851 void LightApp_Application::onPreferences()
1853 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1856 /*!Private SLOT. On preferences.*/
1857 void LightApp_Application::showPreferences( const QString& itemText )
1859 QApplication::setOverrideCursor( Qt::WaitCursor );
1861 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1863 QApplication::restoreOverrideCursor();
1868 preferences()->activateItem( itemText );
1870 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1873 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1874 resourceMgr()->save();
1877 shortcutMgr()->updateShortcuts();
1883 /*!Protected SLOT. On preferences changed.*/
1884 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1886 LightApp_Module* sMod = 0;
1887 CAM_Module* mod = module( modName );
1888 if ( mod && mod->inherits( "LightApp_Module" ) )
1889 sMod = (LightApp_Module*)mod;
1892 sMod->preferencesChanged( section, param );
1894 preferencesChanged( section, param );
1895 // emit signal to allow additional preferences changing processing
1896 emit preferenceChanged( modName, section, param );
1899 /*!Remove all windows from study.*/
1900 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1902 saveDockWindowsState();
1904 if ( SUIT_DataBrowser* ob = objectBrowser() )
1907 CAM_Application::beforeCloseDoc( s );
1910 /*!Update actions.*/
1911 void LightApp_Application::updateActions()
1913 updateCommandsStatus();
1919 SUIT_Study* LightApp_Application::createNewStudy()
1921 LightApp_Application::lastStudyId++;
1923 LightApp_Study* aStudy = new LightApp_Study( this );
1925 // Set up processing of major study-related events
1926 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1927 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1928 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1929 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1935 Creates window by flag.
1936 \param flag - identificator of window type
1938 QWidget* LightApp_Application::createWindow( const int flag )
1942 SUIT_ResourceMgr* resMgr = resourceMgr();
1944 if ( flag == WT_ObjectBrowser )
1946 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1947 ob->setObjectName( "objectBrowser" );
1948 ob->setSortMenuEnabled( true );
1949 ob->setAutoUpdate( true );
1950 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1951 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1953 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1954 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1955 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1957 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1958 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1959 treeModel->setSearcher( this );
1960 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1961 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1963 // Mantis issue 0020136: Drag&Drop in OB
1964 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1966 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1967 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1968 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
1969 this, SLOT( onRenamed( ) ) );
1973 // temporary commented
1975 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1977 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1980 // Create OBSelector
1981 new LightApp_OBSelector( ob, mySelMgr );
1983 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1984 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1985 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1986 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1988 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1990 #ifndef DISABLE_PYCONSOLE
1991 else if ( flag == WT_PyConsole )
1993 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
1994 pyCons->setObjectName( "pythonConsole" );
1995 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1996 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1997 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1998 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2001 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2004 else if ( flag == WT_LogWindow )
2006 LogWindow* logWin = new LogWindow( desktop() );
2007 logWin->setObjectName( "logWindow" );
2008 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2009 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2011 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2017 \return default windows( Object Browser, Python Console )
2018 Adds to map \a aMap.
2020 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2022 #ifndef DISABLE_PYCONSOLE
2023 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2025 if ( activeStudy() ) {
2026 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2027 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2031 /*!Default view managers*/
2032 void LightApp_Application::defaultViewManagers( QStringList& ) const
2038 \return preferences.
2039 Create preferences, if \a crt = true.
2041 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2046 LightApp_Application* that = (LightApp_Application*)this;
2048 bool toCreate = !_prefs_ && crt;
2051 _prefs_ = new LightApp_Preferences( resourceMgr() );
2052 that->createPreferences( _prefs_ );
2055 that->myPrefs = _prefs_;
2057 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2058 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2059 connect( myPrefs, SIGNAL( resetToDefaults() ),
2060 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2065 SUIT_ResourceMgr* resMgr = resourceMgr();
2067 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2068 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2070 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2074 QStringList modNameList;
2075 app->modules( modNameList, false );
2077 QMap<QString, QString> iconMap;
2078 app->moduleIconNames( iconMap );
2080 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2082 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2085 int modId = _prefs_->addPreference( *it );
2086 if ( iconMap.contains( *it ) )
2087 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2091 app->modules( modList );
2092 QListIterator<CAM_Module*> itr( modList );
2093 while ( itr.hasNext() )
2095 LightApp_Module* mod = 0;
2097 CAM_Module* anItem = itr.next();
2098 if ( anItem->inherits( "LightApp_Module" ) )
2099 mod = (LightApp_Module*)anItem;
2101 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2103 _prefs_->addPreference( mod->moduleName() );
2104 mod->createPreferences();
2105 that->emptyPreferences( mod->moduleName() );
2109 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2115 Adds new module to application
2117 void LightApp_Application::moduleAdded( CAM_Module* mod )
2119 CAM_Application::moduleAdded( mod );
2121 LightApp_Module* lightMod = 0;
2122 if ( mod && mod->inherits( "LightApp_Module" ) )
2123 lightMod = (LightApp_Module*)mod;
2125 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2127 myPrefs->addPreference( mod->moduleName() );
2128 lightMod->createPreferences();
2129 emptyPreferences( mod->moduleName() );
2133 void LightApp_Application::emptyPreferences( const QString& modName )
2135 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2136 if ( !item || !item->isEmpty() )
2139 // printf( "---------------------> Modify for empty module.\n" );
2141 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2142 frm->setIcon( item->icon() );
2143 frm->setStretch( false );
2144 item->parentItem()->insertItem( frm, item );
2145 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2152 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2157 QStringList aValuesList;
2158 QList<QVariant> anIndicesList;
2162 // . Top-level "SALOME" preferences group <<start>>
2163 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2164 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2166 // .. "General" preferences tab <<start>>
2167 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2169 // ... "Language" group <<start>>
2170 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2171 pref->setItemProperty( "columns", 2, langGroup );
2172 // .... -> application language
2173 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2174 LightApp_Preferences::Selector, "language", "language" );
2175 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2176 QList<QVariant> aIcons;
2177 foreach ( QString aLang, aLangs ) {
2178 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2180 pref->setItemProperty( "strings", aLangs, curLang );
2181 pref->setItemProperty( "icons", aIcons, curLang );
2183 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2184 LightApp_Preferences::Bool, "language", "locale" );
2185 // ... "Language" group <<end>>
2187 // ... "Look and feel" group <<start>>
2188 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2189 pref->setItemProperty( "columns", 2, lookGroup );
2190 // .... -> show splash-screen
2191 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2192 // .... -> opaque resize
2193 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2194 // .... -> drop-down buttons
2195 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2196 // ... "Look and feel" group <<end>>
2198 // ... "Study properties" group <<start>>
2199 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2200 pref->setItemProperty( "columns", 2, studyGroup );
2201 // .... -> multi-file save
2202 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2203 // .... -> ascii save mode
2204 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2205 // .... -> store windows geometry
2206 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2207 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2208 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2209 // .... -> auto-save
2210 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2211 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2212 pref->setItemProperty( "min", 0, autoSaveInterval );
2213 pref->setItemProperty( "max", 1440, autoSaveInterval );
2214 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2215 // ... "Study properties" group <<end>>
2217 // ... "Help browser" group <<start>>
2218 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2220 QString platform = "winapplication";
2222 QString platform = "application";
2224 // .... -> browser application
2225 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2226 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2227 // .... -> browser parameters
2228 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2229 // ... "Help browser" group <<end>>
2231 // ... "Python console properties" group <<start>>
2232 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2234 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2235 // .... -> show banner
2236 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2237 // ... "Python console properties" group <<end>>
2239 // ... "MRU" preferences group <<start>>
2240 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2241 pref->setItemProperty( "columns", 4, mruGroup );
2242 // number of MRU items
2243 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2244 "MRU", "visible_count" );
2245 pref->setItemProperty( "min", 0, mruVisCount );
2246 pref->setItemProperty( "max", 100, mruVisCount );
2248 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2249 "MRU", "link_type" );
2250 aValuesList.clear();
2251 anIndicesList.clear();
2252 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2253 anIndicesList << 0 << 1 << 2 ;
2254 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2255 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2256 // ... "MRU" preferences group <<end>>
2257 // .. "General" preferences tab <<end>>
2259 // .. "3D viewer" group <<start>>
2260 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2261 // ... -> navigation mode
2262 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2263 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2264 aValuesList.clear();
2265 anIndicesList.clear();
2266 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2267 anIndicesList << 0 << 1;
2268 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2269 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2270 // ... -> zooming mode
2271 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2272 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2273 aValuesList.clear();
2274 anIndicesList.clear();
2275 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2276 anIndicesList << 0 << 1;
2277 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2278 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2279 // ... "Trihedron" group <<start>>
2280 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2281 pref->setItemProperty( "columns", 2, occTriGroup );
2282 // .... -> trihedron size
2283 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2284 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2285 pref->setItemProperty( "min", 1.0E-06, occTS );
2286 pref->setItemProperty( "max", 1000, occTS );
2287 // .... -> relative size of trihedron
2288 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2289 // .... -> show static trihedron
2290 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2291 // ... "Trihedron" group <<end>>
2292 // .. "3D viewer" group <<end>>
2296 #ifndef DISABLE_OCCVIEWER
2297 // .. "OCC viewer" group <<start>>
2298 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2300 // ... "Background" group <<start>>
2301 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2302 // pref->setItemProperty( "columns", 2, bgGroup );
2303 aValuesList.clear();
2304 anIndicesList.clear();
2306 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2307 foreach( int gid, idList ) anIndicesList << gid;
2308 // .... -> 3D viewer background
2309 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2310 LightApp_Preferences::Background, "OCCViewer", "background" );
2311 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2312 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2313 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2314 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2315 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2316 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2317 pref->setItemProperty( "custom_enabled", false, bgId );
2318 pref->setItemProperty( "image_formats", formats, bgId );
2319 // .... -> XZ viewer background
2320 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2321 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2322 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2323 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2324 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2325 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2326 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2327 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2328 pref->setItemProperty( "custom_enabled", false, bgId );
2329 pref->setItemProperty( "image_formats", formats, bgId );
2330 // .... -> YZ viewer background
2331 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2332 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2333 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2334 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2335 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2336 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2337 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2338 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2339 pref->setItemProperty( "custom_enabled", false, bgId );
2340 pref->setItemProperty( "image_formats", formats, bgId );
2341 // .... -> XY viewer background
2342 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2343 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2344 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2345 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2346 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2347 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2348 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2349 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2350 pref->setItemProperty( "custom_enabled", false, bgId );
2351 pref->setItemProperty( "image_formats", formats, bgId );
2352 // ... "Background" group <<end>>
2355 // ... "Selection" group <<start>>
2356 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2357 pref->setItemProperty( "columns", 2, occSelectionGroup );
2358 // .... -> enable preselection
2359 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2360 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2361 // .... -> enable selection
2362 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2363 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2364 // ... "Selection" group <<end>>
2366 // ... "Clipping" group <<start>>
2367 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2368 // .... -> clipping color
2369 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2370 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2371 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2372 pref->setItemProperty( "columns", 2, texturePref );
2373 // .... -> use default texture
2374 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2375 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2376 // .... -> clipping texture
2377 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2378 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2379 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2381 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2382 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2383 // .... -> scale factor
2384 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2385 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2386 pref->setItemProperty( "precision", 3, scaleFactor );
2387 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2388 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2389 pref->setItemProperty( "step", 0.1, scaleFactor );
2390 // ... "Clipping" group <<end>>
2392 // ... -> empty frame (for layout) <<start>>
2393 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2394 pref->setItemProperty( "margin", 0, occGen );
2395 pref->setItemProperty( "columns", 2, occGen );
2396 // ... -> empty frame (for layout) <<end>>
2397 // .. "OCC viewer" group <<end>>
2400 #ifndef DISABLE_VTKVIEWER
2401 // .. "VTK viewer" group <<start>>
2402 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2404 // ... -> empty frame (for layout) <<start>>
2405 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2406 //pref->setItemProperty( "columns", 2, vtkGen );
2407 // .... -> projection mode
2408 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2409 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2410 aValuesList.clear();
2411 anIndicesList.clear();
2412 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2413 anIndicesList << 0 << 1;
2414 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2415 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2416 // .... -> background
2417 aValuesList.clear();
2418 anIndicesList.clear();
2420 #ifndef DISABLE_SALOMEOBJECT
2421 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2423 foreach( int gid, idList ) anIndicesList << gid;
2424 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2425 LightApp_Preferences::Background, "VTKViewer", "background" );
2426 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2427 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2428 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2429 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2430 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2431 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2432 pref->setItemProperty( "custom_enabled", false, bgId );
2433 #ifndef DISABLE_SALOMEOBJECT
2434 pref->setItemProperty( "image_formats", formats, bgId );
2436 // .... -> speed increment
2437 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2438 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2439 pref->setItemProperty( "min", 1, vtkSpeed );
2440 pref->setItemProperty( "max", 1000, vtkSpeed );
2441 // .... -> speed mode
2442 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2443 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2444 aValuesList.clear();
2445 anIndicesList.clear();
2446 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2447 anIndicesList << 0 << 1;
2448 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2449 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2451 // ... "Selection" group <<start>>
2452 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2453 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2454 // .... -> preselection
2455 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2456 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2457 aValuesList.clear();
2458 anIndicesList.clear();
2459 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2460 anIndicesList << 0 << 1 << 2;
2461 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2462 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2463 // .... -> enable selection
2464 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2465 // ... "Selection" group <<end>>
2467 // ... -> empty frame (for layout) <<end>>
2469 // ... space mouse sub-group <<start>>
2470 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2471 //pref->setItemProperty( "columns", 2, vtkSM );
2472 // .... -> decrease speed increment
2473 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2474 LightApp_Preferences::Selector, "VTKViewer",
2475 "spacemouse_func1_btn" );
2476 // .... -> increase speed increment
2477 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2478 LightApp_Preferences::Selector, "VTKViewer",
2479 "spacemouse_func2_btn" );
2480 // .... -> dominant / combined switch
2481 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2482 LightApp_Preferences::Selector, "VTKViewer",
2483 "spacemouse_func5_btn" ); //
2484 aValuesList.clear();
2485 anIndicesList.clear();
2486 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2487 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2488 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2489 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2490 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2491 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2492 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2493 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2494 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2495 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2496 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2497 // ... space mouse sub-group <<end>>
2499 // ... avi recording sub-group <<start>>
2500 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2501 pref->setItemProperty( "columns", 2, vtkRec );
2502 // .... -> recording mode
2503 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2504 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2505 aValuesList.clear();
2506 anIndicesList.clear();
2507 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2508 anIndicesList << 0 << 1;
2509 pref->setItemProperty( "strings", aValuesList, modePref );
2510 pref->setItemProperty( "indexes", anIndicesList, modePref );
2512 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2513 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2514 pref->setItemProperty( "min", 0.1, fpsPref );
2515 pref->setItemProperty( "max", 100, fpsPref );
2517 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2518 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2519 pref->setItemProperty( "min", 1, qualityPref );
2520 pref->setItemProperty( "max", 100, qualityPref );
2521 // .... -> progressive mode
2522 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2523 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2524 // ... avi recording sub-group <<end>>
2526 // ... group names sub-group <<start>>
2527 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2528 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2529 pref->setItemProperty( "columns", 2, vtkGN );
2530 // .... -> text color
2531 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2532 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2533 // .... -> transparency
2534 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2535 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2536 pref->setItemProperty( "min", 0.0, transPref );
2537 pref->setItemProperty( "max", 1.0, transPref );
2538 pref->setItemProperty( "step", 0.1, transPref );
2539 // ... -> group names sub-group <<end>>
2540 // .. "VTK viewer" group <<end>>
2543 // .. "Plot2d viewer" group <<start>>
2544 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2545 //pref->setItemProperty( "columns", 2, plot2dGroup );
2547 // ... -> background
2548 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2549 LightApp_Preferences::Color, "Plot2d", "Background" );
2550 // ... -> selection color
2551 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2552 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2554 // ... "Viewer" group <<start>>
2555 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2557 // .... -> curve type
2558 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2559 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2560 aValuesList.clear();
2561 anIndicesList.clear();
2562 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2563 anIndicesList << 0 << 1 << 2 ;
2564 pref->setItemProperty( "strings", aValuesList, curveType );
2565 pref->setItemProperty( "indexes", anIndicesList, curveType );
2566 // .... -> marker size
2567 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2568 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2569 pref->setItemProperty( "min", 0, markerSize );
2570 pref->setItemProperty( "max", 100, markerSize );
2571 // .... -> horizontal scaling mode
2572 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2573 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2574 aValuesList.clear();
2575 anIndicesList.clear();
2576 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2577 anIndicesList << 0 << 1 ;
2578 pref->setItemProperty( "strings", aValuesList, horScale );
2579 pref->setItemProperty( "indexes", anIndicesList, horScale );
2580 // .... -> vertical scaling mode
2581 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2582 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2583 pref->setItemProperty( "strings", aValuesList, verScale );
2584 pref->setItemProperty( "indexes", anIndicesList, verScale );
2586 // .... -> errors/deviation colot
2587 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2588 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2589 // .... -> deviation markers line size
2590 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2591 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2592 pref->setItemProperty( "min", 1, deviationMarkerLw );
2593 pref->setItemProperty( "max", 5, deviationMarkerLw );
2594 // .... -> deviation markers tick mark size
2595 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2596 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2597 pref->setItemProperty( "min", 1, deviationMarkerTs );
2598 pref->setItemProperty( "max", 5, deviationMarkerTs );
2599 // .... "Viewer" group <<end>>
2601 // ... "Legend" group <<start>>
2602 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2604 // .... -> show legend
2605 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2606 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2607 // .... -> legend position
2608 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2609 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2610 aValuesList.clear();
2611 anIndicesList.clear();
2612 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2613 anIndicesList << 0 << 1 << 2 << 3 ;
2614 pref->setItemProperty( "strings", aValuesList, legendPosition );
2615 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2616 // .... -> Symbol type
2617 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2618 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2619 aValuesList.clear();
2620 anIndicesList.clear();
2621 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2622 anIndicesList << 0 << 1 ;
2623 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2624 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2625 // .... -> legend font
2626 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2627 // ... -> font color
2628 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2629 // ... -> selection font color
2630 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2631 // ... "Legend" group <<end>>
2633 // .. "Plot2d viewer" group <<end>>
2635 // .. "PyViewer" preferences tab <<start>>
2636 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2637 // ... "Font settings" group <<start>>
2638 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2639 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2640 LightApp_Preferences::Font, "PyEditor", "Font" );
2641 // ... "Font settings" group <<end>>
2642 // ... "Display settings" group <<start>>
2643 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2644 pref->setItemProperty( "columns", 2, pyDispGroup );
2645 // ... -> current line highlight
2646 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2647 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2648 // ... -> text wrapping
2649 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2650 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2651 // ... -> center cursor on scroll
2652 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2653 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2654 // ... -> line numbers area
2655 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2656 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2657 // ... "Display settings" group <<end>>
2658 // ... "Tab settings" group <<start>>
2659 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2660 pref->setItemProperty( "columns", 2, pyTabGroup );
2661 // ... -> tab whitespaces
2662 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2663 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2665 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2666 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2667 // ... "Tab settings" group <<end>>
2668 // ... "Vertical edge settings" group <<start>>
2669 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2670 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2671 // ... -> vertical edge
2672 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2673 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2674 // ... -> number of columns
2675 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2676 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2677 // ... "Vertical edge settings" group <<end>>
2678 // .. "PyEditor" preferences tab <<end>>
2680 // .. "Directories" preferences tab <<start>>
2681 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2682 // ... --> quick directories list
2683 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2684 pref->addPreference( tr( "" ), dirGroup,
2685 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2686 // .. "Directories" preferences tab <<end>>
2688 // .. "Object browser" preferences tab <<start>>
2689 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2691 // ... "Search tool" group <<start>>
2692 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2693 // .... --> auto-hide
2694 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2695 "ObjectBrowser", "auto_hide_search_tool" );
2696 // ... "Search tool" group <<end>>
2698 // ... "Object browser settings" group <<start>>
2699 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2700 pref->setItemProperty( "columns", 2, objSetGroup );
2701 // .... -> auto size first column
2702 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2703 "ObjectBrowser", "auto_size_first" );
2704 // .... -> auto size other columns
2705 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2706 "ObjectBrowser", "auto_size" );
2707 // .... -> resize columns on expand item
2708 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2709 "ObjectBrowser", "resize_on_expand_item" );
2710 // .... -> browse to published object
2711 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2712 "ObjectBrowser", "browse_published_object" );
2713 aValuesList.clear();
2714 anIndicesList.clear();
2715 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2716 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2717 pref->setItemProperty( "strings", aValuesList, browsePublished );
2718 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2719 // ... "Object browser settings" group <<end>>
2720 // .. "Object browser" preferences tab <<end>>
2722 // .. "Shortcuts" preferences tab <<start>>
2723 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2724 // ... "Shortcuts settings" group <<start>>
2725 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2726 pref->addPreference( tr( "" ), shortcutGroup,
2727 LightApp_Preferences::ShortcutTree, "shortcuts" );
2728 // ... "Shortcuts settings" group <<end>>
2729 // .. "Shortcuts" preferences tab <<end>>
2730 // . Top-level "SALOME" preferences group <<end>>
2736 Changes appearance of application according to changed preferences
2737 \param sec - section
2738 \param param - name of changed parameter
2740 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2742 SUIT_ResourceMgr* resMgr = resourceMgr();
2746 if ( sec == "viewers" && param == "drop_down_buttons" )
2748 ViewManagerList vmlist = viewManagers();
2749 foreach( SUIT_ViewManager* vm, vmlist )
2751 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2752 foreach( SUIT_ViewWindow* vw, vwlist )
2753 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2757 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2759 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2760 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2761 QList<SUIT_ViewManager*> lst;
2762 #ifndef DISABLE_OCCVIEWER
2763 viewManagers( OCCViewer_Viewer::Type(), lst );
2764 QListIterator<SUIT_ViewManager*> itOCC( lst );
2765 while ( itOCC.hasNext() && sz >= 0 )
2767 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2768 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2771 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2772 occVM->setTrihedronSize( sz, relative );
2773 occVM->getAISContext()->UpdateCurrentViewer();
2776 #ifndef DISABLE_VTKVIEWER
2777 #ifndef DISABLE_SALOMEOBJECT
2778 viewManagers( SVTK_Viewer::Type(), lst );
2779 QListIterator<SUIT_ViewManager*> itVTK( lst );
2780 while ( itVTK.hasNext() && sz >= 0 )
2782 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2783 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2786 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2789 vtkVM->setTrihedronSize( sz, relative );
2797 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2799 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2800 QList<SUIT_ViewManager*> lst;
2801 #ifndef DISABLE_OCCVIEWER
2802 viewManagers( OCCViewer_Viewer::Type(), lst );
2803 QListIterator<SUIT_ViewManager*> itOCC( lst );
2804 while ( itOCC.hasNext() )
2806 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2807 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2810 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2813 occVM->setStaticTrihedronDisplayed( isVisible );
2817 #ifndef DISABLE_VTKVIEWER
2818 #ifndef DISABLE_SALOMEOBJECT
2819 viewManagers( SVTK_Viewer::Type(), lst );
2820 QListIterator<SUIT_ViewManager*> itVTK( lst );
2821 while ( itVTK.hasNext() )
2823 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2824 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2827 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2830 vtkVM->setStaticTrihedronVisible( isVisible );
2838 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2840 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2841 QList<SUIT_ViewManager*> lst;
2842 #ifndef DISABLE_OCCVIEWER
2843 viewManagers( OCCViewer_Viewer::Type(), lst );
2844 QListIterator<SUIT_ViewManager*> itOCC( lst );
2845 while ( itOCC.hasNext() )
2847 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2848 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2851 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2852 occVM->setInteractionStyle( mode );
2855 #ifndef DISABLE_VTKVIEWER
2856 #ifndef DISABLE_SALOMEOBJECT
2857 viewManagers( SVTK_Viewer::Type(), lst );
2858 QListIterator<SUIT_ViewManager*> itVTK( lst );
2859 while ( itVTK.hasNext() )
2861 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2862 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2865 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2866 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2872 #ifndef DISABLE_OCCVIEWER
2873 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2875 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2876 QList<SUIT_ViewManager*> lst;
2877 viewManagers( OCCViewer_Viewer::Type(), lst );
2878 QListIterator<SUIT_ViewManager*> it( lst );
2879 while ( it.hasNext() )
2881 SUIT_ViewModel* vm = it.next()->getViewModel();
2882 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2885 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2886 occVM->enablePreselection( isToEnablePreselection );
2891 #ifndef DISABLE_OCCVIEWER
2892 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2894 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2895 QList<SUIT_ViewManager*> lst;
2896 viewManagers( OCCViewer_Viewer::Type(), lst );
2897 QListIterator<SUIT_ViewManager*> it( lst );
2898 while ( it.hasNext() )
2900 SUIT_ViewModel* vm = it.next()->getViewModel();
2901 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2904 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2905 occVM->enableSelection( isToEnableSelection );
2910 #ifndef DISABLE_OCCVIEWER
2911 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
2913 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
2914 QList<SUIT_ViewManager*> lst;
2915 viewManagers( OCCViewer_Viewer::Type(), lst );
2916 QListIterator<SUIT_ViewManager*> it( lst );
2917 while ( it.hasNext() )
2919 SUIT_ViewModel* vm = it.next()->getViewModel();
2920 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2923 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2924 occVM->setClippingColor( aColor );
2929 #ifndef DISABLE_OCCVIEWER
2930 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
2931 param == QString( "clipping_texture" ) ||
2932 param == QString( "clipping_modulate" ) ||
2933 param == QString( "clipping_scale" ) ) )
2935 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
2936 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
2937 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
2938 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
2939 QList<SUIT_ViewManager*> lst;
2940 viewManagers( OCCViewer_Viewer::Type(), lst );
2941 QListIterator<SUIT_ViewManager*> it( lst );
2942 while ( it.hasNext() )
2944 SUIT_ViewModel* vm = it.next()->getViewModel();
2945 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2948 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2949 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
2954 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2956 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2957 QList<SUIT_ViewManager*> lst;
2958 #ifndef DISABLE_OCCVIEWER
2959 viewManagers( OCCViewer_Viewer::Type(), lst );
2960 QListIterator<SUIT_ViewManager*> itOCC( lst );
2961 while ( itOCC.hasNext() )
2963 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2964 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2967 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2968 occVM->setZoomingStyle( mode );
2971 #ifndef DISABLE_VTKVIEWER
2972 #ifndef DISABLE_SALOMEOBJECT
2973 viewManagers( SVTK_Viewer::Type(), lst );
2974 QListIterator<SUIT_ViewManager*> itVTK( lst );
2975 while ( itVTK.hasNext() )
2977 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2978 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2981 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2982 if( vtkVM ) vtkVM->setZoomingStyle( mode );
2988 #ifndef DISABLE_VTKVIEWER
2989 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2991 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2992 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2993 QList<SUIT_ViewManager*> lst;
2994 #ifndef DISABLE_SALOMEOBJECT
2995 viewManagers( SVTK_Viewer::Type(), lst );
2996 QListIterator<SUIT_ViewManager*> it( lst );
2997 while ( it.hasNext() )
2999 SUIT_ViewModel* vm = it.next()->getViewModel();
3000 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3003 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3004 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3010 #ifndef DISABLE_VTKVIEWER
3011 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3013 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3014 QList<SUIT_ViewManager*> lst;
3015 #ifndef DISABLE_SALOMEOBJECT
3016 viewManagers( SVTK_Viewer::Type(), lst );
3017 QListIterator<SUIT_ViewManager*> it( lst );
3018 while ( it.hasNext() )
3020 SUIT_ViewModel* vm = it.next()->getViewModel();
3021 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3024 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3025 if( vtkVM ) vtkVM->setProjectionMode( mode );
3031 #ifndef DISABLE_VTKVIEWER
3032 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3034 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3035 QList<SUIT_ViewManager*> lst;
3036 #ifndef DISABLE_SALOMEOBJECT
3037 viewManagers( SVTK_Viewer::Type(), lst );
3038 QListIterator<SUIT_ViewManager*> it( lst );
3039 while ( it.hasNext() )
3041 SUIT_ViewModel* vm = it.next()->getViewModel();
3042 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3045 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3046 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3052 #ifndef DISABLE_VTKVIEWER
3053 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3055 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3056 QList<SUIT_ViewManager*> lst;
3057 #ifndef DISABLE_SALOMEOBJECT
3058 viewManagers( SVTK_Viewer::Type(), lst );
3059 QListIterator<SUIT_ViewManager*> it( lst );
3060 while ( it.hasNext() )
3062 SUIT_ViewModel* vm = it.next()->getViewModel();
3063 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3066 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3067 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3073 #ifndef DISABLE_VTKVIEWER
3074 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3075 param == QString( "spacemouse_func2_btn" ) ||
3076 param == QString( "spacemouse_func5_btn" ) ) )
3078 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3079 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3080 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3081 QList<SUIT_ViewManager*> lst;
3082 #ifndef DISABLE_SALOMEOBJECT
3083 viewManagers( SVTK_Viewer::Type(), lst );
3084 QListIterator<SUIT_ViewManager*> it( lst );
3085 while ( it.hasNext() )
3087 SUIT_ViewModel* vm = it.next()->getViewModel();
3088 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3091 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3092 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3097 if( sec=="ObjectBrowser" )
3099 SUIT_DataBrowser* ob = objectBrowser();
3103 if ( param=="auto_size_first" )
3105 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3106 ob->setAutoSizeFirstColumn( autoSizeFirst );
3107 if ( autoSizeFirst )
3108 ob->adjustFirstColumnWidth();
3110 else if ( param=="auto_size" ) {
3111 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3112 ob->setAutoSizeColumns(autoSize);
3114 ob->adjustColumnsWidth();
3116 else if ( param=="resize_on_expand_item" ) {
3117 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3118 ob->setResizeOnExpandItem(resizeOnExpandItem);
3120 else if ( param == "auto_hide_search_tool" ) {
3121 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3127 if( param=="auto_save_interval" ) {
3128 myAutoSaveTimer->stop();
3129 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3130 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3134 #ifndef DISABLE_PYCONSOLE
3135 if( sec=="PyConsole" && pythonConsole() )
3137 if ( param=="font" ) {
3138 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3140 else if ( param=="show_banner" ) {
3141 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3148 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3150 if ( param == "visible_count" )
3151 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3152 else if ( param == "max_count" )
3153 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3154 else if ( param == "insert_mode" )
3155 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3156 else if ( param == "link_type" )
3157 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3158 else if ( param == "show_clear" )
3159 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3160 else if ( param == "show_mru" )
3161 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3164 if ( sec == "language" && param == "language" )
3166 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3168 if ( sec == "language" && param == "locale")
3170 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3172 if ( sec == "desktop" && param == "opaque_resize" ) {
3173 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3174 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3175 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3176 else dopts &= ~QMainWindow::AnimatedDocks;
3177 desktop()->setDockOptions( dopts );
3178 desktop()->setOpaqueResize( opaqueResize );
3179 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3180 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3183 #ifndef DISABLE_PLOT2DVIEWER
3184 QList<SUIT_ViewManager*> lst;
3185 viewManagers( Plot2d_Viewer::Type(), lst );
3186 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3187 while ( itPlot2d.hasNext() ) {
3188 SUIT_ViewManager* viewMgr = itPlot2d.next();
3189 SUIT_ViewModel* vm = viewMgr->getViewModel();
3190 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3193 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3195 viewMgr->setViewModel( vm );
3196 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3198 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3199 frame->SetPreference();
3204 #ifndef DISABLE_PYVIEWER
3205 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3206 param == QString( "LineNumberArea" ) ||
3207 param == QString( "TextWrapping" ) ||
3208 param == QString( "CenterCursorOnScroll" ) ||
3209 param == QString( "TabSpaceVisible" ) ||
3210 param == QString( "TabSize" ) ||
3211 param == QString( "VerticalEdge" ) ||
3212 param == QString( "NumberColumns" ) ||
3213 param == QString( "Font" ) ) )
3215 QList<SUIT_ViewManager*> lst;
3216 viewManagers( PyViewer_Viewer::Type(), lst );
3217 QListIterator<SUIT_ViewManager*> itPy( lst );
3218 while ( itPy.hasNext() )
3220 SUIT_ViewManager* viewMgr = itPy.next();
3221 SUIT_ViewModel* vm = viewMgr->getViewModel();
3222 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3225 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3227 viewMgr->setViewModel( vm );
3228 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3231 pyView->setPreferences();
3241 void LightApp_Application::loadPreferences()
3243 CAM_Application::loadPreferences();
3245 SUIT_ResourceMgr* aResMgr = resourceMgr();
3250 static bool mru_load = true;
3253 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3255 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3256 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3257 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3258 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3259 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3260 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3261 mru->loadLinks( aResMgr, "MRU" );
3267 QStringList mods = aResMgr->parameters( "windows_visibility" );
3268 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3271 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3272 myWinVis.insert( *itr, arr );
3276 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3277 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3278 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3279 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3280 else dopts &= ~QMainWindow::AnimatedDocks;
3281 desktop()->setDockOptions( dopts );
3282 desktop()->setOpaqueResize( opaqueResize );
3283 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3284 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3291 void LightApp_Application::savePreferences()
3293 CAM_Application::savePreferences();
3295 saveDockWindowsState();
3297 SUIT_ResourceMgr* aResMgr = resourceMgr();
3302 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3304 mru->saveLinks( aResMgr, "MRU" );
3306 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3307 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3310 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3312 #if GUI_DEVELOPMENT > 0
3313 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3315 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3322 Updates desktop title
3324 void LightApp_Application::updateDesktopTitle()
3326 QString aTitle = applicationName();
3327 QString aVer = applicationVersion();
3328 if ( !aVer.isEmpty() )
3329 aTitle += QString( " " ) + aVer;
3331 if ( activeStudy() ) {
3332 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3333 aTitle += QString( " - [%1]" ).arg( sName );
3336 desktop()->setWindowTitle( aTitle );
3340 \brief Get map of the operations which can be performed
3341 on the module activation.
3343 The method should return the map of the kind \c {<id>:<name>}
3344 where \c <id> is an integer identifier of the operation and
3345 \c <name> is a title for the button to be added to the
3346 dialog box. After user selects the required operation by the
3347 clicking the corresponding button in the dialog box, its identifier
3348 is passed to the moduleActionSelected() method to process
3351 \return map of the operations
3352 \sa moduleActionSelected()
3354 QMap<int, QString> LightApp_Application::activateModuleActions() const
3356 QMap<int, QString> opmap;
3357 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3358 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3363 \brief Called when the used selectes required operation chosen
3364 from "Activate module" dialog box.
3366 Performs the required operation according to the user choice.
3368 \param id operation identifier
3369 \sa activateModuleActions()
3371 void LightApp_Application::moduleActionSelected( const int id )
3386 Updates windows after close document
3388 void LightApp_Application::afterCloseDoc()
3392 CAM_Application::afterCloseDoc();
3396 Updates actions of active module
3398 void LightApp_Application::updateModuleActions()
3401 if ( activeModule() ) {
3402 modName = activeModule()->moduleName();
3403 if ( !isModuleAccessible( modName ) ) {
3404 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3405 foreach( SUIT_Application* app, apps ) {
3406 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3407 if ( lapp && lapp != this )
3408 lapp->removeModuleAction( modName );
3413 LightApp_ModuleAction* moduleAction =
3414 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3416 moduleAction->setActiveModule( modName );
3419 void LightApp_Application::removeModuleAction( const QString& modName )
3421 LightApp_ModuleAction* moduleAction =
3422 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3424 moduleAction->removeModule( modName );
3428 Gets current windows.
3429 \param winMap - output current windows map.
3431 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3434 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3435 ((LightApp_Module*)activeModule())->windows( winMap );
3437 defaultWindows( winMap );
3441 Gets current view managers.
3442 \param lst - output current view managers list.
3444 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3447 if ( !activeStudy() )
3450 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3451 ((LightApp_Module*)activeModule())->viewManagers( lst );
3453 defaultViewManagers( lst );
3459 void LightApp_Application::updateWindows()
3461 QMap<int, int> winMap;
3462 currentWindows( winMap );
3464 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3466 if ( !dockWindow( it.key() ) )
3467 getWindow( it.key() );
3470 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3472 QWidget* wid = it.value();
3473 if ( winMap.contains( it.key() ) )
3474 wid->setVisible( true );
3479 loadDockWindowsState();
3483 Updates view managers
3485 void LightApp_Application::updateViewManagers()
3488 currentViewManagers( lst );
3490 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3491 getViewManager( *it, true );
3495 Loads windows geometry
3497 void LightApp_Application::loadDockWindowsState()
3501 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3502 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3503 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3506 if ( activeModule() )
3507 modName = activeModule()->name();
3508 else if ( activeStudy() )
3509 modName = "nomodule";
3511 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3512 QByteArray aDefaultState;
3513 aResMgr->value( "windows_geometry", modName, aDefaultState );
3514 QByteArray aDefaultVisibility;
3515 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3516 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3517 aResMgr->setWorkingMode( prevMode );
3519 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3522 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3523 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3525 if ( version > Qtx::versionToId( "7.4.1" ) )
3526 aResMgr->value( "windows_geometry", modName , arr );
3528 arr = aDefaultState;
3529 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3530 desktop()->restoreState( aTargetArray );
3533 QStringList mainToolbarsNames;
3534 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3535 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3536 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3538 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3541 QMap<QString, bool> *tbMap = 0;
3542 QMap<QString, bool> *dwMap = 0;
3544 QMap<QString, bool> userTbMap, userDwMap;
3545 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3547 QMap<QString, bool> defaultTbMap, defaultDwMap;
3548 if(hasDefaultVisibility) {
3549 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3555 if(hasDefaultVisibility){
3556 tbMap = &defaultTbMap;
3563 if(hasDefaultVisibility){
3564 dwMap = &defaultDwMap;
3569 QList<QToolBar*> tbList = findToolBars();
3570 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3572 QToolBar* tb = *tit;
3573 if ( tbMap->contains( tb->objectName() ) ) {
3574 tb->setVisible( (*tbMap)[tb->objectName()] );
3580 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3581 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3583 QDockWidget* dw = *dit;
3585 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3586 if ( po != desktop() )
3589 if ( dwMap->contains( dw->objectName() ) )
3590 dw->setVisible( (*dwMap)[dw->objectName()] );
3598 Saves windows geometry
3600 void LightApp_Application::saveDockWindowsState()
3605 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3606 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3608 if( !storeWin && !storeTb )
3612 if ( activeModule() )
3613 modName = activeModule()->name();
3614 else if ( activeStudy() )
3615 modName = "nomodule";
3617 QString versionId = GUI_VERSION_STR;
3618 #if GUI_DEVELOPMENT > 0
3622 QByteArray arr = desktop()->saveState();
3623 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3624 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3627 if ( myWinVis.contains( modName ) )
3628 visArr = myWinVis[modName];
3630 QMap<QString, bool> tbMap, dwMap;
3631 dockWindowsState( visArr, tbMap, dwMap );
3633 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3634 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3637 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3640 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3641 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3643 QDockWidget* wid = *it;
3644 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3647 visArr = dockWindowsState( tbMap, dwMap );
3649 myWinVis.insert( modName, visArr );
3652 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3655 QDataStream stream( &visArr, QIODevice::WriteOnly );
3657 stream << (uchar)ToolBarMarker;
3658 stream << tb.size();
3659 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3661 stream << tit.key();
3662 stream << (uchar)( tit.value() ? 1 : 0 );
3665 stream << (uchar)DockWidgetMarker;
3666 stream << dw.size();
3667 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3669 stream << wit.key();
3670 stream << (uchar)( wit.value() ? 1 : 0 );
3676 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3681 QByteArray visArr = arr;
3682 QDataStream stream( &visArr, QIODevice::ReadOnly );
3686 if ( marker != ToolBarMarker )
3691 for ( int i = 0; i < lines; ++i )
3694 stream >> objectName;
3697 tb.insert( objectName, shown );
3701 if ( marker != DockWidgetMarker )
3705 for ( int j = 0; j < lines; ++j )
3708 stream >> objectName;
3711 dw.insert( objectName, shown );
3716 Adds icon names for modules
3718 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3722 SUIT_ResourceMgr* resMgr = resourceMgr();
3726 QStringList modList;
3727 modules( modList, false );
3729 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3731 QString modName = *it;
3732 QString modIntr = moduleName( modName );
3733 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3735 if ( modIcon.isEmpty() )
3738 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3739 modIcon += QString( ".png" );
3741 iconMap.insert( modName, modIcon );
3746 Inserts items in popup, which necessary for current application
3748 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3751 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3752 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3753 selMgr->setSelectionCacheEnabled( true );
3755 SUIT_DataBrowser* ob = objectBrowser();
3757 CAM_Application::contextMenuPopup( type, thePopup, title );
3759 if ( ob && type == ob->popupClientType() ) {
3760 thePopup->addSeparator();
3761 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3762 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3763 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3766 #ifndef DISABLE_SALOMEOBJECT
3767 if ( selMgr && ob ) {
3768 SALOME_ListIO selected;
3769 selMgr->selectedObjects( selected );
3770 if(selected.Extent() == 1){
3771 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3772 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3773 if(obj && obj->renameAllowed()) {
3774 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3775 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3776 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3777 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3779 QList<QAction*> acts = thePopup->actions();
3780 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3781 thePopup->insertAction(firstAction,a);
3787 selMgr->setSelectionCacheEnabled( cacheIsOn );
3793 void LightApp_Application::createEmptyStudy()
3795 CAM_Application::createEmptyStudy();
3797 if ( objectBrowser() )
3798 objectBrowser()->updateTree();
3800 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3801 if ( aResMgr && activeStudy() ) {
3802 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3803 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3808 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3810 CAM_Application::setDesktop( desk );
3813 connect( desk, SIGNAL( message( const QString& ) ),
3814 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3815 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3816 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3822 \param mod - module to be activated
3824 bool LightApp_Application::activateModule( CAM_Module* mod )
3826 bool res = CAM_Application::activateModule( mod );
3828 if ( objectBrowser() )
3829 objectBrowser()->updateTree();
3835 \return keyborad accelerators manager object
3837 SUIT_Accel* LightApp_Application::accel() const
3843 Removes dead widget container from map
3845 void LightApp_Application::onWCDestroyed( QObject* ob )
3847 // remove destroyed widget container from windows map
3848 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3850 if ( itr.value() != ob )
3853 int key = itr.key();
3854 myWin.remove( key );
3859 void LightApp_Application::onMRUActivated( const QString& name )
3861 SUIT_Session* s = SUIT_Session::session();
3862 if ( s && s->activeApplication() == this )
3866 void LightApp_Application::onStylePreferences()
3868 Style_PrefDlg dlg( desktop() );
3871 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3874 void LightApp_Application::onFullScreen(){
3875 if(myScreenHelper) {
3876 if(desktop()->isFullScreen())
3877 myScreenHelper->switchToNormalScreen();
3879 myScreenHelper->switchToFullScreen();
3884 Connects just added view manager
3886 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3888 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3889 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3890 CAM_Application::addViewManager( vm );
3894 Remove view manager from memory
3896 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3898 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3899 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3900 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3902 aStudy->removeObjectProperties( vm->getGlobalId() );
3904 CAM_Application::removeViewManager( vm );
3906 LightApp_SelectionMgr* selMgr = selectionMgr();
3907 QList<SUIT_Selector*> selectors;
3908 selMgr->selectors( selectors );
3909 foreach( SUIT_Selector* selector, selectors ) {
3910 if ( selector->owner() == vm->getViewModel() ) {
3915 // IPAL22894: Crash on closing OCC view
3921 Renames active window of desktop
3923 void LightApp_Application::onRenameWindow()
3928 QWidget* w = desktop()->activeWindow();
3933 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3934 if( ok && !name.isEmpty() )
3935 w->setWindowTitle( name );
3939 Closes active window of desktop
3941 void LightApp_Application::onCloseWindow()
3946 QWidget* w = desktop()->activeWindow();
3954 Closes all windows of desktop
3956 void LightApp_Application::onCloseAllWindow()
3958 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3962 QList<SUIT_ViewWindow*> wndList = desk->windows();
3963 SUIT_ViewWindow* wnd;
3964 foreach( wnd, wndList )
3972 Groups all windows of desktop
3974 void LightApp_Application::onGroupAllWindow()
3976 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3980 QtxWorkstack* wgStack = desk->workstack();
3986 \return if the library of module exists
3987 \param moduleTitle - title of module
3989 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3991 if( moduleTitle.isEmpty() )
3994 QString lib = moduleLibrary( moduleTitle );
3996 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3997 bool isPythonModule = lib.contains("SalomePyQtGUI");
3998 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4002 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4004 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4007 bool isLibFound = false;
4008 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4009 for( ; anIt!=aLast; anIt++ )
4011 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4022 INFOS( "\n****************************************************************" << std::endl
4023 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4024 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4025 << "****************************************************************" << std::endl );
4027 else if ( !isPythonModule && !isPythonLightModule)
4030 if ( isPythonModule || isPythonLightModule)
4032 QString pylib = moduleName( moduleTitle ) + QString(".py");
4033 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4035 // Check the python library
4037 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4039 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4041 bool isPyLib = false, isPyGuiLib = false;
4042 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4043 for( ; anIt!=aLast; anIt++ )
4045 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4046 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4048 if(!isPythonLightModule)
4049 if( !isPyLib && inf.exists() )
4052 if( !isPyGuiLib && infgui.exists() )
4055 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4059 printf( "\n****************************************************************\n" );
4060 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4062 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4064 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4065 printf( "****************************************************************\n" );
4072 \return default name for an active study
4074 void LightApp_Application::setDefaultStudyName( const QString& theName )
4076 QStringList anInfoList;
4077 modules( anInfoList, false );
4079 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4080 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4081 !aStudy->isSaved() )
4083 aStudy->setStudyName( theName );
4084 updateDesktopTitle();
4089 Custom event handler
4091 bool LightApp_Application::event( QEvent* e )
4093 if( e && e->type()==2000 )
4095 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4096 QString* d = ( QString* )ce->data();
4097 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4099 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4100 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4101 showPreferences( tr( "PREF_APP" ) );
4106 return CAM_Application::event( e );
4109 /*! Check data object */
4110 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4114 bool isSuitable = !theObj->entry().isEmpty() &&
4115 !theObj->componentDataType().isEmpty() &&
4116 !theObj->name().isEmpty();
4123 int LightApp_Application::openChoice( const QString& aName )
4125 int choice = CAM_Application::openChoice( aName );
4127 if ( choice == OpenExist ) // The document is already open.
4129 // Do you want to reload it?
4130 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4131 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4132 choice = OpenReload;
4138 bool LightApp_Application::openAction( const int choice, const QString& aName )
4145 STD_Application* app = 0;
4146 SUIT_Session* session = SUIT_Session::session();
4147 QList<SUIT_Application*> appList = session->applications();
4148 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4150 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4151 app = ::qobject_cast<STD_Application*>( *it );
4156 app->onCloseDoc( false );
4157 appList = session->applications();
4158 STD_Application* other = 0;
4159 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4160 other = ::qobject_cast<STD_Application*>( *it );
4163 res = other->onOpenDoc( aName );
4168 res = CAM_Application::openAction( choice, aName );
4175 QStringList LightApp_Application::viewManagersTypes() const
4177 QStringList aTypesList;
4178 aTypesList += myUserWmTypes;
4179 #ifndef DISABLE_GLVIEWER
4180 aTypesList<<GLViewer_Viewer::Type();
4182 #ifndef DISABLE_PLOT2DVIEWER
4183 aTypesList<<Plot2d_Viewer::Type();
4185 #ifndef DISABLE_QXGRAPHVIEWER
4186 aTypesList<<QxScene_Viewer::Type();
4188 #ifndef DISABLE_PVVIEWER
4189 aTypesList<<PVViewer_Viewer::Type();
4191 #ifndef DISABLE_PYVIEWER
4192 aTypesList<<PyViewer_Viewer::Type();
4194 #ifndef DISABLE_OCCVIEWER
4195 aTypesList<<OCCViewer_Viewer::Type();
4197 #ifndef DISABLE_VTKVIEWER
4198 #ifndef DISABLE_SALOMEOBJECT
4199 aTypesList<<SVTK_Viewer::Type();
4201 aTypesList<<VTKViewer_Viewer::Type();
4207 * Removes all view managers of known types
4208 * Other view managers are ignored
4210 void LightApp_Application::clearKnownViewManagers()
4212 QStringList aTypesList = viewManagersTypes();
4213 QList<SUIT_ViewManager*> aMgrList;
4214 viewManagers( aMgrList );
4215 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4216 if (aTypesList.contains(aMgr->getType()))
4217 removeViewManager(aMgr);
4222 Copy of current selection
4224 void LightApp_Application::onCopy()
4226 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4232 Paste of current data in clipboard
4234 void LightApp_Application::onPaste()
4236 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4242 Browse (i.e. set focus on) the published objects
4243 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4244 has been accepted by Ok (or Apply & Close) button
4245 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4246 (to select the first published object only)
4247 \return entry of the selected object
4249 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4250 const bool theIsApplyAndClose,
4251 const bool theIsOptimizedBrowsing )
4254 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4256 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4257 switch( aBrowsePolicy )
4261 case BP_ApplyAndClose:
4262 if( !theIsApplyAndClose )
4270 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4274 SUIT_DataBrowser* anOB = objectBrowser();
4278 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4282 QStringListIterator anIter( theEntryList );
4283 if( theIsOptimizedBrowsing )
4285 // go to the last entry
4287 if( anIter.hasPrevious() )
4291 // scroll to each entry in the list
4292 // (in optimized mode - to the last entry only)
4294 LightApp_DataObject* anObject = 0;
4295 while( anIter.hasNext() )
4297 anEntry = anIter.next();
4298 if( !anEntry.isEmpty() )
4300 anObject = aStudy->findObjectByEntry( anEntry );
4303 QModelIndex anIndex = aModel->index( anObject );
4304 anOB->treeView()->scrollTo( anIndex );
4309 // always select the last object
4310 if( anObject && !anEntry.isEmpty() )
4312 QList<SUIT_Selector*> aSelectorList;
4313 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4314 if( !aSelectorList.isEmpty() )
4316 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4318 bool anIsAutoBlock = aSelector->autoBlock();
4320 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4321 aSelector->setAutoBlock( false );
4323 SUIT_DataOwnerPtrList aList;
4324 #ifndef DISABLE_SALOMEOBJECT
4325 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4326 ( anObject->entry().toLatin1().constData(),
4327 anObject->componentDataType().toLatin1().constData(),
4328 anObject->name().toLatin1().constData() );
4329 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4331 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4334 aList.append( owner );
4335 selectionMgr()->setSelected( aList );
4338 // restore auto block flag
4339 aSelector->setAutoBlock( anIsAutoBlock );
4347 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4349 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4350 return study ? study->findObjectByEntry( id ) : 0;
4354 Checks that an object can be renamed.
4355 \param entry entry of the object
4356 \brief Return \c true if object can be renamed
4358 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4363 Rename object by entry.
4364 \param entry entry of the object
4365 \param name new name of the object
4366 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4368 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4372 /*! Process standard messages from desktop */
4373 void LightApp_Application::onDesktopMessage( const QString& message )
4375 const QString sectionSeparator = "/";
4377 if ( message.toLower() == "updateobjectbrowser" ||
4378 message.toLower() == "updateobjbrowser" ) {
4379 // update object browser
4380 updateObjectBrowser();
4382 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4383 QString vtype = message.split( sectionSeparator ).last();
4384 if ( !vtype.isEmpty() )
4385 getViewManager( vtype, true );
4388 QStringList data = message.split( sectionSeparator );
4389 if ( data.count() > 1 ) {
4390 QString msgType = data[0].trimmed();
4391 LightApp_Module* sMod = 0;
4392 CAM_Module* mod = module( msgType );
4394 mod = module( moduleTitle( msgType ) );
4395 if ( mod && mod->inherits( "LightApp_Module" ) )
4396 sMod = (LightApp_Module*)mod;
4398 if ( msgType.toLower() == "preferences" ) {
4399 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4400 // for example "preferences/Study/multi_file_dump/true"
4401 if ( data.count() > 3 ) {
4402 QString section = data[1].trimmed();
4403 QString param = data[2].trimmed();
4404 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4405 resourceMgr()->setValue( section, param, value );
4409 // received message for the module
4410 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4411 sMod->message( msg );
4419 Returns all top level toolbars.
4420 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4422 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4424 QList<QToolBar*> aResult;
4425 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4426 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4427 QToolBar* tb = *tit;
4428 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4429 if ( po != desktop() )
4431 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4438 Internal method to parse toolbars and dockable windows state.
4440 QByteArray LightApp_Application::processState(QByteArray& input,
4441 const bool processWin,
4442 const bool processTb,
4443 const bool isRestoring,
4444 QByteArray defaultState) {
4447 bool hasDefaultState = !defaultState.isEmpty();
4448 bool isDockWinWriten = false;
4450 //Write date from users settings
4452 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4453 int marker, version;
4455 tmpInputData >> marker;
4456 tmpInputData >> version;
4457 tmpInputData >> dockmarker;
4458 tmpInputData >> nbDocWin;
4460 if(processWin && processTb && !isRestoring) {
4462 } else if(!processWin && !processTb ) {
4464 aRes = defaultState;
4466 QDataStream aData(&aRes, QIODevice::WriteOnly);
4467 QList<QToolBar*> aToolBars = findToolBars();
4470 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4471 QToolBar* tb = *tit;
4472 aNames.append(tb->objectName());
4475 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4476 if(toolBarMarkerIndex < 0)
4478 QDataStream anInputData(&input, QIODevice::ReadOnly);
4480 int toolBarMarkerIndexDef;
4481 if(hasDefaultState) {
4482 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4483 if(toolBarMarkerIndexDef < 0)
4486 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4488 QDataStream* aTargetData = 0;
4489 int aTargetIndex = -1;
4491 QByteArray currentArr = desktop()->saveState();
4492 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4493 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4494 if(processWin && useInputData) {
4495 aTargetData = &anInputData;
4496 aTargetIndex = toolBarMarkerIndex;
4498 //Write date from default settings
4499 if(hasDefaultState) {
4500 aTargetData = &anInputDataDef;
4501 aTargetIndex = toolBarMarkerIndexDef;
4503 //If no default state, write current snapshot of the dockable windows
4505 aTargetData = &anInputDataCur;
4506 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4507 aTargetIndex = toolBarMarkerIndexCur;
4512 if(aTargetData && aTargetIndex >= 0 ) {
4513 aTargetData->device()->seek(0);
4514 while( aTargetData->device()->pos() < aTargetIndex ) {
4519 isDockWinWriten = true;
4526 aTargetData = &anInputData;
4527 aTargetIndex = toolBarMarkerIndex;
4529 if(hasDefaultState) {
4530 aTargetData = &anInputDataDef;
4531 aTargetIndex = toolBarMarkerIndexDef;
4535 if(aTargetData && aTargetIndex >= 0) {
4537 if(!isDockWinWriten ) {
4538 //Write version marker
4539 int marker, version;
4540 aTargetData->device()->seek(0);
4541 *aTargetData >> marker;
4542 *aTargetData >> version;
4545 aData << (uchar) QDockWidgetMarker;
4547 int shift = 4*sizeof(int) + sizeof(QSize);
4548 index = aTargetIndex - shift;
4550 index = aTargetIndex;
4553 aTargetData->device()->seek(index);
4554 while(!aTargetData->atEnd()) {
4559 } else { // Not treat toolbars
4560 aData << (uchar) QToolBarMarker;
4561 aData << (int) 0; //Nb toolbars = 0
4568 \brief Emits operationFinished signal.
4569 \param theModuleName the name of the module which perfomed the operation
4570 \param theOperationName the operation name
4571 \param theEntryList the list of the created objects entries
4573 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4574 const QString& theOperationName,
4575 const QStringList& theEntryList )
4577 emit operationFinished( theModuleName, theOperationName, theEntryList );
4581 Update visibility state of given objects
4583 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4584 SUIT_ViewModel* theViewModel )
4586 if ( !theViewModel || theList.isEmpty() ) return;
4588 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4589 if ( !aStudy ) return;
4591 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4593 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4594 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4596 if ( !obj || aStudy->isComponent( obj->entry() ) )
4599 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4600 if ( anObjModule ) {
4601 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4603 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4604 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4605 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4606 anObjState = Qtx::ShownState;
4608 anObjState = Qtx::HiddenState;
4610 aStudy->setVisibilityState( obj->entry(), anObjState );
4617 * Called when window activated
4619 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4621 SUIT_DataBrowser* anOB = objectBrowser();
4624 SUIT_DataObject* rootObj = anOB->root();
4628 DataObjectList listObj = rootObj->children( true );
4630 SUIT_ViewModel* vmod = 0;
4631 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4632 vmod = vman->getViewModel();
4633 updateVisibilityState( listObj, vmod );
4637 Called then view manager removed
4639 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4641 ViewManagerList lst;
4642 viewManagers( lst );
4643 if ( lst.count() == 1) { // in case if closed last view window
4644 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4646 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4651 Check existing document.
4653 bool LightApp_Application::checkExistingDoc()
4656 if( activeStudy() ) {
4657 int answer = SUIT_MessageBox::question( desktop(),
4658 tr( "APPCLOSE_CAPTION" ),
4659 tr( "STUDYCLOSE_DESCRIPTION" ),
4660 tr( "APPCLOSE_SAVE" ),
4661 tr( "APPCLOSE_CLOSE" ),
4662 tr( "APPCLOSE_CANCEL" ), 0 );
4664 if ( activeStudy()->isSaved() ) {
4667 } else if ( onSaveAsDoc() ) {
4668 if( !closeDoc( false ) ) {
4675 else if( answer == 1 ) {
4677 } else if( answer == 2 ) {
4684 #ifndef DISABLE_PYCONSOLE
4686 PyConsole_Interp* LightApp_Application::getPyInterp()
4688 static PyConsole_Interp* myInterp = 0;
4690 myInterp = createPyInterp();
4694 PyConsole_Interp* LightApp_Application::createPyInterp()
4696 return new LightApp_PyInterp();
4699 #endif // DISABLE_PYCONSOLE