1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39 #include <PyConsole_Console.h>
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
61 #include <GUI_version.h>
63 #include <SALOME_Event.h>
65 #include <Style_Salome.h>
66 #include <Style_PrefDlg.h>
68 #include <CAM_Module.h>
69 #include <CAM_DataModel.h>
70 #include <CAM_Study.h>
71 #include <STD_TabDesktop.h>
73 #include <SUIT_DataBrowser.h>
74 #include <SUIT_Session.h>
75 #include <SUIT_Study.h>
76 #include <SUIT_FileDlg.h>
77 #include <SUIT_ResourceMgr.h>
78 #include <SUIT_ShortcutMgr.h>
79 #include <SUIT_Tools.h>
80 #include <SUIT_Accel.h>
81 #include <SUIT_MessageBox.h>
82 #include <SUIT_ViewWindow.h>
85 #include <QtxToolBar.h>
86 #include <QtxTreeView.h>
87 #include <QtxMRUAction.h>
88 #include <QtxDockAction.h>
89 #include <QtxDockWidget.h>
90 #include <QtxActionToolMgr.h>
91 #include <QtxSearchTool.h>
92 #include <QtxWorkstack.h>
95 #include <LogWindow.h>
97 #ifndef DISABLE_GLVIEWER
98 #include <GLViewer_Viewer.h>
99 #include <GLViewer_ViewManager.h>
100 #include "LightApp_GLSelector.h"
103 #ifndef DISABLE_PLOT2DVIEWER
104 #include <Plot2d_ViewManager.h>
105 #include <Plot2d_ViewModel.h>
106 #include <Plot2d_ViewWindow.h>
107 #include <Plot2d_ViewFrame.h>
108 #include "LightApp_Plot2dSelector.h"
109 #ifndef DISABLE_SALOMEOBJECT
110 #include <SPlot2d_ViewModel.h>
112 #include <Plot2d_ViewModel.h>
116 #ifndef DISABLE_OCCVIEWER
117 #include <OCCViewer_ViewManager.h>
118 #include <OCCViewer_ViewFrame.h>
119 #ifndef DISABLE_SALOMEOBJECT
120 #include <SOCC_ViewModel.h>
122 #include <OCCViewer_ViewModel.h>
124 #include "LightApp_OCCSelector.h"
127 #ifndef DISABLE_VTKVIEWER
128 #ifndef DISABLE_SALOMEOBJECT
129 #include <SVTK_ViewModel.h>
130 #include <SVTK_ViewManager.h>
131 #include "LightApp_VTKSelector.h"
133 #include <VTKViewer_ViewModel.h>
134 #include <VTKViewer_ViewManager.h>
136 #include <VTKViewer_ViewModel.h>
139 #ifndef DISABLE_QXGRAPHVIEWER
140 #include <QxScene_ViewManager.h>
141 #include <QxScene_ViewModel.h>
142 #include <QxScene_ViewWindow.h>
145 #ifndef DISABLE_GRAPHICSVIEW
146 #include "GraphicsView_Viewer.h"
147 #include "GraphicsView_ViewManager.h"
148 #include "LightApp_GVSelector.h"
151 #ifndef DISABLE_PVVIEWER
152 #include "PVViewer_ViewManager.h"
153 #include "PVViewer_ViewWindow.h"
154 #include "PVViewer_ViewModel.h"
158 #define VISIBILITY_COLUMN_WIDTH 25
164 #include <QStringList>
166 #include <QApplication>
168 #include <QStatusBar>
170 #include <QObjectList>
172 #include <QInputDialog>
173 #include <QFontDatabase>
175 #include <QByteArray>
179 #include <QHeaderView>
184 #include <utilities.h>
186 #define FIRST_HELP_ID 1000000
188 #ifndef DISABLE_SALOMEOBJECT
189 #include <SALOME_InteractiveObject.hxx>
190 #include <SALOME_ListIO.hxx>
193 #include <Standard_Version.hxx>
195 #define ToolBarMarker 0
196 #define DockWidgetMarker 1
198 static const char* imageEmptyIcon[] = {
201 "....................",
202 "....................",
203 "....................",
204 "....................",
205 "....................",
206 "....................",
207 "....................",
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "...................."};
222 int LightApp_Application::lastStudyId = 0;
224 // Markers used to parse array with dockable windows and toolbars state.
225 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
226 // in the Qt source code.
228 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
229 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
231 // Format of the Byte array with the windows and toolbar state is:
232 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
234 //Find toolbar marker position in the array in the following way:
235 //since the 'toolbar marker' is not unique, find index of first occurrence of the
236 //'toolbar marker' in the array and check that next string is name of the toolbar
238 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
239 int aResult = -1,tmp = 0;
240 int inputLen = input.length();
241 QDataStream anInputData(&input, QIODevice::ReadOnly);
242 while(tmp < inputLen) {
243 tmp = input.indexOf(QToolBarMarker, tmp + 1);
246 anInputData.device()->seek(tmp);
250 anInputData >> lines;
252 if(lines == 0 && anInputData.atEnd()){
253 //Case then array doesn't contain information about toolbars,
264 if(aFlags.contains(str)) {
273 \return last global id of study
275 int LightApp_Application::studyId()
277 return LightApp_Application::lastStudyId;
280 /*!Create new instance of LightApp_Application.*/
281 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
283 return new LightApp_Application();
286 /*! \var global preferences of LightApp */
287 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
291 \class LightApp_Application
292 Application containing LightApp module
296 LightApp_Application::LightApp_Application()
297 : CAM_Application( false ),
299 myScreenHelper(new LightApp_FullScreenHelper())
301 Q_INIT_RESOURCE( LightApp );
303 STD_TabDesktop* desk = new STD_TabDesktop();
304 desk->setFullScreenAllowed(false);
305 desk->setMinimizeAllowed(false);
309 // initialize auto save timer
310 myAutoSaveTimer = new QTimer( this );
311 myAutoSaveTimer->setSingleShot( true );
312 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
314 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
315 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
317 desktop()->setWindowIcon( aLogo );
318 desktop()->setDockableMenuBar( false );
319 desktop()->setDockableStatusBar( false );
321 // base logo (salome itself)
322 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
323 // extra logo (salome-based application)
324 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
328 mySelMgr = new LightApp_SelectionMgr( this );
330 myAccel = SUIT_Accel::getAccel();
332 #ifndef DISABLE_OCCVIEWER
333 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
334 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
335 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
336 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
337 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
338 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
339 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
340 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
341 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
342 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
343 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
346 #ifndef DISABLE_VTKVIEWER
347 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
351 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
354 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
355 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
356 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
360 #ifndef DISABLE_PLOT2DVIEWER
361 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
371 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
372 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
373 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
374 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
375 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
378 // Set existing font for the python console in resources
379 if( !aResMgr->hasValue( "PyConsole", "font" ) )
382 QFont f = aResMgr->fontValue( "PyConsole", "font" );
384 QStringList famdb = fdb.families();
386 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
389 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
391 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
394 if ( famdb.contains(aFamily) )
396 f.setFamily( aFamily );
397 aResMgr->setValue( "PyConsole", "font", f );
404 *\li Save window geometry.
405 *\li Save desktop geometry.
406 *\li Save resource maneger.
407 *\li Delete selection manager.
409 LightApp_Application::~LightApp_Application()
412 delete myScreenHelper;
415 /*!Start application.*/
416 void LightApp_Application::start()
418 CAM_Application::start();
421 updateViewManagers();
422 updateCommandsStatus();
425 desktop()->statusBar()->showMessage( "" );
427 LightApp_EventFilter::Init();
430 /*!Closeapplication.*/
431 void LightApp_Application::closeApplication()
433 QProcess::startDetached( "HelpBrowser",
434 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
436 CAM_Application::closeApplication();
439 /*!Gets application name.*/
440 QString LightApp_Application::applicationName() const
442 static QString _app_name;
443 if ( _app_name.isEmpty() )
444 _app_name = tr( "APP_NAME" );
448 /*!Gets application version.*/
449 QString LightApp_Application::applicationVersion() const
451 static QString _app_version;
453 if ( _app_version.isEmpty() )
455 QString resVersion = tr( "APP_VERSION" );
456 if ( resVersion != "APP_VERSION" )
458 _app_version = resVersion;
462 _app_version = GUI_VERSION_STR;
468 /*!Load module by \a name.*/
469 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
471 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
474 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
475 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
476 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
481 /*!Activate module by \a modName*/
482 bool LightApp_Application::activateModule( const QString& modName )
485 CAM_Module* prevMod = activeModule();
488 actName = prevMod->moduleName();
490 if ( actName == modName )
493 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
495 saveDockWindowsState();
497 bool status = CAM_Application::activateModule( modName );
499 updateModuleActions();
507 updateViewManagers();
509 if ( activeStudy() && activeStudy()->root() && objectBrowser() && objectBrowser()->root() != activeStudy()->root() ) {
510 objectBrowser()->setRoot( activeStudy()->root() );
511 updateObjectBrowser( true );
516 /*!Gets selection manager.*/
517 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
522 /*!Creat action "New window" for certain type of viewer:*/
523 void LightApp_Application::createActionForViewer( const int id,
525 const QString& suffix,
528 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
529 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
530 QAction* a = createAction( id, // menu action id
537 false, // toggle flag
539 SLOT( onNewWindow() ) ); // slot
540 createMenu( a, parentId, -1 );
545 void LightApp_Application::createActions()
547 CAM_Application::createActions();
549 SUIT_Desktop* desk = desktop();
550 SUIT_ResourceMgr* resMgr = resourceMgr();
553 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
554 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
555 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
559 // - Help for modules
561 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
562 createMenu( separator(), helpMenu, -1, 10 );
563 QStringList aModuleList;
564 modules( aModuleList, false );
565 aModuleList.prepend( "GUI" );
566 aModuleList.prepend( "KERNEL" );
568 int id = LightApp_Application::UserID + FIRST_HELP_ID;
571 foreach( aModule, aModuleList ) {
572 if ( aModule.isEmpty() ) // module title (user name)
574 IMap <QString, QString> helpData; // list of help files for the module
575 QString helpSubMenu; // help submenu name (empty if not needed)
576 QString modName = moduleName( aModule ); // module name
577 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
578 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
579 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
581 if (resMgr->hasValue( modName, "documentation" ) )
582 docSection = resMgr->stringValue(modName, "documentation");
583 else if ( resMgr->hasSection( modName + "_documentation" ) )
584 docSection = modName + "_documentation";
585 if ( !docSection.isEmpty() ) {
586 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
587 QStringList listOfParam = resMgr->parameters( docSection );
588 foreach( QString paramName, listOfParam ) {
589 QString valueStr = resMgr->stringValue( docSection, paramName );
590 if ( !valueStr.isEmpty() ) {
591 QFileInfo fi( valueStr );
592 if ( fi.isRelative() && !modDir.isEmpty() )
593 valueStr = Qtx::addSlash( modDir ) + valueStr;
594 if ( QFile::exists( valueStr ) )
595 helpData.insert( paramName.arg( aModule ), valueStr );
600 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
601 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
602 QString indexFile = idxLst.join( QDir::separator() ); // index file
603 if ( QFile::exists( indexFile ) )
604 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
607 IMapConstIterator<QString, QString > fileIt;
608 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
609 QString helpFileName = fileIt.key();
610 // remove all '//' occurances
611 while ( helpFileName.contains( "//" ) )
612 helpFileName.replace( "//", "" );
613 // obtain submenus hierarchy if given
614 QStringList smenus = helpFileName.split( "/" );
615 helpFileName = smenus.last();
617 QAction* a = createAction( id, helpFileName,
618 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
619 helpFileName, helpFileName,
620 0, desk, false, this, SLOT( onHelpContentsModule() ) );
621 a->setData( fileIt.value() );
622 if ( !helpSubMenu.isEmpty() ) {
623 smenus.prepend( helpSubMenu );
625 // create sub-menus hierarchy
626 int menuId = helpMenu;
627 foreach ( QString subMenu, smenus ) {
628 menuId = createMenu( subMenu, menuId, -1, 0 );
630 createMenu( a, menuId, -1, 0 );
635 // - Additional help items
637 createMenu( separator(), helpMenu, -1, 5 );
639 QStringList addHelpItems = resMgr->parameters( "add_help" );
640 foreach ( QString addHelpItem, addHelpItems ) {
641 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
642 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
643 QAction* a = createAction( id, addHelpItem,
644 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
645 addHelpItem, addHelpItem,
646 0, desk, false, this, SLOT( onHelpContentsModule() ) );
647 a->setData( valueStr );
648 createMenu( a, helpMenu, -1, 5 );
654 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
655 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
656 registerAction( MRUId, mru );
658 // default icon for neutral point ('SALOME' module)
659 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
660 if ( defIcon.isNull() )
661 defIcon = QPixmap( imageEmptyIcon );
663 //! default icon for any module
664 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
665 if ( modIcon.isNull() )
666 modIcon = QPixmap( imageEmptyIcon );
669 modules( modList, false );
671 if ( modList.count() > 1 )
673 LightApp_ModuleAction* moduleAction =
674 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
676 QMap<QString, QString> iconMap;
677 moduleIconNames( iconMap );
679 const int iconSize = 20;
681 QStringList::Iterator it;
682 for ( it = modList.begin(); it != modList.end(); ++it )
684 if ( !isLibExists( *it ) )
687 QString modName = moduleName( *it );
689 if ( !isModuleAccessible( *it ) )
693 if ( iconMap.contains( *it ) )
694 iconName = iconMap[*it];
696 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
700 INFOS ( "\n****************************************************************" << std::endl
701 << "* Icon for " << (*it).toLatin1().constData()
702 << " not found. Using the default one." << std::endl
703 << "****************************************************************" << std::endl );
706 icon = Qtx::scaleIcon( icon, iconSize );
708 moduleAction->insertModule( *it, icon );
711 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
712 this, SLOT( onModuleActivation( const QString& ) ) );
713 registerAction( ModulesListId, moduleAction );
717 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
718 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
720 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
721 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
722 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
723 0, desk, false, this, SLOT( onCloseAllWindow() ) );
724 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
725 0, desk, false, this, SLOT( onGroupAllWindow() ) );
727 createMenu( CloseId, windowMenu, 0, -1 );
728 createMenu( CloseAllId, windowMenu, 0, -1 );
729 createMenu( GroupAllId, windowMenu, 0, -1 );
730 createMenu( separator(), windowMenu, -1, 0 );
732 #ifndef DISABLE_GLVIEWER
733 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
735 #ifndef DISABLE_PLOT2DVIEWER
736 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
738 #ifndef DISABLE_OCCVIEWER
739 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
741 #ifndef DISABLE_VTKVIEWER
742 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
744 #ifndef DISABLE_QXGRAPHVIEWER
745 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
747 #ifndef DISABLE_GRAPHICSVIEW
748 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_R );
750 #ifndef DISABLE_PVVIEWER
751 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_W );
754 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
755 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
756 createMenu( RenameId, windowMenu, -1 );
758 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
759 createMenu( PreferencesId, fileMenu, 50, -1 );
760 createMenu( separator(), fileMenu, -1, 50, -1 );
762 createMenu( separator(), fileMenu, -1, 100, -1 );
763 createMenu( MRUId, fileMenu, 100, -1 );
764 createMenu( separator(), fileMenu, -1, 100, -1 );
766 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
767 0, desk, false, this, SLOT( onStylePreferences() ) );
769 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
770 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
773 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
774 createMenu( separator(), viewMenu, -1, 20, -1 );
775 createMenu( StyleId, viewMenu, 20, -1 );
776 createMenu( FullScreenId, viewMenu, 20, -1 );
778 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
779 QString( "SalomeModules" ) ); // name (language-independant)
780 createTool( ModulesListId, modTBar );
783 /*!On module activation action.*/
784 void LightApp_Application::onModuleActivation( const QString& modName )
786 // Force user to create/open a study before module activation
787 QMap<QString, QString> iconMap;
788 moduleIconNames( iconMap );
789 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
791 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
793 bool cancelled = false;
795 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
796 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
797 QMap<int, QString> opmap = activateModuleActions();
798 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
799 aDlg.addButton( it.value(), it.key() );
801 int res = aDlg.exec();
803 // some operation is selected
804 moduleActionSelected( res );
808 putInfo( tr("INF_CANCELLED") );
810 LightApp_ModuleAction* moduleAction =
811 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
813 moduleAction->setActiveModule( QString() );
819 activateModule( modName );
822 /*!Default module activation.*/
823 QString LightApp_Application::defaultModule() const
825 QStringList aModuleNames;
826 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
827 //! If there's the one and only module --> activate it automatically
828 //! TODO: Possible improvement - default module can be taken from preferences
829 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
832 /*!On new window slot.*/
833 void LightApp_Application::onNewWindow()
835 const QObject* obj = sender();
836 if ( !obj || !obj->inherits( "QAction" ) )
840 int id = actionId( (QAction*)obj );
843 #ifndef DISABLE_GLVIEWER
845 type = GLViewer_Viewer::Type();
848 #ifndef DISABLE_PLOT2DVIEWER
850 type = Plot2d_Viewer::Type();
853 #ifndef DISABLE_OCCVIEWER
855 type = OCCViewer_Viewer::Type();
858 #ifndef DISABLE_VTKVIEWER
860 type = VTKViewer_Viewer::Type();
863 #ifndef DISABLE_QXGRAPHVIEWER
864 case NewQxSceneViewId:
865 type = QxScene_Viewer::Type();
868 #ifndef DISABLE_GRAPHICSVIEW
869 case NewGraphicsViewId:
870 type = GraphicsView_Viewer::Type();
873 #ifndef DISABLE_PVVIEWER
875 type = PVViewer_Viewer::Type();
880 if ( !type.isEmpty() )
881 createViewManager( type );
885 SLOT: Creates new document
887 void LightApp_Application::onNewDoc()
889 #ifdef SINGLE_DESKTOP
890 if ( !checkExistingDoc() )
894 //asl: fix for 0020515
895 saveDockWindowsState();
897 CAM_Application::onNewDoc();
901 SLOT: Opens new document
903 void LightApp_Application::onOpenDoc()
905 SUIT_Study* study = activeStudy();
907 #ifdef SINGLE_DESKTOP
908 if ( !checkExistingDoc() )
912 CAM_Application::onOpenDoc();
914 if ( !study ) // new study will be create in THIS application
917 updateViewManagers();
922 SLOT: Opens new document.
923 \param aName - name of file
925 bool LightApp_Application::onOpenDoc( const QString& aName )
927 #ifdef SINGLE_DESKTOP
928 if ( !checkExistingDoc() )
932 saveDockWindowsState();
934 // We should take mru action first because this application instance can be deleted later.
935 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
937 bool res = CAM_Application::onOpenDoc( aName );
942 mru->insert( aName );
944 mru->remove( aName );
950 SLOT: Displays "About" message box
952 void LightApp_Application::onHelpAbout()
954 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
959 Private SLOT: Called on selection is changed
960 Dispatchs active module that selection is changed
962 void LightApp_Application::onSelection()
964 onSelectionChanged();
966 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
967 ((LightApp_Module*)activeModule())->selectionChanged();
972 \param study - SUIT_Study.
974 void LightApp_Application::setActiveStudy( SUIT_Study* study )
976 CAM_Application::setActiveStudy( study );
980 Enables/Disables menu items and toolbar buttons. Rebuild menu
982 void LightApp_Application::updateCommandsStatus()
984 CAM_Application::updateCommandsStatus();
987 #ifndef DISABLE_GLVIEWER
988 a = action( NewGLViewId );
990 a->setEnabled( activeStudy() );
993 #ifndef DISABLE_PLOT2DVIEWER
994 a = action( NewPlot2dId );
996 a->setEnabled( activeStudy() );
999 #ifndef DISABLE_OCCVIEWER
1000 a = action( NewOCCViewId );
1002 a->setEnabled( activeStudy() );
1005 #ifndef DISABLE_VTKVIEWER
1006 a = action( NewVTKViewId );
1008 a->setEnabled( activeStudy() );
1011 #ifndef DISABLE_QXGRAPHVIEWER
1012 a = action( NewQxSceneViewId );
1014 a->setEnabled( activeStudy() );
1017 #ifndef DISABLE_GRAPHICSVIEW
1018 a = action( NewGraphicsViewId );
1020 a->setEnabled( activeStudy() );
1023 #ifndef DISABLE_PVVIEWER
1024 a = action( NewPVViewId );
1026 a->setEnabled( activeStudy() );
1032 Runs system command in separate thread
1034 class RunBrowser: public QThread
1037 RunBrowser( LightApp_Application* app,
1038 const QString& theApp,
1039 const QString& theParams,
1040 const QString& theHelpFile,
1041 const QString& theContext = QString() )
1043 myParams( theParams ),
1044 myContext( theContext ),
1048 //For the external browser always specify 'file://' protocol,
1049 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1050 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1055 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1056 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1058 QProcess* proc = new QProcess();
1060 proc->start( aCommand );
1061 if ( !proc->waitForStarted() ) {
1062 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1063 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1064 ce2000->setData( msg );
1065 QApplication::postEvent( myLApp, ce2000 );
1076 LightApp_Application* myLApp;
1080 SLOT: Displays help contents for choosen module
1082 void LightApp_Application::onHelpContentsModule()
1084 const QAction* a = (QAction*) sender();
1085 QString helpFile = a->data().toString();
1086 if ( helpFile.isEmpty() ) return;
1088 SUIT_ResourceMgr* resMgr = resourceMgr();
1091 platform = "winapplication";
1093 platform = "application";
1095 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1097 QString quote("\"");
1098 anApp.prepend( quote );
1099 anApp.append( quote );
1101 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1102 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1104 if( useExtBrowser ) {
1105 if ( !anApp.isEmpty() ) {
1106 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1110 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1111 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1112 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1114 showPreferences( tr( "PREF_APP" ) );
1118 QStringList parameters;
1119 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1120 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1121 parameters << helpFile;
1122 QProcess::startDetached( "HelpBrowser", parameters );
1127 SLOT: Displays help contents for choosen dialog
1129 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1130 const QString& theFileName,
1131 const QString& theContext )
1133 QString fileName = theFileName;
1134 QString context = theContext;
1135 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1136 // context might be passed within theFileName argument
1137 QStringList comps = fileName.split("#");
1138 if ( comps.count() > 1 ) {
1139 context = comps.last();
1141 fileName = comps.join("#");
1145 QString homeDir = "";
1146 if ( !theComponentName.isEmpty() ) {
1147 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1148 if ( !dir.isEmpty() )
1149 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1150 Qtx::addSlash( "share" ) +
1151 Qtx::addSlash( "doc" ) +
1152 Qtx::addSlash( "salome" ) +
1153 Qtx::addSlash( "gui" ) +
1154 Qtx::addSlash( theComponentName ) );
1157 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1158 SUIT_ResourceMgr* resMgr = resourceMgr();
1161 platform = "winapplication";
1163 platform = "application";
1165 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1167 QString quote("\"");
1168 anApp.prepend( quote );
1169 anApp.append( quote );
1172 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1175 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1177 if ( !anApp.isEmpty() ) {
1178 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1182 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1183 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1184 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1185 showPreferences( tr( "PREF_APP" ) );
1189 QStringList parameters;
1190 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1191 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1192 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1193 QProcess::startDetached( "HelpBrowser", parameters );
1198 Sets enable or disable some actions on selection changed.
1200 void LightApp_Application::onSelectionChanged()
1202 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1203 bool canCopy = m ? m->canCopy() : false;
1204 bool canPaste = m ? m->canPaste() : false;
1206 action( EditCopyId )->setEnabled(canCopy);
1207 action( EditPasteId )->setEnabled(canPaste);
1210 QWidget* LightApp_Application::dockWindow( const int id ) const
1213 if ( myWin.contains( id ) )
1218 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1223 QDockWidget* dock = 0;
1224 QWidget* w = wid->parentWidget();
1225 while ( w && !dock )
1227 dock = ::qobject_cast<QDockWidget*>( w );
1228 w = w->parentWidget();
1233 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1238 if ( wid != dockWindow( id ) )
1239 removeDockWindow( id );
1241 myWin.insert( id, wid );
1243 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1244 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1246 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1247 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1248 QString( "%1Dock" ).arg( wid->objectName() ) );
1249 dock->setWidget( wid );
1251 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1252 if ( !accel.isEmpty() )
1253 dock->toggleViewAction()->setShortcut( accel );
1258 void LightApp_Application::removeDockWindow( const int id )
1260 QWidget* wid = dockWindow( id );
1266 QDockWidget* dock = windowDock( wid );
1270 dock->setWidget( 0 );
1271 wid->setParent( 0 );
1272 wid->setVisible( false );
1276 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1278 QDockWidget* dock = windowDock( dockWindow( id ) );
1279 if ( dock && desktop() ) {
1280 desktop()->addDockWidget( place, dock );
1281 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1282 if ( a ) a->update();
1288 \param flag - key for window
1289 \param studyId - study id
1290 Flag used how identificator of window in windows list.
1292 QWidget* LightApp_Application::getWindow( const int flag, const int )
1294 QWidget* wid = dockWindow( flag );
1296 insertDockWindow( flag, wid = createWindow( flag ) );
1298 QMap<int, int> winMap;
1299 currentWindows( winMap );
1300 if ( winMap.contains( flag ) )
1301 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1307 \return Object Browser
1309 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1311 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1317 LogWindow* LightApp_Application::logWindow()
1319 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1322 #ifndef DISABLE_PYCONSOLE
1324 This returns the python console integrated to the GUI. Depending
1325 when you request the python console, this function could return
1326 null. Then the optional parameter force (default to false) can be
1327 set to force the creation of the python console if it is not done
1329 \param force - if true, the pythonConsole is created if it does not exist yet
1330 \return Python Console
1332 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1334 QWidget* wid = dockWindow( WT_PyConsole );
1335 if ( !wid && force==true) {
1336 wid = getWindow(WT_PyConsole);
1338 return qobject_cast<PyConsole_Console*>( wid );
1343 Updates object browser and maybe data models
1344 \param updateModels - if it is true, then data models are updated
1346 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1348 // update existing data models
1351 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1352 if ( objectBrowser() )
1353 objectBrowser()->setAutoUpdate( false );
1355 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1357 CAM_Study::ModelList dm_list;
1358 study->dataModels( dm_list );
1359 QListIterator<CAM_DataModel*> it( dm_list );
1360 while ( it.hasNext() ) {
1361 CAM_DataModel* camDM = it.next();
1362 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1363 ((LightApp_DataModel*)camDM)->update();
1367 if( objectBrowser() )
1368 objectBrowser()->setAutoUpdate( isAutoUpdate );
1371 if ( objectBrowser() ) {
1372 objectBrowser()->updateGeometry();
1373 objectBrowser()->updateTree( 0, false );
1380 LightApp_Preferences* LightApp_Application::preferences() const
1382 return preferences( false );
1386 \return first view manager of some type
1387 \param vmType - type of view manager
1388 \param create - is it necessary to create view manager in case, when there is no manager of such type
1390 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1392 SUIT_ViewManager* aVM = viewManager( vmType );
1393 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1395 if ( anActiveVM && anActiveVM->getType() == vmType )
1398 if ( aVM && create )
1400 if ( !aVM->getActiveView() )
1403 aVM->getActiveView()->setFocus();
1406 aVM = createViewManager( vmType );
1412 Creates view manager of some type
1413 \param vmType - type of view manager
1415 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1417 SUIT_ResourceMgr* resMgr = resourceMgr();
1419 SUIT_ViewManager* viewMgr = 0;
1420 #ifndef DISABLE_GLVIEWER
1421 if( vmType == GLViewer_Viewer::Type() )
1423 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1424 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1427 #ifndef DISABLE_PLOT2DVIEWER
1428 if( vmType == Plot2d_Viewer::Type() )
1430 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1432 #ifndef DISABLE_SALOMEOBJECT
1433 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1435 new LightApp_Plot2dSelector( v, mySelMgr );
1437 vm = new Plot2d_Viewer();
1439 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1440 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1443 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1444 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1448 #ifndef DISABLE_QXGRAPHVIEWER
1449 if( vmType == QxScene_Viewer::Type() )
1451 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1452 QxScene_Viewer* vm = new QxScene_Viewer();
1453 viewMgr->setViewModel( vm );
1454 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1457 #ifndef DISABLE_GRAPHICSVIEW
1458 if( vmType == GraphicsView_Viewer::Type() )
1460 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1461 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1464 #ifndef DISABLE_PVVIEWER
1465 if( vmType == PVViewer_Viewer::Type() )
1467 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1470 #ifndef DISABLE_OCCVIEWER
1471 if( vmType == OCCViewer_Viewer::Type() )
1473 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1474 OCCViewer_Viewer* vm;
1475 #ifndef DISABLE_SALOMEOBJECT
1476 vm = new SOCC_Viewer();
1478 vm = new OCCViewer_Viewer( true );
1480 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1481 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1482 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1483 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1484 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1485 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1486 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1487 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1489 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1490 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1491 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1492 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1493 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1494 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1495 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1496 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1497 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1498 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1499 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1502 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1503 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1506 #ifndef DISABLE_VTKVIEWER
1507 #ifndef DISABLE_SALOMEOBJECT
1508 if ( vmType == SVTK_Viewer::Type() )
1510 if ( vmType == VTKViewer_Viewer::Type() )
1513 #ifndef DISABLE_SALOMEOBJECT
1514 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1515 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1518 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1519 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1520 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1521 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1522 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1523 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1524 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1525 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1526 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1527 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1528 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1529 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1530 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1531 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1532 new LightApp_VTKSelector( vm, mySelMgr );
1535 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1536 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1538 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1546 addViewManager( viewMgr );
1547 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1549 if ( viewWin && desktop() ) {
1550 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1551 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1557 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1559 SUIT_ResourceMgr* resMgr = resourceMgr();
1561 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1563 new LightApp_WgViewModel( vmType, w ) );
1564 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1566 addViewManager( vm );
1567 SUIT_ViewWindow* vw = vm->createViewWindow();
1568 if ( vw && desktop() ) {
1569 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1570 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1573 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1574 myUserWmTypes << vmType;
1579 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1581 SUIT_ResourceMgr* resMgr = resourceMgr();
1583 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1587 QString vmType = vm->getType();
1589 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1591 addViewManager( vm );
1592 SUIT_ViewWindow* vw = vm->createViewWindow();
1593 if ( vw && desktop() ) {
1594 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1595 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1598 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1599 myUserWmTypes << vmType;
1605 SLOT: Removes view manager from application
1607 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1609 removeViewManager( theVM );
1613 Protected SLOT: On study created.
1614 \param theStudy - just created study
1616 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1618 SUIT_DataObject* aRoot = 0;
1619 if ( theStudy && theStudy->root() )
1621 aRoot = theStudy->root();
1622 //aRoot->setName( tr( "DATA_MODELS" ) );
1625 getWindow( WT_ObjectBrowser );
1627 loadDockWindowsState();
1629 if ( objectBrowser() )
1630 objectBrowser()->setRoot( aRoot );
1632 activateModule( defaultModule() );
1634 if ( objectBrowser() )
1635 objectBrowser()->openLevels();
1637 #ifndef DISABLE_PYCONSOLE
1638 if( pythonConsole() )
1639 getPyInterp()->initStudy();
1644 Protected SLOT: On study opened.
1645 \param theStudy - just opened study
1647 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1649 SUIT_DataObject* aRoot = 0;
1650 if ( theStudy && theStudy->root() )
1652 aRoot = theStudy->root();
1656 getWindow( WT_ObjectBrowser );
1658 loadDockWindowsState();
1660 if ( objectBrowser() )
1661 objectBrowser()->setRoot( aRoot );
1663 activateModule( defaultModule() );
1665 if ( objectBrowser() )
1666 objectBrowser()->openLevels();
1668 #ifndef DISABLE_PYCONSOLE
1669 if( pythonConsole() )
1670 getPyInterp()->initStudy();
1676 /*!Protected SLOT. On study saved.*/
1677 void LightApp_Application::onStudySaved( SUIT_Study* s )
1679 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1681 mru->insert( s->studyName() );
1686 /*!Protected SLOT. On study closed.*/
1687 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1690 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1691 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1694 // stop auto-save timer
1695 myAutoSaveTimer->stop();
1697 // Bug 10396: clear selection
1698 mySelMgr->clearSelected();
1700 // Bug 12944: emit signal only after clear selection
1703 activateModule( "" );
1706 /*!Protected SLOT.On desktop activated.*/
1707 void LightApp_Application::onDesktopActivated()
1709 CAM_Application::onDesktopActivated();
1710 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1712 aModule->studyActivated();
1715 void LightApp_Application::studyOpened( SUIT_Study* s )
1717 CAM_Application::studyOpened( s );
1720 updateViewManagers();
1723 void LightApp_Application::studySaved( SUIT_Study* s )
1725 CAM_Application::studyOpened( s );
1726 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1727 if ( aResMgr && activeStudy() ) {
1728 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1729 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1733 void LightApp_Application::studyCreated( SUIT_Study* s )
1735 CAM_Application::studyCreated( s );
1738 updateViewManagers();
1741 /*!Gets file filter.
1742 *\retval QString "(*.bin)"
1744 QString LightApp_Application::getFileFilter() const
1752 Shows file dialog and return user selected file name
1754 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1755 const QString& caption, QWidget* parent )
1759 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1760 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1763 /*! Gets directory*/
1764 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1768 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1771 /*! Get open file names*/
1772 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1773 const QString& caption, QWidget* parent )
1777 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1778 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1781 /*!Private SLOT. Update object browser.*/
1782 void LightApp_Application::onRefresh()
1784 updateObjectBrowser( true );
1787 /*!Private SLOT. Support drag-and-drop operation.*/
1788 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1790 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1794 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1796 aModule->dropObjects( objects, parentObj, row, action );
1799 /*!Private SLOT. On preferences.*/
1800 void LightApp_Application::onPreferences()
1802 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1805 /*!Private SLOT. On preferences.*/
1806 void LightApp_Application::showPreferences( const QString& itemText )
1808 QApplication::setOverrideCursor( Qt::WaitCursor );
1810 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1812 QApplication::restoreOverrideCursor();
1817 preferences()->activateItem( itemText );
1819 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1822 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1823 resourceMgr()->save();
1826 shortcutMgr()->updateShortcuts();
1832 /*!Protected SLOT. On preferences changed.*/
1833 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1835 LightApp_Module* sMod = 0;
1836 CAM_Module* mod = module( modName );
1837 if ( mod && mod->inherits( "LightApp_Module" ) )
1838 sMod = (LightApp_Module*)mod;
1841 sMod->preferencesChanged( section, param );
1843 preferencesChanged( section, param );
1844 // emit signal to allow additional preferences changing processing
1845 emit preferenceChanged( modName, section, param );
1848 /*!Remove all windows from study.*/
1849 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1851 saveDockWindowsState();
1853 if ( SUIT_DataBrowser* ob = objectBrowser() )
1856 CAM_Application::beforeCloseDoc( s );
1859 /*!Update actions.*/
1860 void LightApp_Application::updateActions()
1862 updateCommandsStatus();
1868 SUIT_Study* LightApp_Application::createNewStudy()
1870 LightApp_Application::lastStudyId++;
1872 LightApp_Study* aStudy = new LightApp_Study( this );
1874 // Set up processing of major study-related events
1875 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1876 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1877 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1878 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1884 Creates window by flag.
1885 \param flag - identificator of window type
1887 QWidget* LightApp_Application::createWindow( const int flag )
1891 SUIT_ResourceMgr* resMgr = resourceMgr();
1893 if ( flag == WT_ObjectBrowser )
1895 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1896 ob->setObjectName( "objectBrowser" );
1897 ob->setSortMenuEnabled( true );
1898 ob->setAutoUpdate( true );
1899 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1900 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1902 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1903 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1904 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1906 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1907 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1908 treeModel->setSearcher( this );
1909 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1910 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1912 // Mantis issue 0020136: Drag&Drop in OB
1913 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1915 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1916 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1919 // temporary commented
1921 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1923 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1926 // Create OBSelector
1927 new LightApp_OBSelector( ob, mySelMgr );
1929 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1930 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1931 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1932 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1934 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1936 #ifndef DISABLE_PYCONSOLE
1937 else if ( flag == WT_PyConsole )
1939 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(), getPyInterp() );
1940 pyCons->setObjectName( "pythonConsole" );
1941 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1942 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1943 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1944 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
1947 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1950 else if ( flag == WT_LogWindow )
1952 LogWindow* logWin = new LogWindow( desktop() );
1953 logWin->setObjectName( "logWindow" );
1954 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
1955 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
1957 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1963 \return default windows( Object Browser, Python Console )
1964 Adds to map \a aMap.
1966 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
1968 #ifndef DISABLE_PYCONSOLE
1969 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
1971 if ( activeStudy() ) {
1972 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1973 // aMap.insert( WT_LogWindow, Qt::DockBottom );
1977 /*!Default view managers*/
1978 void LightApp_Application::defaultViewManagers( QStringList& ) const
1984 \return preferences.
1985 Create preferences, if \a crt = true.
1987 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
1992 LightApp_Application* that = (LightApp_Application*)this;
1994 bool toCreate = !_prefs_ && crt;
1997 _prefs_ = new LightApp_Preferences( resourceMgr() );
1998 that->createPreferences( _prefs_ );
2001 that->myPrefs = _prefs_;
2003 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2004 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2005 connect( myPrefs, SIGNAL( resetToDefaults() ),
2006 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2011 SUIT_ResourceMgr* resMgr = resourceMgr();
2013 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2014 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2016 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2020 QStringList modNameList;
2021 app->modules( modNameList, false );
2023 QMap<QString, QString> iconMap;
2024 app->moduleIconNames( iconMap );
2026 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2028 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2031 int modId = _prefs_->addPreference( *it );
2032 if ( iconMap.contains( *it ) )
2033 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2037 app->modules( modList );
2038 QListIterator<CAM_Module*> itr( modList );
2039 while ( itr.hasNext() )
2041 LightApp_Module* mod = 0;
2043 CAM_Module* anItem = itr.next();
2044 if ( anItem->inherits( "LightApp_Module" ) )
2045 mod = (LightApp_Module*)anItem;
2047 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2049 _prefs_->addPreference( mod->moduleName() );
2050 mod->createPreferences();
2051 that->emptyPreferences( mod->moduleName() );
2055 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2061 Adds new module to application
2063 void LightApp_Application::moduleAdded( CAM_Module* mod )
2065 CAM_Application::moduleAdded( mod );
2067 LightApp_Module* lightMod = 0;
2068 if ( mod && mod->inherits( "LightApp_Module" ) )
2069 lightMod = (LightApp_Module*)mod;
2071 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2073 myPrefs->addPreference( mod->moduleName() );
2074 lightMod->createPreferences();
2075 emptyPreferences( mod->moduleName() );
2079 void LightApp_Application::emptyPreferences( const QString& modName )
2081 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2082 if ( !item || !item->isEmpty() )
2085 // printf( "---------------------> Modify for empty module.\n" );
2087 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2088 frm->setIcon( item->icon() );
2089 frm->setStretch( false );
2090 item->parentItem()->insertItem( frm, item );
2091 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2098 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2103 QStringList aValuesList;
2104 QList<QVariant> anIndicesList;
2108 // . Top-level "SALOME" preferences group <<start>>
2109 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2110 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2112 // .. "General" preferences tab <<start>>
2113 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2115 // ... "Language" group <<start>>
2116 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2117 pref->setItemProperty( "columns", 2, langGroup );
2118 // .... -> application language
2119 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2120 LightApp_Preferences::Selector, "language", "language" );
2121 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2122 QList<QVariant> aIcons;
2123 foreach ( QString aLang, aLangs ) {
2124 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2126 pref->setItemProperty( "strings", aLangs, curLang );
2127 pref->setItemProperty( "icons", aIcons, curLang );
2129 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2130 LightApp_Preferences::Bool, "language", "locale" );
2131 // ... "Language" group <<end>>
2133 // ... "Look and feel" group <<start>>
2134 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2135 pref->setItemProperty( "columns", 2, lookGroup );
2136 // .... -> show splash-screen
2137 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2138 // .... -> opaque resize
2139 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2140 // .... -> drop-down buttons
2141 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2142 // ... "Look and feel" group <<end>>
2144 // ... "Study properties" group <<start>>
2145 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2146 pref->setItemProperty( "columns", 2, studyGroup );
2147 // .... -> multi-file save
2148 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2149 // .... -> ascii save mode
2150 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2151 // .... -> store windows geometry
2152 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2153 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2154 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2155 // .... -> auto-save
2156 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2157 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2158 pref->setItemProperty( "min", 0, autoSaveInterval );
2159 pref->setItemProperty( "max", 1440, autoSaveInterval );
2160 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2161 // ... "Study properties" group <<end>>
2163 // ... "Help browser" group <<start>>
2164 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2166 QString platform = "winapplication";
2168 QString platform = "application";
2170 // .... -> browser application
2171 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2172 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2173 // .... -> browser parameters
2174 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2175 // ... "Help browser" group <<end>>
2177 // ... "Python console properties" group <<start>>
2178 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2180 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2181 // .... -> show banner
2182 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2183 // ... "Python console properties" group <<end>>
2185 // ... "MRU" preferences group <<start>>
2186 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2187 pref->setItemProperty( "columns", 4, mruGroup );
2188 // number of MRU items
2189 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2190 "MRU", "visible_count" );
2191 pref->setItemProperty( "min", 0, mruVisCount );
2192 pref->setItemProperty( "max", 100, mruVisCount );
2194 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2195 "MRU", "link_type" );
2196 aValuesList.clear();
2197 anIndicesList.clear();
2198 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2199 anIndicesList << 0 << 1 << 2 ;
2200 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2201 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2202 // ... "MRU" preferences group <<end>>
2203 // .. "General" preferences tab <<end>>
2205 // .. "3D viewer" group <<start>>
2206 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2207 // ... -> navigation mode
2208 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2209 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2210 aValuesList.clear();
2211 anIndicesList.clear();
2212 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2213 anIndicesList << 0 << 1;
2214 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2215 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2216 // ... -> zooming mode
2217 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2218 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2219 aValuesList.clear();
2220 anIndicesList.clear();
2221 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2222 anIndicesList << 0 << 1;
2223 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2224 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2225 // ... "Trihedron" group <<start>>
2226 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2227 pref->setItemProperty( "columns", 2, occTriGroup );
2228 // .... -> trihedron size
2229 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2230 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2231 pref->setItemProperty( "min", 1.0E-06, occTS );
2232 pref->setItemProperty( "max", 1000, occTS );
2233 // .... -> relative size of trihedron
2234 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2235 // .... -> show static trihedron
2236 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2237 // ... "Trihedron" group <<end>>
2238 // .. "3D viewer" group <<end>>
2242 #ifndef DISABLE_OCCVIEWER
2243 // .. "OCC viewer" group <<start>>
2244 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2246 // ... "Background" group <<start>>
2247 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2248 // pref->setItemProperty( "columns", 2, bgGroup );
2249 aValuesList.clear();
2250 anIndicesList.clear();
2252 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2253 foreach( int gid, idList ) anIndicesList << gid;
2254 // .... -> 3D viewer background
2255 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2256 LightApp_Preferences::Background, "OCCViewer", "background" );
2257 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2258 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2259 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2260 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2261 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2262 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2263 pref->setItemProperty( "custom_enabled", false, bgId );
2264 pref->setItemProperty( "image_formats", formats, bgId );
2265 // .... -> XZ viewer background
2266 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2267 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2268 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2269 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2270 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2271 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2272 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2273 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2274 pref->setItemProperty( "custom_enabled", false, bgId );
2275 pref->setItemProperty( "image_formats", formats, bgId );
2276 // .... -> YZ viewer background
2277 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2278 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2279 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2280 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2281 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2282 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2283 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2284 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2285 pref->setItemProperty( "custom_enabled", false, bgId );
2286 pref->setItemProperty( "image_formats", formats, bgId );
2287 // .... -> XY viewer background
2288 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2289 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2290 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2291 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2292 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2293 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2294 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2295 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2296 pref->setItemProperty( "custom_enabled", false, bgId );
2297 pref->setItemProperty( "image_formats", formats, bgId );
2298 // ... "Background" group <<end>>
2301 // ... "Selection" group <<start>>
2302 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2303 pref->setItemProperty( "columns", 2, occSelectionGroup );
2304 // .... -> enable preselection
2305 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2306 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2307 // .... -> enable selection
2308 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2309 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2310 // ... "Selection" group <<end>>
2312 // ... "Clipping" group <<start>>
2313 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2314 // .... -> clipping color
2315 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2316 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2317 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2318 pref->setItemProperty( "columns", 2, texturePref );
2319 // .... -> use default texture
2320 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2321 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2322 // .... -> clipping texture
2323 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2324 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2325 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2327 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2328 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2329 // .... -> scale factor
2330 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2331 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2332 pref->setItemProperty( "precision", 3, scaleFactor );
2333 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2334 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2335 pref->setItemProperty( "step", 0.1, scaleFactor );
2336 // ... "Clipping" group <<end>>
2338 // ... -> empty frame (for layout) <<start>>
2339 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2340 pref->setItemProperty( "margin", 0, occGen );
2341 pref->setItemProperty( "columns", 2, occGen );
2342 // ... -> empty frame (for layout) <<end>>
2343 // .. "OCC viewer" group <<end>>
2346 #ifndef DISABLE_VTKVIEWER
2347 // .. "VTK viewer" group <<start>>
2348 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2350 // ... -> empty frame (for layout) <<start>>
2351 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2352 //pref->setItemProperty( "columns", 2, vtkGen );
2353 // .... -> projection mode
2354 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2355 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2356 aValuesList.clear();
2357 anIndicesList.clear();
2358 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2359 anIndicesList << 0 << 1;
2360 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2361 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2362 // .... -> background
2363 aValuesList.clear();
2364 anIndicesList.clear();
2366 #ifndef DISABLE_SALOMEOBJECT
2367 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2369 foreach( int gid, idList ) anIndicesList << gid;
2370 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2371 LightApp_Preferences::Background, "VTKViewer", "background" );
2372 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2373 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2374 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2375 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2376 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2377 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2378 pref->setItemProperty( "custom_enabled", false, bgId );
2379 #ifndef DISABLE_SALOMEOBJECT
2380 pref->setItemProperty( "image_formats", formats, bgId );
2382 // .... -> speed increment
2383 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2384 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2385 pref->setItemProperty( "min", 1, vtkSpeed );
2386 pref->setItemProperty( "max", 1000, vtkSpeed );
2387 // .... -> speed mode
2388 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2389 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2390 aValuesList.clear();
2391 anIndicesList.clear();
2392 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2393 anIndicesList << 0 << 1;
2394 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2395 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2397 // ... "Selection" group <<start>>
2398 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2399 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2400 // .... -> preselection
2401 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2402 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2403 aValuesList.clear();
2404 anIndicesList.clear();
2405 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2406 anIndicesList << 0 << 1 << 2;
2407 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2408 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2409 // .... -> enable selection
2410 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2411 // ... "Selection" group <<end>>
2413 // ... -> empty frame (for layout) <<end>>
2415 // ... space mouse sub-group <<start>>
2416 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2417 //pref->setItemProperty( "columns", 2, vtkSM );
2418 // .... -> decrease speed increment
2419 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2420 LightApp_Preferences::Selector, "VTKViewer",
2421 "spacemouse_func1_btn" );
2422 // .... -> increase speed increment
2423 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2424 LightApp_Preferences::Selector, "VTKViewer",
2425 "spacemouse_func2_btn" );
2426 // .... -> dominant / combined switch
2427 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2428 LightApp_Preferences::Selector, "VTKViewer",
2429 "spacemouse_func5_btn" ); //
2430 aValuesList.clear();
2431 anIndicesList.clear();
2432 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2433 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2434 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2435 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2436 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2437 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2438 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2439 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2440 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2441 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2442 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2443 // ... space mouse sub-group <<end>>
2445 // ... avi recording sub-group <<start>>
2446 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2447 pref->setItemProperty( "columns", 2, vtkRec );
2448 // .... -> recording mode
2449 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2450 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2451 aValuesList.clear();
2452 anIndicesList.clear();
2453 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2454 anIndicesList << 0 << 1;
2455 pref->setItemProperty( "strings", aValuesList, modePref );
2456 pref->setItemProperty( "indexes", anIndicesList, modePref );
2458 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2459 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2460 pref->setItemProperty( "min", 0.1, fpsPref );
2461 pref->setItemProperty( "max", 100, fpsPref );
2463 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2464 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2465 pref->setItemProperty( "min", 1, qualityPref );
2466 pref->setItemProperty( "max", 100, qualityPref );
2467 // .... -> progressive mode
2468 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2469 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2470 // ... avi recording sub-group <<end>>
2472 // ... group names sub-group <<start>>
2473 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2474 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2475 pref->setItemProperty( "columns", 2, vtkGN );
2476 // .... -> text color
2477 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2478 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2479 // .... -> transparency
2480 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2481 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2482 pref->setItemProperty( "min", 0.0, transPref );
2483 pref->setItemProperty( "max", 1.0, transPref );
2484 pref->setItemProperty( "step", 0.1, transPref );
2485 // ... -> group names sub-group <<end>>
2486 // .. "VTK viewer" group <<end>>
2489 // .. "Plot2d viewer" group <<start>>
2490 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2491 //pref->setItemProperty( "columns", 2, plot2dGroup );
2493 // ... -> background
2494 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2495 LightApp_Preferences::Color, "Plot2d", "Background" );
2496 // ... -> selection color
2497 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2498 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2500 // ... "Viewer" group <<start>>
2501 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2503 // .... -> curve type
2504 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2505 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2506 aValuesList.clear();
2507 anIndicesList.clear();
2508 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2509 anIndicesList << 0 << 1 << 2 ;
2510 pref->setItemProperty( "strings", aValuesList, curveType );
2511 pref->setItemProperty( "indexes", anIndicesList, curveType );
2512 // .... -> marker size
2513 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2514 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2515 pref->setItemProperty( "min", 0, markerSize );
2516 pref->setItemProperty( "max", 100, markerSize );
2517 // .... -> horizontal scaling mode
2518 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2519 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2520 aValuesList.clear();
2521 anIndicesList.clear();
2522 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2523 anIndicesList << 0 << 1 ;
2524 pref->setItemProperty( "strings", aValuesList, horScale );
2525 pref->setItemProperty( "indexes", anIndicesList, horScale );
2526 // .... -> vertical scaling mode
2527 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2528 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2529 pref->setItemProperty( "strings", aValuesList, verScale );
2530 pref->setItemProperty( "indexes", anIndicesList, verScale );
2532 // .... -> errors/deviation colot
2533 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2534 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2535 // .... -> deviation markers line size
2536 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2537 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2538 pref->setItemProperty( "min", 1, deviationMarkerLw );
2539 pref->setItemProperty( "max", 5, deviationMarkerLw );
2540 // .... -> deviation markers tick mark size
2541 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2542 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2543 pref->setItemProperty( "min", 1, deviationMarkerTs );
2544 pref->setItemProperty( "max", 5, deviationMarkerTs );
2545 // .... "Viewer" group <<end>>
2547 // ... "Legend" group <<start>>
2548 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2550 // .... -> show legend
2551 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2552 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2553 // .... -> legend position
2554 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2555 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2556 aValuesList.clear();
2557 anIndicesList.clear();
2558 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2559 anIndicesList << 0 << 1 << 2 << 3 ;
2560 pref->setItemProperty( "strings", aValuesList, legendPosition );
2561 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2562 // .... -> Symbol type
2563 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2564 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2565 aValuesList.clear();
2566 anIndicesList.clear();
2567 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2568 anIndicesList << 0 << 1 ;
2569 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2570 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2571 // .... -> legend font
2572 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2573 // ... -> font color
2574 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2575 // ... -> selection font color
2576 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2577 // ... "Legend" group <<end>>
2579 // .. "Plot2d viewer" group <<end>>
2581 // .. "Directories" preferences tab <<start>>
2582 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2583 // ... --> quick directories list
2584 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2585 pref->addPreference( tr( "" ), dirGroup,
2586 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2587 // .. "Directories" preferences tab <<end>>
2589 // .. "Object browser" preferences tab <<start>>
2590 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2592 // ... "Search tool" group <<start>>
2593 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2594 // .... --> auto-hide
2595 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2596 "ObjectBrowser", "auto_hide_search_tool" );
2597 // ... "Search tool" group <<end>>
2599 // ... "Object browser settings" group <<start>>
2600 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2601 pref->setItemProperty( "columns", 2, objSetGroup );
2602 // .... -> auto size first column
2603 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2604 "ObjectBrowser", "auto_size_first" );
2605 // .... -> auto size other columns
2606 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2607 "ObjectBrowser", "auto_size" );
2608 // .... -> resize columns on expand item
2609 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2610 "ObjectBrowser", "resize_on_expand_item" );
2611 // .... -> browse to published object
2612 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2613 "ObjectBrowser", "browse_published_object" );
2614 aValuesList.clear();
2615 anIndicesList.clear();
2616 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2617 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2618 pref->setItemProperty( "strings", aValuesList, browsePublished );
2619 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2620 // ... "Object browser settings" group <<end>>
2621 // .. "Object browser" preferences tab <<end>>
2623 // .. "Shortcuts" preferences tab <<start>>
2624 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2625 // ... "Shortcuts settings" group <<start>>
2626 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2627 pref->addPreference( tr( "" ), shortcutGroup,
2628 LightApp_Preferences::ShortcutTree, "shortcuts" );
2629 // ... "Shortcuts settings" group <<end>>
2630 // .. "Shortcuts" preferences tab <<end>>
2631 // . Top-level "SALOME" preferences group <<end>>
2637 Changes appearance of application according to changed preferences
2638 \param sec - section
2639 \param param - name of changed parameter
2641 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2643 SUIT_ResourceMgr* resMgr = resourceMgr();
2647 if ( sec == "viewers" && param == "drop_down_buttons" )
2649 ViewManagerList vmlist = viewManagers();
2650 foreach( SUIT_ViewManager* vm, vmlist )
2652 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2653 foreach( SUIT_ViewWindow* vw, vwlist )
2654 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2658 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2660 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2661 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2662 QList<SUIT_ViewManager*> lst;
2663 #ifndef DISABLE_OCCVIEWER
2664 viewManagers( OCCViewer_Viewer::Type(), lst );
2665 QListIterator<SUIT_ViewManager*> itOCC( lst );
2666 while ( itOCC.hasNext() && sz >= 0 )
2668 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2669 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2672 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2673 occVM->setTrihedronSize( sz, relative );
2674 occVM->getAISContext()->UpdateCurrentViewer();
2677 #ifndef DISABLE_VTKVIEWER
2678 #ifndef DISABLE_SALOMEOBJECT
2679 viewManagers( SVTK_Viewer::Type(), lst );
2680 QListIterator<SUIT_ViewManager*> itVTK( lst );
2681 while ( itVTK.hasNext() && sz >= 0 )
2683 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2684 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2687 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2690 vtkVM->setTrihedronSize( sz, relative );
2698 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2700 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2701 QList<SUIT_ViewManager*> lst;
2702 #ifndef DISABLE_OCCVIEWER
2703 viewManagers( OCCViewer_Viewer::Type(), lst );
2704 QListIterator<SUIT_ViewManager*> itOCC( lst );
2705 while ( itOCC.hasNext() )
2707 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2708 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2711 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2714 occVM->setStaticTrihedronDisplayed( isVisible );
2718 #ifndef DISABLE_VTKVIEWER
2719 #ifndef DISABLE_SALOMEOBJECT
2720 viewManagers( SVTK_Viewer::Type(), lst );
2721 QListIterator<SUIT_ViewManager*> itVTK( lst );
2722 while ( itVTK.hasNext() )
2724 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2725 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2728 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2731 vtkVM->setStaticTrihedronVisible( isVisible );
2739 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2741 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2742 QList<SUIT_ViewManager*> lst;
2743 #ifndef DISABLE_OCCVIEWER
2744 viewManagers( OCCViewer_Viewer::Type(), lst );
2745 QListIterator<SUIT_ViewManager*> itOCC( lst );
2746 while ( itOCC.hasNext() )
2748 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2749 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2752 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2753 occVM->setInteractionStyle( mode );
2756 #ifndef DISABLE_VTKVIEWER
2757 #ifndef DISABLE_SALOMEOBJECT
2758 viewManagers( SVTK_Viewer::Type(), lst );
2759 QListIterator<SUIT_ViewManager*> itVTK( lst );
2760 while ( itVTK.hasNext() )
2762 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2763 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2766 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2767 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2773 #ifndef DISABLE_OCCVIEWER
2774 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2776 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2777 QList<SUIT_ViewManager*> lst;
2778 viewManagers( OCCViewer_Viewer::Type(), lst );
2779 QListIterator<SUIT_ViewManager*> it( lst );
2780 while ( it.hasNext() )
2782 SUIT_ViewModel* vm = it.next()->getViewModel();
2783 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2786 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2787 occVM->enablePreselection( isToEnablePreselection );
2792 #ifndef DISABLE_OCCVIEWER
2793 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2795 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2796 QList<SUIT_ViewManager*> lst;
2797 viewManagers( OCCViewer_Viewer::Type(), lst );
2798 QListIterator<SUIT_ViewManager*> it( lst );
2799 while ( it.hasNext() )
2801 SUIT_ViewModel* vm = it.next()->getViewModel();
2802 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2805 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2806 occVM->enableSelection( isToEnableSelection );
2811 #ifndef DISABLE_OCCVIEWER
2812 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
2814 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
2815 QList<SUIT_ViewManager*> lst;
2816 viewManagers( OCCViewer_Viewer::Type(), lst );
2817 QListIterator<SUIT_ViewManager*> it( lst );
2818 while ( it.hasNext() )
2820 SUIT_ViewModel* vm = it.next()->getViewModel();
2821 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2824 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2825 occVM->setClippingColor( aColor );
2830 #ifndef DISABLE_OCCVIEWER
2831 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
2832 param == QString( "clipping_texture" ) ||
2833 param == QString( "clipping_modulate" ) ||
2834 param == QString( "clipping_scale" ) ) )
2836 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
2837 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
2838 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
2839 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
2840 QList<SUIT_ViewManager*> lst;
2841 viewManagers( OCCViewer_Viewer::Type(), lst );
2842 QListIterator<SUIT_ViewManager*> it( lst );
2843 while ( it.hasNext() )
2845 SUIT_ViewModel* vm = it.next()->getViewModel();
2846 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2849 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2850 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
2855 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2857 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2858 QList<SUIT_ViewManager*> lst;
2859 #ifndef DISABLE_OCCVIEWER
2860 viewManagers( OCCViewer_Viewer::Type(), lst );
2861 QListIterator<SUIT_ViewManager*> itOCC( lst );
2862 while ( itOCC.hasNext() )
2864 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2865 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2868 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2869 occVM->setZoomingStyle( mode );
2872 #ifndef DISABLE_VTKVIEWER
2873 #ifndef DISABLE_SALOMEOBJECT
2874 viewManagers( SVTK_Viewer::Type(), lst );
2875 QListIterator<SUIT_ViewManager*> itVTK( lst );
2876 while ( itVTK.hasNext() )
2878 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2879 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2882 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2883 if( vtkVM ) vtkVM->setZoomingStyle( mode );
2889 #ifndef DISABLE_VTKVIEWER
2890 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2892 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2893 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2894 QList<SUIT_ViewManager*> lst;
2895 #ifndef DISABLE_SALOMEOBJECT
2896 viewManagers( SVTK_Viewer::Type(), lst );
2897 QListIterator<SUIT_ViewManager*> it( lst );
2898 while ( it.hasNext() )
2900 SUIT_ViewModel* vm = it.next()->getViewModel();
2901 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2904 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2905 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
2911 #ifndef DISABLE_VTKVIEWER
2912 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
2914 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
2915 QList<SUIT_ViewManager*> lst;
2916 #ifndef DISABLE_SALOMEOBJECT
2917 viewManagers( SVTK_Viewer::Type(), lst );
2918 QListIterator<SUIT_ViewManager*> it( lst );
2919 while ( it.hasNext() )
2921 SUIT_ViewModel* vm = it.next()->getViewModel();
2922 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2925 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2926 if( vtkVM ) vtkVM->setProjectionMode( mode );
2932 #ifndef DISABLE_VTKVIEWER
2933 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
2935 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
2936 QList<SUIT_ViewManager*> lst;
2937 #ifndef DISABLE_SALOMEOBJECT
2938 viewManagers( SVTK_Viewer::Type(), lst );
2939 QListIterator<SUIT_ViewManager*> it( lst );
2940 while ( it.hasNext() )
2942 SUIT_ViewModel* vm = it.next()->getViewModel();
2943 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2946 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2947 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
2953 #ifndef DISABLE_VTKVIEWER
2954 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
2956 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
2957 QList<SUIT_ViewManager*> lst;
2958 #ifndef DISABLE_SALOMEOBJECT
2959 viewManagers( SVTK_Viewer::Type(), lst );
2960 QListIterator<SUIT_ViewManager*> it( lst );
2961 while ( it.hasNext() )
2963 SUIT_ViewModel* vm = it.next()->getViewModel();
2964 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2967 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2968 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
2974 #ifndef DISABLE_VTKVIEWER
2975 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
2976 param == QString( "spacemouse_func2_btn" ) ||
2977 param == QString( "spacemouse_func5_btn" ) ) )
2979 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
2980 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
2981 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
2982 QList<SUIT_ViewManager*> lst;
2983 #ifndef DISABLE_SALOMEOBJECT
2984 viewManagers( SVTK_Viewer::Type(), lst );
2985 QListIterator<SUIT_ViewManager*> it( lst );
2986 while ( it.hasNext() )
2988 SUIT_ViewModel* vm = it.next()->getViewModel();
2989 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2992 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2993 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
2998 if( sec=="ObjectBrowser" )
3000 SUIT_DataBrowser* ob = objectBrowser();
3004 if ( param=="auto_size_first" )
3006 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3007 ob->setAutoSizeFirstColumn( autoSizeFirst );
3008 if ( autoSizeFirst )
3009 ob->adjustFirstColumnWidth();
3011 else if ( param=="auto_size" ) {
3012 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3013 ob->setAutoSizeColumns(autoSize);
3015 ob->adjustColumnsWidth();
3017 else if ( param=="resize_on_expand_item" ) {
3018 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3019 ob->setResizeOnExpandItem(resizeOnExpandItem);
3021 else if ( param == "auto_hide_search_tool" ) {
3022 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3028 if( param=="auto_save_interval" ) {
3029 myAutoSaveTimer->stop();
3030 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3031 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3035 #ifndef DISABLE_PYCONSOLE
3036 if( sec=="PyConsole" && pythonConsole() )
3038 if ( param=="font" ) {
3039 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3041 else if ( param=="show_banner" ) {
3042 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3049 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3051 if ( param == "visible_count" )
3052 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3053 else if ( param == "max_count" )
3054 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3055 else if ( param == "insert_mode" )
3056 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3057 else if ( param == "link_type" )
3058 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3059 else if ( param == "show_clear" )
3060 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3061 else if ( param == "show_mru" )
3062 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3065 if ( sec == "language" && param == "language" )
3067 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3069 if ( sec == "language" && param == "locale")
3071 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3073 if ( sec == "desktop" && param == "opaque_resize" ) {
3074 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3075 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3076 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3077 else dopts &= ~QMainWindow::AnimatedDocks;
3078 desktop()->setDockOptions( dopts );
3079 desktop()->setOpaqueResize( opaqueResize );
3080 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3081 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3084 #ifndef DISABLE_PLOT2DVIEWER
3085 QList<SUIT_ViewManager*> lst;
3086 viewManagers( Plot2d_Viewer::Type(), lst );
3087 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3088 while ( itPlot2d.hasNext() ) {
3089 SUIT_ViewManager* viewMgr = itPlot2d.next();
3090 SUIT_ViewModel* vm = viewMgr->getViewModel();
3091 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3094 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3096 viewMgr->setViewModel( vm );
3097 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3099 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3100 frame->SetPreference();
3109 void LightApp_Application::loadPreferences()
3111 CAM_Application::loadPreferences();
3113 SUIT_ResourceMgr* aResMgr = resourceMgr();
3118 static bool mru_load = true;
3121 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3123 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3124 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3125 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3126 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3127 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3128 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3129 mru->loadLinks( aResMgr, "MRU" );
3135 QStringList mods = aResMgr->parameters( "windows_visibility" );
3136 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3139 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3140 myWinVis.insert( *itr, arr );
3144 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3145 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3146 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3147 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3148 else dopts &= ~QMainWindow::AnimatedDocks;
3149 desktop()->setDockOptions( dopts );
3150 desktop()->setOpaqueResize( opaqueResize );
3151 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3152 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3159 void LightApp_Application::savePreferences()
3161 CAM_Application::savePreferences();
3163 saveDockWindowsState();
3165 SUIT_ResourceMgr* aResMgr = resourceMgr();
3170 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3172 mru->saveLinks( aResMgr, "MRU" );
3174 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3175 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3178 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3180 #if GUI_DEVELOPMENT > 0
3181 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3183 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3190 Updates desktop title
3192 void LightApp_Application::updateDesktopTitle()
3194 QString aTitle = applicationName();
3195 QString aVer = applicationVersion();
3196 if ( !aVer.isEmpty() )
3197 aTitle += QString( " " ) + aVer;
3199 if ( activeStudy() ) {
3200 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3201 aTitle += QString( " - [%1]" ).arg( sName );
3204 desktop()->setWindowTitle( aTitle );
3208 \brief Get map of the operations which can be performed
3209 on the module activation.
3211 The method should return the map of the kind \c {<id>:<name>}
3212 where \c <id> is an integer identifier of the operation and
3213 \c <name> is a title for the button to be added to the
3214 dialog box. After user selects the required operation by the
3215 clicking the corresponding button in the dialog box, its identifier
3216 is passed to the moduleActionSelected() method to process
3219 \return map of the operations
3220 \sa moduleActionSelected()
3222 QMap<int, QString> LightApp_Application::activateModuleActions() const
3224 QMap<int, QString> opmap;
3225 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3226 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3231 \brief Called when the used selectes required operation chosen
3232 from "Activate module" dialog box.
3234 Performs the required operation according to the user choice.
3236 \param id operation identifier
3237 \sa activateModuleActions()
3239 void LightApp_Application::moduleActionSelected( const int id )
3254 Updates windows after close document
3256 void LightApp_Application::afterCloseDoc()
3260 CAM_Application::afterCloseDoc();
3264 Updates actions of active module
3266 void LightApp_Application::updateModuleActions()
3269 if ( activeModule() ) {
3270 modName = activeModule()->moduleName();
3271 if ( !isModuleAccessible( modName ) ) {
3272 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3273 foreach( SUIT_Application* app, apps ) {
3274 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3275 if ( lapp && lapp != this )
3276 lapp->removeModuleAction( modName );
3281 LightApp_ModuleAction* moduleAction =
3282 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3284 moduleAction->setActiveModule( modName );
3287 void LightApp_Application::removeModuleAction( const QString& modName )
3289 LightApp_ModuleAction* moduleAction =
3290 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3292 moduleAction->removeModule( modName );
3296 Gets current windows.
3297 \param winMap - output current windows map.
3299 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3302 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3303 ((LightApp_Module*)activeModule())->windows( winMap );
3305 defaultWindows( winMap );
3309 Gets current view managers.
3310 \param lst - output current view managers list.
3312 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3315 if ( !activeStudy() )
3318 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3319 ((LightApp_Module*)activeModule())->viewManagers( lst );
3321 defaultViewManagers( lst );
3327 void LightApp_Application::updateWindows()
3329 QMap<int, int> winMap;
3330 currentWindows( winMap );
3332 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3334 if ( !dockWindow( it.key() ) )
3335 getWindow( it.key() );
3338 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3340 QWidget* wid = it.value();
3341 if ( winMap.contains( it.key() ) )
3342 wid->setVisible( true );
3347 loadDockWindowsState();
3351 Updates view managers
3353 void LightApp_Application::updateViewManagers()
3356 currentViewManagers( lst );
3358 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3359 getViewManager( *it, true );
3363 Loads windows geometry
3365 void LightApp_Application::loadDockWindowsState()
3369 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3370 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3371 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3374 if ( activeModule() )
3375 modName = activeModule()->name();
3376 else if ( activeStudy() )
3377 modName = "nomodule";
3379 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3380 QByteArray aDefaultState;
3381 aResMgr->value( "windows_geometry", modName, aDefaultState );
3382 QByteArray aDefaultVisibility;
3383 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3384 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3385 aResMgr->setWorkingMode( prevMode );
3387 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3390 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3391 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3393 if ( version > Qtx::versionToId( "7.4.1" ) )
3394 aResMgr->value( "windows_geometry", modName , arr );
3396 arr = aDefaultState;
3397 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3398 desktop()->restoreState( aTargetArray );
3401 QStringList mainToolbarsNames;
3402 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3403 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3404 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3406 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3409 QMap<QString, bool> *tbMap = 0;
3410 QMap<QString, bool> *dwMap = 0;
3412 QMap<QString, bool> userTbMap, userDwMap;
3413 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3415 QMap<QString, bool> defaultTbMap, defaultDwMap;
3416 if(hasDefaultVisibility) {
3417 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3423 if(hasDefaultVisibility){
3424 tbMap = &defaultTbMap;
3431 if(hasDefaultVisibility){
3432 dwMap = &defaultDwMap;
3437 QList<QToolBar*> tbList = findToolBars();
3438 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3440 QToolBar* tb = *tit;
3441 if ( tbMap->contains( tb->objectName() ) ) {
3442 tb->setVisible( (*tbMap)[tb->objectName()] );
3448 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3449 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3451 QDockWidget* dw = *dit;
3453 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3454 if ( po != desktop() )
3457 if ( dwMap->contains( dw->objectName() ) )
3458 dw->setVisible( (*dwMap)[dw->objectName()] );
3466 Saves windows geometry
3468 void LightApp_Application::saveDockWindowsState()
3473 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3474 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3476 if( !storeWin && !storeTb )
3480 if ( activeModule() )
3481 modName = activeModule()->name();
3482 else if ( activeStudy() )
3483 modName = "nomodule";
3485 QString versionId = GUI_VERSION_STR;
3486 #if GUI_DEVELOPMENT > 0
3490 QByteArray arr = desktop()->saveState();
3491 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3492 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
3495 if ( myWinVis.contains( modName ) )
3496 visArr = myWinVis[modName];
3498 QMap<QString, bool> tbMap, dwMap;
3499 dockWindowsState( visArr, tbMap, dwMap );
3501 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3502 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3505 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3508 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3509 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3511 QDockWidget* wid = *it;
3512 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3515 visArr = dockWindowsState( tbMap, dwMap );
3517 myWinVis.insert( modName, visArr );
3520 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3523 QDataStream stream( &visArr, QIODevice::WriteOnly );
3525 stream << (uchar)ToolBarMarker;
3526 stream << tb.size();
3527 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3529 stream << tit.key();
3530 stream << (uchar)( tit.value() ? 1 : 0 );
3533 stream << (uchar)DockWidgetMarker;
3534 stream << dw.size();
3535 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3537 stream << wit.key();
3538 stream << (uchar)( wit.value() ? 1 : 0 );
3544 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3549 QByteArray visArr = arr;
3550 QDataStream stream( &visArr, QIODevice::ReadOnly );
3554 if ( marker != ToolBarMarker )
3559 for ( int i = 0; i < lines; ++i )
3562 stream >> objectName;
3565 tb.insert( objectName, shown );
3569 if ( marker != DockWidgetMarker )
3573 for ( int j = 0; j < lines; ++j )
3576 stream >> objectName;
3579 dw.insert( objectName, shown );
3584 Adds icon names for modules
3586 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3590 SUIT_ResourceMgr* resMgr = resourceMgr();
3594 QStringList modList;
3595 modules( modList, false );
3597 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3599 QString modName = *it;
3600 QString modIntr = moduleName( modName );
3601 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3603 if ( modIcon.isEmpty() )
3606 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3607 modIcon += QString( ".png" );
3609 iconMap.insert( modName, modIcon );
3614 Inserts items in popup, which necessary for current application
3616 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3619 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3620 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3621 selMgr->setSelectionCacheEnabled( true );
3623 SUIT_DataBrowser* ob = objectBrowser();
3625 CAM_Application::contextMenuPopup( type, thePopup, title );
3627 if ( ob && type == ob->popupClientType() ) {
3628 thePopup->addSeparator();
3629 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3630 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3631 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3634 #ifndef DISABLE_SALOMEOBJECT
3635 if ( selMgr && ob ) {
3636 SALOME_ListIO selected;
3637 selMgr->selectedObjects( selected );
3638 if(selected.Extent() == 1){
3639 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3640 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3641 if(obj && obj->renameAllowed()) {
3642 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3643 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3644 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3645 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3647 QList<QAction*> acts = thePopup->actions();
3648 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3649 thePopup->insertAction(firstAction,a);
3655 selMgr->setSelectionCacheEnabled( cacheIsOn );
3661 void LightApp_Application::createEmptyStudy()
3663 CAM_Application::createEmptyStudy();
3665 if ( objectBrowser() )
3666 objectBrowser()->updateTree();
3668 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3669 if ( aResMgr && activeStudy() ) {
3670 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3671 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3676 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3678 CAM_Application::setDesktop( desk );
3681 connect( desk, SIGNAL( message( const QString& ) ),
3682 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3683 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3684 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3690 \param mod - module to be activated
3692 bool LightApp_Application::activateModule( CAM_Module* mod )
3694 bool res = CAM_Application::activateModule( mod );
3696 if ( objectBrowser() )
3697 objectBrowser()->updateTree();
3703 \return keyborad accelerators manager object
3705 SUIT_Accel* LightApp_Application::accel() const
3711 Removes dead widget container from map
3713 void LightApp_Application::onWCDestroyed( QObject* ob )
3715 // remove destroyed widget container from windows map
3716 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3718 if ( itr.value() != ob )
3721 int key = itr.key();
3722 myWin.remove( key );
3727 void LightApp_Application::onMRUActivated( const QString& name )
3729 SUIT_Session* s = SUIT_Session::session();
3730 if ( s && s->activeApplication() == this )
3734 void LightApp_Application::onStylePreferences()
3736 Style_PrefDlg dlg( desktop() );
3739 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3742 void LightApp_Application::onFullScreen(){
3743 if(myScreenHelper) {
3744 if(desktop()->isFullScreen())
3745 myScreenHelper->switchToNormalScreen();
3747 myScreenHelper->switchToFullScreen();
3752 Connects just added view manager
3754 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3756 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3757 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3758 CAM_Application::addViewManager( vm );
3762 Remove view manager from memory
3764 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3766 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3767 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3768 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3770 aStudy->removeObjectProperties( vm->getGlobalId() );
3772 CAM_Application::removeViewManager( vm );
3774 LightApp_SelectionMgr* selMgr = selectionMgr();
3775 QList<SUIT_Selector*> selectors;
3776 selMgr->selectors( selectors );
3777 foreach( SUIT_Selector* selector, selectors ) {
3778 if ( selector->owner() == vm->getViewModel() ) {
3783 // IPAL22894: Crash on closing OCC view
3789 Renames active window of desktop
3791 void LightApp_Application::onRenameWindow()
3796 QWidget* w = desktop()->activeWindow();
3801 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3802 if( ok && !name.isEmpty() )
3803 w->setWindowTitle( name );
3807 Closes active window of desktop
3809 void LightApp_Application::onCloseWindow()
3814 QWidget* w = desktop()->activeWindow();
3822 Closes all windows of desktop
3824 void LightApp_Application::onCloseAllWindow()
3826 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3830 QList<SUIT_ViewWindow*> wndList = desk->windows();
3831 SUIT_ViewWindow* wnd;
3832 foreach( wnd, wndList )
3840 Groups all windows of desktop
3842 void LightApp_Application::onGroupAllWindow()
3844 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3848 QtxWorkstack* wgStack = desk->workstack();
3854 \return if the library of module exists
3855 \param moduleTitle - title of module
3857 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3859 if( moduleTitle.isEmpty() )
3862 QString lib = moduleLibrary( moduleTitle );
3864 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3865 bool isPythonModule = lib.contains("SalomePyQtGUI");
3866 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3870 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3872 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3875 bool isLibFound = false;
3876 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3877 for( ; anIt!=aLast; anIt++ )
3879 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
3890 INFOS( "\n****************************************************************" << std::endl
3891 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
3892 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
3893 << "****************************************************************" << std::endl );
3895 else if ( !isPythonModule && !isPythonLightModule)
3898 if ( isPythonModule || isPythonLightModule)
3900 QString pylib = moduleName( moduleTitle ) + QString(".py");
3901 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
3903 // Check the python library
3905 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3907 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
3909 bool isPyLib = false, isPyGuiLib = false;
3910 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3911 for( ; anIt!=aLast; anIt++ )
3913 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
3914 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
3916 if(!isPythonLightModule)
3917 if( !isPyLib && inf.exists() )
3920 if( !isPyGuiLib && infgui.exists() )
3923 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
3927 printf( "\n****************************************************************\n" );
3928 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
3930 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
3932 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
3933 printf( "****************************************************************\n" );
3940 \return default name for an active study
3942 void LightApp_Application::setDefaultStudyName( const QString& theName )
3944 QStringList anInfoList;
3945 modules( anInfoList, false );
3947 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
3948 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
3949 !aStudy->isSaved() )
3951 aStudy->setStudyName( theName );
3952 updateDesktopTitle();
3957 Custom event handler
3959 bool LightApp_Application::event( QEvent* e )
3961 if( e && e->type()==2000 )
3963 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
3964 QString* d = ( QString* )ce->data();
3965 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
3967 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
3968 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
3969 showPreferences( tr( "PREF_APP" ) );
3974 return CAM_Application::event( e );
3977 /*! Check data object */
3978 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
3982 bool isSuitable = !theObj->entry().isEmpty() &&
3983 !theObj->componentDataType().isEmpty() &&
3984 !theObj->name().isEmpty();
3991 int LightApp_Application::openChoice( const QString& aName )
3993 int choice = CAM_Application::openChoice( aName );
3995 if ( choice == OpenExist ) // The document is already open.
3997 // Do you want to reload it?
3998 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
3999 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4000 choice = OpenReload;
4006 bool LightApp_Application::openAction( const int choice, const QString& aName )
4013 STD_Application* app = 0;
4014 SUIT_Session* session = SUIT_Session::session();
4015 QList<SUIT_Application*> appList = session->applications();
4016 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4018 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4019 app = ::qobject_cast<STD_Application*>( *it );
4024 app->onCloseDoc( false );
4025 appList = session->applications();
4026 STD_Application* other = 0;
4027 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4028 other = ::qobject_cast<STD_Application*>( *it );
4031 res = other->onOpenDoc( aName );
4036 res = CAM_Application::openAction( choice, aName );
4043 QStringList LightApp_Application::viewManagersTypes() const
4045 QStringList aTypesList;
4046 aTypesList += myUserWmTypes;
4047 #ifndef DISABLE_GLVIEWER
4048 aTypesList<<GLViewer_Viewer::Type();
4050 #ifndef DISABLE_PLOT2DVIEWER
4051 aTypesList<<Plot2d_Viewer::Type();
4053 #ifndef DISABLE_QXGRAPHVIEWER
4054 aTypesList<<QxScene_Viewer::Type();
4056 #ifndef DISABLE_PVVIEWER
4057 aTypesList<<PVViewer_Viewer::Type();
4059 #ifndef DISABLE_OCCVIEWER
4060 aTypesList<<OCCViewer_Viewer::Type();
4062 #ifndef DISABLE_VTKVIEWER
4063 #ifndef DISABLE_SALOMEOBJECT
4064 aTypesList<<SVTK_Viewer::Type();
4066 aTypesList<<VTKViewer_Viewer::Type();
4072 * Removes all view managers of known types
4073 * Other view managers are ignored
4075 void LightApp_Application::clearKnownViewManagers()
4077 QStringList aTypesList = viewManagersTypes();
4078 QList<SUIT_ViewManager*> aMgrList;
4079 viewManagers( aMgrList );
4080 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4081 if (aTypesList.contains(aMgr->getType()))
4082 removeViewManager(aMgr);
4087 Copy of current selection
4089 void LightApp_Application::onCopy()
4091 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4097 Paste of current data in clipboard
4099 void LightApp_Application::onPaste()
4101 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4107 Browse (i.e. set focus on) the published objects
4108 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4109 has been accepted by Ok (or Apply & Close) button
4110 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4111 (to select the first published object only)
4112 \return entry of the selected object
4114 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4115 const bool theIsApplyAndClose,
4116 const bool theIsOptimizedBrowsing )
4119 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4121 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4122 switch( aBrowsePolicy )
4126 case BP_ApplyAndClose:
4127 if( !theIsApplyAndClose )
4135 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4139 SUIT_DataBrowser* anOB = objectBrowser();
4143 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4147 QStringListIterator anIter( theEntryList );
4148 if( theIsOptimizedBrowsing )
4150 // go to the last entry
4152 if( anIter.hasPrevious() )
4156 // scroll to each entry in the list
4157 // (in optimized mode - to the last entry only)
4159 LightApp_DataObject* anObject = 0;
4160 while( anIter.hasNext() )
4162 anEntry = anIter.next();
4163 if( !anEntry.isEmpty() )
4165 anObject = aStudy->findObjectByEntry( anEntry );
4168 QModelIndex anIndex = aModel->index( anObject );
4169 anOB->treeView()->scrollTo( anIndex );
4174 // always select the last object
4175 if( anObject && !anEntry.isEmpty() )
4177 QList<SUIT_Selector*> aSelectorList;
4178 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4179 if( !aSelectorList.isEmpty() )
4181 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4183 bool anIsAutoBlock = aSelector->autoBlock();
4185 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4186 aSelector->setAutoBlock( false );
4188 SUIT_DataOwnerPtrList aList;
4189 #ifndef DISABLE_SALOMEOBJECT
4190 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4191 ( anObject->entry().toLatin1().constData(),
4192 anObject->componentDataType().toLatin1().constData(),
4193 anObject->name().toLatin1().constData() );
4194 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4196 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4199 aList.append( owner );
4200 selectionMgr()->setSelected( aList );
4203 // restore auto block flag
4204 aSelector->setAutoBlock( anIsAutoBlock );
4212 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4214 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4215 return study ? study->findObjectByEntry( id ) : 0;
4219 Checks that an object can be renamed.
4220 \param entry entry of the object
4221 \brief Return \c true if object can be renamed
4223 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4228 Rename object by entry.
4229 \param entry entry of the object
4230 \param name new name of the object
4231 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4233 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4237 /*! Process standard messages from desktop */
4238 void LightApp_Application::onDesktopMessage( const QString& message )
4240 const QString sectionSeparator = "/";
4242 if ( message.toLower() == "updateobjectbrowser" ||
4243 message.toLower() == "updateobjbrowser" ) {
4244 // update object browser
4245 updateObjectBrowser();
4247 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4248 QString vtype = message.split( sectionSeparator ).last();
4249 if ( !vtype.isEmpty() )
4250 getViewManager( vtype, true );
4253 QStringList data = message.split( sectionSeparator );
4254 if ( data.count() > 1 ) {
4255 QString msgType = data[0].trimmed();
4256 LightApp_Module* sMod = 0;
4257 CAM_Module* mod = module( msgType );
4259 mod = module( moduleTitle( msgType ) );
4260 if ( mod && mod->inherits( "LightApp_Module" ) )
4261 sMod = (LightApp_Module*)mod;
4263 if ( msgType.toLower() == "preferences" ) {
4264 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4265 // for example "preferences/Study/multi_file_dump/true"
4266 if ( data.count() > 3 ) {
4267 QString section = data[1].trimmed();
4268 QString param = data[2].trimmed();
4269 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4270 resourceMgr()->setValue( section, param, value );
4274 // received message for the module
4275 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4276 sMod->message( msg );
4284 Returns all top level toolbars.
4285 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4287 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4289 QList<QToolBar*> aResult;
4290 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4291 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4292 QToolBar* tb = *tit;
4293 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4294 if ( po != desktop() )
4296 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4303 Internal method to parse toolbars and dockable windows state.
4305 QByteArray LightApp_Application::processState(QByteArray& input,
4306 const bool processWin,
4307 const bool processTb,
4308 const bool isRestoring,
4309 QByteArray defaultState) {
4312 bool hasDefaultState = !defaultState.isEmpty();
4313 bool isDockWinWriten = false;
4315 //Write date from users settings
4317 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4318 int marker, version;
4320 tmpInputData >> marker;
4321 tmpInputData >> version;
4322 tmpInputData >> dockmarker;
4323 tmpInputData >> nbDocWin;
4325 if(processWin && processTb && !isRestoring) {
4327 } else if(!processWin && !processTb ) {
4329 aRes = defaultState;
4331 QDataStream aData(&aRes, QIODevice::WriteOnly);
4332 QList<QToolBar*> aToolBars = findToolBars();
4335 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4336 QToolBar* tb = *tit;
4337 aNames.append(tb->objectName());
4340 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4341 if(toolBarMarkerIndex < 0)
4343 QDataStream anInputData(&input, QIODevice::ReadOnly);
4345 int toolBarMarkerIndexDef;
4346 if(hasDefaultState) {
4347 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4348 if(toolBarMarkerIndexDef < 0)
4351 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4353 QDataStream* aTargetData = 0;
4354 int aTargetIndex = -1;
4356 QByteArray currentArr = desktop()->saveState();
4357 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4358 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4359 if(processWin && useInputData) {
4360 aTargetData = &anInputData;
4361 aTargetIndex = toolBarMarkerIndex;
4363 //Write date from default settings
4364 if(hasDefaultState) {
4365 aTargetData = &anInputDataDef;
4366 aTargetIndex = toolBarMarkerIndexDef;
4368 //If no default state, write current snapshot of the dockable windows
4370 aTargetData = &anInputDataCur;
4371 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4372 aTargetIndex = toolBarMarkerIndexCur;
4377 if(aTargetData && aTargetIndex >= 0 ) {
4378 aTargetData->device()->seek(0);
4379 while( aTargetData->device()->pos() < aTargetIndex ) {
4384 isDockWinWriten = true;
4391 aTargetData = &anInputData;
4392 aTargetIndex = toolBarMarkerIndex;
4394 if(hasDefaultState) {
4395 aTargetData = &anInputDataDef;
4396 aTargetIndex = toolBarMarkerIndexDef;
4400 if(aTargetData && aTargetIndex >= 0) {
4402 if(!isDockWinWriten ) {
4403 //Write version marker
4404 int marker, version;
4405 aTargetData->device()->seek(0);
4406 *aTargetData >> marker;
4407 *aTargetData >> version;
4410 aData << (uchar) QDockWidgetMarker;
4412 int shift = 4*sizeof(int) + sizeof(QSize);
4413 index = aTargetIndex - shift;
4415 index = aTargetIndex;
4418 aTargetData->device()->seek(index);
4419 while(!aTargetData->atEnd()) {
4424 } else { // Not treat toolbars
4425 aData << (uchar) QToolBarMarker;
4426 aData << (int) 0; //Nb toolbars = 0
4433 \brief Emits operationFinished signal.
4434 \param theModuleName the name of the module which perfomed the operation
4435 \param theOperationName the operation name
4436 \param theEntryList the list of the created objects entries
4438 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4439 const QString& theOperationName,
4440 const QStringList& theEntryList )
4442 emit operationFinished( theModuleName, theOperationName, theEntryList );
4446 Update visibility state of given objects
4448 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4449 SUIT_ViewModel* theViewModel )
4451 if ( !theViewModel || theList.isEmpty() ) return;
4453 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4454 if ( !aStudy ) return;
4456 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4458 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4459 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4461 if ( !obj || aStudy->isComponent( obj->entry() ) )
4464 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4465 if ( anObjModule ) {
4466 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4468 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4469 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4470 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4471 anObjState = Qtx::ShownState;
4473 anObjState = Qtx::HiddenState;
4475 aStudy->setVisibilityState( obj->entry(), anObjState );
4482 * Called when window activated
4484 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4486 SUIT_DataBrowser* anOB = objectBrowser();
4489 SUIT_DataObject* rootObj = anOB->root();
4493 DataObjectList listObj = rootObj->children( true );
4495 SUIT_ViewModel* vmod = 0;
4496 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4497 vmod = vman->getViewModel();
4498 updateVisibilityState( listObj, vmod );
4502 Called then view manager removed
4504 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4506 ViewManagerList lst;
4507 viewManagers( lst );
4508 if ( lst.count() == 1) { // in case if closed last view window
4509 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4511 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4516 Check existing document.
4518 bool LightApp_Application::checkExistingDoc()
4521 if( activeStudy() ) {
4522 int answer = SUIT_MessageBox::question( desktop(),
4523 tr( "APPCLOSE_CAPTION" ),
4524 tr( "STUDYCLOSE_DESCRIPTION" ),
4525 tr( "APPCLOSE_SAVE" ),
4526 tr( "APPCLOSE_CLOSE" ),
4527 tr( "APPCLOSE_CANCEL" ), 0 );
4529 if ( activeStudy()->isSaved() ) {
4532 } else if ( onSaveAsDoc() ) {
4533 if( !closeDoc( false ) ) {
4540 else if( answer == 1 ) {
4542 } else if( answer == 2 ) {
4549 #ifndef DISABLE_PYCONSOLE
4551 PyConsole_Interp* LightApp_Application::getPyInterp()
4553 static PyConsole_Interp* myInterp = 0;
4555 myInterp = createPyInterp();
4559 PyConsole_Interp* LightApp_Application::createPyInterp()
4561 return new LightApp_PyInterp();
4564 #endif // DISABLE_PYCONSOLE