1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39 #include <PyConsole_Console.h>
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
61 #include <GUI_version.h>
63 #include <SALOME_Event.h>
65 #include <Style_Salome.h>
66 #include <Style_PrefDlg.h>
68 #include <CAM_Module.h>
69 #include <CAM_DataModel.h>
70 #include <CAM_Study.h>
71 #include <STD_TabDesktop.h>
73 #include <SUIT_DataBrowser.h>
74 #include <SUIT_Session.h>
75 #include <SUIT_Study.h>
76 #include <SUIT_FileDlg.h>
77 #include <SUIT_ResourceMgr.h>
78 #include <SUIT_ShortcutMgr.h>
79 #include <SUIT_Tools.h>
80 #include <SUIT_Accel.h>
81 #include <SUIT_MessageBox.h>
82 #include <SUIT_ViewWindow.h>
85 #include <QtxToolBar.h>
86 #include <QtxTreeView.h>
87 #include <QtxMRUAction.h>
88 #include <QtxDockAction.h>
89 #include <QtxDockWidget.h>
90 #include <QtxActionToolMgr.h>
91 #include <QtxSearchTool.h>
92 #include <QtxWorkstack.h>
95 #include <LogWindow.h>
97 #ifndef DISABLE_GLVIEWER
98 #include <GLViewer_Viewer.h>
99 #include <GLViewer_ViewManager.h>
100 #include "LightApp_GLSelector.h"
103 #ifndef DISABLE_PLOT2DVIEWER
104 #include <Plot2d_ViewManager.h>
105 #include <Plot2d_ViewModel.h>
106 #include <Plot2d_ViewWindow.h>
107 #include <Plot2d_ViewFrame.h>
108 #include "LightApp_Plot2dSelector.h"
109 #ifndef DISABLE_SALOMEOBJECT
110 #include <SPlot2d_ViewModel.h>
112 #include <Plot2d_ViewModel.h>
116 #ifndef DISABLE_OCCVIEWER
117 #include <OCCViewer_ViewManager.h>
118 #include <OCCViewer_ViewFrame.h>
119 #include <OCCViewer_ViewPort3d.h>
120 #ifndef DISABLE_SALOMEOBJECT
121 #include <SOCC_ViewModel.h>
123 #include <OCCViewer_ViewModel.h>
125 #include "LightApp_OCCSelector.h"
128 #ifndef DISABLE_VTKVIEWER
129 #ifndef DISABLE_SALOMEOBJECT
130 #include <SVTK_ViewModel.h>
131 #include <SVTK_ViewManager.h>
132 #include "LightApp_VTKSelector.h"
134 #include <VTKViewer_ViewModel.h>
135 #include <VTKViewer_ViewManager.h>
137 #include <VTKViewer_ViewModel.h>
140 #ifndef DISABLE_QXGRAPHVIEWER
141 #include <QxScene_ViewManager.h>
142 #include <QxScene_ViewModel.h>
143 #include <QxScene_ViewWindow.h>
146 #ifndef DISABLE_GRAPHICSVIEW
147 #include "GraphicsView_Viewer.h"
148 #include "GraphicsView_ViewManager.h"
149 #include "LightApp_GVSelector.h"
152 #ifndef DISABLE_PVVIEWER
153 #include "PVViewer_ViewManager.h"
154 #include "PVViewer_ViewWindow.h"
155 #include "PVViewer_ViewModel.h"
158 #ifndef DISABLE_PYVIEWER
159 #include <PyViewer_ViewManager.h>
160 #include <PyViewer_ViewModel.h>
161 #include <PyViewer_ViewWindow.h>
165 #define VISIBILITY_COLUMN_WIDTH 25
171 #include <QStringList>
173 #include <QApplication>
175 #include <QStatusBar>
177 #include <QObjectList>
179 #include <QInputDialog>
180 #include <QFontDatabase>
182 #include <QByteArray>
186 #include <QHeaderView>
191 #include <utilities.h>
193 #define FIRST_HELP_ID 1000000
195 #ifndef DISABLE_SALOMEOBJECT
196 #include <SALOME_InteractiveObject.hxx>
197 #include <SALOME_ListIO.hxx>
200 #include <Standard_Version.hxx>
202 #define ToolBarMarker 0
203 #define DockWidgetMarker 1
205 static const char* imageEmptyIcon[] = {
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "...................."};
229 int LightApp_Application::lastStudyId = 0;
231 // Markers used to parse array with dockable windows and toolbars state.
232 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
233 // in the Qt source code.
235 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
236 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
238 // Format of the Byte array with the windows and toolbar state is:
239 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
241 //Find toolbar marker position in the array in the following way:
242 //since the 'toolbar marker' is not unique, find index of first occurrence of the
243 //'toolbar marker' in the array and check that next string is name of the toolbar
245 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
246 int aResult = -1,tmp = 0;
247 int inputLen = input.length();
248 QDataStream anInputData(&input, QIODevice::ReadOnly);
249 while(tmp < inputLen) {
250 tmp = input.indexOf(QToolBarMarker, tmp + 1);
253 anInputData.device()->seek(tmp);
257 anInputData >> lines;
259 if(lines == 0 && anInputData.atEnd()){
260 //Case then array doesn't contain information about toolbars,
271 if(aFlags.contains(str)) {
280 \return last global id of study
282 int LightApp_Application::studyId()
284 return LightApp_Application::lastStudyId;
287 /*!Create new instance of LightApp_Application.*/
288 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
290 return new LightApp_Application();
293 /*! \var global preferences of LightApp */
294 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
298 \class LightApp_Application
299 Application containing LightApp module
303 LightApp_Application::LightApp_Application()
304 : CAM_Application( false ),
306 myScreenHelper(new LightApp_FullScreenHelper())
308 Q_INIT_RESOURCE( LightApp );
310 STD_TabDesktop* desk = new STD_TabDesktop();
311 desk->setFullScreenAllowed(false);
312 desk->setMinimizeAllowed(false);
316 // initialize auto save timer
317 myAutoSaveTimer = new QTimer( this );
318 myAutoSaveTimer->setSingleShot( true );
319 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
321 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
323 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
324 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
326 desktop()->setWindowIcon( aLogo );
327 desktop()->setDockableMenuBar( false );
328 desktop()->setDockableStatusBar( false );
330 // base logo (salome itself)
331 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
332 // extra logo (salome-based application)
333 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
337 mySelMgr = new LightApp_SelectionMgr( this );
339 myAccel = SUIT_Accel::getAccel();
341 #ifndef DISABLE_OCCVIEWER
342 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
343 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
351 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
355 #ifndef DISABLE_VTKVIEWER
356 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
369 #ifndef DISABLE_PLOT2DVIEWER
370 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
380 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
381 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
382 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
383 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
384 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
387 // Set existing font for the python console in resources
388 if( !aResMgr->hasValue( "PyConsole", "font" ) )
391 QFont f = aResMgr->fontValue( "PyConsole", "font" );
393 QStringList famdb = fdb.families();
395 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
398 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
400 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
403 if ( famdb.contains(aFamily) )
405 f.setFamily( aFamily );
406 aResMgr->setValue( "PyConsole", "font", f );
413 *\li Save window geometry.
414 *\li Save desktop geometry.
415 *\li Save resource maneger.
416 *\li Delete selection manager.
418 LightApp_Application::~LightApp_Application()
421 delete myScreenHelper;
424 /*!Start application.*/
425 void LightApp_Application::start()
427 CAM_Application::start();
430 updateViewManagers();
431 updateCommandsStatus();
434 desktop()->statusBar()->showMessage( "" );
436 LightApp_EventFilter::Init();
439 /*!Closeapplication.*/
440 void LightApp_Application::closeApplication()
442 QProcess::startDetached( "HelpBrowser",
443 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
445 CAM_Application::closeApplication();
448 /*!Gets application name.*/
449 QString LightApp_Application::applicationName() const
451 static QString _app_name;
452 if ( _app_name.isEmpty() )
453 _app_name = tr( "APP_NAME" );
457 /*!Gets application version.*/
458 QString LightApp_Application::applicationVersion() const
460 static QString _app_version;
462 if ( _app_version.isEmpty() )
464 QString resVersion = tr( "APP_VERSION" );
465 if ( resVersion != "APP_VERSION" )
467 _app_version = resVersion;
471 _app_version = GUI_VERSION_STR;
477 /*!Load module by \a name.*/
478 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
480 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
483 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
484 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
485 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
490 /*!Activate module by \a modName*/
491 bool LightApp_Application::activateModule( const QString& modName )
494 CAM_Module* prevMod = activeModule();
497 actName = prevMod->moduleName();
499 if ( actName == modName )
502 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
504 saveDockWindowsState();
506 bool status = CAM_Application::activateModule( modName );
508 updateModuleActions();
516 updateViewManagers();
518 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
519 if ( objectBrowser()->root() != activeStudy()->root() )
520 objectBrowser()->setRoot( activeStudy()->root() );
521 updateObjectBrowser( true );
524 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
529 /*!Gets selection manager.*/
530 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
535 /*!Creat action "New window" for certain type of viewer:*/
536 void LightApp_Application::createActionForViewer( const int id,
538 const QString& suffix,
541 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
542 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
543 QAction* a = createAction( id, // menu action id
550 false, // toggle flag
552 SLOT( onNewWindow() ) ); // slot
553 createMenu( a, parentId, -1 );
558 void LightApp_Application::createActions()
560 CAM_Application::createActions();
562 SUIT_Desktop* desk = desktop();
563 SUIT_ResourceMgr* resMgr = resourceMgr();
566 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
567 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
568 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
572 // - Help for modules
574 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
575 createMenu( separator(), helpMenu, -1, 10 );
576 QStringList aModuleList;
577 modules( aModuleList, false );
578 aModuleList.prepend( "GUI" );
579 aModuleList.prepend( "KERNEL" );
581 int id = LightApp_Application::UserID + FIRST_HELP_ID;
584 foreach( aModule, aModuleList ) {
585 if ( aModule.isEmpty() ) // module title (user name)
587 IMap <QString, QString> helpData; // list of help files for the module
588 QString helpSubMenu; // help submenu name (empty if not needed)
589 QString modName = moduleName( aModule ); // module name
590 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
591 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
592 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
594 if (resMgr->hasValue( modName, "documentation" ) )
595 docSection = resMgr->stringValue(modName, "documentation");
596 else if ( resMgr->hasSection( modName + "_documentation" ) )
597 docSection = modName + "_documentation";
598 if ( !docSection.isEmpty() ) {
599 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
600 QStringList listOfParam = resMgr->parameters( docSection );
601 foreach( QString paramName, listOfParam ) {
602 QString valueStr = resMgr->stringValue( docSection, paramName );
603 if ( !valueStr.isEmpty() ) {
604 QFileInfo fi( valueStr );
605 if ( fi.isRelative() && !modDir.isEmpty() )
606 valueStr = Qtx::addSlash( modDir ) + valueStr;
607 if ( QFile::exists( valueStr ) )
608 helpData.insert( paramName.arg( aModule ), valueStr );
613 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
614 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
615 QString indexFile = idxLst.join( QDir::separator() ); // index file
616 if ( QFile::exists( indexFile ) )
617 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
620 IMapConstIterator<QString, QString > fileIt;
621 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
622 QString helpFileName = fileIt.key();
623 // remove all '//' occurances
624 while ( helpFileName.contains( "//" ) )
625 helpFileName.replace( "//", "" );
626 // obtain submenus hierarchy if given
627 QStringList smenus = helpFileName.split( "/" );
628 helpFileName = smenus.last();
630 QAction* a = createAction( id, helpFileName,
631 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
632 helpFileName, helpFileName,
633 0, desk, false, this, SLOT( onHelpContentsModule() ) );
634 a->setData( fileIt.value() );
635 if ( !helpSubMenu.isEmpty() ) {
636 smenus.prepend( helpSubMenu );
638 // create sub-menus hierarchy
639 int menuId = helpMenu;
640 foreach ( QString subMenu, smenus ) {
641 menuId = createMenu( subMenu, menuId, -1, 0 );
643 createMenu( a, menuId, -1, 0 );
648 // - Additional help items
650 createMenu( separator(), helpMenu, -1, 5 );
652 QStringList addHelpItems = resMgr->parameters( "add_help" );
653 foreach ( QString addHelpItem, addHelpItems ) {
654 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
655 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
656 QAction* a = createAction( id, addHelpItem,
657 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
658 addHelpItem, addHelpItem,
659 0, desk, false, this, SLOT( onHelpContentsModule() ) );
660 a->setData( valueStr );
661 createMenu( a, helpMenu, -1, 5 );
667 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
668 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
669 registerAction( MRUId, mru );
671 // default icon for neutral point ('SALOME' module)
672 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
673 if ( defIcon.isNull() )
674 defIcon = QPixmap( imageEmptyIcon );
676 //! default icon for any module
677 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
678 if ( modIcon.isNull() )
679 modIcon = QPixmap( imageEmptyIcon );
682 modules( modList, false );
684 if ( modList.count() > 1 )
686 LightApp_ModuleAction* moduleAction =
687 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
689 QMap<QString, QString> iconMap;
690 moduleIconNames( iconMap );
692 const int iconSize = 20;
694 QStringList::Iterator it;
695 for ( it = modList.begin(); it != modList.end(); ++it )
697 if ( !isLibExists( *it ) )
700 QString modName = moduleName( *it );
702 if ( !isModuleAccessible( *it ) )
706 if ( iconMap.contains( *it ) )
707 iconName = iconMap[*it];
709 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
713 INFOS ( "\n****************************************************************" << std::endl
714 << "* Icon for " << (*it).toLatin1().constData()
715 << " not found. Using the default one." << std::endl
716 << "****************************************************************" << std::endl );
719 icon = Qtx::scaleIcon( icon, iconSize );
721 moduleAction->insertModule( *it, icon );
724 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
725 this, SLOT( onModuleActivation( const QString& ) ) );
726 registerAction( ModulesListId, moduleAction );
730 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
731 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
733 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
734 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
735 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
736 0, desk, false, this, SLOT( onCloseAllWindow() ) );
737 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
738 0, desk, false, this, SLOT( onGroupAllWindow() ) );
740 createMenu( CloseId, windowMenu, 0, -1 );
741 createMenu( CloseAllId, windowMenu, 0, -1 );
742 createMenu( GroupAllId, windowMenu, 0, -1 );
743 createMenu( separator(), windowMenu, -1, 0 );
745 #ifndef DISABLE_GLVIEWER
746 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
748 #ifndef DISABLE_PLOT2DVIEWER
749 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
751 #ifndef DISABLE_OCCVIEWER
752 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
754 #ifndef DISABLE_VTKVIEWER
755 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
757 #ifndef DISABLE_QXGRAPHVIEWER
758 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
760 #ifndef DISABLE_GRAPHICSVIEW
761 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
763 #ifndef DISABLE_PVVIEWER
764 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
766 #ifndef DISABLE_PYVIEWER
767 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
770 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
771 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
772 createMenu( RenameId, windowMenu, -1 );
774 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
775 createMenu( PreferencesId, fileMenu, 50, -1 );
776 createMenu( separator(), fileMenu, -1, 50, -1 );
778 createMenu( separator(), fileMenu, -1, 100, -1 );
779 createMenu( MRUId, fileMenu, 100, -1 );
780 createMenu( separator(), fileMenu, -1, 100, -1 );
782 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
783 0, desk, false, this, SLOT( onStylePreferences() ) );
785 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
786 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
789 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
790 createMenu( separator(), viewMenu, -1, 20, -1 );
791 createMenu( StyleId, viewMenu, 20, -1 );
792 createMenu( FullScreenId, viewMenu, 20, -1 );
794 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
795 QString( "SalomeModules" ) ); // name (language-independant)
796 createTool( ModulesListId, modTBar );
799 /*!On module activation action.*/
800 void LightApp_Application::onModuleActivation( const QString& modName )
802 // Force user to create/open a study before module activation
803 QMap<QString, QString> iconMap;
804 moduleIconNames( iconMap );
805 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
807 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
809 bool cancelled = false;
811 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
812 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
813 QMap<int, QString> opmap = activateModuleActions();
814 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
815 aDlg.addButton( it.value(), it.key() );
817 int res = aDlg.exec();
819 // some operation is selected
820 moduleActionSelected( res );
824 putInfo( tr("INF_CANCELLED") );
826 LightApp_ModuleAction* moduleAction =
827 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
829 moduleAction->setActiveModule( QString() );
835 activateModule( modName );
838 /*!Default module activation.*/
839 QString LightApp_Application::defaultModule() const
841 QStringList aModuleNames;
842 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
843 //! If there's the one and only module --> activate it automatically
844 //! TODO: Possible improvement - default module can be taken from preferences
845 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
848 /*!On new window slot.*/
849 void LightApp_Application::onNewWindow()
851 const QObject* obj = sender();
852 if ( !obj || !obj->inherits( "QAction" ) )
856 int id = actionId( (QAction*)obj );
859 #ifndef DISABLE_GLVIEWER
861 type = GLViewer_Viewer::Type();
864 #ifndef DISABLE_PLOT2DVIEWER
866 type = Plot2d_Viewer::Type();
869 #ifndef DISABLE_OCCVIEWER
871 type = OCCViewer_Viewer::Type();
874 #ifndef DISABLE_VTKVIEWER
876 type = VTKViewer_Viewer::Type();
879 #ifndef DISABLE_QXGRAPHVIEWER
880 case NewQxSceneViewId:
881 type = QxScene_Viewer::Type();
884 #ifndef DISABLE_GRAPHICSVIEW
885 case NewGraphicsViewId:
886 type = GraphicsView_Viewer::Type();
889 #ifndef DISABLE_PVVIEWER
891 type = PVViewer_Viewer::Type();
894 #ifndef DISABLE_PYVIEWER
896 type = PyViewer_Viewer::Type();
901 if ( !type.isEmpty() )
902 createViewManager( type );
906 SLOT: Creates new document
908 void LightApp_Application::onNewDoc()
910 #ifdef SINGLE_DESKTOP
911 if ( !checkExistingDoc() )
915 //asl: fix for 0020515
916 saveDockWindowsState();
918 CAM_Application::onNewDoc();
922 SLOT: Opens new document
924 void LightApp_Application::onOpenDoc()
926 SUIT_Study* study = activeStudy();
928 #ifdef SINGLE_DESKTOP
929 if ( !checkExistingDoc() )
933 CAM_Application::onOpenDoc();
935 if ( !study ) // new study will be create in THIS application
938 updateViewManagers();
943 SLOT: Opens new document.
944 \param aName - name of file
946 bool LightApp_Application::onOpenDoc( const QString& aName )
948 #ifdef SINGLE_DESKTOP
949 if ( !checkExistingDoc() )
953 saveDockWindowsState();
955 // We should take mru action first because this application instance can be deleted later.
956 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
958 bool res = CAM_Application::onOpenDoc( aName );
963 mru->insert( aName );
965 mru->remove( aName );
971 SLOT: Displays "About" message box
973 void LightApp_Application::onHelpAbout()
975 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
980 Private SLOT: Called on selection is changed
981 Dispatchs active module that selection is changed
983 void LightApp_Application::onSelection()
985 onSelectionChanged();
987 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
988 ((LightApp_Module*)activeModule())->selectionChanged();
993 \param study - SUIT_Study.
995 void LightApp_Application::setActiveStudy( SUIT_Study* study )
997 CAM_Application::setActiveStudy( study );
1001 Enables/Disables menu items and toolbar buttons. Rebuild menu
1003 void LightApp_Application::updateCommandsStatus()
1005 CAM_Application::updateCommandsStatus();
1008 #ifndef DISABLE_GLVIEWER
1009 a = action( NewGLViewId );
1011 a->setEnabled( activeStudy() );
1014 #ifndef DISABLE_PLOT2DVIEWER
1015 a = action( NewPlot2dId );
1017 a->setEnabled( activeStudy() );
1020 #ifndef DISABLE_OCCVIEWER
1021 a = action( NewOCCViewId );
1023 a->setEnabled( activeStudy() );
1026 #ifndef DISABLE_VTKVIEWER
1027 a = action( NewVTKViewId );
1029 a->setEnabled( activeStudy() );
1032 #ifndef DISABLE_QXGRAPHVIEWER
1033 a = action( NewQxSceneViewId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_GRAPHICSVIEW
1039 a = action( NewGraphicsViewId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_PVVIEWER
1045 a = action( NewPVViewId );
1047 a->setEnabled( activeStudy() );
1050 #ifndef DISABLE_PYVIEWER
1051 a = action( NewPyViewerId );
1053 a->setEnabled( activeStudy() );
1059 Runs system command in separate thread
1061 class RunBrowser: public QThread
1064 RunBrowser( LightApp_Application* app,
1065 const QString& theApp,
1066 const QString& theParams,
1067 const QString& theHelpFile,
1068 const QString& theContext = QString() )
1070 myParams( theParams ),
1071 myContext( theContext ),
1075 //For the external browser always specify 'file://' protocol,
1076 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1077 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1082 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1083 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1085 QProcess* proc = new QProcess();
1087 proc->start( aCommand );
1088 if ( !proc->waitForStarted() ) {
1089 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1090 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1091 ce2000->setData( msg );
1092 QApplication::postEvent( myLApp, ce2000 );
1103 LightApp_Application* myLApp;
1107 SLOT: Displays help contents for choosen module
1109 void LightApp_Application::onHelpContentsModule()
1111 const QAction* a = (QAction*) sender();
1112 QString helpFile = a->data().toString();
1113 if ( helpFile.isEmpty() ) return;
1115 SUIT_ResourceMgr* resMgr = resourceMgr();
1118 platform = "winapplication";
1120 platform = "application";
1122 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1124 QString quote("\"");
1125 anApp.prepend( quote );
1126 anApp.append( quote );
1128 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1129 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1131 if( useExtBrowser ) {
1132 if ( !anApp.isEmpty() ) {
1133 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1137 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1138 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1139 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1141 showPreferences( tr( "PREF_APP" ) );
1145 QStringList parameters;
1146 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1147 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1148 parameters << helpFile;
1149 QProcess::startDetached( "HelpBrowser", parameters );
1154 SLOT: Displays help contents for choosen dialog
1156 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1157 const QString& theFileName,
1158 const QString& theContext )
1160 QString fileName = theFileName;
1161 QString context = theContext;
1162 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1163 // context might be passed within theFileName argument
1164 QStringList comps = fileName.split("#");
1165 if ( comps.count() > 1 ) {
1166 context = comps.last();
1168 fileName = comps.join("#");
1172 QString homeDir = "";
1173 if ( !theComponentName.isEmpty() ) {
1174 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1175 if ( !dir.isEmpty() )
1176 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1177 Qtx::addSlash( "share" ) +
1178 Qtx::addSlash( "doc" ) +
1179 Qtx::addSlash( "salome" ) +
1180 Qtx::addSlash( "gui" ) +
1181 Qtx::addSlash( theComponentName ) );
1184 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1185 SUIT_ResourceMgr* resMgr = resourceMgr();
1188 platform = "winapplication";
1190 platform = "application";
1192 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1194 QString quote("\"");
1195 anApp.prepend( quote );
1196 anApp.append( quote );
1199 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1202 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1204 if ( !anApp.isEmpty() ) {
1205 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1209 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1210 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1211 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1212 showPreferences( tr( "PREF_APP" ) );
1216 QStringList parameters;
1217 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1218 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1219 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1220 QProcess::startDetached( "HelpBrowser", parameters );
1225 Sets enable or disable some actions on selection changed.
1227 void LightApp_Application::onSelectionChanged()
1229 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1230 bool canCopy = m ? m->canCopy() : false;
1231 bool canPaste = m ? m->canPaste() : false;
1233 action( EditCopyId )->setEnabled(canCopy);
1234 action( EditPasteId )->setEnabled(canPaste);
1238 SLOT: Performs some actions when dockable windows are triggered
1240 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1244 QWidget* LightApp_Application::dockWindow( const int id ) const
1247 if ( myWin.contains( id ) )
1252 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1257 QDockWidget* dock = 0;
1258 QWidget* w = wid->parentWidget();
1259 while ( w && !dock )
1261 dock = ::qobject_cast<QDockWidget*>( w );
1262 w = w->parentWidget();
1267 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1272 if ( wid != dockWindow( id ) )
1273 removeDockWindow( id );
1275 myWin.insert( id, wid );
1277 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1278 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1280 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1281 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1282 QString( "%1Dock" ).arg( wid->objectName() ) );
1283 dock->setWidget( wid );
1284 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1285 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1286 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1288 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1289 if ( !accel.isEmpty() )
1290 dock->toggleViewAction()->setShortcut( accel );
1295 void LightApp_Application::removeDockWindow( const int id )
1297 QWidget* wid = dockWindow( id );
1303 QDockWidget* dock = windowDock( wid );
1307 dock->setWidget( 0 );
1308 wid->setParent( 0 );
1309 wid->setVisible( false );
1313 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1315 QDockWidget* dock = windowDock( dockWindow( id ) );
1316 if ( dock && desktop() ) {
1317 desktop()->addDockWidget( place, dock );
1318 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1319 if ( a ) a->update();
1325 \param flag - key for window
1326 \param studyId - study id
1327 Flag used how identificator of window in windows list.
1329 QWidget* LightApp_Application::getWindow( const int flag, const int )
1331 QWidget* wid = dockWindow( flag );
1333 insertDockWindow( flag, wid = createWindow( flag ) );
1335 QMap<int, int> winMap;
1336 currentWindows( winMap );
1337 if ( winMap.contains( flag ) )
1338 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1344 \return Object Browser
1346 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1348 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1354 LogWindow* LightApp_Application::logWindow()
1356 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1359 #ifndef DISABLE_PYCONSOLE
1361 This returns the python console integrated to the GUI. Depending
1362 when you request the python console, this function could return
1363 null. Then the optional parameter force (default to false) can be
1364 set to force the creation of the python console if it is not done
1366 \param force - if true, the pythonConsole is created if it does not exist yet
1367 \return Python Console
1369 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1371 QWidget* wid = dockWindow( WT_PyConsole );
1372 if ( !wid && force==true) {
1373 wid = getWindow(WT_PyConsole);
1375 return qobject_cast<PyConsole_Console*>( wid );
1380 Updates object browser and maybe data models
1381 \param updateModels - if it is true, then data models are updated
1383 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1385 // update existing data models
1388 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1389 if ( objectBrowser() )
1390 objectBrowser()->setAutoUpdate( false );
1392 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1394 CAM_Study::ModelList dm_list;
1395 study->dataModels( dm_list );
1396 QListIterator<CAM_DataModel*> it( dm_list );
1397 while ( it.hasNext() ) {
1398 CAM_DataModel* camDM = it.next();
1399 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1400 ((LightApp_DataModel*)camDM)->update();
1404 if( objectBrowser() )
1405 objectBrowser()->setAutoUpdate( isAutoUpdate );
1408 if ( objectBrowser() ) {
1409 objectBrowser()->updateGeometry();
1410 objectBrowser()->updateTree( 0, false );
1417 LightApp_Preferences* LightApp_Application::preferences() const
1419 return preferences( false );
1423 \return first view manager of some type
1424 \param vmType - type of view manager
1425 \param create - is it necessary to create view manager in case, when there is no manager of such type
1427 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1429 SUIT_ViewManager* aVM = viewManager( vmType );
1430 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1432 if ( anActiveVM && anActiveVM->getType() == vmType )
1435 if ( aVM && create )
1437 if ( !aVM->getActiveView() )
1440 desktop()->setActiveWindow( aVM->getActiveView() );
1443 aVM = createViewManager( vmType );
1449 Creates view manager of some type
1450 \param vmType - type of view manager
1452 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1454 SUIT_ResourceMgr* resMgr = resourceMgr();
1456 SUIT_ViewManager* viewMgr = 0;
1457 #ifndef DISABLE_GLVIEWER
1458 if( vmType == GLViewer_Viewer::Type() )
1460 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1461 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1464 #ifndef DISABLE_PLOT2DVIEWER
1465 if( vmType == Plot2d_Viewer::Type() )
1467 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1469 #ifndef DISABLE_SALOMEOBJECT
1470 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1472 new LightApp_Plot2dSelector( v, mySelMgr );
1474 vm = new Plot2d_Viewer();
1476 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1477 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1480 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1481 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1485 #ifndef DISABLE_QXGRAPHVIEWER
1486 if( vmType == QxScene_Viewer::Type() )
1488 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1489 QxScene_Viewer* vm = new QxScene_Viewer();
1490 viewMgr->setViewModel( vm );
1491 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1494 #ifndef DISABLE_GRAPHICSVIEW
1495 if( vmType == GraphicsView_Viewer::Type() )
1497 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1498 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1501 #ifndef DISABLE_PVVIEWER
1502 if( vmType == PVViewer_Viewer::Type() )
1504 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1505 viewMgr->getActiveView()->setFocus();
1508 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1512 #ifndef DISABLE_PYVIEWER
1513 if( vmType == PyViewer_Viewer::Type() )
1515 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1518 #ifndef DISABLE_OCCVIEWER
1519 if( vmType == OCCViewer_Viewer::Type() )
1521 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1522 OCCViewer_Viewer* vm;
1523 #ifndef DISABLE_SALOMEOBJECT
1524 vm = new SOCC_Viewer();
1526 vm = new OCCViewer_Viewer( true );
1528 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1529 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1530 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1531 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1532 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1533 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1534 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1535 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1537 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1538 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1539 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1540 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1541 #if OCC_VERSION_LARGE > 0x06090000
1542 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1543 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1544 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1545 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1546 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1547 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1549 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1550 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1551 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1553 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1554 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1555 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1556 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1557 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1558 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1559 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1560 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1563 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1564 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1567 #ifndef DISABLE_VTKVIEWER
1568 #ifndef DISABLE_SALOMEOBJECT
1569 if ( vmType == SVTK_Viewer::Type() )
1571 if ( vmType == VTKViewer_Viewer::Type() )
1574 #ifndef DISABLE_SALOMEOBJECT
1575 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1576 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1579 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1580 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1581 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1582 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1583 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1584 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1585 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1586 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1587 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1588 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1589 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1590 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1591 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1592 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1593 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1594 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1595 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1596 new LightApp_VTKSelector( vm, mySelMgr );
1599 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1600 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1602 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1610 addViewManager( viewMgr );
1611 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1613 if ( viewWin && desktop() ) {
1614 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1615 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1621 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1623 SUIT_ResourceMgr* resMgr = resourceMgr();
1625 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1627 new LightApp_WgViewModel( vmType, w ) );
1628 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1630 addViewManager( vm );
1631 SUIT_ViewWindow* vw = vm->createViewWindow();
1632 if ( vw && desktop() ) {
1633 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1634 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1637 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1638 myUserWmTypes << vmType;
1643 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1645 SUIT_ResourceMgr* resMgr = resourceMgr();
1647 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1651 QString vmType = vm->getType();
1653 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1655 addViewManager( vm );
1656 SUIT_ViewWindow* vw = vm->createViewWindow();
1657 if ( vw && desktop() ) {
1658 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1659 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1662 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1663 myUserWmTypes << vmType;
1669 SLOT: Removes view manager from application
1671 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1673 removeViewManager( theVM );
1677 Protected SLOT: On study created.
1678 \param theStudy - just created study
1680 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1682 SUIT_DataObject* aRoot = 0;
1683 if ( theStudy && theStudy->root() )
1685 aRoot = theStudy->root();
1686 //aRoot->setName( tr( "DATA_MODELS" ) );
1689 getWindow( WT_ObjectBrowser );
1691 loadDockWindowsState();
1693 if ( objectBrowser() )
1694 objectBrowser()->setRoot( aRoot );
1696 activateModule( defaultModule() );
1698 if ( objectBrowser() )
1699 objectBrowser()->openLevels();
1701 #ifndef DISABLE_PYCONSOLE
1702 if( pythonConsole() )
1703 getPyInterp()->initStudy();
1708 Protected SLOT: On study opened.
1709 \param theStudy - just opened study
1711 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1713 SUIT_DataObject* aRoot = 0;
1714 if ( theStudy && theStudy->root() )
1716 aRoot = theStudy->root();
1720 getWindow( WT_ObjectBrowser );
1722 loadDockWindowsState();
1724 if ( objectBrowser() )
1725 objectBrowser()->setRoot( aRoot );
1727 activateModule( defaultModule() );
1729 if ( objectBrowser() )
1730 objectBrowser()->openLevels();
1732 #ifndef DISABLE_PYCONSOLE
1733 if( pythonConsole() )
1734 getPyInterp()->initStudy();
1740 /*!Protected SLOT. On study saved.*/
1741 void LightApp_Application::onStudySaved( SUIT_Study* s )
1743 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1745 mru->insert( s->studyName() );
1750 /*!Protected SLOT. On study closed.*/
1751 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1754 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1755 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1758 // stop auto-save timer
1759 myAutoSaveTimer->stop();
1761 // Bug 10396: clear selection
1762 mySelMgr->clearSelected();
1764 // Bug 12944: emit signal only after clear selection
1767 activateModule( "" );
1770 /*!Protected SLOT.On desktop activated.*/
1771 void LightApp_Application::onDesktopActivated()
1773 CAM_Application::onDesktopActivated();
1774 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1776 aModule->studyActivated();
1779 void LightApp_Application::studyOpened( SUIT_Study* s )
1781 CAM_Application::studyOpened( s );
1784 updateViewManagers();
1787 void LightApp_Application::studySaved( SUIT_Study* s )
1789 CAM_Application::studyOpened( s );
1790 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1791 if ( aResMgr && activeStudy() ) {
1792 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1793 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1797 void LightApp_Application::studyCreated( SUIT_Study* s )
1799 CAM_Application::studyCreated( s );
1802 updateViewManagers();
1805 /*!Gets file filter.
1806 *\retval QString "(*.bin)"
1808 QString LightApp_Application::getFileFilter() const
1816 Shows file dialog and return user selected file name
1818 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1819 const QString& caption, QWidget* parent )
1823 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1824 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1827 /*! Gets directory*/
1828 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1832 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1835 /*! Get open file names*/
1836 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1837 const QString& caption, QWidget* parent )
1841 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1842 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1845 /*!Private SLOT. Update object browser.*/
1846 void LightApp_Application::onRefresh()
1848 updateObjectBrowser( true );
1851 /*!Private SLOT. Update actions after rename object.*/
1852 void LightApp_Application::onRenamed()
1854 activeStudy()->Modified();
1858 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1859 // To prevent reversion the window should be either aligned during movement and resize.
1860 /*!Private SLOT. Update actions after rename object.*/
1861 /*void LightApp_Application::onMoved()
1863 OCCViewer_ViewManager* viewMgr = 0;
1864 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1866 OCCViewer_ViewWindow* view = 0;
1867 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1869 view->getViewPort()->repaintViewAfterMove();
1874 /*!Private SLOT. Support drag-and-drop operation.*/
1875 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1877 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1881 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1883 aModule->dropObjects( objects, parentObj, row, action );
1886 /*!Private SLOT. On preferences.*/
1887 void LightApp_Application::onPreferences()
1889 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1892 /*!Private SLOT. On preferences.*/
1893 void LightApp_Application::showPreferences( const QString& itemText )
1895 QApplication::setOverrideCursor( Qt::WaitCursor );
1897 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1899 QApplication::restoreOverrideCursor();
1904 preferences()->activateItem( itemText );
1906 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1909 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1910 resourceMgr()->save();
1913 shortcutMgr()->updateShortcuts();
1919 /*!Protected SLOT. On preferences changed.*/
1920 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1922 LightApp_Module* sMod = 0;
1923 CAM_Module* mod = module( modName );
1924 if ( mod && mod->inherits( "LightApp_Module" ) )
1925 sMod = (LightApp_Module*)mod;
1928 sMod->preferencesChanged( section, param );
1930 preferencesChanged( section, param );
1931 // emit signal to allow additional preferences changing processing
1932 emit preferenceChanged( modName, section, param );
1935 /*!Remove all windows from study.*/
1936 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1938 saveDockWindowsState();
1940 if ( SUIT_DataBrowser* ob = objectBrowser() )
1943 CAM_Application::beforeCloseDoc( s );
1946 /*!Update actions.*/
1947 void LightApp_Application::updateActions()
1949 updateCommandsStatus();
1955 SUIT_Study* LightApp_Application::createNewStudy()
1957 LightApp_Application::lastStudyId++;
1959 LightApp_Study* aStudy = new LightApp_Study( this );
1961 // Set up processing of major study-related events
1962 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1963 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1964 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1965 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1971 Creates window by flag.
1972 \param flag - identificator of window type
1974 QWidget* LightApp_Application::createWindow( const int flag )
1978 SUIT_ResourceMgr* resMgr = resourceMgr();
1980 if ( flag == WT_ObjectBrowser )
1982 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1983 ob->setObjectName( "objectBrowser" );
1984 ob->setSortMenuEnabled( true );
1985 ob->setAutoUpdate( true );
1986 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1987 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1989 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1990 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1991 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1993 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1994 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1995 treeModel->setSearcher( this );
1996 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1997 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1999 // Mantis issue 0020136: Drag&Drop in OB
2000 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2002 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2003 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2004 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2005 this, SLOT( onRenamed( ) ) );
2009 // temporary commented
2011 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2013 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2016 // Create OBSelector
2017 new LightApp_OBSelector( ob, mySelMgr );
2019 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2020 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2021 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2022 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2024 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2026 #ifndef DISABLE_PYCONSOLE
2027 else if ( flag == WT_PyConsole )
2029 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
2030 pyCons->setObjectName( "pythonConsole" );
2031 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2032 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
2033 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
2034 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2037 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2040 else if ( flag == WT_LogWindow )
2042 LogWindow* logWin = new LogWindow( desktop() );
2043 logWin->setObjectName( "logWindow" );
2044 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2045 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2047 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2053 \return default windows( Object Browser, Python Console )
2054 Adds to map \a aMap.
2056 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2058 #ifndef DISABLE_PYCONSOLE
2059 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2061 if ( activeStudy() ) {
2062 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2063 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2067 /*!Default view managers*/
2068 void LightApp_Application::defaultViewManagers( QStringList& ) const
2074 \return preferences.
2075 Create preferences, if \a crt = true.
2077 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2082 LightApp_Application* that = (LightApp_Application*)this;
2084 bool toCreate = !_prefs_ && crt;
2087 _prefs_ = new LightApp_Preferences( resourceMgr() );
2088 that->createPreferences( _prefs_ );
2091 that->myPrefs = _prefs_;
2093 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2094 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2095 connect( myPrefs, SIGNAL( resetToDefaults() ),
2096 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2101 SUIT_ResourceMgr* resMgr = resourceMgr();
2103 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2104 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2106 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2110 QStringList modNameList;
2111 app->modules( modNameList, false );
2113 QMap<QString, QString> iconMap;
2114 app->moduleIconNames( iconMap );
2116 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2118 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2121 int modId = _prefs_->addPreference( *it );
2122 if ( iconMap.contains( *it ) )
2123 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2127 app->modules( modList );
2128 QListIterator<CAM_Module*> itr( modList );
2129 while ( itr.hasNext() )
2131 LightApp_Module* mod = 0;
2133 CAM_Module* anItem = itr.next();
2134 if ( anItem->inherits( "LightApp_Module" ) )
2135 mod = (LightApp_Module*)anItem;
2137 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2139 _prefs_->addPreference( mod->moduleName() );
2140 mod->createPreferences();
2141 that->emptyPreferences( mod->moduleName() );
2145 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2151 Adds new module to application
2153 void LightApp_Application::moduleAdded( CAM_Module* mod )
2155 CAM_Application::moduleAdded( mod );
2157 LightApp_Module* lightMod = 0;
2158 if ( mod && mod->inherits( "LightApp_Module" ) )
2159 lightMod = (LightApp_Module*)mod;
2161 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2163 myPrefs->addPreference( mod->moduleName() );
2164 lightMod->createPreferences();
2165 emptyPreferences( mod->moduleName() );
2169 void LightApp_Application::emptyPreferences( const QString& modName )
2171 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2172 if ( !item || !item->isEmpty() )
2175 // printf( "---------------------> Modify for empty module.\n" );
2177 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2178 frm->setIcon( item->icon() );
2179 frm->setStretch( false );
2180 item->parentItem()->insertItem( frm, item );
2181 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2188 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2193 QStringList aValuesList;
2194 QList<QVariant> anIndicesList;
2198 // . Top-level "SALOME" preferences group <<start>>
2199 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2200 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2202 // .. "General" preferences tab <<start>>
2203 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2205 // ... "Language" group <<start>>
2206 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2207 pref->setItemProperty( "columns", 2, langGroup );
2208 // .... -> application language
2209 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2210 LightApp_Preferences::Selector, "language", "language" );
2211 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2212 QList<QVariant> aIcons;
2213 foreach ( QString aLang, aLangs ) {
2214 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2216 pref->setItemProperty( "strings", aLangs, curLang );
2217 pref->setItemProperty( "icons", aIcons, curLang );
2218 pref->setItemProperty( "restart", true, curLang );
2220 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2221 LightApp_Preferences::Bool, "language", "locale" );
2222 pref->setItemProperty( "restart", true, curLocale );
2223 // ... "Language" group <<end>>
2225 // ... "Look and feel" group <<start>>
2226 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2227 pref->setItemProperty( "columns", 2, lookGroup );
2228 // .... -> show splash-screen
2229 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2230 // .... -> opaque resize
2231 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2232 // .... -> drop-down buttons
2233 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2234 // ... "Look and feel" group <<end>>
2236 // ... "Study properties" group <<start>>
2237 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2238 pref->setItemProperty( "columns", 2, studyGroup );
2239 // .... -> multi-file save
2240 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2241 // .... -> ascii save mode
2242 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2243 // .... -> store windows geometry
2244 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2245 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2246 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2247 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2248 // .... -> auto-save
2249 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2250 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2251 pref->setItemProperty( "min", 0, autoSaveInterval );
2252 pref->setItemProperty( "max", 1440, autoSaveInterval );
2253 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2254 // ... "Study properties" group <<end>>
2256 // ... "Help browser" group <<start>>
2257 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2259 QString platform = "winapplication";
2261 QString platform = "application";
2263 // .... -> browser application
2264 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2265 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2266 // .... -> browser parameters
2267 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2268 // ... "Help browser" group <<end>>
2270 // ... "Python console properties" group <<start>>
2271 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2273 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2274 // .... -> show banner
2275 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2276 // ... "Python console properties" group <<end>>
2278 // ... "MRU" preferences group <<start>>
2279 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2280 pref->setItemProperty( "columns", 4, mruGroup );
2281 // number of MRU items
2282 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2283 "MRU", "visible_count" );
2284 pref->setItemProperty( "min", 0, mruVisCount );
2285 pref->setItemProperty( "max", 100, mruVisCount );
2287 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2288 "MRU", "link_type" );
2289 aValuesList.clear();
2290 anIndicesList.clear();
2291 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2292 anIndicesList << 0 << 1 << 2 ;
2293 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2294 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2295 // ... "MRU" preferences group <<end>>
2297 // ... "Full-screen" group <<start>>
2298 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2299 pref->setItemProperty( "columns", 2, fullScreenGroup );
2300 // .... -> automatic hiding toolbars
2301 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2302 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2303 // ... "Full-screen" group <<end>>
2305 // .. "General" preferences tab <<end>>
2307 // .. "3D viewer" group <<start>>
2308 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2309 // ... -> navigation mode
2310 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2311 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2312 aValuesList.clear();
2313 anIndicesList.clear();
2314 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2315 anIndicesList << 0 << 1;
2316 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2317 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2318 // ... -> zooming mode
2319 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2320 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2321 aValuesList.clear();
2322 anIndicesList.clear();
2323 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2324 anIndicesList << 0 << 1;
2325 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2326 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2327 // ... "Trihedron" group <<start>>
2328 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2329 pref->setItemProperty( "columns", 2, occTriGroup );
2330 // .... -> trihedron size
2331 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2332 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2333 pref->setItemProperty( "min", 1.0E-06, occTS );
2334 pref->setItemProperty( "max", 1000, occTS );
2335 // .... -> relative size of trihedron
2336 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2337 // .... -> show static trihedron
2338 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2339 // ... "Trihedron" group <<end>>
2340 // .. "3D viewer" group <<end>>
2344 #ifndef DISABLE_OCCVIEWER
2345 // .. "OCC viewer" group <<start>>
2346 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2348 // .... -> Projection mode
2349 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2350 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2351 aValuesList.clear();
2352 anIndicesList.clear();
2353 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2354 anIndicesList << 0 << 1;
2355 pref->setItemProperty( "strings", aValuesList, occProjMode );
2356 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2357 #if OCC_VERSION_LARGE > 0x06090000
2358 // .... -> Stereo group
2359 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2360 pref->setItemProperty( "columns", 2, stereoGroup );
2361 // .... -> Stereo type
2362 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2363 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2364 aValuesList.clear();
2365 anIndicesList.clear();
2367 OCCViewer_Viewer::stereoData( aValuesList, idList);
2368 foreach( int gid, idList ) anIndicesList << gid;
2369 pref->setItemProperty( "strings", aValuesList, stereoType );
2370 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2372 // .... -> Anaglyph filter
2373 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2374 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2375 aValuesList.clear();
2376 anIndicesList.clear();
2377 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2378 anIndicesList << 0 << 1 << 2;
2380 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2381 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2383 // .... -> Convergence distance type
2384 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2385 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2386 aValuesList.clear();
2387 anIndicesList.clear();
2388 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2389 anIndicesList << 0 << 1;
2390 pref->setItemProperty( "strings", aValuesList, occFocusType );
2391 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2393 // .... -> Stereographic focus value
2394 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2395 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2396 pref->setItemProperty( "precision", 3, focusValue );
2397 pref->setItemProperty( "min", 1.0E-03, focusValue );
2398 pref->setItemProperty( "max", 1.0E03, focusValue );
2399 pref->setItemProperty( "step", 0.05, focusValue );
2402 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2403 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2404 aValuesList.clear();
2405 anIndicesList.clear();
2406 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2407 anIndicesList << 0 << 1;
2408 pref->setItemProperty( "strings", aValuesList, occIODType );
2409 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2411 // .... -> Interocular distance (IOD) value
2412 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2413 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2414 pref->setItemProperty( "precision", 3, IODValue );
2415 pref->setItemProperty( "min", 1.0E-03, IODValue );
2416 pref->setItemProperty( "max", 1.0E03, IODValue );
2417 pref->setItemProperty( "step", 0.05, IODValue );
2419 // .... -> Reverse stereo
2420 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2421 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2422 // .... -> Enable V-Sync
2423 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2424 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2425 // .... -> Enable quad-buffer support
2426 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2427 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2429 // ... "Background" group <<start>>
2430 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2431 // pref->setItemProperty( "columns", 2, bgGroup );
2432 aValuesList.clear();
2433 anIndicesList.clear();
2436 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2437 foreach( int gid, idList ) anIndicesList << gid;
2438 // .... -> 3D viewer background
2439 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2440 LightApp_Preferences::Background, "OCCViewer", "background" );
2441 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2442 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2443 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2444 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2445 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2446 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2447 pref->setItemProperty( "custom_enabled", false, bgId );
2448 pref->setItemProperty( "image_formats", formats, bgId );
2449 // .... -> XZ viewer background
2450 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2451 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2452 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2453 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2454 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2455 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2456 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2457 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2458 pref->setItemProperty( "custom_enabled", false, bgId );
2459 pref->setItemProperty( "image_formats", formats, bgId );
2460 // .... -> YZ viewer background
2461 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2462 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2463 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2464 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2465 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2466 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2467 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2468 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2469 pref->setItemProperty( "custom_enabled", false, bgId );
2470 pref->setItemProperty( "image_formats", formats, bgId );
2471 // .... -> XY viewer background
2472 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2473 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2474 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2475 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2476 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2477 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2478 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2479 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2480 pref->setItemProperty( "custom_enabled", false, bgId );
2481 pref->setItemProperty( "image_formats", formats, bgId );
2482 // ... "Background" group <<end>>
2485 // ... "Selection" group <<start>>
2486 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2487 pref->setItemProperty( "columns", 2, occSelectionGroup );
2488 // .... -> enable preselection
2489 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2490 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2491 // .... -> enable selection
2492 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2493 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2494 // ... "Selection" group <<end>>
2496 // ... "Clipping" group <<start>>
2497 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2498 // .... -> clipping color
2499 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2500 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2501 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2502 pref->setItemProperty( "columns", 2, texturePref );
2503 // .... -> use default texture
2504 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2505 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2506 // .... -> clipping texture
2507 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2508 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2509 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2511 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2512 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2513 // .... -> scale factor
2514 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2515 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2516 pref->setItemProperty( "precision", 3, scaleFactor );
2517 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2518 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2519 pref->setItemProperty( "step", 0.1, scaleFactor );
2520 // ... "Clipping" group <<end>>
2522 // ... "Ray tracing" group <<start>>
2523 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2524 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2525 pref->setItemProperty( "columns", 2, rtPref );
2527 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2528 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2529 pref->setItemProperty( "min", 1, rt_depth );
2530 pref->setItemProperty( "max", 10, rt_depth );
2531 pref->setItemProperty( "step", 1, rt_depth );
2532 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2533 // .... -> specular reflections
2534 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2535 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2536 // .... -> adaptive anti-aliasing
2537 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2538 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2539 // .... -> shadows rendering
2540 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2541 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2542 // .... -> transparent shadow
2543 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2544 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2545 // ... "Ray tracing" group <<end>>
2547 // ... "Light source" group <<start>>
2548 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2549 // .... -> light color
2550 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2551 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2552 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2553 pref->setItemProperty( "columns", 3, directionPref );
2554 // .... -> light direction (dx component)
2555 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2556 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2557 pref->setItemProperty( "precision", 2, light_dx );
2558 pref->setItemProperty( "min", -1.0E03, light_dx );
2559 pref->setItemProperty( "max", 1.0E03, light_dx );
2560 pref->setItemProperty( "step", 0.1, light_dx );
2561 // .... -> light direction (dy component)
2562 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2563 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2564 pref->setItemProperty( "precision", 2, light_dy );
2565 pref->setItemProperty( "min", -1.0E03, light_dy );
2566 pref->setItemProperty( "max", 1.0E03, light_dy );
2567 pref->setItemProperty( "step", 0.1, light_dy );
2568 // .... -> light direction (dz component)
2569 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2570 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2571 pref->setItemProperty( "precision", 2, light_dz );
2572 pref->setItemProperty( "min", -1.0E03, light_dz );
2573 pref->setItemProperty( "max", 1.0E03, light_dz );
2574 pref->setItemProperty( "step", 0.1, light_dz );
2575 // ... "Light source" group <<end>>
2577 // ... -> empty frame (for layout) <<start>>
2578 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2579 pref->setItemProperty( "margin", 0, occGen );
2580 pref->setItemProperty( "columns", 2, occGen );
2581 // ... -> empty frame (for layout) <<end>>
2583 // .. "OCC viewer" group <<end>>
2586 #ifndef DISABLE_VTKVIEWER
2587 // .. "VTK viewer" group <<start>>
2588 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2590 // ... -> empty frame (for layout) <<start>>
2591 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2592 //pref->setItemProperty( "columns", 2, vtkGen );
2593 // .... -> projection mode
2594 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2595 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2596 aValuesList.clear();
2597 anIndicesList.clear();
2598 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2599 anIndicesList << 0 << 1;
2600 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2601 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2603 // .... -> Stereo group
2604 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2605 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2606 // .... -> Stereo type
2607 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2608 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2609 aValuesList.clear();
2610 anIndicesList.clear();
2612 SVTK_Viewer::stereoData( aValuesList, idList);
2613 foreach( int gid, idList ) anIndicesList << gid;
2614 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2615 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2616 // .... -> Anaglyph filter
2617 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2618 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2619 aValuesList.clear();
2620 anIndicesList.clear();
2621 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2622 anIndicesList << 0 << 1 << 2;
2624 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2625 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2627 // .... -> Enable quad-buffer support
2628 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2629 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2631 // .... -> background
2632 aValuesList.clear();
2633 anIndicesList.clear();
2636 #ifndef DISABLE_SALOMEOBJECT
2637 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2639 foreach( int gid, idList ) anIndicesList << gid;
2640 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2641 LightApp_Preferences::Background, "VTKViewer", "background" );
2642 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2643 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2644 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2645 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2646 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2647 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2648 pref->setItemProperty( "custom_enabled", false, bgId );
2649 #ifndef DISABLE_SALOMEOBJECT
2650 pref->setItemProperty( "image_formats", formats, bgId );
2652 // .... -> speed increment
2653 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2654 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2655 pref->setItemProperty( "min", 1, vtkSpeed );
2656 pref->setItemProperty( "max", 1000, vtkSpeed );
2657 // .... -> speed mode
2658 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2659 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2660 aValuesList.clear();
2661 anIndicesList.clear();
2662 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2663 anIndicesList << 0 << 1;
2664 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2665 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2667 // ... "Selection" group <<start>>
2668 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2669 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2670 // .... -> preselection
2671 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2672 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2673 aValuesList.clear();
2674 anIndicesList.clear();
2675 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2676 anIndicesList << 0 << 1 << 2;
2677 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2678 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2679 // .... -> enable selection
2680 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2681 // ... "Selection" group <<end>>
2683 // ... -> empty frame (for layout) <<end>>
2685 // ... space mouse sub-group <<start>>
2686 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2687 //pref->setItemProperty( "columns", 2, vtkSM );
2688 // .... -> decrease speed increment
2689 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2690 LightApp_Preferences::Selector, "VTKViewer",
2691 "spacemouse_func1_btn" );
2692 // .... -> increase speed increment
2693 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2694 LightApp_Preferences::Selector, "VTKViewer",
2695 "spacemouse_func2_btn" );
2696 // .... -> dominant / combined switch
2697 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2698 LightApp_Preferences::Selector, "VTKViewer",
2699 "spacemouse_func5_btn" ); //
2700 aValuesList.clear();
2701 anIndicesList.clear();
2702 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2703 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2704 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2705 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2706 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2707 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2708 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2709 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2710 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2711 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2712 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2713 // ... space mouse sub-group <<end>>
2715 // ... avi recording sub-group <<start>>
2716 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2717 pref->setItemProperty( "columns", 2, vtkRec );
2718 // .... -> recording mode
2719 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2720 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2721 aValuesList.clear();
2722 anIndicesList.clear();
2723 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2724 anIndicesList << 0 << 1;
2725 pref->setItemProperty( "strings", aValuesList, modePref );
2726 pref->setItemProperty( "indexes", anIndicesList, modePref );
2728 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2729 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2730 pref->setItemProperty( "min", 0.1, fpsPref );
2731 pref->setItemProperty( "max", 100, fpsPref );
2733 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2734 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2735 pref->setItemProperty( "min", 1, qualityPref );
2736 pref->setItemProperty( "max", 100, qualityPref );
2737 // .... -> progressive mode
2738 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2739 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2740 // ... avi recording sub-group <<end>>
2742 // ... group names sub-group <<start>>
2743 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2744 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2745 pref->setItemProperty( "columns", 2, vtkGN );
2746 // .... -> text color
2747 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2748 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2749 // .... -> transparency
2750 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2751 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2752 pref->setItemProperty( "min", 0.0, transPref );
2753 pref->setItemProperty( "max", 1.0, transPref );
2754 pref->setItemProperty( "step", 0.1, transPref );
2755 // ... -> group names sub-group <<end>>
2756 // .. "VTK viewer" group <<end>>
2759 // .. "Plot2d viewer" group <<start>>
2760 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2761 //pref->setItemProperty( "columns", 2, plot2dGroup );
2763 // ... -> background
2764 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2765 LightApp_Preferences::Color, "Plot2d", "Background" );
2766 // ... -> selection color
2767 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2768 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2770 // ... "Viewer" group <<start>>
2771 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2773 // .... -> curve type
2774 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2775 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2776 aValuesList.clear();
2777 anIndicesList.clear();
2778 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2779 anIndicesList << 0 << 1 << 2 ;
2780 pref->setItemProperty( "strings", aValuesList, curveType );
2781 pref->setItemProperty( "indexes", anIndicesList, curveType );
2782 // .... -> marker size
2783 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2784 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2785 pref->setItemProperty( "min", 0, markerSize );
2786 pref->setItemProperty( "max", 100, markerSize );
2787 // .... -> horizontal scaling mode
2788 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2789 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2790 aValuesList.clear();
2791 anIndicesList.clear();
2792 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2793 anIndicesList << 0 << 1 ;
2794 pref->setItemProperty( "strings", aValuesList, horScale );
2795 pref->setItemProperty( "indexes", anIndicesList, horScale );
2796 // .... -> vertical scaling mode
2797 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2798 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2799 pref->setItemProperty( "strings", aValuesList, verScale );
2800 pref->setItemProperty( "indexes", anIndicesList, verScale );
2802 // .... -> errors/deviation colot
2803 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2804 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2805 // .... -> deviation markers line size
2806 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2807 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2808 pref->setItemProperty( "min", 1, deviationMarkerLw );
2809 pref->setItemProperty( "max", 5, deviationMarkerLw );
2810 // .... -> deviation markers tick mark size
2811 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2812 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2813 pref->setItemProperty( "min", 1, deviationMarkerTs );
2814 pref->setItemProperty( "max", 5, deviationMarkerTs );
2815 // .... "Viewer" group <<end>>
2817 // ... "Legend" group <<start>>
2818 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2820 // .... -> show legend
2821 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2822 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2823 // .... -> legend position
2824 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2825 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2826 aValuesList.clear();
2827 anIndicesList.clear();
2828 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2829 anIndicesList << 0 << 1 << 2 << 3 ;
2830 pref->setItemProperty( "strings", aValuesList, legendPosition );
2831 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2832 // .... -> Symbol type
2833 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2834 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2835 aValuesList.clear();
2836 anIndicesList.clear();
2837 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2838 anIndicesList << 0 << 1 ;
2839 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2840 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2841 // .... -> legend font
2842 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2843 // ... -> font color
2844 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2845 // ... -> selection font color
2846 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2847 // ... "Legend" group <<end>>
2849 // .. "Plot2d viewer" group <<end>>
2851 // .. "PyViewer" preferences tab <<start>>
2852 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2853 // ... "Font settings" group <<start>>
2854 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2855 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2856 LightApp_Preferences::Font, "PyEditor", "Font" );
2857 // ... "Font settings" group <<end>>
2858 // ... "Display settings" group <<start>>
2859 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2860 pref->setItemProperty( "columns", 2, pyDispGroup );
2861 // ... -> current line highlight
2862 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2863 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2864 // ... -> text wrapping
2865 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2866 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2867 // ... -> center cursor on scroll
2868 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2869 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2870 // ... -> line numbers area
2871 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2872 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2873 // ... "Display settings" group <<end>>
2874 // ... "Tab settings" group <<start>>
2875 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2876 pref->setItemProperty( "columns", 2, pyTabGroup );
2877 // ... -> tab whitespaces
2878 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2879 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2881 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2882 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2883 // ... "Tab settings" group <<end>>
2884 // ... "Vertical edge settings" group <<start>>
2885 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2886 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2887 // ... -> vertical edge
2888 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2889 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2890 // ... -> number of columns
2891 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2892 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2893 // ... "Vertical edge settings" group <<end>>
2894 // .. "PyEditor" preferences tab <<end>>
2896 // .. "Directories" preferences tab <<start>>
2897 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2898 // ... --> quick directories list
2899 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2900 pref->addPreference( tr( "" ), dirGroup,
2901 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2902 // .. "Directories" preferences tab <<end>>
2904 // .. "Object browser" preferences tab <<start>>
2905 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2907 // ... "Search tool" group <<start>>
2908 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2909 // .... --> auto-hide
2910 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2911 "ObjectBrowser", "auto_hide_search_tool" );
2912 // ... "Search tool" group <<end>>
2914 // ... "Object browser settings" group <<start>>
2915 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2916 pref->setItemProperty( "columns", 2, objSetGroup );
2917 // .... -> auto size first column
2918 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2919 "ObjectBrowser", "auto_size_first" );
2920 // .... -> auto size other columns
2921 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2922 "ObjectBrowser", "auto_size" );
2923 // .... -> resize columns on expand item
2924 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2925 "ObjectBrowser", "resize_on_expand_item" );
2926 // .... -> browse to published object
2927 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2928 "ObjectBrowser", "browse_published_object" );
2929 aValuesList.clear();
2930 anIndicesList.clear();
2931 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2932 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2933 pref->setItemProperty( "strings", aValuesList, browsePublished );
2934 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2935 // ... "Object browser settings" group <<end>>
2936 // .. "Object browser" preferences tab <<end>>
2938 // .. "Shortcuts" preferences tab <<start>>
2939 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2940 // ... "Shortcuts settings" group <<start>>
2941 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2942 pref->addPreference( tr( "" ), shortcutGroup,
2943 LightApp_Preferences::ShortcutTree, "shortcuts" );
2944 // ... "Shortcuts settings" group <<end>>
2945 // .. "Shortcuts" preferences tab <<end>>
2946 // . Top-level "SALOME" preferences group <<end>>
2952 Changes appearance of application according to changed preferences
2953 \param sec - section
2954 \param param - name of changed parameter
2956 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2958 SUIT_ResourceMgr* resMgr = resourceMgr();
2962 if ( sec == "viewers" && param == "drop_down_buttons" )
2964 ViewManagerList vmlist = viewManagers();
2965 foreach( SUIT_ViewManager* vm, vmlist )
2967 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2968 foreach( SUIT_ViewWindow* vw, vwlist )
2969 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2973 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2975 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2976 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2977 QList<SUIT_ViewManager*> lst;
2978 #ifndef DISABLE_OCCVIEWER
2979 viewManagers( OCCViewer_Viewer::Type(), lst );
2980 QListIterator<SUIT_ViewManager*> itOCC( lst );
2981 while ( itOCC.hasNext() && sz >= 0 )
2983 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2984 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2987 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2988 occVM->setTrihedronSize( sz, relative );
2989 occVM->getAISContext()->UpdateCurrentViewer();
2992 #ifndef DISABLE_VTKVIEWER
2993 #ifndef DISABLE_SALOMEOBJECT
2994 viewManagers( SVTK_Viewer::Type(), lst );
2995 QListIterator<SUIT_ViewManager*> itVTK( lst );
2996 while ( itVTK.hasNext() && sz >= 0 )
2998 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2999 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3002 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3005 vtkVM->setTrihedronSize( sz, relative );
3013 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3015 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3016 QList<SUIT_ViewManager*> lst;
3017 #ifndef DISABLE_OCCVIEWER
3018 viewManagers( OCCViewer_Viewer::Type(), lst );
3019 QListIterator<SUIT_ViewManager*> itOCC( lst );
3020 while ( itOCC.hasNext() )
3022 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3023 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3026 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3029 occVM->setStaticTrihedronDisplayed( isVisible );
3033 #ifndef DISABLE_VTKVIEWER
3034 #ifndef DISABLE_SALOMEOBJECT
3035 viewManagers( SVTK_Viewer::Type(), lst );
3036 QListIterator<SUIT_ViewManager*> itVTK( lst );
3037 while ( itVTK.hasNext() )
3039 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3040 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3043 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3046 vtkVM->setStaticTrihedronVisible( isVisible );
3054 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3056 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3057 QList<SUIT_ViewManager*> lst;
3058 #ifndef DISABLE_OCCVIEWER
3059 viewManagers( OCCViewer_Viewer::Type(), lst );
3060 QListIterator<SUIT_ViewManager*> itOCC( lst );
3061 while ( itOCC.hasNext() )
3063 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3064 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3067 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3068 occVM->setInteractionStyle( mode );
3071 #ifndef DISABLE_VTKVIEWER
3072 #ifndef DISABLE_SALOMEOBJECT
3073 viewManagers( SVTK_Viewer::Type(), lst );
3074 QListIterator<SUIT_ViewManager*> itVTK( lst );
3075 while ( itVTK.hasNext() )
3077 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3078 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3081 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3082 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3088 #ifndef DISABLE_OCCVIEWER
3089 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3091 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3092 QList<SUIT_ViewManager*> lst;
3093 viewManagers( OCCViewer_Viewer::Type(), lst );
3094 QListIterator<SUIT_ViewManager*> it( lst );
3095 while ( it.hasNext() )
3097 SUIT_ViewModel* vm = it.next()->getViewModel();
3098 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3101 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3102 occVM->enablePreselection( isToEnablePreselection );
3107 #ifndef DISABLE_OCCVIEWER
3108 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3110 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3111 QList<SUIT_ViewManager*> lst;
3112 viewManagers( OCCViewer_Viewer::Type(), lst );
3113 QListIterator<SUIT_ViewManager*> it( lst );
3114 while ( it.hasNext() )
3116 SUIT_ViewModel* vm = it.next()->getViewModel();
3117 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3120 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3121 occVM->enableSelection( isToEnableSelection );
3126 #ifndef DISABLE_OCCVIEWER
3127 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3129 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3130 QList<SUIT_ViewManager*> lst;
3131 viewManagers( OCCViewer_Viewer::Type(), lst );
3132 QListIterator<SUIT_ViewManager*> it( lst );
3133 while ( it.hasNext() )
3135 SUIT_ViewModel* vm = it.next()->getViewModel();
3136 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3139 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3140 occVM->setClippingColor( aColor );
3145 #ifndef DISABLE_OCCVIEWER
3146 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3147 param == QString( "clipping_texture" ) ||
3148 param == QString( "clipping_modulate" ) ||
3149 param == QString( "clipping_scale" ) ) )
3151 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3152 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3153 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3154 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3155 QList<SUIT_ViewManager*> lst;
3156 viewManagers( OCCViewer_Viewer::Type(), lst );
3157 QListIterator<SUIT_ViewManager*> it( lst );
3158 while ( it.hasNext() )
3160 SUIT_ViewModel* vm = it.next()->getViewModel();
3161 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3164 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3165 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3170 #ifndef DISABLE_OCCVIEWER
3171 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3173 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3174 QList<SUIT_ViewManager*> lst;
3175 viewManagers( OCCViewer_Viewer::Type(), lst );
3176 QListIterator<SUIT_ViewManager*> it( lst );
3177 while ( it.hasNext() )
3179 SUIT_ViewModel* vm = it.next()->getViewModel();
3180 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3183 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3184 occVM->setProjectionType( mode );
3188 #if OCC_VERSION_LARGE > 0x06090000
3189 #ifndef DISABLE_OCCVIEWER
3190 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3192 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3193 QList<SUIT_ViewManager*> lst;
3194 viewManagers( OCCViewer_Viewer::Type(), lst );
3195 QListIterator<SUIT_ViewManager*> it( lst );
3196 while ( it.hasNext() )
3198 SUIT_ViewModel* vm = it.next()->getViewModel();
3199 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3202 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3203 occVM->setStereoType( mode );
3208 #ifndef DISABLE_OCCVIEWER
3209 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3211 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3212 QList<SUIT_ViewManager*> lst;
3213 viewManagers( OCCViewer_Viewer::Type(), lst );
3214 QListIterator<SUIT_ViewManager*> it( lst );
3215 while ( it.hasNext() )
3217 SUIT_ViewModel* vm = it.next()->getViewModel();
3218 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3221 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3222 occVM->setAnaglyphFilter( mode );
3227 #ifndef DISABLE_OCCVIEWER
3228 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3229 param == QString( "focus_value" ) ) )
3231 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3232 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3233 QList<SUIT_ViewManager*> lst;
3234 viewManagers( OCCViewer_Viewer::Type(), lst );
3235 QListIterator<SUIT_ViewManager*> it( lst );
3236 while ( it.hasNext() )
3238 SUIT_ViewModel* vm = it.next()->getViewModel();
3239 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3242 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3243 occVM->setStereographicFocus( aType, aValue );
3248 #ifndef DISABLE_OCCVIEWER
3249 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3250 param == QString( "iod_value" ) ) )
3252 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3253 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3254 QList<SUIT_ViewManager*> lst;
3255 viewManagers( OCCViewer_Viewer::Type(), lst );
3256 QListIterator<SUIT_ViewManager*> it( lst );
3257 while ( it.hasNext() )
3259 SUIT_ViewModel* vm = it.next()->getViewModel();
3260 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3263 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3264 occVM->setInterocularDistance( aType, aValue );
3269 #ifndef DISABLE_OCCVIEWER
3270 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3272 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3273 QList<SUIT_ViewManager*> lst;
3274 viewManagers( OCCViewer_Viewer::Type(), lst );
3275 QListIterator<SUIT_ViewManager*> it( lst );
3276 while ( it.hasNext() )
3278 SUIT_ViewModel* vm = it.next()->getViewModel();
3279 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3282 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3283 occVM->setReverseStereo( reverse );
3288 #ifndef DISABLE_OCCVIEWER
3289 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3291 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3292 QList<SUIT_ViewManager*> lst;
3293 viewManagers( OCCViewer_Viewer::Type(), lst );
3294 QListIterator<SUIT_ViewManager*> it( lst );
3295 while ( it.hasNext() )
3297 SUIT_ViewModel* vm = it.next()->getViewModel();
3298 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3301 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3302 occVM->setVSync( enable );
3307 #ifndef DISABLE_OCCVIEWER
3308 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3310 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3311 QList<SUIT_ViewManager*> lst;
3312 viewManagers( OCCViewer_Viewer::Type(), lst );
3313 QListIterator<SUIT_ViewManager*> it( lst );
3314 while ( it.hasNext() )
3316 SUIT_ViewModel* vm = it.next()->getViewModel();
3317 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3320 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3321 occVM->setQuadBufferSupport( enable );
3326 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3328 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3329 QList<SUIT_ViewManager*> lst;
3330 #ifndef DISABLE_OCCVIEWER
3331 viewManagers( OCCViewer_Viewer::Type(), lst );
3332 QListIterator<SUIT_ViewManager*> itOCC( lst );
3333 while ( itOCC.hasNext() )
3335 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3336 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3339 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3340 occVM->setZoomingStyle( mode );
3343 #ifndef DISABLE_VTKVIEWER
3344 #ifndef DISABLE_SALOMEOBJECT
3345 viewManagers( SVTK_Viewer::Type(), lst );
3346 QListIterator<SUIT_ViewManager*> itVTK( lst );
3347 while ( itVTK.hasNext() )
3349 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3350 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3353 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3354 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3360 #ifndef DISABLE_VTKVIEWER
3361 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3363 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3364 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3365 QList<SUIT_ViewManager*> lst;
3366 #ifndef DISABLE_SALOMEOBJECT
3367 viewManagers( SVTK_Viewer::Type(), lst );
3368 QListIterator<SUIT_ViewManager*> it( lst );
3369 while ( it.hasNext() )
3371 SUIT_ViewModel* vm = it.next()->getViewModel();
3372 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3375 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3376 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3382 #ifndef DISABLE_VTKVIEWER
3383 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3385 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3386 QList<SUIT_ViewManager*> lst;
3387 #ifndef DISABLE_SALOMEOBJECT
3388 viewManagers( SVTK_Viewer::Type(), lst );
3389 QListIterator<SUIT_ViewManager*> it( lst );
3390 while ( it.hasNext() )
3392 SUIT_ViewModel* vm = it.next()->getViewModel();
3393 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3396 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3397 if( vtkVM ) vtkVM->setProjectionMode( mode );
3403 #ifndef DISABLE_VTKVIEWER
3404 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3406 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3407 QList<SUIT_ViewManager*> lst;
3408 #ifndef DISABLE_SALOMEOBJECT
3409 viewManagers( SVTK_Viewer::Type(), lst );
3410 QListIterator<SUIT_ViewManager*> it( lst );
3411 while ( it.hasNext() )
3413 SUIT_ViewModel* vm = it.next()->getViewModel();
3414 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3417 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3418 if( vtkVM ) vtkVM->setStereoType( mode );
3424 #ifndef DISABLE_VTKVIEWER
3425 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3427 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3428 QList<SUIT_ViewManager*> lst;
3429 #ifndef DISABLE_SALOMEOBJECT
3430 viewManagers( SVTK_Viewer::Type(), lst );
3431 QListIterator<SUIT_ViewManager*> it( lst );
3432 while ( it.hasNext() )
3434 SUIT_ViewModel* vm = it.next()->getViewModel();
3435 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3438 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3439 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3445 #ifndef DISABLE_VTKVIEWER
3446 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3448 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3449 QList<SUIT_ViewManager*> lst;
3450 #ifndef DISABLE_SALOMEOBJECT
3451 viewManagers( SVTK_Viewer::Type(), lst );
3452 QListIterator<SUIT_ViewManager*> it( lst );
3453 while ( it.hasNext() )
3455 SUIT_ViewModel* vm = it.next()->getViewModel();
3456 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3459 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3460 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3466 #ifndef DISABLE_VTKVIEWER
3467 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3469 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3470 QList<SUIT_ViewManager*> lst;
3471 #ifndef DISABLE_SALOMEOBJECT
3472 viewManagers( SVTK_Viewer::Type(), lst );
3473 QListIterator<SUIT_ViewManager*> it( lst );
3474 while ( it.hasNext() )
3476 SUIT_ViewModel* vm = it.next()->getViewModel();
3477 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3480 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3481 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3487 #ifndef DISABLE_VTKVIEWER
3488 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3490 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3491 QList<SUIT_ViewManager*> lst;
3492 #ifndef DISABLE_SALOMEOBJECT
3493 viewManagers( SVTK_Viewer::Type(), lst );
3494 QListIterator<SUIT_ViewManager*> it( lst );
3495 while ( it.hasNext() )
3497 SUIT_ViewModel* vm = it.next()->getViewModel();
3498 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3501 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3502 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3508 #ifndef DISABLE_VTKVIEWER
3509 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3510 param == QString( "spacemouse_func2_btn" ) ||
3511 param == QString( "spacemouse_func5_btn" ) ) )
3513 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3514 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3515 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3516 QList<SUIT_ViewManager*> lst;
3517 #ifndef DISABLE_SALOMEOBJECT
3518 viewManagers( SVTK_Viewer::Type(), lst );
3519 QListIterator<SUIT_ViewManager*> it( lst );
3520 while ( it.hasNext() )
3522 SUIT_ViewModel* vm = it.next()->getViewModel();
3523 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3526 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3527 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3532 if( sec=="ObjectBrowser" )
3534 SUIT_DataBrowser* ob = objectBrowser();
3538 if ( param=="auto_size_first" )
3540 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3541 ob->setAutoSizeFirstColumn( autoSizeFirst );
3542 if ( autoSizeFirst )
3543 ob->adjustFirstColumnWidth();
3545 else if ( param=="auto_size" ) {
3546 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3547 ob->setAutoSizeColumns(autoSize);
3549 ob->adjustColumnsWidth();
3551 else if ( param=="resize_on_expand_item" ) {
3552 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3553 ob->setResizeOnExpandItem(resizeOnExpandItem);
3555 else if ( param == "auto_hide_search_tool" ) {
3556 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3562 if( param=="auto_save_interval" ) {
3563 myAutoSaveTimer->stop();
3564 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3565 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3569 #ifndef DISABLE_PYCONSOLE
3570 if( sec=="PyConsole" && pythonConsole() )
3572 if ( param=="font" ) {
3573 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3575 else if ( param=="show_banner" ) {
3576 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3583 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3585 if ( param == "visible_count" )
3586 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3587 else if ( param == "max_count" )
3588 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3589 else if ( param == "insert_mode" )
3590 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3591 else if ( param == "link_type" )
3592 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3593 else if ( param == "show_clear" )
3594 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3595 else if ( param == "show_mru" )
3596 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3599 if ( sec == "language" && param == "language" )
3601 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3602 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3604 if ( sec == "language" && param == "locale")
3606 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3607 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3609 if ( sec == "desktop" && param == "opaque_resize" ) {
3610 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3611 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3612 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3613 else dopts &= ~QMainWindow::AnimatedDocks;
3614 desktop()->setDockOptions( dopts );
3615 desktop()->setOpaqueResize( opaqueResize );
3616 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3617 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3620 #ifndef DISABLE_PLOT2DVIEWER
3621 QList<SUIT_ViewManager*> lst;
3622 viewManagers( Plot2d_Viewer::Type(), lst );
3623 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3624 while ( itPlot2d.hasNext() ) {
3625 SUIT_ViewManager* viewMgr = itPlot2d.next();
3626 SUIT_ViewModel* vm = viewMgr->getViewModel();
3627 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3630 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3632 viewMgr->setViewModel( vm );
3633 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3635 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3636 frame->SetPreference();
3641 #ifndef DISABLE_PYVIEWER
3642 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3643 param == QString( "LineNumberArea" ) ||
3644 param == QString( "TextWrapping" ) ||
3645 param == QString( "CenterCursorOnScroll" ) ||
3646 param == QString( "TabSpaceVisible" ) ||
3647 param == QString( "TabSize" ) ||
3648 param == QString( "VerticalEdge" ) ||
3649 param == QString( "NumberColumns" ) ||
3650 param == QString( "Font" ) ) )
3652 QList<SUIT_ViewManager*> lst;
3653 viewManagers( PyViewer_Viewer::Type(), lst );
3654 QListIterator<SUIT_ViewManager*> itPy( lst );
3655 while ( itPy.hasNext() )
3657 SUIT_ViewManager* viewMgr = itPy.next();
3658 SUIT_ViewModel* vm = viewMgr->getViewModel();
3659 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3662 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3664 viewMgr->setViewModel( vm );
3665 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3668 pyView->setPreferences();
3678 void LightApp_Application::loadPreferences()
3680 CAM_Application::loadPreferences();
3682 SUIT_ResourceMgr* aResMgr = resourceMgr();
3687 static bool mru_load = true;
3690 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3692 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3693 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3694 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3695 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3696 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3697 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3698 mru->loadLinks( aResMgr, "MRU" );
3704 QStringList mods = aResMgr->parameters( "windows_visibility" );
3705 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3708 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3709 myWinVis.insert( *itr, arr );
3713 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3714 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3715 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3716 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3717 else dopts &= ~QMainWindow::AnimatedDocks;
3718 desktop()->setDockOptions( dopts );
3719 desktop()->setOpaqueResize( opaqueResize );
3720 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3721 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3728 void LightApp_Application::savePreferences()
3730 CAM_Application::savePreferences();
3732 saveDockWindowsState();
3734 SUIT_ResourceMgr* aResMgr = resourceMgr();
3739 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3741 mru->saveLinks( aResMgr, "MRU" );
3743 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3744 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3747 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3749 #if GUI_DEVELOPMENT > 0
3750 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3752 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3759 Updates desktop title
3761 void LightApp_Application::updateDesktopTitle()
3763 QString aTitle = applicationName();
3764 QString aVer = applicationVersion();
3765 if ( !aVer.isEmpty() )
3766 aTitle += QString( " " ) + aVer;
3768 if ( activeStudy() ) {
3769 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3770 aTitle += QString( " - [%1]" ).arg( sName );
3773 desktop()->setWindowTitle( aTitle );
3777 \brief Get map of the operations which can be performed
3778 on the module activation.
3780 The method should return the map of the kind \c {<id>:<name>}
3781 where \c <id> is an integer identifier of the operation and
3782 \c <name> is a title for the button to be added to the
3783 dialog box. After user selects the required operation by the
3784 clicking the corresponding button in the dialog box, its identifier
3785 is passed to the moduleActionSelected() method to process
3788 \return map of the operations
3789 \sa moduleActionSelected()
3791 QMap<int, QString> LightApp_Application::activateModuleActions() const
3793 QMap<int, QString> opmap;
3794 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3795 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3800 \brief Called when the used selectes required operation chosen
3801 from "Activate module" dialog box.
3803 Performs the required operation according to the user choice.
3805 \param id operation identifier
3806 \sa activateModuleActions()
3808 void LightApp_Application::moduleActionSelected( const int id )
3823 Updates windows after close document
3825 void LightApp_Application::afterCloseDoc()
3829 CAM_Application::afterCloseDoc();
3833 Updates actions of active module
3835 void LightApp_Application::updateModuleActions()
3838 if ( activeModule() ) {
3839 modName = activeModule()->moduleName();
3840 if ( !isModuleAccessible( modName ) ) {
3841 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3842 foreach( SUIT_Application* app, apps ) {
3843 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3844 if ( lapp && lapp != this )
3845 lapp->removeModuleAction( modName );
3850 LightApp_ModuleAction* moduleAction =
3851 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3853 moduleAction->setActiveModule( modName );
3856 void LightApp_Application::removeModuleAction( const QString& modName )
3858 LightApp_ModuleAction* moduleAction =
3859 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3861 moduleAction->removeModule( modName );
3865 Gets current windows.
3866 \param winMap - output current windows map.
3868 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3871 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3872 ((LightApp_Module*)activeModule())->windows( winMap );
3874 defaultWindows( winMap );
3878 Gets current view managers.
3879 \param lst - output current view managers list.
3881 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3884 if ( !activeStudy() )
3887 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3888 ((LightApp_Module*)activeModule())->viewManagers( lst );
3890 defaultViewManagers( lst );
3896 void LightApp_Application::updateWindows()
3898 QMap<int, int> winMap;
3899 currentWindows( winMap );
3901 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3903 if ( !dockWindow( it.key() ) )
3904 getWindow( it.key() );
3907 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3909 QWidget* wid = it.value();
3910 if ( winMap.contains( it.key() ) )
3911 wid->setVisible( true );
3916 loadDockWindowsState();
3920 Updates view managers
3922 void LightApp_Application::updateViewManagers()
3925 currentViewManagers( lst );
3927 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3928 getViewManager( *it, true );
3932 Loads windows geometry
3934 void LightApp_Application::loadDockWindowsState()
3938 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3939 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3940 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3943 if ( activeModule() )
3944 modName = activeModule()->name();
3945 else if ( activeStudy() )
3946 modName = "nomodule";
3948 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3949 QByteArray aDefaultState;
3950 aResMgr->value( "windows_geometry", modName, aDefaultState );
3951 QByteArray aDefaultVisibility;
3952 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3953 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3954 aResMgr->setWorkingMode( prevMode );
3956 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3959 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3960 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3962 if ( version > Qtx::versionToId( "7.4.1" ) )
3963 aResMgr->value( "windows_geometry", modName , arr );
3965 arr = aDefaultState;
3966 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3967 desktop()->restoreState( aTargetArray );
3970 QStringList mainToolbarsNames;
3971 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3972 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3973 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3975 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3978 QMap<QString, bool> *tbMap = 0;
3979 QMap<QString, bool> *dwMap = 0;
3981 QMap<QString, bool> userTbMap, userDwMap;
3982 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3984 QMap<QString, bool> defaultTbMap, defaultDwMap;
3985 if(hasDefaultVisibility) {
3986 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3992 if(hasDefaultVisibility){
3993 tbMap = &defaultTbMap;
4000 if(hasDefaultVisibility){
4001 dwMap = &defaultDwMap;
4006 QList<QToolBar*> tbList = findToolBars();
4007 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4009 QToolBar* tb = *tit;
4010 if ( tbMap->contains( tb->objectName() ) ) {
4011 tb->setVisible( (*tbMap)[tb->objectName()] );
4017 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4018 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4020 QDockWidget* dw = *dit;
4022 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4023 if ( po != desktop() )
4026 if ( dwMap->contains( dw->objectName() ) )
4027 dw->setVisible( (*dwMap)[dw->objectName()] );
4035 Saves windows geometry
4037 void LightApp_Application::saveDockWindowsState()
4042 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4043 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4045 if( !storeWin && !storeTb )
4049 if ( activeModule() )
4050 modName = activeModule()->name();
4051 else if ( activeStudy() )
4052 modName = "nomodule";
4054 QString versionId = GUI_VERSION_STR;
4055 #if GUI_DEVELOPMENT > 0
4059 QByteArray arr = desktop()->saveState();
4060 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4061 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4064 if ( myWinVis.contains( modName ) )
4065 visArr = myWinVis[modName];
4067 QMap<QString, bool> tbMap, dwMap;
4068 dockWindowsState( visArr, tbMap, dwMap );
4070 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4071 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4074 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4077 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4078 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4080 QDockWidget* wid = *it;
4081 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4084 visArr = dockWindowsState( tbMap, dwMap );
4086 myWinVis.insert( modName, visArr );
4089 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4092 QDataStream stream( &visArr, QIODevice::WriteOnly );
4094 stream << (uchar)ToolBarMarker;
4095 stream << tb.size();
4096 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4098 stream << tit.key();
4099 stream << (uchar)( tit.value() ? 1 : 0 );
4102 stream << (uchar)DockWidgetMarker;
4103 stream << dw.size();
4104 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4106 stream << wit.key();
4107 stream << (uchar)( wit.value() ? 1 : 0 );
4113 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4118 QByteArray visArr = arr;
4119 QDataStream stream( &visArr, QIODevice::ReadOnly );
4123 if ( marker != ToolBarMarker )
4128 for ( int i = 0; i < lines; ++i )
4131 stream >> objectName;
4134 tb.insert( objectName, shown );
4138 if ( marker != DockWidgetMarker )
4142 for ( int j = 0; j < lines; ++j )
4145 stream >> objectName;
4148 dw.insert( objectName, shown );
4153 Adds icon names for modules
4155 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4159 SUIT_ResourceMgr* resMgr = resourceMgr();
4163 QStringList modList;
4164 modules( modList, false );
4166 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4168 QString modName = *it;
4169 QString modIntr = moduleName( modName );
4170 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4172 if ( modIcon.isEmpty() )
4175 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4176 modIcon += QString( ".png" );
4178 iconMap.insert( modName, modIcon );
4183 Inserts items in popup, which necessary for current application
4185 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4188 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4189 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4190 selMgr->setSelectionCacheEnabled( true );
4192 SUIT_DataBrowser* ob = objectBrowser();
4194 CAM_Application::contextMenuPopup( type, thePopup, title );
4196 if ( ob && type == ob->popupClientType() ) {
4197 thePopup->addSeparator();
4198 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4199 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4200 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4203 #ifndef DISABLE_SALOMEOBJECT
4204 if ( selMgr && ob ) {
4205 SALOME_ListIO selected;
4206 selMgr->selectedObjects( selected );
4207 if(selected.Extent() == 1){
4208 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4209 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4210 if(obj && obj->renameAllowed()) {
4211 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4212 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4213 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4214 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4216 QList<QAction*> acts = thePopup->actions();
4217 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4218 thePopup->insertAction(firstAction,a);
4224 selMgr->setSelectionCacheEnabled( cacheIsOn );
4230 void LightApp_Application::createEmptyStudy()
4232 CAM_Application::createEmptyStudy();
4234 if ( objectBrowser() )
4235 objectBrowser()->updateTree();
4237 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4238 if ( aResMgr && activeStudy() ) {
4239 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4240 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4245 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4247 CAM_Application::setDesktop( desk );
4250 connect( desk, SIGNAL( message( const QString& ) ),
4251 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4252 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4253 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4254 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4255 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4261 \param mod - module to be activated
4263 bool LightApp_Application::activateModule( CAM_Module* mod )
4265 bool res = CAM_Application::activateModule( mod );
4267 if ( objectBrowser() )
4268 objectBrowser()->updateTree();
4274 \return keyborad accelerators manager object
4276 SUIT_Accel* LightApp_Application::accel() const
4282 Removes dead widget container from map
4284 void LightApp_Application::onWCDestroyed( QObject* ob )
4286 // remove destroyed widget container from windows map
4287 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4289 if ( itr.value() != ob )
4292 int key = itr.key();
4293 myWin.remove( key );
4298 void LightApp_Application::onMRUActivated( const QString& name )
4300 SUIT_Session* s = SUIT_Session::session();
4301 if ( s && s->activeApplication() == this )
4305 void LightApp_Application::onStylePreferences()
4307 Style_PrefDlg dlg( desktop() );
4310 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4313 void LightApp_Application::onFullScreen(){
4314 if(myScreenHelper) {
4315 if(desktop()->isFullScreen())
4316 myScreenHelper->switchToNormalScreen();
4318 myScreenHelper->switchToFullScreen();
4323 Connects just added view manager
4325 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4327 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4328 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4329 CAM_Application::addViewManager( vm );
4333 Remove view manager from memory
4335 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4337 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4338 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4339 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4341 aStudy->removeObjectProperties( vm->getGlobalId() );
4343 CAM_Application::removeViewManager( vm );
4345 LightApp_SelectionMgr* selMgr = selectionMgr();
4346 QList<SUIT_Selector*> selectors;
4347 selMgr->selectors( selectors );
4348 foreach( SUIT_Selector* selector, selectors ) {
4349 if ( selector->owner() == vm->getViewModel() ) {
4354 // IPAL22894: Crash on closing OCC view
4360 Renames active window of desktop
4362 void LightApp_Application::onRenameWindow()
4367 QWidget* w = desktop()->activeWindow();
4372 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4373 if( ok && !name.isEmpty() )
4374 w->setWindowTitle( name );
4378 Closes active window of desktop
4380 void LightApp_Application::onCloseWindow()
4385 QWidget* w = desktop()->activeWindow();
4393 Closes all windows of desktop
4395 void LightApp_Application::onCloseAllWindow()
4397 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4401 QList<SUIT_ViewWindow*> wndList = desk->windows();
4402 SUIT_ViewWindow* wnd;
4403 foreach( wnd, wndList )
4411 Groups all windows of desktop
4413 void LightApp_Application::onGroupAllWindow()
4415 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4419 QtxWorkstack* wgStack = desk->workstack();
4425 \return if the library of module exists
4426 \param moduleTitle - title of module
4428 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4430 if( moduleTitle.isEmpty() )
4433 QString lib = moduleLibrary( moduleTitle );
4435 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4436 bool isPythonModule = lib.contains("SalomePyQtGUI");
4437 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4441 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4443 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4446 bool isLibFound = false;
4447 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4448 for( ; anIt!=aLast; anIt++ )
4450 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4461 INFOS( "\n****************************************************************" << std::endl
4462 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4463 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4464 << "****************************************************************" << std::endl );
4466 else if ( !isPythonModule && !isPythonLightModule)
4469 if ( isPythonModule || isPythonLightModule)
4471 QString pylib = moduleName( moduleTitle ) + QString(".py");
4472 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4474 // Check the python library
4476 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4478 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4480 bool isPyLib = false, isPyGuiLib = false;
4481 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4482 for( ; anIt!=aLast; anIt++ )
4484 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4485 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4487 if(!isPythonLightModule)
4488 if( !isPyLib && inf.exists() )
4491 if( !isPyGuiLib && infgui.exists() )
4494 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4498 printf( "\n****************************************************************\n" );
4499 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4501 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4503 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4504 printf( "****************************************************************\n" );
4511 \return default name for an active study
4513 void LightApp_Application::setDefaultStudyName( const QString& theName )
4515 QStringList anInfoList;
4516 modules( anInfoList, false );
4518 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4519 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4520 !aStudy->isSaved() )
4522 aStudy->setStudyName( theName );
4523 updateDesktopTitle();
4528 Custom event handler
4530 bool LightApp_Application::event( QEvent* e )
4532 if( e && e->type()==2000 )
4534 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4535 QString* d = ( QString* )ce->data();
4536 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4538 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4539 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4540 showPreferences( tr( "PREF_APP" ) );
4545 return CAM_Application::event( e );
4548 /*! Check data object */
4549 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4553 bool isSuitable = !theObj->entry().isEmpty() &&
4554 !theObj->componentDataType().isEmpty() &&
4555 !theObj->name().isEmpty();
4562 int LightApp_Application::openChoice( const QString& aName )
4564 int choice = CAM_Application::openChoice( aName );
4566 if ( choice == OpenExist ) // The document is already open.
4568 // Do you want to reload it?
4569 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4570 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4571 choice = OpenReload;
4577 bool LightApp_Application::openAction( const int choice, const QString& aName )
4584 STD_Application* app = 0;
4585 SUIT_Session* session = SUIT_Session::session();
4586 QList<SUIT_Application*> appList = session->applications();
4587 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4589 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4590 app = ::qobject_cast<STD_Application*>( *it );
4595 app->onCloseDoc( false );
4596 appList = session->applications();
4597 STD_Application* other = 0;
4598 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4599 other = ::qobject_cast<STD_Application*>( *it );
4602 res = other->onOpenDoc( aName );
4607 res = CAM_Application::openAction( choice, aName );
4614 QStringList LightApp_Application::viewManagersTypes() const
4616 QStringList aTypesList;
4617 aTypesList += myUserWmTypes;
4618 #ifndef DISABLE_GLVIEWER
4619 aTypesList<<GLViewer_Viewer::Type();
4621 #ifndef DISABLE_PLOT2DVIEWER
4622 aTypesList<<Plot2d_Viewer::Type();
4624 #ifndef DISABLE_QXGRAPHVIEWER
4625 aTypesList<<QxScene_Viewer::Type();
4627 #ifndef DISABLE_PVVIEWER
4628 aTypesList<<PVViewer_Viewer::Type();
4630 #ifndef DISABLE_PYVIEWER
4631 aTypesList<<PyViewer_Viewer::Type();
4633 #ifndef DISABLE_OCCVIEWER
4634 aTypesList<<OCCViewer_Viewer::Type();
4636 #ifndef DISABLE_VTKVIEWER
4637 #ifndef DISABLE_SALOMEOBJECT
4638 aTypesList<<SVTK_Viewer::Type();
4640 aTypesList<<VTKViewer_Viewer::Type();
4646 * Removes all view managers of known types
4647 * Other view managers are ignored
4649 void LightApp_Application::clearKnownViewManagers()
4651 QStringList aTypesList = viewManagersTypes();
4652 QList<SUIT_ViewManager*> aMgrList;
4653 viewManagers( aMgrList );
4654 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4655 if (aTypesList.contains(aMgr->getType()))
4656 removeViewManager(aMgr);
4661 Copy of current selection
4663 void LightApp_Application::onCopy()
4665 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4671 Paste of current data in clipboard
4673 void LightApp_Application::onPaste()
4675 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4681 Browse (i.e. set focus on) the published objects
4682 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4683 has been accepted by Ok (or Apply & Close) button
4684 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4685 (to select the first published object only)
4686 \return entry of the selected object
4688 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4689 const bool theIsApplyAndClose,
4690 const bool theIsOptimizedBrowsing )
4693 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4695 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4696 switch( aBrowsePolicy )
4700 case BP_ApplyAndClose:
4701 if( !theIsApplyAndClose )
4709 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4713 SUIT_DataBrowser* anOB = objectBrowser();
4717 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4721 QStringListIterator anIter( theEntryList );
4722 if( theIsOptimizedBrowsing )
4724 // go to the last entry
4726 if( anIter.hasPrevious() )
4730 // scroll to each entry in the list
4731 // (in optimized mode - to the last entry only)
4733 LightApp_DataObject* anObject = 0;
4734 while( anIter.hasNext() )
4736 anEntry = anIter.next();
4737 if( !anEntry.isEmpty() )
4739 anObject = aStudy->findObjectByEntry( anEntry );
4742 QModelIndex anIndex = aModel->index( anObject );
4743 anOB->treeView()->scrollTo( anIndex );
4748 // always select the last object
4749 if( anObject && !anEntry.isEmpty() )
4751 QList<SUIT_Selector*> aSelectorList;
4752 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4753 if( !aSelectorList.isEmpty() )
4755 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4757 bool anIsAutoBlock = aSelector->autoBlock();
4759 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4760 aSelector->setAutoBlock( false );
4762 SUIT_DataOwnerPtrList aList;
4763 #ifndef DISABLE_SALOMEOBJECT
4764 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4765 ( anObject->entry().toLatin1().constData(),
4766 anObject->componentDataType().toLatin1().constData(),
4767 anObject->name().toLatin1().constData() );
4768 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4770 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4773 aList.append( owner );
4774 selectionMgr()->setSelected( aList );
4777 // restore auto block flag
4778 aSelector->setAutoBlock( anIsAutoBlock );
4786 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4788 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4789 return study ? study->findObjectByEntry( id ) : 0;
4793 Checks that an object can be renamed.
4794 \param entry entry of the object
4795 \brief Return \c true if object can be renamed
4797 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4802 Rename object by entry.
4803 \param entry entry of the object
4804 \param name new name of the object
4805 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4807 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4811 /*! Process standard messages from desktop */
4812 void LightApp_Application::onDesktopMessage( const QString& message )
4814 const QString sectionSeparator = "/";
4816 if ( message.toLower() == "updateobjectbrowser" ||
4817 message.toLower() == "updateobjbrowser" ) {
4818 // update object browser
4819 updateObjectBrowser();
4821 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4822 QString vtype = message.split( sectionSeparator ).last();
4823 if ( !vtype.isEmpty() )
4824 getViewManager( vtype, true );
4827 QStringList data = message.split( sectionSeparator );
4828 if ( data.count() > 1 ) {
4829 QString msgType = data[0].trimmed();
4830 LightApp_Module* sMod = 0;
4831 CAM_Module* mod = module( msgType );
4833 mod = module( moduleTitle( msgType ) );
4834 if ( mod && mod->inherits( "LightApp_Module" ) )
4835 sMod = (LightApp_Module*)mod;
4837 if ( msgType.toLower() == "preferences" ) {
4838 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4839 // for example "preferences/Study/multi_file_dump/true"
4840 if ( data.count() > 3 ) {
4841 QString section = data[1].trimmed();
4842 QString param = data[2].trimmed();
4843 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4844 resourceMgr()->setValue( section, param, value );
4848 // received message for the module
4849 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4850 sMod->message( msg );
4858 Returns all top level toolbars.
4859 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4861 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4863 QList<QToolBar*> aResult;
4864 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4865 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4866 QToolBar* tb = *tit;
4867 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4868 if ( po != desktop() )
4870 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4877 Internal method to parse toolbars and dockable windows state.
4879 QByteArray LightApp_Application::processState(QByteArray& input,
4880 const bool processWin,
4881 const bool processTb,
4882 const bool isRestoring,
4883 QByteArray defaultState) {
4886 bool hasDefaultState = !defaultState.isEmpty();
4887 bool isDockWinWriten = false;
4889 //Write date from users settings
4891 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4892 int marker, version;
4894 tmpInputData >> marker;
4895 tmpInputData >> version;
4896 tmpInputData >> dockmarker;
4897 tmpInputData >> nbDocWin;
4899 if(processWin && processTb && !isRestoring) {
4901 } else if(!processWin && !processTb ) {
4903 aRes = defaultState;
4905 QDataStream aData(&aRes, QIODevice::WriteOnly);
4906 QList<QToolBar*> aToolBars = findToolBars();
4909 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4910 QToolBar* tb = *tit;
4911 aNames.append(tb->objectName());
4914 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4915 if(toolBarMarkerIndex < 0)
4917 QDataStream anInputData(&input, QIODevice::ReadOnly);
4919 int toolBarMarkerIndexDef;
4920 if(hasDefaultState) {
4921 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4922 if(toolBarMarkerIndexDef < 0)
4925 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4927 QDataStream* aTargetData = 0;
4928 int aTargetIndex = -1;
4930 QByteArray currentArr = desktop()->saveState();
4931 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4932 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4933 if(processWin && useInputData) {
4934 aTargetData = &anInputData;
4935 aTargetIndex = toolBarMarkerIndex;
4937 //Write date from default settings
4938 if(hasDefaultState) {
4939 aTargetData = &anInputDataDef;
4940 aTargetIndex = toolBarMarkerIndexDef;
4942 //If no default state, write current snapshot of the dockable windows
4944 aTargetData = &anInputDataCur;
4945 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4946 aTargetIndex = toolBarMarkerIndexCur;
4951 if(aTargetData && aTargetIndex >= 0 ) {
4952 aTargetData->device()->seek(0);
4953 while( aTargetData->device()->pos() < aTargetIndex ) {
4958 isDockWinWriten = true;
4965 aTargetData = &anInputData;
4966 aTargetIndex = toolBarMarkerIndex;
4968 if(hasDefaultState) {
4969 aTargetData = &anInputDataDef;
4970 aTargetIndex = toolBarMarkerIndexDef;
4974 if(aTargetData && aTargetIndex >= 0) {
4976 if(!isDockWinWriten ) {
4977 //Write version marker
4978 int marker, version;
4979 aTargetData->device()->seek(0);
4980 *aTargetData >> marker;
4981 *aTargetData >> version;
4984 aData << (uchar) QDockWidgetMarker;
4986 int shift = 4*sizeof(int) + sizeof(QSize);
4987 index = aTargetIndex - shift;
4989 index = aTargetIndex;
4992 aTargetData->device()->seek(index);
4993 while(!aTargetData->atEnd()) {
4998 } else { // Not treat toolbars
4999 aData << (uchar) QToolBarMarker;
5000 aData << (int) 0; //Nb toolbars = 0
5007 \brief Emits operationFinished signal.
5008 \param theModuleName the name of the module which perfomed the operation
5009 \param theOperationName the operation name
5010 \param theEntryList the list of the created objects entries
5012 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5013 const QString& theOperationName,
5014 const QStringList& theEntryList )
5016 emit operationFinished( theModuleName, theOperationName, theEntryList );
5020 Update visibility state of given objects
5022 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5023 SUIT_ViewModel* theViewModel )
5025 if ( !theViewModel || theList.isEmpty() ) return;
5027 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5028 if ( !aStudy ) return;
5030 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5032 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5033 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5035 if ( !obj || aStudy->isComponent( obj->entry() ) )
5038 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5039 if ( anObjModule ) {
5040 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5042 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5043 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5044 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5045 anObjState = Qtx::ShownState;
5047 anObjState = Qtx::HiddenState;
5049 aStudy->setVisibilityState( obj->entry(), anObjState );
5056 * Called when window activated
5058 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5060 SUIT_DataBrowser* anOB = objectBrowser();
5063 SUIT_DataObject* rootObj = anOB->root();
5067 DataObjectList listObj = rootObj->children( true );
5069 SUIT_ViewModel* vmod = 0;
5070 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5071 vmod = vman->getViewModel();
5072 updateVisibilityState( listObj, vmod );
5076 Called then view manager removed
5078 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5080 ViewManagerList lst;
5081 viewManagers( lst );
5082 if ( lst.count() == 1) { // in case if closed last view window
5083 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5085 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5090 Check existing document.
5092 bool LightApp_Application::checkExistingDoc()
5095 if( activeStudy() ) {
5096 int answer = SUIT_MessageBox::question( desktop(),
5097 tr( "APPCLOSE_CAPTION" ),
5098 tr( "STUDYCLOSE_DESCRIPTION" ),
5099 tr( "APPCLOSE_SAVE" ),
5100 tr( "APPCLOSE_CLOSE" ),
5101 tr( "APPCLOSE_CANCEL" ), 0 );
5103 if ( activeStudy()->isSaved() ) {
5106 } else if ( onSaveAsDoc() ) {
5107 if( !closeDoc( false ) ) {
5114 else if( answer == 1 ) {
5116 } else if( answer == 2 ) {
5123 #ifndef DISABLE_PYCONSOLE
5125 PyConsole_Interp* LightApp_Application::getPyInterp()
5127 static PyConsole_Interp* myInterp = 0;
5129 myInterp = createPyInterp();
5133 PyConsole_Interp* LightApp_Application::createPyInterp()
5135 return new LightApp_PyInterp();
5138 #endif // DISABLE_PYCONSOLE