1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39 #include <PyConsole_Console.h>
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
61 #include <GUI_version.h>
63 #include <SALOME_Event.h>
65 #include <Style_Salome.h>
66 #include <Style_PrefDlg.h>
68 #include <CAM_Module.h>
69 #include <CAM_DataModel.h>
70 #include <CAM_Study.h>
71 #include <STD_TabDesktop.h>
73 #include <SUIT_DataBrowser.h>
74 #include <SUIT_Session.h>
75 #include <SUIT_Study.h>
76 #include <SUIT_FileDlg.h>
77 #include <SUIT_ResourceMgr.h>
78 #include <SUIT_ShortcutMgr.h>
79 #include <SUIT_Tools.h>
80 #include <SUIT_Accel.h>
81 #include <SUIT_MessageBox.h>
82 #include <SUIT_ViewWindow.h>
85 #include <QtxToolBar.h>
86 #include <QtxTreeView.h>
87 #include <QtxMRUAction.h>
88 #include <QtxDockAction.h>
89 #include <QtxDockWidget.h>
90 #include <QtxActionToolMgr.h>
91 #include <QtxSearchTool.h>
92 #include <QtxWorkstack.h>
95 #include <LogWindow.h>
97 #ifndef DISABLE_GLVIEWER
98 #include <GLViewer_Viewer.h>
99 #include <GLViewer_ViewManager.h>
100 #include "LightApp_GLSelector.h"
103 #ifndef DISABLE_PLOT2DVIEWER
104 #include <Plot2d_ViewManager.h>
105 #include <Plot2d_ViewModel.h>
106 #include <Plot2d_ViewWindow.h>
107 #include <Plot2d_ViewFrame.h>
108 #include "LightApp_Plot2dSelector.h"
109 #ifndef DISABLE_SALOMEOBJECT
110 #include <SPlot2d_ViewModel.h>
112 #include <Plot2d_ViewModel.h>
116 #ifndef DISABLE_OCCVIEWER
117 #include <OCCViewer_ViewManager.h>
118 #include <OCCViewer_ViewFrame.h>
119 #include <OCCViewer_ViewPort3d.h>
120 #ifndef DISABLE_SALOMEOBJECT
121 #include <SOCC_ViewModel.h>
123 #include <OCCViewer_ViewModel.h>
125 #include "LightApp_OCCSelector.h"
128 #ifndef DISABLE_VTKVIEWER
129 #ifndef DISABLE_SALOMEOBJECT
130 #include <SVTK_ViewModel.h>
131 #include <SVTK_ViewManager.h>
132 #include "LightApp_VTKSelector.h"
134 #include <VTKViewer_ViewModel.h>
135 #include <VTKViewer_ViewManager.h>
137 #include <VTKViewer_ViewModel.h>
140 #ifndef DISABLE_QXGRAPHVIEWER
141 #include <QxScene_ViewManager.h>
142 #include <QxScene_ViewModel.h>
143 #include <QxScene_ViewWindow.h>
146 #ifndef DISABLE_GRAPHICSVIEW
147 #include "GraphicsView_Viewer.h"
148 #include "GraphicsView_ViewManager.h"
149 #include "LightApp_GVSelector.h"
152 #ifndef DISABLE_PVVIEWER
153 #include "PVViewer_ViewManager.h"
154 #include "PVViewer_ViewWindow.h"
155 #include "PVViewer_ViewModel.h"
158 #ifndef DISABLE_PYVIEWER
159 #include <PyViewer_ViewManager.h>
160 #include <PyViewer_ViewModel.h>
161 #include <PyViewer_ViewWindow.h>
165 #define VISIBILITY_COLUMN_WIDTH 25
171 #include <QStringList>
173 #include <QApplication>
175 #include <QStatusBar>
177 #include <QObjectList>
179 #include <QInputDialog>
180 #include <QFontDatabase>
182 #include <QByteArray>
186 #include <QHeaderView>
191 #include <utilities.h>
193 #define FIRST_HELP_ID 1000000
195 #ifndef DISABLE_SALOMEOBJECT
196 #include <SALOME_InteractiveObject.hxx>
197 #include <SALOME_ListIO.hxx>
200 #include <Standard_Version.hxx>
202 #define ToolBarMarker 0
203 #define DockWidgetMarker 1
205 static const char* imageEmptyIcon[] = {
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "...................."};
229 int LightApp_Application::lastStudyId = 0;
231 // Markers used to parse array with dockable windows and toolbars state.
232 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
233 // in the Qt source code.
235 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
236 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
238 // Format of the Byte array with the windows and toolbar state is:
239 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
241 //Find toolbar marker position in the array in the following way:
242 //since the 'toolbar marker' is not unique, find index of first occurrence of the
243 //'toolbar marker' in the array and check that next string is name of the toolbar
245 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
246 int aResult = -1,tmp = 0;
247 int inputLen = input.length();
248 QDataStream anInputData(&input, QIODevice::ReadOnly);
249 while(tmp < inputLen) {
250 tmp = input.indexOf(QToolBarMarker, tmp + 1);
253 anInputData.device()->seek(tmp);
257 anInputData >> lines;
259 if(lines == 0 && anInputData.atEnd()){
260 //Case then array doesn't contain information about toolbars,
271 if(aFlags.contains(str)) {
280 \return last global id of study
282 int LightApp_Application::studyId()
284 return LightApp_Application::lastStudyId;
287 /*!Create new instance of LightApp_Application.*/
288 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
290 return new LightApp_Application();
293 /*! \var global preferences of LightApp */
294 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
298 \class LightApp_Application
299 Application containing LightApp module
303 LightApp_Application::LightApp_Application()
304 : CAM_Application( false ),
306 myScreenHelper(new LightApp_FullScreenHelper())
308 Q_INIT_RESOURCE( LightApp );
310 STD_TabDesktop* desk = new STD_TabDesktop();
311 desk->setFullScreenAllowed(false);
312 desk->setMinimizeAllowed(false);
316 // initialize auto save timer
317 myAutoSaveTimer = new QTimer( this );
318 myAutoSaveTimer->setSingleShot( true );
319 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
321 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
323 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
324 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
326 desktop()->setWindowIcon( aLogo );
327 desktop()->setDockableMenuBar( false );
328 desktop()->setDockableStatusBar( false );
330 // base logo (salome itself)
331 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
332 // extra logo (salome-based application)
333 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
337 mySelMgr = new LightApp_SelectionMgr( this );
339 myAccel = SUIT_Accel::getAccel();
341 #ifndef DISABLE_OCCVIEWER
342 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
343 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
351 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
355 #ifndef DISABLE_VTKVIEWER
356 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
369 #ifndef DISABLE_PLOT2DVIEWER
370 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
380 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
381 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
382 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
383 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
384 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
387 // Set existing font for the python console in resources
388 if( !aResMgr->hasValue( "PyConsole", "font" ) )
391 QFont f = aResMgr->fontValue( "PyConsole", "font" );
393 QStringList famdb = fdb.families();
395 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
398 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
400 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
403 if ( famdb.contains(aFamily) )
405 f.setFamily( aFamily );
406 aResMgr->setValue( "PyConsole", "font", f );
413 *\li Save window geometry.
414 *\li Save desktop geometry.
415 *\li Save resource maneger.
416 *\li Delete selection manager.
418 LightApp_Application::~LightApp_Application()
421 delete myScreenHelper;
424 /*!Start application.*/
425 void LightApp_Application::start()
427 CAM_Application::start();
430 updateViewManagers();
431 updateCommandsStatus();
434 desktop()->statusBar()->showMessage( "" );
436 LightApp_EventFilter::Init();
439 /*!Closeapplication.*/
440 void LightApp_Application::closeApplication()
442 QProcess::startDetached( "HelpBrowser",
443 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
445 CAM_Application::closeApplication();
448 /*!Gets application name.*/
449 QString LightApp_Application::applicationName() const
451 static QString _app_name;
452 if ( _app_name.isEmpty() )
453 _app_name = tr( "APP_NAME" );
457 /*!Gets application version.*/
458 QString LightApp_Application::applicationVersion() const
460 static QString _app_version;
462 if ( _app_version.isEmpty() )
464 QString resVersion = tr( "APP_VERSION" );
465 if ( resVersion != "APP_VERSION" )
467 _app_version = resVersion;
471 _app_version = GUI_VERSION_STR;
477 /*!Load module by \a name.*/
478 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
480 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
483 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
484 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
485 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
490 /*!Activate module by \a modName*/
491 bool LightApp_Application::activateModule( const QString& modName )
494 CAM_Module* prevMod = activeModule();
497 actName = prevMod->moduleName();
499 if ( actName == modName )
502 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
504 saveDockWindowsState();
506 bool status = CAM_Application::activateModule( modName );
508 updateModuleActions();
516 updateViewManagers();
518 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
519 if ( objectBrowser()->root() != activeStudy()->root() )
520 objectBrowser()->setRoot( activeStudy()->root() );
521 updateObjectBrowser( true );
526 /*!Gets selection manager.*/
527 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
532 /*!Creat action "New window" for certain type of viewer:*/
533 void LightApp_Application::createActionForViewer( const int id,
535 const QString& suffix,
538 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
539 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
540 QAction* a = createAction( id, // menu action id
547 false, // toggle flag
549 SLOT( onNewWindow() ) ); // slot
550 createMenu( a, parentId, -1 );
555 void LightApp_Application::createActions()
557 CAM_Application::createActions();
559 SUIT_Desktop* desk = desktop();
560 SUIT_ResourceMgr* resMgr = resourceMgr();
563 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
564 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
565 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
569 // - Help for modules
571 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
572 createMenu( separator(), helpMenu, -1, 10 );
573 QStringList aModuleList;
574 modules( aModuleList, false );
575 aModuleList.prepend( "GUI" );
576 aModuleList.prepend( "KERNEL" );
578 int id = LightApp_Application::UserID + FIRST_HELP_ID;
581 foreach( aModule, aModuleList ) {
582 if ( aModule.isEmpty() ) // module title (user name)
584 IMap <QString, QString> helpData; // list of help files for the module
585 QString helpSubMenu; // help submenu name (empty if not needed)
586 QString modName = moduleName( aModule ); // module name
587 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
588 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
589 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
591 if (resMgr->hasValue( modName, "documentation" ) )
592 docSection = resMgr->stringValue(modName, "documentation");
593 else if ( resMgr->hasSection( modName + "_documentation" ) )
594 docSection = modName + "_documentation";
595 if ( !docSection.isEmpty() ) {
596 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
597 QStringList listOfParam = resMgr->parameters( docSection );
598 foreach( QString paramName, listOfParam ) {
599 QString valueStr = resMgr->stringValue( docSection, paramName );
600 if ( !valueStr.isEmpty() ) {
601 QFileInfo fi( valueStr );
602 if ( fi.isRelative() && !modDir.isEmpty() )
603 valueStr = Qtx::addSlash( modDir ) + valueStr;
604 if ( QFile::exists( valueStr ) )
605 helpData.insert( paramName.arg( aModule ), valueStr );
610 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
611 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
612 QString indexFile = idxLst.join( QDir::separator() ); // index file
613 if ( QFile::exists( indexFile ) )
614 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
617 IMapConstIterator<QString, QString > fileIt;
618 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
619 QString helpFileName = fileIt.key();
620 // remove all '//' occurances
621 while ( helpFileName.contains( "//" ) )
622 helpFileName.replace( "//", "" );
623 // obtain submenus hierarchy if given
624 QStringList smenus = helpFileName.split( "/" );
625 helpFileName = smenus.last();
627 QAction* a = createAction( id, helpFileName,
628 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
629 helpFileName, helpFileName,
630 0, desk, false, this, SLOT( onHelpContentsModule() ) );
631 a->setData( fileIt.value() );
632 if ( !helpSubMenu.isEmpty() ) {
633 smenus.prepend( helpSubMenu );
635 // create sub-menus hierarchy
636 int menuId = helpMenu;
637 foreach ( QString subMenu, smenus ) {
638 menuId = createMenu( subMenu, menuId, -1, 0 );
640 createMenu( a, menuId, -1, 0 );
645 // - Additional help items
647 createMenu( separator(), helpMenu, -1, 5 );
649 QStringList addHelpItems = resMgr->parameters( "add_help" );
650 foreach ( QString addHelpItem, addHelpItems ) {
651 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
652 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
653 QAction* a = createAction( id, addHelpItem,
654 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
655 addHelpItem, addHelpItem,
656 0, desk, false, this, SLOT( onHelpContentsModule() ) );
657 a->setData( valueStr );
658 createMenu( a, helpMenu, -1, 5 );
664 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
665 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
666 registerAction( MRUId, mru );
668 // default icon for neutral point ('SALOME' module)
669 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
670 if ( defIcon.isNull() )
671 defIcon = QPixmap( imageEmptyIcon );
673 //! default icon for any module
674 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
675 if ( modIcon.isNull() )
676 modIcon = QPixmap( imageEmptyIcon );
679 modules( modList, false );
681 if ( modList.count() > 1 )
683 LightApp_ModuleAction* moduleAction =
684 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
686 QMap<QString, QString> iconMap;
687 moduleIconNames( iconMap );
689 const int iconSize = 20;
691 QStringList::Iterator it;
692 for ( it = modList.begin(); it != modList.end(); ++it )
694 if ( !isLibExists( *it ) )
697 QString modName = moduleName( *it );
699 if ( !isModuleAccessible( *it ) )
703 if ( iconMap.contains( *it ) )
704 iconName = iconMap[*it];
706 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
710 INFOS ( "\n****************************************************************" << std::endl
711 << "* Icon for " << (*it).toLatin1().constData()
712 << " not found. Using the default one." << std::endl
713 << "****************************************************************" << std::endl );
716 icon = Qtx::scaleIcon( icon, iconSize );
718 moduleAction->insertModule( *it, icon );
721 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
722 this, SLOT( onModuleActivation( const QString& ) ) );
723 registerAction( ModulesListId, moduleAction );
727 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
728 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
730 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
731 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
732 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
733 0, desk, false, this, SLOT( onCloseAllWindow() ) );
734 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
735 0, desk, false, this, SLOT( onGroupAllWindow() ) );
737 createMenu( CloseId, windowMenu, 0, -1 );
738 createMenu( CloseAllId, windowMenu, 0, -1 );
739 createMenu( GroupAllId, windowMenu, 0, -1 );
740 createMenu( separator(), windowMenu, -1, 0 );
742 #ifndef DISABLE_GLVIEWER
743 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
745 #ifndef DISABLE_PLOT2DVIEWER
746 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
748 #ifndef DISABLE_OCCVIEWER
749 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
751 #ifndef DISABLE_VTKVIEWER
752 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
754 #ifndef DISABLE_QXGRAPHVIEWER
755 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
757 #ifndef DISABLE_GRAPHICSVIEW
758 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
760 #ifndef DISABLE_PVVIEWER
761 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
763 #ifndef DISABLE_PYVIEWER
764 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
767 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
768 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
769 createMenu( RenameId, windowMenu, -1 );
771 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
772 createMenu( PreferencesId, fileMenu, 50, -1 );
773 createMenu( separator(), fileMenu, -1, 50, -1 );
775 createMenu( separator(), fileMenu, -1, 100, -1 );
776 createMenu( MRUId, fileMenu, 100, -1 );
777 createMenu( separator(), fileMenu, -1, 100, -1 );
779 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
780 0, desk, false, this, SLOT( onStylePreferences() ) );
782 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
783 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
786 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
787 createMenu( separator(), viewMenu, -1, 20, -1 );
788 createMenu( StyleId, viewMenu, 20, -1 );
789 createMenu( FullScreenId, viewMenu, 20, -1 );
791 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
792 QString( "SalomeModules" ) ); // name (language-independant)
793 createTool( ModulesListId, modTBar );
796 /*!On module activation action.*/
797 void LightApp_Application::onModuleActivation( const QString& modName )
799 // Force user to create/open a study before module activation
800 QMap<QString, QString> iconMap;
801 moduleIconNames( iconMap );
802 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
804 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
806 bool cancelled = false;
808 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
809 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
810 QMap<int, QString> opmap = activateModuleActions();
811 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
812 aDlg.addButton( it.value(), it.key() );
814 int res = aDlg.exec();
816 // some operation is selected
817 moduleActionSelected( res );
821 putInfo( tr("INF_CANCELLED") );
823 LightApp_ModuleAction* moduleAction =
824 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
826 moduleAction->setActiveModule( QString() );
832 activateModule( modName );
835 /*!Default module activation.*/
836 QString LightApp_Application::defaultModule() const
838 QStringList aModuleNames;
839 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
840 //! If there's the one and only module --> activate it automatically
841 //! TODO: Possible improvement - default module can be taken from preferences
842 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
845 /*!On new window slot.*/
846 void LightApp_Application::onNewWindow()
848 const QObject* obj = sender();
849 if ( !obj || !obj->inherits( "QAction" ) )
853 int id = actionId( (QAction*)obj );
856 #ifndef DISABLE_GLVIEWER
858 type = GLViewer_Viewer::Type();
861 #ifndef DISABLE_PLOT2DVIEWER
863 type = Plot2d_Viewer::Type();
866 #ifndef DISABLE_OCCVIEWER
868 type = OCCViewer_Viewer::Type();
871 #ifndef DISABLE_VTKVIEWER
873 type = VTKViewer_Viewer::Type();
876 #ifndef DISABLE_QXGRAPHVIEWER
877 case NewQxSceneViewId:
878 type = QxScene_Viewer::Type();
881 #ifndef DISABLE_GRAPHICSVIEW
882 case NewGraphicsViewId:
883 type = GraphicsView_Viewer::Type();
886 #ifndef DISABLE_PVVIEWER
888 type = PVViewer_Viewer::Type();
891 #ifndef DISABLE_PYVIEWER
893 type = PyViewer_Viewer::Type();
898 if ( !type.isEmpty() )
899 createViewManager( type );
903 SLOT: Creates new document
905 void LightApp_Application::onNewDoc()
907 #ifdef SINGLE_DESKTOP
908 if ( !checkExistingDoc() )
912 //asl: fix for 0020515
913 saveDockWindowsState();
915 CAM_Application::onNewDoc();
919 SLOT: Opens new document
921 void LightApp_Application::onOpenDoc()
923 SUIT_Study* study = activeStudy();
925 #ifdef SINGLE_DESKTOP
926 if ( !checkExistingDoc() )
930 CAM_Application::onOpenDoc();
932 if ( !study ) // new study will be create in THIS application
935 updateViewManagers();
940 SLOT: Opens new document.
941 \param aName - name of file
943 bool LightApp_Application::onOpenDoc( const QString& aName )
945 #ifdef SINGLE_DESKTOP
946 if ( !checkExistingDoc() )
950 saveDockWindowsState();
952 // We should take mru action first because this application instance can be deleted later.
953 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
955 bool res = CAM_Application::onOpenDoc( aName );
960 mru->insert( aName );
962 mru->remove( aName );
968 SLOT: Displays "About" message box
970 void LightApp_Application::onHelpAbout()
972 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
977 Private SLOT: Called on selection is changed
978 Dispatchs active module that selection is changed
980 void LightApp_Application::onSelection()
982 onSelectionChanged();
984 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
985 ((LightApp_Module*)activeModule())->selectionChanged();
990 \param study - SUIT_Study.
992 void LightApp_Application::setActiveStudy( SUIT_Study* study )
994 CAM_Application::setActiveStudy( study );
998 Enables/Disables menu items and toolbar buttons. Rebuild menu
1000 void LightApp_Application::updateCommandsStatus()
1002 CAM_Application::updateCommandsStatus();
1005 #ifndef DISABLE_GLVIEWER
1006 a = action( NewGLViewId );
1008 a->setEnabled( activeStudy() );
1011 #ifndef DISABLE_PLOT2DVIEWER
1012 a = action( NewPlot2dId );
1014 a->setEnabled( activeStudy() );
1017 #ifndef DISABLE_OCCVIEWER
1018 a = action( NewOCCViewId );
1020 a->setEnabled( activeStudy() );
1023 #ifndef DISABLE_VTKVIEWER
1024 a = action( NewVTKViewId );
1026 a->setEnabled( activeStudy() );
1029 #ifndef DISABLE_QXGRAPHVIEWER
1030 a = action( NewQxSceneViewId );
1032 a->setEnabled( activeStudy() );
1035 #ifndef DISABLE_GRAPHICSVIEW
1036 a = action( NewGraphicsViewId );
1038 a->setEnabled( activeStudy() );
1041 #ifndef DISABLE_PVVIEWER
1042 a = action( NewPVViewId );
1044 a->setEnabled( activeStudy() );
1047 #ifndef DISABLE_PYVIEWER
1048 a = action( NewPyViewerId );
1050 a->setEnabled( activeStudy() );
1056 Runs system command in separate thread
1058 class RunBrowser: public QThread
1061 RunBrowser( LightApp_Application* app,
1062 const QString& theApp,
1063 const QString& theParams,
1064 const QString& theHelpFile,
1065 const QString& theContext = QString() )
1067 myParams( theParams ),
1068 myContext( theContext ),
1072 //For the external browser always specify 'file://' protocol,
1073 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1074 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1079 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1080 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1082 QProcess* proc = new QProcess();
1084 proc->start( aCommand );
1085 if ( !proc->waitForStarted() ) {
1086 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1087 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1088 ce2000->setData( msg );
1089 QApplication::postEvent( myLApp, ce2000 );
1100 LightApp_Application* myLApp;
1104 SLOT: Displays help contents for choosen module
1106 void LightApp_Application::onHelpContentsModule()
1108 const QAction* a = (QAction*) sender();
1109 QString helpFile = a->data().toString();
1110 if ( helpFile.isEmpty() ) return;
1112 SUIT_ResourceMgr* resMgr = resourceMgr();
1115 platform = "winapplication";
1117 platform = "application";
1119 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1121 QString quote("\"");
1122 anApp.prepend( quote );
1123 anApp.append( quote );
1125 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1126 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1128 if( useExtBrowser ) {
1129 if ( !anApp.isEmpty() ) {
1130 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1134 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1135 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1136 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1138 showPreferences( tr( "PREF_APP" ) );
1142 QStringList parameters;
1143 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1144 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1145 parameters << helpFile;
1146 QProcess::startDetached( "HelpBrowser", parameters );
1151 SLOT: Displays help contents for choosen dialog
1153 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1154 const QString& theFileName,
1155 const QString& theContext )
1157 QString fileName = theFileName;
1158 QString context = theContext;
1159 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1160 // context might be passed within theFileName argument
1161 QStringList comps = fileName.split("#");
1162 if ( comps.count() > 1 ) {
1163 context = comps.last();
1165 fileName = comps.join("#");
1169 QString homeDir = "";
1170 if ( !theComponentName.isEmpty() ) {
1171 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1172 if ( !dir.isEmpty() )
1173 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1174 Qtx::addSlash( "share" ) +
1175 Qtx::addSlash( "doc" ) +
1176 Qtx::addSlash( "salome" ) +
1177 Qtx::addSlash( "gui" ) +
1178 Qtx::addSlash( theComponentName ) );
1181 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1182 SUIT_ResourceMgr* resMgr = resourceMgr();
1185 platform = "winapplication";
1187 platform = "application";
1189 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1191 QString quote("\"");
1192 anApp.prepend( quote );
1193 anApp.append( quote );
1196 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1199 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1201 if ( !anApp.isEmpty() ) {
1202 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1206 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1207 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1208 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1209 showPreferences( tr( "PREF_APP" ) );
1213 QStringList parameters;
1214 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1215 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1216 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1217 QProcess::startDetached( "HelpBrowser", parameters );
1222 Sets enable or disable some actions on selection changed.
1224 void LightApp_Application::onSelectionChanged()
1226 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1227 bool canCopy = m ? m->canCopy() : false;
1228 bool canPaste = m ? m->canPaste() : false;
1230 action( EditCopyId )->setEnabled(canCopy);
1231 action( EditPasteId )->setEnabled(canPaste);
1235 SLOT: Performs some actions when dockable windows are triggered
1237 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1241 QWidget* LightApp_Application::dockWindow( const int id ) const
1244 if ( myWin.contains( id ) )
1249 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1254 QDockWidget* dock = 0;
1255 QWidget* w = wid->parentWidget();
1256 while ( w && !dock )
1258 dock = ::qobject_cast<QDockWidget*>( w );
1259 w = w->parentWidget();
1264 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1269 if ( wid != dockWindow( id ) )
1270 removeDockWindow( id );
1272 myWin.insert( id, wid );
1274 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1275 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1277 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1278 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1279 QString( "%1Dock" ).arg( wid->objectName() ) );
1280 dock->setWidget( wid );
1281 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1282 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1283 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1285 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1286 if ( !accel.isEmpty() )
1287 dock->toggleViewAction()->setShortcut( accel );
1292 void LightApp_Application::removeDockWindow( const int id )
1294 QWidget* wid = dockWindow( id );
1300 QDockWidget* dock = windowDock( wid );
1304 dock->setWidget( 0 );
1305 wid->setParent( 0 );
1306 wid->setVisible( false );
1310 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1312 QDockWidget* dock = windowDock( dockWindow( id ) );
1313 if ( dock && desktop() ) {
1314 desktop()->addDockWidget( place, dock );
1315 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1316 if ( a ) a->update();
1322 \param flag - key for window
1323 \param studyId - study id
1324 Flag used how identificator of window in windows list.
1326 QWidget* LightApp_Application::getWindow( const int flag, const int )
1328 QWidget* wid = dockWindow( flag );
1330 insertDockWindow( flag, wid = createWindow( flag ) );
1332 QMap<int, int> winMap;
1333 currentWindows( winMap );
1334 if ( winMap.contains( flag ) )
1335 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1341 \return Object Browser
1343 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1345 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1351 LogWindow* LightApp_Application::logWindow()
1353 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1356 #ifndef DISABLE_PYCONSOLE
1358 This returns the python console integrated to the GUI. Depending
1359 when you request the python console, this function could return
1360 null. Then the optional parameter force (default to false) can be
1361 set to force the creation of the python console if it is not done
1363 \param force - if true, the pythonConsole is created if it does not exist yet
1364 \return Python Console
1366 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1368 QWidget* wid = dockWindow( WT_PyConsole );
1369 if ( !wid && force==true) {
1370 wid = getWindow(WT_PyConsole);
1372 return qobject_cast<PyConsole_Console*>( wid );
1377 Updates object browser and maybe data models
1378 \param updateModels - if it is true, then data models are updated
1380 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1382 // update existing data models
1385 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1386 if ( objectBrowser() )
1387 objectBrowser()->setAutoUpdate( false );
1389 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1391 CAM_Study::ModelList dm_list;
1392 study->dataModels( dm_list );
1393 QListIterator<CAM_DataModel*> it( dm_list );
1394 while ( it.hasNext() ) {
1395 CAM_DataModel* camDM = it.next();
1396 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1397 ((LightApp_DataModel*)camDM)->update();
1401 if( objectBrowser() )
1402 objectBrowser()->setAutoUpdate( isAutoUpdate );
1405 if ( objectBrowser() ) {
1406 objectBrowser()->updateGeometry();
1407 objectBrowser()->updateTree( 0, false );
1414 LightApp_Preferences* LightApp_Application::preferences() const
1416 return preferences( false );
1420 \return first view manager of some type
1421 \param vmType - type of view manager
1422 \param create - is it necessary to create view manager in case, when there is no manager of such type
1424 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1426 SUIT_ViewManager* aVM = viewManager( vmType );
1427 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1429 if ( anActiveVM && anActiveVM->getType() == vmType )
1432 if ( aVM && create )
1434 if ( !aVM->getActiveView() )
1437 desktop()->setActiveWindow( aVM->getActiveView() );
1440 aVM = createViewManager( vmType );
1446 Creates view manager of some type
1447 \param vmType - type of view manager
1449 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1451 SUIT_ResourceMgr* resMgr = resourceMgr();
1453 SUIT_ViewManager* viewMgr = 0;
1454 #ifndef DISABLE_GLVIEWER
1455 if( vmType == GLViewer_Viewer::Type() )
1457 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1458 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1461 #ifndef DISABLE_PLOT2DVIEWER
1462 if( vmType == Plot2d_Viewer::Type() )
1464 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1466 #ifndef DISABLE_SALOMEOBJECT
1467 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1469 new LightApp_Plot2dSelector( v, mySelMgr );
1471 vm = new Plot2d_Viewer();
1473 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1474 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1477 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1478 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1482 #ifndef DISABLE_QXGRAPHVIEWER
1483 if( vmType == QxScene_Viewer::Type() )
1485 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1486 QxScene_Viewer* vm = new QxScene_Viewer();
1487 viewMgr->setViewModel( vm );
1488 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1491 #ifndef DISABLE_GRAPHICSVIEW
1492 if( vmType == GraphicsView_Viewer::Type() )
1494 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1495 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1498 #ifndef DISABLE_PVVIEWER
1499 if( vmType == PVViewer_Viewer::Type() )
1501 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1502 viewMgr->getActiveView()->setFocus();
1505 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1509 #ifndef DISABLE_PYVIEWER
1510 if( vmType == PyViewer_Viewer::Type() )
1512 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1515 #ifndef DISABLE_OCCVIEWER
1516 if( vmType == OCCViewer_Viewer::Type() )
1518 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1519 OCCViewer_Viewer* vm;
1520 #ifndef DISABLE_SALOMEOBJECT
1521 vm = new SOCC_Viewer();
1523 vm = new OCCViewer_Viewer( true );
1525 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1526 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1527 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1528 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1529 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1530 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1531 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1532 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1534 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1535 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1536 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1537 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1538 #if OCC_VERSION_LARGE > 0x06090000
1539 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1540 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1541 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1542 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1543 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1544 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1546 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1547 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1548 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1550 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1551 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1552 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1553 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1554 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1555 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1556 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1557 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1560 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1561 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1564 #ifndef DISABLE_VTKVIEWER
1565 #ifndef DISABLE_SALOMEOBJECT
1566 if ( vmType == SVTK_Viewer::Type() )
1568 if ( vmType == VTKViewer_Viewer::Type() )
1571 #ifndef DISABLE_SALOMEOBJECT
1572 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1573 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1576 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1577 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1578 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1579 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1580 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1581 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1582 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1583 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1584 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1585 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1586 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1587 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1588 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1589 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1590 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1591 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1592 new LightApp_VTKSelector( vm, mySelMgr );
1595 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1596 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1598 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1606 addViewManager( viewMgr );
1607 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1609 if ( viewWin && desktop() ) {
1610 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1611 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1617 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1619 SUIT_ResourceMgr* resMgr = resourceMgr();
1621 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1623 new LightApp_WgViewModel( vmType, w ) );
1624 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1626 addViewManager( vm );
1627 SUIT_ViewWindow* vw = vm->createViewWindow();
1628 if ( vw && desktop() ) {
1629 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1630 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1633 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1634 myUserWmTypes << vmType;
1639 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1641 SUIT_ResourceMgr* resMgr = resourceMgr();
1643 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1647 QString vmType = vm->getType();
1649 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1651 addViewManager( vm );
1652 SUIT_ViewWindow* vw = vm->createViewWindow();
1653 if ( vw && desktop() ) {
1654 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1655 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1658 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1659 myUserWmTypes << vmType;
1665 SLOT: Removes view manager from application
1667 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1669 removeViewManager( theVM );
1673 Protected SLOT: On study created.
1674 \param theStudy - just created study
1676 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1678 SUIT_DataObject* aRoot = 0;
1679 if ( theStudy && theStudy->root() )
1681 aRoot = theStudy->root();
1682 //aRoot->setName( tr( "DATA_MODELS" ) );
1685 getWindow( WT_ObjectBrowser );
1687 loadDockWindowsState();
1689 if ( objectBrowser() )
1690 objectBrowser()->setRoot( aRoot );
1692 activateModule( defaultModule() );
1694 if ( objectBrowser() )
1695 objectBrowser()->openLevels();
1697 #ifndef DISABLE_PYCONSOLE
1698 if( pythonConsole() )
1699 getPyInterp()->initStudy();
1704 Protected SLOT: On study opened.
1705 \param theStudy - just opened study
1707 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1709 SUIT_DataObject* aRoot = 0;
1710 if ( theStudy && theStudy->root() )
1712 aRoot = theStudy->root();
1716 getWindow( WT_ObjectBrowser );
1718 loadDockWindowsState();
1720 if ( objectBrowser() )
1721 objectBrowser()->setRoot( aRoot );
1723 activateModule( defaultModule() );
1725 if ( objectBrowser() )
1726 objectBrowser()->openLevels();
1728 #ifndef DISABLE_PYCONSOLE
1729 if( pythonConsole() )
1730 getPyInterp()->initStudy();
1736 /*!Protected SLOT. On study saved.*/
1737 void LightApp_Application::onStudySaved( SUIT_Study* s )
1739 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1741 mru->insert( s->studyName() );
1746 /*!Protected SLOT. On study closed.*/
1747 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1750 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1751 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1754 // stop auto-save timer
1755 myAutoSaveTimer->stop();
1757 // Bug 10396: clear selection
1758 mySelMgr->clearSelected();
1760 // Bug 12944: emit signal only after clear selection
1763 activateModule( "" );
1766 /*!Protected SLOT.On desktop activated.*/
1767 void LightApp_Application::onDesktopActivated()
1769 CAM_Application::onDesktopActivated();
1770 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1772 aModule->studyActivated();
1775 void LightApp_Application::studyOpened( SUIT_Study* s )
1777 CAM_Application::studyOpened( s );
1780 updateViewManagers();
1783 void LightApp_Application::studySaved( SUIT_Study* s )
1785 CAM_Application::studyOpened( s );
1786 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1787 if ( aResMgr && activeStudy() ) {
1788 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1789 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1793 void LightApp_Application::studyCreated( SUIT_Study* s )
1795 CAM_Application::studyCreated( s );
1798 updateViewManagers();
1801 /*!Gets file filter.
1802 *\retval QString "(*.bin)"
1804 QString LightApp_Application::getFileFilter() const
1812 Shows file dialog and return user selected file name
1814 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1815 const QString& caption, QWidget* parent )
1819 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1820 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1823 /*! Gets directory*/
1824 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1828 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1831 /*! Get open file names*/
1832 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1833 const QString& caption, QWidget* parent )
1837 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1838 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1841 /*!Private SLOT. Update object browser.*/
1842 void LightApp_Application::onRefresh()
1844 updateObjectBrowser( true );
1847 /*!Private SLOT. Update actions after rename object.*/
1848 void LightApp_Application::onRenamed()
1850 activeStudy()->Modified();
1854 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1855 // To prevent reversion the window should be either aligned during movement and resize.
1856 /*!Private SLOT. Update actions after rename object.*/
1857 /*void LightApp_Application::onMoved()
1859 OCCViewer_ViewManager* viewMgr = 0;
1860 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1862 OCCViewer_ViewWindow* view = 0;
1863 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1865 view->getViewPort()->repaintViewAfterMove();
1870 /*!Private SLOT. Support drag-and-drop operation.*/
1871 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1873 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1877 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1879 aModule->dropObjects( objects, parentObj, row, action );
1882 /*!Private SLOT. On preferences.*/
1883 void LightApp_Application::onPreferences()
1885 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1888 /*!Private SLOT. On preferences.*/
1889 void LightApp_Application::showPreferences( const QString& itemText )
1891 QApplication::setOverrideCursor( Qt::WaitCursor );
1893 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1895 QApplication::restoreOverrideCursor();
1900 preferences()->activateItem( itemText );
1902 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1905 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1906 resourceMgr()->save();
1909 shortcutMgr()->updateShortcuts();
1915 /*!Protected SLOT. On preferences changed.*/
1916 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1918 LightApp_Module* sMod = 0;
1919 CAM_Module* mod = module( modName );
1920 if ( mod && mod->inherits( "LightApp_Module" ) )
1921 sMod = (LightApp_Module*)mod;
1924 sMod->preferencesChanged( section, param );
1926 preferencesChanged( section, param );
1927 // emit signal to allow additional preferences changing processing
1928 emit preferenceChanged( modName, section, param );
1931 /*!Remove all windows from study.*/
1932 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1934 saveDockWindowsState();
1936 if ( SUIT_DataBrowser* ob = objectBrowser() )
1939 CAM_Application::beforeCloseDoc( s );
1942 /*!Update actions.*/
1943 void LightApp_Application::updateActions()
1945 updateCommandsStatus();
1951 SUIT_Study* LightApp_Application::createNewStudy()
1953 LightApp_Application::lastStudyId++;
1955 LightApp_Study* aStudy = new LightApp_Study( this );
1957 // Set up processing of major study-related events
1958 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1959 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1960 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1961 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1967 Creates window by flag.
1968 \param flag - identificator of window type
1970 QWidget* LightApp_Application::createWindow( const int flag )
1974 SUIT_ResourceMgr* resMgr = resourceMgr();
1976 if ( flag == WT_ObjectBrowser )
1978 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1979 ob->setObjectName( "objectBrowser" );
1980 ob->setSortMenuEnabled( true );
1981 ob->setAutoUpdate( true );
1982 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1983 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1985 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1986 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1987 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1989 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1990 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1991 treeModel->setSearcher( this );
1992 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1993 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1995 // Mantis issue 0020136: Drag&Drop in OB
1996 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1998 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1999 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2000 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2001 this, SLOT( onRenamed( ) ) );
2005 // temporary commented
2007 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2009 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2012 // Create OBSelector
2013 new LightApp_OBSelector( ob, mySelMgr );
2015 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2016 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2017 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2018 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2020 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2022 #ifndef DISABLE_PYCONSOLE
2023 else if ( flag == WT_PyConsole )
2025 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
2026 pyCons->setObjectName( "pythonConsole" );
2027 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2028 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
2029 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
2030 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2033 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2036 else if ( flag == WT_LogWindow )
2038 LogWindow* logWin = new LogWindow( desktop() );
2039 logWin->setObjectName( "logWindow" );
2040 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2041 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2043 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2049 \return default windows( Object Browser, Python Console )
2050 Adds to map \a aMap.
2052 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2054 #ifndef DISABLE_PYCONSOLE
2055 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2057 if ( activeStudy() ) {
2058 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2059 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2063 /*!Default view managers*/
2064 void LightApp_Application::defaultViewManagers( QStringList& ) const
2070 \return preferences.
2071 Create preferences, if \a crt = true.
2073 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2078 LightApp_Application* that = (LightApp_Application*)this;
2080 bool toCreate = !_prefs_ && crt;
2083 _prefs_ = new LightApp_Preferences( resourceMgr() );
2084 that->createPreferences( _prefs_ );
2087 that->myPrefs = _prefs_;
2089 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2090 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2091 connect( myPrefs, SIGNAL( resetToDefaults() ),
2092 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2097 SUIT_ResourceMgr* resMgr = resourceMgr();
2099 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2100 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2102 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2106 QStringList modNameList;
2107 app->modules( modNameList, false );
2109 QMap<QString, QString> iconMap;
2110 app->moduleIconNames( iconMap );
2112 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2114 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2117 int modId = _prefs_->addPreference( *it );
2118 if ( iconMap.contains( *it ) )
2119 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2123 app->modules( modList );
2124 QListIterator<CAM_Module*> itr( modList );
2125 while ( itr.hasNext() )
2127 LightApp_Module* mod = 0;
2129 CAM_Module* anItem = itr.next();
2130 if ( anItem->inherits( "LightApp_Module" ) )
2131 mod = (LightApp_Module*)anItem;
2133 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2135 _prefs_->addPreference( mod->moduleName() );
2136 mod->createPreferences();
2137 that->emptyPreferences( mod->moduleName() );
2141 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2147 Adds new module to application
2149 void LightApp_Application::moduleAdded( CAM_Module* mod )
2151 CAM_Application::moduleAdded( mod );
2153 LightApp_Module* lightMod = 0;
2154 if ( mod && mod->inherits( "LightApp_Module" ) )
2155 lightMod = (LightApp_Module*)mod;
2157 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2159 myPrefs->addPreference( mod->moduleName() );
2160 lightMod->createPreferences();
2161 emptyPreferences( mod->moduleName() );
2165 void LightApp_Application::emptyPreferences( const QString& modName )
2167 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2168 if ( !item || !item->isEmpty() )
2171 // printf( "---------------------> Modify for empty module.\n" );
2173 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2174 frm->setIcon( item->icon() );
2175 frm->setStretch( false );
2176 item->parentItem()->insertItem( frm, item );
2177 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2184 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2189 QStringList aValuesList;
2190 QList<QVariant> anIndicesList;
2194 // . Top-level "SALOME" preferences group <<start>>
2195 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2196 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2198 // .. "General" preferences tab <<start>>
2199 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2201 // ... "Language" group <<start>>
2202 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2203 pref->setItemProperty( "columns", 2, langGroup );
2204 // .... -> application language
2205 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2206 LightApp_Preferences::Selector, "language", "language" );
2207 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2208 QList<QVariant> aIcons;
2209 foreach ( QString aLang, aLangs ) {
2210 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2212 pref->setItemProperty( "strings", aLangs, curLang );
2213 pref->setItemProperty( "icons", aIcons, curLang );
2214 pref->setItemProperty( "restart", true, curLang );
2216 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2217 LightApp_Preferences::Bool, "language", "locale" );
2218 pref->setItemProperty( "restart", true, curLocale );
2219 // ... "Language" group <<end>>
2221 // ... "Look and feel" group <<start>>
2222 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2223 pref->setItemProperty( "columns", 2, lookGroup );
2224 // .... -> show splash-screen
2225 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2226 // .... -> opaque resize
2227 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2228 // .... -> drop-down buttons
2229 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2230 // ... "Look and feel" group <<end>>
2232 // ... "Study properties" group <<start>>
2233 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2234 pref->setItemProperty( "columns", 2, studyGroup );
2235 // .... -> multi-file save
2236 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2237 // .... -> ascii save mode
2238 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2239 // .... -> store windows geometry
2240 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2241 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2242 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2243 // .... -> auto-save
2244 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2245 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2246 pref->setItemProperty( "min", 0, autoSaveInterval );
2247 pref->setItemProperty( "max", 1440, autoSaveInterval );
2248 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2249 // ... "Study properties" group <<end>>
2251 // ... "Help browser" group <<start>>
2252 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2254 QString platform = "winapplication";
2256 QString platform = "application";
2258 // .... -> browser application
2259 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2260 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2261 // .... -> browser parameters
2262 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2263 // ... "Help browser" group <<end>>
2265 // ... "Python console properties" group <<start>>
2266 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2268 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2269 // .... -> show banner
2270 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2271 // ... "Python console properties" group <<end>>
2273 // ... "MRU" preferences group <<start>>
2274 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2275 pref->setItemProperty( "columns", 4, mruGroup );
2276 // number of MRU items
2277 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2278 "MRU", "visible_count" );
2279 pref->setItemProperty( "min", 0, mruVisCount );
2280 pref->setItemProperty( "max", 100, mruVisCount );
2282 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2283 "MRU", "link_type" );
2284 aValuesList.clear();
2285 anIndicesList.clear();
2286 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2287 anIndicesList << 0 << 1 << 2 ;
2288 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2289 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2290 // ... "MRU" preferences group <<end>>
2292 // ... "Full-screen" group <<start>>
2293 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2294 pref->setItemProperty( "columns", 2, fullScreenGroup );
2295 // .... -> automatic hiding toolbars
2296 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2297 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2298 // ... "Full-screen" group <<end>>
2300 // .. "General" preferences tab <<end>>
2302 // .. "3D viewer" group <<start>>
2303 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2304 // ... -> navigation mode
2305 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2306 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2307 aValuesList.clear();
2308 anIndicesList.clear();
2309 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2310 anIndicesList << 0 << 1;
2311 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2312 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2313 // ... -> zooming mode
2314 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2315 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2316 aValuesList.clear();
2317 anIndicesList.clear();
2318 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2319 anIndicesList << 0 << 1;
2320 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2321 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2322 // ... "Trihedron" group <<start>>
2323 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2324 pref->setItemProperty( "columns", 2, occTriGroup );
2325 // .... -> trihedron size
2326 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2327 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2328 pref->setItemProperty( "min", 1.0E-06, occTS );
2329 pref->setItemProperty( "max", 1000, occTS );
2330 // .... -> relative size of trihedron
2331 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2332 // .... -> show static trihedron
2333 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2334 // ... "Trihedron" group <<end>>
2335 // .. "3D viewer" group <<end>>
2339 #ifndef DISABLE_OCCVIEWER
2340 // .. "OCC viewer" group <<start>>
2341 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2343 // .... -> Projection mode
2344 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2345 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2346 aValuesList.clear();
2347 anIndicesList.clear();
2348 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2349 anIndicesList << 0 << 1;
2350 pref->setItemProperty( "strings", aValuesList, occProjMode );
2351 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2352 #if OCC_VERSION_LARGE > 0x06090000
2353 // .... -> Stereo group
2354 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2355 pref->setItemProperty( "columns", 2, stereoGroup );
2356 // .... -> Stereo type
2357 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2358 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2359 aValuesList.clear();
2360 anIndicesList.clear();
2362 OCCViewer_Viewer::stereoData( aValuesList, idList);
2363 foreach( int gid, idList ) anIndicesList << gid;
2364 pref->setItemProperty( "strings", aValuesList, stereoType );
2365 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2367 // .... -> Anaglyph filter
2368 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2369 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2370 aValuesList.clear();
2371 anIndicesList.clear();
2372 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2373 anIndicesList << 0 << 1 << 2;
2375 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2376 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2378 // .... -> Convergence distance type
2379 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2380 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2381 aValuesList.clear();
2382 anIndicesList.clear();
2383 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2384 anIndicesList << 0 << 1;
2385 pref->setItemProperty( "strings", aValuesList, occFocusType );
2386 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2388 // .... -> Stereographic focus value
2389 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2390 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2391 pref->setItemProperty( "precision", 3, focusValue );
2392 pref->setItemProperty( "min", 1.0E-03, focusValue );
2393 pref->setItemProperty( "max", 1.0E03, focusValue );
2394 pref->setItemProperty( "step", 0.05, focusValue );
2397 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2398 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2399 aValuesList.clear();
2400 anIndicesList.clear();
2401 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2402 anIndicesList << 0 << 1;
2403 pref->setItemProperty( "strings", aValuesList, occIODType );
2404 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2406 // .... -> Interocular distance (IOD) value
2407 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2408 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2409 pref->setItemProperty( "precision", 3, IODValue );
2410 pref->setItemProperty( "min", 1.0E-03, IODValue );
2411 pref->setItemProperty( "max", 1.0E03, IODValue );
2412 pref->setItemProperty( "step", 0.05, IODValue );
2414 // .... -> Reverse stereo
2415 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2416 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2417 // .... -> Enable V-Sync
2418 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2419 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2420 // .... -> Enable quad-buffer support
2421 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2422 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2424 // ... "Background" group <<start>>
2425 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2426 // pref->setItemProperty( "columns", 2, bgGroup );
2427 aValuesList.clear();
2428 anIndicesList.clear();
2431 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2432 foreach( int gid, idList ) anIndicesList << gid;
2433 // .... -> 3D viewer background
2434 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2435 LightApp_Preferences::Background, "OCCViewer", "background" );
2436 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2437 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2438 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2439 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2440 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2441 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2442 pref->setItemProperty( "custom_enabled", false, bgId );
2443 pref->setItemProperty( "image_formats", formats, bgId );
2444 // .... -> XZ viewer background
2445 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2446 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2447 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2448 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2449 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2450 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2451 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2452 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2453 pref->setItemProperty( "custom_enabled", false, bgId );
2454 pref->setItemProperty( "image_formats", formats, bgId );
2455 // .... -> YZ viewer background
2456 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2457 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2458 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2459 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2460 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2461 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2462 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2463 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2464 pref->setItemProperty( "custom_enabled", false, bgId );
2465 pref->setItemProperty( "image_formats", formats, bgId );
2466 // .... -> XY viewer background
2467 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2468 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2469 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2470 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2471 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2472 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2473 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2474 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2475 pref->setItemProperty( "custom_enabled", false, bgId );
2476 pref->setItemProperty( "image_formats", formats, bgId );
2477 // ... "Background" group <<end>>
2480 // ... "Selection" group <<start>>
2481 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2482 pref->setItemProperty( "columns", 2, occSelectionGroup );
2483 // .... -> enable preselection
2484 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2485 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2486 // .... -> enable selection
2487 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2488 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2489 // ... "Selection" group <<end>>
2491 // ... "Clipping" group <<start>>
2492 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2493 // .... -> clipping color
2494 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2495 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2496 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2497 pref->setItemProperty( "columns", 2, texturePref );
2498 // .... -> use default texture
2499 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2500 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2501 // .... -> clipping texture
2502 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2503 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2504 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2506 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2507 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2508 // .... -> scale factor
2509 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2510 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2511 pref->setItemProperty( "precision", 3, scaleFactor );
2512 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2513 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2514 pref->setItemProperty( "step", 0.1, scaleFactor );
2515 // ... "Clipping" group <<end>>
2517 // ... -> empty frame (for layout) <<start>>
2518 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2519 pref->setItemProperty( "margin", 0, occGen );
2520 pref->setItemProperty( "columns", 2, occGen );
2521 // ... -> empty frame (for layout) <<end>>
2523 // .. "OCC viewer" group <<end>>
2526 #ifndef DISABLE_VTKVIEWER
2527 // .. "VTK viewer" group <<start>>
2528 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2530 // ... -> empty frame (for layout) <<start>>
2531 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2532 //pref->setItemProperty( "columns", 2, vtkGen );
2533 // .... -> projection mode
2534 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2535 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2536 aValuesList.clear();
2537 anIndicesList.clear();
2538 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2539 anIndicesList << 0 << 1;
2540 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2541 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2543 // .... -> Stereo group
2544 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2545 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2546 // .... -> Stereo type
2547 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2548 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2549 aValuesList.clear();
2550 anIndicesList.clear();
2552 SVTK_Viewer::stereoData( aValuesList, idList);
2553 foreach( int gid, idList ) anIndicesList << gid;
2554 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2555 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2556 // .... -> Anaglyph filter
2557 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2558 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2559 aValuesList.clear();
2560 anIndicesList.clear();
2561 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2562 anIndicesList << 0 << 1 << 2;
2564 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2565 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2567 // .... -> Enable quad-buffer support
2568 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2569 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2571 // .... -> background
2572 aValuesList.clear();
2573 anIndicesList.clear();
2576 #ifndef DISABLE_SALOMEOBJECT
2577 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2579 foreach( int gid, idList ) anIndicesList << gid;
2580 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2581 LightApp_Preferences::Background, "VTKViewer", "background" );
2582 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2583 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2584 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2585 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2586 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2587 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2588 pref->setItemProperty( "custom_enabled", false, bgId );
2589 #ifndef DISABLE_SALOMEOBJECT
2590 pref->setItemProperty( "image_formats", formats, bgId );
2592 // .... -> speed increment
2593 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2594 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2595 pref->setItemProperty( "min", 1, vtkSpeed );
2596 pref->setItemProperty( "max", 1000, vtkSpeed );
2597 // .... -> speed mode
2598 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2599 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2600 aValuesList.clear();
2601 anIndicesList.clear();
2602 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2603 anIndicesList << 0 << 1;
2604 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2605 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2607 // ... "Selection" group <<start>>
2608 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2609 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2610 // .... -> preselection
2611 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2612 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2613 aValuesList.clear();
2614 anIndicesList.clear();
2615 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2616 anIndicesList << 0 << 1 << 2;
2617 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2618 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2619 // .... -> enable selection
2620 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2621 // ... "Selection" group <<end>>
2623 // ... -> empty frame (for layout) <<end>>
2625 // ... space mouse sub-group <<start>>
2626 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2627 //pref->setItemProperty( "columns", 2, vtkSM );
2628 // .... -> decrease speed increment
2629 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2630 LightApp_Preferences::Selector, "VTKViewer",
2631 "spacemouse_func1_btn" );
2632 // .... -> increase speed increment
2633 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2634 LightApp_Preferences::Selector, "VTKViewer",
2635 "spacemouse_func2_btn" );
2636 // .... -> dominant / combined switch
2637 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2638 LightApp_Preferences::Selector, "VTKViewer",
2639 "spacemouse_func5_btn" ); //
2640 aValuesList.clear();
2641 anIndicesList.clear();
2642 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2643 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2644 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2645 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2646 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2647 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2648 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2649 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2650 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2651 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2652 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2653 // ... space mouse sub-group <<end>>
2655 // ... avi recording sub-group <<start>>
2656 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2657 pref->setItemProperty( "columns", 2, vtkRec );
2658 // .... -> recording mode
2659 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2660 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2661 aValuesList.clear();
2662 anIndicesList.clear();
2663 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2664 anIndicesList << 0 << 1;
2665 pref->setItemProperty( "strings", aValuesList, modePref );
2666 pref->setItemProperty( "indexes", anIndicesList, modePref );
2668 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2669 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2670 pref->setItemProperty( "min", 0.1, fpsPref );
2671 pref->setItemProperty( "max", 100, fpsPref );
2673 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2674 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2675 pref->setItemProperty( "min", 1, qualityPref );
2676 pref->setItemProperty( "max", 100, qualityPref );
2677 // .... -> progressive mode
2678 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2679 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2680 // ... avi recording sub-group <<end>>
2682 // ... group names sub-group <<start>>
2683 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2684 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2685 pref->setItemProperty( "columns", 2, vtkGN );
2686 // .... -> text color
2687 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2688 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2689 // .... -> transparency
2690 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2691 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2692 pref->setItemProperty( "min", 0.0, transPref );
2693 pref->setItemProperty( "max", 1.0, transPref );
2694 pref->setItemProperty( "step", 0.1, transPref );
2695 // ... -> group names sub-group <<end>>
2696 // .. "VTK viewer" group <<end>>
2699 // .. "Plot2d viewer" group <<start>>
2700 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2701 //pref->setItemProperty( "columns", 2, plot2dGroup );
2703 // ... -> background
2704 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2705 LightApp_Preferences::Color, "Plot2d", "Background" );
2706 // ... -> selection color
2707 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2708 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2710 // ... "Viewer" group <<start>>
2711 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2713 // .... -> curve type
2714 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2715 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2716 aValuesList.clear();
2717 anIndicesList.clear();
2718 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2719 anIndicesList << 0 << 1 << 2 ;
2720 pref->setItemProperty( "strings", aValuesList, curveType );
2721 pref->setItemProperty( "indexes", anIndicesList, curveType );
2722 // .... -> marker size
2723 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2724 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2725 pref->setItemProperty( "min", 0, markerSize );
2726 pref->setItemProperty( "max", 100, markerSize );
2727 // .... -> horizontal scaling mode
2728 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2729 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2730 aValuesList.clear();
2731 anIndicesList.clear();
2732 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2733 anIndicesList << 0 << 1 ;
2734 pref->setItemProperty( "strings", aValuesList, horScale );
2735 pref->setItemProperty( "indexes", anIndicesList, horScale );
2736 // .... -> vertical scaling mode
2737 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2738 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2739 pref->setItemProperty( "strings", aValuesList, verScale );
2740 pref->setItemProperty( "indexes", anIndicesList, verScale );
2742 // .... -> errors/deviation colot
2743 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2744 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2745 // .... -> deviation markers line size
2746 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2747 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2748 pref->setItemProperty( "min", 1, deviationMarkerLw );
2749 pref->setItemProperty( "max", 5, deviationMarkerLw );
2750 // .... -> deviation markers tick mark size
2751 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2752 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2753 pref->setItemProperty( "min", 1, deviationMarkerTs );
2754 pref->setItemProperty( "max", 5, deviationMarkerTs );
2755 // .... "Viewer" group <<end>>
2757 // ... "Legend" group <<start>>
2758 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2760 // .... -> show legend
2761 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2762 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2763 // .... -> legend position
2764 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2765 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2766 aValuesList.clear();
2767 anIndicesList.clear();
2768 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2769 anIndicesList << 0 << 1 << 2 << 3 ;
2770 pref->setItemProperty( "strings", aValuesList, legendPosition );
2771 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2772 // .... -> Symbol type
2773 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2774 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2775 aValuesList.clear();
2776 anIndicesList.clear();
2777 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2778 anIndicesList << 0 << 1 ;
2779 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2780 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2781 // .... -> legend font
2782 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2783 // ... -> font color
2784 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2785 // ... -> selection font color
2786 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2787 // ... "Legend" group <<end>>
2789 // .. "Plot2d viewer" group <<end>>
2791 // .. "PyViewer" preferences tab <<start>>
2792 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2793 // ... "Font settings" group <<start>>
2794 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2795 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2796 LightApp_Preferences::Font, "PyEditor", "Font" );
2797 // ... "Font settings" group <<end>>
2798 // ... "Display settings" group <<start>>
2799 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2800 pref->setItemProperty( "columns", 2, pyDispGroup );
2801 // ... -> current line highlight
2802 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2803 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2804 // ... -> text wrapping
2805 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2806 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2807 // ... -> center cursor on scroll
2808 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2809 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2810 // ... -> line numbers area
2811 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2812 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2813 // ... "Display settings" group <<end>>
2814 // ... "Tab settings" group <<start>>
2815 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2816 pref->setItemProperty( "columns", 2, pyTabGroup );
2817 // ... -> tab whitespaces
2818 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2819 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2821 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2822 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2823 // ... "Tab settings" group <<end>>
2824 // ... "Vertical edge settings" group <<start>>
2825 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2826 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2827 // ... -> vertical edge
2828 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2829 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2830 // ... -> number of columns
2831 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2832 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2833 // ... "Vertical edge settings" group <<end>>
2834 // .. "PyEditor" preferences tab <<end>>
2836 // .. "Directories" preferences tab <<start>>
2837 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2838 // ... --> quick directories list
2839 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2840 pref->addPreference( tr( "" ), dirGroup,
2841 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2842 // .. "Directories" preferences tab <<end>>
2844 // .. "Object browser" preferences tab <<start>>
2845 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2847 // ... "Search tool" group <<start>>
2848 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2849 // .... --> auto-hide
2850 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2851 "ObjectBrowser", "auto_hide_search_tool" );
2852 // ... "Search tool" group <<end>>
2854 // ... "Object browser settings" group <<start>>
2855 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2856 pref->setItemProperty( "columns", 2, objSetGroup );
2857 // .... -> auto size first column
2858 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2859 "ObjectBrowser", "auto_size_first" );
2860 // .... -> auto size other columns
2861 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2862 "ObjectBrowser", "auto_size" );
2863 // .... -> resize columns on expand item
2864 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2865 "ObjectBrowser", "resize_on_expand_item" );
2866 // .... -> browse to published object
2867 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2868 "ObjectBrowser", "browse_published_object" );
2869 aValuesList.clear();
2870 anIndicesList.clear();
2871 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2872 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2873 pref->setItemProperty( "strings", aValuesList, browsePublished );
2874 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2875 // ... "Object browser settings" group <<end>>
2876 // .. "Object browser" preferences tab <<end>>
2878 // .. "Shortcuts" preferences tab <<start>>
2879 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2880 // ... "Shortcuts settings" group <<start>>
2881 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2882 pref->addPreference( tr( "" ), shortcutGroup,
2883 LightApp_Preferences::ShortcutTree, "shortcuts" );
2884 // ... "Shortcuts settings" group <<end>>
2885 // .. "Shortcuts" preferences tab <<end>>
2886 // . Top-level "SALOME" preferences group <<end>>
2892 Changes appearance of application according to changed preferences
2893 \param sec - section
2894 \param param - name of changed parameter
2896 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2898 SUIT_ResourceMgr* resMgr = resourceMgr();
2902 if ( sec == "viewers" && param == "drop_down_buttons" )
2904 ViewManagerList vmlist = viewManagers();
2905 foreach( SUIT_ViewManager* vm, vmlist )
2907 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2908 foreach( SUIT_ViewWindow* vw, vwlist )
2909 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2913 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2915 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2916 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2917 QList<SUIT_ViewManager*> lst;
2918 #ifndef DISABLE_OCCVIEWER
2919 viewManagers( OCCViewer_Viewer::Type(), lst );
2920 QListIterator<SUIT_ViewManager*> itOCC( lst );
2921 while ( itOCC.hasNext() && sz >= 0 )
2923 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2924 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2927 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2928 occVM->setTrihedronSize( sz, relative );
2929 occVM->getAISContext()->UpdateCurrentViewer();
2932 #ifndef DISABLE_VTKVIEWER
2933 #ifndef DISABLE_SALOMEOBJECT
2934 viewManagers( SVTK_Viewer::Type(), lst );
2935 QListIterator<SUIT_ViewManager*> itVTK( lst );
2936 while ( itVTK.hasNext() && sz >= 0 )
2938 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2939 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2942 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2945 vtkVM->setTrihedronSize( sz, relative );
2953 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2955 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2956 QList<SUIT_ViewManager*> lst;
2957 #ifndef DISABLE_OCCVIEWER
2958 viewManagers( OCCViewer_Viewer::Type(), lst );
2959 QListIterator<SUIT_ViewManager*> itOCC( lst );
2960 while ( itOCC.hasNext() )
2962 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2963 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2966 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2969 occVM->setStaticTrihedronDisplayed( isVisible );
2973 #ifndef DISABLE_VTKVIEWER
2974 #ifndef DISABLE_SALOMEOBJECT
2975 viewManagers( SVTK_Viewer::Type(), lst );
2976 QListIterator<SUIT_ViewManager*> itVTK( lst );
2977 while ( itVTK.hasNext() )
2979 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2980 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2983 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2986 vtkVM->setStaticTrihedronVisible( isVisible );
2994 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2996 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2997 QList<SUIT_ViewManager*> lst;
2998 #ifndef DISABLE_OCCVIEWER
2999 viewManagers( OCCViewer_Viewer::Type(), lst );
3000 QListIterator<SUIT_ViewManager*> itOCC( lst );
3001 while ( itOCC.hasNext() )
3003 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3004 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3007 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3008 occVM->setInteractionStyle( mode );
3011 #ifndef DISABLE_VTKVIEWER
3012 #ifndef DISABLE_SALOMEOBJECT
3013 viewManagers( SVTK_Viewer::Type(), lst );
3014 QListIterator<SUIT_ViewManager*> itVTK( lst );
3015 while ( itVTK.hasNext() )
3017 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3018 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3021 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3022 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3028 #ifndef DISABLE_OCCVIEWER
3029 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3031 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3032 QList<SUIT_ViewManager*> lst;
3033 viewManagers( OCCViewer_Viewer::Type(), lst );
3034 QListIterator<SUIT_ViewManager*> it( lst );
3035 while ( it.hasNext() )
3037 SUIT_ViewModel* vm = it.next()->getViewModel();
3038 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3041 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3042 occVM->enablePreselection( isToEnablePreselection );
3047 #ifndef DISABLE_OCCVIEWER
3048 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3050 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3051 QList<SUIT_ViewManager*> lst;
3052 viewManagers( OCCViewer_Viewer::Type(), lst );
3053 QListIterator<SUIT_ViewManager*> it( lst );
3054 while ( it.hasNext() )
3056 SUIT_ViewModel* vm = it.next()->getViewModel();
3057 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3060 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3061 occVM->enableSelection( isToEnableSelection );
3066 #ifndef DISABLE_OCCVIEWER
3067 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3069 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3070 QList<SUIT_ViewManager*> lst;
3071 viewManagers( OCCViewer_Viewer::Type(), lst );
3072 QListIterator<SUIT_ViewManager*> it( lst );
3073 while ( it.hasNext() )
3075 SUIT_ViewModel* vm = it.next()->getViewModel();
3076 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3079 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3080 occVM->setClippingColor( aColor );
3085 #ifndef DISABLE_OCCVIEWER
3086 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3087 param == QString( "clipping_texture" ) ||
3088 param == QString( "clipping_modulate" ) ||
3089 param == QString( "clipping_scale" ) ) )
3091 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3092 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3093 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3094 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3095 QList<SUIT_ViewManager*> lst;
3096 viewManagers( OCCViewer_Viewer::Type(), lst );
3097 QListIterator<SUIT_ViewManager*> it( lst );
3098 while ( it.hasNext() )
3100 SUIT_ViewModel* vm = it.next()->getViewModel();
3101 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3104 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3105 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3110 #ifndef DISABLE_OCCVIEWER
3111 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3113 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3114 QList<SUIT_ViewManager*> lst;
3115 viewManagers( OCCViewer_Viewer::Type(), lst );
3116 QListIterator<SUIT_ViewManager*> it( lst );
3117 while ( it.hasNext() )
3119 SUIT_ViewModel* vm = it.next()->getViewModel();
3120 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3123 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3124 occVM->setProjectionType( mode );
3128 #if OCC_VERSION_LARGE > 0x06090000
3129 #ifndef DISABLE_OCCVIEWER
3130 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3132 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3133 QList<SUIT_ViewManager*> lst;
3134 viewManagers( OCCViewer_Viewer::Type(), lst );
3135 QListIterator<SUIT_ViewManager*> it( lst );
3136 while ( it.hasNext() )
3138 SUIT_ViewModel* vm = it.next()->getViewModel();
3139 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3142 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3143 occVM->setStereoType( mode );
3148 #ifndef DISABLE_OCCVIEWER
3149 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3151 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3152 QList<SUIT_ViewManager*> lst;
3153 viewManagers( OCCViewer_Viewer::Type(), lst );
3154 QListIterator<SUIT_ViewManager*> it( lst );
3155 while ( it.hasNext() )
3157 SUIT_ViewModel* vm = it.next()->getViewModel();
3158 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3161 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3162 occVM->setAnaglyphFilter( mode );
3167 #ifndef DISABLE_OCCVIEWER
3168 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3169 param == QString( "focus_value" ) ) )
3171 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3172 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3173 QList<SUIT_ViewManager*> lst;
3174 viewManagers( OCCViewer_Viewer::Type(), lst );
3175 QListIterator<SUIT_ViewManager*> it( lst );
3176 while ( it.hasNext() )
3178 SUIT_ViewModel* vm = it.next()->getViewModel();
3179 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3182 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3183 occVM->setStereographicFocus( aType, aValue );
3188 #ifndef DISABLE_OCCVIEWER
3189 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3190 param == QString( "iod_value" ) ) )
3192 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3193 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3194 QList<SUIT_ViewManager*> lst;
3195 viewManagers( OCCViewer_Viewer::Type(), lst );
3196 QListIterator<SUIT_ViewManager*> it( lst );
3197 while ( it.hasNext() )
3199 SUIT_ViewModel* vm = it.next()->getViewModel();
3200 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3203 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3204 occVM->setInterocularDistance( aType, aValue );
3209 #ifndef DISABLE_OCCVIEWER
3210 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3212 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3213 QList<SUIT_ViewManager*> lst;
3214 viewManagers( OCCViewer_Viewer::Type(), lst );
3215 QListIterator<SUIT_ViewManager*> it( lst );
3216 while ( it.hasNext() )
3218 SUIT_ViewModel* vm = it.next()->getViewModel();
3219 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3222 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3223 occVM->setReverseStereo( reverse );
3228 #ifndef DISABLE_OCCVIEWER
3229 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3231 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3232 QList<SUIT_ViewManager*> lst;
3233 viewManagers( OCCViewer_Viewer::Type(), lst );
3234 QListIterator<SUIT_ViewManager*> it( lst );
3235 while ( it.hasNext() )
3237 SUIT_ViewModel* vm = it.next()->getViewModel();
3238 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3241 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3242 occVM->setVSync( enable );
3247 #ifndef DISABLE_OCCVIEWER
3248 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3250 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3251 QList<SUIT_ViewManager*> lst;
3252 viewManagers( OCCViewer_Viewer::Type(), lst );
3253 QListIterator<SUIT_ViewManager*> it( lst );
3254 while ( it.hasNext() )
3256 SUIT_ViewModel* vm = it.next()->getViewModel();
3257 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3260 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3261 occVM->setQuadBufferSupport( enable );
3266 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3268 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3269 QList<SUIT_ViewManager*> lst;
3270 #ifndef DISABLE_OCCVIEWER
3271 viewManagers( OCCViewer_Viewer::Type(), lst );
3272 QListIterator<SUIT_ViewManager*> itOCC( lst );
3273 while ( itOCC.hasNext() )
3275 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3276 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3279 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3280 occVM->setZoomingStyle( mode );
3283 #ifndef DISABLE_VTKVIEWER
3284 #ifndef DISABLE_SALOMEOBJECT
3285 viewManagers( SVTK_Viewer::Type(), lst );
3286 QListIterator<SUIT_ViewManager*> itVTK( lst );
3287 while ( itVTK.hasNext() )
3289 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3290 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3293 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3294 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3300 #ifndef DISABLE_VTKVIEWER
3301 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3303 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3304 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3305 QList<SUIT_ViewManager*> lst;
3306 #ifndef DISABLE_SALOMEOBJECT
3307 viewManagers( SVTK_Viewer::Type(), lst );
3308 QListIterator<SUIT_ViewManager*> it( lst );
3309 while ( it.hasNext() )
3311 SUIT_ViewModel* vm = it.next()->getViewModel();
3312 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3315 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3316 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3322 #ifndef DISABLE_VTKVIEWER
3323 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3325 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3326 QList<SUIT_ViewManager*> lst;
3327 #ifndef DISABLE_SALOMEOBJECT
3328 viewManagers( SVTK_Viewer::Type(), lst );
3329 QListIterator<SUIT_ViewManager*> it( lst );
3330 while ( it.hasNext() )
3332 SUIT_ViewModel* vm = it.next()->getViewModel();
3333 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3336 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3337 if( vtkVM ) vtkVM->setProjectionMode( mode );
3343 #ifndef DISABLE_VTKVIEWER
3344 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3346 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3347 QList<SUIT_ViewManager*> lst;
3348 #ifndef DISABLE_SALOMEOBJECT
3349 viewManagers( SVTK_Viewer::Type(), lst );
3350 QListIterator<SUIT_ViewManager*> it( lst );
3351 while ( it.hasNext() )
3353 SUIT_ViewModel* vm = it.next()->getViewModel();
3354 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3357 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3358 if( vtkVM ) vtkVM->setStereoType( mode );
3364 #ifndef DISABLE_VTKVIEWER
3365 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3367 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3368 QList<SUIT_ViewManager*> lst;
3369 #ifndef DISABLE_SALOMEOBJECT
3370 viewManagers( SVTK_Viewer::Type(), lst );
3371 QListIterator<SUIT_ViewManager*> it( lst );
3372 while ( it.hasNext() )
3374 SUIT_ViewModel* vm = it.next()->getViewModel();
3375 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3378 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3379 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3385 #ifndef DISABLE_VTKVIEWER
3386 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3388 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3389 QList<SUIT_ViewManager*> lst;
3390 #ifndef DISABLE_SALOMEOBJECT
3391 viewManagers( SVTK_Viewer::Type(), lst );
3392 QListIterator<SUIT_ViewManager*> it( lst );
3393 while ( it.hasNext() )
3395 SUIT_ViewModel* vm = it.next()->getViewModel();
3396 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3399 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3400 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3406 #ifndef DISABLE_VTKVIEWER
3407 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3409 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3410 QList<SUIT_ViewManager*> lst;
3411 #ifndef DISABLE_SALOMEOBJECT
3412 viewManagers( SVTK_Viewer::Type(), lst );
3413 QListIterator<SUIT_ViewManager*> it( lst );
3414 while ( it.hasNext() )
3416 SUIT_ViewModel* vm = it.next()->getViewModel();
3417 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3420 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3421 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3427 #ifndef DISABLE_VTKVIEWER
3428 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3429 param == QString( "spacemouse_func2_btn" ) ||
3430 param == QString( "spacemouse_func5_btn" ) ) )
3432 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3433 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3434 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3435 QList<SUIT_ViewManager*> lst;
3436 #ifndef DISABLE_SALOMEOBJECT
3437 viewManagers( SVTK_Viewer::Type(), lst );
3438 QListIterator<SUIT_ViewManager*> it( lst );
3439 while ( it.hasNext() )
3441 SUIT_ViewModel* vm = it.next()->getViewModel();
3442 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3445 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3446 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3451 if( sec=="ObjectBrowser" )
3453 SUIT_DataBrowser* ob = objectBrowser();
3457 if ( param=="auto_size_first" )
3459 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3460 ob->setAutoSizeFirstColumn( autoSizeFirst );
3461 if ( autoSizeFirst )
3462 ob->adjustFirstColumnWidth();
3464 else if ( param=="auto_size" ) {
3465 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3466 ob->setAutoSizeColumns(autoSize);
3468 ob->adjustColumnsWidth();
3470 else if ( param=="resize_on_expand_item" ) {
3471 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3472 ob->setResizeOnExpandItem(resizeOnExpandItem);
3474 else if ( param == "auto_hide_search_tool" ) {
3475 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3481 if( param=="auto_save_interval" ) {
3482 myAutoSaveTimer->stop();
3483 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3484 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3488 #ifndef DISABLE_PYCONSOLE
3489 if( sec=="PyConsole" && pythonConsole() )
3491 if ( param=="font" ) {
3492 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3494 else if ( param=="show_banner" ) {
3495 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3502 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3504 if ( param == "visible_count" )
3505 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3506 else if ( param == "max_count" )
3507 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3508 else if ( param == "insert_mode" )
3509 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3510 else if ( param == "link_type" )
3511 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3512 else if ( param == "show_clear" )
3513 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3514 else if ( param == "show_mru" )
3515 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3518 if ( sec == "language" && param == "language" )
3520 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3521 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3523 if ( sec == "language" && param == "locale")
3525 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3526 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3528 if ( sec == "desktop" && param == "opaque_resize" ) {
3529 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3530 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3531 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3532 else dopts &= ~QMainWindow::AnimatedDocks;
3533 desktop()->setDockOptions( dopts );
3534 desktop()->setOpaqueResize( opaqueResize );
3535 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3536 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3539 #ifndef DISABLE_PLOT2DVIEWER
3540 QList<SUIT_ViewManager*> lst;
3541 viewManagers( Plot2d_Viewer::Type(), lst );
3542 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3543 while ( itPlot2d.hasNext() ) {
3544 SUIT_ViewManager* viewMgr = itPlot2d.next();
3545 SUIT_ViewModel* vm = viewMgr->getViewModel();
3546 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3549 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3551 viewMgr->setViewModel( vm );
3552 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3554 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3555 frame->SetPreference();
3560 #ifndef DISABLE_PYVIEWER
3561 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3562 param == QString( "LineNumberArea" ) ||
3563 param == QString( "TextWrapping" ) ||
3564 param == QString( "CenterCursorOnScroll" ) ||
3565 param == QString( "TabSpaceVisible" ) ||
3566 param == QString( "TabSize" ) ||
3567 param == QString( "VerticalEdge" ) ||
3568 param == QString( "NumberColumns" ) ||
3569 param == QString( "Font" ) ) )
3571 QList<SUIT_ViewManager*> lst;
3572 viewManagers( PyViewer_Viewer::Type(), lst );
3573 QListIterator<SUIT_ViewManager*> itPy( lst );
3574 while ( itPy.hasNext() )
3576 SUIT_ViewManager* viewMgr = itPy.next();
3577 SUIT_ViewModel* vm = viewMgr->getViewModel();
3578 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3581 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3583 viewMgr->setViewModel( vm );
3584 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3587 pyView->setPreferences();
3597 void LightApp_Application::loadPreferences()
3599 CAM_Application::loadPreferences();
3601 SUIT_ResourceMgr* aResMgr = resourceMgr();
3606 static bool mru_load = true;
3609 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3611 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3612 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3613 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3614 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3615 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3616 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3617 mru->loadLinks( aResMgr, "MRU" );
3623 QStringList mods = aResMgr->parameters( "windows_visibility" );
3624 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3627 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3628 myWinVis.insert( *itr, arr );
3632 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3633 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3634 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3635 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3636 else dopts &= ~QMainWindow::AnimatedDocks;
3637 desktop()->setDockOptions( dopts );
3638 desktop()->setOpaqueResize( opaqueResize );
3639 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3640 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3647 void LightApp_Application::savePreferences()
3649 CAM_Application::savePreferences();
3651 saveDockWindowsState();
3653 SUIT_ResourceMgr* aResMgr = resourceMgr();
3658 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3660 mru->saveLinks( aResMgr, "MRU" );
3662 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3663 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3666 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3668 #if GUI_DEVELOPMENT > 0
3669 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3671 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3678 Updates desktop title
3680 void LightApp_Application::updateDesktopTitle()
3682 QString aTitle = applicationName();
3683 QString aVer = applicationVersion();
3684 if ( !aVer.isEmpty() )
3685 aTitle += QString( " " ) + aVer;
3687 if ( activeStudy() ) {
3688 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3689 aTitle += QString( " - [%1]" ).arg( sName );
3692 desktop()->setWindowTitle( aTitle );
3696 \brief Get map of the operations which can be performed
3697 on the module activation.
3699 The method should return the map of the kind \c {<id>:<name>}
3700 where \c <id> is an integer identifier of the operation and
3701 \c <name> is a title for the button to be added to the
3702 dialog box. After user selects the required operation by the
3703 clicking the corresponding button in the dialog box, its identifier
3704 is passed to the moduleActionSelected() method to process
3707 \return map of the operations
3708 \sa moduleActionSelected()
3710 QMap<int, QString> LightApp_Application::activateModuleActions() const
3712 QMap<int, QString> opmap;
3713 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3714 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3719 \brief Called when the used selectes required operation chosen
3720 from "Activate module" dialog box.
3722 Performs the required operation according to the user choice.
3724 \param id operation identifier
3725 \sa activateModuleActions()
3727 void LightApp_Application::moduleActionSelected( const int id )
3742 Updates windows after close document
3744 void LightApp_Application::afterCloseDoc()
3748 CAM_Application::afterCloseDoc();
3752 Updates actions of active module
3754 void LightApp_Application::updateModuleActions()
3757 if ( activeModule() ) {
3758 modName = activeModule()->moduleName();
3759 if ( !isModuleAccessible( modName ) ) {
3760 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3761 foreach( SUIT_Application* app, apps ) {
3762 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3763 if ( lapp && lapp != this )
3764 lapp->removeModuleAction( modName );
3769 LightApp_ModuleAction* moduleAction =
3770 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3772 moduleAction->setActiveModule( modName );
3775 void LightApp_Application::removeModuleAction( const QString& modName )
3777 LightApp_ModuleAction* moduleAction =
3778 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3780 moduleAction->removeModule( modName );
3784 Gets current windows.
3785 \param winMap - output current windows map.
3787 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3790 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3791 ((LightApp_Module*)activeModule())->windows( winMap );
3793 defaultWindows( winMap );
3797 Gets current view managers.
3798 \param lst - output current view managers list.
3800 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3803 if ( !activeStudy() )
3806 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3807 ((LightApp_Module*)activeModule())->viewManagers( lst );
3809 defaultViewManagers( lst );
3815 void LightApp_Application::updateWindows()
3817 QMap<int, int> winMap;
3818 currentWindows( winMap );
3820 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3822 if ( !dockWindow( it.key() ) )
3823 getWindow( it.key() );
3826 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3828 QWidget* wid = it.value();
3829 if ( winMap.contains( it.key() ) )
3830 wid->setVisible( true );
3835 loadDockWindowsState();
3839 Updates view managers
3841 void LightApp_Application::updateViewManagers()
3844 currentViewManagers( lst );
3846 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3847 getViewManager( *it, true );
3851 Loads windows geometry
3853 void LightApp_Application::loadDockWindowsState()
3857 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3858 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3859 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3862 if ( activeModule() )
3863 modName = activeModule()->name();
3864 else if ( activeStudy() )
3865 modName = "nomodule";
3867 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3868 QByteArray aDefaultState;
3869 aResMgr->value( "windows_geometry", modName, aDefaultState );
3870 QByteArray aDefaultVisibility;
3871 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3872 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3873 aResMgr->setWorkingMode( prevMode );
3875 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3878 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3879 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3881 if ( version > Qtx::versionToId( "7.4.1" ) )
3882 aResMgr->value( "windows_geometry", modName , arr );
3884 arr = aDefaultState;
3885 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3886 desktop()->restoreState( aTargetArray );
3889 QStringList mainToolbarsNames;
3890 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3891 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3892 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3894 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3897 QMap<QString, bool> *tbMap = 0;
3898 QMap<QString, bool> *dwMap = 0;
3900 QMap<QString, bool> userTbMap, userDwMap;
3901 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3903 QMap<QString, bool> defaultTbMap, defaultDwMap;
3904 if(hasDefaultVisibility) {
3905 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3911 if(hasDefaultVisibility){
3912 tbMap = &defaultTbMap;
3919 if(hasDefaultVisibility){
3920 dwMap = &defaultDwMap;
3925 QList<QToolBar*> tbList = findToolBars();
3926 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3928 QToolBar* tb = *tit;
3929 if ( tbMap->contains( tb->objectName() ) ) {
3930 tb->setVisible( (*tbMap)[tb->objectName()] );
3936 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3937 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3939 QDockWidget* dw = *dit;
3941 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3942 if ( po != desktop() )
3945 if ( dwMap->contains( dw->objectName() ) )
3946 dw->setVisible( (*dwMap)[dw->objectName()] );
3954 Saves windows geometry
3956 void LightApp_Application::saveDockWindowsState()
3961 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3962 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3964 if( !storeWin && !storeTb )
3968 if ( activeModule() )
3969 modName = activeModule()->name();
3970 else if ( activeStudy() )
3971 modName = "nomodule";
3973 QString versionId = GUI_VERSION_STR;
3974 #if GUI_DEVELOPMENT > 0
3978 QByteArray arr = desktop()->saveState();
3979 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3980 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3983 if ( myWinVis.contains( modName ) )
3984 visArr = myWinVis[modName];
3986 QMap<QString, bool> tbMap, dwMap;
3987 dockWindowsState( visArr, tbMap, dwMap );
3989 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3990 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3993 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3996 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3997 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3999 QDockWidget* wid = *it;
4000 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4003 visArr = dockWindowsState( tbMap, dwMap );
4005 myWinVis.insert( modName, visArr );
4008 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4011 QDataStream stream( &visArr, QIODevice::WriteOnly );
4013 stream << (uchar)ToolBarMarker;
4014 stream << tb.size();
4015 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4017 stream << tit.key();
4018 stream << (uchar)( tit.value() ? 1 : 0 );
4021 stream << (uchar)DockWidgetMarker;
4022 stream << dw.size();
4023 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4025 stream << wit.key();
4026 stream << (uchar)( wit.value() ? 1 : 0 );
4032 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4037 QByteArray visArr = arr;
4038 QDataStream stream( &visArr, QIODevice::ReadOnly );
4042 if ( marker != ToolBarMarker )
4047 for ( int i = 0; i < lines; ++i )
4050 stream >> objectName;
4053 tb.insert( objectName, shown );
4057 if ( marker != DockWidgetMarker )
4061 for ( int j = 0; j < lines; ++j )
4064 stream >> objectName;
4067 dw.insert( objectName, shown );
4072 Adds icon names for modules
4074 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4078 SUIT_ResourceMgr* resMgr = resourceMgr();
4082 QStringList modList;
4083 modules( modList, false );
4085 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4087 QString modName = *it;
4088 QString modIntr = moduleName( modName );
4089 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4091 if ( modIcon.isEmpty() )
4094 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4095 modIcon += QString( ".png" );
4097 iconMap.insert( modName, modIcon );
4102 Inserts items in popup, which necessary for current application
4104 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4107 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4108 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4109 selMgr->setSelectionCacheEnabled( true );
4111 SUIT_DataBrowser* ob = objectBrowser();
4113 CAM_Application::contextMenuPopup( type, thePopup, title );
4115 if ( ob && type == ob->popupClientType() ) {
4116 thePopup->addSeparator();
4117 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4118 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4119 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4122 #ifndef DISABLE_SALOMEOBJECT
4123 if ( selMgr && ob ) {
4124 SALOME_ListIO selected;
4125 selMgr->selectedObjects( selected );
4126 if(selected.Extent() == 1){
4127 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4128 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4129 if(obj && obj->renameAllowed()) {
4130 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4131 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4132 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4133 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4135 QList<QAction*> acts = thePopup->actions();
4136 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4137 thePopup->insertAction(firstAction,a);
4143 selMgr->setSelectionCacheEnabled( cacheIsOn );
4149 void LightApp_Application::createEmptyStudy()
4151 CAM_Application::createEmptyStudy();
4153 if ( objectBrowser() )
4154 objectBrowser()->updateTree();
4156 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4157 if ( aResMgr && activeStudy() ) {
4158 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4159 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4164 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4166 CAM_Application::setDesktop( desk );
4169 connect( desk, SIGNAL( message( const QString& ) ),
4170 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4171 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4172 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4173 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4174 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4180 \param mod - module to be activated
4182 bool LightApp_Application::activateModule( CAM_Module* mod )
4184 bool res = CAM_Application::activateModule( mod );
4186 if ( objectBrowser() )
4187 objectBrowser()->updateTree();
4193 \return keyborad accelerators manager object
4195 SUIT_Accel* LightApp_Application::accel() const
4201 Removes dead widget container from map
4203 void LightApp_Application::onWCDestroyed( QObject* ob )
4205 // remove destroyed widget container from windows map
4206 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4208 if ( itr.value() != ob )
4211 int key = itr.key();
4212 myWin.remove( key );
4217 void LightApp_Application::onMRUActivated( const QString& name )
4219 SUIT_Session* s = SUIT_Session::session();
4220 if ( s && s->activeApplication() == this )
4224 void LightApp_Application::onStylePreferences()
4226 Style_PrefDlg dlg( desktop() );
4229 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4232 void LightApp_Application::onFullScreen(){
4233 if(myScreenHelper) {
4234 if(desktop()->isFullScreen())
4235 myScreenHelper->switchToNormalScreen();
4237 myScreenHelper->switchToFullScreen();
4242 Connects just added view manager
4244 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4246 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4247 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4248 CAM_Application::addViewManager( vm );
4252 Remove view manager from memory
4254 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4256 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4257 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4258 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4260 aStudy->removeObjectProperties( vm->getGlobalId() );
4262 CAM_Application::removeViewManager( vm );
4264 LightApp_SelectionMgr* selMgr = selectionMgr();
4265 QList<SUIT_Selector*> selectors;
4266 selMgr->selectors( selectors );
4267 foreach( SUIT_Selector* selector, selectors ) {
4268 if ( selector->owner() == vm->getViewModel() ) {
4273 // IPAL22894: Crash on closing OCC view
4279 Renames active window of desktop
4281 void LightApp_Application::onRenameWindow()
4286 QWidget* w = desktop()->activeWindow();
4291 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4292 if( ok && !name.isEmpty() )
4293 w->setWindowTitle( name );
4297 Closes active window of desktop
4299 void LightApp_Application::onCloseWindow()
4304 QWidget* w = desktop()->activeWindow();
4312 Closes all windows of desktop
4314 void LightApp_Application::onCloseAllWindow()
4316 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4320 QList<SUIT_ViewWindow*> wndList = desk->windows();
4321 SUIT_ViewWindow* wnd;
4322 foreach( wnd, wndList )
4330 Groups all windows of desktop
4332 void LightApp_Application::onGroupAllWindow()
4334 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4338 QtxWorkstack* wgStack = desk->workstack();
4344 \return if the library of module exists
4345 \param moduleTitle - title of module
4347 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4349 if( moduleTitle.isEmpty() )
4352 QString lib = moduleLibrary( moduleTitle );
4354 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4355 bool isPythonModule = lib.contains("SalomePyQtGUI");
4356 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4360 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4362 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4365 bool isLibFound = false;
4366 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4367 for( ; anIt!=aLast; anIt++ )
4369 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4380 INFOS( "\n****************************************************************" << std::endl
4381 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4382 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4383 << "****************************************************************" << std::endl );
4385 else if ( !isPythonModule && !isPythonLightModule)
4388 if ( isPythonModule || isPythonLightModule)
4390 QString pylib = moduleName( moduleTitle ) + QString(".py");
4391 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4393 // Check the python library
4395 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4397 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4399 bool isPyLib = false, isPyGuiLib = false;
4400 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4401 for( ; anIt!=aLast; anIt++ )
4403 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4404 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4406 if(!isPythonLightModule)
4407 if( !isPyLib && inf.exists() )
4410 if( !isPyGuiLib && infgui.exists() )
4413 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4417 printf( "\n****************************************************************\n" );
4418 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4420 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4422 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4423 printf( "****************************************************************\n" );
4430 \return default name for an active study
4432 void LightApp_Application::setDefaultStudyName( const QString& theName )
4434 QStringList anInfoList;
4435 modules( anInfoList, false );
4437 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4438 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4439 !aStudy->isSaved() )
4441 aStudy->setStudyName( theName );
4442 updateDesktopTitle();
4447 Custom event handler
4449 bool LightApp_Application::event( QEvent* e )
4451 if( e && e->type()==2000 )
4453 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4454 QString* d = ( QString* )ce->data();
4455 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4457 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4458 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4459 showPreferences( tr( "PREF_APP" ) );
4464 return CAM_Application::event( e );
4467 /*! Check data object */
4468 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4472 bool isSuitable = !theObj->entry().isEmpty() &&
4473 !theObj->componentDataType().isEmpty() &&
4474 !theObj->name().isEmpty();
4481 int LightApp_Application::openChoice( const QString& aName )
4483 int choice = CAM_Application::openChoice( aName );
4485 if ( choice == OpenExist ) // The document is already open.
4487 // Do you want to reload it?
4488 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4489 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4490 choice = OpenReload;
4496 bool LightApp_Application::openAction( const int choice, const QString& aName )
4503 STD_Application* app = 0;
4504 SUIT_Session* session = SUIT_Session::session();
4505 QList<SUIT_Application*> appList = session->applications();
4506 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4508 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4509 app = ::qobject_cast<STD_Application*>( *it );
4514 app->onCloseDoc( false );
4515 appList = session->applications();
4516 STD_Application* other = 0;
4517 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4518 other = ::qobject_cast<STD_Application*>( *it );
4521 res = other->onOpenDoc( aName );
4526 res = CAM_Application::openAction( choice, aName );
4533 QStringList LightApp_Application::viewManagersTypes() const
4535 QStringList aTypesList;
4536 aTypesList += myUserWmTypes;
4537 #ifndef DISABLE_GLVIEWER
4538 aTypesList<<GLViewer_Viewer::Type();
4540 #ifndef DISABLE_PLOT2DVIEWER
4541 aTypesList<<Plot2d_Viewer::Type();
4543 #ifndef DISABLE_QXGRAPHVIEWER
4544 aTypesList<<QxScene_Viewer::Type();
4546 #ifndef DISABLE_PVVIEWER
4547 aTypesList<<PVViewer_Viewer::Type();
4549 #ifndef DISABLE_PYVIEWER
4550 aTypesList<<PyViewer_Viewer::Type();
4552 #ifndef DISABLE_OCCVIEWER
4553 aTypesList<<OCCViewer_Viewer::Type();
4555 #ifndef DISABLE_VTKVIEWER
4556 #ifndef DISABLE_SALOMEOBJECT
4557 aTypesList<<SVTK_Viewer::Type();
4559 aTypesList<<VTKViewer_Viewer::Type();
4565 * Removes all view managers of known types
4566 * Other view managers are ignored
4568 void LightApp_Application::clearKnownViewManagers()
4570 QStringList aTypesList = viewManagersTypes();
4571 QList<SUIT_ViewManager*> aMgrList;
4572 viewManagers( aMgrList );
4573 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4574 if (aTypesList.contains(aMgr->getType()))
4575 removeViewManager(aMgr);
4580 Copy of current selection
4582 void LightApp_Application::onCopy()
4584 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4590 Paste of current data in clipboard
4592 void LightApp_Application::onPaste()
4594 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4600 Browse (i.e. set focus on) the published objects
4601 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4602 has been accepted by Ok (or Apply & Close) button
4603 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4604 (to select the first published object only)
4605 \return entry of the selected object
4607 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4608 const bool theIsApplyAndClose,
4609 const bool theIsOptimizedBrowsing )
4612 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4614 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4615 switch( aBrowsePolicy )
4619 case BP_ApplyAndClose:
4620 if( !theIsApplyAndClose )
4628 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4632 SUIT_DataBrowser* anOB = objectBrowser();
4636 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4640 QStringListIterator anIter( theEntryList );
4641 if( theIsOptimizedBrowsing )
4643 // go to the last entry
4645 if( anIter.hasPrevious() )
4649 // scroll to each entry in the list
4650 // (in optimized mode - to the last entry only)
4652 LightApp_DataObject* anObject = 0;
4653 while( anIter.hasNext() )
4655 anEntry = anIter.next();
4656 if( !anEntry.isEmpty() )
4658 anObject = aStudy->findObjectByEntry( anEntry );
4661 QModelIndex anIndex = aModel->index( anObject );
4662 anOB->treeView()->scrollTo( anIndex );
4667 // always select the last object
4668 if( anObject && !anEntry.isEmpty() )
4670 QList<SUIT_Selector*> aSelectorList;
4671 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4672 if( !aSelectorList.isEmpty() )
4674 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4676 bool anIsAutoBlock = aSelector->autoBlock();
4678 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4679 aSelector->setAutoBlock( false );
4681 SUIT_DataOwnerPtrList aList;
4682 #ifndef DISABLE_SALOMEOBJECT
4683 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4684 ( anObject->entry().toLatin1().constData(),
4685 anObject->componentDataType().toLatin1().constData(),
4686 anObject->name().toLatin1().constData() );
4687 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4689 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4692 aList.append( owner );
4693 selectionMgr()->setSelected( aList );
4696 // restore auto block flag
4697 aSelector->setAutoBlock( anIsAutoBlock );
4705 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4707 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4708 return study ? study->findObjectByEntry( id ) : 0;
4712 Checks that an object can be renamed.
4713 \param entry entry of the object
4714 \brief Return \c true if object can be renamed
4716 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4721 Rename object by entry.
4722 \param entry entry of the object
4723 \param name new name of the object
4724 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4726 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4730 /*! Process standard messages from desktop */
4731 void LightApp_Application::onDesktopMessage( const QString& message )
4733 const QString sectionSeparator = "/";
4735 if ( message.toLower() == "updateobjectbrowser" ||
4736 message.toLower() == "updateobjbrowser" ) {
4737 // update object browser
4738 updateObjectBrowser();
4740 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4741 QString vtype = message.split( sectionSeparator ).last();
4742 if ( !vtype.isEmpty() )
4743 getViewManager( vtype, true );
4746 QStringList data = message.split( sectionSeparator );
4747 if ( data.count() > 1 ) {
4748 QString msgType = data[0].trimmed();
4749 LightApp_Module* sMod = 0;
4750 CAM_Module* mod = module( msgType );
4752 mod = module( moduleTitle( msgType ) );
4753 if ( mod && mod->inherits( "LightApp_Module" ) )
4754 sMod = (LightApp_Module*)mod;
4756 if ( msgType.toLower() == "preferences" ) {
4757 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4758 // for example "preferences/Study/multi_file_dump/true"
4759 if ( data.count() > 3 ) {
4760 QString section = data[1].trimmed();
4761 QString param = data[2].trimmed();
4762 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4763 resourceMgr()->setValue( section, param, value );
4767 // received message for the module
4768 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4769 sMod->message( msg );
4777 Returns all top level toolbars.
4778 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4780 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4782 QList<QToolBar*> aResult;
4783 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4784 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4785 QToolBar* tb = *tit;
4786 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4787 if ( po != desktop() )
4789 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4796 Internal method to parse toolbars and dockable windows state.
4798 QByteArray LightApp_Application::processState(QByteArray& input,
4799 const bool processWin,
4800 const bool processTb,
4801 const bool isRestoring,
4802 QByteArray defaultState) {
4805 bool hasDefaultState = !defaultState.isEmpty();
4806 bool isDockWinWriten = false;
4808 //Write date from users settings
4810 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4811 int marker, version;
4813 tmpInputData >> marker;
4814 tmpInputData >> version;
4815 tmpInputData >> dockmarker;
4816 tmpInputData >> nbDocWin;
4818 if(processWin && processTb && !isRestoring) {
4820 } else if(!processWin && !processTb ) {
4822 aRes = defaultState;
4824 QDataStream aData(&aRes, QIODevice::WriteOnly);
4825 QList<QToolBar*> aToolBars = findToolBars();
4828 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4829 QToolBar* tb = *tit;
4830 aNames.append(tb->objectName());
4833 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4834 if(toolBarMarkerIndex < 0)
4836 QDataStream anInputData(&input, QIODevice::ReadOnly);
4838 int toolBarMarkerIndexDef;
4839 if(hasDefaultState) {
4840 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4841 if(toolBarMarkerIndexDef < 0)
4844 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4846 QDataStream* aTargetData = 0;
4847 int aTargetIndex = -1;
4849 QByteArray currentArr = desktop()->saveState();
4850 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4851 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4852 if(processWin && useInputData) {
4853 aTargetData = &anInputData;
4854 aTargetIndex = toolBarMarkerIndex;
4856 //Write date from default settings
4857 if(hasDefaultState) {
4858 aTargetData = &anInputDataDef;
4859 aTargetIndex = toolBarMarkerIndexDef;
4861 //If no default state, write current snapshot of the dockable windows
4863 aTargetData = &anInputDataCur;
4864 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4865 aTargetIndex = toolBarMarkerIndexCur;
4870 if(aTargetData && aTargetIndex >= 0 ) {
4871 aTargetData->device()->seek(0);
4872 while( aTargetData->device()->pos() < aTargetIndex ) {
4877 isDockWinWriten = true;
4884 aTargetData = &anInputData;
4885 aTargetIndex = toolBarMarkerIndex;
4887 if(hasDefaultState) {
4888 aTargetData = &anInputDataDef;
4889 aTargetIndex = toolBarMarkerIndexDef;
4893 if(aTargetData && aTargetIndex >= 0) {
4895 if(!isDockWinWriten ) {
4896 //Write version marker
4897 int marker, version;
4898 aTargetData->device()->seek(0);
4899 *aTargetData >> marker;
4900 *aTargetData >> version;
4903 aData << (uchar) QDockWidgetMarker;
4905 int shift = 4*sizeof(int) + sizeof(QSize);
4906 index = aTargetIndex - shift;
4908 index = aTargetIndex;
4911 aTargetData->device()->seek(index);
4912 while(!aTargetData->atEnd()) {
4917 } else { // Not treat toolbars
4918 aData << (uchar) QToolBarMarker;
4919 aData << (int) 0; //Nb toolbars = 0
4926 \brief Emits operationFinished signal.
4927 \param theModuleName the name of the module which perfomed the operation
4928 \param theOperationName the operation name
4929 \param theEntryList the list of the created objects entries
4931 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4932 const QString& theOperationName,
4933 const QStringList& theEntryList )
4935 emit operationFinished( theModuleName, theOperationName, theEntryList );
4939 Update visibility state of given objects
4941 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4942 SUIT_ViewModel* theViewModel )
4944 if ( !theViewModel || theList.isEmpty() ) return;
4946 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4947 if ( !aStudy ) return;
4949 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4951 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4952 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4954 if ( !obj || aStudy->isComponent( obj->entry() ) )
4957 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4958 if ( anObjModule ) {
4959 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4961 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4962 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4963 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4964 anObjState = Qtx::ShownState;
4966 anObjState = Qtx::HiddenState;
4968 aStudy->setVisibilityState( obj->entry(), anObjState );
4975 * Called when window activated
4977 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4979 SUIT_DataBrowser* anOB = objectBrowser();
4982 SUIT_DataObject* rootObj = anOB->root();
4986 DataObjectList listObj = rootObj->children( true );
4988 SUIT_ViewModel* vmod = 0;
4989 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4990 vmod = vman->getViewModel();
4991 updateVisibilityState( listObj, vmod );
4995 Called then view manager removed
4997 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4999 ViewManagerList lst;
5000 viewManagers( lst );
5001 if ( lst.count() == 1) { // in case if closed last view window
5002 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5004 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5009 Check existing document.
5011 bool LightApp_Application::checkExistingDoc()
5014 if( activeStudy() ) {
5015 int answer = SUIT_MessageBox::question( desktop(),
5016 tr( "APPCLOSE_CAPTION" ),
5017 tr( "STUDYCLOSE_DESCRIPTION" ),
5018 tr( "APPCLOSE_SAVE" ),
5019 tr( "APPCLOSE_CLOSE" ),
5020 tr( "APPCLOSE_CANCEL" ), 0 );
5022 if ( activeStudy()->isSaved() ) {
5025 } else if ( onSaveAsDoc() ) {
5026 if( !closeDoc( false ) ) {
5033 else if( answer == 1 ) {
5035 } else if( answer == 2 ) {
5042 #ifndef DISABLE_PYCONSOLE
5044 PyConsole_Interp* LightApp_Application::getPyInterp()
5046 static PyConsole_Interp* myInterp = 0;
5048 myInterp = createPyInterp();
5052 PyConsole_Interp* LightApp_Application::createPyInterp()
5054 return new LightApp_PyInterp();
5057 #endif // DISABLE_PYCONSOLE