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 );
526 /*!Gets selection manager.*/
527 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
532 /*!Creat action "New window" for certain type of viewer:*/
533 void LightApp_Application::createActionForViewer( const int id,
535 const QString& suffix,
538 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
539 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
540 QAction* a = createAction( id, // menu action id
547 false, // toggle flag
549 SLOT( onNewWindow() ) ); // slot
550 createMenu( a, parentId, -1 );
555 void LightApp_Application::createActions()
557 CAM_Application::createActions();
559 SUIT_Desktop* desk = desktop();
560 SUIT_ResourceMgr* resMgr = resourceMgr();
563 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
564 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
565 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
569 // - Help for modules
571 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
572 createMenu( separator(), helpMenu, -1, 10 );
573 QStringList aModuleList;
574 modules( aModuleList, false );
575 aModuleList.prepend( "GUI" );
576 aModuleList.prepend( "KERNEL" );
578 int id = LightApp_Application::UserID + FIRST_HELP_ID;
581 foreach( aModule, aModuleList ) {
582 if ( aModule.isEmpty() ) // module title (user name)
584 IMap <QString, QString> helpData; // list of help files for the module
585 QString helpSubMenu; // help submenu name (empty if not needed)
586 QString modName = moduleName( aModule ); // module name
587 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
588 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
589 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
591 if (resMgr->hasValue( modName, "documentation" ) )
592 docSection = resMgr->stringValue(modName, "documentation");
593 else if ( resMgr->hasSection( modName + "_documentation" ) )
594 docSection = modName + "_documentation";
595 if ( !docSection.isEmpty() ) {
596 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
597 QStringList listOfParam = resMgr->parameters( docSection );
598 foreach( QString paramName, listOfParam ) {
599 QString valueStr = resMgr->stringValue( docSection, paramName );
600 if ( !valueStr.isEmpty() ) {
601 QFileInfo fi( valueStr );
602 if ( fi.isRelative() && !modDir.isEmpty() )
603 valueStr = Qtx::addSlash( modDir ) + valueStr;
604 if ( QFile::exists( valueStr ) )
605 helpData.insert( paramName.arg( aModule ), valueStr );
610 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
611 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
612 QString indexFile = idxLst.join( QDir::separator() ); // index file
613 if ( QFile::exists( indexFile ) )
614 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
617 IMapConstIterator<QString, QString > fileIt;
618 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
619 QString helpFileName = fileIt.key();
620 // remove all '//' occurances
621 while ( helpFileName.contains( "//" ) )
622 helpFileName.replace( "//", "" );
623 // obtain submenus hierarchy if given
624 QStringList smenus = helpFileName.split( "/" );
625 helpFileName = smenus.last();
627 QAction* a = createAction( id, helpFileName,
628 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
629 helpFileName, helpFileName,
630 0, desk, false, this, SLOT( onHelpContentsModule() ) );
631 a->setData( fileIt.value() );
632 if ( !helpSubMenu.isEmpty() ) {
633 smenus.prepend( helpSubMenu );
635 // create sub-menus hierarchy
636 int menuId = helpMenu;
637 foreach ( QString subMenu, smenus ) {
638 menuId = createMenu( subMenu, menuId, -1, 0 );
640 createMenu( a, menuId, -1, 0 );
645 // - Additional help items
647 createMenu( separator(), helpMenu, -1, 5 );
649 QStringList addHelpItems = resMgr->parameters( "add_help" );
650 foreach ( QString addHelpItem, addHelpItems ) {
651 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
652 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
653 QAction* a = createAction( id, addHelpItem,
654 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
655 addHelpItem, addHelpItem,
656 0, desk, false, this, SLOT( onHelpContentsModule() ) );
657 a->setData( valueStr );
658 createMenu( a, helpMenu, -1, 5 );
664 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
665 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
666 registerAction( MRUId, mru );
668 // default icon for neutral point ('SALOME' module)
669 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
670 if ( defIcon.isNull() )
671 defIcon = QPixmap( imageEmptyIcon );
673 //! default icon for any module
674 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
675 if ( modIcon.isNull() )
676 modIcon = QPixmap( imageEmptyIcon );
679 modules( modList, false );
681 if ( modList.count() > 1 )
683 LightApp_ModuleAction* moduleAction =
684 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
686 QMap<QString, QString> iconMap;
687 moduleIconNames( iconMap );
689 const int iconSize = 20;
691 QStringList::Iterator it;
692 for ( it = modList.begin(); it != modList.end(); ++it )
694 if ( !isLibExists( *it ) )
697 QString modName = moduleName( *it );
699 if ( !isModuleAccessible( *it ) )
703 if ( iconMap.contains( *it ) )
704 iconName = iconMap[*it];
706 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
710 INFOS ( "\n****************************************************************" << std::endl
711 << "* Icon for " << (*it).toLatin1().constData()
712 << " not found. Using the default one." << std::endl
713 << "****************************************************************" << std::endl );
716 icon = Qtx::scaleIcon( icon, iconSize );
718 moduleAction->insertModule( *it, icon );
721 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
722 this, SLOT( onModuleActivation( const QString& ) ) );
723 registerAction( ModulesListId, moduleAction );
727 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
728 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
730 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
731 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
732 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
733 0, desk, false, this, SLOT( onCloseAllWindow() ) );
734 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
735 0, desk, false, this, SLOT( onGroupAllWindow() ) );
737 createMenu( CloseId, windowMenu, 0, -1 );
738 createMenu( CloseAllId, windowMenu, 0, -1 );
739 createMenu( GroupAllId, windowMenu, 0, -1 );
740 createMenu( separator(), windowMenu, -1, 0 );
742 #ifndef DISABLE_GLVIEWER
743 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
745 #ifndef DISABLE_PLOT2DVIEWER
746 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
748 #ifndef DISABLE_OCCVIEWER
749 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
751 #ifndef DISABLE_VTKVIEWER
752 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
754 #ifndef DISABLE_QXGRAPHVIEWER
755 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
757 #ifndef DISABLE_GRAPHICSVIEW
758 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
760 #ifndef DISABLE_PVVIEWER
761 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
763 #ifndef DISABLE_PYVIEWER
764 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
767 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
768 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
769 createMenu( RenameId, windowMenu, -1 );
771 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
772 createMenu( PreferencesId, fileMenu, 50, -1 );
773 createMenu( separator(), fileMenu, -1, 50, -1 );
775 createMenu( separator(), fileMenu, -1, 100, -1 );
776 createMenu( MRUId, fileMenu, 100, -1 );
777 createMenu( separator(), fileMenu, -1, 100, -1 );
779 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
780 0, desk, false, this, SLOT( onStylePreferences() ) );
782 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
783 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
786 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
787 createMenu( separator(), viewMenu, -1, 20, -1 );
788 createMenu( StyleId, viewMenu, 20, -1 );
789 createMenu( FullScreenId, viewMenu, 20, -1 );
791 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
792 QString( "SalomeModules" ) ); // name (language-independant)
793 createTool( ModulesListId, modTBar );
796 /*!On module activation action.*/
797 void LightApp_Application::onModuleActivation( const QString& modName )
799 // Force user to create/open a study before module activation
800 QMap<QString, QString> iconMap;
801 moduleIconNames( iconMap );
802 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
804 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
806 bool cancelled = false;
808 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
809 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
810 QMap<int, QString> opmap = activateModuleActions();
811 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
812 aDlg.addButton( it.value(), it.key() );
814 int res = aDlg.exec();
816 // some operation is selected
817 moduleActionSelected( res );
821 putInfo( tr("INF_CANCELLED") );
823 LightApp_ModuleAction* moduleAction =
824 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
826 moduleAction->setActiveModule( QString() );
832 activateModule( modName );
835 /*!Default module activation.*/
836 QString LightApp_Application::defaultModule() const
838 QStringList aModuleNames;
839 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
840 //! If there's the one and only module --> activate it automatically
841 //! TODO: Possible improvement - default module can be taken from preferences
842 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
845 /*!On new window slot.*/
846 void LightApp_Application::onNewWindow()
848 const QObject* obj = sender();
849 if ( !obj || !obj->inherits( "QAction" ) )
853 int id = actionId( (QAction*)obj );
856 #ifndef DISABLE_GLVIEWER
858 type = GLViewer_Viewer::Type();
861 #ifndef DISABLE_PLOT2DVIEWER
863 type = Plot2d_Viewer::Type();
866 #ifndef DISABLE_OCCVIEWER
868 type = OCCViewer_Viewer::Type();
871 #ifndef DISABLE_VTKVIEWER
873 type = VTKViewer_Viewer::Type();
876 #ifndef DISABLE_QXGRAPHVIEWER
877 case NewQxSceneViewId:
878 type = QxScene_Viewer::Type();
881 #ifndef DISABLE_GRAPHICSVIEW
882 case NewGraphicsViewId:
883 type = GraphicsView_Viewer::Type();
886 #ifndef DISABLE_PVVIEWER
888 type = PVViewer_Viewer::Type();
891 #ifndef DISABLE_PYVIEWER
893 type = PyViewer_Viewer::Type();
898 if ( !type.isEmpty() )
899 createViewManager( type );
903 SLOT: Creates new document
905 void LightApp_Application::onNewDoc()
907 #ifdef SINGLE_DESKTOP
908 if ( !checkExistingDoc() )
912 //asl: fix for 0020515
913 saveDockWindowsState();
915 CAM_Application::onNewDoc();
919 SLOT: Opens new document
921 void LightApp_Application::onOpenDoc()
923 SUIT_Study* study = activeStudy();
925 #ifdef SINGLE_DESKTOP
926 if ( !checkExistingDoc() )
930 CAM_Application::onOpenDoc();
932 if ( !study ) // new study will be create in THIS application
935 updateViewManagers();
940 SLOT: Opens new document.
941 \param aName - name of file
943 bool LightApp_Application::onOpenDoc( const QString& aName )
945 #ifdef SINGLE_DESKTOP
946 if ( !checkExistingDoc() )
950 saveDockWindowsState();
952 // We should take mru action first because this application instance can be deleted later.
953 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
955 bool res = CAM_Application::onOpenDoc( aName );
960 mru->insert( aName );
962 mru->remove( aName );
968 SLOT: Displays "About" message box
970 void LightApp_Application::onHelpAbout()
972 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
977 Private SLOT: Called on selection is changed
978 Dispatchs active module that selection is changed
980 void LightApp_Application::onSelection()
982 onSelectionChanged();
984 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
985 ((LightApp_Module*)activeModule())->selectionChanged();
990 \param study - SUIT_Study.
992 void LightApp_Application::setActiveStudy( SUIT_Study* study )
994 CAM_Application::setActiveStudy( study );
998 Enables/Disables menu items and toolbar buttons. Rebuild menu
1000 void LightApp_Application::updateCommandsStatus()
1002 CAM_Application::updateCommandsStatus();
1005 #ifndef DISABLE_GLVIEWER
1006 a = action( NewGLViewId );
1008 a->setEnabled( activeStudy() );
1011 #ifndef DISABLE_PLOT2DVIEWER
1012 a = action( NewPlot2dId );
1014 a->setEnabled( activeStudy() );
1017 #ifndef DISABLE_OCCVIEWER
1018 a = action( NewOCCViewId );
1020 a->setEnabled( activeStudy() );
1023 #ifndef DISABLE_VTKVIEWER
1024 a = action( NewVTKViewId );
1026 a->setEnabled( activeStudy() );
1029 #ifndef DISABLE_QXGRAPHVIEWER
1030 a = action( NewQxSceneViewId );
1032 a->setEnabled( activeStudy() );
1035 #ifndef DISABLE_GRAPHICSVIEW
1036 a = action( NewGraphicsViewId );
1038 a->setEnabled( activeStudy() );
1041 #ifndef DISABLE_PVVIEWER
1042 a = action( NewPVViewId );
1044 a->setEnabled( activeStudy() );
1047 #ifndef DISABLE_PYVIEWER
1048 a = action( NewPyViewerId );
1050 a->setEnabled( activeStudy() );
1056 Runs system command in separate thread
1058 class RunBrowser: public QThread
1061 RunBrowser( LightApp_Application* app,
1062 const QString& theApp,
1063 const QString& theParams,
1064 const QString& theHelpFile,
1065 const QString& theContext = QString() )
1067 myParams( theParams ),
1068 myContext( theContext ),
1072 //For the external browser always specify 'file://' protocol,
1073 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1074 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1079 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1080 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1082 QProcess* proc = new QProcess();
1084 proc->start( aCommand );
1085 if ( !proc->waitForStarted() ) {
1086 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1087 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1088 ce2000->setData( msg );
1089 QApplication::postEvent( myLApp, ce2000 );
1100 LightApp_Application* myLApp;
1104 SLOT: Displays help contents for choosen module
1106 void LightApp_Application::onHelpContentsModule()
1108 const QAction* a = (QAction*) sender();
1109 QString helpFile = a->data().toString();
1110 if ( helpFile.isEmpty() ) return;
1112 SUIT_ResourceMgr* resMgr = resourceMgr();
1115 platform = "winapplication";
1117 platform = "application";
1119 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1121 QString quote("\"");
1122 anApp.prepend( quote );
1123 anApp.append( quote );
1125 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1126 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1128 if( useExtBrowser ) {
1129 if ( !anApp.isEmpty() ) {
1130 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1134 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1135 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1136 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1138 showPreferences( tr( "PREF_APP" ) );
1142 QStringList parameters;
1143 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1144 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1145 parameters << helpFile;
1146 QProcess::startDetached( "HelpBrowser", parameters );
1151 SLOT: Displays help contents for choosen dialog
1153 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1154 const QString& theFileName,
1155 const QString& theContext )
1157 QString fileName = theFileName;
1158 QString context = theContext;
1159 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1160 // context might be passed within theFileName argument
1161 QStringList comps = fileName.split("#");
1162 if ( comps.count() > 1 ) {
1163 context = comps.last();
1165 fileName = comps.join("#");
1169 QString homeDir = "";
1170 if ( !theComponentName.isEmpty() ) {
1171 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1172 if ( !dir.isEmpty() )
1173 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1174 Qtx::addSlash( "share" ) +
1175 Qtx::addSlash( "doc" ) +
1176 Qtx::addSlash( "salome" ) +
1177 Qtx::addSlash( "gui" ) +
1178 Qtx::addSlash( theComponentName ) );
1181 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1182 SUIT_ResourceMgr* resMgr = resourceMgr();
1185 platform = "winapplication";
1187 platform = "application";
1189 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1191 QString quote("\"");
1192 anApp.prepend( quote );
1193 anApp.append( quote );
1196 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1199 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1201 if ( !anApp.isEmpty() ) {
1202 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1206 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1207 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1208 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1209 showPreferences( tr( "PREF_APP" ) );
1213 QStringList parameters;
1214 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1215 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1216 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1217 QProcess::startDetached( "HelpBrowser", parameters );
1222 Sets enable or disable some actions on selection changed.
1224 void LightApp_Application::onSelectionChanged()
1226 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1227 bool canCopy = m ? m->canCopy() : false;
1228 bool canPaste = m ? m->canPaste() : false;
1230 action( EditCopyId )->setEnabled(canCopy);
1231 action( EditPasteId )->setEnabled(canPaste);
1235 SLOT: Performs some actions when dockable windows are triggered
1237 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1241 QWidget* LightApp_Application::dockWindow( const int id ) const
1244 if ( myWin.contains( id ) )
1249 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1254 QDockWidget* dock = 0;
1255 QWidget* w = wid->parentWidget();
1256 while ( w && !dock )
1258 dock = ::qobject_cast<QDockWidget*>( w );
1259 w = w->parentWidget();
1264 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1269 if ( wid != dockWindow( id ) )
1270 removeDockWindow( id );
1272 myWin.insert( id, wid );
1274 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1275 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1277 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1278 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1279 QString( "%1Dock" ).arg( wid->objectName() ) );
1280 dock->setWidget( wid );
1281 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1282 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1283 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1285 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1286 if ( !accel.isEmpty() )
1287 dock->toggleViewAction()->setShortcut( accel );
1292 void LightApp_Application::removeDockWindow( const int id )
1294 QWidget* wid = dockWindow( id );
1300 QDockWidget* dock = windowDock( wid );
1304 dock->setWidget( 0 );
1305 wid->setParent( 0 );
1306 wid->setVisible( false );
1310 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1312 QDockWidget* dock = windowDock( dockWindow( id ) );
1313 if ( dock && desktop() ) {
1314 desktop()->addDockWidget( place, dock );
1315 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1316 if ( a ) a->update();
1322 \param flag - key for window
1323 \param studyId - study id
1324 Flag used how identificator of window in windows list.
1326 QWidget* LightApp_Application::getWindow( const int flag, const int )
1328 QWidget* wid = dockWindow( flag );
1330 insertDockWindow( flag, wid = createWindow( flag ) );
1332 QMap<int, int> winMap;
1333 currentWindows( winMap );
1334 if ( winMap.contains( flag ) )
1335 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1341 \return Object Browser
1343 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1345 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1351 LogWindow* LightApp_Application::logWindow()
1353 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1356 #ifndef DISABLE_PYCONSOLE
1358 This returns the python console integrated to the GUI. Depending
1359 when you request the python console, this function could return
1360 null. Then the optional parameter force (default to false) can be
1361 set to force the creation of the python console if it is not done
1363 \param force - if true, the pythonConsole is created if it does not exist yet
1364 \return Python Console
1366 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1368 QWidget* wid = dockWindow( WT_PyConsole );
1369 if ( !wid && force==true) {
1370 wid = getWindow(WT_PyConsole);
1372 return qobject_cast<PyConsole_Console*>( wid );
1377 Updates object browser and maybe data models
1378 \param updateModels - if it is true, then data models are updated
1380 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1382 // update existing data models
1385 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1386 if ( objectBrowser() )
1387 objectBrowser()->setAutoUpdate( false );
1389 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1391 CAM_Study::ModelList dm_list;
1392 study->dataModels( dm_list );
1393 QListIterator<CAM_DataModel*> it( dm_list );
1394 while ( it.hasNext() ) {
1395 CAM_DataModel* camDM = it.next();
1396 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1397 ((LightApp_DataModel*)camDM)->update();
1401 if( objectBrowser() )
1402 objectBrowser()->setAutoUpdate( isAutoUpdate );
1405 if ( objectBrowser() ) {
1406 objectBrowser()->updateGeometry();
1407 objectBrowser()->updateTree( 0, false );
1414 LightApp_Preferences* LightApp_Application::preferences() const
1416 return preferences( false );
1420 \return first view manager of some type
1421 \param vmType - type of view manager
1422 \param create - is it necessary to create view manager in case, when there is no manager of such type
1424 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1426 SUIT_ViewManager* aVM = viewManager( vmType );
1427 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1429 if ( anActiveVM && anActiveVM->getType() == vmType )
1432 if ( aVM && create )
1434 if ( !aVM->getActiveView() )
1437 desktop()->setActiveWindow( aVM->getActiveView() );
1440 aVM = createViewManager( vmType );
1446 Creates view manager of some type
1447 \param vmType - type of view manager
1449 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1451 SUIT_ResourceMgr* resMgr = resourceMgr();
1453 SUIT_ViewManager* viewMgr = 0;
1454 #ifndef DISABLE_GLVIEWER
1455 if( vmType == GLViewer_Viewer::Type() )
1457 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1458 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1461 #ifndef DISABLE_PLOT2DVIEWER
1462 if( vmType == Plot2d_Viewer::Type() )
1464 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1466 #ifndef DISABLE_SALOMEOBJECT
1467 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1469 new LightApp_Plot2dSelector( v, mySelMgr );
1471 vm = new Plot2d_Viewer();
1473 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1474 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1477 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1478 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1482 #ifndef DISABLE_QXGRAPHVIEWER
1483 if( vmType == QxScene_Viewer::Type() )
1485 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1486 QxScene_Viewer* vm = new QxScene_Viewer();
1487 viewMgr->setViewModel( vm );
1488 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1491 #ifndef DISABLE_GRAPHICSVIEW
1492 if( vmType == GraphicsView_Viewer::Type() )
1494 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1495 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1498 #ifndef DISABLE_PVVIEWER
1499 if( vmType == PVViewer_Viewer::Type() )
1501 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1502 viewMgr->getActiveView()->setFocus();
1505 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1509 #ifndef DISABLE_PYVIEWER
1510 if( vmType == PyViewer_Viewer::Type() )
1512 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1515 #ifndef DISABLE_OCCVIEWER
1516 if( vmType == OCCViewer_Viewer::Type() )
1518 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1519 OCCViewer_Viewer* vm;
1520 #ifndef DISABLE_SALOMEOBJECT
1521 vm = new SOCC_Viewer();
1523 vm = new OCCViewer_Viewer( true );
1525 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1526 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1527 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1528 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1529 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1530 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1531 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1532 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1534 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1535 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1536 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1537 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1538 #if OCC_VERSION_LARGE > 0x06090000
1539 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1540 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1541 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1542 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1543 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1544 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1546 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1547 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1548 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1550 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1551 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1552 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1553 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1554 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1555 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1556 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1557 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1560 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1561 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1564 #ifndef DISABLE_VTKVIEWER
1565 #ifndef DISABLE_SALOMEOBJECT
1566 if ( vmType == SVTK_Viewer::Type() )
1568 if ( vmType == VTKViewer_Viewer::Type() )
1571 #ifndef DISABLE_SALOMEOBJECT
1572 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1573 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1576 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1577 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1578 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1579 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1580 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1581 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1582 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1583 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1584 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1585 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1586 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1587 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1588 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1589 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1590 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1591 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1592 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1593 new LightApp_VTKSelector( vm, mySelMgr );
1596 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1597 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1599 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1607 addViewManager( viewMgr );
1608 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1610 if ( viewWin && desktop() ) {
1611 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1612 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1618 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1620 SUIT_ResourceMgr* resMgr = resourceMgr();
1622 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1624 new LightApp_WgViewModel( vmType, w ) );
1625 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1627 addViewManager( vm );
1628 SUIT_ViewWindow* vw = vm->createViewWindow();
1629 if ( vw && desktop() ) {
1630 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1631 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1634 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1635 myUserWmTypes << vmType;
1640 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1642 SUIT_ResourceMgr* resMgr = resourceMgr();
1644 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1648 QString vmType = vm->getType();
1650 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1652 addViewManager( vm );
1653 SUIT_ViewWindow* vw = vm->createViewWindow();
1654 if ( vw && desktop() ) {
1655 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1656 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1659 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1660 myUserWmTypes << vmType;
1666 SLOT: Removes view manager from application
1668 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1670 removeViewManager( theVM );
1674 Protected SLOT: On study created.
1675 \param theStudy - just created study
1677 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1679 SUIT_DataObject* aRoot = 0;
1680 if ( theStudy && theStudy->root() )
1682 aRoot = theStudy->root();
1683 //aRoot->setName( tr( "DATA_MODELS" ) );
1686 getWindow( WT_ObjectBrowser );
1688 loadDockWindowsState();
1690 if ( objectBrowser() )
1691 objectBrowser()->setRoot( aRoot );
1693 activateModule( defaultModule() );
1695 if ( objectBrowser() )
1696 objectBrowser()->openLevels();
1698 #ifndef DISABLE_PYCONSOLE
1699 if( pythonConsole() )
1700 getPyInterp()->initStudy();
1705 Protected SLOT: On study opened.
1706 \param theStudy - just opened study
1708 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1710 SUIT_DataObject* aRoot = 0;
1711 if ( theStudy && theStudy->root() )
1713 aRoot = theStudy->root();
1717 getWindow( WT_ObjectBrowser );
1719 loadDockWindowsState();
1721 if ( objectBrowser() )
1722 objectBrowser()->setRoot( aRoot );
1724 activateModule( defaultModule() );
1726 if ( objectBrowser() )
1727 objectBrowser()->openLevels();
1729 #ifndef DISABLE_PYCONSOLE
1730 if( pythonConsole() )
1731 getPyInterp()->initStudy();
1737 /*!Protected SLOT. On study saved.*/
1738 void LightApp_Application::onStudySaved( SUIT_Study* s )
1740 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1742 mru->insert( s->studyName() );
1747 /*!Protected SLOT. On study closed.*/
1748 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1751 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1752 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1755 // stop auto-save timer
1756 myAutoSaveTimer->stop();
1758 // Bug 10396: clear selection
1759 mySelMgr->clearSelected();
1761 // Bug 12944: emit signal only after clear selection
1764 activateModule( "" );
1767 /*!Protected SLOT.On desktop activated.*/
1768 void LightApp_Application::onDesktopActivated()
1770 CAM_Application::onDesktopActivated();
1771 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1773 aModule->studyActivated();
1776 void LightApp_Application::studyOpened( SUIT_Study* s )
1778 CAM_Application::studyOpened( s );
1781 updateViewManagers();
1784 void LightApp_Application::studySaved( SUIT_Study* s )
1786 CAM_Application::studyOpened( s );
1787 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1788 if ( aResMgr && activeStudy() ) {
1789 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1790 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1794 void LightApp_Application::studyCreated( SUIT_Study* s )
1796 CAM_Application::studyCreated( s );
1799 updateViewManagers();
1802 /*!Gets file filter.
1803 *\retval QString "(*.bin)"
1805 QString LightApp_Application::getFileFilter() const
1813 Shows file dialog and return user selected file name
1815 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1816 const QString& caption, QWidget* parent )
1820 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1821 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1824 /*! Gets directory*/
1825 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1829 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1832 /*! Get open file names*/
1833 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1834 const QString& caption, QWidget* parent )
1838 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1839 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1842 /*!Private SLOT. Update object browser.*/
1843 void LightApp_Application::onRefresh()
1845 updateObjectBrowser( true );
1848 /*!Private SLOT. Update actions after rename object.*/
1849 void LightApp_Application::onRenamed()
1851 activeStudy()->Modified();
1855 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1856 // To prevent reversion the window should be either aligned during movement and resize.
1857 /*!Private SLOT. Update actions after rename object.*/
1858 /*void LightApp_Application::onMoved()
1860 OCCViewer_ViewManager* viewMgr = 0;
1861 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1863 OCCViewer_ViewWindow* view = 0;
1864 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1866 view->getViewPort()->repaintViewAfterMove();
1871 /*!Private SLOT. Support drag-and-drop operation.*/
1872 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1874 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1878 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1880 aModule->dropObjects( objects, parentObj, row, action );
1883 /*!Private SLOT. On preferences.*/
1884 void LightApp_Application::onPreferences()
1886 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1889 /*!Private SLOT. On preferences.*/
1890 void LightApp_Application::showPreferences( const QString& itemText )
1892 QApplication::setOverrideCursor( Qt::WaitCursor );
1894 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1896 QApplication::restoreOverrideCursor();
1901 preferences()->activateItem( itemText );
1903 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1906 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1907 resourceMgr()->save();
1910 shortcutMgr()->updateShortcuts();
1916 /*!Protected SLOT. On preferences changed.*/
1917 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1919 LightApp_Module* sMod = 0;
1920 CAM_Module* mod = module( modName );
1921 if ( mod && mod->inherits( "LightApp_Module" ) )
1922 sMod = (LightApp_Module*)mod;
1925 sMod->preferencesChanged( section, param );
1927 preferencesChanged( section, param );
1928 // emit signal to allow additional preferences changing processing
1929 emit preferenceChanged( modName, section, param );
1932 /*!Remove all windows from study.*/
1933 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1935 saveDockWindowsState();
1937 if ( SUIT_DataBrowser* ob = objectBrowser() )
1940 CAM_Application::beforeCloseDoc( s );
1943 /*!Update actions.*/
1944 void LightApp_Application::updateActions()
1946 updateCommandsStatus();
1952 SUIT_Study* LightApp_Application::createNewStudy()
1954 LightApp_Application::lastStudyId++;
1956 LightApp_Study* aStudy = new LightApp_Study( this );
1958 // Set up processing of major study-related events
1959 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1960 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1961 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1962 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1968 Creates window by flag.
1969 \param flag - identificator of window type
1971 QWidget* LightApp_Application::createWindow( const int flag )
1975 SUIT_ResourceMgr* resMgr = resourceMgr();
1977 if ( flag == WT_ObjectBrowser )
1979 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1980 ob->setObjectName( "objectBrowser" );
1981 ob->setSortMenuEnabled( true );
1982 ob->setAutoUpdate( true );
1983 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1984 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1986 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1987 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1988 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1990 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1991 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1992 treeModel->setSearcher( this );
1993 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1994 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1996 // Mantis issue 0020136: Drag&Drop in OB
1997 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1999 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2000 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2001 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2002 this, SLOT( onRenamed( ) ) );
2006 // temporary commented
2008 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2010 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2013 // Create OBSelector
2014 new LightApp_OBSelector( ob, mySelMgr );
2016 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2017 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2018 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2019 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2021 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2023 #ifndef DISABLE_PYCONSOLE
2024 else if ( flag == WT_PyConsole )
2026 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
2027 pyCons->setObjectName( "pythonConsole" );
2028 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2029 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
2030 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
2031 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2034 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2037 else if ( flag == WT_LogWindow )
2039 LogWindow* logWin = new LogWindow( desktop() );
2040 logWin->setObjectName( "logWindow" );
2041 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2042 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2044 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2050 \return default windows( Object Browser, Python Console )
2051 Adds to map \a aMap.
2053 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2055 #ifndef DISABLE_PYCONSOLE
2056 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2058 if ( activeStudy() ) {
2059 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2060 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2064 /*!Default view managers*/
2065 void LightApp_Application::defaultViewManagers( QStringList& ) const
2071 \return preferences.
2072 Create preferences, if \a crt = true.
2074 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2079 LightApp_Application* that = (LightApp_Application*)this;
2081 bool toCreate = !_prefs_ && crt;
2084 _prefs_ = new LightApp_Preferences( resourceMgr() );
2085 that->createPreferences( _prefs_ );
2088 that->myPrefs = _prefs_;
2090 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2091 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2092 connect( myPrefs, SIGNAL( resetToDefaults() ),
2093 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2098 SUIT_ResourceMgr* resMgr = resourceMgr();
2100 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2101 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2103 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2107 QStringList modNameList;
2108 app->modules( modNameList, false );
2110 QMap<QString, QString> iconMap;
2111 app->moduleIconNames( iconMap );
2113 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2115 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2118 int modId = _prefs_->addPreference( *it );
2119 if ( iconMap.contains( *it ) )
2120 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2124 app->modules( modList );
2125 QListIterator<CAM_Module*> itr( modList );
2126 while ( itr.hasNext() )
2128 LightApp_Module* mod = 0;
2130 CAM_Module* anItem = itr.next();
2131 if ( anItem->inherits( "LightApp_Module" ) )
2132 mod = (LightApp_Module*)anItem;
2134 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2136 _prefs_->addPreference( mod->moduleName() );
2137 mod->createPreferences();
2138 that->emptyPreferences( mod->moduleName() );
2142 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2148 Adds new module to application
2150 void LightApp_Application::moduleAdded( CAM_Module* mod )
2152 CAM_Application::moduleAdded( mod );
2154 LightApp_Module* lightMod = 0;
2155 if ( mod && mod->inherits( "LightApp_Module" ) )
2156 lightMod = (LightApp_Module*)mod;
2158 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2160 myPrefs->addPreference( mod->moduleName() );
2161 lightMod->createPreferences();
2162 emptyPreferences( mod->moduleName() );
2166 void LightApp_Application::emptyPreferences( const QString& modName )
2168 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2169 if ( !item || !item->isEmpty() )
2172 // printf( "---------------------> Modify for empty module.\n" );
2174 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2175 frm->setIcon( item->icon() );
2176 frm->setStretch( false );
2177 item->parentItem()->insertItem( frm, item );
2178 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2185 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2190 QStringList aValuesList;
2191 QList<QVariant> anIndicesList;
2195 // . Top-level "SALOME" preferences group <<start>>
2196 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2197 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2199 // .. "General" preferences tab <<start>>
2200 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2202 // ... "Language" group <<start>>
2203 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2204 pref->setItemProperty( "columns", 2, langGroup );
2205 // .... -> application language
2206 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2207 LightApp_Preferences::Selector, "language", "language" );
2208 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2209 QList<QVariant> aIcons;
2210 foreach ( QString aLang, aLangs ) {
2211 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2213 pref->setItemProperty( "strings", aLangs, curLang );
2214 pref->setItemProperty( "icons", aIcons, curLang );
2215 pref->setItemProperty( "restart", true, curLang );
2217 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2218 LightApp_Preferences::Bool, "language", "locale" );
2219 pref->setItemProperty( "restart", true, curLocale );
2220 // ... "Language" group <<end>>
2222 // ... "Look and feel" group <<start>>
2223 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2224 pref->setItemProperty( "columns", 2, lookGroup );
2225 // .... -> show splash-screen
2226 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2227 // .... -> opaque resize
2228 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2229 // .... -> drop-down buttons
2230 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2231 // ... "Look and feel" group <<end>>
2233 // ... "Study properties" group <<start>>
2234 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2235 pref->setItemProperty( "columns", 2, studyGroup );
2236 // .... -> multi-file save
2237 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2238 // .... -> ascii save mode
2239 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2240 // .... -> store windows geometry
2241 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2242 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2243 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2244 // .... -> auto-save
2245 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2246 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2247 pref->setItemProperty( "min", 0, autoSaveInterval );
2248 pref->setItemProperty( "max", 1440, autoSaveInterval );
2249 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2250 // ... "Study properties" group <<end>>
2252 // ... "Help browser" group <<start>>
2253 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2255 QString platform = "winapplication";
2257 QString platform = "application";
2259 // .... -> browser application
2260 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2261 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2262 // .... -> browser parameters
2263 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2264 // ... "Help browser" group <<end>>
2266 // ... "Python console properties" group <<start>>
2267 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2269 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2270 // .... -> show banner
2271 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2272 // ... "Python console properties" group <<end>>
2274 // ... "MRU" preferences group <<start>>
2275 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2276 pref->setItemProperty( "columns", 4, mruGroup );
2277 // number of MRU items
2278 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2279 "MRU", "visible_count" );
2280 pref->setItemProperty( "min", 0, mruVisCount );
2281 pref->setItemProperty( "max", 100, mruVisCount );
2283 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2284 "MRU", "link_type" );
2285 aValuesList.clear();
2286 anIndicesList.clear();
2287 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2288 anIndicesList << 0 << 1 << 2 ;
2289 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2290 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2291 // ... "MRU" preferences group <<end>>
2293 // ... "Full-screen" group <<start>>
2294 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2295 pref->setItemProperty( "columns", 2, fullScreenGroup );
2296 // .... -> automatic hiding toolbars
2297 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2298 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2299 // ... "Full-screen" group <<end>>
2301 // .. "General" preferences tab <<end>>
2303 // .. "3D viewer" group <<start>>
2304 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2305 // ... -> navigation mode
2306 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2307 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2308 aValuesList.clear();
2309 anIndicesList.clear();
2310 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2311 anIndicesList << 0 << 1;
2312 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2313 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2314 // ... -> zooming mode
2315 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2316 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2317 aValuesList.clear();
2318 anIndicesList.clear();
2319 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2320 anIndicesList << 0 << 1;
2321 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2322 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2323 // ... "Trihedron" group <<start>>
2324 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2325 pref->setItemProperty( "columns", 2, occTriGroup );
2326 // .... -> trihedron size
2327 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2328 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2329 pref->setItemProperty( "min", 1.0E-06, occTS );
2330 pref->setItemProperty( "max", 1000, occTS );
2331 // .... -> relative size of trihedron
2332 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2333 // .... -> show static trihedron
2334 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2335 // ... "Trihedron" group <<end>>
2336 // .. "3D viewer" group <<end>>
2340 #ifndef DISABLE_OCCVIEWER
2341 // .. "OCC viewer" group <<start>>
2342 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2344 // .... -> Projection mode
2345 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2346 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2347 aValuesList.clear();
2348 anIndicesList.clear();
2349 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2350 anIndicesList << 0 << 1;
2351 pref->setItemProperty( "strings", aValuesList, occProjMode );
2352 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2353 #if OCC_VERSION_LARGE > 0x06090000
2354 // .... -> Stereo group
2355 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2356 pref->setItemProperty( "columns", 2, stereoGroup );
2357 // .... -> Stereo type
2358 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2359 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2360 aValuesList.clear();
2361 anIndicesList.clear();
2363 OCCViewer_Viewer::stereoData( aValuesList, idList);
2364 foreach( int gid, idList ) anIndicesList << gid;
2365 pref->setItemProperty( "strings", aValuesList, stereoType );
2366 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2368 // .... -> Anaglyph filter
2369 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2370 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2371 aValuesList.clear();
2372 anIndicesList.clear();
2373 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2374 anIndicesList << 0 << 1 << 2;
2376 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2377 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2379 // .... -> Convergence distance type
2380 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2381 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2382 aValuesList.clear();
2383 anIndicesList.clear();
2384 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2385 anIndicesList << 0 << 1;
2386 pref->setItemProperty( "strings", aValuesList, occFocusType );
2387 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2389 // .... -> Stereographic focus value
2390 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2391 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2392 pref->setItemProperty( "precision", 3, focusValue );
2393 pref->setItemProperty( "min", 1.0E-03, focusValue );
2394 pref->setItemProperty( "max", 1.0E03, focusValue );
2395 pref->setItemProperty( "step", 0.05, focusValue );
2398 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2399 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2400 aValuesList.clear();
2401 anIndicesList.clear();
2402 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2403 anIndicesList << 0 << 1;
2404 pref->setItemProperty( "strings", aValuesList, occIODType );
2405 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2407 // .... -> Interocular distance (IOD) value
2408 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2409 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2410 pref->setItemProperty( "precision", 3, IODValue );
2411 pref->setItemProperty( "min", 1.0E-03, IODValue );
2412 pref->setItemProperty( "max", 1.0E03, IODValue );
2413 pref->setItemProperty( "step", 0.05, IODValue );
2415 // .... -> Reverse stereo
2416 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2417 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2418 // .... -> Enable V-Sync
2419 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2420 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2421 // .... -> Enable quad-buffer support
2422 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2423 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2425 // ... "Background" group <<start>>
2426 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2427 // pref->setItemProperty( "columns", 2, bgGroup );
2428 aValuesList.clear();
2429 anIndicesList.clear();
2432 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2433 foreach( int gid, idList ) anIndicesList << gid;
2434 // .... -> 3D viewer background
2435 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2436 LightApp_Preferences::Background, "OCCViewer", "background" );
2437 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2438 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2439 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2440 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2441 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2442 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2443 pref->setItemProperty( "custom_enabled", false, bgId );
2444 pref->setItemProperty( "image_formats", formats, bgId );
2445 // .... -> XZ viewer background
2446 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2447 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2448 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2449 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2450 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2451 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2452 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2453 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2454 pref->setItemProperty( "custom_enabled", false, bgId );
2455 pref->setItemProperty( "image_formats", formats, bgId );
2456 // .... -> YZ viewer background
2457 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2458 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2459 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2460 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2461 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2462 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2463 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2464 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2465 pref->setItemProperty( "custom_enabled", false, bgId );
2466 pref->setItemProperty( "image_formats", formats, bgId );
2467 // .... -> XY viewer background
2468 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2469 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2470 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2471 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2472 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2473 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2474 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2475 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2476 pref->setItemProperty( "custom_enabled", false, bgId );
2477 pref->setItemProperty( "image_formats", formats, bgId );
2478 // ... "Background" group <<end>>
2481 // ... "Selection" group <<start>>
2482 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2483 pref->setItemProperty( "columns", 2, occSelectionGroup );
2484 // .... -> enable preselection
2485 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2486 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2487 // .... -> enable selection
2488 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2489 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2490 // ... "Selection" group <<end>>
2492 // ... "Clipping" group <<start>>
2493 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2494 // .... -> clipping color
2495 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2496 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2497 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2498 pref->setItemProperty( "columns", 2, texturePref );
2499 // .... -> use default texture
2500 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2501 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2502 // .... -> clipping texture
2503 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2504 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2505 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2507 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2508 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2509 // .... -> scale factor
2510 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2511 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2512 pref->setItemProperty( "precision", 3, scaleFactor );
2513 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2514 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2515 pref->setItemProperty( "step", 0.1, scaleFactor );
2516 // ... "Clipping" group <<end>>
2518 // ... "Ray tracing" group <<start>>
2519 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2520 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2521 pref->setItemProperty( "columns", 2, rtPref );
2523 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2524 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2525 pref->setItemProperty( "min", 1, rt_depth );
2526 pref->setItemProperty( "max", 10, rt_depth );
2527 pref->setItemProperty( "step", 1, rt_depth );
2528 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2529 // .... -> specular reflections
2530 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2531 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2532 // .... -> adaptive anti-aliasing
2533 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2534 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2535 // .... -> shadows rendering
2536 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2537 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2538 // .... -> transparent shadow
2539 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2540 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2541 // ... "Ray tracing" group <<end>>
2543 // ... "Light source" group <<start>>
2544 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2545 // .... -> light color
2546 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2547 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2548 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2549 pref->setItemProperty( "columns", 3, directionPref );
2550 // .... -> light direction (dx component)
2551 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2552 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2553 pref->setItemProperty( "precision", 2, light_dx );
2554 pref->setItemProperty( "min", -1.0E03, light_dx );
2555 pref->setItemProperty( "max", 1.0E03, light_dx );
2556 pref->setItemProperty( "step", 0.1, light_dx );
2557 // .... -> light direction (dy component)
2558 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2559 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2560 pref->setItemProperty( "precision", 2, light_dy );
2561 pref->setItemProperty( "min", -1.0E03, light_dy );
2562 pref->setItemProperty( "max", 1.0E03, light_dy );
2563 pref->setItemProperty( "step", 0.1, light_dy );
2564 // .... -> light direction (dz component)
2565 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2566 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2567 pref->setItemProperty( "precision", 2, light_dz );
2568 pref->setItemProperty( "min", -1.0E03, light_dz );
2569 pref->setItemProperty( "max", 1.0E03, light_dz );
2570 pref->setItemProperty( "step", 0.1, light_dz );
2571 // ... "Light source" group <<end>>
2573 // ... -> empty frame (for layout) <<start>>
2574 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2575 pref->setItemProperty( "margin", 0, occGen );
2576 pref->setItemProperty( "columns", 2, occGen );
2577 // ... -> empty frame (for layout) <<end>>
2579 // .. "OCC viewer" group <<end>>
2582 #ifndef DISABLE_VTKVIEWER
2583 // .. "VTK viewer" group <<start>>
2584 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2586 // ... -> empty frame (for layout) <<start>>
2587 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2588 //pref->setItemProperty( "columns", 2, vtkGen );
2589 // .... -> projection mode
2590 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2591 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2592 aValuesList.clear();
2593 anIndicesList.clear();
2594 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2595 anIndicesList << 0 << 1;
2596 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2597 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2599 // .... -> Stereo group
2600 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2601 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2602 // .... -> Stereo type
2603 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2604 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2605 aValuesList.clear();
2606 anIndicesList.clear();
2608 SVTK_Viewer::stereoData( aValuesList, idList);
2609 foreach( int gid, idList ) anIndicesList << gid;
2610 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2611 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2612 // .... -> Anaglyph filter
2613 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2614 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2615 aValuesList.clear();
2616 anIndicesList.clear();
2617 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2618 anIndicesList << 0 << 1 << 2;
2620 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2621 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2623 // .... -> Enable quad-buffer support
2624 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2625 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2627 // .... -> background
2628 aValuesList.clear();
2629 anIndicesList.clear();
2632 #ifndef DISABLE_SALOMEOBJECT
2633 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2635 foreach( int gid, idList ) anIndicesList << gid;
2636 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2637 LightApp_Preferences::Background, "VTKViewer", "background" );
2638 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2639 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2640 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2641 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2642 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2643 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2644 pref->setItemProperty( "custom_enabled", false, bgId );
2645 #ifndef DISABLE_SALOMEOBJECT
2646 pref->setItemProperty( "image_formats", formats, bgId );
2648 // .... -> speed increment
2649 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2650 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2651 pref->setItemProperty( "min", 1, vtkSpeed );
2652 pref->setItemProperty( "max", 1000, vtkSpeed );
2653 // .... -> speed mode
2654 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2655 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2656 aValuesList.clear();
2657 anIndicesList.clear();
2658 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2659 anIndicesList << 0 << 1;
2660 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2661 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2663 // ... "Selection" group <<start>>
2664 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2665 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2666 // .... -> preselection
2667 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2668 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2669 aValuesList.clear();
2670 anIndicesList.clear();
2671 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2672 anIndicesList << 0 << 1 << 2;
2673 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2674 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2675 // .... -> enable selection
2676 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2677 // ... "Selection" group <<end>>
2679 // ... -> empty frame (for layout) <<end>>
2681 // ... space mouse sub-group <<start>>
2682 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2683 //pref->setItemProperty( "columns", 2, vtkSM );
2684 // .... -> decrease speed increment
2685 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2686 LightApp_Preferences::Selector, "VTKViewer",
2687 "spacemouse_func1_btn" );
2688 // .... -> increase speed increment
2689 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2690 LightApp_Preferences::Selector, "VTKViewer",
2691 "spacemouse_func2_btn" );
2692 // .... -> dominant / combined switch
2693 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2694 LightApp_Preferences::Selector, "VTKViewer",
2695 "spacemouse_func5_btn" ); //
2696 aValuesList.clear();
2697 anIndicesList.clear();
2698 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2699 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2700 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2701 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2702 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2703 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2704 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2705 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2706 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2707 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2708 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2709 // ... space mouse sub-group <<end>>
2711 // ... avi recording sub-group <<start>>
2712 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2713 pref->setItemProperty( "columns", 2, vtkRec );
2714 // .... -> recording mode
2715 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2716 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2717 aValuesList.clear();
2718 anIndicesList.clear();
2719 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2720 anIndicesList << 0 << 1;
2721 pref->setItemProperty( "strings", aValuesList, modePref );
2722 pref->setItemProperty( "indexes", anIndicesList, modePref );
2724 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2725 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2726 pref->setItemProperty( "min", 0.1, fpsPref );
2727 pref->setItemProperty( "max", 100, fpsPref );
2729 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2730 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2731 pref->setItemProperty( "min", 1, qualityPref );
2732 pref->setItemProperty( "max", 100, qualityPref );
2733 // .... -> progressive mode
2734 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2735 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2736 // ... avi recording sub-group <<end>>
2738 // ... group names sub-group <<start>>
2739 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2740 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2741 pref->setItemProperty( "columns", 2, vtkGN );
2742 // .... -> text color
2743 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2744 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2745 // .... -> transparency
2746 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2747 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2748 pref->setItemProperty( "min", 0.0, transPref );
2749 pref->setItemProperty( "max", 1.0, transPref );
2750 pref->setItemProperty( "step", 0.1, transPref );
2751 // ... -> group names sub-group <<end>>
2752 // .. "VTK viewer" group <<end>>
2755 // .. "Plot2d viewer" group <<start>>
2756 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2757 //pref->setItemProperty( "columns", 2, plot2dGroup );
2759 // ... -> background
2760 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2761 LightApp_Preferences::Color, "Plot2d", "Background" );
2762 // ... -> selection color
2763 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2764 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2766 // ... "Viewer" group <<start>>
2767 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2769 // .... -> curve type
2770 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2771 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2772 aValuesList.clear();
2773 anIndicesList.clear();
2774 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2775 anIndicesList << 0 << 1 << 2 ;
2776 pref->setItemProperty( "strings", aValuesList, curveType );
2777 pref->setItemProperty( "indexes", anIndicesList, curveType );
2778 // .... -> marker size
2779 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2780 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2781 pref->setItemProperty( "min", 0, markerSize );
2782 pref->setItemProperty( "max", 100, markerSize );
2783 // .... -> horizontal scaling mode
2784 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2785 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2786 aValuesList.clear();
2787 anIndicesList.clear();
2788 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2789 anIndicesList << 0 << 1 ;
2790 pref->setItemProperty( "strings", aValuesList, horScale );
2791 pref->setItemProperty( "indexes", anIndicesList, horScale );
2792 // .... -> vertical scaling mode
2793 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2794 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2795 pref->setItemProperty( "strings", aValuesList, verScale );
2796 pref->setItemProperty( "indexes", anIndicesList, verScale );
2798 // .... -> errors/deviation colot
2799 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2800 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2801 // .... -> deviation markers line size
2802 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2803 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2804 pref->setItemProperty( "min", 1, deviationMarkerLw );
2805 pref->setItemProperty( "max", 5, deviationMarkerLw );
2806 // .... -> deviation markers tick mark size
2807 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2808 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2809 pref->setItemProperty( "min", 1, deviationMarkerTs );
2810 pref->setItemProperty( "max", 5, deviationMarkerTs );
2811 // .... "Viewer" group <<end>>
2813 // ... "Legend" group <<start>>
2814 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2816 // .... -> show legend
2817 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2818 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2819 // .... -> legend position
2820 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2821 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2822 aValuesList.clear();
2823 anIndicesList.clear();
2824 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2825 anIndicesList << 0 << 1 << 2 << 3 ;
2826 pref->setItemProperty( "strings", aValuesList, legendPosition );
2827 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2828 // .... -> Symbol type
2829 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2830 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2831 aValuesList.clear();
2832 anIndicesList.clear();
2833 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2834 anIndicesList << 0 << 1 ;
2835 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2836 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2837 // .... -> legend font
2838 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2839 // ... -> font color
2840 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2841 // ... -> selection font color
2842 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2843 // ... "Legend" group <<end>>
2845 // .. "Plot2d viewer" group <<end>>
2847 // .. "PyViewer" preferences tab <<start>>
2848 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2849 // ... "Font settings" group <<start>>
2850 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2851 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2852 LightApp_Preferences::Font, "PyEditor", "Font" );
2853 // ... "Font settings" group <<end>>
2854 // ... "Display settings" group <<start>>
2855 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2856 pref->setItemProperty( "columns", 2, pyDispGroup );
2857 // ... -> current line highlight
2858 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2859 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2860 // ... -> text wrapping
2861 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2862 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2863 // ... -> center cursor on scroll
2864 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2865 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2866 // ... -> line numbers area
2867 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2868 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2869 // ... "Display settings" group <<end>>
2870 // ... "Tab settings" group <<start>>
2871 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2872 pref->setItemProperty( "columns", 2, pyTabGroup );
2873 // ... -> tab whitespaces
2874 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2875 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2877 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2878 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2879 // ... "Tab settings" group <<end>>
2880 // ... "Vertical edge settings" group <<start>>
2881 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2882 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2883 // ... -> vertical edge
2884 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2885 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2886 // ... -> number of columns
2887 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2888 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2889 // ... "Vertical edge settings" group <<end>>
2890 // .. "PyEditor" preferences tab <<end>>
2892 // .. "Directories" preferences tab <<start>>
2893 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2894 // ... --> quick directories list
2895 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2896 pref->addPreference( tr( "" ), dirGroup,
2897 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2898 // .. "Directories" preferences tab <<end>>
2900 // .. "Object browser" preferences tab <<start>>
2901 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2903 // ... "Search tool" group <<start>>
2904 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2905 // .... --> auto-hide
2906 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2907 "ObjectBrowser", "auto_hide_search_tool" );
2908 // ... "Search tool" group <<end>>
2910 // ... "Object browser settings" group <<start>>
2911 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2912 pref->setItemProperty( "columns", 2, objSetGroup );
2913 // .... -> auto size first column
2914 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2915 "ObjectBrowser", "auto_size_first" );
2916 // .... -> auto size other columns
2917 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2918 "ObjectBrowser", "auto_size" );
2919 // .... -> resize columns on expand item
2920 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2921 "ObjectBrowser", "resize_on_expand_item" );
2922 // .... -> browse to published object
2923 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2924 "ObjectBrowser", "browse_published_object" );
2925 aValuesList.clear();
2926 anIndicesList.clear();
2927 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2928 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2929 pref->setItemProperty( "strings", aValuesList, browsePublished );
2930 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2931 // ... "Object browser settings" group <<end>>
2932 // .. "Object browser" preferences tab <<end>>
2934 // .. "Shortcuts" preferences tab <<start>>
2935 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2936 // ... "Shortcuts settings" group <<start>>
2937 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2938 pref->addPreference( tr( "" ), shortcutGroup,
2939 LightApp_Preferences::ShortcutTree, "shortcuts" );
2940 // ... "Shortcuts settings" group <<end>>
2941 // .. "Shortcuts" preferences tab <<end>>
2942 // . Top-level "SALOME" preferences group <<end>>
2948 Changes appearance of application according to changed preferences
2949 \param sec - section
2950 \param param - name of changed parameter
2952 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2954 SUIT_ResourceMgr* resMgr = resourceMgr();
2958 if ( sec == "viewers" && param == "drop_down_buttons" )
2960 ViewManagerList vmlist = viewManagers();
2961 foreach( SUIT_ViewManager* vm, vmlist )
2963 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2964 foreach( SUIT_ViewWindow* vw, vwlist )
2965 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2969 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2971 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2972 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2973 QList<SUIT_ViewManager*> lst;
2974 #ifndef DISABLE_OCCVIEWER
2975 viewManagers( OCCViewer_Viewer::Type(), lst );
2976 QListIterator<SUIT_ViewManager*> itOCC( lst );
2977 while ( itOCC.hasNext() && sz >= 0 )
2979 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2980 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2983 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2984 occVM->setTrihedronSize( sz, relative );
2985 occVM->getAISContext()->UpdateCurrentViewer();
2988 #ifndef DISABLE_VTKVIEWER
2989 #ifndef DISABLE_SALOMEOBJECT
2990 viewManagers( SVTK_Viewer::Type(), lst );
2991 QListIterator<SUIT_ViewManager*> itVTK( lst );
2992 while ( itVTK.hasNext() && sz >= 0 )
2994 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2995 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2998 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3001 vtkVM->setTrihedronSize( sz, relative );
3009 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3011 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3012 QList<SUIT_ViewManager*> lst;
3013 #ifndef DISABLE_OCCVIEWER
3014 viewManagers( OCCViewer_Viewer::Type(), lst );
3015 QListIterator<SUIT_ViewManager*> itOCC( lst );
3016 while ( itOCC.hasNext() )
3018 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3019 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3022 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3025 occVM->setStaticTrihedronDisplayed( isVisible );
3029 #ifndef DISABLE_VTKVIEWER
3030 #ifndef DISABLE_SALOMEOBJECT
3031 viewManagers( SVTK_Viewer::Type(), lst );
3032 QListIterator<SUIT_ViewManager*> itVTK( lst );
3033 while ( itVTK.hasNext() )
3035 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3036 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3039 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3042 vtkVM->setStaticTrihedronVisible( isVisible );
3050 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3052 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3053 QList<SUIT_ViewManager*> lst;
3054 #ifndef DISABLE_OCCVIEWER
3055 viewManagers( OCCViewer_Viewer::Type(), lst );
3056 QListIterator<SUIT_ViewManager*> itOCC( lst );
3057 while ( itOCC.hasNext() )
3059 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3060 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3063 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3064 occVM->setInteractionStyle( mode );
3067 #ifndef DISABLE_VTKVIEWER
3068 #ifndef DISABLE_SALOMEOBJECT
3069 viewManagers( SVTK_Viewer::Type(), lst );
3070 QListIterator<SUIT_ViewManager*> itVTK( lst );
3071 while ( itVTK.hasNext() )
3073 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3074 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3077 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3078 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3084 #ifndef DISABLE_OCCVIEWER
3085 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3087 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3088 QList<SUIT_ViewManager*> lst;
3089 viewManagers( OCCViewer_Viewer::Type(), lst );
3090 QListIterator<SUIT_ViewManager*> it( lst );
3091 while ( it.hasNext() )
3093 SUIT_ViewModel* vm = it.next()->getViewModel();
3094 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3097 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3098 occVM->enablePreselection( isToEnablePreselection );
3103 #ifndef DISABLE_OCCVIEWER
3104 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3106 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3107 QList<SUIT_ViewManager*> lst;
3108 viewManagers( OCCViewer_Viewer::Type(), lst );
3109 QListIterator<SUIT_ViewManager*> it( lst );
3110 while ( it.hasNext() )
3112 SUIT_ViewModel* vm = it.next()->getViewModel();
3113 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3116 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3117 occVM->enableSelection( isToEnableSelection );
3122 #ifndef DISABLE_OCCVIEWER
3123 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3125 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3126 QList<SUIT_ViewManager*> lst;
3127 viewManagers( OCCViewer_Viewer::Type(), lst );
3128 QListIterator<SUIT_ViewManager*> it( lst );
3129 while ( it.hasNext() )
3131 SUIT_ViewModel* vm = it.next()->getViewModel();
3132 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3135 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3136 occVM->setClippingColor( aColor );
3141 #ifndef DISABLE_OCCVIEWER
3142 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3143 param == QString( "clipping_texture" ) ||
3144 param == QString( "clipping_modulate" ) ||
3145 param == QString( "clipping_scale" ) ) )
3147 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3148 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3149 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3150 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3151 QList<SUIT_ViewManager*> lst;
3152 viewManagers( OCCViewer_Viewer::Type(), lst );
3153 QListIterator<SUIT_ViewManager*> it( lst );
3154 while ( it.hasNext() )
3156 SUIT_ViewModel* vm = it.next()->getViewModel();
3157 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3160 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3161 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3166 #ifndef DISABLE_OCCVIEWER
3167 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3169 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3170 QList<SUIT_ViewManager*> lst;
3171 viewManagers( OCCViewer_Viewer::Type(), lst );
3172 QListIterator<SUIT_ViewManager*> it( lst );
3173 while ( it.hasNext() )
3175 SUIT_ViewModel* vm = it.next()->getViewModel();
3176 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3179 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3180 occVM->setProjectionType( mode );
3184 #if OCC_VERSION_LARGE > 0x06090000
3185 #ifndef DISABLE_OCCVIEWER
3186 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3188 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3189 QList<SUIT_ViewManager*> lst;
3190 viewManagers( OCCViewer_Viewer::Type(), lst );
3191 QListIterator<SUIT_ViewManager*> it( lst );
3192 while ( it.hasNext() )
3194 SUIT_ViewModel* vm = it.next()->getViewModel();
3195 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3198 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3199 occVM->setStereoType( mode );
3204 #ifndef DISABLE_OCCVIEWER
3205 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3207 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3208 QList<SUIT_ViewManager*> lst;
3209 viewManagers( OCCViewer_Viewer::Type(), lst );
3210 QListIterator<SUIT_ViewManager*> it( lst );
3211 while ( it.hasNext() )
3213 SUIT_ViewModel* vm = it.next()->getViewModel();
3214 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3217 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3218 occVM->setAnaglyphFilter( mode );
3223 #ifndef DISABLE_OCCVIEWER
3224 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3225 param == QString( "focus_value" ) ) )
3227 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3228 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3229 QList<SUIT_ViewManager*> lst;
3230 viewManagers( OCCViewer_Viewer::Type(), lst );
3231 QListIterator<SUIT_ViewManager*> it( lst );
3232 while ( it.hasNext() )
3234 SUIT_ViewModel* vm = it.next()->getViewModel();
3235 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3238 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3239 occVM->setStereographicFocus( aType, aValue );
3244 #ifndef DISABLE_OCCVIEWER
3245 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3246 param == QString( "iod_value" ) ) )
3248 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3249 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3250 QList<SUIT_ViewManager*> lst;
3251 viewManagers( OCCViewer_Viewer::Type(), lst );
3252 QListIterator<SUIT_ViewManager*> it( lst );
3253 while ( it.hasNext() )
3255 SUIT_ViewModel* vm = it.next()->getViewModel();
3256 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3259 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3260 occVM->setInterocularDistance( aType, aValue );
3265 #ifndef DISABLE_OCCVIEWER
3266 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3268 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3269 QList<SUIT_ViewManager*> lst;
3270 viewManagers( OCCViewer_Viewer::Type(), lst );
3271 QListIterator<SUIT_ViewManager*> it( lst );
3272 while ( it.hasNext() )
3274 SUIT_ViewModel* vm = it.next()->getViewModel();
3275 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3278 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3279 occVM->setReverseStereo( reverse );
3284 #ifndef DISABLE_OCCVIEWER
3285 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3287 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3288 QList<SUIT_ViewManager*> lst;
3289 viewManagers( OCCViewer_Viewer::Type(), lst );
3290 QListIterator<SUIT_ViewManager*> it( lst );
3291 while ( it.hasNext() )
3293 SUIT_ViewModel* vm = it.next()->getViewModel();
3294 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3297 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3298 occVM->setVSync( enable );
3303 #ifndef DISABLE_OCCVIEWER
3304 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3306 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3307 QList<SUIT_ViewManager*> lst;
3308 viewManagers( OCCViewer_Viewer::Type(), lst );
3309 QListIterator<SUIT_ViewManager*> it( lst );
3310 while ( it.hasNext() )
3312 SUIT_ViewModel* vm = it.next()->getViewModel();
3313 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3316 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3317 occVM->setQuadBufferSupport( enable );
3322 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3324 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3325 QList<SUIT_ViewManager*> lst;
3326 #ifndef DISABLE_OCCVIEWER
3327 viewManagers( OCCViewer_Viewer::Type(), lst );
3328 QListIterator<SUIT_ViewManager*> itOCC( lst );
3329 while ( itOCC.hasNext() )
3331 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3332 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3335 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3336 occVM->setZoomingStyle( mode );
3339 #ifndef DISABLE_VTKVIEWER
3340 #ifndef DISABLE_SALOMEOBJECT
3341 viewManagers( SVTK_Viewer::Type(), lst );
3342 QListIterator<SUIT_ViewManager*> itVTK( lst );
3343 while ( itVTK.hasNext() )
3345 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3346 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3349 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3350 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3356 #ifndef DISABLE_VTKVIEWER
3357 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3359 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3360 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3361 QList<SUIT_ViewManager*> lst;
3362 #ifndef DISABLE_SALOMEOBJECT
3363 viewManagers( SVTK_Viewer::Type(), lst );
3364 QListIterator<SUIT_ViewManager*> it( lst );
3365 while ( it.hasNext() )
3367 SUIT_ViewModel* vm = it.next()->getViewModel();
3368 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3371 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3372 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3378 #ifndef DISABLE_VTKVIEWER
3379 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3381 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3382 QList<SUIT_ViewManager*> lst;
3383 #ifndef DISABLE_SALOMEOBJECT
3384 viewManagers( SVTK_Viewer::Type(), lst );
3385 QListIterator<SUIT_ViewManager*> it( lst );
3386 while ( it.hasNext() )
3388 SUIT_ViewModel* vm = it.next()->getViewModel();
3389 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3392 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3393 if( vtkVM ) vtkVM->setProjectionMode( mode );
3399 #ifndef DISABLE_VTKVIEWER
3400 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3402 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3403 QList<SUIT_ViewManager*> lst;
3404 #ifndef DISABLE_SALOMEOBJECT
3405 viewManagers( SVTK_Viewer::Type(), lst );
3406 QListIterator<SUIT_ViewManager*> it( lst );
3407 while ( it.hasNext() )
3409 SUIT_ViewModel* vm = it.next()->getViewModel();
3410 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3413 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3414 if( vtkVM ) vtkVM->setStereoType( mode );
3420 #ifndef DISABLE_VTKVIEWER
3421 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3423 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3424 QList<SUIT_ViewManager*> lst;
3425 #ifndef DISABLE_SALOMEOBJECT
3426 viewManagers( SVTK_Viewer::Type(), lst );
3427 QListIterator<SUIT_ViewManager*> it( lst );
3428 while ( it.hasNext() )
3430 SUIT_ViewModel* vm = it.next()->getViewModel();
3431 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3434 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3435 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3441 #ifndef DISABLE_VTKVIEWER
3442 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3444 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3445 QList<SUIT_ViewManager*> lst;
3446 #ifndef DISABLE_SALOMEOBJECT
3447 viewManagers( SVTK_Viewer::Type(), lst );
3448 QListIterator<SUIT_ViewManager*> it( lst );
3449 while ( it.hasNext() )
3451 SUIT_ViewModel* vm = it.next()->getViewModel();
3452 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3455 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3456 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3462 #ifndef DISABLE_VTKVIEWER
3463 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3465 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3466 QList<SUIT_ViewManager*> lst;
3467 #ifndef DISABLE_SALOMEOBJECT
3468 viewManagers( SVTK_Viewer::Type(), lst );
3469 QListIterator<SUIT_ViewManager*> it( lst );
3470 while ( it.hasNext() )
3472 SUIT_ViewModel* vm = it.next()->getViewModel();
3473 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3476 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3477 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3483 #ifndef DISABLE_VTKVIEWER
3484 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3486 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3487 QList<SUIT_ViewManager*> lst;
3488 #ifndef DISABLE_SALOMEOBJECT
3489 viewManagers( SVTK_Viewer::Type(), lst );
3490 QListIterator<SUIT_ViewManager*> it( lst );
3491 while ( it.hasNext() )
3493 SUIT_ViewModel* vm = it.next()->getViewModel();
3494 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3497 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3498 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3504 #ifndef DISABLE_VTKVIEWER
3505 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3506 param == QString( "spacemouse_func2_btn" ) ||
3507 param == QString( "spacemouse_func5_btn" ) ) )
3509 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3510 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3511 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3512 QList<SUIT_ViewManager*> lst;
3513 #ifndef DISABLE_SALOMEOBJECT
3514 viewManagers( SVTK_Viewer::Type(), lst );
3515 QListIterator<SUIT_ViewManager*> it( lst );
3516 while ( it.hasNext() )
3518 SUIT_ViewModel* vm = it.next()->getViewModel();
3519 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3522 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3523 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3528 if( sec=="ObjectBrowser" )
3530 SUIT_DataBrowser* ob = objectBrowser();
3534 if ( param=="auto_size_first" )
3536 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3537 ob->setAutoSizeFirstColumn( autoSizeFirst );
3538 if ( autoSizeFirst )
3539 ob->adjustFirstColumnWidth();
3541 else if ( param=="auto_size" ) {
3542 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3543 ob->setAutoSizeColumns(autoSize);
3545 ob->adjustColumnsWidth();
3547 else if ( param=="resize_on_expand_item" ) {
3548 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3549 ob->setResizeOnExpandItem(resizeOnExpandItem);
3551 else if ( param == "auto_hide_search_tool" ) {
3552 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3558 if( param=="auto_save_interval" ) {
3559 myAutoSaveTimer->stop();
3560 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3561 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3565 #ifndef DISABLE_PYCONSOLE
3566 if( sec=="PyConsole" && pythonConsole() )
3568 if ( param=="font" ) {
3569 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3571 else if ( param=="show_banner" ) {
3572 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3579 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3581 if ( param == "visible_count" )
3582 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3583 else if ( param == "max_count" )
3584 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3585 else if ( param == "insert_mode" )
3586 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3587 else if ( param == "link_type" )
3588 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3589 else if ( param == "show_clear" )
3590 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3591 else if ( param == "show_mru" )
3592 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3595 if ( sec == "language" && param == "language" )
3597 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3598 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3600 if ( sec == "language" && param == "locale")
3602 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3603 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3605 if ( sec == "desktop" && param == "opaque_resize" ) {
3606 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3607 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3608 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3609 else dopts &= ~QMainWindow::AnimatedDocks;
3610 desktop()->setDockOptions( dopts );
3611 desktop()->setOpaqueResize( opaqueResize );
3612 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3613 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3616 #ifndef DISABLE_PLOT2DVIEWER
3617 QList<SUIT_ViewManager*> lst;
3618 viewManagers( Plot2d_Viewer::Type(), lst );
3619 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3620 while ( itPlot2d.hasNext() ) {
3621 SUIT_ViewManager* viewMgr = itPlot2d.next();
3622 SUIT_ViewModel* vm = viewMgr->getViewModel();
3623 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3626 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3628 viewMgr->setViewModel( vm );
3629 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3631 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3632 frame->SetPreference();
3637 #ifndef DISABLE_PYVIEWER
3638 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3639 param == QString( "LineNumberArea" ) ||
3640 param == QString( "TextWrapping" ) ||
3641 param == QString( "CenterCursorOnScroll" ) ||
3642 param == QString( "TabSpaceVisible" ) ||
3643 param == QString( "TabSize" ) ||
3644 param == QString( "VerticalEdge" ) ||
3645 param == QString( "NumberColumns" ) ||
3646 param == QString( "Font" ) ) )
3648 QList<SUIT_ViewManager*> lst;
3649 viewManagers( PyViewer_Viewer::Type(), lst );
3650 QListIterator<SUIT_ViewManager*> itPy( lst );
3651 while ( itPy.hasNext() )
3653 SUIT_ViewManager* viewMgr = itPy.next();
3654 SUIT_ViewModel* vm = viewMgr->getViewModel();
3655 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3658 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3660 viewMgr->setViewModel( vm );
3661 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3664 pyView->setPreferences();
3674 void LightApp_Application::loadPreferences()
3676 CAM_Application::loadPreferences();
3678 SUIT_ResourceMgr* aResMgr = resourceMgr();
3683 static bool mru_load = true;
3686 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3688 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3689 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3690 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3691 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3692 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3693 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3694 mru->loadLinks( aResMgr, "MRU" );
3700 QStringList mods = aResMgr->parameters( "windows_visibility" );
3701 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3704 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3705 myWinVis.insert( *itr, arr );
3709 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3710 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3711 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3712 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3713 else dopts &= ~QMainWindow::AnimatedDocks;
3714 desktop()->setDockOptions( dopts );
3715 desktop()->setOpaqueResize( opaqueResize );
3716 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3717 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3724 void LightApp_Application::savePreferences()
3726 CAM_Application::savePreferences();
3728 saveDockWindowsState();
3730 SUIT_ResourceMgr* aResMgr = resourceMgr();
3735 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3737 mru->saveLinks( aResMgr, "MRU" );
3739 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3740 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3743 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3745 #if GUI_DEVELOPMENT > 0
3746 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3748 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3755 Updates desktop title
3757 void LightApp_Application::updateDesktopTitle()
3759 QString aTitle = applicationName();
3760 QString aVer = applicationVersion();
3761 if ( !aVer.isEmpty() )
3762 aTitle += QString( " " ) + aVer;
3764 if ( activeStudy() ) {
3765 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3766 aTitle += QString( " - [%1]" ).arg( sName );
3769 desktop()->setWindowTitle( aTitle );
3773 \brief Get map of the operations which can be performed
3774 on the module activation.
3776 The method should return the map of the kind \c {<id>:<name>}
3777 where \c <id> is an integer identifier of the operation and
3778 \c <name> is a title for the button to be added to the
3779 dialog box. After user selects the required operation by the
3780 clicking the corresponding button in the dialog box, its identifier
3781 is passed to the moduleActionSelected() method to process
3784 \return map of the operations
3785 \sa moduleActionSelected()
3787 QMap<int, QString> LightApp_Application::activateModuleActions() const
3789 QMap<int, QString> opmap;
3790 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3791 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3796 \brief Called when the used selectes required operation chosen
3797 from "Activate module" dialog box.
3799 Performs the required operation according to the user choice.
3801 \param id operation identifier
3802 \sa activateModuleActions()
3804 void LightApp_Application::moduleActionSelected( const int id )
3819 Updates windows after close document
3821 void LightApp_Application::afterCloseDoc()
3825 CAM_Application::afterCloseDoc();
3829 Updates actions of active module
3831 void LightApp_Application::updateModuleActions()
3834 if ( activeModule() ) {
3835 modName = activeModule()->moduleName();
3836 if ( !isModuleAccessible( modName ) ) {
3837 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3838 foreach( SUIT_Application* app, apps ) {
3839 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3840 if ( lapp && lapp != this )
3841 lapp->removeModuleAction( modName );
3846 LightApp_ModuleAction* moduleAction =
3847 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3849 moduleAction->setActiveModule( modName );
3852 void LightApp_Application::removeModuleAction( const QString& modName )
3854 LightApp_ModuleAction* moduleAction =
3855 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3857 moduleAction->removeModule( modName );
3861 Gets current windows.
3862 \param winMap - output current windows map.
3864 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3867 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3868 ((LightApp_Module*)activeModule())->windows( winMap );
3870 defaultWindows( winMap );
3874 Gets current view managers.
3875 \param lst - output current view managers list.
3877 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3880 if ( !activeStudy() )
3883 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3884 ((LightApp_Module*)activeModule())->viewManagers( lst );
3886 defaultViewManagers( lst );
3892 void LightApp_Application::updateWindows()
3894 QMap<int, int> winMap;
3895 currentWindows( winMap );
3897 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3899 if ( !dockWindow( it.key() ) )
3900 getWindow( it.key() );
3903 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3905 QWidget* wid = it.value();
3906 if ( winMap.contains( it.key() ) )
3907 wid->setVisible( true );
3912 loadDockWindowsState();
3916 Updates view managers
3918 void LightApp_Application::updateViewManagers()
3921 currentViewManagers( lst );
3923 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3924 getViewManager( *it, true );
3928 Loads windows geometry
3930 void LightApp_Application::loadDockWindowsState()
3934 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3935 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3936 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3939 if ( activeModule() )
3940 modName = activeModule()->name();
3941 else if ( activeStudy() )
3942 modName = "nomodule";
3944 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3945 QByteArray aDefaultState;
3946 aResMgr->value( "windows_geometry", modName, aDefaultState );
3947 QByteArray aDefaultVisibility;
3948 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3949 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3950 aResMgr->setWorkingMode( prevMode );
3952 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3955 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3956 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3958 if ( version > Qtx::versionToId( "7.4.1" ) )
3959 aResMgr->value( "windows_geometry", modName , arr );
3961 arr = aDefaultState;
3962 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3963 desktop()->restoreState( aTargetArray );
3966 QStringList mainToolbarsNames;
3967 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3968 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3969 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3971 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3974 QMap<QString, bool> *tbMap = 0;
3975 QMap<QString, bool> *dwMap = 0;
3977 QMap<QString, bool> userTbMap, userDwMap;
3978 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3980 QMap<QString, bool> defaultTbMap, defaultDwMap;
3981 if(hasDefaultVisibility) {
3982 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3988 if(hasDefaultVisibility){
3989 tbMap = &defaultTbMap;
3996 if(hasDefaultVisibility){
3997 dwMap = &defaultDwMap;
4002 QList<QToolBar*> tbList = findToolBars();
4003 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4005 QToolBar* tb = *tit;
4006 if ( tbMap->contains( tb->objectName() ) ) {
4007 tb->setVisible( (*tbMap)[tb->objectName()] );
4013 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
4014 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4016 QDockWidget* dw = *dit;
4018 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4019 if ( po != desktop() )
4022 if ( dwMap->contains( dw->objectName() ) )
4023 dw->setVisible( (*dwMap)[dw->objectName()] );
4031 Saves windows geometry
4033 void LightApp_Application::saveDockWindowsState()
4038 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4039 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4041 if( !storeWin && !storeTb )
4045 if ( activeModule() )
4046 modName = activeModule()->name();
4047 else if ( activeStudy() )
4048 modName = "nomodule";
4050 QString versionId = GUI_VERSION_STR;
4051 #if GUI_DEVELOPMENT > 0
4055 QByteArray arr = desktop()->saveState();
4056 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4057 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4060 if ( myWinVis.contains( modName ) )
4061 visArr = myWinVis[modName];
4063 QMap<QString, bool> tbMap, dwMap;
4064 dockWindowsState( visArr, tbMap, dwMap );
4066 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4067 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4070 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4073 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
4074 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4076 QDockWidget* wid = *it;
4077 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4080 visArr = dockWindowsState( tbMap, dwMap );
4082 myWinVis.insert( modName, visArr );
4085 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4088 QDataStream stream( &visArr, QIODevice::WriteOnly );
4090 stream << (uchar)ToolBarMarker;
4091 stream << tb.size();
4092 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4094 stream << tit.key();
4095 stream << (uchar)( tit.value() ? 1 : 0 );
4098 stream << (uchar)DockWidgetMarker;
4099 stream << dw.size();
4100 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4102 stream << wit.key();
4103 stream << (uchar)( wit.value() ? 1 : 0 );
4109 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4114 QByteArray visArr = arr;
4115 QDataStream stream( &visArr, QIODevice::ReadOnly );
4119 if ( marker != ToolBarMarker )
4124 for ( int i = 0; i < lines; ++i )
4127 stream >> objectName;
4130 tb.insert( objectName, shown );
4134 if ( marker != DockWidgetMarker )
4138 for ( int j = 0; j < lines; ++j )
4141 stream >> objectName;
4144 dw.insert( objectName, shown );
4149 Adds icon names for modules
4151 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4155 SUIT_ResourceMgr* resMgr = resourceMgr();
4159 QStringList modList;
4160 modules( modList, false );
4162 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4164 QString modName = *it;
4165 QString modIntr = moduleName( modName );
4166 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4168 if ( modIcon.isEmpty() )
4171 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4172 modIcon += QString( ".png" );
4174 iconMap.insert( modName, modIcon );
4179 Inserts items in popup, which necessary for current application
4181 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4184 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4185 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4186 selMgr->setSelectionCacheEnabled( true );
4188 SUIT_DataBrowser* ob = objectBrowser();
4190 CAM_Application::contextMenuPopup( type, thePopup, title );
4192 if ( ob && type == ob->popupClientType() ) {
4193 thePopup->addSeparator();
4194 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4195 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4196 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4199 #ifndef DISABLE_SALOMEOBJECT
4200 if ( selMgr && ob ) {
4201 SALOME_ListIO selected;
4202 selMgr->selectedObjects( selected );
4203 if(selected.Extent() == 1){
4204 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4205 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4206 if(obj && obj->renameAllowed()) {
4207 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4208 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4209 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4210 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4212 QList<QAction*> acts = thePopup->actions();
4213 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4214 thePopup->insertAction(firstAction,a);
4220 selMgr->setSelectionCacheEnabled( cacheIsOn );
4226 void LightApp_Application::createEmptyStudy()
4228 CAM_Application::createEmptyStudy();
4230 if ( objectBrowser() )
4231 objectBrowser()->updateTree();
4233 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4234 if ( aResMgr && activeStudy() ) {
4235 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4236 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4241 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4243 CAM_Application::setDesktop( desk );
4246 connect( desk, SIGNAL( message( const QString& ) ),
4247 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4248 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4249 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4250 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4251 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4257 \param mod - module to be activated
4259 bool LightApp_Application::activateModule( CAM_Module* mod )
4261 bool res = CAM_Application::activateModule( mod );
4263 if ( objectBrowser() )
4264 objectBrowser()->updateTree();
4270 \return keyborad accelerators manager object
4272 SUIT_Accel* LightApp_Application::accel() const
4278 Removes dead widget container from map
4280 void LightApp_Application::onWCDestroyed( QObject* ob )
4282 // remove destroyed widget container from windows map
4283 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4285 if ( itr.value() != ob )
4288 int key = itr.key();
4289 myWin.remove( key );
4294 void LightApp_Application::onMRUActivated( const QString& name )
4296 SUIT_Session* s = SUIT_Session::session();
4297 if ( s && s->activeApplication() == this )
4301 void LightApp_Application::onStylePreferences()
4303 Style_PrefDlg dlg( desktop() );
4306 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4309 void LightApp_Application::onFullScreen(){
4310 if(myScreenHelper) {
4311 if(desktop()->isFullScreen())
4312 myScreenHelper->switchToNormalScreen();
4314 myScreenHelper->switchToFullScreen();
4319 Connects just added view manager
4321 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4323 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4324 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4325 CAM_Application::addViewManager( vm );
4329 Remove view manager from memory
4331 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4333 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4334 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4335 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4337 aStudy->removeObjectProperties( vm->getGlobalId() );
4339 CAM_Application::removeViewManager( vm );
4341 LightApp_SelectionMgr* selMgr = selectionMgr();
4342 QList<SUIT_Selector*> selectors;
4343 selMgr->selectors( selectors );
4344 foreach( SUIT_Selector* selector, selectors ) {
4345 if ( selector->owner() == vm->getViewModel() ) {
4350 // IPAL22894: Crash on closing OCC view
4356 Renames active window of desktop
4358 void LightApp_Application::onRenameWindow()
4363 QWidget* w = desktop()->activeWindow();
4368 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4369 if( ok && !name.isEmpty() )
4370 w->setWindowTitle( name );
4374 Closes active window of desktop
4376 void LightApp_Application::onCloseWindow()
4381 QWidget* w = desktop()->activeWindow();
4389 Closes all windows of desktop
4391 void LightApp_Application::onCloseAllWindow()
4393 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4397 QList<SUIT_ViewWindow*> wndList = desk->windows();
4398 SUIT_ViewWindow* wnd;
4399 foreach( wnd, wndList )
4407 Groups all windows of desktop
4409 void LightApp_Application::onGroupAllWindow()
4411 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4415 QtxWorkstack* wgStack = desk->workstack();
4421 \return if the library of module exists
4422 \param moduleTitle - title of module
4424 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4426 if( moduleTitle.isEmpty() )
4429 QString lib = moduleLibrary( moduleTitle );
4431 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4432 bool isPythonModule = lib.contains("SalomePyQtGUI");
4433 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4437 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4439 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4442 bool isLibFound = false;
4443 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4444 for( ; anIt!=aLast; anIt++ )
4446 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4457 INFOS( "\n****************************************************************" << std::endl
4458 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4459 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4460 << "****************************************************************" << std::endl );
4462 else if ( !isPythonModule && !isPythonLightModule)
4465 if ( isPythonModule || isPythonLightModule)
4467 QString pylib = moduleName( moduleTitle ) + QString(".py");
4468 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4470 // Check the python library
4472 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4474 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4476 bool isPyLib = false, isPyGuiLib = false;
4477 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4478 for( ; anIt!=aLast; anIt++ )
4480 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4481 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4483 if(!isPythonLightModule)
4484 if( !isPyLib && inf.exists() )
4487 if( !isPyGuiLib && infgui.exists() )
4490 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4494 printf( "\n****************************************************************\n" );
4495 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4497 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4499 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4500 printf( "****************************************************************\n" );
4507 \return default name for an active study
4509 void LightApp_Application::setDefaultStudyName( const QString& theName )
4511 QStringList anInfoList;
4512 modules( anInfoList, false );
4514 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4515 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4516 !aStudy->isSaved() )
4518 aStudy->setStudyName( theName );
4519 updateDesktopTitle();
4524 Custom event handler
4526 bool LightApp_Application::event( QEvent* e )
4528 if( e && e->type()==2000 )
4530 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4531 QString* d = ( QString* )ce->data();
4532 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4534 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4535 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4536 showPreferences( tr( "PREF_APP" ) );
4541 return CAM_Application::event( e );
4544 /*! Check data object */
4545 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4549 bool isSuitable = !theObj->entry().isEmpty() &&
4550 !theObj->componentDataType().isEmpty() &&
4551 !theObj->name().isEmpty();
4558 int LightApp_Application::openChoice( const QString& aName )
4560 int choice = CAM_Application::openChoice( aName );
4562 if ( choice == OpenExist ) // The document is already open.
4564 // Do you want to reload it?
4565 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4566 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4567 choice = OpenReload;
4573 bool LightApp_Application::openAction( const int choice, const QString& aName )
4580 STD_Application* app = 0;
4581 SUIT_Session* session = SUIT_Session::session();
4582 QList<SUIT_Application*> appList = session->applications();
4583 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4585 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4586 app = ::qobject_cast<STD_Application*>( *it );
4591 app->onCloseDoc( false );
4592 appList = session->applications();
4593 STD_Application* other = 0;
4594 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4595 other = ::qobject_cast<STD_Application*>( *it );
4598 res = other->onOpenDoc( aName );
4603 res = CAM_Application::openAction( choice, aName );
4610 QStringList LightApp_Application::viewManagersTypes() const
4612 QStringList aTypesList;
4613 aTypesList += myUserWmTypes;
4614 #ifndef DISABLE_GLVIEWER
4615 aTypesList<<GLViewer_Viewer::Type();
4617 #ifndef DISABLE_PLOT2DVIEWER
4618 aTypesList<<Plot2d_Viewer::Type();
4620 #ifndef DISABLE_QXGRAPHVIEWER
4621 aTypesList<<QxScene_Viewer::Type();
4623 #ifndef DISABLE_PVVIEWER
4624 aTypesList<<PVViewer_Viewer::Type();
4626 #ifndef DISABLE_PYVIEWER
4627 aTypesList<<PyViewer_Viewer::Type();
4629 #ifndef DISABLE_OCCVIEWER
4630 aTypesList<<OCCViewer_Viewer::Type();
4632 #ifndef DISABLE_VTKVIEWER
4633 #ifndef DISABLE_SALOMEOBJECT
4634 aTypesList<<SVTK_Viewer::Type();
4636 aTypesList<<VTKViewer_Viewer::Type();
4642 * Removes all view managers of known types
4643 * Other view managers are ignored
4645 void LightApp_Application::clearKnownViewManagers()
4647 QStringList aTypesList = viewManagersTypes();
4648 QList<SUIT_ViewManager*> aMgrList;
4649 viewManagers( aMgrList );
4650 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4651 if (aTypesList.contains(aMgr->getType()))
4652 removeViewManager(aMgr);
4657 Copy of current selection
4659 void LightApp_Application::onCopy()
4661 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4667 Paste of current data in clipboard
4669 void LightApp_Application::onPaste()
4671 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4677 Browse (i.e. set focus on) the published objects
4678 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4679 has been accepted by Ok (or Apply & Close) button
4680 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4681 (to select the first published object only)
4682 \return entry of the selected object
4684 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4685 const bool theIsApplyAndClose,
4686 const bool theIsOptimizedBrowsing )
4689 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4691 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4692 switch( aBrowsePolicy )
4696 case BP_ApplyAndClose:
4697 if( !theIsApplyAndClose )
4705 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4709 SUIT_DataBrowser* anOB = objectBrowser();
4713 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4717 QStringListIterator anIter( theEntryList );
4718 if( theIsOptimizedBrowsing )
4720 // go to the last entry
4722 if( anIter.hasPrevious() )
4726 // scroll to each entry in the list
4727 // (in optimized mode - to the last entry only)
4729 LightApp_DataObject* anObject = 0;
4730 while( anIter.hasNext() )
4732 anEntry = anIter.next();
4733 if( !anEntry.isEmpty() )
4735 anObject = aStudy->findObjectByEntry( anEntry );
4738 QModelIndex anIndex = aModel->index( anObject );
4739 anOB->treeView()->scrollTo( anIndex );
4744 // always select the last object
4745 if( anObject && !anEntry.isEmpty() )
4747 QList<SUIT_Selector*> aSelectorList;
4748 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4749 if( !aSelectorList.isEmpty() )
4751 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4753 bool anIsAutoBlock = aSelector->autoBlock();
4755 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4756 aSelector->setAutoBlock( false );
4758 SUIT_DataOwnerPtrList aList;
4759 #ifndef DISABLE_SALOMEOBJECT
4760 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4761 ( anObject->entry().toLatin1().constData(),
4762 anObject->componentDataType().toLatin1().constData(),
4763 anObject->name().toLatin1().constData() );
4764 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4766 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4769 aList.append( owner );
4770 selectionMgr()->setSelected( aList );
4773 // restore auto block flag
4774 aSelector->setAutoBlock( anIsAutoBlock );
4782 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4784 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4785 return study ? study->findObjectByEntry( id ) : 0;
4789 Checks that an object can be renamed.
4790 \param entry entry of the object
4791 \brief Return \c true if object can be renamed
4793 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4798 Rename object by entry.
4799 \param entry entry of the object
4800 \param name new name of the object
4801 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4803 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4807 /*! Process standard messages from desktop */
4808 void LightApp_Application::onDesktopMessage( const QString& message )
4810 const QString sectionSeparator = "/";
4812 if ( message.toLower() == "updateobjectbrowser" ||
4813 message.toLower() == "updateobjbrowser" ) {
4814 // update object browser
4815 updateObjectBrowser();
4817 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4818 QString vtype = message.split( sectionSeparator ).last();
4819 if ( !vtype.isEmpty() )
4820 getViewManager( vtype, true );
4823 QStringList data = message.split( sectionSeparator );
4824 if ( data.count() > 1 ) {
4825 QString msgType = data[0].trimmed();
4826 LightApp_Module* sMod = 0;
4827 CAM_Module* mod = module( msgType );
4829 mod = module( moduleTitle( msgType ) );
4830 if ( mod && mod->inherits( "LightApp_Module" ) )
4831 sMod = (LightApp_Module*)mod;
4833 if ( msgType.toLower() == "preferences" ) {
4834 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4835 // for example "preferences/Study/multi_file_dump/true"
4836 if ( data.count() > 3 ) {
4837 QString section = data[1].trimmed();
4838 QString param = data[2].trimmed();
4839 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4840 resourceMgr()->setValue( section, param, value );
4844 // received message for the module
4845 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4846 sMod->message( msg );
4854 Returns all top level toolbars.
4855 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4857 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4859 QList<QToolBar*> aResult;
4860 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4861 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4862 QToolBar* tb = *tit;
4863 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4864 if ( po != desktop() )
4866 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4873 Internal method to parse toolbars and dockable windows state.
4875 QByteArray LightApp_Application::processState(QByteArray& input,
4876 const bool processWin,
4877 const bool processTb,
4878 const bool isRestoring,
4879 QByteArray defaultState) {
4882 bool hasDefaultState = !defaultState.isEmpty();
4883 bool isDockWinWriten = false;
4885 //Write date from users settings
4887 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4888 int marker, version;
4890 tmpInputData >> marker;
4891 tmpInputData >> version;
4892 tmpInputData >> dockmarker;
4893 tmpInputData >> nbDocWin;
4895 if(processWin && processTb && !isRestoring) {
4897 } else if(!processWin && !processTb ) {
4899 aRes = defaultState;
4901 QDataStream aData(&aRes, QIODevice::WriteOnly);
4902 QList<QToolBar*> aToolBars = findToolBars();
4905 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4906 QToolBar* tb = *tit;
4907 aNames.append(tb->objectName());
4910 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4911 if(toolBarMarkerIndex < 0)
4913 QDataStream anInputData(&input, QIODevice::ReadOnly);
4915 int toolBarMarkerIndexDef;
4916 if(hasDefaultState) {
4917 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4918 if(toolBarMarkerIndexDef < 0)
4921 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4923 QDataStream* aTargetData = 0;
4924 int aTargetIndex = -1;
4926 QByteArray currentArr = desktop()->saveState();
4927 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4928 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4929 if(processWin && useInputData) {
4930 aTargetData = &anInputData;
4931 aTargetIndex = toolBarMarkerIndex;
4933 //Write date from default settings
4934 if(hasDefaultState) {
4935 aTargetData = &anInputDataDef;
4936 aTargetIndex = toolBarMarkerIndexDef;
4938 //If no default state, write current snapshot of the dockable windows
4940 aTargetData = &anInputDataCur;
4941 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4942 aTargetIndex = toolBarMarkerIndexCur;
4947 if(aTargetData && aTargetIndex >= 0 ) {
4948 aTargetData->device()->seek(0);
4949 while( aTargetData->device()->pos() < aTargetIndex ) {
4954 isDockWinWriten = true;
4961 aTargetData = &anInputData;
4962 aTargetIndex = toolBarMarkerIndex;
4964 if(hasDefaultState) {
4965 aTargetData = &anInputDataDef;
4966 aTargetIndex = toolBarMarkerIndexDef;
4970 if(aTargetData && aTargetIndex >= 0) {
4972 if(!isDockWinWriten ) {
4973 //Write version marker
4974 int marker, version;
4975 aTargetData->device()->seek(0);
4976 *aTargetData >> marker;
4977 *aTargetData >> version;
4980 aData << (uchar) QDockWidgetMarker;
4982 int shift = 4*sizeof(int) + sizeof(QSize);
4983 index = aTargetIndex - shift;
4985 index = aTargetIndex;
4988 aTargetData->device()->seek(index);
4989 while(!aTargetData->atEnd()) {
4994 } else { // Not treat toolbars
4995 aData << (uchar) QToolBarMarker;
4996 aData << (int) 0; //Nb toolbars = 0
5003 \brief Emits operationFinished signal.
5004 \param theModuleName the name of the module which perfomed the operation
5005 \param theOperationName the operation name
5006 \param theEntryList the list of the created objects entries
5008 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5009 const QString& theOperationName,
5010 const QStringList& theEntryList )
5012 emit operationFinished( theModuleName, theOperationName, theEntryList );
5016 Update visibility state of given objects
5018 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5019 SUIT_ViewModel* theViewModel )
5021 if ( !theViewModel || theList.isEmpty() ) return;
5023 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5024 if ( !aStudy ) return;
5026 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5028 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5029 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5031 if ( !obj || aStudy->isComponent( obj->entry() ) )
5034 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5035 if ( anObjModule ) {
5036 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5038 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5039 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5040 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5041 anObjState = Qtx::ShownState;
5043 anObjState = Qtx::HiddenState;
5045 aStudy->setVisibilityState( obj->entry(), anObjState );
5052 * Called when window activated
5054 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5056 SUIT_DataBrowser* anOB = objectBrowser();
5059 SUIT_DataObject* rootObj = anOB->root();
5063 DataObjectList listObj = rootObj->children( true );
5065 SUIT_ViewModel* vmod = 0;
5066 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5067 vmod = vman->getViewModel();
5068 updateVisibilityState( listObj, vmod );
5072 Called then view manager removed
5074 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5076 ViewManagerList lst;
5077 viewManagers( lst );
5078 if ( lst.count() == 1) { // in case if closed last view window
5079 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5081 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5086 Check existing document.
5088 bool LightApp_Application::checkExistingDoc()
5091 if( activeStudy() ) {
5092 int answer = SUIT_MessageBox::question( desktop(),
5093 tr( "APPCLOSE_CAPTION" ),
5094 tr( "STUDYCLOSE_DESCRIPTION" ),
5095 tr( "APPCLOSE_SAVE" ),
5096 tr( "APPCLOSE_CLOSE" ),
5097 tr( "APPCLOSE_CANCEL" ), 0 );
5099 if ( activeStudy()->isSaved() ) {
5102 } else if ( onSaveAsDoc() ) {
5103 if( !closeDoc( false ) ) {
5110 else if( answer == 1 ) {
5112 } else if( answer == 2 ) {
5119 #ifndef DISABLE_PYCONSOLE
5121 PyConsole_Interp* LightApp_Application::getPyInterp()
5123 static PyConsole_Interp* myInterp = 0;
5125 myInterp = createPyInterp();
5129 PyConsole_Interp* LightApp_Application::createPyInterp()
5131 return new LightApp_PyInterp();
5134 #endif // DISABLE_PYCONSOLE