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);
1233 QWidget* LightApp_Application::dockWindow( const int id ) const
1236 if ( myWin.contains( id ) )
1241 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1246 QDockWidget* dock = 0;
1247 QWidget* w = wid->parentWidget();
1248 while ( w && !dock )
1250 dock = ::qobject_cast<QDockWidget*>( w );
1251 w = w->parentWidget();
1256 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1261 if ( wid != dockWindow( id ) )
1262 removeDockWindow( id );
1264 myWin.insert( id, wid );
1266 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1267 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1269 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1270 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1271 QString( "%1Dock" ).arg( wid->objectName() ) );
1272 dock->setWidget( wid );
1274 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1275 if ( !accel.isEmpty() )
1276 dock->toggleViewAction()->setShortcut( accel );
1281 void LightApp_Application::removeDockWindow( const int id )
1283 QWidget* wid = dockWindow( id );
1289 QDockWidget* dock = windowDock( wid );
1293 dock->setWidget( 0 );
1294 wid->setParent( 0 );
1295 wid->setVisible( false );
1299 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1301 QDockWidget* dock = windowDock( dockWindow( id ) );
1302 if ( dock && desktop() ) {
1303 desktop()->addDockWidget( place, dock );
1304 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1305 if ( a ) a->update();
1311 \param flag - key for window
1312 \param studyId - study id
1313 Flag used how identificator of window in windows list.
1315 QWidget* LightApp_Application::getWindow( const int flag, const int )
1317 QWidget* wid = dockWindow( flag );
1319 insertDockWindow( flag, wid = createWindow( flag ) );
1321 QMap<int, int> winMap;
1322 currentWindows( winMap );
1323 if ( winMap.contains( flag ) )
1324 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1330 \return Object Browser
1332 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1334 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1340 LogWindow* LightApp_Application::logWindow()
1342 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1345 #ifndef DISABLE_PYCONSOLE
1347 This returns the python console integrated to the GUI. Depending
1348 when you request the python console, this function could return
1349 null. Then the optional parameter force (default to false) can be
1350 set to force the creation of the python console if it is not done
1352 \param force - if true, the pythonConsole is created if it does not exist yet
1353 \return Python Console
1355 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1357 QWidget* wid = dockWindow( WT_PyConsole );
1358 if ( !wid && force==true) {
1359 wid = getWindow(WT_PyConsole);
1361 return qobject_cast<PyConsole_Console*>( wid );
1366 Updates object browser and maybe data models
1367 \param updateModels - if it is true, then data models are updated
1369 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1371 // update existing data models
1374 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1375 if ( objectBrowser() )
1376 objectBrowser()->setAutoUpdate( false );
1378 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1380 CAM_Study::ModelList dm_list;
1381 study->dataModels( dm_list );
1382 QListIterator<CAM_DataModel*> it( dm_list );
1383 while ( it.hasNext() ) {
1384 CAM_DataModel* camDM = it.next();
1385 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1386 ((LightApp_DataModel*)camDM)->update();
1390 if( objectBrowser() )
1391 objectBrowser()->setAutoUpdate( isAutoUpdate );
1394 if ( objectBrowser() ) {
1395 objectBrowser()->updateGeometry();
1396 objectBrowser()->updateTree( 0, false );
1403 LightApp_Preferences* LightApp_Application::preferences() const
1405 return preferences( false );
1409 \return first view manager of some type
1410 \param vmType - type of view manager
1411 \param create - is it necessary to create view manager in case, when there is no manager of such type
1413 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1415 SUIT_ViewManager* aVM = viewManager( vmType );
1416 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1418 if ( anActiveVM && anActiveVM->getType() == vmType )
1421 if ( aVM && create )
1423 if ( !aVM->getActiveView() )
1426 desktop()->setActiveWindow( aVM->getActiveView() );
1429 aVM = createViewManager( vmType );
1435 Creates view manager of some type
1436 \param vmType - type of view manager
1438 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1440 SUIT_ResourceMgr* resMgr = resourceMgr();
1442 SUIT_ViewManager* viewMgr = 0;
1443 #ifndef DISABLE_GLVIEWER
1444 if( vmType == GLViewer_Viewer::Type() )
1446 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1447 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1450 #ifndef DISABLE_PLOT2DVIEWER
1451 if( vmType == Plot2d_Viewer::Type() )
1453 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1455 #ifndef DISABLE_SALOMEOBJECT
1456 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1458 new LightApp_Plot2dSelector( v, mySelMgr );
1460 vm = new Plot2d_Viewer();
1462 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1463 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1466 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1467 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1471 #ifndef DISABLE_QXGRAPHVIEWER
1472 if( vmType == QxScene_Viewer::Type() )
1474 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1475 QxScene_Viewer* vm = new QxScene_Viewer();
1476 viewMgr->setViewModel( vm );
1477 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1480 #ifndef DISABLE_GRAPHICSVIEW
1481 if( vmType == GraphicsView_Viewer::Type() )
1483 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1484 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1487 #ifndef DISABLE_PVVIEWER
1488 if( vmType == PVViewer_Viewer::Type() )
1490 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1491 viewMgr->getActiveView()->setFocus();
1494 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1498 #ifndef DISABLE_PYVIEWER
1499 if( vmType == PyViewer_Viewer::Type() )
1501 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1504 #ifndef DISABLE_OCCVIEWER
1505 if( vmType == OCCViewer_Viewer::Type() )
1507 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1508 OCCViewer_Viewer* vm;
1509 #ifndef DISABLE_SALOMEOBJECT
1510 vm = new SOCC_Viewer();
1512 vm = new OCCViewer_Viewer( true );
1514 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1515 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1516 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1517 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1518 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1519 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1520 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1521 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1523 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1524 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1525 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1526 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1527 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1528 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1529 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1530 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1531 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1532 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1533 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1536 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1537 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1540 #ifndef DISABLE_VTKVIEWER
1541 #ifndef DISABLE_SALOMEOBJECT
1542 if ( vmType == SVTK_Viewer::Type() )
1544 if ( vmType == VTKViewer_Viewer::Type() )
1547 #ifndef DISABLE_SALOMEOBJECT
1548 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1549 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1552 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1553 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1554 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1555 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1556 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1557 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1558 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1559 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1560 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1561 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1562 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1563 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1564 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1565 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1566 new LightApp_VTKSelector( vm, mySelMgr );
1569 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1570 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1572 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1580 addViewManager( viewMgr );
1581 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1583 if ( viewWin && desktop() ) {
1584 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1585 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1591 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1593 SUIT_ResourceMgr* resMgr = resourceMgr();
1595 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1597 new LightApp_WgViewModel( vmType, w ) );
1598 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1600 addViewManager( vm );
1601 SUIT_ViewWindow* vw = vm->createViewWindow();
1602 if ( vw && desktop() ) {
1603 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1604 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1607 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1608 myUserWmTypes << vmType;
1613 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1615 SUIT_ResourceMgr* resMgr = resourceMgr();
1617 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1621 QString vmType = vm->getType();
1623 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1625 addViewManager( vm );
1626 SUIT_ViewWindow* vw = vm->createViewWindow();
1627 if ( vw && desktop() ) {
1628 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1629 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1632 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1633 myUserWmTypes << vmType;
1639 SLOT: Removes view manager from application
1641 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1643 removeViewManager( theVM );
1647 Protected SLOT: On study created.
1648 \param theStudy - just created study
1650 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1652 SUIT_DataObject* aRoot = 0;
1653 if ( theStudy && theStudy->root() )
1655 aRoot = theStudy->root();
1656 //aRoot->setName( tr( "DATA_MODELS" ) );
1659 getWindow( WT_ObjectBrowser );
1661 loadDockWindowsState();
1663 if ( objectBrowser() )
1664 objectBrowser()->setRoot( aRoot );
1666 activateModule( defaultModule() );
1668 if ( objectBrowser() )
1669 objectBrowser()->openLevels();
1671 #ifndef DISABLE_PYCONSOLE
1672 if( pythonConsole() )
1673 getPyInterp()->initStudy();
1678 Protected SLOT: On study opened.
1679 \param theStudy - just opened study
1681 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1683 SUIT_DataObject* aRoot = 0;
1684 if ( theStudy && theStudy->root() )
1686 aRoot = theStudy->root();
1690 getWindow( WT_ObjectBrowser );
1692 loadDockWindowsState();
1694 if ( objectBrowser() )
1695 objectBrowser()->setRoot( aRoot );
1697 activateModule( defaultModule() );
1699 if ( objectBrowser() )
1700 objectBrowser()->openLevels();
1702 #ifndef DISABLE_PYCONSOLE
1703 if( pythonConsole() )
1704 getPyInterp()->initStudy();
1710 /*!Protected SLOT. On study saved.*/
1711 void LightApp_Application::onStudySaved( SUIT_Study* s )
1713 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1715 mru->insert( s->studyName() );
1720 /*!Protected SLOT. On study closed.*/
1721 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1724 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1725 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1728 // stop auto-save timer
1729 myAutoSaveTimer->stop();
1731 // Bug 10396: clear selection
1732 mySelMgr->clearSelected();
1734 // Bug 12944: emit signal only after clear selection
1737 activateModule( "" );
1740 /*!Protected SLOT.On desktop activated.*/
1741 void LightApp_Application::onDesktopActivated()
1743 CAM_Application::onDesktopActivated();
1744 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1746 aModule->studyActivated();
1749 void LightApp_Application::studyOpened( SUIT_Study* s )
1751 CAM_Application::studyOpened( s );
1754 updateViewManagers();
1757 void LightApp_Application::studySaved( SUIT_Study* s )
1759 CAM_Application::studyOpened( s );
1760 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1761 if ( aResMgr && activeStudy() ) {
1762 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1763 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1767 void LightApp_Application::studyCreated( SUIT_Study* s )
1769 CAM_Application::studyCreated( s );
1772 updateViewManagers();
1775 /*!Gets file filter.
1776 *\retval QString "(*.bin)"
1778 QString LightApp_Application::getFileFilter() const
1786 Shows file dialog and return user selected file name
1788 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1789 const QString& caption, QWidget* parent )
1793 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1794 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1797 /*! Gets directory*/
1798 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1802 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1805 /*! Get open file names*/
1806 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1807 const QString& caption, QWidget* parent )
1811 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1812 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1815 /*!Private SLOT. Update object browser.*/
1816 void LightApp_Application::onRefresh()
1818 updateObjectBrowser( true );
1821 /*!Private SLOT. Update actions after rename object.*/
1822 void LightApp_Application::onRenamed()
1824 activeStudy()->Modified();
1828 /*!Private SLOT. Support drag-and-drop operation.*/
1829 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1831 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1835 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1837 aModule->dropObjects( objects, parentObj, row, action );
1840 /*!Private SLOT. On preferences.*/
1841 void LightApp_Application::onPreferences()
1843 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1846 /*!Private SLOT. On preferences.*/
1847 void LightApp_Application::showPreferences( const QString& itemText )
1849 QApplication::setOverrideCursor( Qt::WaitCursor );
1851 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1853 QApplication::restoreOverrideCursor();
1858 preferences()->activateItem( itemText );
1860 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1863 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1864 resourceMgr()->save();
1867 shortcutMgr()->updateShortcuts();
1873 /*!Protected SLOT. On preferences changed.*/
1874 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1876 LightApp_Module* sMod = 0;
1877 CAM_Module* mod = module( modName );
1878 if ( mod && mod->inherits( "LightApp_Module" ) )
1879 sMod = (LightApp_Module*)mod;
1882 sMod->preferencesChanged( section, param );
1884 preferencesChanged( section, param );
1885 // emit signal to allow additional preferences changing processing
1886 emit preferenceChanged( modName, section, param );
1889 /*!Remove all windows from study.*/
1890 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1892 saveDockWindowsState();
1894 if ( SUIT_DataBrowser* ob = objectBrowser() )
1897 CAM_Application::beforeCloseDoc( s );
1900 /*!Update actions.*/
1901 void LightApp_Application::updateActions()
1903 updateCommandsStatus();
1909 SUIT_Study* LightApp_Application::createNewStudy()
1911 LightApp_Application::lastStudyId++;
1913 LightApp_Study* aStudy = new LightApp_Study( this );
1915 // Set up processing of major study-related events
1916 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1917 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1918 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1919 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1925 Creates window by flag.
1926 \param flag - identificator of window type
1928 QWidget* LightApp_Application::createWindow( const int flag )
1932 SUIT_ResourceMgr* resMgr = resourceMgr();
1934 if ( flag == WT_ObjectBrowser )
1936 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1937 ob->setObjectName( "objectBrowser" );
1938 ob->setSortMenuEnabled( true );
1939 ob->setAutoUpdate( true );
1940 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1941 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1943 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1944 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1945 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1947 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1948 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1949 treeModel->setSearcher( this );
1950 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1951 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1953 // Mantis issue 0020136: Drag&Drop in OB
1954 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1956 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1957 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1958 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
1959 this, SLOT( onRenamed( ) ) );
1963 // temporary commented
1965 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1967 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1970 // Create OBSelector
1971 new LightApp_OBSelector( ob, mySelMgr );
1973 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1974 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1975 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1976 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1978 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1980 #ifndef DISABLE_PYCONSOLE
1981 else if ( flag == WT_PyConsole )
1983 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
1984 pyCons->setObjectName( "pythonConsole" );
1985 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1986 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1987 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1988 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
1991 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1994 else if ( flag == WT_LogWindow )
1996 LogWindow* logWin = new LogWindow( desktop() );
1997 logWin->setObjectName( "logWindow" );
1998 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
1999 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2001 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2007 \return default windows( Object Browser, Python Console )
2008 Adds to map \a aMap.
2010 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2012 #ifndef DISABLE_PYCONSOLE
2013 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2015 if ( activeStudy() ) {
2016 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2017 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2021 /*!Default view managers*/
2022 void LightApp_Application::defaultViewManagers( QStringList& ) const
2028 \return preferences.
2029 Create preferences, if \a crt = true.
2031 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2036 LightApp_Application* that = (LightApp_Application*)this;
2038 bool toCreate = !_prefs_ && crt;
2041 _prefs_ = new LightApp_Preferences( resourceMgr() );
2042 that->createPreferences( _prefs_ );
2045 that->myPrefs = _prefs_;
2047 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2048 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2049 connect( myPrefs, SIGNAL( resetToDefaults() ),
2050 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2055 SUIT_ResourceMgr* resMgr = resourceMgr();
2057 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2058 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2060 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2064 QStringList modNameList;
2065 app->modules( modNameList, false );
2067 QMap<QString, QString> iconMap;
2068 app->moduleIconNames( iconMap );
2070 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2072 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2075 int modId = _prefs_->addPreference( *it );
2076 if ( iconMap.contains( *it ) )
2077 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2081 app->modules( modList );
2082 QListIterator<CAM_Module*> itr( modList );
2083 while ( itr.hasNext() )
2085 LightApp_Module* mod = 0;
2087 CAM_Module* anItem = itr.next();
2088 if ( anItem->inherits( "LightApp_Module" ) )
2089 mod = (LightApp_Module*)anItem;
2091 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2093 _prefs_->addPreference( mod->moduleName() );
2094 mod->createPreferences();
2095 that->emptyPreferences( mod->moduleName() );
2099 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2105 Adds new module to application
2107 void LightApp_Application::moduleAdded( CAM_Module* mod )
2109 CAM_Application::moduleAdded( mod );
2111 LightApp_Module* lightMod = 0;
2112 if ( mod && mod->inherits( "LightApp_Module" ) )
2113 lightMod = (LightApp_Module*)mod;
2115 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2117 myPrefs->addPreference( mod->moduleName() );
2118 lightMod->createPreferences();
2119 emptyPreferences( mod->moduleName() );
2123 void LightApp_Application::emptyPreferences( const QString& modName )
2125 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2126 if ( !item || !item->isEmpty() )
2129 // printf( "---------------------> Modify for empty module.\n" );
2131 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2132 frm->setIcon( item->icon() );
2133 frm->setStretch( false );
2134 item->parentItem()->insertItem( frm, item );
2135 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2142 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2147 QStringList aValuesList;
2148 QList<QVariant> anIndicesList;
2152 // . Top-level "SALOME" preferences group <<start>>
2153 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2154 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2156 // .. "General" preferences tab <<start>>
2157 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2159 // ... "Language" group <<start>>
2160 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2161 pref->setItemProperty( "columns", 2, langGroup );
2162 // .... -> application language
2163 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2164 LightApp_Preferences::Selector, "language", "language" );
2165 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2166 QList<QVariant> aIcons;
2167 foreach ( QString aLang, aLangs ) {
2168 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2170 pref->setItemProperty( "strings", aLangs, curLang );
2171 pref->setItemProperty( "icons", aIcons, curLang );
2173 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2174 LightApp_Preferences::Bool, "language", "locale" );
2175 // ... "Language" group <<end>>
2177 // ... "Look and feel" group <<start>>
2178 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2179 pref->setItemProperty( "columns", 2, lookGroup );
2180 // .... -> show splash-screen
2181 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2182 // .... -> opaque resize
2183 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2184 // .... -> drop-down buttons
2185 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2186 // ... "Look and feel" group <<end>>
2188 // ... "Study properties" group <<start>>
2189 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2190 pref->setItemProperty( "columns", 2, studyGroup );
2191 // .... -> multi-file save
2192 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2193 // .... -> ascii save mode
2194 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2195 // .... -> store windows geometry
2196 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2197 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2198 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2199 // .... -> auto-save
2200 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2201 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2202 pref->setItemProperty( "min", 0, autoSaveInterval );
2203 pref->setItemProperty( "max", 1440, autoSaveInterval );
2204 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2205 // ... "Study properties" group <<end>>
2207 // ... "Help browser" group <<start>>
2208 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2210 QString platform = "winapplication";
2212 QString platform = "application";
2214 // .... -> browser application
2215 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2216 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2217 // .... -> browser parameters
2218 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2219 // ... "Help browser" group <<end>>
2221 // ... "Python console properties" group <<start>>
2222 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2224 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2225 // .... -> show banner
2226 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2227 // ... "Python console properties" group <<end>>
2229 // ... "MRU" preferences group <<start>>
2230 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2231 pref->setItemProperty( "columns", 4, mruGroup );
2232 // number of MRU items
2233 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2234 "MRU", "visible_count" );
2235 pref->setItemProperty( "min", 0, mruVisCount );
2236 pref->setItemProperty( "max", 100, mruVisCount );
2238 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2239 "MRU", "link_type" );
2240 aValuesList.clear();
2241 anIndicesList.clear();
2242 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2243 anIndicesList << 0 << 1 << 2 ;
2244 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2245 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2246 // ... "MRU" preferences group <<end>>
2247 // .. "General" preferences tab <<end>>
2249 // .. "3D viewer" group <<start>>
2250 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2251 // ... -> navigation mode
2252 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2253 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2254 aValuesList.clear();
2255 anIndicesList.clear();
2256 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2257 anIndicesList << 0 << 1;
2258 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2259 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2260 // ... -> zooming mode
2261 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2262 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2263 aValuesList.clear();
2264 anIndicesList.clear();
2265 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2266 anIndicesList << 0 << 1;
2267 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2268 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2269 // ... "Trihedron" group <<start>>
2270 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2271 pref->setItemProperty( "columns", 2, occTriGroup );
2272 // .... -> trihedron size
2273 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2274 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2275 pref->setItemProperty( "min", 1.0E-06, occTS );
2276 pref->setItemProperty( "max", 1000, occTS );
2277 // .... -> relative size of trihedron
2278 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2279 // .... -> show static trihedron
2280 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2281 // ... "Trihedron" group <<end>>
2282 // .. "3D viewer" group <<end>>
2286 #ifndef DISABLE_OCCVIEWER
2287 // .. "OCC viewer" group <<start>>
2288 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2290 // ... "Background" group <<start>>
2291 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2292 // pref->setItemProperty( "columns", 2, bgGroup );
2293 aValuesList.clear();
2294 anIndicesList.clear();
2296 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2297 foreach( int gid, idList ) anIndicesList << gid;
2298 // .... -> 3D viewer background
2299 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2300 LightApp_Preferences::Background, "OCCViewer", "background" );
2301 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2302 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2303 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2304 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2305 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2306 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2307 pref->setItemProperty( "custom_enabled", false, bgId );
2308 pref->setItemProperty( "image_formats", formats, bgId );
2309 // .... -> XZ viewer background
2310 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2311 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2312 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2313 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2314 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2315 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2316 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2317 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2318 pref->setItemProperty( "custom_enabled", false, bgId );
2319 pref->setItemProperty( "image_formats", formats, bgId );
2320 // .... -> YZ viewer background
2321 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2322 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2323 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2324 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2325 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2326 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2327 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2328 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2329 pref->setItemProperty( "custom_enabled", false, bgId );
2330 pref->setItemProperty( "image_formats", formats, bgId );
2331 // .... -> XY viewer background
2332 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2333 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2334 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2335 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2336 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2337 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2338 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2339 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2340 pref->setItemProperty( "custom_enabled", false, bgId );
2341 pref->setItemProperty( "image_formats", formats, bgId );
2342 // ... "Background" group <<end>>
2345 // ... "Selection" group <<start>>
2346 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2347 pref->setItemProperty( "columns", 2, occSelectionGroup );
2348 // .... -> enable preselection
2349 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2350 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2351 // .... -> enable selection
2352 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2353 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2354 // ... "Selection" group <<end>>
2356 // ... "Clipping" group <<start>>
2357 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2358 // .... -> clipping color
2359 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2360 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2361 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2362 pref->setItemProperty( "columns", 2, texturePref );
2363 // .... -> use default texture
2364 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2365 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2366 // .... -> clipping texture
2367 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2368 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2369 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2371 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2372 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2373 // .... -> scale factor
2374 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2375 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2376 pref->setItemProperty( "precision", 3, scaleFactor );
2377 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2378 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2379 pref->setItemProperty( "step", 0.1, scaleFactor );
2380 // ... "Clipping" group <<end>>
2382 // ... -> empty frame (for layout) <<start>>
2383 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2384 pref->setItemProperty( "margin", 0, occGen );
2385 pref->setItemProperty( "columns", 2, occGen );
2386 // ... -> empty frame (for layout) <<end>>
2387 // .. "OCC viewer" group <<end>>
2390 #ifndef DISABLE_VTKVIEWER
2391 // .. "VTK viewer" group <<start>>
2392 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2394 // ... -> empty frame (for layout) <<start>>
2395 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2396 //pref->setItemProperty( "columns", 2, vtkGen );
2397 // .... -> projection mode
2398 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2399 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2400 aValuesList.clear();
2401 anIndicesList.clear();
2402 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2403 anIndicesList << 0 << 1;
2404 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2405 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2406 // .... -> background
2407 aValuesList.clear();
2408 anIndicesList.clear();
2410 #ifndef DISABLE_SALOMEOBJECT
2411 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2413 foreach( int gid, idList ) anIndicesList << gid;
2414 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2415 LightApp_Preferences::Background, "VTKViewer", "background" );
2416 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2417 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2418 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2419 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2420 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2421 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2422 pref->setItemProperty( "custom_enabled", false, bgId );
2423 #ifndef DISABLE_SALOMEOBJECT
2424 pref->setItemProperty( "image_formats", formats, bgId );
2426 // .... -> speed increment
2427 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2428 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2429 pref->setItemProperty( "min", 1, vtkSpeed );
2430 pref->setItemProperty( "max", 1000, vtkSpeed );
2431 // .... -> speed mode
2432 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2433 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2434 aValuesList.clear();
2435 anIndicesList.clear();
2436 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2437 anIndicesList << 0 << 1;
2438 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2439 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2441 // ... "Selection" group <<start>>
2442 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2443 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2444 // .... -> preselection
2445 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2446 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2447 aValuesList.clear();
2448 anIndicesList.clear();
2449 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2450 anIndicesList << 0 << 1 << 2;
2451 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2452 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2453 // .... -> enable selection
2454 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2455 // ... "Selection" group <<end>>
2457 // ... -> empty frame (for layout) <<end>>
2459 // ... space mouse sub-group <<start>>
2460 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2461 //pref->setItemProperty( "columns", 2, vtkSM );
2462 // .... -> decrease speed increment
2463 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2464 LightApp_Preferences::Selector, "VTKViewer",
2465 "spacemouse_func1_btn" );
2466 // .... -> increase speed increment
2467 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2468 LightApp_Preferences::Selector, "VTKViewer",
2469 "spacemouse_func2_btn" );
2470 // .... -> dominant / combined switch
2471 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2472 LightApp_Preferences::Selector, "VTKViewer",
2473 "spacemouse_func5_btn" ); //
2474 aValuesList.clear();
2475 anIndicesList.clear();
2476 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2477 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2478 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2479 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2480 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2481 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2482 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2483 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2484 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2485 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2486 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2487 // ... space mouse sub-group <<end>>
2489 // ... avi recording sub-group <<start>>
2490 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2491 pref->setItemProperty( "columns", 2, vtkRec );
2492 // .... -> recording mode
2493 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2494 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2495 aValuesList.clear();
2496 anIndicesList.clear();
2497 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2498 anIndicesList << 0 << 1;
2499 pref->setItemProperty( "strings", aValuesList, modePref );
2500 pref->setItemProperty( "indexes", anIndicesList, modePref );
2502 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2503 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2504 pref->setItemProperty( "min", 0.1, fpsPref );
2505 pref->setItemProperty( "max", 100, fpsPref );
2507 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2508 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2509 pref->setItemProperty( "min", 1, qualityPref );
2510 pref->setItemProperty( "max", 100, qualityPref );
2511 // .... -> progressive mode
2512 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2513 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2514 // ... avi recording sub-group <<end>>
2516 // ... group names sub-group <<start>>
2517 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2518 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2519 pref->setItemProperty( "columns", 2, vtkGN );
2520 // .... -> text color
2521 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2522 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2523 // .... -> transparency
2524 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2525 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2526 pref->setItemProperty( "min", 0.0, transPref );
2527 pref->setItemProperty( "max", 1.0, transPref );
2528 pref->setItemProperty( "step", 0.1, transPref );
2529 // ... -> group names sub-group <<end>>
2530 // .. "VTK viewer" group <<end>>
2533 // .. "Plot2d viewer" group <<start>>
2534 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2535 //pref->setItemProperty( "columns", 2, plot2dGroup );
2537 // ... -> background
2538 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2539 LightApp_Preferences::Color, "Plot2d", "Background" );
2540 // ... -> selection color
2541 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2542 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2544 // ... "Viewer" group <<start>>
2545 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2547 // .... -> curve type
2548 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2549 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2550 aValuesList.clear();
2551 anIndicesList.clear();
2552 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2553 anIndicesList << 0 << 1 << 2 ;
2554 pref->setItemProperty( "strings", aValuesList, curveType );
2555 pref->setItemProperty( "indexes", anIndicesList, curveType );
2556 // .... -> marker size
2557 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2558 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2559 pref->setItemProperty( "min", 0, markerSize );
2560 pref->setItemProperty( "max", 100, markerSize );
2561 // .... -> horizontal scaling mode
2562 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2563 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2564 aValuesList.clear();
2565 anIndicesList.clear();
2566 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2567 anIndicesList << 0 << 1 ;
2568 pref->setItemProperty( "strings", aValuesList, horScale );
2569 pref->setItemProperty( "indexes", anIndicesList, horScale );
2570 // .... -> vertical scaling mode
2571 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2572 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2573 pref->setItemProperty( "strings", aValuesList, verScale );
2574 pref->setItemProperty( "indexes", anIndicesList, verScale );
2576 // .... -> errors/deviation colot
2577 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2578 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2579 // .... -> deviation markers line size
2580 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2581 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2582 pref->setItemProperty( "min", 1, deviationMarkerLw );
2583 pref->setItemProperty( "max", 5, deviationMarkerLw );
2584 // .... -> deviation markers tick mark size
2585 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2586 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2587 pref->setItemProperty( "min", 1, deviationMarkerTs );
2588 pref->setItemProperty( "max", 5, deviationMarkerTs );
2589 // .... "Viewer" group <<end>>
2591 // ... "Legend" group <<start>>
2592 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2594 // .... -> show legend
2595 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2596 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2597 // .... -> legend position
2598 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2599 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2600 aValuesList.clear();
2601 anIndicesList.clear();
2602 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2603 anIndicesList << 0 << 1 << 2 << 3 ;
2604 pref->setItemProperty( "strings", aValuesList, legendPosition );
2605 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2606 // .... -> Symbol type
2607 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2608 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2609 aValuesList.clear();
2610 anIndicesList.clear();
2611 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2612 anIndicesList << 0 << 1 ;
2613 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2614 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2615 // .... -> legend font
2616 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2617 // ... -> font color
2618 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2619 // ... -> selection font color
2620 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2621 // ... "Legend" group <<end>>
2623 // .. "Plot2d viewer" group <<end>>
2625 // .. "PyViewer" preferences tab <<start>>
2626 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2627 // ... "Font settings" group <<start>>
2628 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2629 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2630 LightApp_Preferences::Font, "PyEditor", "Font" );
2631 // ... "Font settings" group <<end>>
2632 // ... "Display settings" group <<start>>
2633 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2634 pref->setItemProperty( "columns", 2, pyDispGroup );
2635 // ... -> current line highlight
2636 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2637 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2638 // ... -> text wrapping
2639 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2640 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2641 // ... -> center cursor on scroll
2642 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2643 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2644 // ... -> line numbers area
2645 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2646 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2647 // ... "Display settings" group <<end>>
2648 // ... "Tab settings" group <<start>>
2649 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2650 pref->setItemProperty( "columns", 2, pyTabGroup );
2651 // ... -> tab whitespaces
2652 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2653 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2655 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2656 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2657 // ... "Tab settings" group <<end>>
2658 // ... "Vertical edge settings" group <<start>>
2659 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2660 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2661 // ... -> vertical edge
2662 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2663 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2664 // ... -> number of columns
2665 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2666 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2667 // ... "Vertical edge settings" group <<end>>
2668 // .. "PyEditor" preferences tab <<end>>
2670 // .. "Directories" preferences tab <<start>>
2671 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2672 // ... --> quick directories list
2673 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2674 pref->addPreference( tr( "" ), dirGroup,
2675 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2676 // .. "Directories" preferences tab <<end>>
2678 // .. "Object browser" preferences tab <<start>>
2679 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2681 // ... "Search tool" group <<start>>
2682 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2683 // .... --> auto-hide
2684 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2685 "ObjectBrowser", "auto_hide_search_tool" );
2686 // ... "Search tool" group <<end>>
2688 // ... "Object browser settings" group <<start>>
2689 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2690 pref->setItemProperty( "columns", 2, objSetGroup );
2691 // .... -> auto size first column
2692 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2693 "ObjectBrowser", "auto_size_first" );
2694 // .... -> auto size other columns
2695 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2696 "ObjectBrowser", "auto_size" );
2697 // .... -> resize columns on expand item
2698 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2699 "ObjectBrowser", "resize_on_expand_item" );
2700 // .... -> browse to published object
2701 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2702 "ObjectBrowser", "browse_published_object" );
2703 aValuesList.clear();
2704 anIndicesList.clear();
2705 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2706 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2707 pref->setItemProperty( "strings", aValuesList, browsePublished );
2708 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2709 // ... "Object browser settings" group <<end>>
2710 // .. "Object browser" preferences tab <<end>>
2712 // .. "Shortcuts" preferences tab <<start>>
2713 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2714 // ... "Shortcuts settings" group <<start>>
2715 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2716 pref->addPreference( tr( "" ), shortcutGroup,
2717 LightApp_Preferences::ShortcutTree, "shortcuts" );
2718 // ... "Shortcuts settings" group <<end>>
2719 // .. "Shortcuts" preferences tab <<end>>
2720 // . Top-level "SALOME" preferences group <<end>>
2726 Changes appearance of application according to changed preferences
2727 \param sec - section
2728 \param param - name of changed parameter
2730 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2732 SUIT_ResourceMgr* resMgr = resourceMgr();
2736 if ( sec == "viewers" && param == "drop_down_buttons" )
2738 ViewManagerList vmlist = viewManagers();
2739 foreach( SUIT_ViewManager* vm, vmlist )
2741 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2742 foreach( SUIT_ViewWindow* vw, vwlist )
2743 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2747 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2749 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2750 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2751 QList<SUIT_ViewManager*> lst;
2752 #ifndef DISABLE_OCCVIEWER
2753 viewManagers( OCCViewer_Viewer::Type(), lst );
2754 QListIterator<SUIT_ViewManager*> itOCC( lst );
2755 while ( itOCC.hasNext() && sz >= 0 )
2757 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2758 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2761 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2762 occVM->setTrihedronSize( sz, relative );
2763 occVM->getAISContext()->UpdateCurrentViewer();
2766 #ifndef DISABLE_VTKVIEWER
2767 #ifndef DISABLE_SALOMEOBJECT
2768 viewManagers( SVTK_Viewer::Type(), lst );
2769 QListIterator<SUIT_ViewManager*> itVTK( lst );
2770 while ( itVTK.hasNext() && sz >= 0 )
2772 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2773 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2776 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2779 vtkVM->setTrihedronSize( sz, relative );
2787 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2789 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2790 QList<SUIT_ViewManager*> lst;
2791 #ifndef DISABLE_OCCVIEWER
2792 viewManagers( OCCViewer_Viewer::Type(), lst );
2793 QListIterator<SUIT_ViewManager*> itOCC( lst );
2794 while ( itOCC.hasNext() )
2796 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2797 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2800 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2803 occVM->setStaticTrihedronDisplayed( isVisible );
2807 #ifndef DISABLE_VTKVIEWER
2808 #ifndef DISABLE_SALOMEOBJECT
2809 viewManagers( SVTK_Viewer::Type(), lst );
2810 QListIterator<SUIT_ViewManager*> itVTK( lst );
2811 while ( itVTK.hasNext() )
2813 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2814 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2817 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2820 vtkVM->setStaticTrihedronVisible( isVisible );
2828 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2830 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2831 QList<SUIT_ViewManager*> lst;
2832 #ifndef DISABLE_OCCVIEWER
2833 viewManagers( OCCViewer_Viewer::Type(), lst );
2834 QListIterator<SUIT_ViewManager*> itOCC( lst );
2835 while ( itOCC.hasNext() )
2837 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2838 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2841 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2842 occVM->setInteractionStyle( mode );
2845 #ifndef DISABLE_VTKVIEWER
2846 #ifndef DISABLE_SALOMEOBJECT
2847 viewManagers( SVTK_Viewer::Type(), lst );
2848 QListIterator<SUIT_ViewManager*> itVTK( lst );
2849 while ( itVTK.hasNext() )
2851 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2852 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2855 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2856 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2862 #ifndef DISABLE_OCCVIEWER
2863 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2865 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2866 QList<SUIT_ViewManager*> lst;
2867 viewManagers( OCCViewer_Viewer::Type(), lst );
2868 QListIterator<SUIT_ViewManager*> it( lst );
2869 while ( it.hasNext() )
2871 SUIT_ViewModel* vm = it.next()->getViewModel();
2872 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2875 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2876 occVM->enablePreselection( isToEnablePreselection );
2881 #ifndef DISABLE_OCCVIEWER
2882 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2884 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2885 QList<SUIT_ViewManager*> lst;
2886 viewManagers( OCCViewer_Viewer::Type(), lst );
2887 QListIterator<SUIT_ViewManager*> it( lst );
2888 while ( it.hasNext() )
2890 SUIT_ViewModel* vm = it.next()->getViewModel();
2891 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2894 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2895 occVM->enableSelection( isToEnableSelection );
2900 #ifndef DISABLE_OCCVIEWER
2901 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
2903 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
2904 QList<SUIT_ViewManager*> lst;
2905 viewManagers( OCCViewer_Viewer::Type(), lst );
2906 QListIterator<SUIT_ViewManager*> it( lst );
2907 while ( it.hasNext() )
2909 SUIT_ViewModel* vm = it.next()->getViewModel();
2910 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2913 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2914 occVM->setClippingColor( aColor );
2919 #ifndef DISABLE_OCCVIEWER
2920 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
2921 param == QString( "clipping_texture" ) ||
2922 param == QString( "clipping_modulate" ) ||
2923 param == QString( "clipping_scale" ) ) )
2925 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
2926 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
2927 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
2928 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
2929 QList<SUIT_ViewManager*> lst;
2930 viewManagers( OCCViewer_Viewer::Type(), lst );
2931 QListIterator<SUIT_ViewManager*> it( lst );
2932 while ( it.hasNext() )
2934 SUIT_ViewModel* vm = it.next()->getViewModel();
2935 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2938 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2939 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
2944 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2946 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2947 QList<SUIT_ViewManager*> lst;
2948 #ifndef DISABLE_OCCVIEWER
2949 viewManagers( OCCViewer_Viewer::Type(), lst );
2950 QListIterator<SUIT_ViewManager*> itOCC( lst );
2951 while ( itOCC.hasNext() )
2953 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2954 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2957 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2958 occVM->setZoomingStyle( mode );
2961 #ifndef DISABLE_VTKVIEWER
2962 #ifndef DISABLE_SALOMEOBJECT
2963 viewManagers( SVTK_Viewer::Type(), lst );
2964 QListIterator<SUIT_ViewManager*> itVTK( lst );
2965 while ( itVTK.hasNext() )
2967 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2968 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2971 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2972 if( vtkVM ) vtkVM->setZoomingStyle( mode );
2978 #ifndef DISABLE_VTKVIEWER
2979 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2981 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2982 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2983 QList<SUIT_ViewManager*> lst;
2984 #ifndef DISABLE_SALOMEOBJECT
2985 viewManagers( SVTK_Viewer::Type(), lst );
2986 QListIterator<SUIT_ViewManager*> it( lst );
2987 while ( it.hasNext() )
2989 SUIT_ViewModel* vm = it.next()->getViewModel();
2990 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2993 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2994 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3000 #ifndef DISABLE_VTKVIEWER
3001 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3003 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3004 QList<SUIT_ViewManager*> lst;
3005 #ifndef DISABLE_SALOMEOBJECT
3006 viewManagers( SVTK_Viewer::Type(), lst );
3007 QListIterator<SUIT_ViewManager*> it( lst );
3008 while ( it.hasNext() )
3010 SUIT_ViewModel* vm = it.next()->getViewModel();
3011 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3014 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3015 if( vtkVM ) vtkVM->setProjectionMode( mode );
3021 #ifndef DISABLE_VTKVIEWER
3022 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3024 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3025 QList<SUIT_ViewManager*> lst;
3026 #ifndef DISABLE_SALOMEOBJECT
3027 viewManagers( SVTK_Viewer::Type(), lst );
3028 QListIterator<SUIT_ViewManager*> it( lst );
3029 while ( it.hasNext() )
3031 SUIT_ViewModel* vm = it.next()->getViewModel();
3032 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3035 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3036 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3042 #ifndef DISABLE_VTKVIEWER
3043 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3045 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3046 QList<SUIT_ViewManager*> lst;
3047 #ifndef DISABLE_SALOMEOBJECT
3048 viewManagers( SVTK_Viewer::Type(), lst );
3049 QListIterator<SUIT_ViewManager*> it( lst );
3050 while ( it.hasNext() )
3052 SUIT_ViewModel* vm = it.next()->getViewModel();
3053 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3056 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3057 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3063 #ifndef DISABLE_VTKVIEWER
3064 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3065 param == QString( "spacemouse_func2_btn" ) ||
3066 param == QString( "spacemouse_func5_btn" ) ) )
3068 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3069 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3070 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3071 QList<SUIT_ViewManager*> lst;
3072 #ifndef DISABLE_SALOMEOBJECT
3073 viewManagers( SVTK_Viewer::Type(), lst );
3074 QListIterator<SUIT_ViewManager*> it( lst );
3075 while ( it.hasNext() )
3077 SUIT_ViewModel* vm = it.next()->getViewModel();
3078 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3081 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3082 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3087 if( sec=="ObjectBrowser" )
3089 SUIT_DataBrowser* ob = objectBrowser();
3093 if ( param=="auto_size_first" )
3095 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3096 ob->setAutoSizeFirstColumn( autoSizeFirst );
3097 if ( autoSizeFirst )
3098 ob->adjustFirstColumnWidth();
3100 else if ( param=="auto_size" ) {
3101 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3102 ob->setAutoSizeColumns(autoSize);
3104 ob->adjustColumnsWidth();
3106 else if ( param=="resize_on_expand_item" ) {
3107 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3108 ob->setResizeOnExpandItem(resizeOnExpandItem);
3110 else if ( param == "auto_hide_search_tool" ) {
3111 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3117 if( param=="auto_save_interval" ) {
3118 myAutoSaveTimer->stop();
3119 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3120 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3124 #ifndef DISABLE_PYCONSOLE
3125 if( sec=="PyConsole" && pythonConsole() )
3127 if ( param=="font" ) {
3128 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3130 else if ( param=="show_banner" ) {
3131 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3138 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3140 if ( param == "visible_count" )
3141 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3142 else if ( param == "max_count" )
3143 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3144 else if ( param == "insert_mode" )
3145 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3146 else if ( param == "link_type" )
3147 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3148 else if ( param == "show_clear" )
3149 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3150 else if ( param == "show_mru" )
3151 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3154 if ( sec == "language" && param == "language" )
3156 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3158 if ( sec == "language" && param == "locale")
3160 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3162 if ( sec == "desktop" && param == "opaque_resize" ) {
3163 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3164 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3165 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3166 else dopts &= ~QMainWindow::AnimatedDocks;
3167 desktop()->setDockOptions( dopts );
3168 desktop()->setOpaqueResize( opaqueResize );
3169 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3170 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3173 #ifndef DISABLE_PLOT2DVIEWER
3174 QList<SUIT_ViewManager*> lst;
3175 viewManagers( Plot2d_Viewer::Type(), lst );
3176 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3177 while ( itPlot2d.hasNext() ) {
3178 SUIT_ViewManager* viewMgr = itPlot2d.next();
3179 SUIT_ViewModel* vm = viewMgr->getViewModel();
3180 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3183 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3185 viewMgr->setViewModel( vm );
3186 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3188 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3189 frame->SetPreference();
3194 #ifndef DISABLE_PYVIEWER
3195 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3196 param == QString( "LineNumberArea" ) ||
3197 param == QString( "TextWrapping" ) ||
3198 param == QString( "CenterCursorOnScroll" ) ||
3199 param == QString( "TabSpaceVisible" ) ||
3200 param == QString( "TabSize" ) ||
3201 param == QString( "VerticalEdge" ) ||
3202 param == QString( "NumberColumns" ) ||
3203 param == QString( "Font" ) ) )
3205 QList<SUIT_ViewManager*> lst;
3206 viewManagers( PyViewer_Viewer::Type(), lst );
3207 QListIterator<SUIT_ViewManager*> itPy( lst );
3208 while ( itPy.hasNext() )
3210 SUIT_ViewManager* viewMgr = itPy.next();
3211 SUIT_ViewModel* vm = viewMgr->getViewModel();
3212 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3215 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3217 viewMgr->setViewModel( vm );
3218 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3221 pyView->setPreferences();
3231 void LightApp_Application::loadPreferences()
3233 CAM_Application::loadPreferences();
3235 SUIT_ResourceMgr* aResMgr = resourceMgr();
3240 static bool mru_load = true;
3243 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3245 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3246 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3247 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3248 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3249 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3250 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3251 mru->loadLinks( aResMgr, "MRU" );
3257 QStringList mods = aResMgr->parameters( "windows_visibility" );
3258 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3261 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3262 myWinVis.insert( *itr, arr );
3266 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3267 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3268 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3269 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3270 else dopts &= ~QMainWindow::AnimatedDocks;
3271 desktop()->setDockOptions( dopts );
3272 desktop()->setOpaqueResize( opaqueResize );
3273 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3274 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3281 void LightApp_Application::savePreferences()
3283 CAM_Application::savePreferences();
3285 saveDockWindowsState();
3287 SUIT_ResourceMgr* aResMgr = resourceMgr();
3292 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3294 mru->saveLinks( aResMgr, "MRU" );
3296 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3297 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3300 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3302 #if GUI_DEVELOPMENT > 0
3303 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3305 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3312 Updates desktop title
3314 void LightApp_Application::updateDesktopTitle()
3316 QString aTitle = applicationName();
3317 QString aVer = applicationVersion();
3318 if ( !aVer.isEmpty() )
3319 aTitle += QString( " " ) + aVer;
3321 if ( activeStudy() ) {
3322 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3323 aTitle += QString( " - [%1]" ).arg( sName );
3326 desktop()->setWindowTitle( aTitle );
3330 \brief Get map of the operations which can be performed
3331 on the module activation.
3333 The method should return the map of the kind \c {<id>:<name>}
3334 where \c <id> is an integer identifier of the operation and
3335 \c <name> is a title for the button to be added to the
3336 dialog box. After user selects the required operation by the
3337 clicking the corresponding button in the dialog box, its identifier
3338 is passed to the moduleActionSelected() method to process
3341 \return map of the operations
3342 \sa moduleActionSelected()
3344 QMap<int, QString> LightApp_Application::activateModuleActions() const
3346 QMap<int, QString> opmap;
3347 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3348 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3353 \brief Called when the used selectes required operation chosen
3354 from "Activate module" dialog box.
3356 Performs the required operation according to the user choice.
3358 \param id operation identifier
3359 \sa activateModuleActions()
3361 void LightApp_Application::moduleActionSelected( const int id )
3376 Updates windows after close document
3378 void LightApp_Application::afterCloseDoc()
3382 CAM_Application::afterCloseDoc();
3386 Updates actions of active module
3388 void LightApp_Application::updateModuleActions()
3391 if ( activeModule() ) {
3392 modName = activeModule()->moduleName();
3393 if ( !isModuleAccessible( modName ) ) {
3394 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3395 foreach( SUIT_Application* app, apps ) {
3396 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3397 if ( lapp && lapp != this )
3398 lapp->removeModuleAction( modName );
3403 LightApp_ModuleAction* moduleAction =
3404 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3406 moduleAction->setActiveModule( modName );
3409 void LightApp_Application::removeModuleAction( const QString& modName )
3411 LightApp_ModuleAction* moduleAction =
3412 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3414 moduleAction->removeModule( modName );
3418 Gets current windows.
3419 \param winMap - output current windows map.
3421 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3424 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3425 ((LightApp_Module*)activeModule())->windows( winMap );
3427 defaultWindows( winMap );
3431 Gets current view managers.
3432 \param lst - output current view managers list.
3434 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3437 if ( !activeStudy() )
3440 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3441 ((LightApp_Module*)activeModule())->viewManagers( lst );
3443 defaultViewManagers( lst );
3449 void LightApp_Application::updateWindows()
3451 QMap<int, int> winMap;
3452 currentWindows( winMap );
3454 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3456 if ( !dockWindow( it.key() ) )
3457 getWindow( it.key() );
3460 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3462 QWidget* wid = it.value();
3463 if ( winMap.contains( it.key() ) )
3464 wid->setVisible( true );
3469 loadDockWindowsState();
3473 Updates view managers
3475 void LightApp_Application::updateViewManagers()
3478 currentViewManagers( lst );
3480 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3481 getViewManager( *it, true );
3485 Loads windows geometry
3487 void LightApp_Application::loadDockWindowsState()
3491 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3492 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3493 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3496 if ( activeModule() )
3497 modName = activeModule()->name();
3498 else if ( activeStudy() )
3499 modName = "nomodule";
3501 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3502 QByteArray aDefaultState;
3503 aResMgr->value( "windows_geometry", modName, aDefaultState );
3504 QByteArray aDefaultVisibility;
3505 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3506 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3507 aResMgr->setWorkingMode( prevMode );
3509 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3512 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3513 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3515 if ( version > Qtx::versionToId( "7.4.1" ) )
3516 aResMgr->value( "windows_geometry", modName , arr );
3518 arr = aDefaultState;
3519 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3520 desktop()->restoreState( aTargetArray );
3523 QStringList mainToolbarsNames;
3524 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3525 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3526 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3528 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3531 QMap<QString, bool> *tbMap = 0;
3532 QMap<QString, bool> *dwMap = 0;
3534 QMap<QString, bool> userTbMap, userDwMap;
3535 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3537 QMap<QString, bool> defaultTbMap, defaultDwMap;
3538 if(hasDefaultVisibility) {
3539 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3545 if(hasDefaultVisibility){
3546 tbMap = &defaultTbMap;
3553 if(hasDefaultVisibility){
3554 dwMap = &defaultDwMap;
3559 QList<QToolBar*> tbList = findToolBars();
3560 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3562 QToolBar* tb = *tit;
3563 if ( tbMap->contains( tb->objectName() ) ) {
3564 tb->setVisible( (*tbMap)[tb->objectName()] );
3570 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3571 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3573 QDockWidget* dw = *dit;
3575 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3576 if ( po != desktop() )
3579 if ( dwMap->contains( dw->objectName() ) )
3580 dw->setVisible( (*dwMap)[dw->objectName()] );
3588 Saves windows geometry
3590 void LightApp_Application::saveDockWindowsState()
3595 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3596 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3598 if( !storeWin && !storeTb )
3602 if ( activeModule() )
3603 modName = activeModule()->name();
3604 else if ( activeStudy() )
3605 modName = "nomodule";
3607 QString versionId = GUI_VERSION_STR;
3608 #if GUI_DEVELOPMENT > 0
3612 QByteArray arr = desktop()->saveState();
3613 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3614 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3617 if ( myWinVis.contains( modName ) )
3618 visArr = myWinVis[modName];
3620 QMap<QString, bool> tbMap, dwMap;
3621 dockWindowsState( visArr, tbMap, dwMap );
3623 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3624 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3627 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3630 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3631 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3633 QDockWidget* wid = *it;
3634 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3637 visArr = dockWindowsState( tbMap, dwMap );
3639 myWinVis.insert( modName, visArr );
3642 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3645 QDataStream stream( &visArr, QIODevice::WriteOnly );
3647 stream << (uchar)ToolBarMarker;
3648 stream << tb.size();
3649 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3651 stream << tit.key();
3652 stream << (uchar)( tit.value() ? 1 : 0 );
3655 stream << (uchar)DockWidgetMarker;
3656 stream << dw.size();
3657 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3659 stream << wit.key();
3660 stream << (uchar)( wit.value() ? 1 : 0 );
3666 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3671 QByteArray visArr = arr;
3672 QDataStream stream( &visArr, QIODevice::ReadOnly );
3676 if ( marker != ToolBarMarker )
3681 for ( int i = 0; i < lines; ++i )
3684 stream >> objectName;
3687 tb.insert( objectName, shown );
3691 if ( marker != DockWidgetMarker )
3695 for ( int j = 0; j < lines; ++j )
3698 stream >> objectName;
3701 dw.insert( objectName, shown );
3706 Adds icon names for modules
3708 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3712 SUIT_ResourceMgr* resMgr = resourceMgr();
3716 QStringList modList;
3717 modules( modList, false );
3719 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3721 QString modName = *it;
3722 QString modIntr = moduleName( modName );
3723 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3725 if ( modIcon.isEmpty() )
3728 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3729 modIcon += QString( ".png" );
3731 iconMap.insert( modName, modIcon );
3736 Inserts items in popup, which necessary for current application
3738 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3741 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3742 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3743 selMgr->setSelectionCacheEnabled( true );
3745 SUIT_DataBrowser* ob = objectBrowser();
3747 CAM_Application::contextMenuPopup( type, thePopup, title );
3749 if ( ob && type == ob->popupClientType() ) {
3750 thePopup->addSeparator();
3751 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3752 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3753 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3756 #ifndef DISABLE_SALOMEOBJECT
3757 if ( selMgr && ob ) {
3758 SALOME_ListIO selected;
3759 selMgr->selectedObjects( selected );
3760 if(selected.Extent() == 1){
3761 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3762 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3763 if(obj && obj->renameAllowed()) {
3764 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3765 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3766 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3767 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3769 QList<QAction*> acts = thePopup->actions();
3770 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3771 thePopup->insertAction(firstAction,a);
3777 selMgr->setSelectionCacheEnabled( cacheIsOn );
3783 void LightApp_Application::createEmptyStudy()
3785 CAM_Application::createEmptyStudy();
3787 if ( objectBrowser() )
3788 objectBrowser()->updateTree();
3790 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3791 if ( aResMgr && activeStudy() ) {
3792 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3793 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3798 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3800 CAM_Application::setDesktop( desk );
3803 connect( desk, SIGNAL( message( const QString& ) ),
3804 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3805 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3806 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3812 \param mod - module to be activated
3814 bool LightApp_Application::activateModule( CAM_Module* mod )
3816 bool res = CAM_Application::activateModule( mod );
3818 if ( objectBrowser() )
3819 objectBrowser()->updateTree();
3825 \return keyborad accelerators manager object
3827 SUIT_Accel* LightApp_Application::accel() const
3833 Removes dead widget container from map
3835 void LightApp_Application::onWCDestroyed( QObject* ob )
3837 // remove destroyed widget container from windows map
3838 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3840 if ( itr.value() != ob )
3843 int key = itr.key();
3844 myWin.remove( key );
3849 void LightApp_Application::onMRUActivated( const QString& name )
3851 SUIT_Session* s = SUIT_Session::session();
3852 if ( s && s->activeApplication() == this )
3856 void LightApp_Application::onStylePreferences()
3858 Style_PrefDlg dlg( desktop() );
3861 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3864 void LightApp_Application::onFullScreen(){
3865 if(myScreenHelper) {
3866 if(desktop()->isFullScreen())
3867 myScreenHelper->switchToNormalScreen();
3869 myScreenHelper->switchToFullScreen();
3874 Connects just added view manager
3876 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3878 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3879 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3880 CAM_Application::addViewManager( vm );
3884 Remove view manager from memory
3886 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3888 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3889 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3890 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3892 aStudy->removeObjectProperties( vm->getGlobalId() );
3894 CAM_Application::removeViewManager( vm );
3896 LightApp_SelectionMgr* selMgr = selectionMgr();
3897 QList<SUIT_Selector*> selectors;
3898 selMgr->selectors( selectors );
3899 foreach( SUIT_Selector* selector, selectors ) {
3900 if ( selector->owner() == vm->getViewModel() ) {
3905 // IPAL22894: Crash on closing OCC view
3911 Renames active window of desktop
3913 void LightApp_Application::onRenameWindow()
3918 QWidget* w = desktop()->activeWindow();
3923 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3924 if( ok && !name.isEmpty() )
3925 w->setWindowTitle( name );
3929 Closes active window of desktop
3931 void LightApp_Application::onCloseWindow()
3936 QWidget* w = desktop()->activeWindow();
3944 Closes all windows of desktop
3946 void LightApp_Application::onCloseAllWindow()
3948 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3952 QList<SUIT_ViewWindow*> wndList = desk->windows();
3953 SUIT_ViewWindow* wnd;
3954 foreach( wnd, wndList )
3962 Groups all windows of desktop
3964 void LightApp_Application::onGroupAllWindow()
3966 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3970 QtxWorkstack* wgStack = desk->workstack();
3976 \return if the library of module exists
3977 \param moduleTitle - title of module
3979 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3981 if( moduleTitle.isEmpty() )
3984 QString lib = moduleLibrary( moduleTitle );
3986 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3987 bool isPythonModule = lib.contains("SalomePyQtGUI");
3988 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3992 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3994 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3997 bool isLibFound = false;
3998 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3999 for( ; anIt!=aLast; anIt++ )
4001 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4012 INFOS( "\n****************************************************************" << std::endl
4013 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4014 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4015 << "****************************************************************" << std::endl );
4017 else if ( !isPythonModule && !isPythonLightModule)
4020 if ( isPythonModule || isPythonLightModule)
4022 QString pylib = moduleName( moduleTitle ) + QString(".py");
4023 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4025 // Check the python library
4027 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4029 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4031 bool isPyLib = false, isPyGuiLib = false;
4032 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4033 for( ; anIt!=aLast; anIt++ )
4035 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4036 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4038 if(!isPythonLightModule)
4039 if( !isPyLib && inf.exists() )
4042 if( !isPyGuiLib && infgui.exists() )
4045 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4049 printf( "\n****************************************************************\n" );
4050 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4052 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4054 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4055 printf( "****************************************************************\n" );
4062 \return default name for an active study
4064 void LightApp_Application::setDefaultStudyName( const QString& theName )
4066 QStringList anInfoList;
4067 modules( anInfoList, false );
4069 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4070 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4071 !aStudy->isSaved() )
4073 aStudy->setStudyName( theName );
4074 updateDesktopTitle();
4079 Custom event handler
4081 bool LightApp_Application::event( QEvent* e )
4083 if( e && e->type()==2000 )
4085 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4086 QString* d = ( QString* )ce->data();
4087 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4089 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4090 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4091 showPreferences( tr( "PREF_APP" ) );
4096 return CAM_Application::event( e );
4099 /*! Check data object */
4100 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4104 bool isSuitable = !theObj->entry().isEmpty() &&
4105 !theObj->componentDataType().isEmpty() &&
4106 !theObj->name().isEmpty();
4113 int LightApp_Application::openChoice( const QString& aName )
4115 int choice = CAM_Application::openChoice( aName );
4117 if ( choice == OpenExist ) // The document is already open.
4119 // Do you want to reload it?
4120 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4121 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4122 choice = OpenReload;
4128 bool LightApp_Application::openAction( const int choice, const QString& aName )
4135 STD_Application* app = 0;
4136 SUIT_Session* session = SUIT_Session::session();
4137 QList<SUIT_Application*> appList = session->applications();
4138 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4140 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4141 app = ::qobject_cast<STD_Application*>( *it );
4146 app->onCloseDoc( false );
4147 appList = session->applications();
4148 STD_Application* other = 0;
4149 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4150 other = ::qobject_cast<STD_Application*>( *it );
4153 res = other->onOpenDoc( aName );
4158 res = CAM_Application::openAction( choice, aName );
4165 QStringList LightApp_Application::viewManagersTypes() const
4167 QStringList aTypesList;
4168 aTypesList += myUserWmTypes;
4169 #ifndef DISABLE_GLVIEWER
4170 aTypesList<<GLViewer_Viewer::Type();
4172 #ifndef DISABLE_PLOT2DVIEWER
4173 aTypesList<<Plot2d_Viewer::Type();
4175 #ifndef DISABLE_QXGRAPHVIEWER
4176 aTypesList<<QxScene_Viewer::Type();
4178 #ifndef DISABLE_PVVIEWER
4179 aTypesList<<PVViewer_Viewer::Type();
4181 #ifndef DISABLE_PYVIEWER
4182 aTypesList<<PyViewer_Viewer::Type();
4184 #ifndef DISABLE_OCCVIEWER
4185 aTypesList<<OCCViewer_Viewer::Type();
4187 #ifndef DISABLE_VTKVIEWER
4188 #ifndef DISABLE_SALOMEOBJECT
4189 aTypesList<<SVTK_Viewer::Type();
4191 aTypesList<<VTKViewer_Viewer::Type();
4197 * Removes all view managers of known types
4198 * Other view managers are ignored
4200 void LightApp_Application::clearKnownViewManagers()
4202 QStringList aTypesList = viewManagersTypes();
4203 QList<SUIT_ViewManager*> aMgrList;
4204 viewManagers( aMgrList );
4205 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4206 if (aTypesList.contains(aMgr->getType()))
4207 removeViewManager(aMgr);
4212 Copy of current selection
4214 void LightApp_Application::onCopy()
4216 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4222 Paste of current data in clipboard
4224 void LightApp_Application::onPaste()
4226 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4232 Browse (i.e. set focus on) the published objects
4233 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4234 has been accepted by Ok (or Apply & Close) button
4235 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4236 (to select the first published object only)
4237 \return entry of the selected object
4239 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4240 const bool theIsApplyAndClose,
4241 const bool theIsOptimizedBrowsing )
4244 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4246 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4247 switch( aBrowsePolicy )
4251 case BP_ApplyAndClose:
4252 if( !theIsApplyAndClose )
4260 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4264 SUIT_DataBrowser* anOB = objectBrowser();
4268 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4272 QStringListIterator anIter( theEntryList );
4273 if( theIsOptimizedBrowsing )
4275 // go to the last entry
4277 if( anIter.hasPrevious() )
4281 // scroll to each entry in the list
4282 // (in optimized mode - to the last entry only)
4284 LightApp_DataObject* anObject = 0;
4285 while( anIter.hasNext() )
4287 anEntry = anIter.next();
4288 if( !anEntry.isEmpty() )
4290 anObject = aStudy->findObjectByEntry( anEntry );
4293 QModelIndex anIndex = aModel->index( anObject );
4294 anOB->treeView()->scrollTo( anIndex );
4299 // always select the last object
4300 if( anObject && !anEntry.isEmpty() )
4302 QList<SUIT_Selector*> aSelectorList;
4303 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4304 if( !aSelectorList.isEmpty() )
4306 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4308 bool anIsAutoBlock = aSelector->autoBlock();
4310 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4311 aSelector->setAutoBlock( false );
4313 SUIT_DataOwnerPtrList aList;
4314 #ifndef DISABLE_SALOMEOBJECT
4315 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4316 ( anObject->entry().toLatin1().constData(),
4317 anObject->componentDataType().toLatin1().constData(),
4318 anObject->name().toLatin1().constData() );
4319 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4321 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4324 aList.append( owner );
4325 selectionMgr()->setSelected( aList );
4328 // restore auto block flag
4329 aSelector->setAutoBlock( anIsAutoBlock );
4337 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4339 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4340 return study ? study->findObjectByEntry( id ) : 0;
4344 Checks that an object can be renamed.
4345 \param entry entry of the object
4346 \brief Return \c true if object can be renamed
4348 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4353 Rename object by entry.
4354 \param entry entry of the object
4355 \param name new name of the object
4356 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4358 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4362 /*! Process standard messages from desktop */
4363 void LightApp_Application::onDesktopMessage( const QString& message )
4365 const QString sectionSeparator = "/";
4367 if ( message.toLower() == "updateobjectbrowser" ||
4368 message.toLower() == "updateobjbrowser" ) {
4369 // update object browser
4370 updateObjectBrowser();
4372 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4373 QString vtype = message.split( sectionSeparator ).last();
4374 if ( !vtype.isEmpty() )
4375 getViewManager( vtype, true );
4378 QStringList data = message.split( sectionSeparator );
4379 if ( data.count() > 1 ) {
4380 QString msgType = data[0].trimmed();
4381 LightApp_Module* sMod = 0;
4382 CAM_Module* mod = module( msgType );
4384 mod = module( moduleTitle( msgType ) );
4385 if ( mod && mod->inherits( "LightApp_Module" ) )
4386 sMod = (LightApp_Module*)mod;
4388 if ( msgType.toLower() == "preferences" ) {
4389 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4390 // for example "preferences/Study/multi_file_dump/true"
4391 if ( data.count() > 3 ) {
4392 QString section = data[1].trimmed();
4393 QString param = data[2].trimmed();
4394 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4395 resourceMgr()->setValue( section, param, value );
4399 // received message for the module
4400 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4401 sMod->message( msg );
4409 Returns all top level toolbars.
4410 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4412 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4414 QList<QToolBar*> aResult;
4415 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4416 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4417 QToolBar* tb = *tit;
4418 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4419 if ( po != desktop() )
4421 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4428 Internal method to parse toolbars and dockable windows state.
4430 QByteArray LightApp_Application::processState(QByteArray& input,
4431 const bool processWin,
4432 const bool processTb,
4433 const bool isRestoring,
4434 QByteArray defaultState) {
4437 bool hasDefaultState = !defaultState.isEmpty();
4438 bool isDockWinWriten = false;
4440 //Write date from users settings
4442 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4443 int marker, version;
4445 tmpInputData >> marker;
4446 tmpInputData >> version;
4447 tmpInputData >> dockmarker;
4448 tmpInputData >> nbDocWin;
4450 if(processWin && processTb && !isRestoring) {
4452 } else if(!processWin && !processTb ) {
4454 aRes = defaultState;
4456 QDataStream aData(&aRes, QIODevice::WriteOnly);
4457 QList<QToolBar*> aToolBars = findToolBars();
4460 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4461 QToolBar* tb = *tit;
4462 aNames.append(tb->objectName());
4465 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4466 if(toolBarMarkerIndex < 0)
4468 QDataStream anInputData(&input, QIODevice::ReadOnly);
4470 int toolBarMarkerIndexDef;
4471 if(hasDefaultState) {
4472 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4473 if(toolBarMarkerIndexDef < 0)
4476 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4478 QDataStream* aTargetData = 0;
4479 int aTargetIndex = -1;
4481 QByteArray currentArr = desktop()->saveState();
4482 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4483 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4484 if(processWin && useInputData) {
4485 aTargetData = &anInputData;
4486 aTargetIndex = toolBarMarkerIndex;
4488 //Write date from default settings
4489 if(hasDefaultState) {
4490 aTargetData = &anInputDataDef;
4491 aTargetIndex = toolBarMarkerIndexDef;
4493 //If no default state, write current snapshot of the dockable windows
4495 aTargetData = &anInputDataCur;
4496 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4497 aTargetIndex = toolBarMarkerIndexCur;
4502 if(aTargetData && aTargetIndex >= 0 ) {
4503 aTargetData->device()->seek(0);
4504 while( aTargetData->device()->pos() < aTargetIndex ) {
4509 isDockWinWriten = true;
4516 aTargetData = &anInputData;
4517 aTargetIndex = toolBarMarkerIndex;
4519 if(hasDefaultState) {
4520 aTargetData = &anInputDataDef;
4521 aTargetIndex = toolBarMarkerIndexDef;
4525 if(aTargetData && aTargetIndex >= 0) {
4527 if(!isDockWinWriten ) {
4528 //Write version marker
4529 int marker, version;
4530 aTargetData->device()->seek(0);
4531 *aTargetData >> marker;
4532 *aTargetData >> version;
4535 aData << (uchar) QDockWidgetMarker;
4537 int shift = 4*sizeof(int) + sizeof(QSize);
4538 index = aTargetIndex - shift;
4540 index = aTargetIndex;
4543 aTargetData->device()->seek(index);
4544 while(!aTargetData->atEnd()) {
4549 } else { // Not treat toolbars
4550 aData << (uchar) QToolBarMarker;
4551 aData << (int) 0; //Nb toolbars = 0
4558 \brief Emits operationFinished signal.
4559 \param theModuleName the name of the module which perfomed the operation
4560 \param theOperationName the operation name
4561 \param theEntryList the list of the created objects entries
4563 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4564 const QString& theOperationName,
4565 const QStringList& theEntryList )
4567 emit operationFinished( theModuleName, theOperationName, theEntryList );
4571 Update visibility state of given objects
4573 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4574 SUIT_ViewModel* theViewModel )
4576 if ( !theViewModel || theList.isEmpty() ) return;
4578 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4579 if ( !aStudy ) return;
4581 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4583 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4584 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4586 if ( !obj || aStudy->isComponent( obj->entry() ) )
4589 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4590 if ( anObjModule ) {
4591 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4593 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4594 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4595 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4596 anObjState = Qtx::ShownState;
4598 anObjState = Qtx::HiddenState;
4600 aStudy->setVisibilityState( obj->entry(), anObjState );
4607 * Called when window activated
4609 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4611 SUIT_DataBrowser* anOB = objectBrowser();
4614 SUIT_DataObject* rootObj = anOB->root();
4618 DataObjectList listObj = rootObj->children( true );
4620 SUIT_ViewModel* vmod = 0;
4621 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4622 vmod = vman->getViewModel();
4623 updateVisibilityState( listObj, vmod );
4627 Called then view manager removed
4629 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4631 ViewManagerList lst;
4632 viewManagers( lst );
4633 if ( lst.count() == 1) { // in case if closed last view window
4634 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4636 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4641 Check existing document.
4643 bool LightApp_Application::checkExistingDoc()
4646 if( activeStudy() ) {
4647 int answer = SUIT_MessageBox::question( desktop(),
4648 tr( "APPCLOSE_CAPTION" ),
4649 tr( "STUDYCLOSE_DESCRIPTION" ),
4650 tr( "APPCLOSE_SAVE" ),
4651 tr( "APPCLOSE_CLOSE" ),
4652 tr( "APPCLOSE_CANCEL" ), 0 );
4654 if ( activeStudy()->isSaved() ) {
4657 } else if ( onSaveAsDoc() ) {
4658 if( !closeDoc( false ) ) {
4665 else if( answer == 1 ) {
4667 } else if( answer == 2 ) {
4674 #ifndef DISABLE_PYCONSOLE
4676 PyConsole_Interp* LightApp_Application::getPyInterp()
4678 static PyConsole_Interp* myInterp = 0;
4680 myInterp = createPyInterp();
4684 PyConsole_Interp* LightApp_Application::createPyInterp()
4686 return new LightApp_PyInterp();
4689 #endif // DISABLE_PYCONSOLE