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 #include <OCCViewer_ViewPort3d.h>
120 #ifndef DISABLE_SALOMEOBJECT
121 #include <SOCC_ViewModel.h>
123 #include <OCCViewer_ViewModel.h>
125 #include "LightApp_OCCSelector.h"
128 #ifndef DISABLE_VTKVIEWER
129 #ifndef DISABLE_SALOMEOBJECT
130 #include <SVTK_ViewModel.h>
131 #include <SVTK_ViewManager.h>
132 #include "LightApp_VTKSelector.h"
134 #include <VTKViewer_ViewModel.h>
135 #include <VTKViewer_ViewManager.h>
137 #include <VTKViewer_ViewModel.h>
140 #ifndef DISABLE_QXGRAPHVIEWER
141 #include <QxScene_ViewManager.h>
142 #include <QxScene_ViewModel.h>
143 #include <QxScene_ViewWindow.h>
146 #ifndef DISABLE_GRAPHICSVIEW
147 #include "GraphicsView_Viewer.h"
148 #include "GraphicsView_ViewManager.h"
149 #include "LightApp_GVSelector.h"
152 #ifndef DISABLE_PVVIEWER
153 #include "PVViewer_ViewManager.h"
154 #include "PVViewer_ViewWindow.h"
155 #include "PVViewer_ViewModel.h"
158 #ifndef DISABLE_PYVIEWER
159 #include <PyViewer_ViewManager.h>
160 #include <PyViewer_ViewModel.h>
161 #include <PyViewer_ViewWindow.h>
165 #define VISIBILITY_COLUMN_WIDTH 25
171 #include <QStringList>
173 #include <QApplication>
175 #include <QStatusBar>
177 #include <QObjectList>
179 #include <QInputDialog>
180 #include <QFontDatabase>
182 #include <QByteArray>
186 #include <QHeaderView>
191 #include <utilities.h>
193 #define FIRST_HELP_ID 1000000
195 #ifndef DISABLE_SALOMEOBJECT
196 #include <SALOME_InteractiveObject.hxx>
197 #include <SALOME_ListIO.hxx>
200 #include <Standard_Version.hxx>
202 #define ToolBarMarker 0
203 #define DockWidgetMarker 1
205 static const char* imageEmptyIcon[] = {
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "...................."};
229 int LightApp_Application::lastStudyId = 0;
231 // Markers used to parse array with dockable windows and toolbars state.
232 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
233 // in the Qt source code.
235 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
236 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
238 // Format of the Byte array with the windows and toolbar state is:
239 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
241 //Find toolbar marker position in the array in the following way:
242 //since the 'toolbar marker' is not unique, find index of first occurrence of the
243 //'toolbar marker' in the array and check that next string is name of the toolbar
245 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
246 int aResult = -1,tmp = 0;
247 int inputLen = input.length();
248 QDataStream anInputData(&input, QIODevice::ReadOnly);
249 while(tmp < inputLen) {
250 tmp = input.indexOf(QToolBarMarker, tmp + 1);
253 anInputData.device()->seek(tmp);
257 anInputData >> lines;
259 if(lines == 0 && anInputData.atEnd()){
260 //Case then array doesn't contain information about toolbars,
271 if(aFlags.contains(str)) {
280 \return last global id of study
282 int LightApp_Application::studyId()
284 return LightApp_Application::lastStudyId;
287 /*!Create new instance of LightApp_Application.*/
288 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
290 return new LightApp_Application();
293 /*! \var global preferences of LightApp */
294 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
298 \class LightApp_Application
299 Application containing LightApp module
303 LightApp_Application::LightApp_Application()
304 : CAM_Application( false ),
306 myScreenHelper(new LightApp_FullScreenHelper())
308 Q_INIT_RESOURCE( LightApp );
310 STD_TabDesktop* desk = new STD_TabDesktop();
311 desk->setFullScreenAllowed(false);
312 desk->setMinimizeAllowed(false);
316 // initialize auto save timer
317 myAutoSaveTimer = new QTimer( this );
318 myAutoSaveTimer->setSingleShot( true );
319 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
321 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
323 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
324 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
326 desktop()->setWindowIcon( aLogo );
327 desktop()->setDockableMenuBar( false );
328 desktop()->setDockableStatusBar( false );
330 // base logo (salome itself)
331 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
332 // extra logo (salome-based application)
333 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
337 mySelMgr = new LightApp_SelectionMgr( this );
339 myAccel = SUIT_Accel::getAccel();
341 #ifndef DISABLE_OCCVIEWER
342 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
343 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
351 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
355 #ifndef DISABLE_VTKVIEWER
356 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
369 #ifndef DISABLE_PLOT2DVIEWER
370 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
380 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
381 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
382 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
383 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
384 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
387 // Set existing font for the python console in resources
388 if( !aResMgr->hasValue( "PyConsole", "font" ) )
391 QFont f = aResMgr->fontValue( "PyConsole", "font" );
393 QStringList famdb = fdb.families();
395 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
398 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
400 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
403 if ( famdb.contains(aFamily) )
405 f.setFamily( aFamily );
406 aResMgr->setValue( "PyConsole", "font", f );
413 *\li Save window geometry.
414 *\li Save desktop geometry.
415 *\li Save resource maneger.
416 *\li Delete selection manager.
418 LightApp_Application::~LightApp_Application()
421 delete myScreenHelper;
424 /*!Start application.*/
425 void LightApp_Application::start()
427 CAM_Application::start();
430 updateViewManagers();
431 updateCommandsStatus();
434 desktop()->statusBar()->showMessage( "" );
436 LightApp_EventFilter::Init();
439 /*!Closeapplication.*/
440 void LightApp_Application::closeApplication()
442 QProcess::startDetached( "HelpBrowser",
443 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
445 CAM_Application::closeApplication();
448 /*!Gets application name.*/
449 QString LightApp_Application::applicationName() const
451 static QString _app_name;
452 if ( _app_name.isEmpty() )
453 _app_name = tr( "APP_NAME" );
457 /*!Gets application version.*/
458 QString LightApp_Application::applicationVersion() const
460 static QString _app_version;
462 if ( _app_version.isEmpty() )
464 QString resVersion = tr( "APP_VERSION" );
465 if ( resVersion != "APP_VERSION" )
467 _app_version = resVersion;
471 _app_version = GUI_VERSION_STR;
477 /*!Load module by \a name.*/
478 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
480 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
483 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
484 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
485 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
490 /*!Activate module by \a modName*/
491 bool LightApp_Application::activateModule( const QString& modName )
494 CAM_Module* prevMod = activeModule();
497 actName = prevMod->moduleName();
499 if ( actName == modName )
502 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
504 saveDockWindowsState();
506 bool status = CAM_Application::activateModule( modName );
508 updateModuleActions();
516 updateViewManagers();
518 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
519 if ( objectBrowser()->root() != activeStudy()->root() )
520 objectBrowser()->setRoot( activeStudy()->root() );
521 updateObjectBrowser( true );
524 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
529 /*!Gets selection manager.*/
530 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
535 /*!Creat action "New window" for certain type of viewer:*/
536 void LightApp_Application::createActionForViewer( const int id,
538 const QString& suffix,
541 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
542 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
543 QAction* a = createAction( id, // menu action id
550 false, // toggle flag
552 SLOT( onNewWindow() ) ); // slot
553 createMenu( a, parentId, -1 );
558 void LightApp_Application::createActions()
560 CAM_Application::createActions();
562 SUIT_Desktop* desk = desktop();
563 SUIT_ResourceMgr* resMgr = resourceMgr();
566 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
567 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
568 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
572 // - Help for modules
574 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
575 createMenu( separator(), helpMenu, -1, 10 );
576 QStringList aModuleList;
577 modules( aModuleList, false );
578 aModuleList.prepend( "GUI" );
579 aModuleList.prepend( "KERNEL" );
581 int id = LightApp_Application::UserID + FIRST_HELP_ID;
584 foreach( aModule, aModuleList ) {
585 if ( aModule.isEmpty() ) // module title (user name)
587 IMap <QString, QString> helpData; // list of help files for the module
588 QString helpSubMenu; // help submenu name (empty if not needed)
589 QString modName = moduleName( aModule ); // module name
590 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
591 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
592 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
594 if (resMgr->hasValue( modName, "documentation" ) )
595 docSection = resMgr->stringValue(modName, "documentation");
596 else if ( resMgr->hasSection( modName + "_documentation" ) )
597 docSection = modName + "_documentation";
598 if ( !docSection.isEmpty() ) {
599 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
600 QStringList listOfParam = resMgr->parameters( docSection );
601 foreach( QString paramName, listOfParam ) {
602 QString valueStr = resMgr->stringValue( docSection, paramName );
603 if ( !valueStr.isEmpty() ) {
604 QFileInfo fi( valueStr );
605 if ( fi.isRelative() && !modDir.isEmpty() )
606 valueStr = Qtx::addSlash( modDir ) + valueStr;
607 if ( QFile::exists( valueStr ) )
608 helpData.insert( paramName.arg( aModule ), valueStr );
613 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
614 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
615 QString indexFile = idxLst.join( QDir::separator() ); // index file
616 if ( QFile::exists( indexFile ) )
617 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
620 IMapConstIterator<QString, QString > fileIt;
621 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
622 QString helpFileName = fileIt.key();
623 // remove all '//' occurances
624 while ( helpFileName.contains( "//" ) )
625 helpFileName.replace( "//", "" );
626 // obtain submenus hierarchy if given
627 QStringList smenus = helpFileName.split( "/" );
628 helpFileName = smenus.last();
630 QAction* a = createAction( id, helpFileName,
631 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
632 helpFileName, helpFileName,
633 0, desk, false, this, SLOT( onHelpContentsModule() ) );
634 a->setData( fileIt.value() );
635 if ( !helpSubMenu.isEmpty() ) {
636 smenus.prepend( helpSubMenu );
638 // create sub-menus hierarchy
639 int menuId = helpMenu;
640 foreach ( QString subMenu, smenus ) {
641 menuId = createMenu( subMenu, menuId, -1, 0 );
643 createMenu( a, menuId, -1, 0 );
648 // - Additional help items
650 createMenu( separator(), helpMenu, -1, 5 );
652 QStringList addHelpItems = resMgr->parameters( "add_help" );
653 foreach ( QString addHelpItem, addHelpItems ) {
654 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
655 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
656 QAction* a = createAction( id, addHelpItem,
657 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
658 addHelpItem, addHelpItem,
659 0, desk, false, this, SLOT( onHelpContentsModule() ) );
660 a->setData( valueStr );
661 createMenu( a, helpMenu, -1, 5 );
667 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
668 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
669 registerAction( MRUId, mru );
671 // default icon for neutral point ('SALOME' module)
672 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
673 if ( defIcon.isNull() )
674 defIcon = QPixmap( imageEmptyIcon );
676 //! default icon for any module
677 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
678 if ( modIcon.isNull() )
679 modIcon = QPixmap( imageEmptyIcon );
682 modules( modList, false );
684 if ( modList.count() > 1 )
686 LightApp_ModuleAction* moduleAction =
687 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
689 QMap<QString, QString> iconMap;
690 moduleIconNames( iconMap );
692 const int iconSize = 20;
694 QStringList::Iterator it;
695 for ( it = modList.begin(); it != modList.end(); ++it )
697 if ( !isLibExists( *it ) )
700 QString modName = moduleName( *it );
702 if ( !isModuleAccessible( *it ) )
706 if ( iconMap.contains( *it ) )
707 iconName = iconMap[*it];
709 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
713 INFOS ( "\n****************************************************************" << std::endl
714 << "* Icon for " << (*it).toLatin1().constData()
715 << " not found. Using the default one." << std::endl
716 << "****************************************************************" << std::endl );
719 icon = Qtx::scaleIcon( icon, iconSize );
721 moduleAction->insertModule( *it, icon );
724 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
725 this, SLOT( onModuleActivation( const QString& ) ) );
726 registerAction( ModulesListId, moduleAction );
730 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
731 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
733 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
734 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
735 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
736 0, desk, false, this, SLOT( onCloseAllWindow() ) );
737 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
738 0, desk, false, this, SLOT( onGroupAllWindow() ) );
740 createMenu( CloseId, windowMenu, 0, -1 );
741 createMenu( CloseAllId, windowMenu, 0, -1 );
742 createMenu( GroupAllId, windowMenu, 0, -1 );
743 createMenu( separator(), windowMenu, -1, 0 );
745 #ifndef DISABLE_GLVIEWER
746 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
748 #ifndef DISABLE_PLOT2DVIEWER
749 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
751 #ifndef DISABLE_OCCVIEWER
752 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
754 #ifndef DISABLE_VTKVIEWER
755 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
757 #ifndef DISABLE_QXGRAPHVIEWER
758 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
760 #ifndef DISABLE_GRAPHICSVIEW
761 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
763 #ifndef DISABLE_PVVIEWER
764 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
766 #ifndef DISABLE_PYVIEWER
767 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
770 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
771 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
772 createMenu( RenameId, windowMenu, -1 );
774 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
775 createMenu( PreferencesId, fileMenu, 50, -1 );
776 createMenu( separator(), fileMenu, -1, 50, -1 );
778 createMenu( separator(), fileMenu, -1, 100, -1 );
779 createMenu( MRUId, fileMenu, 100, -1 );
780 createMenu( separator(), fileMenu, -1, 100, -1 );
782 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
783 0, desk, false, this, SLOT( onStylePreferences() ) );
785 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
786 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
789 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
790 createMenu( separator(), viewMenu, -1, 20, -1 );
791 createMenu( StyleId, viewMenu, 20, -1 );
792 createMenu( FullScreenId, viewMenu, 20, -1 );
794 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
795 QString( "SalomeModules" ) ); // name (language-independant)
796 createTool( ModulesListId, modTBar );
799 /*!On module activation action.*/
800 void LightApp_Application::onModuleActivation( const QString& modName )
802 // Force user to create/open a study before module activation
803 QMap<QString, QString> iconMap;
804 moduleIconNames( iconMap );
805 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
807 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
809 bool cancelled = false;
811 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
812 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
813 QMap<int, QString> opmap = activateModuleActions();
814 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
815 aDlg.addButton( it.value(), it.key() );
817 int res = aDlg.exec();
819 // some operation is selected
820 moduleActionSelected( res );
824 putInfo( tr("INF_CANCELLED") );
826 LightApp_ModuleAction* moduleAction =
827 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
829 moduleAction->setActiveModule( QString() );
835 activateModule( modName );
838 /*!Default module activation.*/
839 QString LightApp_Application::defaultModule() const
841 QStringList aModuleNames;
842 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
843 //! If there's the one and only module --> activate it automatically
844 //! TODO: Possible improvement - default module can be taken from preferences
845 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
848 /*!On new window slot.*/
849 void LightApp_Application::onNewWindow()
851 const QObject* obj = sender();
852 if ( !obj || !obj->inherits( "QAction" ) )
856 int id = actionId( (QAction*)obj );
859 #ifndef DISABLE_GLVIEWER
861 type = GLViewer_Viewer::Type();
864 #ifndef DISABLE_PLOT2DVIEWER
866 type = Plot2d_Viewer::Type();
869 #ifndef DISABLE_OCCVIEWER
871 type = OCCViewer_Viewer::Type();
874 #ifndef DISABLE_VTKVIEWER
876 type = VTKViewer_Viewer::Type();
879 #ifndef DISABLE_QXGRAPHVIEWER
880 case NewQxSceneViewId:
881 type = QxScene_Viewer::Type();
884 #ifndef DISABLE_GRAPHICSVIEW
885 case NewGraphicsViewId:
886 type = GraphicsView_Viewer::Type();
889 #ifndef DISABLE_PVVIEWER
891 type = PVViewer_Viewer::Type();
894 #ifndef DISABLE_PYVIEWER
896 type = PyViewer_Viewer::Type();
901 if ( !type.isEmpty() )
902 createViewManager( type );
906 SLOT: Creates new document
908 void LightApp_Application::onNewDoc()
910 #ifdef SINGLE_DESKTOP
911 if ( !checkExistingDoc() )
915 //asl: fix for 0020515
916 saveDockWindowsState();
918 CAM_Application::onNewDoc();
922 SLOT: Opens new document
924 void LightApp_Application::onOpenDoc()
926 SUIT_Study* study = activeStudy();
928 #ifdef SINGLE_DESKTOP
929 if ( !checkExistingDoc() )
933 CAM_Application::onOpenDoc();
935 if ( !study ) // new study will be create in THIS application
938 updateViewManagers();
943 SLOT: Opens new document.
944 \param aName - name of file
946 bool LightApp_Application::onOpenDoc( const QString& aName )
948 #ifdef SINGLE_DESKTOP
949 if ( !checkExistingDoc() )
953 saveDockWindowsState();
955 // We should take mru action first because this application instance can be deleted later.
956 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
958 bool res = CAM_Application::onOpenDoc( aName );
963 mru->insert( aName );
965 mru->remove( aName );
971 SLOT: Displays "About" message box
973 void LightApp_Application::onHelpAbout()
975 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
980 Private SLOT: Called on selection is changed
981 Dispatchs active module that selection is changed
983 void LightApp_Application::onSelection()
985 onSelectionChanged();
987 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
988 ((LightApp_Module*)activeModule())->selectionChanged();
993 \param study - SUIT_Study.
995 void LightApp_Application::setActiveStudy( SUIT_Study* study )
997 CAM_Application::setActiveStudy( study );
1001 Enables/Disables menu items and toolbar buttons. Rebuild menu
1003 void LightApp_Application::updateCommandsStatus()
1005 CAM_Application::updateCommandsStatus();
1008 #ifndef DISABLE_GLVIEWER
1009 a = action( NewGLViewId );
1011 a->setEnabled( activeStudy() );
1014 #ifndef DISABLE_PLOT2DVIEWER
1015 a = action( NewPlot2dId );
1017 a->setEnabled( activeStudy() );
1020 #ifndef DISABLE_OCCVIEWER
1021 a = action( NewOCCViewId );
1023 a->setEnabled( activeStudy() );
1026 #ifndef DISABLE_VTKVIEWER
1027 a = action( NewVTKViewId );
1029 a->setEnabled( activeStudy() );
1032 #ifndef DISABLE_QXGRAPHVIEWER
1033 a = action( NewQxSceneViewId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_GRAPHICSVIEW
1039 a = action( NewGraphicsViewId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_PVVIEWER
1045 a = action( NewPVViewId );
1047 a->setEnabled( activeStudy() );
1050 #ifndef DISABLE_PYVIEWER
1051 a = action( NewPyViewerId );
1053 a->setEnabled( activeStudy() );
1059 Runs system command in separate thread
1061 class RunBrowser: public QThread
1064 RunBrowser( LightApp_Application* app,
1065 const QString& theApp,
1066 const QString& theParams,
1067 const QString& theHelpFile,
1068 const QString& theContext = QString() )
1070 myParams( theParams ),
1071 myContext( theContext ),
1075 //For the external browser always specify 'file://' protocol,
1076 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1077 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1082 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1083 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1085 QProcess* proc = new QProcess();
1087 proc->start( aCommand );
1088 if ( !proc->waitForStarted() ) {
1089 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1090 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1091 ce2000->setData( msg );
1092 QApplication::postEvent( myLApp, ce2000 );
1103 LightApp_Application* myLApp;
1107 SLOT: Displays help contents for choosen module
1109 void LightApp_Application::onHelpContentsModule()
1111 const QAction* a = (QAction*) sender();
1112 QString helpFile = a->data().toString();
1113 if ( helpFile.isEmpty() ) return;
1115 SUIT_ResourceMgr* resMgr = resourceMgr();
1118 platform = "winapplication";
1120 platform = "application";
1122 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1124 QString quote("\"");
1125 anApp.prepend( quote );
1126 anApp.append( quote );
1128 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1129 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1131 if( useExtBrowser ) {
1132 if ( !anApp.isEmpty() ) {
1133 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1137 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1138 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1139 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1141 showPreferences( tr( "PREF_APP" ) );
1145 QStringList parameters;
1146 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1147 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1148 parameters << helpFile;
1149 QProcess::startDetached( "HelpBrowser", parameters );
1154 SLOT: Displays help contents for choosen dialog
1156 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1157 const QString& theFileName,
1158 const QString& theContext )
1160 QString fileName = theFileName;
1161 QString context = theContext;
1162 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1163 // context might be passed within theFileName argument
1164 QStringList comps = fileName.split("#");
1165 if ( comps.count() > 1 ) {
1166 context = comps.last();
1168 fileName = comps.join("#");
1172 QString homeDir = "";
1173 if ( !theComponentName.isEmpty() ) {
1174 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1175 if ( !dir.isEmpty() )
1176 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1177 Qtx::addSlash( "share" ) +
1178 Qtx::addSlash( "doc" ) +
1179 Qtx::addSlash( "salome" ) +
1180 Qtx::addSlash( "gui" ) +
1181 Qtx::addSlash( theComponentName ) );
1184 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1185 SUIT_ResourceMgr* resMgr = resourceMgr();
1188 platform = "winapplication";
1190 platform = "application";
1192 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1194 QString quote("\"");
1195 anApp.prepend( quote );
1196 anApp.append( quote );
1199 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1202 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1204 if ( !anApp.isEmpty() ) {
1205 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1209 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1210 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1211 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1212 showPreferences( tr( "PREF_APP" ) );
1216 QStringList parameters;
1217 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1218 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1219 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1220 QProcess::startDetached( "HelpBrowser", parameters );
1225 Sets enable or disable some actions on selection changed.
1227 void LightApp_Application::onSelectionChanged()
1229 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1230 bool canCopy = m ? m->canCopy() : false;
1231 bool canPaste = m ? m->canPaste() : false;
1233 action( EditCopyId )->setEnabled(canCopy);
1234 action( EditPasteId )->setEnabled(canPaste);
1238 SLOT: Performs some actions when dockable windows are triggered
1240 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1244 QWidget* LightApp_Application::dockWindow( const int id ) const
1247 if ( myWin.contains( id ) )
1252 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1257 QDockWidget* dock = 0;
1258 QWidget* w = wid->parentWidget();
1259 while ( w && !dock )
1261 dock = ::qobject_cast<QDockWidget*>( w );
1262 w = w->parentWidget();
1267 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1272 if ( wid != dockWindow( id ) )
1273 removeDockWindow( id );
1275 myWin.insert( id, wid );
1277 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1278 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1280 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1281 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1282 QString( "%1Dock" ).arg( wid->objectName() ) );
1283 dock->setWidget( wid );
1284 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1285 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1286 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1288 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1289 if ( !accel.isEmpty() )
1290 dock->toggleViewAction()->setShortcut( accel );
1295 void LightApp_Application::removeDockWindow( const int id )
1297 QWidget* wid = dockWindow( id );
1303 QDockWidget* dock = windowDock( wid );
1307 dock->setWidget( 0 );
1308 wid->setParent( 0 );
1309 wid->setVisible( false );
1313 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1315 QDockWidget* dock = windowDock( dockWindow( id ) );
1316 if ( dock && desktop() ) {
1317 desktop()->addDockWidget( place, dock );
1318 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1319 if ( a ) a->update();
1325 \param flag - key for window
1326 \param studyId - study id
1327 Flag used how identificator of window in windows list.
1329 QWidget* LightApp_Application::getWindow( const int flag, const int )
1331 QWidget* wid = dockWindow( flag );
1333 insertDockWindow( flag, wid = createWindow( flag ) );
1335 QMap<int, int> winMap;
1336 currentWindows( winMap );
1337 if ( winMap.contains( flag ) )
1338 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1344 \return Object Browser
1346 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1348 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1354 LogWindow* LightApp_Application::logWindow()
1356 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1359 #ifndef DISABLE_PYCONSOLE
1361 This returns the python console integrated to the GUI. Depending
1362 when you request the python console, this function could return
1363 null. Then the optional parameter force (default to false) can be
1364 set to force the creation of the python console if it is not done
1366 \param force - if true, the pythonConsole is created if it does not exist yet
1367 \return Python Console
1369 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1371 QWidget* wid = dockWindow( WT_PyConsole );
1372 if ( !wid && force==true) {
1373 wid = getWindow(WT_PyConsole);
1375 return qobject_cast<PyConsole_Console*>( wid );
1380 Updates object browser and maybe data models
1381 \param updateModels - if it is true, then data models are updated
1383 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1385 // update existing data models
1388 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1389 if ( objectBrowser() )
1390 objectBrowser()->setAutoUpdate( false );
1392 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1394 CAM_Study::ModelList dm_list;
1395 study->dataModels( dm_list );
1396 QListIterator<CAM_DataModel*> it( dm_list );
1397 while ( it.hasNext() ) {
1398 CAM_DataModel* camDM = it.next();
1399 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1400 ((LightApp_DataModel*)camDM)->update();
1404 if( objectBrowser() )
1405 objectBrowser()->setAutoUpdate( isAutoUpdate );
1408 if ( objectBrowser() ) {
1409 objectBrowser()->updateGeometry();
1410 objectBrowser()->updateTree( 0, false );
1417 LightApp_Preferences* LightApp_Application::preferences() const
1419 return preferences( false );
1423 \return first view manager of some type
1424 \param vmType - type of view manager
1425 \param create - is it necessary to create view manager in case, when there is no manager of such type
1427 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1429 SUIT_ViewManager* aVM = viewManager( vmType );
1430 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1432 if ( anActiveVM && anActiveVM->getType() == vmType )
1435 if ( aVM && create )
1437 if ( !aVM->getActiveView() )
1440 desktop()->setActiveWindow( aVM->getActiveView() );
1443 aVM = createViewManager( vmType );
1449 Creates view manager of some type
1450 \param vmType - type of view manager
1452 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1454 SUIT_ResourceMgr* resMgr = resourceMgr();
1456 SUIT_ViewManager* viewMgr = 0;
1457 #ifndef DISABLE_GLVIEWER
1458 if( vmType == GLViewer_Viewer::Type() )
1460 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1461 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1464 #ifndef DISABLE_PLOT2DVIEWER
1465 if( vmType == Plot2d_Viewer::Type() )
1467 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1469 #ifndef DISABLE_SALOMEOBJECT
1470 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1472 new LightApp_Plot2dSelector( v, mySelMgr );
1474 vm = new Plot2d_Viewer();
1476 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1477 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1480 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1481 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1485 #ifndef DISABLE_QXGRAPHVIEWER
1486 if( vmType == QxScene_Viewer::Type() )
1488 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1489 QxScene_Viewer* vm = new QxScene_Viewer();
1490 viewMgr->setViewModel( vm );
1491 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1494 #ifndef DISABLE_GRAPHICSVIEW
1495 if( vmType == GraphicsView_Viewer::Type() )
1497 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1498 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1501 #ifndef DISABLE_PVVIEWER
1502 if( vmType == PVViewer_Viewer::Type() )
1504 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1505 viewMgr->getActiveView()->setFocus();
1508 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1512 #ifndef DISABLE_PYVIEWER
1513 if( vmType == PyViewer_Viewer::Type() )
1515 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1518 #ifndef DISABLE_OCCVIEWER
1519 if( vmType == OCCViewer_Viewer::Type() )
1521 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1522 OCCViewer_Viewer* vm;
1523 #ifndef DISABLE_SALOMEOBJECT
1524 vm = new SOCC_Viewer();
1526 vm = new OCCViewer_Viewer( true );
1528 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1529 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1530 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1531 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1532 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1533 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1534 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1535 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1537 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1538 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1539 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1540 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1541 #if OCC_VERSION_LARGE > 0x06090000
1542 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1543 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1544 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1545 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1546 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1547 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1549 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1550 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1551 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1553 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1554 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1555 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1556 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1557 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1558 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1559 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1560 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1563 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1564 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1567 #ifndef DISABLE_VTKVIEWER
1568 #ifndef DISABLE_SALOMEOBJECT
1569 if ( vmType == SVTK_Viewer::Type() )
1571 if ( vmType == VTKViewer_Viewer::Type() )
1574 #ifndef DISABLE_SALOMEOBJECT
1575 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1576 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1579 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1580 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1581 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1582 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1583 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1584 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1585 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1586 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1587 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1588 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1589 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1590 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1591 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1592 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1593 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1594 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1595 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1596 new LightApp_VTKSelector( vm, mySelMgr );
1599 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1600 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1602 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1610 addViewManager( viewMgr );
1611 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1613 if ( viewWin && desktop() ) {
1614 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1615 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1621 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1623 SUIT_ResourceMgr* resMgr = resourceMgr();
1625 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1627 new LightApp_WgViewModel( vmType, w ) );
1628 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1630 addViewManager( vm );
1631 SUIT_ViewWindow* vw = vm->createViewWindow();
1632 if ( vw && desktop() ) {
1633 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1634 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1637 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1638 myUserWmTypes << vmType;
1643 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1645 SUIT_ResourceMgr* resMgr = resourceMgr();
1647 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1651 QString vmType = vm->getType();
1653 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1655 addViewManager( vm );
1656 SUIT_ViewWindow* vw = vm->createViewWindow();
1657 if ( vw && desktop() ) {
1658 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1659 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1662 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1663 myUserWmTypes << vmType;
1669 SLOT: Removes view manager from application
1671 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1673 removeViewManager( theVM );
1677 Protected SLOT: On study created.
1678 \param theStudy - just created study
1680 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1682 SUIT_DataObject* aRoot = 0;
1683 if ( theStudy && theStudy->root() )
1685 aRoot = theStudy->root();
1686 //aRoot->setName( tr( "DATA_MODELS" ) );
1689 getWindow( WT_ObjectBrowser );
1691 loadDockWindowsState();
1693 if ( objectBrowser() )
1694 objectBrowser()->setRoot( aRoot );
1696 activateModule( defaultModule() );
1698 if ( objectBrowser() )
1699 objectBrowser()->openLevels();
1701 #ifndef DISABLE_PYCONSOLE
1702 if( pythonConsole() )
1703 getPyInterp()->initStudy();
1708 Protected SLOT: On study opened.
1709 \param theStudy - just opened study
1711 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1713 SUIT_DataObject* aRoot = 0;
1714 if ( theStudy && theStudy->root() )
1716 aRoot = theStudy->root();
1720 getWindow( WT_ObjectBrowser );
1722 loadDockWindowsState();
1724 if ( objectBrowser() )
1725 objectBrowser()->setRoot( aRoot );
1727 activateModule( defaultModule() );
1729 if ( objectBrowser() )
1730 objectBrowser()->openLevels();
1732 #ifndef DISABLE_PYCONSOLE
1733 if( pythonConsole() )
1734 getPyInterp()->initStudy();
1740 /*!Protected SLOT. On study saved.*/
1741 void LightApp_Application::onStudySaved( SUIT_Study* s )
1743 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1745 mru->insert( s->studyName() );
1750 /*!Protected SLOT. On study closed.*/
1751 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1754 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1755 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1758 // stop auto-save timer
1759 myAutoSaveTimer->stop();
1761 // Bug 10396: clear selection
1762 mySelMgr->clearSelected();
1764 // Bug 12944: emit signal only after clear selection
1767 activateModule( "" );
1770 /*!Protected SLOT.On desktop activated.*/
1771 void LightApp_Application::onDesktopActivated()
1773 CAM_Application::onDesktopActivated();
1774 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1776 aModule->studyActivated();
1779 void LightApp_Application::studyOpened( SUIT_Study* s )
1781 CAM_Application::studyOpened( s );
1784 updateViewManagers();
1787 void LightApp_Application::studySaved( SUIT_Study* s )
1789 CAM_Application::studyOpened( s );
1790 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1791 if ( aResMgr && activeStudy() ) {
1792 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1793 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1797 void LightApp_Application::studyCreated( SUIT_Study* s )
1799 CAM_Application::studyCreated( s );
1802 updateViewManagers();
1805 /*!Gets file filter.
1806 *\retval QString "(*.bin)"
1808 QString LightApp_Application::getFileFilter() const
1816 Shows file dialog and return user selected file name
1818 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1819 const QString& caption, QWidget* parent )
1823 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1824 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1827 /*! Gets directory*/
1828 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1832 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1835 /*! Get open file names*/
1836 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1837 const QString& caption, QWidget* parent )
1841 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1842 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1845 /*!Private SLOT. Update object browser.*/
1846 void LightApp_Application::onRefresh()
1848 updateObjectBrowser( true );
1851 /*!Private SLOT. Update actions after rename object.*/
1852 void LightApp_Application::onRenamed()
1854 activeStudy()->Modified();
1858 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1859 // To prevent reversion the window should be either aligned during movement and resize.
1860 /*!Private SLOT. Update actions after rename object.*/
1861 /*void LightApp_Application::onMoved()
1863 OCCViewer_ViewManager* viewMgr = 0;
1864 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1866 OCCViewer_ViewWindow* view = 0;
1867 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1869 view->getViewPort()->repaintViewAfterMove();
1874 /*!Private SLOT. Support drag-and-drop operation.*/
1875 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1877 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1881 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1883 aModule->dropObjects( objects, parentObj, row, action );
1886 /*!Private SLOT. On preferences.*/
1887 void LightApp_Application::onPreferences()
1889 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1892 /*!Private SLOT. On preferences.*/
1893 void LightApp_Application::showPreferences( const QString& itemText )
1895 QApplication::setOverrideCursor( Qt::WaitCursor );
1897 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1899 QApplication::restoreOverrideCursor();
1904 preferences()->activateItem( itemText );
1906 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1909 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1910 resourceMgr()->save();
1913 shortcutMgr()->updateShortcuts();
1919 /*!Protected SLOT. On preferences changed.*/
1920 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1922 LightApp_Module* sMod = 0;
1923 CAM_Module* mod = module( modName );
1924 if ( mod && mod->inherits( "LightApp_Module" ) )
1925 sMod = (LightApp_Module*)mod;
1928 sMod->preferencesChanged( section, param );
1930 preferencesChanged( section, param );
1931 // emit signal to allow additional preferences changing processing
1932 emit preferenceChanged( modName, section, param );
1935 /*!Remove all windows from study.*/
1936 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1938 saveDockWindowsState();
1940 if ( SUIT_DataBrowser* ob = objectBrowser() )
1943 CAM_Application::beforeCloseDoc( s );
1946 /*!Update actions.*/
1947 void LightApp_Application::updateActions()
1949 updateCommandsStatus();
1955 SUIT_Study* LightApp_Application::createNewStudy()
1957 LightApp_Application::lastStudyId++;
1959 LightApp_Study* aStudy = new LightApp_Study( this );
1961 // Set up processing of major study-related events
1962 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1963 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1964 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1965 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1971 Creates window by flag.
1972 \param flag - identificator of window type
1974 QWidget* LightApp_Application::createWindow( const int flag )
1978 SUIT_ResourceMgr* resMgr = resourceMgr();
1980 if ( flag == WT_ObjectBrowser )
1982 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1983 ob->setObjectName( "objectBrowser" );
1984 ob->setSortMenuEnabled( true );
1985 ob->setAutoUpdate( true );
1986 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1987 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1989 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1990 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1991 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1993 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1994 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1995 treeModel->setSearcher( this );
1996 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1997 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1999 // Mantis issue 0020136: Drag&Drop in OB
2000 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2002 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2003 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2004 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2005 this, SLOT( onRenamed( ) ) );
2009 // temporary commented
2011 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2013 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2016 // Create OBSelector
2017 new LightApp_OBSelector( ob, mySelMgr );
2019 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2020 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2021 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2022 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2024 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2026 #ifndef DISABLE_PYCONSOLE
2027 else if ( flag == WT_PyConsole )
2029 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
2030 pyCons->setObjectName( "pythonConsole" );
2031 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2032 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
2033 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
2034 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2037 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2040 else if ( flag == WT_LogWindow )
2042 LogWindow* logWin = new LogWindow( desktop() );
2043 logWin->setObjectName( "logWindow" );
2044 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2045 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2047 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2053 \return default windows( Object Browser, Python Console )
2054 Adds to map \a aMap.
2056 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2058 #ifndef DISABLE_PYCONSOLE
2059 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2061 if ( activeStudy() ) {
2062 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2063 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2067 /*!Default view managers*/
2068 void LightApp_Application::defaultViewManagers( QStringList& ) const
2074 \return preferences.
2075 Create preferences, if \a crt = true.
2077 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2082 LightApp_Application* that = (LightApp_Application*)this;
2084 bool toCreate = !_prefs_ && crt;
2087 _prefs_ = new LightApp_Preferences( resourceMgr() );
2088 that->createPreferences( _prefs_ );
2091 that->myPrefs = _prefs_;
2093 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2094 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2095 connect( myPrefs, SIGNAL( resetToDefaults() ),
2096 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2101 SUIT_ResourceMgr* resMgr = resourceMgr();
2103 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2104 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2106 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2110 QStringList modNameList;
2111 app->modules( modNameList, false );
2113 QMap<QString, QString> iconMap;
2114 app->moduleIconNames( iconMap );
2116 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2118 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2121 int modId = _prefs_->addPreference( *it );
2122 if ( iconMap.contains( *it ) )
2123 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2127 app->modules( modList );
2128 QListIterator<CAM_Module*> itr( modList );
2129 while ( itr.hasNext() )
2131 LightApp_Module* mod = 0;
2133 CAM_Module* anItem = itr.next();
2134 if ( anItem->inherits( "LightApp_Module" ) )
2135 mod = (LightApp_Module*)anItem;
2137 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2139 _prefs_->addPreference( mod->moduleName() );
2140 mod->createPreferences();
2141 that->emptyPreferences( mod->moduleName() );
2145 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2151 Adds new module to application
2153 void LightApp_Application::moduleAdded( CAM_Module* mod )
2155 CAM_Application::moduleAdded( mod );
2157 LightApp_Module* lightMod = 0;
2158 if ( mod && mod->inherits( "LightApp_Module" ) )
2159 lightMod = (LightApp_Module*)mod;
2161 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2163 myPrefs->addPreference( mod->moduleName() );
2164 lightMod->createPreferences();
2165 emptyPreferences( mod->moduleName() );
2169 void LightApp_Application::emptyPreferences( const QString& modName )
2171 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2172 if ( !item || !item->isEmpty() )
2175 // printf( "---------------------> Modify for empty module.\n" );
2177 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2178 frm->setIcon( item->icon() );
2179 frm->setStretch( false );
2180 item->parentItem()->insertItem( frm, item );
2181 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2188 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2193 QStringList aValuesList;
2194 QList<QVariant> anIndicesList;
2198 // . Top-level "SALOME" preferences group <<start>>
2199 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2200 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2202 // .. "General" preferences tab <<start>>
2203 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2205 // ... "Language" group <<start>>
2206 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2207 pref->setItemProperty( "columns", 2, langGroup );
2208 // .... -> application language
2209 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2210 LightApp_Preferences::Selector, "language", "language" );
2211 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2212 QList<QVariant> aIcons;
2213 foreach ( QString aLang, aLangs ) {
2214 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2216 pref->setItemProperty( "strings", aLangs, curLang );
2217 pref->setItemProperty( "icons", aIcons, curLang );
2218 pref->setItemProperty( "restart", true, curLang );
2220 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2221 LightApp_Preferences::Bool, "language", "locale" );
2222 pref->setItemProperty( "restart", true, curLocale );
2223 // ... "Language" group <<end>>
2225 // ... "Look and feel" group <<start>>
2226 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2227 pref->setItemProperty( "columns", 2, lookGroup );
2228 // .... -> show splash-screen
2229 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2230 // .... -> opaque resize
2231 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2232 // .... -> drop-down buttons
2233 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2234 // ... "Look and feel" group <<end>>
2236 // ... "Study properties" group <<start>>
2237 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2238 pref->setItemProperty( "columns", 2, studyGroup );
2239 // .... -> multi-file save
2240 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2241 // .... -> ascii save mode
2242 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2243 // .... -> store windows geometry
2244 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2245 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2246 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2247 // .... -> auto-save
2248 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2249 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2250 pref->setItemProperty( "min", 0, autoSaveInterval );
2251 pref->setItemProperty( "max", 1440, autoSaveInterval );
2252 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2253 // ... "Study properties" group <<end>>
2255 // ... "Help browser" group <<start>>
2256 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2258 QString platform = "winapplication";
2260 QString platform = "application";
2262 // .... -> browser application
2263 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2264 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2265 // .... -> browser parameters
2266 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2267 // ... "Help browser" group <<end>>
2269 // ... "Python console properties" group <<start>>
2270 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2272 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2273 // .... -> show banner
2274 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2275 // ... "Python console properties" group <<end>>
2277 // ... "MRU" preferences group <<start>>
2278 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2279 pref->setItemProperty( "columns", 4, mruGroup );
2280 // number of MRU items
2281 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2282 "MRU", "visible_count" );
2283 pref->setItemProperty( "min", 0, mruVisCount );
2284 pref->setItemProperty( "max", 100, mruVisCount );
2286 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2287 "MRU", "link_type" );
2288 aValuesList.clear();
2289 anIndicesList.clear();
2290 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2291 anIndicesList << 0 << 1 << 2 ;
2292 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2293 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2294 // ... "MRU" preferences group <<end>>
2296 // ... "Full-screen" group <<start>>
2297 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2298 pref->setItemProperty( "columns", 2, fullScreenGroup );
2299 // .... -> automatic hiding toolbars
2300 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2301 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2302 // ... "Full-screen" group <<end>>
2304 // .. "General" preferences tab <<end>>
2306 // .. "3D viewer" group <<start>>
2307 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2308 // ... -> navigation mode
2309 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2310 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2311 aValuesList.clear();
2312 anIndicesList.clear();
2313 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2314 anIndicesList << 0 << 1;
2315 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2316 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2317 // ... -> zooming mode
2318 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2319 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2320 aValuesList.clear();
2321 anIndicesList.clear();
2322 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2323 anIndicesList << 0 << 1;
2324 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2325 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2326 // ... "Trihedron" group <<start>>
2327 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2328 pref->setItemProperty( "columns", 2, occTriGroup );
2329 // .... -> trihedron size
2330 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2331 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2332 pref->setItemProperty( "min", 1.0E-06, occTS );
2333 pref->setItemProperty( "max", 1000, occTS );
2334 // .... -> relative size of trihedron
2335 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2336 // .... -> show static trihedron
2337 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2338 // ... "Trihedron" group <<end>>
2339 // .. "3D viewer" group <<end>>
2343 #ifndef DISABLE_OCCVIEWER
2344 // .. "OCC viewer" group <<start>>
2345 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2347 // .... -> Projection mode
2348 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2349 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2350 aValuesList.clear();
2351 anIndicesList.clear();
2352 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2353 anIndicesList << 0 << 1;
2354 pref->setItemProperty( "strings", aValuesList, occProjMode );
2355 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2356 #if OCC_VERSION_LARGE > 0x06090000
2357 // .... -> Stereo group
2358 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2359 pref->setItemProperty( "columns", 2, stereoGroup );
2360 // .... -> Stereo type
2361 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2362 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2363 aValuesList.clear();
2364 anIndicesList.clear();
2366 OCCViewer_Viewer::stereoData( aValuesList, idList);
2367 foreach( int gid, idList ) anIndicesList << gid;
2368 pref->setItemProperty( "strings", aValuesList, stereoType );
2369 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2371 // .... -> Anaglyph filter
2372 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2373 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2374 aValuesList.clear();
2375 anIndicesList.clear();
2376 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2377 anIndicesList << 0 << 1 << 2;
2379 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2380 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2382 // .... -> Convergence distance type
2383 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2384 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2385 aValuesList.clear();
2386 anIndicesList.clear();
2387 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2388 anIndicesList << 0 << 1;
2389 pref->setItemProperty( "strings", aValuesList, occFocusType );
2390 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2392 // .... -> Stereographic focus value
2393 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2394 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2395 pref->setItemProperty( "precision", 3, focusValue );
2396 pref->setItemProperty( "min", 1.0E-03, focusValue );
2397 pref->setItemProperty( "max", 1.0E03, focusValue );
2398 pref->setItemProperty( "step", 0.05, focusValue );
2401 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2402 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2403 aValuesList.clear();
2404 anIndicesList.clear();
2405 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2406 anIndicesList << 0 << 1;
2407 pref->setItemProperty( "strings", aValuesList, occIODType );
2408 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2410 // .... -> Interocular distance (IOD) value
2411 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2412 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2413 pref->setItemProperty( "precision", 3, IODValue );
2414 pref->setItemProperty( "min", 1.0E-03, IODValue );
2415 pref->setItemProperty( "max", 1.0E03, IODValue );
2416 pref->setItemProperty( "step", 0.05, IODValue );
2418 // .... -> Reverse stereo
2419 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2420 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2421 // .... -> Enable V-Sync
2422 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2423 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2424 // .... -> Enable quad-buffer support
2425 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2426 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2428 // ... "Background" group <<start>>
2429 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2430 // pref->setItemProperty( "columns", 2, bgGroup );
2431 aValuesList.clear();
2432 anIndicesList.clear();
2435 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2436 foreach( int gid, idList ) anIndicesList << gid;
2437 // .... -> 3D viewer background
2438 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2439 LightApp_Preferences::Background, "OCCViewer", "background" );
2440 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2441 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2442 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2443 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2444 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2445 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2446 pref->setItemProperty( "custom_enabled", false, bgId );
2447 pref->setItemProperty( "image_formats", formats, bgId );
2448 // .... -> XZ viewer background
2449 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2450 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2451 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2452 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2453 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2454 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2455 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2456 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2457 pref->setItemProperty( "custom_enabled", false, bgId );
2458 pref->setItemProperty( "image_formats", formats, bgId );
2459 // .... -> YZ viewer background
2460 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2461 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2462 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2463 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2464 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2465 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2466 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2467 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2468 pref->setItemProperty( "custom_enabled", false, bgId );
2469 pref->setItemProperty( "image_formats", formats, bgId );
2470 // .... -> XY viewer background
2471 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2472 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2473 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2474 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2475 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2476 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2477 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2478 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2479 pref->setItemProperty( "custom_enabled", false, bgId );
2480 pref->setItemProperty( "image_formats", formats, bgId );
2481 // ... "Background" group <<end>>
2484 // ... "Selection" group <<start>>
2485 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2486 pref->setItemProperty( "columns", 2, occSelectionGroup );
2487 // .... -> enable preselection
2488 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2489 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2490 // .... -> enable selection
2491 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2492 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2493 // ... "Selection" group <<end>>
2495 // ... "Clipping" group <<start>>
2496 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2497 // .... -> clipping color
2498 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2499 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2500 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2501 pref->setItemProperty( "columns", 2, texturePref );
2502 // .... -> use default texture
2503 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2504 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2505 // .... -> clipping texture
2506 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2507 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2508 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2510 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2511 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2512 // .... -> scale factor
2513 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2514 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2515 pref->setItemProperty( "precision", 3, scaleFactor );
2516 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2517 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2518 pref->setItemProperty( "step", 0.1, scaleFactor );
2519 // ... "Clipping" group <<end>>
2521 // ... "Ray tracing" group <<start>>
2522 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2523 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2524 pref->setItemProperty( "columns", 2, rtPref );
2526 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2527 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2528 pref->setItemProperty( "min", 1, rt_depth );
2529 pref->setItemProperty( "max", 10, rt_depth );
2530 pref->setItemProperty( "step", 1, rt_depth );
2531 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2532 // .... -> specular reflections
2533 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2534 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2535 // .... -> adaptive anti-aliasing
2536 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2537 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2538 // .... -> shadows rendering
2539 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2540 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2541 // .... -> transparent shadow
2542 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2543 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2544 // ... "Ray tracing" group <<end>>
2546 // ... "Light source" group <<start>>
2547 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2548 // .... -> light color
2549 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2550 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2551 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2552 pref->setItemProperty( "columns", 3, directionPref );
2553 // .... -> light direction (dx component)
2554 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2555 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2556 pref->setItemProperty( "precision", 2, light_dx );
2557 pref->setItemProperty( "min", -1.0E03, light_dx );
2558 pref->setItemProperty( "max", 1.0E03, light_dx );
2559 pref->setItemProperty( "step", 0.1, light_dx );
2560 // .... -> light direction (dy component)
2561 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2562 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2563 pref->setItemProperty( "precision", 2, light_dy );
2564 pref->setItemProperty( "min", -1.0E03, light_dy );
2565 pref->setItemProperty( "max", 1.0E03, light_dy );
2566 pref->setItemProperty( "step", 0.1, light_dy );
2567 // .... -> light direction (dz component)
2568 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2569 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2570 pref->setItemProperty( "precision", 2, light_dz );
2571 pref->setItemProperty( "min", -1.0E03, light_dz );
2572 pref->setItemProperty( "max", 1.0E03, light_dz );
2573 pref->setItemProperty( "step", 0.1, light_dz );
2574 // ... "Light source" group <<end>>
2576 // ... -> empty frame (for layout) <<start>>
2577 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2578 pref->setItemProperty( "margin", 0, occGen );
2579 pref->setItemProperty( "columns", 2, occGen );
2580 // ... -> empty frame (for layout) <<end>>
2582 // .. "OCC viewer" group <<end>>
2585 #ifndef DISABLE_VTKVIEWER
2586 // .. "VTK viewer" group <<start>>
2587 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2589 // ... -> empty frame (for layout) <<start>>
2590 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2591 //pref->setItemProperty( "columns", 2, vtkGen );
2592 // .... -> projection mode
2593 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2594 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2595 aValuesList.clear();
2596 anIndicesList.clear();
2597 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2598 anIndicesList << 0 << 1;
2599 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2600 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2602 // .... -> Stereo group
2603 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2604 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2605 // .... -> Stereo type
2606 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2607 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2608 aValuesList.clear();
2609 anIndicesList.clear();
2611 SVTK_Viewer::stereoData( aValuesList, idList);
2612 foreach( int gid, idList ) anIndicesList << gid;
2613 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2614 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2615 // .... -> Anaglyph filter
2616 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2617 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2618 aValuesList.clear();
2619 anIndicesList.clear();
2620 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2621 anIndicesList << 0 << 1 << 2;
2623 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2624 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2626 // .... -> Enable quad-buffer support
2627 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2628 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2630 // .... -> background
2631 aValuesList.clear();
2632 anIndicesList.clear();
2635 #ifndef DISABLE_SALOMEOBJECT
2636 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2638 foreach( int gid, idList ) anIndicesList << gid;
2639 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2640 LightApp_Preferences::Background, "VTKViewer", "background" );
2641 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2642 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2643 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2644 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2645 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2646 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2647 pref->setItemProperty( "custom_enabled", false, bgId );
2648 #ifndef DISABLE_SALOMEOBJECT
2649 pref->setItemProperty( "image_formats", formats, bgId );
2651 // .... -> speed increment
2652 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2653 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2654 pref->setItemProperty( "min", 1, vtkSpeed );
2655 pref->setItemProperty( "max", 1000, vtkSpeed );
2656 // .... -> speed mode
2657 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2658 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2659 aValuesList.clear();
2660 anIndicesList.clear();
2661 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2662 anIndicesList << 0 << 1;
2663 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2664 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2666 // ... "Selection" group <<start>>
2667 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2668 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2669 // .... -> preselection
2670 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2671 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2672 aValuesList.clear();
2673 anIndicesList.clear();
2674 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2675 anIndicesList << 0 << 1 << 2;
2676 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2677 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2678 // .... -> enable selection
2679 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2680 // ... "Selection" group <<end>>
2682 // ... -> empty frame (for layout) <<end>>
2684 // ... space mouse sub-group <<start>>
2685 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2686 //pref->setItemProperty( "columns", 2, vtkSM );
2687 // .... -> decrease speed increment
2688 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2689 LightApp_Preferences::Selector, "VTKViewer",
2690 "spacemouse_func1_btn" );
2691 // .... -> increase speed increment
2692 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2693 LightApp_Preferences::Selector, "VTKViewer",
2694 "spacemouse_func2_btn" );
2695 // .... -> dominant / combined switch
2696 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2697 LightApp_Preferences::Selector, "VTKViewer",
2698 "spacemouse_func5_btn" ); //
2699 aValuesList.clear();
2700 anIndicesList.clear();
2701 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2702 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2703 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2704 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2705 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2706 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2707 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2708 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2709 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2710 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2711 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2712 // ... space mouse sub-group <<end>>
2714 // ... avi recording sub-group <<start>>
2715 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2716 pref->setItemProperty( "columns", 2, vtkRec );
2717 // .... -> recording mode
2718 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2719 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2720 aValuesList.clear();
2721 anIndicesList.clear();
2722 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2723 anIndicesList << 0 << 1;
2724 pref->setItemProperty( "strings", aValuesList, modePref );
2725 pref->setItemProperty( "indexes", anIndicesList, modePref );
2727 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2728 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2729 pref->setItemProperty( "min", 0.1, fpsPref );
2730 pref->setItemProperty( "max", 100, fpsPref );
2732 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2733 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2734 pref->setItemProperty( "min", 1, qualityPref );
2735 pref->setItemProperty( "max", 100, qualityPref );
2736 // .... -> progressive mode
2737 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2738 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2739 // ... avi recording sub-group <<end>>
2741 // ... group names sub-group <<start>>
2742 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2743 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2744 pref->setItemProperty( "columns", 2, vtkGN );
2745 // .... -> text color
2746 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2747 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2748 // .... -> transparency
2749 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2750 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2751 pref->setItemProperty( "min", 0.0, transPref );
2752 pref->setItemProperty( "max", 1.0, transPref );
2753 pref->setItemProperty( "step", 0.1, transPref );
2754 // ... -> group names sub-group <<end>>
2755 // .. "VTK viewer" group <<end>>
2758 // .. "Plot2d viewer" group <<start>>
2759 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2760 //pref->setItemProperty( "columns", 2, plot2dGroup );
2762 // ... -> background
2763 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2764 LightApp_Preferences::Color, "Plot2d", "Background" );
2765 // ... -> selection color
2766 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2767 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2769 // ... "Viewer" group <<start>>
2770 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2772 // .... -> curve type
2773 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2774 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2775 aValuesList.clear();
2776 anIndicesList.clear();
2777 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2778 anIndicesList << 0 << 1 << 2 ;
2779 pref->setItemProperty( "strings", aValuesList, curveType );
2780 pref->setItemProperty( "indexes", anIndicesList, curveType );
2781 // .... -> marker size
2782 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2783 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2784 pref->setItemProperty( "min", 0, markerSize );
2785 pref->setItemProperty( "max", 100, markerSize );
2786 // .... -> horizontal scaling mode
2787 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2788 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2789 aValuesList.clear();
2790 anIndicesList.clear();
2791 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2792 anIndicesList << 0 << 1 ;
2793 pref->setItemProperty( "strings", aValuesList, horScale );
2794 pref->setItemProperty( "indexes", anIndicesList, horScale );
2795 // .... -> vertical scaling mode
2796 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2797 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2798 pref->setItemProperty( "strings", aValuesList, verScale );
2799 pref->setItemProperty( "indexes", anIndicesList, verScale );
2801 // .... -> errors/deviation colot
2802 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2803 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2804 // .... -> deviation markers line size
2805 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2806 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2807 pref->setItemProperty( "min", 1, deviationMarkerLw );
2808 pref->setItemProperty( "max", 5, deviationMarkerLw );
2809 // .... -> deviation markers tick mark size
2810 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2811 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2812 pref->setItemProperty( "min", 1, deviationMarkerTs );
2813 pref->setItemProperty( "max", 5, deviationMarkerTs );
2814 // .... "Viewer" group <<end>>
2816 // ... "Legend" group <<start>>
2817 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2819 // .... -> show legend
2820 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2821 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2822 // .... -> legend position
2823 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2824 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2825 aValuesList.clear();
2826 anIndicesList.clear();
2827 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2828 anIndicesList << 0 << 1 << 2 << 3 ;
2829 pref->setItemProperty( "strings", aValuesList, legendPosition );
2830 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2831 // .... -> Symbol type
2832 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2833 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2834 aValuesList.clear();
2835 anIndicesList.clear();
2836 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2837 anIndicesList << 0 << 1 ;
2838 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2839 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2840 // .... -> legend font
2841 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2842 // ... -> font color
2843 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2844 // ... -> selection font color
2845 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2846 // ... "Legend" group <<end>>
2848 // .. "Plot2d viewer" group <<end>>
2850 // .. "PyViewer" preferences tab <<start>>
2851 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2852 // ... "Font settings" group <<start>>
2853 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2854 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2855 LightApp_Preferences::Font, "PyEditor", "Font" );
2856 // ... "Font settings" group <<end>>
2857 // ... "Display settings" group <<start>>
2858 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2859 pref->setItemProperty( "columns", 2, pyDispGroup );
2860 // ... -> current line highlight
2861 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2862 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2863 // ... -> text wrapping
2864 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2865 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2866 // ... -> center cursor on scroll
2867 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2868 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2869 // ... -> line numbers area
2870 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2871 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2872 // ... "Display settings" group <<end>>
2873 // ... "Tab settings" group <<start>>
2874 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2875 pref->setItemProperty( "columns", 2, pyTabGroup );
2876 // ... -> tab whitespaces
2877 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2878 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2880 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2881 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2882 // ... "Tab settings" group <<end>>
2883 // ... "Vertical edge settings" group <<start>>
2884 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2885 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2886 // ... -> vertical edge
2887 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2888 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2889 // ... -> number of columns
2890 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2891 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2892 // ... "Vertical edge settings" group <<end>>
2893 // .. "PyEditor" preferences tab <<end>>
2895 // .. "Directories" preferences tab <<start>>
2896 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2897 // ... --> quick directories list
2898 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2899 pref->addPreference( tr( "" ), dirGroup,
2900 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2901 // .. "Directories" preferences tab <<end>>
2903 // .. "Object browser" preferences tab <<start>>
2904 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2906 // ... "Search tool" group <<start>>
2907 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2908 // .... --> auto-hide
2909 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2910 "ObjectBrowser", "auto_hide_search_tool" );
2911 // ... "Search tool" group <<end>>
2913 // ... "Object browser settings" group <<start>>
2914 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2915 pref->setItemProperty( "columns", 2, objSetGroup );
2916 // .... -> auto size first column
2917 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2918 "ObjectBrowser", "auto_size_first" );
2919 // .... -> auto size other columns
2920 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2921 "ObjectBrowser", "auto_size" );
2922 // .... -> resize columns on expand item
2923 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2924 "ObjectBrowser", "resize_on_expand_item" );
2925 // .... -> browse to published object
2926 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2927 "ObjectBrowser", "browse_published_object" );
2928 aValuesList.clear();
2929 anIndicesList.clear();
2930 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2931 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2932 pref->setItemProperty( "strings", aValuesList, browsePublished );
2933 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2934 // ... "Object browser settings" group <<end>>
2935 // .. "Object browser" preferences tab <<end>>
2937 // .. "Shortcuts" preferences tab <<start>>
2938 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2939 // ... "Shortcuts settings" group <<start>>
2940 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2941 pref->addPreference( tr( "" ), shortcutGroup,
2942 LightApp_Preferences::ShortcutTree, "shortcuts" );
2943 // ... "Shortcuts settings" group <<end>>
2944 // .. "Shortcuts" preferences tab <<end>>
2945 // . Top-level "SALOME" preferences group <<end>>
2951 Changes appearance of application according to changed preferences
2952 \param sec - section
2953 \param param - name of changed parameter
2955 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2957 SUIT_ResourceMgr* resMgr = resourceMgr();
2961 if ( sec == "viewers" && param == "drop_down_buttons" )
2963 ViewManagerList vmlist = viewManagers();
2964 foreach( SUIT_ViewManager* vm, vmlist )
2966 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2967 foreach( SUIT_ViewWindow* vw, vwlist )
2968 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2972 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2974 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2975 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2976 QList<SUIT_ViewManager*> lst;
2977 #ifndef DISABLE_OCCVIEWER
2978 viewManagers( OCCViewer_Viewer::Type(), lst );
2979 QListIterator<SUIT_ViewManager*> itOCC( lst );
2980 while ( itOCC.hasNext() && sz >= 0 )
2982 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2983 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2986 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2987 occVM->setTrihedronSize( sz, relative );
2988 occVM->getAISContext()->UpdateCurrentViewer();
2991 #ifndef DISABLE_VTKVIEWER
2992 #ifndef DISABLE_SALOMEOBJECT
2993 viewManagers( SVTK_Viewer::Type(), lst );
2994 QListIterator<SUIT_ViewManager*> itVTK( lst );
2995 while ( itVTK.hasNext() && sz >= 0 )
2997 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2998 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3001 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3004 vtkVM->setTrihedronSize( sz, relative );
3012 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3014 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3015 QList<SUIT_ViewManager*> lst;
3016 #ifndef DISABLE_OCCVIEWER
3017 viewManagers( OCCViewer_Viewer::Type(), lst );
3018 QListIterator<SUIT_ViewManager*> itOCC( lst );
3019 while ( itOCC.hasNext() )
3021 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3022 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3025 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3028 occVM->setStaticTrihedronDisplayed( isVisible );
3032 #ifndef DISABLE_VTKVIEWER
3033 #ifndef DISABLE_SALOMEOBJECT
3034 viewManagers( SVTK_Viewer::Type(), lst );
3035 QListIterator<SUIT_ViewManager*> itVTK( lst );
3036 while ( itVTK.hasNext() )
3038 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3039 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3042 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3045 vtkVM->setStaticTrihedronVisible( isVisible );
3053 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3055 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3056 QList<SUIT_ViewManager*> lst;
3057 #ifndef DISABLE_OCCVIEWER
3058 viewManagers( OCCViewer_Viewer::Type(), lst );
3059 QListIterator<SUIT_ViewManager*> itOCC( lst );
3060 while ( itOCC.hasNext() )
3062 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3063 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3066 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3067 occVM->setInteractionStyle( mode );
3070 #ifndef DISABLE_VTKVIEWER
3071 #ifndef DISABLE_SALOMEOBJECT
3072 viewManagers( SVTK_Viewer::Type(), lst );
3073 QListIterator<SUIT_ViewManager*> itVTK( lst );
3074 while ( itVTK.hasNext() )
3076 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3077 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3080 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3081 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3087 #ifndef DISABLE_OCCVIEWER
3088 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3090 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3091 QList<SUIT_ViewManager*> lst;
3092 viewManagers( OCCViewer_Viewer::Type(), lst );
3093 QListIterator<SUIT_ViewManager*> it( lst );
3094 while ( it.hasNext() )
3096 SUIT_ViewModel* vm = it.next()->getViewModel();
3097 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3100 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3101 occVM->enablePreselection( isToEnablePreselection );
3106 #ifndef DISABLE_OCCVIEWER
3107 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3109 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3110 QList<SUIT_ViewManager*> lst;
3111 viewManagers( OCCViewer_Viewer::Type(), lst );
3112 QListIterator<SUIT_ViewManager*> it( lst );
3113 while ( it.hasNext() )
3115 SUIT_ViewModel* vm = it.next()->getViewModel();
3116 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3119 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3120 occVM->enableSelection( isToEnableSelection );
3125 #ifndef DISABLE_OCCVIEWER
3126 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3128 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3129 QList<SUIT_ViewManager*> lst;
3130 viewManagers( OCCViewer_Viewer::Type(), lst );
3131 QListIterator<SUIT_ViewManager*> it( lst );
3132 while ( it.hasNext() )
3134 SUIT_ViewModel* vm = it.next()->getViewModel();
3135 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3138 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3139 occVM->setClippingColor( aColor );
3144 #ifndef DISABLE_OCCVIEWER
3145 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3146 param == QString( "clipping_texture" ) ||
3147 param == QString( "clipping_modulate" ) ||
3148 param == QString( "clipping_scale" ) ) )
3150 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3151 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3152 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3153 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3154 QList<SUIT_ViewManager*> lst;
3155 viewManagers( OCCViewer_Viewer::Type(), lst );
3156 QListIterator<SUIT_ViewManager*> it( lst );
3157 while ( it.hasNext() )
3159 SUIT_ViewModel* vm = it.next()->getViewModel();
3160 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3163 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3164 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3169 #ifndef DISABLE_OCCVIEWER
3170 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3172 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3173 QList<SUIT_ViewManager*> lst;
3174 viewManagers( OCCViewer_Viewer::Type(), lst );
3175 QListIterator<SUIT_ViewManager*> it( lst );
3176 while ( it.hasNext() )
3178 SUIT_ViewModel* vm = it.next()->getViewModel();
3179 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3182 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3183 occVM->setProjectionType( mode );
3187 #if OCC_VERSION_LARGE > 0x06090000
3188 #ifndef DISABLE_OCCVIEWER
3189 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3191 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3192 QList<SUIT_ViewManager*> lst;
3193 viewManagers( OCCViewer_Viewer::Type(), lst );
3194 QListIterator<SUIT_ViewManager*> it( lst );
3195 while ( it.hasNext() )
3197 SUIT_ViewModel* vm = it.next()->getViewModel();
3198 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3201 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3202 occVM->setStereoType( mode );
3207 #ifndef DISABLE_OCCVIEWER
3208 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3210 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3211 QList<SUIT_ViewManager*> lst;
3212 viewManagers( OCCViewer_Viewer::Type(), lst );
3213 QListIterator<SUIT_ViewManager*> it( lst );
3214 while ( it.hasNext() )
3216 SUIT_ViewModel* vm = it.next()->getViewModel();
3217 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3220 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3221 occVM->setAnaglyphFilter( mode );
3226 #ifndef DISABLE_OCCVIEWER
3227 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3228 param == QString( "focus_value" ) ) )
3230 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3231 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3232 QList<SUIT_ViewManager*> lst;
3233 viewManagers( OCCViewer_Viewer::Type(), lst );
3234 QListIterator<SUIT_ViewManager*> it( lst );
3235 while ( it.hasNext() )
3237 SUIT_ViewModel* vm = it.next()->getViewModel();
3238 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3241 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3242 occVM->setStereographicFocus( aType, aValue );
3247 #ifndef DISABLE_OCCVIEWER
3248 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3249 param == QString( "iod_value" ) ) )
3251 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3252 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3253 QList<SUIT_ViewManager*> lst;
3254 viewManagers( OCCViewer_Viewer::Type(), lst );
3255 QListIterator<SUIT_ViewManager*> it( lst );
3256 while ( it.hasNext() )
3258 SUIT_ViewModel* vm = it.next()->getViewModel();
3259 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3262 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3263 occVM->setInterocularDistance( aType, aValue );
3268 #ifndef DISABLE_OCCVIEWER
3269 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3271 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3272 QList<SUIT_ViewManager*> lst;
3273 viewManagers( OCCViewer_Viewer::Type(), lst );
3274 QListIterator<SUIT_ViewManager*> it( lst );
3275 while ( it.hasNext() )
3277 SUIT_ViewModel* vm = it.next()->getViewModel();
3278 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3281 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3282 occVM->setReverseStereo( reverse );
3287 #ifndef DISABLE_OCCVIEWER
3288 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3290 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3291 QList<SUIT_ViewManager*> lst;
3292 viewManagers( OCCViewer_Viewer::Type(), lst );
3293 QListIterator<SUIT_ViewManager*> it( lst );
3294 while ( it.hasNext() )
3296 SUIT_ViewModel* vm = it.next()->getViewModel();
3297 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3300 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3301 occVM->setVSync( enable );
3306 #ifndef DISABLE_OCCVIEWER
3307 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3309 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3310 QList<SUIT_ViewManager*> lst;
3311 viewManagers( OCCViewer_Viewer::Type(), lst );
3312 QListIterator<SUIT_ViewManager*> it( lst );
3313 while ( it.hasNext() )
3315 SUIT_ViewModel* vm = it.next()->getViewModel();
3316 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3319 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3320 occVM->setQuadBufferSupport( enable );
3325 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3327 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3328 QList<SUIT_ViewManager*> lst;
3329 #ifndef DISABLE_OCCVIEWER
3330 viewManagers( OCCViewer_Viewer::Type(), lst );
3331 QListIterator<SUIT_ViewManager*> itOCC( lst );
3332 while ( itOCC.hasNext() )
3334 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3335 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3338 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3339 occVM->setZoomingStyle( mode );
3342 #ifndef DISABLE_VTKVIEWER
3343 #ifndef DISABLE_SALOMEOBJECT
3344 viewManagers( SVTK_Viewer::Type(), lst );
3345 QListIterator<SUIT_ViewManager*> itVTK( lst );
3346 while ( itVTK.hasNext() )
3348 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3349 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3352 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3353 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3359 #ifndef DISABLE_VTKVIEWER
3360 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3362 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3363 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3364 QList<SUIT_ViewManager*> lst;
3365 #ifndef DISABLE_SALOMEOBJECT
3366 viewManagers( SVTK_Viewer::Type(), lst );
3367 QListIterator<SUIT_ViewManager*> it( lst );
3368 while ( it.hasNext() )
3370 SUIT_ViewModel* vm = it.next()->getViewModel();
3371 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3374 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3375 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3381 #ifndef DISABLE_VTKVIEWER
3382 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3384 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3385 QList<SUIT_ViewManager*> lst;
3386 #ifndef DISABLE_SALOMEOBJECT
3387 viewManagers( SVTK_Viewer::Type(), lst );
3388 QListIterator<SUIT_ViewManager*> it( lst );
3389 while ( it.hasNext() )
3391 SUIT_ViewModel* vm = it.next()->getViewModel();
3392 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3395 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3396 if( vtkVM ) vtkVM->setProjectionMode( mode );
3402 #ifndef DISABLE_VTKVIEWER
3403 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3405 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3406 QList<SUIT_ViewManager*> lst;
3407 #ifndef DISABLE_SALOMEOBJECT
3408 viewManagers( SVTK_Viewer::Type(), lst );
3409 QListIterator<SUIT_ViewManager*> it( lst );
3410 while ( it.hasNext() )
3412 SUIT_ViewModel* vm = it.next()->getViewModel();
3413 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3416 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3417 if( vtkVM ) vtkVM->setStereoType( mode );
3423 #ifndef DISABLE_VTKVIEWER
3424 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3426 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3427 QList<SUIT_ViewManager*> lst;
3428 #ifndef DISABLE_SALOMEOBJECT
3429 viewManagers( SVTK_Viewer::Type(), lst );
3430 QListIterator<SUIT_ViewManager*> it( lst );
3431 while ( it.hasNext() )
3433 SUIT_ViewModel* vm = it.next()->getViewModel();
3434 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3437 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3438 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3444 #ifndef DISABLE_VTKVIEWER
3445 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3447 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3448 QList<SUIT_ViewManager*> lst;
3449 #ifndef DISABLE_SALOMEOBJECT
3450 viewManagers( SVTK_Viewer::Type(), lst );
3451 QListIterator<SUIT_ViewManager*> it( lst );
3452 while ( it.hasNext() )
3454 SUIT_ViewModel* vm = it.next()->getViewModel();
3455 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3458 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3459 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3465 #ifndef DISABLE_VTKVIEWER
3466 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3468 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3469 QList<SUIT_ViewManager*> lst;
3470 #ifndef DISABLE_SALOMEOBJECT
3471 viewManagers( SVTK_Viewer::Type(), lst );
3472 QListIterator<SUIT_ViewManager*> it( lst );
3473 while ( it.hasNext() )
3475 SUIT_ViewModel* vm = it.next()->getViewModel();
3476 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3479 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3480 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3486 #ifndef DISABLE_VTKVIEWER
3487 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3489 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3490 QList<SUIT_ViewManager*> lst;
3491 #ifndef DISABLE_SALOMEOBJECT
3492 viewManagers( SVTK_Viewer::Type(), lst );
3493 QListIterator<SUIT_ViewManager*> it( lst );
3494 while ( it.hasNext() )
3496 SUIT_ViewModel* vm = it.next()->getViewModel();
3497 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3500 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3501 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3507 #ifndef DISABLE_VTKVIEWER
3508 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3509 param == QString( "spacemouse_func2_btn" ) ||
3510 param == QString( "spacemouse_func5_btn" ) ) )
3512 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3513 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3514 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3515 QList<SUIT_ViewManager*> lst;
3516 #ifndef DISABLE_SALOMEOBJECT
3517 viewManagers( SVTK_Viewer::Type(), lst );
3518 QListIterator<SUIT_ViewManager*> it( lst );
3519 while ( it.hasNext() )
3521 SUIT_ViewModel* vm = it.next()->getViewModel();
3522 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3525 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3526 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3531 if( sec=="ObjectBrowser" )
3533 SUIT_DataBrowser* ob = objectBrowser();
3537 if ( param=="auto_size_first" )
3539 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3540 ob->setAutoSizeFirstColumn( autoSizeFirst );
3541 if ( autoSizeFirst )
3542 ob->adjustFirstColumnWidth();
3544 else if ( param=="auto_size" ) {
3545 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3546 ob->setAutoSizeColumns(autoSize);
3548 ob->adjustColumnsWidth();
3550 else if ( param=="resize_on_expand_item" ) {
3551 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3552 ob->setResizeOnExpandItem(resizeOnExpandItem);
3554 else if ( param == "auto_hide_search_tool" ) {
3555 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3561 if( param=="auto_save_interval" ) {
3562 myAutoSaveTimer->stop();
3563 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3564 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3568 #ifndef DISABLE_PYCONSOLE
3569 if( sec=="PyConsole" && pythonConsole() )
3571 if ( param=="font" ) {
3572 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3574 else if ( param=="show_banner" ) {
3575 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3582 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3584 if ( param == "visible_count" )
3585 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3586 else if ( param == "max_count" )
3587 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3588 else if ( param == "insert_mode" )
3589 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3590 else if ( param == "link_type" )
3591 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3592 else if ( param == "show_clear" )
3593 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3594 else if ( param == "show_mru" )
3595 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3598 if ( sec == "language" && param == "language" )
3600 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3601 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3603 if ( sec == "language" && param == "locale")
3605 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3606 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3608 if ( sec == "desktop" && param == "opaque_resize" ) {
3609 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3610 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3611 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3612 else dopts &= ~QMainWindow::AnimatedDocks;
3613 desktop()->setDockOptions( dopts );
3614 desktop()->setOpaqueResize( opaqueResize );
3615 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3616 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3619 #ifndef DISABLE_PLOT2DVIEWER
3620 QList<SUIT_ViewManager*> lst;
3621 viewManagers( Plot2d_Viewer::Type(), lst );
3622 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3623 while ( itPlot2d.hasNext() ) {
3624 SUIT_ViewManager* viewMgr = itPlot2d.next();
3625 SUIT_ViewModel* vm = viewMgr->getViewModel();
3626 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3629 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3631 viewMgr->setViewModel( vm );
3632 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3634 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3635 frame->SetPreference();
3640 #ifndef DISABLE_PYVIEWER
3641 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3642 param == QString( "LineNumberArea" ) ||
3643 param == QString( "TextWrapping" ) ||
3644 param == QString( "CenterCursorOnScroll" ) ||
3645 param == QString( "TabSpaceVisible" ) ||
3646 param == QString( "TabSize" ) ||
3647 param == QString( "VerticalEdge" ) ||
3648 param == QString( "NumberColumns" ) ||
3649 param == QString( "Font" ) ) )
3651 QList<SUIT_ViewManager*> lst;
3652 viewManagers( PyViewer_Viewer::Type(), lst );
3653 QListIterator<SUIT_ViewManager*> itPy( lst );
3654 while ( itPy.hasNext() )
3656 SUIT_ViewManager* viewMgr = itPy.next();
3657 SUIT_ViewModel* vm = viewMgr->getViewModel();
3658 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3661 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3663 viewMgr->setViewModel( vm );
3664 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3667 pyView->setPreferences();
3677 void LightApp_Application::loadPreferences()
3679 CAM_Application::loadPreferences();
3681 SUIT_ResourceMgr* aResMgr = resourceMgr();
3686 static bool mru_load = true;
3689 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3691 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3692 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3693 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3694 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3695 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3696 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3697 mru->loadLinks( aResMgr, "MRU" );
3703 QStringList mods = aResMgr->parameters( "windows_visibility" );
3704 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3707 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3708 myWinVis.insert( *itr, arr );
3712 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3713 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3714 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3715 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3716 else dopts &= ~QMainWindow::AnimatedDocks;
3717 desktop()->setDockOptions( dopts );
3718 desktop()->setOpaqueResize( opaqueResize );
3719 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3720 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3727 void LightApp_Application::savePreferences()
3729 CAM_Application::savePreferences();
3731 saveDockWindowsState();
3733 SUIT_ResourceMgr* aResMgr = resourceMgr();
3738 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3740 mru->saveLinks( aResMgr, "MRU" );
3742 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3743 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3746 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3748 #if GUI_DEVELOPMENT > 0
3749 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3751 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3758 Updates desktop title
3760 void LightApp_Application::updateDesktopTitle()
3762 QString aTitle = applicationName();
3763 QString aVer = applicationVersion();
3764 if ( !aVer.isEmpty() )
3765 aTitle += QString( " " ) + aVer;
3767 if ( activeStudy() ) {
3768 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3769 aTitle += QString( " - [%1]" ).arg( sName );
3772 desktop()->setWindowTitle( aTitle );
3776 \brief Get map of the operations which can be performed
3777 on the module activation.
3779 The method should return the map of the kind \c {<id>:<name>}
3780 where \c <id> is an integer identifier of the operation and
3781 \c <name> is a title for the button to be added to the
3782 dialog box. After user selects the required operation by the
3783 clicking the corresponding button in the dialog box, its identifier
3784 is passed to the moduleActionSelected() method to process
3787 \return map of the operations
3788 \sa moduleActionSelected()
3790 QMap<int, QString> LightApp_Application::activateModuleActions() const
3792 QMap<int, QString> opmap;
3793 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3794 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3799 \brief Called when the used selectes required operation chosen
3800 from "Activate module" dialog box.
3802 Performs the required operation according to the user choice.
3804 \param id operation identifier
3805 \sa activateModuleActions()
3807 void LightApp_Application::moduleActionSelected( const int id )
3822 Updates windows after close document
3824 void LightApp_Application::afterCloseDoc()
3828 CAM_Application::afterCloseDoc();
3832 Updates actions of active module
3834 void LightApp_Application::updateModuleActions()
3837 if ( activeModule() ) {
3838 modName = activeModule()->moduleName();
3839 if ( !isModuleAccessible( modName ) ) {
3840 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3841 foreach( SUIT_Application* app, apps ) {
3842 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3843 if ( lapp && lapp != this )
3844 lapp->removeModuleAction( modName );
3849 LightApp_ModuleAction* moduleAction =
3850 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3852 moduleAction->setActiveModule( modName );
3855 void LightApp_Application::removeModuleAction( const QString& modName )
3857 LightApp_ModuleAction* moduleAction =
3858 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3860 moduleAction->removeModule( modName );
3864 Gets current windows.
3865 \param winMap - output current windows map.
3867 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3870 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3871 ((LightApp_Module*)activeModule())->windows( winMap );
3873 defaultWindows( winMap );
3877 Gets current view managers.
3878 \param lst - output current view managers list.
3880 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3883 if ( !activeStudy() )
3886 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3887 ((LightApp_Module*)activeModule())->viewManagers( lst );
3889 defaultViewManagers( lst );
3895 void LightApp_Application::updateWindows()
3897 QMap<int, int> winMap;
3898 currentWindows( winMap );
3900 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3902 if ( !dockWindow( it.key() ) )
3903 getWindow( it.key() );
3906 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3908 QWidget* wid = it.value();
3909 if ( winMap.contains( it.key() ) )
3910 wid->setVisible( true );
3915 loadDockWindowsState();
3919 Updates view managers
3921 void LightApp_Application::updateViewManagers()
3924 currentViewManagers( lst );
3926 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3927 getViewManager( *it, true );
3931 Loads windows geometry
3933 void LightApp_Application::loadDockWindowsState()
3937 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3938 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3939 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3942 if ( activeModule() )
3943 modName = activeModule()->name();
3944 else if ( activeStudy() )
3945 modName = "nomodule";
3947 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3948 QByteArray aDefaultState;
3949 aResMgr->value( "windows_geometry", modName, aDefaultState );
3950 QByteArray aDefaultVisibility;
3951 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3952 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3953 aResMgr->setWorkingMode( prevMode );
3955 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3958 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3959 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3961 if ( version > Qtx::versionToId( "7.4.1" ) )
3962 aResMgr->value( "windows_geometry", modName , arr );
3964 arr = aDefaultState;
3965 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3966 desktop()->restoreState( aTargetArray );
3969 QStringList mainToolbarsNames;
3970 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3971 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3972 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3974 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3977 QMap<QString, bool> *tbMap = 0;
3978 QMap<QString, bool> *dwMap = 0;
3980 QMap<QString, bool> userTbMap, userDwMap;
3981 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3983 QMap<QString, bool> defaultTbMap, defaultDwMap;
3984 if(hasDefaultVisibility) {
3985 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3991 if(hasDefaultVisibility){
3992 tbMap = &defaultTbMap;
3999 if(hasDefaultVisibility){
4000 dwMap = &defaultDwMap;
4005 QList<QToolBar*> tbList = findToolBars();
4006 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4008 QToolBar* tb = *tit;
4009 if ( tbMap->contains( tb->objectName() ) ) {
4010 tb->setVisible( (*tbMap)[tb->objectName()] );
4016 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4017 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4019 QDockWidget* dw = *dit;
4021 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4022 if ( po != desktop() )
4025 if ( dwMap->contains( dw->objectName() ) )
4026 dw->setVisible( (*dwMap)[dw->objectName()] );
4034 Saves windows geometry
4036 void LightApp_Application::saveDockWindowsState()
4041 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4042 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4044 if( !storeWin && !storeTb )
4048 if ( activeModule() )
4049 modName = activeModule()->name();
4050 else if ( activeStudy() )
4051 modName = "nomodule";
4053 QString versionId = GUI_VERSION_STR;
4054 #if GUI_DEVELOPMENT > 0
4058 QByteArray arr = desktop()->saveState();
4059 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4060 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4063 if ( myWinVis.contains( modName ) )
4064 visArr = myWinVis[modName];
4066 QMap<QString, bool> tbMap, dwMap;
4067 dockWindowsState( visArr, tbMap, dwMap );
4069 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4070 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4073 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4076 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4077 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4079 QDockWidget* wid = *it;
4080 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4083 visArr = dockWindowsState( tbMap, dwMap );
4085 myWinVis.insert( modName, visArr );
4088 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4091 QDataStream stream( &visArr, QIODevice::WriteOnly );
4093 stream << (uchar)ToolBarMarker;
4094 stream << tb.size();
4095 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4097 stream << tit.key();
4098 stream << (uchar)( tit.value() ? 1 : 0 );
4101 stream << (uchar)DockWidgetMarker;
4102 stream << dw.size();
4103 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4105 stream << wit.key();
4106 stream << (uchar)( wit.value() ? 1 : 0 );
4112 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4117 QByteArray visArr = arr;
4118 QDataStream stream( &visArr, QIODevice::ReadOnly );
4122 if ( marker != ToolBarMarker )
4127 for ( int i = 0; i < lines; ++i )
4130 stream >> objectName;
4133 tb.insert( objectName, shown );
4137 if ( marker != DockWidgetMarker )
4141 for ( int j = 0; j < lines; ++j )
4144 stream >> objectName;
4147 dw.insert( objectName, shown );
4152 Adds icon names for modules
4154 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4158 SUIT_ResourceMgr* resMgr = resourceMgr();
4162 QStringList modList;
4163 modules( modList, false );
4165 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4167 QString modName = *it;
4168 QString modIntr = moduleName( modName );
4169 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4171 if ( modIcon.isEmpty() )
4174 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4175 modIcon += QString( ".png" );
4177 iconMap.insert( modName, modIcon );
4182 Inserts items in popup, which necessary for current application
4184 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4187 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4188 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4189 selMgr->setSelectionCacheEnabled( true );
4191 SUIT_DataBrowser* ob = objectBrowser();
4193 CAM_Application::contextMenuPopup( type, thePopup, title );
4195 if ( ob && type == ob->popupClientType() ) {
4196 thePopup->addSeparator();
4197 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4198 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4199 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4202 #ifndef DISABLE_SALOMEOBJECT
4203 if ( selMgr && ob ) {
4204 SALOME_ListIO selected;
4205 selMgr->selectedObjects( selected );
4206 if(selected.Extent() == 1){
4207 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4208 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4209 if(obj && obj->renameAllowed()) {
4210 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4211 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4212 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4213 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4215 QList<QAction*> acts = thePopup->actions();
4216 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4217 thePopup->insertAction(firstAction,a);
4223 selMgr->setSelectionCacheEnabled( cacheIsOn );
4229 void LightApp_Application::createEmptyStudy()
4231 CAM_Application::createEmptyStudy();
4233 if ( objectBrowser() )
4234 objectBrowser()->updateTree();
4236 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4237 if ( aResMgr && activeStudy() ) {
4238 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4239 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4244 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4246 CAM_Application::setDesktop( desk );
4249 connect( desk, SIGNAL( message( const QString& ) ),
4250 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4251 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4252 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4253 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4254 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4260 \param mod - module to be activated
4262 bool LightApp_Application::activateModule( CAM_Module* mod )
4264 bool res = CAM_Application::activateModule( mod );
4266 if ( objectBrowser() )
4267 objectBrowser()->updateTree();
4273 \return keyborad accelerators manager object
4275 SUIT_Accel* LightApp_Application::accel() const
4281 Removes dead widget container from map
4283 void LightApp_Application::onWCDestroyed( QObject* ob )
4285 // remove destroyed widget container from windows map
4286 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4288 if ( itr.value() != ob )
4291 int key = itr.key();
4292 myWin.remove( key );
4297 void LightApp_Application::onMRUActivated( const QString& name )
4299 SUIT_Session* s = SUIT_Session::session();
4300 if ( s && s->activeApplication() == this )
4304 void LightApp_Application::onStylePreferences()
4306 Style_PrefDlg dlg( desktop() );
4309 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4312 void LightApp_Application::onFullScreen(){
4313 if(myScreenHelper) {
4314 if(desktop()->isFullScreen())
4315 myScreenHelper->switchToNormalScreen();
4317 myScreenHelper->switchToFullScreen();
4322 Connects just added view manager
4324 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4326 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4327 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4328 CAM_Application::addViewManager( vm );
4332 Remove view manager from memory
4334 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4336 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4337 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4338 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4340 aStudy->removeObjectProperties( vm->getGlobalId() );
4342 CAM_Application::removeViewManager( vm );
4344 LightApp_SelectionMgr* selMgr = selectionMgr();
4345 QList<SUIT_Selector*> selectors;
4346 selMgr->selectors( selectors );
4347 foreach( SUIT_Selector* selector, selectors ) {
4348 if ( selector->owner() == vm->getViewModel() ) {
4353 // IPAL22894: Crash on closing OCC view
4359 Renames active window of desktop
4361 void LightApp_Application::onRenameWindow()
4366 QWidget* w = desktop()->activeWindow();
4371 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4372 if( ok && !name.isEmpty() )
4373 w->setWindowTitle( name );
4377 Closes active window of desktop
4379 void LightApp_Application::onCloseWindow()
4384 QWidget* w = desktop()->activeWindow();
4392 Closes all windows of desktop
4394 void LightApp_Application::onCloseAllWindow()
4396 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4400 QList<SUIT_ViewWindow*> wndList = desk->windows();
4401 SUIT_ViewWindow* wnd;
4402 foreach( wnd, wndList )
4410 Groups all windows of desktop
4412 void LightApp_Application::onGroupAllWindow()
4414 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4418 QtxWorkstack* wgStack = desk->workstack();
4424 \return if the library of module exists
4425 \param moduleTitle - title of module
4427 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4429 if( moduleTitle.isEmpty() )
4432 QString lib = moduleLibrary( moduleTitle );
4434 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4435 bool isPythonModule = lib.contains("SalomePyQtGUI");
4436 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4440 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4442 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4445 bool isLibFound = false;
4446 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4447 for( ; anIt!=aLast; anIt++ )
4449 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4460 INFOS( "\n****************************************************************" << std::endl
4461 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4462 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4463 << "****************************************************************" << std::endl );
4465 else if ( !isPythonModule && !isPythonLightModule)
4468 if ( isPythonModule || isPythonLightModule)
4470 QString pylib = moduleName( moduleTitle ) + QString(".py");
4471 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4473 // Check the python library
4475 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4477 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4479 bool isPyLib = false, isPyGuiLib = false;
4480 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4481 for( ; anIt!=aLast; anIt++ )
4483 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4484 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4486 if(!isPythonLightModule)
4487 if( !isPyLib && inf.exists() )
4490 if( !isPyGuiLib && infgui.exists() )
4493 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4497 printf( "\n****************************************************************\n" );
4498 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4500 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4502 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4503 printf( "****************************************************************\n" );
4510 \return default name for an active study
4512 void LightApp_Application::setDefaultStudyName( const QString& theName )
4514 QStringList anInfoList;
4515 modules( anInfoList, false );
4517 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4518 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4519 !aStudy->isSaved() )
4521 aStudy->setStudyName( theName );
4522 updateDesktopTitle();
4527 Custom event handler
4529 bool LightApp_Application::event( QEvent* e )
4531 if( e && e->type()==2000 )
4533 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4534 QString* d = ( QString* )ce->data();
4535 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4537 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4538 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4539 showPreferences( tr( "PREF_APP" ) );
4544 return CAM_Application::event( e );
4547 /*! Check data object */
4548 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4552 bool isSuitable = !theObj->entry().isEmpty() &&
4553 !theObj->componentDataType().isEmpty() &&
4554 !theObj->name().isEmpty();
4561 int LightApp_Application::openChoice( const QString& aName )
4563 int choice = CAM_Application::openChoice( aName );
4565 if ( choice == OpenExist ) // The document is already open.
4567 // Do you want to reload it?
4568 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4569 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4570 choice = OpenReload;
4576 bool LightApp_Application::openAction( const int choice, const QString& aName )
4583 STD_Application* app = 0;
4584 SUIT_Session* session = SUIT_Session::session();
4585 QList<SUIT_Application*> appList = session->applications();
4586 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4588 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4589 app = ::qobject_cast<STD_Application*>( *it );
4594 app->onCloseDoc( false );
4595 appList = session->applications();
4596 STD_Application* other = 0;
4597 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4598 other = ::qobject_cast<STD_Application*>( *it );
4601 res = other->onOpenDoc( aName );
4606 res = CAM_Application::openAction( choice, aName );
4613 QStringList LightApp_Application::viewManagersTypes() const
4615 QStringList aTypesList;
4616 aTypesList += myUserWmTypes;
4617 #ifndef DISABLE_GLVIEWER
4618 aTypesList<<GLViewer_Viewer::Type();
4620 #ifndef DISABLE_PLOT2DVIEWER
4621 aTypesList<<Plot2d_Viewer::Type();
4623 #ifndef DISABLE_QXGRAPHVIEWER
4624 aTypesList<<QxScene_Viewer::Type();
4626 #ifndef DISABLE_PVVIEWER
4627 aTypesList<<PVViewer_Viewer::Type();
4629 #ifndef DISABLE_PYVIEWER
4630 aTypesList<<PyViewer_Viewer::Type();
4632 #ifndef DISABLE_OCCVIEWER
4633 aTypesList<<OCCViewer_Viewer::Type();
4635 #ifndef DISABLE_VTKVIEWER
4636 #ifndef DISABLE_SALOMEOBJECT
4637 aTypesList<<SVTK_Viewer::Type();
4639 aTypesList<<VTKViewer_Viewer::Type();
4645 * Removes all view managers of known types
4646 * Other view managers are ignored
4648 void LightApp_Application::clearKnownViewManagers()
4650 QStringList aTypesList = viewManagersTypes();
4651 QList<SUIT_ViewManager*> aMgrList;
4652 viewManagers( aMgrList );
4653 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4654 if (aTypesList.contains(aMgr->getType()))
4655 removeViewManager(aMgr);
4660 Copy of current selection
4662 void LightApp_Application::onCopy()
4664 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4670 Paste of current data in clipboard
4672 void LightApp_Application::onPaste()
4674 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4680 Browse (i.e. set focus on) the published objects
4681 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4682 has been accepted by Ok (or Apply & Close) button
4683 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4684 (to select the first published object only)
4685 \return entry of the selected object
4687 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4688 const bool theIsApplyAndClose,
4689 const bool theIsOptimizedBrowsing )
4692 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4694 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4695 switch( aBrowsePolicy )
4699 case BP_ApplyAndClose:
4700 if( !theIsApplyAndClose )
4708 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4712 SUIT_DataBrowser* anOB = objectBrowser();
4716 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4720 QStringListIterator anIter( theEntryList );
4721 if( theIsOptimizedBrowsing )
4723 // go to the last entry
4725 if( anIter.hasPrevious() )
4729 // scroll to each entry in the list
4730 // (in optimized mode - to the last entry only)
4732 LightApp_DataObject* anObject = 0;
4733 while( anIter.hasNext() )
4735 anEntry = anIter.next();
4736 if( !anEntry.isEmpty() )
4738 anObject = aStudy->findObjectByEntry( anEntry );
4741 QModelIndex anIndex = aModel->index( anObject );
4742 anOB->treeView()->scrollTo( anIndex );
4747 // always select the last object
4748 if( anObject && !anEntry.isEmpty() )
4750 QList<SUIT_Selector*> aSelectorList;
4751 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4752 if( !aSelectorList.isEmpty() )
4754 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4756 bool anIsAutoBlock = aSelector->autoBlock();
4758 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4759 aSelector->setAutoBlock( false );
4761 SUIT_DataOwnerPtrList aList;
4762 #ifndef DISABLE_SALOMEOBJECT
4763 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4764 ( anObject->entry().toLatin1().constData(),
4765 anObject->componentDataType().toLatin1().constData(),
4766 anObject->name().toLatin1().constData() );
4767 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4769 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4772 aList.append( owner );
4773 selectionMgr()->setSelected( aList );
4776 // restore auto block flag
4777 aSelector->setAutoBlock( anIsAutoBlock );
4785 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4787 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4788 return study ? study->findObjectByEntry( id ) : 0;
4792 Checks that an object can be renamed.
4793 \param entry entry of the object
4794 \brief Return \c true if object can be renamed
4796 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4801 Rename object by entry.
4802 \param entry entry of the object
4803 \param name new name of the object
4804 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4806 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4810 /*! Process standard messages from desktop */
4811 void LightApp_Application::onDesktopMessage( const QString& message )
4813 const QString sectionSeparator = "/";
4815 if ( message.toLower() == "updateobjectbrowser" ||
4816 message.toLower() == "updateobjbrowser" ) {
4817 // update object browser
4818 updateObjectBrowser();
4820 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4821 QString vtype = message.split( sectionSeparator ).last();
4822 if ( !vtype.isEmpty() )
4823 getViewManager( vtype, true );
4826 QStringList data = message.split( sectionSeparator );
4827 if ( data.count() > 1 ) {
4828 QString msgType = data[0].trimmed();
4829 LightApp_Module* sMod = 0;
4830 CAM_Module* mod = module( msgType );
4832 mod = module( moduleTitle( msgType ) );
4833 if ( mod && mod->inherits( "LightApp_Module" ) )
4834 sMod = (LightApp_Module*)mod;
4836 if ( msgType.toLower() == "preferences" ) {
4837 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4838 // for example "preferences/Study/multi_file_dump/true"
4839 if ( data.count() > 3 ) {
4840 QString section = data[1].trimmed();
4841 QString param = data[2].trimmed();
4842 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4843 resourceMgr()->setValue( section, param, value );
4847 // received message for the module
4848 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4849 sMod->message( msg );
4857 Returns all top level toolbars.
4858 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4860 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4862 QList<QToolBar*> aResult;
4863 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4864 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4865 QToolBar* tb = *tit;
4866 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4867 if ( po != desktop() )
4869 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4876 Internal method to parse toolbars and dockable windows state.
4878 QByteArray LightApp_Application::processState(QByteArray& input,
4879 const bool processWin,
4880 const bool processTb,
4881 const bool isRestoring,
4882 QByteArray defaultState) {
4885 bool hasDefaultState = !defaultState.isEmpty();
4886 bool isDockWinWriten = false;
4888 //Write date from users settings
4890 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4891 int marker, version;
4893 tmpInputData >> marker;
4894 tmpInputData >> version;
4895 tmpInputData >> dockmarker;
4896 tmpInputData >> nbDocWin;
4898 if(processWin && processTb && !isRestoring) {
4900 } else if(!processWin && !processTb ) {
4902 aRes = defaultState;
4904 QDataStream aData(&aRes, QIODevice::WriteOnly);
4905 QList<QToolBar*> aToolBars = findToolBars();
4908 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4909 QToolBar* tb = *tit;
4910 aNames.append(tb->objectName());
4913 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4914 if(toolBarMarkerIndex < 0)
4916 QDataStream anInputData(&input, QIODevice::ReadOnly);
4918 int toolBarMarkerIndexDef;
4919 if(hasDefaultState) {
4920 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4921 if(toolBarMarkerIndexDef < 0)
4924 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4926 QDataStream* aTargetData = 0;
4927 int aTargetIndex = -1;
4929 QByteArray currentArr = desktop()->saveState();
4930 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4931 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4932 if(processWin && useInputData) {
4933 aTargetData = &anInputData;
4934 aTargetIndex = toolBarMarkerIndex;
4936 //Write date from default settings
4937 if(hasDefaultState) {
4938 aTargetData = &anInputDataDef;
4939 aTargetIndex = toolBarMarkerIndexDef;
4941 //If no default state, write current snapshot of the dockable windows
4943 aTargetData = &anInputDataCur;
4944 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4945 aTargetIndex = toolBarMarkerIndexCur;
4950 if(aTargetData && aTargetIndex >= 0 ) {
4951 aTargetData->device()->seek(0);
4952 while( aTargetData->device()->pos() < aTargetIndex ) {
4957 isDockWinWriten = true;
4964 aTargetData = &anInputData;
4965 aTargetIndex = toolBarMarkerIndex;
4967 if(hasDefaultState) {
4968 aTargetData = &anInputDataDef;
4969 aTargetIndex = toolBarMarkerIndexDef;
4973 if(aTargetData && aTargetIndex >= 0) {
4975 if(!isDockWinWriten ) {
4976 //Write version marker
4977 int marker, version;
4978 aTargetData->device()->seek(0);
4979 *aTargetData >> marker;
4980 *aTargetData >> version;
4983 aData << (uchar) QDockWidgetMarker;
4985 int shift = 4*sizeof(int) + sizeof(QSize);
4986 index = aTargetIndex - shift;
4988 index = aTargetIndex;
4991 aTargetData->device()->seek(index);
4992 while(!aTargetData->atEnd()) {
4997 } else { // Not treat toolbars
4998 aData << (uchar) QToolBarMarker;
4999 aData << (int) 0; //Nb toolbars = 0
5006 \brief Emits operationFinished signal.
5007 \param theModuleName the name of the module which perfomed the operation
5008 \param theOperationName the operation name
5009 \param theEntryList the list of the created objects entries
5011 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5012 const QString& theOperationName,
5013 const QStringList& theEntryList )
5015 emit operationFinished( theModuleName, theOperationName, theEntryList );
5019 Update visibility state of given objects
5021 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5022 SUIT_ViewModel* theViewModel )
5024 if ( !theViewModel || theList.isEmpty() ) return;
5026 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5027 if ( !aStudy ) return;
5029 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5031 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5032 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5034 if ( !obj || aStudy->isComponent( obj->entry() ) )
5037 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5038 if ( anObjModule ) {
5039 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5041 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5042 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5043 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5044 anObjState = Qtx::ShownState;
5046 anObjState = Qtx::HiddenState;
5048 aStudy->setVisibilityState( obj->entry(), anObjState );
5055 * Called when window activated
5057 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5059 SUIT_DataBrowser* anOB = objectBrowser();
5062 SUIT_DataObject* rootObj = anOB->root();
5066 DataObjectList listObj = rootObj->children( true );
5068 SUIT_ViewModel* vmod = 0;
5069 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5070 vmod = vman->getViewModel();
5071 updateVisibilityState( listObj, vmod );
5075 Called then view manager removed
5077 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5079 ViewManagerList lst;
5080 viewManagers( lst );
5081 if ( lst.count() == 1) { // in case if closed last view window
5082 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5084 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5089 Check existing document.
5091 bool LightApp_Application::checkExistingDoc()
5094 if( activeStudy() ) {
5095 int answer = SUIT_MessageBox::question( desktop(),
5096 tr( "APPCLOSE_CAPTION" ),
5097 tr( "STUDYCLOSE_DESCRIPTION" ),
5098 tr( "APPCLOSE_SAVE" ),
5099 tr( "APPCLOSE_CLOSE" ),
5100 tr( "APPCLOSE_CANCEL" ), 0 );
5102 if ( activeStudy()->isSaved() ) {
5105 } else if ( onSaveAsDoc() ) {
5106 if( !closeDoc( false ) ) {
5113 else if( answer == 1 ) {
5115 } else if( answer == 2 ) {
5122 #ifndef DISABLE_PYCONSOLE
5124 PyConsole_Interp* LightApp_Application::getPyInterp()
5126 static PyConsole_Interp* myInterp = 0;
5128 myInterp = createPyInterp();
5132 PyConsole_Interp* LightApp_Application::createPyInterp()
5134 return new LightApp_PyInterp();
5137 #endif // DISABLE_PYCONSOLE