1 // Copyright (C) 2007-2013 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.
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_Study.h"
46 #include "LightApp_Preferences.h"
47 #include "LightApp_PreferencesDlg.h"
48 #include "LightApp_ModuleDlg.h"
49 #include "LightApp_AboutDlg.h"
50 #include "LightApp_ModuleAction.h"
51 // temporary commented
52 //#include "LightApp_OBFilter.h"
53 #include "LightApp_EventFilter.h"
54 #include "LightApp_OBSelector.h"
55 #include "LightApp_SelectionMgr.h"
56 #include "LightApp_DataObject.h"
57 #include "LightApp_WgViewModel.h"
58 #include "LightApp_FullScreenHelper.h"
61 #include <GUI_version.h>
62 #include <Basics_OCCTVersion.hxx>
64 #include <SALOME_Event.h>
66 #include <Style_Salome.h>
67 #include <Style_PrefDlg.h>
69 #include <CAM_Module.h>
70 #include <CAM_DataModel.h>
71 #include <CAM_Study.h>
72 #include <STD_TabDesktop.h>
74 #include <SUIT_DataBrowser.h>
75 #include <SUIT_Session.h>
76 #include <SUIT_Study.h>
77 #include <SUIT_FileDlg.h>
78 #include <SUIT_ResourceMgr.h>
79 #include <SUIT_ShortcutMgr.h>
80 #include <SUIT_Tools.h>
81 #include <SUIT_Accel.h>
82 #include <SUIT_MessageBox.h>
83 #include <SUIT_ViewWindow.h>
86 #include <QtxToolBar.h>
87 #include <QtxTreeView.h>
88 #include <QtxMRUAction.h>
89 #include <QtxDockAction.h>
90 #include <QtxDockWidget.h>
91 #include <QtxActionToolMgr.h>
92 #include <QtxSearchTool.h>
93 #include <QtxWorkstack.h>
95 #include <QtxWebBrowser.h>
97 #include <LogWindow.h>
99 #ifndef DISABLE_GLVIEWER
100 #include <GLViewer_Viewer.h>
101 #include <GLViewer_ViewManager.h>
102 #include "LightApp_GLSelector.h"
105 #ifndef DISABLE_PLOT2DVIEWER
106 #include <Plot2d_ViewManager.h>
107 #include <Plot2d_ViewModel.h>
108 #include <Plot2d_ViewWindow.h>
109 #include <Plot2d_ViewFrame.h>
110 #include "LightApp_Plot2dSelector.h"
111 #ifndef DISABLE_SALOMEOBJECT
112 #include <SPlot2d_ViewModel.h>
114 #include <Plot2d_ViewModel.h>
118 #ifndef DISABLE_OCCVIEWER
119 #include <OCCViewer_ViewManager.h>
120 #include <OCCViewer_ViewFrame.h>
121 #ifndef DISABLE_SALOMEOBJECT
122 #include <SOCC_ViewModel.h>
124 #include <OCCViewer_ViewModel.h>
126 #include "LightApp_OCCSelector.h"
129 #ifndef DISABLE_VTKVIEWER
130 #ifndef DISABLE_SALOMEOBJECT
131 #include <SVTK_ViewModel.h>
132 #include <SVTK_ViewManager.h>
133 #include "LightApp_VTKSelector.h"
135 #include <VTKViewer_ViewModel.h>
136 #include <VTKViewer_ViewManager.h>
138 #include <VTKViewer_ViewModel.h>
141 //#ifndef DISABLE_SUPERVGRAPHVIEWER
142 // #include <SUPERVGraph_ViewModel.h>
143 // #include <SUPERVGraph_ViewFrame.h>
144 // #include <SUPERVGraph_ViewManager.h>
147 #ifndef DISABLE_QXGRAPHVIEWER
148 //VSR: QxGraph has been replaced by QxScene
149 // #include <QxGraph_ViewModel.h>
150 // #include <QxGraph_ViewWindow.h>
151 // #include <QxGraph_ViewManager.h>
152 #include <QxScene_ViewManager.h>
153 #include <QxScene_ViewModel.h>
154 #include <QxScene_ViewWindow.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;
225 \return last global id of study
227 int LightApp_Application::studyId()
229 return LightApp_Application::lastStudyId;
232 /*!Create new instance of LightApp_Application.*/
233 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
235 return new LightApp_Application();
238 /*! \var global preferences of LightApp */
239 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
243 \class LightApp_Application
244 Application containing LightApp module
248 LightApp_Application::LightApp_Application()
249 : CAM_Application( false ),
251 myScreenHelper(new LightApp_FullScreenHelper())
253 Q_INIT_RESOURCE( LightApp );
255 STD_TabDesktop* desk = new STD_TabDesktop();
256 desk->setFullScreenAllowed(false);
257 desk->setMinimizeAllowed(false);
261 // initialize auto save timer
262 myAutoSaveTimer = new QTimer( this );
263 myAutoSaveTimer->setSingleShot( true );
264 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
266 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
267 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
269 QtxWebBrowser::setData("browser:icon", aResMgr->loadPixmap( "LightApp", tr( "BROWSER_ICON" ) ) );
270 QtxWebBrowser::setData("browser:title", tr( "BROWSER_TITLE" ) );
271 QtxWebBrowser::setData("toolbar:title", tr( "BROWSER_TOOLBAR_TITLE" ) );
272 QtxWebBrowser::setData("menu:file:title", tr( "BROWSER_FILEMENU" ) );
273 QtxWebBrowser::setData("action:close:title", tr( "BROWSER_CLOSE" ) );
274 QtxWebBrowser::setData("action:close:icon", aResMgr->loadPixmap( "LightApp", tr( "BROWSER_CLOSE_ICON" ) ) );
275 QtxWebBrowser::setData("action:back:title", tr( "BROWSER_BACK" ) );
276 QtxWebBrowser::setData("action:forward:title", tr( "BROWSER_FORWARD" ) );
277 QtxWebBrowser::setData("action:find:title", tr( "BROWSER_FIND" ) );
278 QtxWebBrowser::setData("action:findnext:title", tr( "BROWSER_FINDNEXT" ) );
279 QtxWebBrowser::setData("action:findprev:title", tr( "BROWSER_FINDPREV" ) );
281 desktop()->setWindowIcon( aLogo );
282 desktop()->setDockableMenuBar( false );
283 desktop()->setDockableStatusBar( false );
285 // base logo (salome itself)
286 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
287 // extra logo (salome-based application)
288 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
292 mySelMgr = new LightApp_SelectionMgr( this );
294 myAccel = SUIT_Accel::getAccel();
296 #ifndef DISABLE_OCCVIEWER
297 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
298 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
299 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
300 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
301 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
302 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
303 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
304 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
305 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
306 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
307 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
309 #ifndef DISABLE_VTKVIEWER
310 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
311 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
312 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
313 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
314 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
315 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
316 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
317 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
318 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
319 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
320 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
322 #ifndef DISABLE_PLOT2DVIEWER
323 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
324 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
325 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
326 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
327 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
328 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
329 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
332 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
334 // Set existing font for the python console in resources
335 if( !aResMgr->hasValue( "PyConsole", "font" ) )
338 QFont f = aResMgr->fontValue( "PyConsole", "font" );
340 QStringList famdb = fdb.families();
342 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
345 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
347 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
350 if ( famdb.contains(aFamily) )
352 f.setFamily( aFamily );
353 aResMgr->setValue( "PyConsole", "font", f );
360 *\li Save window geometry.
361 *\li Save desktop geometry.
362 *\li Save resource maneger.
363 *\li Delete selection manager.
365 LightApp_Application::~LightApp_Application()
368 delete myScreenHelper;
371 /*!Start application.*/
372 void LightApp_Application::start()
374 CAM_Application::start();
377 updateViewManagers();
380 desktop()->statusBar()->showMessage( "" );
382 LightApp_EventFilter::Init();
385 /*!Gets application name.*/
386 QString LightApp_Application::applicationName() const
388 static QString _app_name;
389 if ( _app_name.isEmpty() )
390 _app_name = tr( "APP_NAME" );
394 /*!Gets application version.*/
395 QString LightApp_Application::applicationVersion() const
397 static QString _app_version;
399 if ( _app_version.isEmpty() )
401 QString resVersion = tr( "APP_VERSION" );
402 if ( resVersion != "APP_VERSION" )
404 _app_version = resVersion;
408 _app_version = GUI_VERSION_STR;
414 /*!Load module by \a name.*/
415 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
417 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
420 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
421 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
422 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
427 /*!Activate module by \a modName*/
428 bool LightApp_Application::activateModule( const QString& modName )
431 CAM_Module* prevMod = activeModule();
434 actName = prevMod->moduleName();
436 if ( actName == modName )
439 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
441 saveDockWindowsState();
443 bool status = CAM_Application::activateModule( modName );
445 updateModuleActions();
453 updateViewManagers();
458 /*!Gets selection manager.*/
459 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
464 /*!Creat action "New window" for certain type of viewer:*/
465 void LightApp_Application::createActionForViewer( const int id,
467 const QString& suffix,
470 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
471 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
472 QAction* a = createAction( id, // menu action id
479 false, // toggle flag
481 SLOT( onNewWindow() ) ); // slot
482 createMenu( a, parentId, -1 );
487 void LightApp_Application::createActions()
489 CAM_Application::createActions();
491 SUIT_Desktop* desk = desktop();
492 SUIT_ResourceMgr* resMgr = resourceMgr();
495 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
496 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
497 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
501 // - Help for modules
503 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
504 createMenu( separator(), helpMenu, -1, 10 );
505 QStringList aModuleList;
506 modules( aModuleList, false );
507 aModuleList.prepend( "GUI" );
508 aModuleList.prepend( "KERNEL" );
510 int id = LightApp_Application::UserID + FIRST_HELP_ID;
513 foreach( aModule, aModuleList ) {
514 if ( aModule.isEmpty() ) // module title (user name)
516 IMap <QString, QString> helpData; // list of help files for the module
517 QString helpSubMenu; // help submenu name (empty if not needed)
518 QString modName = moduleName( aModule ); // module name
519 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
520 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
521 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
523 if (resMgr->hasValue( modName, "documentation" ) )
524 docSection = resMgr->stringValue(modName, "documentation");
525 else if ( resMgr->hasSection( modName + "_documentation" ) )
526 docSection = modName + "_documentation";
527 if ( !docSection.isEmpty() ) {
528 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
529 QStringList listOfParam = resMgr->parameters( docSection );
530 foreach( QString paramName, listOfParam ) {
531 QString valueStr = resMgr->stringValue( docSection, paramName );
532 if ( !valueStr.isEmpty() ) {
533 QFileInfo fi( valueStr );
534 if ( fi.isRelative() && !modDir.isEmpty() )
535 valueStr = Qtx::addSlash( modDir ) + valueStr;
536 if ( QFile::exists( valueStr ) )
537 helpData.insert( paramName.arg( aModule ), valueStr );
542 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
543 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
544 QString indexFile = idxLst.join( QDir::separator() ); // index file
545 if ( QFile::exists( indexFile ) )
546 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
549 IMapConstIterator<QString, QString > fileIt;
550 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
551 QString helpFileName = fileIt.key();
552 // remove all '//' occurances
553 while ( helpFileName.contains( "//" ) )
554 helpFileName.replace( "//", "" );
555 // obtain submenus hierarchy if given
556 QStringList smenus = helpFileName.split( "/" );
557 helpFileName = smenus.last();
559 QAction* a = createAction( id, helpFileName,
560 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
561 helpFileName, helpFileName,
562 0, desk, false, this, SLOT( onHelpContentsModule() ) );
563 a->setData( fileIt.value() );
564 if ( !helpSubMenu.isEmpty() ) {
565 smenus.prepend( helpSubMenu );
567 // create sub-menus hierarchy
568 int menuId = helpMenu;
569 foreach ( QString subMenu, smenus ) {
570 menuId = createMenu( subMenu, menuId, -1, 0 );
572 createMenu( a, menuId, -1, 0 );
577 // - Additional help items
579 createMenu( separator(), helpMenu, -1, 5 );
581 QStringList addHelpItems = resMgr->parameters( "add_help" );
582 foreach ( QString addHelpItem, addHelpItems ) {
583 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
584 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
585 QAction* a = createAction( id, addHelpItem,
586 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
587 addHelpItem, addHelpItem,
588 0, desk, false, this, SLOT( onHelpContentsModule() ) );
589 a->setData( valueStr );
590 createMenu( a, helpMenu, -1, 5 );
596 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
597 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
598 registerAction( MRUId, mru );
600 // default icon for neutral point ('SALOME' module)
601 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
602 if ( defIcon.isNull() )
603 defIcon = QPixmap( imageEmptyIcon );
605 //! default icon for any module
606 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
607 if ( modIcon.isNull() )
608 modIcon = QPixmap( imageEmptyIcon );
611 modules( modList, false );
613 if ( modList.count() > 1 )
615 LightApp_ModuleAction* moduleAction =
616 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
618 QMap<QString, QString> iconMap;
619 moduleIconNames( iconMap );
621 const int iconSize = 20;
623 QStringList::Iterator it;
624 for ( it = modList.begin(); it != modList.end(); ++it )
626 if ( !isLibExists( *it ) )
629 QString modName = moduleName( *it );
631 if ( !isModuleAccessible( *it ) )
635 if ( iconMap.contains( *it ) )
636 iconName = iconMap[*it];
638 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
642 INFOS ( "****************************************************************" << std::endl
643 << "* Icon for " << (*it).toLatin1().constData()
644 << " not found. Using the default one." << std::endl
645 << "****************************************************************" << std::endl );
648 icon = Qtx::scaleIcon( icon, iconSize );
650 moduleAction->insertModule( *it, icon );
653 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
654 this, SLOT( onModuleActivation( const QString& ) ) );
655 registerAction( ModulesListId, moduleAction );
659 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
660 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
662 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
663 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
664 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
665 0, desk, false, this, SLOT( onCloseAllWindow() ) );
666 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
667 0, desk, false, this, SLOT( onGroupAllWindow() ) );
669 createMenu( CloseId, windowMenu, 0, -1 );
670 createMenu( CloseAllId, windowMenu, 0, -1 );
671 createMenu( GroupAllId, windowMenu, 0, -1 );
672 createMenu( separator(), windowMenu, -1, 0 );
674 #ifndef DISABLE_GLVIEWER
675 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
677 #ifndef DISABLE_PLOT2DVIEWER
678 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
680 #ifndef DISABLE_OCCVIEWER
681 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
683 #ifndef DISABLE_VTKVIEWER
684 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
686 #ifndef DISABLE_QXGRAPHVIEWER
687 //VSR: QxGraph has been replaced by QxScene
688 // createActionForViewer( NewQxGraphViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_C );
689 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
692 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
693 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
694 createMenu( RenameId, windowMenu, -1 );
696 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
697 createMenu( PreferencesId, fileMenu, 50, -1 );
698 createMenu( separator(), fileMenu, -1, 50, -1 );
700 createMenu( separator(), fileMenu, -1, 100, -1 );
701 createMenu( MRUId, fileMenu, 100, -1 );
702 createMenu( separator(), fileMenu, -1, 100, -1 );
704 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
705 0, desk, false, this, SLOT( onStylePreferences() ) );
707 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
708 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
711 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
712 createMenu( separator(), viewMenu, -1, 20, -1 );
713 createMenu( StyleId, viewMenu, 20, -1 );
714 createMenu( FullScreenId, viewMenu, 20, -1 );
716 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ) );
717 createTool( ModulesListId, modTBar );
720 /*!On module activation action.*/
721 void LightApp_Application::onModuleActivation( const QString& modName )
723 // Force user to create/open a study before module activation
724 QMap<QString, QString> iconMap;
725 moduleIconNames( iconMap );
726 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
728 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
730 bool cancelled = false;
732 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
733 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
734 QMap<int, QString> opmap = activateModuleActions();
735 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
736 aDlg.addButton( it.value(), it.key() );
738 int res = aDlg.exec();
740 // some operation is selected
741 moduleActionSelected( res );
745 putInfo( tr("INF_CANCELLED") );
747 LightApp_ModuleAction* moduleAction =
748 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
750 moduleAction->setActiveModule( QString() );
756 activateModule( modName );
759 /*!Default module activation.*/
760 QString LightApp_Application::defaultModule() const
762 QStringList aModuleNames;
763 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
764 //! If there's the one and only module --> activate it automatically
765 //! TODO: Possible improvement - default module can be taken from preferences
766 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
769 /*!On new window slot.*/
770 void LightApp_Application::onNewWindow()
772 const QObject* obj = sender();
773 if ( !obj || !obj->inherits( "QAction" ) )
777 int id = actionId( (QAction*)obj );
780 #ifndef DISABLE_GLVIEWER
782 type = GLViewer_Viewer::Type();
785 #ifndef DISABLE_PLOT2DVIEWER
787 type = Plot2d_Viewer::Type();
790 #ifndef DISABLE_OCCVIEWER
792 type = OCCViewer_Viewer::Type();
795 #ifndef DISABLE_VTKVIEWER
797 type = VTKViewer_Viewer::Type();
800 #ifndef DISABLE_QXGRAPHVIEWER
801 //VSR: QxGraph has been replaced by QxScene
802 // case NewQxGraphViewId:
803 // type = QxGraph_Viewer::Type();
805 case NewQxSceneViewId:
806 type = QxScene_Viewer::Type();
811 if ( !type.isEmpty() )
812 createViewManager( type );
816 SLOT: Creates new document
818 void LightApp_Application::onNewDoc()
820 //asl: fix for 0020515
822 saveDockWindowsState();
824 CAM_Application::onNewDoc();
828 SLOT: Opens new document
830 void LightApp_Application::onOpenDoc()
832 SUIT_Study* study = activeStudy();
833 saveDockWindowsState();
835 CAM_Application::onOpenDoc();
837 if ( !study ) // new study will be create in THIS application
840 updateViewManagers();
845 SLOT: Opens new document.
846 \param aName - name of file
848 bool LightApp_Application::onOpenDoc( const QString& aName )
850 // We should take mru action first because this application instance can be deleted later.
851 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
853 bool res = CAM_Application::onOpenDoc( aName );
858 mru->insert( aName );
860 mru->remove( aName );
866 SLOT: Displays "About" message box
868 void LightApp_Application::onHelpAbout()
870 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
875 Private SLOT: Called on selection is changed
876 Dispatchs active module that selection is changed
878 void LightApp_Application::onSelection()
880 onSelectionChanged();
882 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
883 ((LightApp_Module*)activeModule())->selectionChanged();
888 \param study - SUIT_Study.
890 void LightApp_Application::setActiveStudy( SUIT_Study* study )
892 CAM_Application::setActiveStudy( study );
896 Enables/Disables menu items and toolbar buttons. Rebuild menu
898 void LightApp_Application::updateCommandsStatus()
900 CAM_Application::updateCommandsStatus();
903 #ifndef DISABLE_GLVIEWER
904 a = action( NewGLViewId );
906 a->setEnabled( activeStudy() );
909 #ifndef DISABLE_PLOT2DVIEWER
910 a = action( NewPlot2dId );
912 a->setEnabled( activeStudy() );
915 #ifndef DISABLE_OCCVIEWER
916 a = action( NewOCCViewId );
918 a->setEnabled( activeStudy() );
921 #ifndef DISABLE_VTKVIEWER
922 a = action( NewVTKViewId );
924 a->setEnabled( activeStudy() );
927 #ifndef DISABLE_QXGRAPHVIEWER
928 //VSR: QxGraph has been replaced by QxScene
929 // a = action( NewQxGraphViewId );
930 a = action( NewQxSceneViewId );
932 a->setEnabled( activeStudy() );
938 Runs system command in separate thread
940 class RunBrowser: public QThread
943 RunBrowser( LightApp_Application* app,
944 const QString& theApp,
945 const QString& theParams,
946 const QString& theHelpFile,
947 const QString& theContext = QString() )
949 myParams( theParams ),
950 myContext( theContext ),
954 //For the external browser always specify 'file://' protocol,
955 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
956 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
961 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
962 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
964 QProcess* proc = new QProcess();
966 proc->start( aCommand );
967 if ( !proc->waitForStarted() ) {
968 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
969 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
970 ce2000->setData( msg );
971 QApplication::postEvent( myLApp, ce2000 );
982 LightApp_Application* myLApp;
986 SLOT: Displays help contents for choosen module
988 void LightApp_Application::onHelpContentsModule()
990 const QAction* a = (QAction*) sender();
991 QString helpFile = a->data().toString();
992 if ( helpFile.isEmpty() ) return;
994 SUIT_ResourceMgr* resMgr = resourceMgr();
997 platform = "winapplication";
999 platform = "application";
1001 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1003 QString quote("\"");
1004 anApp.prepend( quote );
1005 anApp.append( quote );
1007 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1008 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1010 if( useExtBrowser ) {
1011 if ( !anApp.isEmpty() ) {
1012 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1016 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1017 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1018 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1020 showPreferences( tr( "PREF_APP" ) );
1025 // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol
1026 // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
1027 QtxWebBrowser::loadUrl(helpFile);
1029 QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile));
1035 SLOT: Displays help contents for choosen dialog
1037 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1038 const QString& theFileName,
1039 const QString& theContext )
1041 QString fileName = theFileName;
1042 QString context = theContext;
1043 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1044 // context might be passed within theFileName argument
1045 QStringList comps = fileName.split("#");
1046 if ( comps.count() > 1 ) {
1047 context = comps.last();
1049 fileName = comps.join("#");
1053 QString homeDir = "";
1054 if ( !theComponentName.isEmpty() ) {
1055 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1056 if ( !dir.isEmpty() )
1057 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1058 Qtx::addSlash( "share" ) +
1059 Qtx::addSlash( "doc" ) +
1060 Qtx::addSlash( "salome" ) +
1061 Qtx::addSlash( "gui" ) +
1062 Qtx::addSlash( theComponentName ) );
1065 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1066 SUIT_ResourceMgr* resMgr = resourceMgr();
1069 platform = "winapplication";
1071 platform = "application";
1073 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1075 QString quote("\"");
1076 anApp.prepend( quote );
1077 anApp.append( quote );
1080 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1083 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1085 if ( !anApp.isEmpty() ) {
1086 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1090 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1091 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1092 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1093 showPreferences( tr( "PREF_APP" ) );
1098 // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol
1099 // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
1100 QtxWebBrowser::loadUrl(helpFile, context);
1102 QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile),context);
1109 Sets enable or disable some actions on selection changed.
1111 void LightApp_Application::onSelectionChanged()
1113 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1114 bool canCopy = m ? m->canCopy() : false;
1115 bool canPaste = m ? m->canPaste() : false;
1117 action( EditCopyId )->setEnabled(canCopy);
1118 action( EditPasteId )->setEnabled(canPaste);
1122 Adds window to application.
1123 \param wid - QWidget
1124 \param flag - key for window
1125 \param studyId - study id
1126 Flag used how identificator of window in windows list.
1129 void LightApp_Application::addWindow( QWidget* wid, const int flag, const int studyId )
1137 if ( !activeStudy() )
1140 sId = activeStudy()->id();
1143 if ( !myWindows.contains( flag ) )
1145 QMap<int, int> winMap;
1146 currentWindows( winMap );
1148 LightApp_WidgetContainer* newWC = new LightApp_WidgetContainer( flag, desktop() );
1149 connect( newWC, SIGNAL( destroyed ( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1150 // asv: connecting a slot for storing visibility flag of a window
1151 connect( newWC, SIGNAL( visibilityChanged ( bool ) ), SLOT( onVisibilityChanged( bool ) ) );
1152 myWindows.insert( flag, newWC );
1153 if ( winMap.contains( flag ) ) {
1154 //desktop()->removeDockWidget( myWindows[flag] );
1155 desktop()->addDockWidget( (Qt::DockWidgetArea)winMap[flag], myWindows[flag] );
1158 //myWindows[flag]->setResizeEnabled( true );
1159 myWindows[flag]->setFeatures( QDockWidget::AllDockWidgetFeatures );
1160 myWindows[flag]->setObjectName( QString( "dock_window_%1" ).arg( flag ) );
1161 //myWindows[flag]->setFixedExtentWidth( wid->width() );
1162 //myWindows[flag]->setFixedExtentHeight( wid->height() );
1163 myWindows[flag]->resize( wid->width(), wid->height() );
1167 #ifndef DISABLE_PYCONSOLE
1168 if( wid->inherits( "PyConsole_Console" ) )
1170 if( resourceMgr()->hasValue( "PyConsole", "font" ) )
1171 f = resourceMgr()->fontValue( "PyConsole", "font" );
1174 f = ( ( PyConsole_Console* )wid )->font();
1175 resourceMgr()->setValue( "PyConsole", "font", f );
1182 myWindows[flag]->insert( sId, wid );
1185 setWindowShown( flag, !myWindows[flag]->isEmpty() );
1189 QWidget* LightApp_Application::dockWindow( const int id ) const
1192 if ( myWin.contains( id ) )
1197 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1202 QDockWidget* dock = 0;
1203 QWidget* w = wid->parentWidget();
1204 while ( w && !dock )
1206 dock = ::qobject_cast<QDockWidget*>( w );
1207 w = w->parentWidget();
1212 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1217 if ( wid != dockWindow( id ) )
1218 removeDockWindow( id );
1220 myWin.insert( id, wid );
1222 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1223 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1225 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1226 dock->setObjectName( QString( "window_%1" ).arg( id ) );
1227 dock->setWidget( wid );
1229 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1230 if ( !accel.isEmpty() )
1231 dock->toggleViewAction()->setShortcut( accel );
1236 void LightApp_Application::removeDockWindow( const int id )
1238 QWidget* wid = dockWindow( id );
1244 QDockWidget* dock = windowDock( wid );
1248 dock->setWidget( 0 );
1249 wid->setParent( 0 );
1250 wid->setVisible( false );
1254 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1256 QDockWidget* dock = windowDock( dockWindow( id ) );
1257 if ( dock && desktop() ) {
1258 desktop()->addDockWidget( place, dock );
1259 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1260 if ( a ) a->update();
1266 \param flag - key for window
1267 \param studyId - study id
1268 Flag used how identificator of window in windows list.
1270 QWidget* LightApp_Application::getWindow( const int flag, const int )
1272 QWidget* wid = dockWindow( flag );
1274 insertDockWindow( flag, wid = createWindow( flag ) );
1276 QMap<int, int> winMap;
1277 currentWindows( winMap );
1278 if ( winMap.contains( flag ) )
1279 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1285 \return Object Browser
1287 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1289 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1295 LogWindow* LightApp_Application::logWindow()
1297 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1300 #ifndef DISABLE_PYCONSOLE
1302 This returns the python console integrated to the GUI. Depending
1303 when you request the python console, this function could return
1304 null. Then the optional parameter force (default to false) can be
1305 set to force the creation of the python console if it is not done
1307 \param force - if true, the pythonConsole is created if it does not exist yet
1308 \return Python Console
1310 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1312 QWidget* wid = dockWindow( WT_PyConsole );
1313 if ( !wid && force==true) {
1314 wid = getWindow(WT_PyConsole);
1316 return qobject_cast<PyConsole_Console*>( wid );
1321 Updates object browser and maybe data models
1322 \param updateModels - if it is true, then data models are updated
1324 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1326 // update existing data models
1329 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1330 if ( objectBrowser() )
1331 objectBrowser()->setAutoUpdate( false );
1333 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1335 CAM_Study::ModelList dm_list;
1336 study->dataModels( dm_list );
1337 QListIterator<CAM_DataModel*> it( dm_list );
1338 while ( it.hasNext() ) {
1339 CAM_DataModel* camDM = it.next();
1340 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1341 ((LightApp_DataModel*)camDM)->update();
1345 if( objectBrowser() )
1346 objectBrowser()->setAutoUpdate( isAutoUpdate );
1349 if ( objectBrowser() ) {
1350 objectBrowser()->updateGeometry();
1351 objectBrowser()->updateTree( 0, false );
1358 LightApp_Preferences* LightApp_Application::preferences() const
1360 return preferences( false );
1364 \return first view manager of some type
1365 \param vmType - type of view manager
1366 \param create - is it necessary to create view manager in case, when there is no manager of such type
1368 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1370 SUIT_ViewManager* aVM = viewManager( vmType );
1371 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1373 if ( anActiveVM && anActiveVM->getType() == vmType )
1376 if ( aVM && create )
1378 if ( !aVM->getActiveView() )
1381 aVM->getActiveView()->setFocus();
1384 aVM = createViewManager( vmType );
1390 Creates view manager of some type
1391 \param vmType - type of view manager
1393 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1395 SUIT_ResourceMgr* resMgr = resourceMgr();
1397 SUIT_ViewManager* viewMgr = 0;
1398 #ifndef DISABLE_GLVIEWER
1399 if( vmType == GLViewer_Viewer::Type() )
1401 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1402 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1405 #ifndef DISABLE_PLOT2DVIEWER
1406 if( vmType == Plot2d_Viewer::Type() )
1408 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1410 #ifndef DISABLE_SALOMEOBJECT
1411 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1413 new LightApp_Plot2dSelector( v, mySelMgr );
1415 vm = new Plot2d_Viewer();
1417 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1418 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1421 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1422 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1426 //#ifndef DISABLE_SUPERVGRAPHVIEWER
1427 // if( vmType == SUPERVGraph_Viewer::Type() )
1429 // viewMgr = new SUPERVGraph_ViewManager( activeStudy(), desktop(), new SUPERVGraph_Viewer() );
1432 #ifndef DISABLE_QXGRAPHVIEWER
1433 //VSR: QxGraph has been replaced by QxScene
1434 // if( vmType == QxGraph_Viewer::Type() )
1436 // viewMgr = new QxGraph_ViewManager( activeStudy(), desktop(), new QxGraph_Viewer() );
1438 if( vmType == QxScene_Viewer::Type() )
1440 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1441 QxScene_Viewer* vm = new QxScene_Viewer();
1442 viewMgr->setViewModel( vm );
1443 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1446 #ifndef DISABLE_OCCVIEWER
1447 if( vmType == OCCViewer_Viewer::Type() )
1449 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1450 OCCViewer_Viewer* vm;
1451 #ifndef DISABLE_SALOMEOBJECT
1452 vm = new SOCC_Viewer();
1454 vm = new OCCViewer_Viewer( true );
1456 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1457 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1458 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1459 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1460 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1461 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1462 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1463 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1465 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1466 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1467 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1468 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1469 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1470 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1472 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1473 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1476 #ifndef DISABLE_VTKVIEWER
1477 #ifndef DISABLE_SALOMEOBJECT
1478 if ( vmType == SVTK_Viewer::Type() )
1480 if ( vmType == VTKViewer_Viewer::Type() )
1483 #ifndef DISABLE_SALOMEOBJECT
1484 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1485 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1488 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1489 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1490 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1491 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1492 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1493 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1494 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1495 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1496 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1497 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1498 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1499 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1500 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1501 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1502 new LightApp_VTKSelector( vm, mySelMgr );
1505 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1506 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1508 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1516 addViewManager( viewMgr );
1517 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1519 if ( viewWin && desktop() ) {
1520 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1521 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1527 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1529 SUIT_ResourceMgr* resMgr = resourceMgr();
1531 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1533 new LightApp_WgViewModel( vmType, w ) );
1534 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1536 addViewManager( vm );
1537 SUIT_ViewWindow* vw = vm->createViewWindow();
1538 if ( vw && desktop() ) {
1539 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1540 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1543 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1544 myUserWmTypes << vmType;
1550 SLOT: Removes view manager from application
1552 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1554 removeViewManager( theVM );
1558 Protected SLOT: On study created.
1559 \param theStudy - just created study
1561 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1563 SUIT_DataObject* aRoot = 0;
1564 if ( theStudy && theStudy->root() )
1566 aRoot = theStudy->root();
1567 //aRoot->setName( tr( "DATA_MODELS" ) );
1570 getWindow( WT_ObjectBrowser );
1572 loadDockWindowsState();
1574 if ( objectBrowser() )
1575 objectBrowser()->setRoot( aRoot );
1577 activateModule( defaultModule() );
1579 if ( objectBrowser() )
1580 objectBrowser()->openLevels();
1584 Protected SLOT: On study opened.
1585 \param theStudy - just opened study
1587 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1589 SUIT_DataObject* aRoot = 0;
1590 if ( theStudy && theStudy->root() )
1592 aRoot = theStudy->root();
1596 getWindow( WT_ObjectBrowser );
1598 loadDockWindowsState();
1600 if ( objectBrowser() )
1601 objectBrowser()->setRoot( aRoot );
1603 activateModule( defaultModule() );
1605 if ( objectBrowser() )
1606 objectBrowser()->openLevels();
1611 /*!Protected SLOT. On study saved.*/
1612 void LightApp_Application::onStudySaved( SUIT_Study* s )
1614 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1616 mru->insert( s->studyName() );
1621 /*!Protected SLOT. On study closed.*/
1622 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1624 // stop auto-save timer
1625 myAutoSaveTimer->stop();
1627 // Bug 10396: clear selection
1628 mySelMgr->clearSelected();
1630 // Bug 12944: emit signal only after clear selection
1633 activateModule( "" );
1636 /*!Protected SLOT.On desktop activated.*/
1637 void LightApp_Application::onDesktopActivated()
1639 CAM_Application::onDesktopActivated();
1640 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1642 aModule->studyActivated();
1645 void LightApp_Application::studyOpened( SUIT_Study* s )
1647 CAM_Application::studyOpened( s );
1650 updateViewManagers();
1653 void LightApp_Application::studySaved( SUIT_Study* s )
1655 CAM_Application::studyOpened( s );
1656 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1657 if ( aResMgr && activeStudy() ) {
1658 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1659 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1663 void LightApp_Application::studyCreated( SUIT_Study* s )
1665 CAM_Application::studyCreated( s );
1668 updateViewManagers();
1671 /*!Gets file filter.
1672 *\retval QString "(*.bin)"
1674 QString LightApp_Application::getFileFilter() const
1682 Shows file dialog and return user selected file name
1684 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1685 const QString& caption, QWidget* parent )
1689 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1690 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1693 /*! Gets directory*/
1694 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1698 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1701 /*! Get open file names*/
1702 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1703 const QString& caption, QWidget* parent )
1707 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1708 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1711 /*!Private SLOT. Update object browser.*/
1712 void LightApp_Application::onRefresh()
1714 updateObjectBrowser( true );
1717 /*!Private SLOT. Support drag-and-drop operation.*/
1718 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1720 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1724 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1726 aModule->dropObjects( objects, parentObj, row, action );
1729 /*!Private SLOT. On preferences.*/
1730 void LightApp_Application::onPreferences()
1732 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1735 /*!Private SLOT. On preferences.*/
1736 void LightApp_Application::showPreferences( const QString& itemText )
1738 QApplication::setOverrideCursor( Qt::WaitCursor );
1740 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1742 QApplication::restoreOverrideCursor();
1747 preferences()->activateItem( itemText );
1749 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1752 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1753 resourceMgr()->save();
1756 shortcutMgr()->updateShortcuts();
1762 /*!Protected SLOT. On preferences changed.*/
1763 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1765 LightApp_Module* sMod = 0;
1766 CAM_Module* mod = module( modName );
1767 if ( mod && mod->inherits( "LightApp_Module" ) )
1768 sMod = (LightApp_Module*)mod;
1771 sMod->preferencesChanged( section, param );
1773 preferencesChanged( section, param );
1774 // emit signal to allow additional preferences changing processing
1775 emit preferenceChanged( modName, section, param );
1778 /*!Remove all windows from study.*/
1779 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1781 CAM_Application::beforeCloseDoc( s );
1784 /*!Update actions.*/
1785 void LightApp_Application::updateActions()
1787 updateCommandsStatus();
1793 SUIT_Study* LightApp_Application::createNewStudy()
1795 LightApp_Application::lastStudyId++;
1797 LightApp_Study* aStudy = new LightApp_Study( this );
1799 // Set up processing of major study-related events
1800 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1801 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1802 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1803 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1809 Creates window by flag.
1810 \param flag - identificator of window type
1812 QWidget* LightApp_Application::createWindow( const int flag )
1816 SUIT_ResourceMgr* resMgr = resourceMgr();
1818 if ( flag == WT_ObjectBrowser )
1820 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1821 ob->setSortMenuEnabled( true );
1822 ob->setAutoUpdate( true );
1823 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1824 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1826 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1827 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1828 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1830 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1831 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1832 treeModel->setSearcher( this );
1833 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1834 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1836 // Mantis issue 0020136: Drag&Drop in OB
1837 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1839 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1840 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1843 // temporary commented
1845 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1847 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1849 ob->setFilter( new LightApp_OBFilter( selectionMgr() ) );
1852 // Create OBSelector
1853 new LightApp_OBSelector( ob, mySelMgr );
1855 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1856 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1857 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1858 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1860 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1862 #ifndef DISABLE_PYCONSOLE
1863 else if ( flag == WT_PyConsole )
1865 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(),new LightApp_PyInterp());
1866 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1867 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1868 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1869 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
1872 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1875 else if ( flag == WT_LogWindow )
1877 LogWindow* logWin = new LogWindow( desktop() );
1878 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
1879 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
1881 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1887 \return default windows( Object Browser, Python Console )
1888 Adds to map \a aMap.
1890 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
1892 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1893 #ifndef DISABLE_PYCONSOLE
1894 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
1896 // aMap.insert( WT_LogWindow, Qt::DockBottom );
1899 /*!Default view managers*/
1900 void LightApp_Application::defaultViewManagers( QStringList& ) const
1906 \return preferences.
1907 Create preferences, if \a crt = true.
1909 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
1914 LightApp_Application* that = (LightApp_Application*)this;
1916 bool toCreate = !_prefs_ && crt;
1919 _prefs_ = new LightApp_Preferences( resourceMgr() );
1920 that->createPreferences( _prefs_ );
1923 that->myPrefs = _prefs_;
1925 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
1926 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ) );
1931 SUIT_ResourceMgr* resMgr = resourceMgr();
1933 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
1934 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
1936 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
1940 QStringList modNameList;
1941 app->modules( modNameList, false );
1943 QMap<QString, QString> iconMap;
1944 app->moduleIconNames( iconMap );
1946 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
1948 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
1951 int modId = _prefs_->addPreference( *it );
1952 if ( iconMap.contains( *it ) )
1953 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
1957 app->modules( modList );
1958 QListIterator<CAM_Module*> itr( modList );
1959 while ( itr.hasNext() )
1961 LightApp_Module* mod = 0;
1963 CAM_Module* anItem = itr.next();
1964 if ( anItem->inherits( "LightApp_Module" ) )
1965 mod = (LightApp_Module*)anItem;
1967 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
1969 _prefs_->addPreference( mod->moduleName() );
1970 mod->createPreferences();
1971 that->emptyPreferences( mod->moduleName() );
1975 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
1981 Adds new module to application
1983 void LightApp_Application::moduleAdded( CAM_Module* mod )
1985 CAM_Application::moduleAdded( mod );
1987 LightApp_Module* lightMod = 0;
1988 if ( mod && mod->inherits( "LightApp_Module" ) )
1989 lightMod = (LightApp_Module*)mod;
1991 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
1993 myPrefs->addPreference( mod->moduleName() );
1994 lightMod->createPreferences();
1995 emptyPreferences( mod->moduleName() );
1999 void LightApp_Application::emptyPreferences( const QString& modName )
2001 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2002 if ( !item || !item->isEmpty() )
2005 // printf( "---------------------> Modify for empty module.\n" );
2007 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2008 frm->setIcon( item->icon() );
2009 frm->setStretch( false );
2010 item->parentItem()->insertItem( frm, item );
2011 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2018 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2023 QStringList aValuesList;
2024 QList<QVariant> anIndicesList;
2028 // . Top-level "SALOME" preferences group <<start>>
2029 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2030 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2032 // .. "General" preferences tab <<start>>
2033 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2035 // ... "Language" group <<start>>
2036 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2037 pref->setItemProperty( "columns", 2, langGroup );
2038 // .... -> application language
2039 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2040 LightApp_Preferences::Selector, "language", "language" );
2041 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2042 QList<QVariant> aIcons;
2043 foreach ( QString aLang, aLangs ) {
2044 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2046 pref->setItemProperty( "strings", aLangs, curLang );
2047 pref->setItemProperty( "icons", aIcons, curLang );
2048 // ... "Language" group <<end>>
2050 // ... "Look and feel" group <<start>>
2051 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2052 pref->setItemProperty( "columns", 2, lookGroup );
2053 // .... -> show splash-screen
2054 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2055 // .... -> opaque resize
2056 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2057 // .... -> drop-down buttons
2058 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2059 // ... "Look and feel" group <<end>>
2061 // ... "Study properties" group <<start>>
2062 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2063 pref->setItemProperty( "columns", 2, studyGroup );
2064 // .... -> multi-file save
2065 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2066 // .... -> ascii save mode
2067 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2068 // .... -> store windows geometry
2069 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2070 // .... -> auto-save
2071 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2072 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2073 pref->setItemProperty( "min", 0, autoSaveInterval );
2074 pref->setItemProperty( "max", 1440, autoSaveInterval );
2075 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2076 // ... "Study properties" group <<end>>
2078 // ... "Help browser" group <<start>>
2079 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2081 QString platform = "winapplication";
2083 QString platform = "application";
2085 // .... -> browser application
2086 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2087 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2088 // .... -> browser parameters
2089 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2090 // ... "Help browser" group <<end>>
2092 // ... "Python console properties" group <<start>>
2093 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2095 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2096 // .... -> show banner
2097 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2098 // ... "Python console properties" group <<end>>
2100 // ... "MRU" preferences group <<start>>
2101 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2102 pref->setItemProperty( "columns", 4, mruGroup );
2103 // number of MRU items
2104 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2105 "MRU", "visible_count" );
2106 pref->setItemProperty( "min", 0, mruVisCount );
2107 pref->setItemProperty( "max", 100, mruVisCount );
2109 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2110 "MRU", "link_type" );
2111 aValuesList.clear();
2112 anIndicesList.clear();
2113 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2114 anIndicesList << 0 << 1 << 2 ;
2115 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2116 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2117 // ... "MRU" preferences group <<end>>
2118 // .. "General" preferences tab <<end>>
2120 // .. "3D viewer" group <<start>>
2121 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2122 // ... -> navigation mode
2123 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2124 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2125 aValuesList.clear();
2126 anIndicesList.clear();
2127 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2128 anIndicesList << 0 << 1;
2129 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2130 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2131 // ... -> zooming mode
2132 #if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
2133 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2134 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2135 aValuesList.clear();
2136 anIndicesList.clear();
2137 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2138 anIndicesList << 0 << 1;
2139 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2140 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2142 // ... "Trihedron" group <<start>>
2143 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2144 pref->setItemProperty( "columns", 2, occTriGroup );
2145 // .... -> trihedron size
2146 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2147 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2148 pref->setItemProperty( "min", 1.0E-06, occTS );
2149 pref->setItemProperty( "max", 1000, occTS );
2150 // .... -> relative size of trihedron
2151 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2152 // .... -> show static trihedron
2153 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2154 // ... "Trihedron" group <<end>>
2155 // .. "3D viewer" group <<end>>
2157 // .. "OCC viewer" group <<start>>
2158 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2160 // ... "Background" group <<start>>
2161 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2162 // pref->setItemProperty( "columns", 2, bgGroup );
2163 aValuesList.clear();
2164 anIndicesList.clear();
2166 QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2167 foreach( int gid, idList ) anIndicesList << gid;
2168 // .... -> 3D viewer background
2169 int bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2170 LightApp_Preferences::Background, "OCCViewer", "background" );
2171 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2172 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2173 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2174 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2175 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2176 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2177 pref->setItemProperty( "custom_enabled", false, bgId );
2178 pref->setItemProperty( "image_formats", formats, bgId );
2179 // .... -> XZ viewer background
2180 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2181 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2182 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2183 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2184 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2185 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2186 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2187 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2188 pref->setItemProperty( "custom_enabled", false, bgId );
2189 pref->setItemProperty( "image_formats", formats, bgId );
2190 // .... -> YZ viewer background
2191 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2192 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2193 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2194 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2195 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2196 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2197 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2198 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2199 pref->setItemProperty( "custom_enabled", false, bgId );
2200 pref->setItemProperty( "image_formats", formats, bgId );
2201 // .... -> XY viewer background
2202 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2203 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2204 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2205 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2206 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2207 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2208 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2209 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2210 pref->setItemProperty( "custom_enabled", false, bgId );
2211 pref->setItemProperty( "image_formats", formats, bgId );
2212 // ... "Background" group <<end>>
2215 // ... "Selection" group <<start>>
2216 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2217 pref->setItemProperty( "columns", 2, occSelectionGroup );
2218 // .... -> enable preselection
2219 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2220 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2221 // .... -> enable selection
2222 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2223 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2224 // ... "Selection" group <<end>>
2226 // ... -> empty frame (for layout) <<start>>
2227 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2228 pref->setItemProperty( "margin", 0, occGen );
2229 pref->setItemProperty( "columns", 2, occGen );
2230 // ... -> empty frame (for layout) <<end>>
2231 // .. "OCC viewer" group <<end>>
2233 // .. "VTK viewer" group <<start>>
2234 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2236 // ... -> empty frame (for layout) <<start>>
2237 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2238 //pref->setItemProperty( "columns", 2, vtkGen );
2239 // .... -> projection mode
2240 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2241 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2242 aValuesList.clear();
2243 anIndicesList.clear();
2244 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2245 anIndicesList << 0 << 1;
2246 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2247 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2248 // .... -> background
2249 aValuesList.clear();
2250 anIndicesList.clear();
2252 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2253 foreach( int gid, idList ) anIndicesList << gid;
2254 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2255 LightApp_Preferences::Background, "VTKViewer", "background" );
2256 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2257 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2258 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2259 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2260 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2261 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2262 pref->setItemProperty( "custom_enabled", false, bgId );
2263 pref->setItemProperty( "image_formats", formats, bgId );
2264 // .... -> speed increment
2265 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2266 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2267 pref->setItemProperty( "min", 1, vtkSpeed );
2268 pref->setItemProperty( "max", 1000, vtkSpeed );
2269 // .... -> speed mode
2270 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2271 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2272 aValuesList.clear();
2273 anIndicesList.clear();
2274 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2275 anIndicesList << 0 << 1;
2276 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2277 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2279 // ... "Selection" group <<start>>
2280 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2281 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2282 // .... -> preselection
2283 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2284 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2285 aValuesList.clear();
2286 anIndicesList.clear();
2287 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2288 anIndicesList << 0 << 1 << 2;
2289 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2290 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2291 // .... -> enable selection
2292 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2293 // ... "Selection" group <<end>>
2295 // ... -> empty frame (for layout) <<end>>
2297 // ... space mouse sub-group <<start>>
2298 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2299 //pref->setItemProperty( "columns", 2, vtkSM );
2300 // .... -> decrease speed increment
2301 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2302 LightApp_Preferences::Selector, "VTKViewer",
2303 "spacemouse_func1_btn" );
2304 // .... -> increase speed increment
2305 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2306 LightApp_Preferences::Selector, "VTKViewer",
2307 "spacemouse_func2_btn" );
2308 // .... -> dominant / combined switch
2309 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2310 LightApp_Preferences::Selector, "VTKViewer",
2311 "spacemouse_func5_btn" ); //
2312 aValuesList.clear();
2313 anIndicesList.clear();
2314 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2315 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2316 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2317 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2318 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2319 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2320 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2321 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2322 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2323 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2324 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2325 // ... space mouse sub-group <<end>>
2327 // ... avi recording sub-group <<start>>
2328 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2329 pref->setItemProperty( "columns", 2, vtkRec );
2330 // .... -> recording mode
2331 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2332 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2333 aValuesList.clear();
2334 anIndicesList.clear();
2335 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2336 anIndicesList << 0 << 1;
2337 pref->setItemProperty( "strings", aValuesList, modePref );
2338 pref->setItemProperty( "indexes", anIndicesList, modePref );
2340 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2341 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2342 pref->setItemProperty( "min", 0.1, fpsPref );
2343 pref->setItemProperty( "max", 100, fpsPref );
2345 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2346 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2347 pref->setItemProperty( "min", 1, qualityPref );
2348 pref->setItemProperty( "max", 100, qualityPref );
2349 // .... -> progressive mode
2350 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2351 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2352 // ... avi recording sub-group <<end>>
2354 // ... group names sub-group <<start>>
2355 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2356 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2357 pref->setItemProperty( "columns", 2, vtkGN );
2358 // .... -> text color
2359 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2360 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2361 // .... -> transparency
2362 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2363 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2364 pref->setItemProperty( "min", 0.0, transPref );
2365 pref->setItemProperty( "max", 1.0, transPref );
2366 pref->setItemProperty( "step", 0.1, transPref );
2367 // ... -> group names sub-group <<end>>
2368 // .. "VTK viewer" group <<end>>
2370 // .. "Plot2d viewer" group <<start>>
2371 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2372 //pref->setItemProperty( "columns", 2, plot2dGroup );
2374 // ... -> show legend
2375 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup,
2376 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2377 // ... -> legend position
2378 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup,
2379 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2380 aValuesList.clear();
2381 anIndicesList.clear();
2382 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2383 anIndicesList << 0 << 1 << 2 << 3 ;
2384 pref->setItemProperty( "strings", aValuesList, legendPosition );
2385 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2386 // ... -> legend font
2387 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2388 // ... -> curve type
2389 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup,
2390 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2391 aValuesList.clear();
2392 anIndicesList.clear();
2393 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2394 anIndicesList << 0 << 1 << 2 ;
2395 pref->setItemProperty( "strings", aValuesList, curveType );
2396 pref->setItemProperty( "indexes", anIndicesList, curveType );
2397 // ... -> marker size
2398 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup,
2399 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2400 pref->setItemProperty( "min", 0, markerSize );
2401 pref->setItemProperty( "max", 100, markerSize );
2402 // ... -> horizontal scaling mode
2403 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup,
2404 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2405 aValuesList.clear();
2406 anIndicesList.clear();
2407 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2408 anIndicesList << 0 << 1 ;
2409 pref->setItemProperty( "strings", aValuesList, horScale );
2410 pref->setItemProperty( "indexes", anIndicesList, horScale );
2411 // ... -> vertical scaling mode
2412 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup,
2413 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2414 pref->setItemProperty( "strings", aValuesList, verScale );
2415 pref->setItemProperty( "indexes", anIndicesList, verScale );
2416 // ... -> background
2417 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2418 LightApp_Preferences::Color, "Plot2d", "Background" );
2419 // ... -> font color
2420 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2421 // ... -> selection font color
2422 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2423 // ... -> selection color
2424 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2425 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2426 // ... -> errors/deviation colot
2427 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup,
2428 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2429 // ... -> deviation markers line size
2430 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup,
2431 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2432 pref->setItemProperty( "min", 1, deviationMarkerLw );
2433 pref->setItemProperty( "max", 5, deviationMarkerLw );
2434 // ... -> deviation markers tick mark size
2435 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup,
2436 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2437 pref->setItemProperty( "min", 1, deviationMarkerTs );
2438 pref->setItemProperty( "max", 5, deviationMarkerTs );
2439 // .. "Plot2d viewer" group <<end>>
2441 // .. "Directories" preferences tab <<start>>
2442 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2443 // ... --> quick directories list
2444 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2445 pref->addPreference( tr( "" ), dirGroup,
2446 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2447 // .. "Directories" preferences tab <<end>>
2449 // .. "Object browser" preferences tab <<start>>
2450 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2452 // ... "Search tool" group <<start>>
2453 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2454 // .... --> auto-hide
2455 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2456 "ObjectBrowser", "auto_hide_search_tool" );
2457 // ... "Search tool" group <<end>>
2459 // ... "Object browser settings" group <<start>>
2460 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2461 pref->setItemProperty( "columns", 2, objSetGroup );
2462 // .... -> auto size first column
2463 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2464 "ObjectBrowser", "auto_size_first" );
2465 // .... -> auto size other columns
2466 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2467 "ObjectBrowser", "auto_size" );
2468 // .... -> resize columns on expand item
2469 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2470 "ObjectBrowser", "resize_on_expand_item" );
2471 // .... -> browse to published object
2472 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2473 "ObjectBrowser", "browse_published_object" );
2474 aValuesList.clear();
2475 anIndicesList.clear();
2476 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2477 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2478 pref->setItemProperty( "strings", aValuesList, browsePublished );
2479 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2480 // ... "Object browser settings" group <<end>>
2481 // .. "Object browser" preferences tab <<end>>
2483 // .. "Shortcuts" preferences tab <<start>>
2484 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2485 // ... "Shortcuts settings" group <<start>>
2486 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2487 pref->addPreference( tr( "" ), shortcutGroup,
2488 LightApp_Preferences::ShortcutTree, "shortcuts" );
2489 // ... "Shortcuts settings" group <<end>>
2490 // .. "Shortcuts" preferences tab <<end>>
2491 // . Top-level "SALOME" preferences group <<end>>
2497 Changes appearance of application according to changed preferences
2498 \param sec - section
2499 \param param - name of changed parameter
2501 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2503 SUIT_ResourceMgr* resMgr = resourceMgr();
2507 if ( sec == "viewers" && param == "drop_down_buttons" )
2509 ViewManagerList vmlist = viewManagers();
2510 foreach( SUIT_ViewManager* vm, vmlist )
2512 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2513 foreach( SUIT_ViewWindow* vw, vwlist )
2514 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2518 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2520 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2521 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2522 QList<SUIT_ViewManager*> lst;
2523 #ifndef DISABLE_OCCVIEWER
2524 viewManagers( OCCViewer_Viewer::Type(), lst );
2525 QListIterator<SUIT_ViewManager*> itOCC( lst );
2526 while ( itOCC.hasNext() && sz >= 0 )
2528 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2529 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2532 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2533 occVM->setTrihedronSize( sz, relative );
2534 occVM->getAISContext()->UpdateCurrentViewer();
2537 #ifndef DISABLE_VTKVIEWER
2538 #ifndef DISABLE_SALOMEOBJECT
2539 viewManagers( SVTK_Viewer::Type(), lst );
2540 QListIterator<SUIT_ViewManager*> itVTK( lst );
2541 while ( itVTK.hasNext() && sz >= 0 )
2543 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2544 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2547 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2550 vtkVM->setTrihedronSize( sz, relative );
2558 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2560 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2561 QList<SUIT_ViewManager*> lst;
2562 #ifndef DISABLE_OCCVIEWER
2563 viewManagers( OCCViewer_Viewer::Type(), lst );
2564 QListIterator<SUIT_ViewManager*> itOCC( lst );
2565 while ( itOCC.hasNext() )
2567 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2568 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2571 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2574 occVM->setStaticTrihedronDisplayed( isVisible );
2578 #ifndef DISABLE_VTKVIEWER
2579 #ifndef DISABLE_SALOMEOBJECT
2580 viewManagers( SVTK_Viewer::Type(), lst );
2581 QListIterator<SUIT_ViewManager*> itVTK( lst );
2582 while ( itVTK.hasNext() )
2584 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2585 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2588 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2591 vtkVM->setStaticTrihedronVisible( isVisible );
2599 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2601 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2602 QList<SUIT_ViewManager*> lst;
2603 #ifndef DISABLE_OCCVIEWER
2604 viewManagers( OCCViewer_Viewer::Type(), lst );
2605 QListIterator<SUIT_ViewManager*> itOCC( lst );
2606 while ( itOCC.hasNext() )
2608 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2609 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2612 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2613 occVM->setInteractionStyle( mode );
2616 #ifndef DISABLE_VTKVIEWER
2617 #ifndef DISABLE_SALOMEOBJECT
2618 viewManagers( SVTK_Viewer::Type(), lst );
2619 QListIterator<SUIT_ViewManager*> itVTK( lst );
2620 while ( itVTK.hasNext() )
2622 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2623 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2626 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2627 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2633 #ifndef DISABLE_OCCVIEWER
2634 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2636 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2637 QList<SUIT_ViewManager*> lst;
2638 viewManagers( OCCViewer_Viewer::Type(), lst );
2639 QListIterator<SUIT_ViewManager*> it( lst );
2640 while ( it.hasNext() )
2642 SUIT_ViewModel* vm = it.next()->getViewModel();
2643 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2646 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2647 occVM->enablePreselection( isToEnablePreselection );
2652 #ifndef DISABLE_OCCVIEWER
2653 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2655 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2656 QList<SUIT_ViewManager*> lst;
2657 viewManagers( OCCViewer_Viewer::Type(), lst );
2658 QListIterator<SUIT_ViewManager*> it( lst );
2659 while ( it.hasNext() )
2661 SUIT_ViewModel* vm = it.next()->getViewModel();
2662 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2665 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2666 occVM->enableSelection( isToEnableSelection );
2671 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2673 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2674 QList<SUIT_ViewManager*> lst;
2675 #ifndef DISABLE_OCCVIEWER
2676 viewManagers( OCCViewer_Viewer::Type(), lst );
2677 QListIterator<SUIT_ViewManager*> itOCC( lst );
2678 while ( itOCC.hasNext() )
2680 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2681 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2684 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2685 occVM->setZoomingStyle( mode );
2688 #ifndef DISABLE_VTKVIEWER
2689 #ifndef DISABLE_SALOMEOBJECT
2690 viewManagers( SVTK_Viewer::Type(), lst );
2691 QListIterator<SUIT_ViewManager*> itVTK( lst );
2692 while ( itVTK.hasNext() )
2694 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2695 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2698 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2699 if( vtkVM ) vtkVM->setZoomingStyle( mode );
2705 #ifndef DISABLE_VTKVIEWER
2706 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2708 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2709 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2710 QList<SUIT_ViewManager*> lst;
2711 #ifndef DISABLE_SALOMEOBJECT
2712 viewManagers( SVTK_Viewer::Type(), lst );
2713 QListIterator<SUIT_ViewManager*> it( lst );
2714 while ( it.hasNext() )
2716 SUIT_ViewModel* vm = it.next()->getViewModel();
2717 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2720 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2721 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
2727 #ifndef DISABLE_VTKVIEWER
2728 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
2730 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
2731 QList<SUIT_ViewManager*> lst;
2732 #ifndef DISABLE_SALOMEOBJECT
2733 viewManagers( SVTK_Viewer::Type(), lst );
2734 QListIterator<SUIT_ViewManager*> it( lst );
2735 while ( it.hasNext() )
2737 SUIT_ViewModel* vm = it.next()->getViewModel();
2738 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2741 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2742 if( vtkVM ) vtkVM->setProjectionMode( mode );
2748 #ifndef DISABLE_VTKVIEWER
2749 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
2751 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
2752 QList<SUIT_ViewManager*> lst;
2753 #ifndef DISABLE_SALOMEOBJECT
2754 viewManagers( SVTK_Viewer::Type(), lst );
2755 QListIterator<SUIT_ViewManager*> it( lst );
2756 while ( it.hasNext() )
2758 SUIT_ViewModel* vm = it.next()->getViewModel();
2759 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2762 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2763 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
2769 #ifndef DISABLE_VTKVIEWER
2770 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
2772 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
2773 QList<SUIT_ViewManager*> lst;
2774 #ifndef DISABLE_SALOMEOBJECT
2775 viewManagers( SVTK_Viewer::Type(), lst );
2776 QListIterator<SUIT_ViewManager*> it( lst );
2777 while ( it.hasNext() )
2779 SUIT_ViewModel* vm = it.next()->getViewModel();
2780 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2783 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2784 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
2790 #ifndef DISABLE_VTKVIEWER
2791 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
2792 param == QString( "spacemouse_func2_btn" ) ||
2793 param == QString( "spacemouse_func5_btn" ) ) )
2795 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
2796 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
2797 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
2798 QList<SUIT_ViewManager*> lst;
2799 #ifndef DISABLE_SALOMEOBJECT
2800 viewManagers( SVTK_Viewer::Type(), lst );
2801 QListIterator<SUIT_ViewManager*> it( lst );
2802 while ( it.hasNext() )
2804 SUIT_ViewModel* vm = it.next()->getViewModel();
2805 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2808 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2809 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
2814 if( sec=="ObjectBrowser" )
2816 SUIT_DataBrowser* ob = objectBrowser();
2820 if ( param=="auto_size_first" )
2822 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
2823 ob->setAutoSizeFirstColumn( autoSizeFirst );
2824 if ( autoSizeFirst )
2825 ob->adjustFirstColumnWidth();
2827 else if ( param=="auto_size" ) {
2828 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
2829 ob->setAutoSizeColumns(autoSize);
2831 ob->adjustColumnsWidth();
2833 else if ( param=="resize_on_expand_item" ) {
2834 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
2835 ob->setResizeOnExpandItem(resizeOnExpandItem);
2837 else if ( param == "auto_hide_search_tool" ) {
2838 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2844 if( param=="store_positions" )
2846 if( param=="auto_save_interval" ) {
2847 myAutoSaveTimer->stop();
2848 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
2849 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
2853 #ifndef DISABLE_PYCONSOLE
2854 if( sec=="PyConsole" && pythonConsole() )
2856 if ( param=="font" ) {
2857 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2859 else if ( param=="show_banner" ) {
2860 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2867 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2869 if ( param == "visible_count" )
2870 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
2871 else if ( param == "max_count" )
2872 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
2873 else if ( param == "insert_mode" )
2874 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
2875 else if ( param == "link_type" )
2876 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
2877 else if ( param == "show_clear" )
2878 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2879 else if ( param == "show_mru" )
2880 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
2883 if ( sec == "language" && param == "language" )
2885 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
2887 if ( sec == "desktop" && param == "opaque_resize" ) {
2888 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
2889 QMainWindow::DockOptions dopts = desktop()->dockOptions();
2890 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2891 else dopts &= ~QMainWindow::AnimatedDocks;
2892 desktop()->setDockOptions( dopts );
2893 desktop()->setOpaqueResize( opaqueResize );
2894 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2895 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2898 if ( sec == "ExternalBrowser" && param == "use_external_browser" ) {
2899 if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) )
2901 if(QtxWebBrowser::webBrowser())
2902 QtxWebBrowser::webBrowser()->close();
2906 #ifndef DISABLE_PLOT2DVIEWER
2907 if ( sec == "Plot2d" ) {
2908 if( param == "SelectionColor" ) {
2909 QColor c = resMgr->colorValue( sec, param );
2910 Plot2d_Object::setSelectionColor(c);
2912 else if (param == "SelectedLegendFontColor") {
2913 QColor c = resMgr->colorValue( sec, param );
2914 Plot2d_Object::setHighlightedLegendTextColor(c);
2923 void LightApp_Application::loadPreferences()
2925 CAM_Application::loadPreferences();
2927 SUIT_ResourceMgr* aResMgr = resourceMgr();
2932 static bool mru_load = true;
2935 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2937 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
2938 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
2939 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
2940 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
2941 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
2942 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2943 mru->loadLinks( aResMgr, "MRU" );
2949 QStringList mods = aResMgr->parameters( "windows_geometry" );
2950 for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it )
2953 if ( aResMgr->value( "windows_geometry", *it, arr ) )
2954 myWinGeom.insert( *it, arr );
2958 mods = aResMgr->parameters( "windows_visibility" );
2959 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
2962 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
2963 myWinVis.insert( *itr, arr );
2967 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
2968 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
2969 QMainWindow::DockOptions dopts = desktop()->dockOptions();
2970 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2971 else dopts &= ~QMainWindow::AnimatedDocks;
2972 desktop()->setDockOptions( dopts );
2973 desktop()->setOpaqueResize( opaqueResize );
2974 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2975 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2982 void LightApp_Application::savePreferences()
2984 CAM_Application::savePreferences();
2986 saveDockWindowsState();
2988 SUIT_ResourceMgr* aResMgr = resourceMgr();
2993 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2995 mru->saveLinks( aResMgr, "MRU" );
2997 for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it )
2998 aResMgr->setValue( "windows_geometry", it.key(), it.value() );
3000 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3001 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3004 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3010 Updates desktop title
3012 void LightApp_Application::updateDesktopTitle()
3014 QString aTitle = applicationName();
3015 QString aVer = applicationVersion();
3016 if ( !aVer.isEmpty() )
3017 aTitle += QString( " " ) + aVer;
3019 if ( activeStudy() ) {
3020 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3021 aTitle += QString( " - [%1]" ).arg( sName );
3024 desktop()->setWindowTitle( aTitle );
3028 \brief Get map of the operations which can be performed
3029 on the module activation.
3031 The method should return the map of the kind \c {<id>:<name>}
3032 where \c <id> is an integer identifier of the operation and
3033 \c <name> is a title for the button to be added to the
3034 dialog box. After user selects the required operation by the
3035 clicking the corresponding button in the dialog box, its identifier
3036 is passed to the moduleActionSelected() method to process
3039 \return map of the operations
3040 \sa moduleActionSelected()
3042 QMap<int, QString> LightApp_Application::activateModuleActions() const
3044 QMap<int, QString> opmap;
3045 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3046 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3051 \brief Called when the used selectes required operation chosen
3052 from "Activate module" dialog box.
3054 Performs the required operation according to the user choice.
3056 \param id operation identifier
3057 \sa activateModuleActions()
3059 void LightApp_Application::moduleActionSelected( const int id )
3074 Updates windows after close document
3076 void LightApp_Application::afterCloseDoc()
3080 CAM_Application::afterCloseDoc();
3084 Updates actions of active module
3086 void LightApp_Application::updateModuleActions()
3089 if ( activeModule() ) {
3090 modName = activeModule()->moduleName();
3091 if ( !isModuleAccessible( modName ) ) {
3092 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3093 foreach( SUIT_Application* app, apps ) {
3094 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3095 if ( lapp && lapp != this )
3096 lapp->removeModuleAction( modName );
3101 LightApp_ModuleAction* moduleAction =
3102 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3104 moduleAction->setActiveModule( modName );
3107 void LightApp_Application::removeModuleAction( const QString& modName )
3109 LightApp_ModuleAction* moduleAction =
3110 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3112 moduleAction->removeModule( modName );
3116 Gets current windows.
3117 \param winMap - output current windows map.
3119 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3122 if ( !activeStudy() )
3125 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3126 ((LightApp_Module*)activeModule())->windows( winMap );
3128 defaultWindows( winMap );
3132 Gets current view managers.
3133 \param lst - output current view managers list.
3135 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3138 if ( !activeStudy() )
3141 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3142 ((LightApp_Module*)activeModule())->viewManagers( lst );
3144 defaultViewManagers( lst );
3150 void LightApp_Application::updateWindows()
3152 QMap<int, int> winMap;
3153 currentWindows( winMap );
3155 if ( activeStudy() )
3157 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3159 if ( !dockWindow( it.key() ) )
3160 getWindow( it.key() );
3164 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3166 QWidget* wid = it.value();
3167 if ( activeStudy() )
3168 wid->setVisible( winMap.contains( it.key() ) );
3173 if ( activeStudy() )
3174 loadDockWindowsState();
3180 Updates view managers
3182 void LightApp_Application::updateViewManagers()
3185 currentViewManagers( lst );
3187 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3188 getViewManager( *it, true );
3192 Loads windows geometry
3194 void LightApp_Application::loadDockWindowsState()
3199 bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3204 if ( activeModule() )
3205 modName = activeModule()->name();
3207 if ( myWinGeom.contains( modName ) )
3208 desktop()->restoreState( myWinGeom[modName] );
3210 if ( !myWinVis.contains( modName ) )
3213 QMap<QString, bool> tbMap, dwMap;
3214 dockWindowsState( myWinVis[modName], tbMap, dwMap );
3216 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3217 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3219 QToolBar* tb = *tit;
3221 QObject* po = Qtx::findParent( tb, "QMainWindow" );
3222 if ( po != desktop() )
3225 if ( tbMap.contains( tb->objectName() ) )
3226 tb->setVisible( tbMap[tb->objectName()] );
3229 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3230 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3232 QDockWidget* dw = *dit;
3234 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3235 if ( po != desktop() )
3238 if ( dwMap.contains( dw->objectName() ) )
3239 dw->setVisible( dwMap[dw->objectName()] );
3244 Saves windows geometry
3246 void LightApp_Application::saveDockWindowsState()
3251 bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3256 if ( activeModule() )
3257 modName = activeModule()->name();
3259 myWinGeom.insert( modName, desktop()->saveState() );
3262 if ( myWinVis.contains( modName ) )
3263 visArr = myWinVis[modName];
3265 QMap<QString, bool> tbMap, dwMap;
3266 dockWindowsState( visArr, tbMap, dwMap );
3268 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3269 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3272 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3275 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3276 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3278 QDockWidget* wid = *it;
3279 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3282 visArr = dockWindowsState( tbMap, dwMap );
3284 myWinVis.insert( modName, visArr );
3287 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3290 QDataStream stream( &visArr, QIODevice::WriteOnly );
3292 stream << (uchar)ToolBarMarker;
3293 stream << tb.size();
3294 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3296 stream << tit.key();
3297 stream << (uchar)( tit.value() ? 1 : 0 );
3300 stream << (uchar)DockWidgetMarker;
3301 stream << dw.size();
3302 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3304 stream << wit.key();
3305 stream << (uchar)( wit.value() ? 1 : 0 );
3311 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3316 QByteArray visArr = arr;
3317 QDataStream stream( &visArr, QIODevice::ReadOnly );
3321 if ( marker != ToolBarMarker )
3326 for ( int i = 0; i < lines; ++i )
3329 stream >> objectName;
3332 tb.insert( objectName, shown );
3336 if ( marker != DockWidgetMarker )
3340 for ( int j = 0; j < lines; ++j )
3343 stream >> objectName;
3346 dw.insert( objectName, shown );
3351 Adds icon names for modules
3353 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3357 SUIT_ResourceMgr* resMgr = resourceMgr();
3361 QStringList modList;
3362 modules( modList, false );
3364 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3366 QString modName = *it;
3367 QString modIntr = moduleName( modName );
3368 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3370 if ( modIcon.isEmpty() )
3373 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3374 modIcon += QString( ".png" );
3376 iconMap.insert( modName, modIcon );
3381 Inserts items in popup, which necessary for current application
3383 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3386 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3387 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3388 selMgr->setSelectionCacheEnabled( true );
3390 SUIT_DataBrowser* ob = objectBrowser();
3392 CAM_Application::contextMenuPopup( type, thePopup, title );
3394 if ( ob && type == ob->popupClientType() ) {
3395 thePopup->addSeparator();
3396 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3397 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3398 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3401 if ( selMgr && ob ) {
3402 SALOME_ListIO selected;
3403 selMgr->selectedObjects( selected );
3404 if(selected.Extent() == 1){
3405 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3406 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3407 if(obj && obj->renameAllowed()) {
3408 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3409 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3410 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3411 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3413 QList<QAction*> acts = thePopup->actions();
3414 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3415 thePopup->insertAction(firstAction,a);
3420 selMgr->setSelectionCacheEnabled( cacheIsOn );
3426 void LightApp_Application::createEmptyStudy()
3428 CAM_Application::createEmptyStudy();
3430 if ( objectBrowser() )
3431 objectBrowser()->updateTree();
3433 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3434 if ( aResMgr && activeStudy() ) {
3435 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3436 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3441 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3443 CAM_Application::setDesktop( desk );
3446 connect( desk, SIGNAL( message( const QString& ) ),
3447 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3453 \param mod - module to be activated
3455 bool LightApp_Application::activateModule( CAM_Module* mod )
3457 bool res = CAM_Application::activateModule( mod );
3459 if ( objectBrowser() )
3460 objectBrowser()->updateTree();
3466 \return keyborad accelerators manager object
3468 SUIT_Accel* LightApp_Application::accel() const
3474 Removes dead widget container from map
3476 void LightApp_Application::onWCDestroyed( QObject* ob )
3478 // remove destroyed widget container from windows map
3479 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3481 if ( itr.value() != ob )
3484 int key = itr.key();
3485 myWin.remove( key );
3490 void LightApp_Application::onMRUActivated( const QString& name )
3492 SUIT_Session* s = SUIT_Session::session();
3493 if ( s && s->activeApplication() == this )
3497 void LightApp_Application::onStylePreferences()
3499 Style_PrefDlg dlg( desktop() );
3502 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3505 void LightApp_Application::onFullScreen(){
3506 if(myScreenHelper) {
3507 if(desktop()->isFullScreen())
3508 myScreenHelper->switchToNormalScreen();
3510 myScreenHelper->switchToFullScreen();
3515 Connects just added view manager
3517 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3519 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3520 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3521 CAM_Application::addViewManager( vm );
3525 Remove view manager from memory
3527 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3529 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3530 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3531 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3533 aStudy->removeViewMgr(vm->getGlobalId());
3535 CAM_Application::removeViewManager( vm );
3537 LightApp_SelectionMgr* selMgr = selectionMgr();
3538 QList<SUIT_Selector*> selectors;
3539 selMgr->selectors( selectors );
3540 foreach( SUIT_Selector* selector, selectors ) {
3541 if ( selector->owner() == vm->getViewModel() ) {
3546 // IPAL22894: Crash on closing OCC view
3552 Renames active window of desktop
3554 void LightApp_Application::onRenameWindow()
3559 QWidget* w = desktop()->activeWindow();
3564 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3565 if( ok && !name.isEmpty() )
3566 w->setWindowTitle( name );
3570 Closes active window of desktop
3572 void LightApp_Application::onCloseWindow()
3577 QWidget* w = desktop()->activeWindow();
3585 Closes all windows of desktop
3587 void LightApp_Application::onCloseAllWindow()
3589 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3593 QList<SUIT_ViewWindow*> wndList = desk->windows();
3594 SUIT_ViewWindow* wnd;
3595 foreach( wnd, wndList )
3603 Groups all windows of desktop
3605 void LightApp_Application::onGroupAllWindow()
3607 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3611 QtxWorkstack* wgStack = desk->workstack();
3617 \return if the library of module exists
3618 \param moduleTitle - title of module
3620 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3622 if( moduleTitle.isEmpty() )
3625 QString lib = moduleLibrary( moduleTitle );
3627 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3628 bool isPythonModule = lib.contains("SalomePyQtGUI");
3629 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3633 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3635 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3638 bool isLibFound = false;
3639 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3640 for( ; anIt!=aLast; anIt++ )
3642 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
3653 INFOS( "****************************************************************" << std::endl
3654 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
3655 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
3656 << "****************************************************************" << std::endl );
3658 else if ( !isPythonModule && !isPythonLightModule)
3661 if ( isPythonModule || isPythonLightModule)
3663 QString pylib = moduleName( moduleTitle ) + QString(".py");
3664 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
3666 // Check the python library
3668 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3670 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
3672 bool isPyLib = false, isPyGuiLib = false;
3673 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3674 for( ; anIt!=aLast; anIt++ )
3676 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
3677 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
3679 if(!isPythonLightModule)
3680 if( !isPyLib && inf.exists() )
3683 if( !isPyGuiLib && infgui.exists() )
3686 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
3690 printf( "****************************************************************\n" );
3691 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
3693 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
3695 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
3696 printf( "****************************************************************\n" );
3703 \return default name for an active study
3705 void LightApp_Application::setDefaultStudyName( const QString& theName )
3707 QStringList anInfoList;
3708 modules( anInfoList, false );
3710 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
3711 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
3712 !aStudy->isSaved() )
3714 aStudy->setStudyName( theName );
3715 updateDesktopTitle();
3720 Custom event handler
3722 bool LightApp_Application::event( QEvent* e )
3724 if( e && e->type()==2000 )
3726 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
3727 QString* d = ( QString* )ce->data();
3728 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
3730 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
3731 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
3732 showPreferences( tr( "PREF_APP" ) );
3737 return CAM_Application::event( e );
3740 /*! Check data object */
3741 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
3745 bool isSuitable = !theObj->entry().isEmpty() &&
3746 !theObj->componentDataType().isEmpty() &&
3747 !theObj->name().isEmpty();
3754 int LightApp_Application::openChoice( const QString& aName )
3756 int choice = CAM_Application::openChoice( aName );
3758 if ( choice == OpenExist ) // The document is already open.
3760 // Do you want to reload it?
3761 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
3762 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
3763 choice = OpenReload;
3769 bool LightApp_Application::openAction( const int choice, const QString& aName )
3776 STD_Application* app = 0;
3777 SUIT_Session* session = SUIT_Session::session();
3778 QList<SUIT_Application*> appList = session->applications();
3779 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
3781 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
3782 app = ::qobject_cast<STD_Application*>( *it );
3787 app->onCloseDoc( false );
3788 appList = session->applications();
3789 STD_Application* other = 0;
3790 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
3791 other = ::qobject_cast<STD_Application*>( *it );
3794 res = other->onOpenDoc( aName );
3799 res = CAM_Application::openAction( choice, aName );
3806 QStringList LightApp_Application::viewManagersTypes() const
3808 QStringList aTypesList;
3809 aTypesList += myUserWmTypes;
3810 #ifndef DISABLE_GLVIEWER
3811 aTypesList<<GLViewer_Viewer::Type();
3813 #ifndef DISABLE_PLOT2DVIEWER
3814 aTypesList<<Plot2d_Viewer::Type();
3816 #ifndef DISABLE_QXGRAPHVIEWER
3817 aTypesList<<QxScene_Viewer::Type();
3819 #ifndef DISABLE_OCCVIEWER
3820 aTypesList<<OCCViewer_Viewer::Type();
3822 #ifndef DISABLE_VTKVIEWER
3823 #ifndef DISABLE_SALOMEOBJECT
3824 aTypesList<<SVTK_Viewer::Type();
3826 aTypesList<<VTKViewer_Viewer::Type();
3832 * Removes all view managers of known types
3833 * Other view managers are ignored
3835 void LightApp_Application::clearKnownViewManagers()
3837 QStringList aTypesList = viewManagersTypes();
3838 QList<SUIT_ViewManager*> aMgrList;
3839 viewManagers( aMgrList );
3840 foreach (SUIT_ViewManager* aMgr, aMgrList) {
3841 if (aTypesList.contains(aMgr->getType()))
3842 removeViewManager(aMgr);
3847 Copy of current selection
3849 void LightApp_Application::onCopy()
3851 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3857 Paste of current data in clipboard
3859 void LightApp_Application::onPaste()
3861 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3867 Browse (i.e. set focus on) the published objects
3868 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
3869 has been accepted by Ok (or Apply & Close) button
3870 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
3871 (to select the first published object only)
3872 \return entry of the selected object
3874 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
3875 const bool theIsApplyAndClose,
3876 const bool theIsOptimizedBrowsing )
3879 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
3881 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
3882 switch( aBrowsePolicy )
3886 case BP_ApplyAndClose:
3887 if( !theIsApplyAndClose )
3895 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
3899 SUIT_DataBrowser* anOB = objectBrowser();
3903 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
3907 QStringListIterator anIter( theEntryList );
3908 if( theIsOptimizedBrowsing )
3910 // go to the last entry
3912 if( anIter.hasPrevious() )
3916 // scroll to each entry in the list
3917 // (in optimized mode - to the last entry only)
3919 LightApp_DataObject* anObject = 0;
3920 while( anIter.hasNext() )
3922 anEntry = anIter.next();
3923 if( !anEntry.isEmpty() )
3925 anObject = aStudy->findObjectByEntry( anEntry );
3928 QModelIndex anIndex = aModel->index( anObject );
3929 anOB->treeView()->scrollTo( anIndex );
3934 // always select the last object
3935 if( anObject && !anEntry.isEmpty() )
3937 QList<SUIT_Selector*> aSelectorList;
3938 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
3939 if( !aSelectorList.isEmpty() )
3941 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
3943 bool anIsAutoBlock = aSelector->autoBlock();
3945 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
3946 aSelector->setAutoBlock( false );
3948 SUIT_DataOwnerPtrList aList;
3949 #ifndef DISABLE_SALOMEOBJECT
3950 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
3951 ( anObject->entry().toLatin1().constData(),
3952 anObject->componentDataType().toLatin1().constData(),
3953 anObject->name().toLatin1().constData() );
3954 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
3956 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
3959 aList.append( owner );
3960 selectionMgr()->setSelected( aList );
3963 // restore auto block flag
3964 aSelector->setAutoBlock( anIsAutoBlock );
3972 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
3974 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
3975 return study ? study->findObjectByEntry( id ) : 0;
3979 Checks that an object can be renamed.
3980 \param entry entry of the object
3981 \brief Return \c true if object can be renamed
3983 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
3988 Rename object by entry.
3989 \param entry entry of the object
3990 \param name new name of the object
3991 \brief Return \c true if rename operation finished successfully, \c false otherwise.
3993 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
3997 /*! Process standard messages from desktop */
3998 void LightApp_Application::onDesktopMessage( const QString& message )
4000 const QString sectionSeparator = "/";
4002 if ( message.toLower() == "updateobjectbrowser" ||
4003 message.toLower() == "updateobjbrowser" ) {
4004 // update object browser
4005 updateObjectBrowser();
4008 QStringList data = message.split( sectionSeparator );
4009 if ( data.count() > 1 ) {
4010 QString msgType = data[0].trimmed();
4011 LightApp_Module* sMod = 0;
4012 CAM_Module* mod = module( msgType );
4014 mod = module( moduleTitle( msgType ) );
4015 if ( mod && mod->inherits( "LightApp_Module" ) )
4016 sMod = (LightApp_Module*)mod;
4018 if ( msgType.toLower() == "preferences" ) {
4019 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4020 // for example "preferences/Study/multi_file_dump/true"
4021 if ( data.count() > 3 ) {
4022 QString section = data[1].trimmed();
4023 QString param = data[2].trimmed();
4024 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4025 resourceMgr()->setValue( section, param, value );
4029 // received message for the module
4030 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4031 sMod->message( msg );