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 QStringList addHelpItems = resMgr->parameters( "add_help" );
580 foreach ( QString addHelpItem, addHelpItems ) {
581 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
582 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
583 QAction* a = createAction( id, addHelpItem,
584 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
585 addHelpItem, addHelpItem,
586 0, desk, false, this, SLOT( onHelpContentsModule() ) );
587 a->setData( valueStr );
588 createMenu( a, helpMenu, -1, 5 );
592 createMenu( separator(), helpMenu, -1, 5 );
595 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
596 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
597 registerAction( MRUId, mru );
599 // default icon for neutral point ('SALOME' module)
600 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
601 if ( defIcon.isNull() )
602 defIcon = QPixmap( imageEmptyIcon );
604 //! default icon for any module
605 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
606 if ( modIcon.isNull() )
607 modIcon = QPixmap( imageEmptyIcon );
610 modules( modList, false );
612 if ( modList.count() > 1 )
614 LightApp_ModuleAction* moduleAction =
615 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
617 QMap<QString, QString> iconMap;
618 moduleIconNames( iconMap );
620 const int iconSize = 20;
622 QStringList::Iterator it;
623 for ( it = modList.begin(); it != modList.end(); ++it )
625 if ( !isLibExists( *it ) )
628 QString modName = moduleName( *it );
630 if ( !isModuleAccessible( *it ) )
634 if ( iconMap.contains( *it ) )
635 iconName = iconMap[*it];
637 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
641 INFOS ( "****************************************************************" << std::endl
642 << "* Icon for " << (*it).toLatin1().constData()
643 << " not found. Using the default one." << std::endl
644 << "****************************************************************" << std::endl );
647 icon = Qtx::scaleIcon( icon, iconSize );
649 moduleAction->insertModule( *it, icon );
652 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
653 this, SLOT( onModuleActivation( const QString& ) ) );
654 registerAction( ModulesListId, moduleAction );
658 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
659 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
661 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
662 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
663 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
664 0, desk, false, this, SLOT( onCloseAllWindow() ) );
665 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
666 0, desk, false, this, SLOT( onGroupAllWindow() ) );
668 createMenu( CloseId, windowMenu, 0, -1 );
669 createMenu( CloseAllId, windowMenu, 0, -1 );
670 createMenu( GroupAllId, windowMenu, 0, -1 );
671 createMenu( separator(), windowMenu, -1, 0 );
673 #ifndef DISABLE_GLVIEWER
674 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
676 #ifndef DISABLE_PLOT2DVIEWER
677 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
679 #ifndef DISABLE_OCCVIEWER
680 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
682 #ifndef DISABLE_VTKVIEWER
683 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
685 #ifndef DISABLE_QXGRAPHVIEWER
686 //VSR: QxGraph has been replaced by QxScene
687 // createActionForViewer( NewQxGraphViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_C );
688 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
691 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
692 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
693 createMenu( RenameId, windowMenu, -1 );
695 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
696 createMenu( PreferencesId, fileMenu, 50, -1 );
697 createMenu( separator(), fileMenu, -1, 50, -1 );
699 createMenu( separator(), fileMenu, -1, 100, -1 );
700 createMenu( MRUId, fileMenu, 100, -1 );
701 createMenu( separator(), fileMenu, -1, 100, -1 );
703 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
704 0, desk, false, this, SLOT( onStylePreferences() ) );
706 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
707 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
710 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
711 createMenu( separator(), viewMenu, -1, 20, -1 );
712 createMenu( StyleId, viewMenu, 20, -1 );
713 createMenu( FullScreenId, viewMenu, 20, -1 );
715 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ) );
716 createTool( ModulesListId, modTBar );
719 /*!On module activation action.*/
720 void LightApp_Application::onModuleActivation( const QString& modName )
722 // Force user to create/open a study before module activation
723 QMap<QString, QString> iconMap;
724 moduleIconNames( iconMap );
725 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
727 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
729 bool cancelled = false;
731 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
732 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
733 QMap<int, QString> opmap = activateModuleActions();
734 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
735 aDlg.addButton( it.value(), it.key() );
737 int res = aDlg.exec();
739 // some operation is selected
740 moduleActionSelected( res );
744 putInfo( tr("INF_CANCELLED") );
746 LightApp_ModuleAction* moduleAction =
747 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
749 moduleAction->setActiveModule( QString() );
755 activateModule( modName );
758 /*!Default module activation.*/
759 QString LightApp_Application::defaultModule() const
761 QStringList aModuleNames;
762 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
763 //! If there's the one and only module --> activate it automatically
764 //! TODO: Possible improvement - default module can be taken from preferences
765 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
768 /*!On new window slot.*/
769 void LightApp_Application::onNewWindow()
771 const QObject* obj = sender();
772 if ( !obj || !obj->inherits( "QAction" ) )
776 int id = actionId( (QAction*)obj );
779 #ifndef DISABLE_GLVIEWER
781 type = GLViewer_Viewer::Type();
784 #ifndef DISABLE_PLOT2DVIEWER
786 type = Plot2d_Viewer::Type();
789 #ifndef DISABLE_OCCVIEWER
791 type = OCCViewer_Viewer::Type();
794 #ifndef DISABLE_VTKVIEWER
796 type = VTKViewer_Viewer::Type();
799 #ifndef DISABLE_QXGRAPHVIEWER
800 //VSR: QxGraph has been replaced by QxScene
801 // case NewQxGraphViewId:
802 // type = QxGraph_Viewer::Type();
804 case NewQxSceneViewId:
805 type = QxScene_Viewer::Type();
810 if ( !type.isEmpty() )
811 createViewManager( type );
815 SLOT: Creates new document
817 void LightApp_Application::onNewDoc()
819 //asl: fix for 0020515
821 saveDockWindowsState();
823 CAM_Application::onNewDoc();
827 SLOT: Opens new document
829 void LightApp_Application::onOpenDoc()
831 SUIT_Study* study = activeStudy();
832 saveDockWindowsState();
834 CAM_Application::onOpenDoc();
836 if ( !study ) // new study will be create in THIS application
839 updateViewManagers();
844 SLOT: Opens new document.
845 \param aName - name of file
847 bool LightApp_Application::onOpenDoc( const QString& aName )
849 // We should take mru action first because this application instance can be deleted later.
850 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
852 bool res = CAM_Application::onOpenDoc( aName );
857 mru->insert( aName );
859 mru->remove( aName );
865 SLOT: Displays "About" message box
867 void LightApp_Application::onHelpAbout()
869 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
874 Private SLOT: Called on selection is changed
875 Dispatchs active module that selection is changed
877 void LightApp_Application::onSelection()
879 onSelectionChanged();
881 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
882 ((LightApp_Module*)activeModule())->selectionChanged();
887 \param study - SUIT_Study.
889 void LightApp_Application::setActiveStudy( SUIT_Study* study )
891 CAM_Application::setActiveStudy( study );
895 Enables/Disables menu items and toolbar buttons. Rebuild menu
897 void LightApp_Application::updateCommandsStatus()
899 CAM_Application::updateCommandsStatus();
902 #ifndef DISABLE_GLVIEWER
903 a = action( NewGLViewId );
905 a->setEnabled( activeStudy() );
908 #ifndef DISABLE_PLOT2DVIEWER
909 a = action( NewPlot2dId );
911 a->setEnabled( activeStudy() );
914 #ifndef DISABLE_OCCVIEWER
915 a = action( NewOCCViewId );
917 a->setEnabled( activeStudy() );
920 #ifndef DISABLE_VTKVIEWER
921 a = action( NewVTKViewId );
923 a->setEnabled( activeStudy() );
926 #ifndef DISABLE_QXGRAPHVIEWER
927 //VSR: QxGraph has been replaced by QxScene
928 // a = action( NewQxGraphViewId );
929 a = action( NewQxSceneViewId );
931 a->setEnabled( activeStudy() );
937 Runs system command in separate thread
939 class RunBrowser: public QThread
942 RunBrowser( LightApp_Application* app,
943 const QString& theApp,
944 const QString& theParams,
945 const QString& theHelpFile,
946 const QString& theContext = QString() )
948 myParams( theParams ),
949 myContext( theContext ),
953 //For the external browser always specify 'file://' protocol,
954 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
955 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
960 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
961 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
963 QProcess* proc = new QProcess();
965 proc->start( aCommand );
966 if ( !proc->waitForStarted() ) {
967 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
968 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
969 ce2000->setData( msg );
970 QApplication::postEvent( myLApp, ce2000 );
981 LightApp_Application* myLApp;
985 SLOT: Displays help contents for choosen module
987 void LightApp_Application::onHelpContentsModule()
989 const QAction* a = (QAction*) sender();
990 QString helpFile = a->data().toString();
991 if ( helpFile.isEmpty() ) return;
993 SUIT_ResourceMgr* resMgr = resourceMgr();
996 platform = "winapplication";
998 platform = "application";
1000 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1002 QString quote("\"");
1003 anApp.prepend( quote );
1004 anApp.append( quote );
1006 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1007 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1009 if( useExtBrowser ) {
1010 if ( !anApp.isEmpty() ) {
1011 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1015 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1016 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1017 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1019 showPreferences( tr( "PREF_APP" ) );
1024 // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol
1025 // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
1026 QtxWebBrowser::loadUrl(helpFile);
1028 QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile));
1034 SLOT: Displays help contents for choosen dialog
1036 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1037 const QString& theFileName,
1038 const QString& theContext )
1040 QString fileName = theFileName;
1041 QString context = theContext;
1042 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1043 // context might be passed within theFileName argument
1044 QStringList comps = fileName.split("#");
1045 if ( comps.count() > 1 ) {
1046 context = comps.last();
1048 fileName = comps.join("#");
1052 QString homeDir = "";
1053 if ( !theComponentName.isEmpty() ) {
1054 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1055 if ( !dir.isEmpty() )
1056 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1057 Qtx::addSlash( "share" ) +
1058 Qtx::addSlash( "doc" ) +
1059 Qtx::addSlash( "salome" ) +
1060 Qtx::addSlash( "gui" ) +
1061 Qtx::addSlash( theComponentName ) );
1064 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1065 SUIT_ResourceMgr* resMgr = resourceMgr();
1068 platform = "winapplication";
1070 platform = "application";
1072 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1074 QString quote("\"");
1075 anApp.prepend( quote );
1076 anApp.append( quote );
1079 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1082 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1084 if ( !anApp.isEmpty() ) {
1085 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1089 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1090 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1091 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1092 showPreferences( tr( "PREF_APP" ) );
1097 // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol
1098 // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol.
1099 QtxWebBrowser::loadUrl(helpFile, context);
1101 QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile),context);
1108 Sets enable or disable some actions on selection changed.
1110 void LightApp_Application::onSelectionChanged()
1112 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1113 bool canCopy = m ? m->canCopy() : false;
1114 bool canPaste = m ? m->canPaste() : false;
1116 action( EditCopyId )->setEnabled(canCopy);
1117 action( EditPasteId )->setEnabled(canPaste);
1121 Adds window to application.
1122 \param wid - QWidget
1123 \param flag - key for window
1124 \param studyId - study id
1125 Flag used how identificator of window in windows list.
1128 void LightApp_Application::addWindow( QWidget* wid, const int flag, const int studyId )
1136 if ( !activeStudy() )
1139 sId = activeStudy()->id();
1142 if ( !myWindows.contains( flag ) )
1144 QMap<int, int> winMap;
1145 currentWindows( winMap );
1147 LightApp_WidgetContainer* newWC = new LightApp_WidgetContainer( flag, desktop() );
1148 connect( newWC, SIGNAL( destroyed ( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1149 // asv: connecting a slot for storing visibility flag of a window
1150 connect( newWC, SIGNAL( visibilityChanged ( bool ) ), SLOT( onVisibilityChanged( bool ) ) );
1151 myWindows.insert( flag, newWC );
1152 if ( winMap.contains( flag ) ) {
1153 //desktop()->removeDockWidget( myWindows[flag] );
1154 desktop()->addDockWidget( (Qt::DockWidgetArea)winMap[flag], myWindows[flag] );
1157 //myWindows[flag]->setResizeEnabled( true );
1158 myWindows[flag]->setFeatures( QDockWidget::AllDockWidgetFeatures );
1159 myWindows[flag]->setObjectName( QString( "dock_window_%1" ).arg( flag ) );
1160 //myWindows[flag]->setFixedExtentWidth( wid->width() );
1161 //myWindows[flag]->setFixedExtentHeight( wid->height() );
1162 myWindows[flag]->resize( wid->width(), wid->height() );
1166 #ifndef DISABLE_PYCONSOLE
1167 if( wid->inherits( "PyConsole_Console" ) )
1169 if( resourceMgr()->hasValue( "PyConsole", "font" ) )
1170 f = resourceMgr()->fontValue( "PyConsole", "font" );
1173 f = ( ( PyConsole_Console* )wid )->font();
1174 resourceMgr()->setValue( "PyConsole", "font", f );
1181 myWindows[flag]->insert( sId, wid );
1184 setWindowShown( flag, !myWindows[flag]->isEmpty() );
1188 QWidget* LightApp_Application::dockWindow( const int id ) const
1191 if ( myWin.contains( id ) )
1196 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1201 QDockWidget* dock = 0;
1202 QWidget* w = wid->parentWidget();
1203 while ( w && !dock )
1205 dock = ::qobject_cast<QDockWidget*>( w );
1206 w = w->parentWidget();
1211 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1216 if ( wid != dockWindow( id ) )
1217 removeDockWindow( id );
1219 myWin.insert( id, wid );
1221 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1222 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1224 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1225 dock->setObjectName( QString( "window_%1" ).arg( id ) );
1226 dock->setWidget( wid );
1228 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1229 if ( !accel.isEmpty() )
1230 dock->toggleViewAction()->setShortcut( accel );
1235 void LightApp_Application::removeDockWindow( const int id )
1237 QWidget* wid = dockWindow( id );
1243 QDockWidget* dock = windowDock( wid );
1247 dock->setWidget( 0 );
1248 wid->setParent( 0 );
1249 wid->setVisible( false );
1253 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1255 QDockWidget* dock = windowDock( dockWindow( id ) );
1256 if ( dock && desktop() ) {
1257 desktop()->addDockWidget( place, dock );
1258 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1259 if ( a ) a->update();
1265 \param flag - key for window
1266 \param studyId - study id
1267 Flag used how identificator of window in windows list.
1269 QWidget* LightApp_Application::getWindow( const int flag, const int )
1271 QWidget* wid = dockWindow( flag );
1273 insertDockWindow( flag, wid = createWindow( flag ) );
1275 QMap<int, int> winMap;
1276 currentWindows( winMap );
1277 if ( winMap.contains( flag ) )
1278 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1284 \return Object Browser
1286 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1288 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1294 LogWindow* LightApp_Application::logWindow()
1296 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1299 #ifndef DISABLE_PYCONSOLE
1301 This returns the python console integrated to the GUI. Depending
1302 when you request the python console, this function could return
1303 null. Then the optional parameter force (default to false) can be
1304 set to force the creation of the python console if it is not done
1306 \param force - if true, the pythonConsole is created if it does not exist yet
1307 \return Python Console
1309 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1311 QWidget* wid = dockWindow( WT_PyConsole );
1312 if ( !wid && force==true) {
1313 wid = getWindow(WT_PyConsole);
1315 return qobject_cast<PyConsole_Console*>( wid );
1320 Updates object browser and maybe data models
1321 \param updateModels - if it is true, then data models are updated
1323 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1325 // update existing data models
1328 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1329 if ( objectBrowser() )
1330 objectBrowser()->setAutoUpdate( false );
1332 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1334 CAM_Study::ModelList dm_list;
1335 study->dataModels( dm_list );
1336 QListIterator<CAM_DataModel*> it( dm_list );
1337 while ( it.hasNext() ) {
1338 CAM_DataModel* camDM = it.next();
1339 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1340 ((LightApp_DataModel*)camDM)->update();
1344 if( objectBrowser() )
1345 objectBrowser()->setAutoUpdate( isAutoUpdate );
1348 if ( objectBrowser() ) {
1349 objectBrowser()->updateGeometry();
1350 objectBrowser()->updateTree( 0, false );
1357 LightApp_Preferences* LightApp_Application::preferences() const
1359 return preferences( false );
1363 \return first view manager of some type
1364 \param vmType - type of view manager
1365 \param create - is it necessary to create view manager in case, when there is no manager of such type
1367 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1369 SUIT_ViewManager* aVM = viewManager( vmType );
1370 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1372 if ( anActiveVM && anActiveVM->getType() == vmType )
1375 if ( aVM && create )
1377 if ( !aVM->getActiveView() )
1380 aVM->getActiveView()->setFocus();
1383 aVM = createViewManager( vmType );
1389 Creates view manager of some type
1390 \param vmType - type of view manager
1392 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1394 SUIT_ResourceMgr* resMgr = resourceMgr();
1396 SUIT_ViewManager* viewMgr = 0;
1397 #ifndef DISABLE_GLVIEWER
1398 if( vmType == GLViewer_Viewer::Type() )
1400 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1401 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1404 #ifndef DISABLE_PLOT2DVIEWER
1405 if( vmType == Plot2d_Viewer::Type() )
1407 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1409 #ifndef DISABLE_SALOMEOBJECT
1410 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1412 new LightApp_Plot2dSelector( v, mySelMgr );
1414 vm = new Plot2d_Viewer();
1416 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1417 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1420 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1421 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1425 //#ifndef DISABLE_SUPERVGRAPHVIEWER
1426 // if( vmType == SUPERVGraph_Viewer::Type() )
1428 // viewMgr = new SUPERVGraph_ViewManager( activeStudy(), desktop(), new SUPERVGraph_Viewer() );
1431 #ifndef DISABLE_QXGRAPHVIEWER
1432 //VSR: QxGraph has been replaced by QxScene
1433 // if( vmType == QxGraph_Viewer::Type() )
1435 // viewMgr = new QxGraph_ViewManager( activeStudy(), desktop(), new QxGraph_Viewer() );
1437 if( vmType == QxScene_Viewer::Type() )
1439 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1440 QxScene_Viewer* vm = new QxScene_Viewer();
1441 viewMgr->setViewModel( vm );
1442 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1445 #ifndef DISABLE_OCCVIEWER
1446 if( vmType == OCCViewer_Viewer::Type() )
1448 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1449 OCCViewer_Viewer* vm;
1450 #ifndef DISABLE_SALOMEOBJECT
1451 vm = new SOCC_Viewer();
1453 vm = new OCCViewer_Viewer( true );
1455 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1456 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1457 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1458 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1459 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1460 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1461 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1462 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1464 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1465 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1466 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1467 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1468 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1469 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1471 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1472 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1475 #ifndef DISABLE_VTKVIEWER
1476 #ifndef DISABLE_SALOMEOBJECT
1477 if ( vmType == SVTK_Viewer::Type() )
1479 if ( vmType == VTKViewer_Viewer::Type() )
1482 #ifndef DISABLE_SALOMEOBJECT
1483 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1484 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1487 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1488 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1489 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1490 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1491 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1492 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1493 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1494 vm->setDynamicPreSelection( resMgr->booleanValue( "VTKViewer", "dynamic_preselection", vm->dynamicPreSelection() ) );
1495 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1496 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1497 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1498 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1499 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1500 new LightApp_VTKSelector( vm, mySelMgr );
1503 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1504 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1506 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1514 addViewManager( viewMgr );
1515 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1517 if ( viewWin && desktop() ) {
1518 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1519 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1525 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1527 SUIT_ResourceMgr* resMgr = resourceMgr();
1529 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1531 new LightApp_WgViewModel( vmType, w ) );
1532 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1534 addViewManager( vm );
1535 SUIT_ViewWindow* vw = vm->createViewWindow();
1536 if ( vw && desktop() ) {
1537 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1538 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1541 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1542 myUserWmTypes << vmType;
1548 SLOT: Removes view manager from application
1550 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1552 removeViewManager( theVM );
1556 Protected SLOT: On study created.
1557 \param theStudy - just created study
1559 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1561 SUIT_DataObject* aRoot = 0;
1562 if ( theStudy && theStudy->root() )
1564 aRoot = theStudy->root();
1565 //aRoot->setName( tr( "DATA_MODELS" ) );
1568 getWindow( WT_ObjectBrowser );
1570 loadDockWindowsState();
1572 if ( objectBrowser() )
1573 objectBrowser()->setRoot( aRoot );
1575 activateModule( defaultModule() );
1577 if ( objectBrowser() )
1578 objectBrowser()->openLevels();
1582 Protected SLOT: On study opened.
1583 \param theStudy - just opened study
1585 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1587 SUIT_DataObject* aRoot = 0;
1588 if ( theStudy && theStudy->root() )
1590 aRoot = theStudy->root();
1594 getWindow( WT_ObjectBrowser );
1596 loadDockWindowsState();
1598 if ( objectBrowser() )
1599 objectBrowser()->setRoot( aRoot );
1601 activateModule( defaultModule() );
1603 if ( objectBrowser() )
1604 objectBrowser()->openLevels();
1609 /*!Protected SLOT. On study saved.*/
1610 void LightApp_Application::onStudySaved( SUIT_Study* s )
1612 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1614 mru->insert( s->studyName() );
1619 /*!Protected SLOT. On study closed.*/
1620 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1622 // stop auto-save timer
1623 myAutoSaveTimer->stop();
1625 // Bug 10396: clear selection
1626 mySelMgr->clearSelected();
1628 // Bug 12944: emit signal only after clear selection
1631 activateModule( "" );
1634 /*!Protected SLOT.On desktop activated.*/
1635 void LightApp_Application::onDesktopActivated()
1637 CAM_Application::onDesktopActivated();
1638 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1640 aModule->studyActivated();
1643 void LightApp_Application::studyOpened( SUIT_Study* s )
1645 CAM_Application::studyOpened( s );
1648 updateViewManagers();
1651 void LightApp_Application::studySaved( SUIT_Study* s )
1653 CAM_Application::studyOpened( s );
1654 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1655 if ( aResMgr && activeStudy() ) {
1656 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1657 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1661 void LightApp_Application::studyCreated( SUIT_Study* s )
1663 CAM_Application::studyCreated( s );
1666 updateViewManagers();
1669 /*!Gets file filter.
1670 *\retval QString "(*.bin)"
1672 QString LightApp_Application::getFileFilter() const
1680 Shows file dialog and return user selected file name
1682 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1683 const QString& caption, QWidget* parent )
1687 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1688 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1691 /*! Gets directory*/
1692 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1696 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1699 /*! Get open file names*/
1700 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1701 const QString& caption, QWidget* parent )
1705 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1706 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1709 /*!Private SLOT. Update object browser.*/
1710 void LightApp_Application::onRefresh()
1712 updateObjectBrowser( true );
1715 /*!Private SLOT. Support drag-and-drop operation.*/
1716 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1718 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1722 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1724 aModule->dropObjects( objects, parentObj, row, action );
1727 /*!Private SLOT. On preferences.*/
1728 void LightApp_Application::onPreferences()
1730 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1733 /*!Private SLOT. On preferences.*/
1734 void LightApp_Application::showPreferences( const QString& itemText )
1736 QApplication::setOverrideCursor( Qt::WaitCursor );
1738 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1740 QApplication::restoreOverrideCursor();
1745 preferences()->activateItem( itemText );
1747 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1750 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1751 resourceMgr()->save();
1754 shortcutMgr()->updateShortcuts();
1760 /*!Protected SLOT. On preferences changed.*/
1761 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1763 LightApp_Module* sMod = 0;
1764 CAM_Module* mod = module( modName );
1765 if ( mod && mod->inherits( "LightApp_Module" ) )
1766 sMod = (LightApp_Module*)mod;
1769 sMod->preferencesChanged( section, param );
1771 preferencesChanged( section, param );
1772 // emit signal to allow additional preferences changing processing
1773 emit preferenceChanged( modName, section, param );
1776 /*!Remove all windows from study.*/
1777 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1779 CAM_Application::beforeCloseDoc( s );
1782 /*!Update actions.*/
1783 void LightApp_Application::updateActions()
1785 updateCommandsStatus();
1791 SUIT_Study* LightApp_Application::createNewStudy()
1793 LightApp_Application::lastStudyId++;
1795 LightApp_Study* aStudy = new LightApp_Study( this );
1797 // Set up processing of major study-related events
1798 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1799 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1800 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1801 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1807 Creates window by flag.
1808 \param flag - identificator of window type
1810 QWidget* LightApp_Application::createWindow( const int flag )
1814 SUIT_ResourceMgr* resMgr = resourceMgr();
1816 if ( flag == WT_ObjectBrowser )
1818 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1819 ob->setSortMenuEnabled( true );
1820 ob->setAutoUpdate( true );
1821 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1822 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1824 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1825 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1826 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1828 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1829 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1830 treeModel->setSearcher( this );
1831 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1832 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1834 // Mantis issue 0020136: Drag&Drop in OB
1835 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1837 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1838 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1841 // temporary commented
1843 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1845 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1847 ob->setFilter( new LightApp_OBFilter( selectionMgr() ) );
1850 // Create OBSelector
1851 new LightApp_OBSelector( ob, mySelMgr );
1853 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1854 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1855 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1856 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1858 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1860 #ifndef DISABLE_PYCONSOLE
1861 else if ( flag == WT_PyConsole )
1863 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(),new LightApp_PyInterp());
1864 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1865 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1866 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1867 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
1870 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1873 else if ( flag == WT_LogWindow )
1875 LogWindow* logWin = new LogWindow( desktop() );
1876 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
1877 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
1879 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1885 \return default windows( Object Browser, Python Console )
1886 Adds to map \a aMap.
1888 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
1890 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1891 #ifndef DISABLE_PYCONSOLE
1892 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
1894 // aMap.insert( WT_LogWindow, Qt::DockBottom );
1897 /*!Default view managers*/
1898 void LightApp_Application::defaultViewManagers( QStringList& ) const
1904 \return preferences.
1905 Create preferences, if \a crt = true.
1907 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
1912 LightApp_Application* that = (LightApp_Application*)this;
1914 bool toCreate = !_prefs_ && crt;
1917 _prefs_ = new LightApp_Preferences( resourceMgr() );
1918 that->createPreferences( _prefs_ );
1921 that->myPrefs = _prefs_;
1923 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
1924 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ) );
1929 SUIT_ResourceMgr* resMgr = resourceMgr();
1931 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
1932 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
1934 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
1938 QStringList modNameList;
1939 app->modules( modNameList, false );
1941 QMap<QString, QString> iconMap;
1942 app->moduleIconNames( iconMap );
1944 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
1946 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
1949 int modId = _prefs_->addPreference( *it );
1950 if ( iconMap.contains( *it ) )
1951 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
1955 app->modules( modList );
1956 QListIterator<CAM_Module*> itr( modList );
1957 while ( itr.hasNext() )
1959 LightApp_Module* mod = 0;
1961 CAM_Module* anItem = itr.next();
1962 if ( anItem->inherits( "LightApp_Module" ) )
1963 mod = (LightApp_Module*)anItem;
1965 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
1967 _prefs_->addPreference( mod->moduleName() );
1968 mod->createPreferences();
1969 that->emptyPreferences( mod->moduleName() );
1973 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
1979 Adds new module to application
1981 void LightApp_Application::moduleAdded( CAM_Module* mod )
1983 CAM_Application::moduleAdded( mod );
1985 LightApp_Module* lightMod = 0;
1986 if ( mod && mod->inherits( "LightApp_Module" ) )
1987 lightMod = (LightApp_Module*)mod;
1989 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
1991 myPrefs->addPreference( mod->moduleName() );
1992 lightMod->createPreferences();
1993 emptyPreferences( mod->moduleName() );
1997 void LightApp_Application::emptyPreferences( const QString& modName )
1999 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2000 if ( !item || !item->isEmpty() )
2003 // printf( "---------------------> Modify for empty module.\n" );
2005 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2006 frm->setIcon( item->icon() );
2007 frm->setStretch( false );
2008 item->parentItem()->insertItem( frm, item );
2009 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2016 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2021 QStringList aValuesList;
2022 QList<QVariant> anIndicesList;
2026 // . Top-level "SALOME" preferences group <<start>>
2027 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2028 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2030 // .. "General" preferences tab <<start>>
2031 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2033 // ... "Language" group <<start>>
2034 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2035 pref->setItemProperty( "columns", 2, langGroup );
2036 // .... -> application language
2037 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2038 LightApp_Preferences::Selector, "language", "language" );
2039 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2040 QList<QVariant> aIcons;
2041 foreach ( QString aLang, aLangs ) {
2042 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2044 pref->setItemProperty( "strings", aLangs, curLang );
2045 pref->setItemProperty( "icons", aIcons, curLang );
2046 // ... "Language" group <<end>>
2048 // ... "Look and feel" group <<start>>
2049 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2050 pref->setItemProperty( "columns", 2, lookGroup );
2051 // .... -> show splash-screen
2052 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2053 // .... -> opaque resize
2054 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2055 // .... -> drop-down buttons
2056 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2057 // ... "Look and feel" group <<end>>
2059 // ... "Study properties" group <<start>>
2060 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2061 pref->setItemProperty( "columns", 2, studyGroup );
2062 // .... -> multi-file save
2063 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2064 // .... -> ascii save mode
2065 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2066 // .... -> store windows geometry
2067 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2068 // .... -> auto-save
2069 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2070 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2071 pref->setItemProperty( "min", 0, autoSaveInterval );
2072 pref->setItemProperty( "max", 1440, autoSaveInterval );
2073 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2074 // ... "Study properties" group <<end>>
2076 // ... "Help browser" group <<start>>
2077 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2079 QString platform = "winapplication";
2081 QString platform = "application";
2083 // .... -> browser application
2084 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2085 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2086 // .... -> browser parameters
2087 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2088 // ... "Help browser" group <<end>>
2090 // ... "Python console properties" group <<start>>
2091 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2093 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2094 // .... -> show banner
2095 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2096 // ... "Python console properties" group <<end>>
2098 // ... "MRU" preferences group <<start>>
2099 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2100 pref->setItemProperty( "columns", 4, mruGroup );
2101 // number of MRU items
2102 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2103 "MRU", "visible_count" );
2104 pref->setItemProperty( "min", 0, mruVisCount );
2105 pref->setItemProperty( "max", 100, mruVisCount );
2107 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2108 "MRU", "link_type" );
2109 aValuesList.clear();
2110 anIndicesList.clear();
2111 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2112 anIndicesList << 0 << 1 << 2 ;
2113 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2114 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2115 // ... "MRU" preferences group <<end>>
2116 // .. "General" preferences tab <<end>>
2118 // .. "3D viewer" group <<start>>
2119 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2120 // ... -> navigation mode
2121 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2122 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2123 aValuesList.clear();
2124 anIndicesList.clear();
2125 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2126 anIndicesList << 0 << 1;
2127 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2128 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2129 // ... -> zooming mode
2130 #if OCC_VERSION_LARGE > 0x0603000A // available only with OCC-6.3-sp11 and higher version
2131 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2132 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2133 aValuesList.clear();
2134 anIndicesList.clear();
2135 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2136 anIndicesList << 0 << 1;
2137 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2138 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2140 // ... "Trihedron" group <<start>>
2141 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2142 pref->setItemProperty( "columns", 2, occTriGroup );
2143 // .... -> trihedron size
2144 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2145 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2146 pref->setItemProperty( "min", 1.0E-06, occTS );
2147 pref->setItemProperty( "max", 1000, occTS );
2148 // .... -> relative size of trihedron
2149 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2150 // .... -> show static trihedron
2151 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2152 // ... "Trihedron" group <<end>>
2153 // .. "3D viewer" group <<end>>
2155 // .. "OCC viewer" group <<start>>
2156 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2158 // ... "Background" group <<start>>
2159 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2160 // pref->setItemProperty( "columns", 2, bgGroup );
2161 aValuesList.clear();
2162 anIndicesList.clear();
2164 QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2165 foreach( int gid, idList ) anIndicesList << gid;
2166 // .... -> 3D viewer background
2167 int bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2168 LightApp_Preferences::Background, "OCCViewer", "background" );
2169 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2170 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2171 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2172 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2173 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2174 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2175 pref->setItemProperty( "custom_enabled", false, bgId );
2176 pref->setItemProperty( "image_formats", formats, bgId );
2177 // .... -> XZ viewer background
2178 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2179 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2180 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2181 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2182 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2183 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2184 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2185 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2186 pref->setItemProperty( "custom_enabled", false, bgId );
2187 pref->setItemProperty( "image_formats", formats, bgId );
2188 // .... -> YZ viewer background
2189 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2190 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2191 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2192 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2193 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2194 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2195 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2196 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2197 pref->setItemProperty( "custom_enabled", false, bgId );
2198 pref->setItemProperty( "image_formats", formats, bgId );
2199 // .... -> XY viewer background
2200 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2201 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2202 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2203 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2204 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2205 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2206 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2207 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2208 pref->setItemProperty( "custom_enabled", false, bgId );
2209 pref->setItemProperty( "image_formats", formats, bgId );
2210 // ... "Background" group <<end>>
2213 // ... "Selection" group <<start>>
2214 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2215 pref->setItemProperty( "columns", 2, occSelectionGroup );
2216 // .... -> enable preselection
2217 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2218 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2219 // .... -> enable selection
2220 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2221 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2222 // ... "Selection" group <<end>>
2224 // ... -> empty frame (for layout) <<start>>
2225 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2226 pref->setItemProperty( "margin", 0, occGen );
2227 pref->setItemProperty( "columns", 2, occGen );
2228 // ... -> empty frame (for layout) <<end>>
2229 // .. "OCC viewer" group <<end>>
2231 // .. "VTK viewer" group <<start>>
2232 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2234 // ... -> empty frame (for layout) <<start>>
2235 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2236 //pref->setItemProperty( "columns", 2, vtkGen );
2237 // .... -> projection mode
2238 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2239 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2240 aValuesList.clear();
2241 anIndicesList.clear();
2242 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2243 anIndicesList << 0 << 1;
2244 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2245 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2246 // .... -> background
2247 aValuesList.clear();
2248 anIndicesList.clear();
2250 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2251 foreach( int gid, idList ) anIndicesList << gid;
2252 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2253 LightApp_Preferences::Background, "VTKViewer", "background" );
2254 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2255 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2256 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2257 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2258 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2259 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2260 pref->setItemProperty( "custom_enabled", false, bgId );
2261 pref->setItemProperty( "image_formats", formats, bgId );
2262 // .... -> speed increment
2263 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2264 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2265 pref->setItemProperty( "min", 1, vtkSpeed );
2266 pref->setItemProperty( "max", 1000, vtkSpeed );
2267 // .... -> speed mode
2268 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2269 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2270 aValuesList.clear();
2271 anIndicesList.clear();
2272 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2273 anIndicesList << 0 << 1;
2274 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2275 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2276 // .... -> dynamic pre-selection
2277 pref->addPreference( tr( "PREF_DYNAMIC_PRESELECTION" ), vtkGen, LightApp_Preferences::Bool, "VTKViewer", "dynamic_preselection" );
2278 // ... -> empty frame (for layout) <<end>>
2280 // ... space mouse sub-group <<start>>
2281 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2282 //pref->setItemProperty( "columns", 2, vtkSM );
2283 // .... -> decrease speed increment
2284 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2285 LightApp_Preferences::Selector, "VTKViewer",
2286 "spacemouse_func1_btn" );
2287 // .... -> increase speed increment
2288 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2289 LightApp_Preferences::Selector, "VTKViewer",
2290 "spacemouse_func2_btn" );
2291 // .... -> dominant / combined switch
2292 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2293 LightApp_Preferences::Selector, "VTKViewer",
2294 "spacemouse_func5_btn" ); //
2295 aValuesList.clear();
2296 anIndicesList.clear();
2297 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2298 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2299 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2300 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2301 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2302 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2303 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2304 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2305 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2306 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2307 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2308 // ... space mouse sub-group <<end>>
2310 // ... avi recording sub-group <<start>>
2311 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2312 pref->setItemProperty( "columns", 2, vtkRec );
2313 // .... -> recording mode
2314 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2315 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2316 aValuesList.clear();
2317 anIndicesList.clear();
2318 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2319 anIndicesList << 0 << 1;
2320 pref->setItemProperty( "strings", aValuesList, modePref );
2321 pref->setItemProperty( "indexes", anIndicesList, modePref );
2323 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2324 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2325 pref->setItemProperty( "min", 0.1, fpsPref );
2326 pref->setItemProperty( "max", 100, fpsPref );
2328 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2329 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2330 pref->setItemProperty( "min", 1, qualityPref );
2331 pref->setItemProperty( "max", 100, qualityPref );
2332 // .... -> progressive mode
2333 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2334 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2335 // ... avi recording sub-group <<end>>
2337 // ... group names sub-group <<start>>
2338 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2339 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2340 pref->setItemProperty( "columns", 2, vtkGN );
2341 // .... -> text color
2342 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2343 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2344 // .... -> transparency
2345 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2346 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2347 pref->setItemProperty( "min", 0.0, transPref );
2348 pref->setItemProperty( "max", 1.0, transPref );
2349 pref->setItemProperty( "step", 0.1, transPref );
2350 // ... -> group names sub-group <<end>>
2351 // .. "VTK viewer" group <<end>>
2353 // .. "Plot2d viewer" group <<start>>
2354 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2355 //pref->setItemProperty( "columns", 2, plot2dGroup );
2357 // ... -> show legend
2358 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dGroup,
2359 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2360 // ... -> legend position
2361 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dGroup,
2362 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2363 aValuesList.clear();
2364 anIndicesList.clear();
2365 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2366 anIndicesList << 0 << 1 << 2 << 3 ;
2367 pref->setItemProperty( "strings", aValuesList, legendPosition );
2368 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2369 // ... -> legend font
2370 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2371 // ... -> curve type
2372 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dGroup,
2373 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2374 aValuesList.clear();
2375 anIndicesList.clear();
2376 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2377 anIndicesList << 0 << 1 << 2 ;
2378 pref->setItemProperty( "strings", aValuesList, curveType );
2379 pref->setItemProperty( "indexes", anIndicesList, curveType );
2380 // ... -> marker size
2381 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dGroup,
2382 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2383 pref->setItemProperty( "min", 0, markerSize );
2384 pref->setItemProperty( "max", 100, markerSize );
2385 // ... -> horizontal scaling mode
2386 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dGroup,
2387 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2388 aValuesList.clear();
2389 anIndicesList.clear();
2390 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2391 anIndicesList << 0 << 1 ;
2392 pref->setItemProperty( "strings", aValuesList, horScale );
2393 pref->setItemProperty( "indexes", anIndicesList, horScale );
2394 // ... -> vertical scaling mode
2395 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dGroup,
2396 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2397 pref->setItemProperty( "strings", aValuesList, verScale );
2398 pref->setItemProperty( "indexes", anIndicesList, verScale );
2399 // ... -> background
2400 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2401 LightApp_Preferences::Color, "Plot2d", "Background" );
2402 // ... -> font color
2403 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2404 // ... -> selection font color
2405 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2406 // ... -> selection color
2407 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2408 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2409 // ... -> errors/deviation colot
2410 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dGroup,
2411 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2412 // ... -> deviation markers line size
2413 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dGroup,
2414 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2415 pref->setItemProperty( "min", 1, deviationMarkerLw );
2416 pref->setItemProperty( "max", 5, deviationMarkerLw );
2417 // ... -> deviation markers tick mark size
2418 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dGroup,
2419 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2420 pref->setItemProperty( "min", 1, deviationMarkerTs );
2421 pref->setItemProperty( "max", 5, deviationMarkerTs );
2422 // .. "Plot2d viewer" group <<end>>
2424 // .. "Directories" preferences tab <<start>>
2425 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2426 // ... --> quick directories list
2427 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2428 pref->addPreference( tr( "" ), dirGroup,
2429 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2430 // .. "Directories" preferences tab <<end>>
2432 // .. "Object browser" preferences tab <<start>>
2433 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2435 // ... "Search tool" group <<start>>
2436 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2437 // .... --> auto-hide
2438 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2439 "ObjectBrowser", "auto_hide_search_tool" );
2440 // ... "Search tool" group <<end>>
2442 // ... "Object browser settings" group <<start>>
2443 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2444 pref->setItemProperty( "columns", 2, objSetGroup );
2445 // .... -> auto size first column
2446 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2447 "ObjectBrowser", "auto_size_first" );
2448 // .... -> auto size other columns
2449 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2450 "ObjectBrowser", "auto_size" );
2451 // .... -> resize columns on expand item
2452 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2453 "ObjectBrowser", "resize_on_expand_item" );
2454 // .... -> browse to published object
2455 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2456 "ObjectBrowser", "browse_published_object" );
2457 aValuesList.clear();
2458 anIndicesList.clear();
2459 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2460 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2461 pref->setItemProperty( "strings", aValuesList, browsePublished );
2462 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2463 // ... "Object browser settings" group <<end>>
2464 // .. "Object browser" preferences tab <<end>>
2466 // .. "Shortcuts" preferences tab <<start>>
2467 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2468 // ... "Shortcuts settings" group <<start>>
2469 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2470 pref->addPreference( tr( "" ), shortcutGroup,
2471 LightApp_Preferences::ShortcutTree, "shortcuts" );
2472 // ... "Shortcuts settings" group <<end>>
2473 // .. "Shortcuts" preferences tab <<end>>
2474 // . Top-level "SALOME" preferences group <<end>>
2480 Changes appearance of application according to changed preferences
2481 \param sec - section
2482 \param param - name of changed parameter
2484 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2486 SUIT_ResourceMgr* resMgr = resourceMgr();
2490 if ( sec == "viewers" && param == "drop_down_buttons" )
2492 ViewManagerList vmlist = viewManagers();
2493 foreach( SUIT_ViewManager* vm, vmlist )
2495 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2496 foreach( SUIT_ViewWindow* vw, vwlist )
2497 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2501 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2503 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2504 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2505 QList<SUIT_ViewManager*> lst;
2506 #ifndef DISABLE_OCCVIEWER
2507 viewManagers( OCCViewer_Viewer::Type(), lst );
2508 QListIterator<SUIT_ViewManager*> itOCC( lst );
2509 while ( itOCC.hasNext() && sz >= 0 )
2511 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2512 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2515 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2516 occVM->setTrihedronSize( sz, relative );
2517 occVM->getAISContext()->UpdateCurrentViewer();
2520 #ifndef DISABLE_VTKVIEWER
2521 #ifndef DISABLE_SALOMEOBJECT
2522 viewManagers( SVTK_Viewer::Type(), lst );
2523 QListIterator<SUIT_ViewManager*> itVTK( lst );
2524 while ( itVTK.hasNext() && sz >= 0 )
2526 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2527 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2530 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2533 vtkVM->setTrihedronSize( sz, relative );
2541 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2543 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2544 QList<SUIT_ViewManager*> lst;
2545 #ifndef DISABLE_OCCVIEWER
2546 viewManagers( OCCViewer_Viewer::Type(), lst );
2547 QListIterator<SUIT_ViewManager*> itOCC( lst );
2548 while ( itOCC.hasNext() )
2550 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2551 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2554 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2557 occVM->setStaticTrihedronDisplayed( isVisible );
2561 #ifndef DISABLE_VTKVIEWER
2562 #ifndef DISABLE_SALOMEOBJECT
2563 viewManagers( SVTK_Viewer::Type(), lst );
2564 QListIterator<SUIT_ViewManager*> itVTK( lst );
2565 while ( itVTK.hasNext() )
2567 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2568 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2571 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2574 vtkVM->setStaticTrihedronVisible( isVisible );
2582 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2584 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2585 QList<SUIT_ViewManager*> lst;
2586 #ifndef DISABLE_OCCVIEWER
2587 viewManagers( OCCViewer_Viewer::Type(), lst );
2588 QListIterator<SUIT_ViewManager*> itOCC( lst );
2589 while ( itOCC.hasNext() )
2591 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2592 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2595 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2596 occVM->setInteractionStyle( mode );
2599 #ifndef DISABLE_VTKVIEWER
2600 #ifndef DISABLE_SALOMEOBJECT
2601 viewManagers( SVTK_Viewer::Type(), lst );
2602 QListIterator<SUIT_ViewManager*> itVTK( lst );
2603 while ( itVTK.hasNext() )
2605 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2606 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2609 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2610 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2616 #ifndef DISABLE_OCCVIEWER
2617 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2619 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2620 QList<SUIT_ViewManager*> lst;
2621 viewManagers( OCCViewer_Viewer::Type(), lst );
2622 QListIterator<SUIT_ViewManager*> it( lst );
2623 while ( it.hasNext() )
2625 SUIT_ViewModel* vm = it.next()->getViewModel();
2626 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2629 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2630 occVM->enablePreselection( isToEnablePreselection );
2635 #ifndef DISABLE_OCCVIEWER
2636 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2638 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2639 QList<SUIT_ViewManager*> lst;
2640 viewManagers( OCCViewer_Viewer::Type(), lst );
2641 QListIterator<SUIT_ViewManager*> it( lst );
2642 while ( it.hasNext() )
2644 SUIT_ViewModel* vm = it.next()->getViewModel();
2645 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2648 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2649 occVM->enableSelection( isToEnableSelection );
2654 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2656 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2657 QList<SUIT_ViewManager*> lst;
2658 #ifndef DISABLE_OCCVIEWER
2659 viewManagers( OCCViewer_Viewer::Type(), lst );
2660 QListIterator<SUIT_ViewManager*> itOCC( lst );
2661 while ( itOCC.hasNext() )
2663 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2664 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2667 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2668 occVM->setZoomingStyle( mode );
2671 #ifndef DISABLE_VTKVIEWER
2672 #ifndef DISABLE_SALOMEOBJECT
2673 viewManagers( SVTK_Viewer::Type(), lst );
2674 QListIterator<SUIT_ViewManager*> itVTK( lst );
2675 while ( itVTK.hasNext() )
2677 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2678 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2681 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2682 if( vtkVM ) vtkVM->setZoomingStyle( mode );
2688 #ifndef DISABLE_VTKVIEWER
2689 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2691 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2692 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2693 QList<SUIT_ViewManager*> lst;
2694 #ifndef DISABLE_SALOMEOBJECT
2695 viewManagers( SVTK_Viewer::Type(), lst );
2696 QListIterator<SUIT_ViewManager*> it( lst );
2697 while ( it.hasNext() )
2699 SUIT_ViewModel* vm = it.next()->getViewModel();
2700 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2703 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2704 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
2710 #ifndef DISABLE_VTKVIEWER
2711 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
2713 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
2714 QList<SUIT_ViewManager*> lst;
2715 #ifndef DISABLE_SALOMEOBJECT
2716 viewManagers( SVTK_Viewer::Type(), lst );
2717 QListIterator<SUIT_ViewManager*> it( lst );
2718 while ( it.hasNext() )
2720 SUIT_ViewModel* vm = it.next()->getViewModel();
2721 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2724 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2725 if( vtkVM ) vtkVM->setProjectionMode( mode );
2731 #ifndef DISABLE_VTKVIEWER
2732 if ( sec == QString( "VTKViewer" ) && param == QString( "dynamic_preselection" ) )
2734 bool mode = resMgr->booleanValue( "VTKViewer", "dynamic_preselection", true );
2735 QList<SUIT_ViewManager*> lst;
2736 #ifndef DISABLE_SALOMEOBJECT
2737 viewManagers( SVTK_Viewer::Type(), lst );
2738 QListIterator<SUIT_ViewManager*> it( lst );
2739 while ( it.hasNext() )
2741 SUIT_ViewModel* vm = it.next()->getViewModel();
2742 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2745 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2746 if( vtkVM ) vtkVM->setDynamicPreSelection( mode );
2752 #ifndef DISABLE_VTKVIEWER
2753 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
2754 param == QString( "spacemouse_func2_btn" ) ||
2755 param == QString( "spacemouse_func5_btn" ) ) )
2757 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
2758 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
2759 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
2760 QList<SUIT_ViewManager*> lst;
2761 #ifndef DISABLE_SALOMEOBJECT
2762 viewManagers( SVTK_Viewer::Type(), lst );
2763 QListIterator<SUIT_ViewManager*> it( lst );
2764 while ( it.hasNext() )
2766 SUIT_ViewModel* vm = it.next()->getViewModel();
2767 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2770 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2771 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
2776 if( sec=="ObjectBrowser" )
2778 SUIT_DataBrowser* ob = objectBrowser();
2782 if ( param=="auto_size_first" )
2784 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
2785 ob->setAutoSizeFirstColumn( autoSizeFirst );
2786 if ( autoSizeFirst )
2787 ob->adjustFirstColumnWidth();
2789 else if ( param=="auto_size" ) {
2790 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
2791 ob->setAutoSizeColumns(autoSize);
2793 ob->adjustColumnsWidth();
2795 else if ( param=="resize_on_expand_item" ) {
2796 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
2797 ob->setResizeOnExpandItem(resizeOnExpandItem);
2799 else if ( param == "auto_hide_search_tool" ) {
2800 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2806 if( param=="store_positions" )
2808 if( param=="auto_save_interval" ) {
2809 myAutoSaveTimer->stop();
2810 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
2811 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
2815 #ifndef DISABLE_PYCONSOLE
2816 if( sec=="PyConsole" && pythonConsole() )
2818 if ( param=="font" ) {
2819 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2821 else if ( param=="show_banner" ) {
2822 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2829 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2831 if ( param == "visible_count" )
2832 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
2833 else if ( param == "max_count" )
2834 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
2835 else if ( param == "insert_mode" )
2836 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
2837 else if ( param == "link_type" )
2838 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
2839 else if ( param == "show_clear" )
2840 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2841 else if ( param == "show_mru" )
2842 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
2845 if ( sec == "language" && param == "language" )
2847 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
2849 if ( sec == "desktop" && param == "opaque_resize" ) {
2850 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
2851 QMainWindow::DockOptions dopts = desktop()->dockOptions();
2852 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2853 else dopts &= ~QMainWindow::AnimatedDocks;
2854 desktop()->setDockOptions( dopts );
2855 desktop()->setOpaqueResize( opaqueResize );
2856 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2857 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2860 if ( sec == "ExternalBrowser" && param == "use_external_browser" ) {
2861 if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) )
2863 if(QtxWebBrowser::webBrowser())
2864 QtxWebBrowser::webBrowser()->close();
2868 #ifndef DISABLE_PLOT2DVIEWER
2869 if ( sec == "Plot2d" ) {
2870 if( param == "SelectionColor" ) {
2871 QColor c = resMgr->colorValue( sec, param );
2872 Plot2d_Object::setSelectionColor(c);
2874 else if (param == "SelectedLegendFontColor") {
2875 QColor c = resMgr->colorValue( sec, param );
2876 Plot2d_Object::setHighlightedLegendTextColor(c);
2885 void LightApp_Application::loadPreferences()
2887 CAM_Application::loadPreferences();
2889 SUIT_ResourceMgr* aResMgr = resourceMgr();
2894 static bool mru_load = true;
2897 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2899 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
2900 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
2901 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
2902 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
2903 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
2904 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2905 mru->loadLinks( aResMgr, "MRU" );
2911 QStringList mods = aResMgr->parameters( "windows_geometry" );
2912 for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it )
2915 if ( aResMgr->value( "windows_geometry", *it, arr ) )
2916 myWinGeom.insert( *it, arr );
2920 mods = aResMgr->parameters( "windows_visibility" );
2921 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
2924 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
2925 myWinVis.insert( *itr, arr );
2929 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
2930 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
2931 QMainWindow::DockOptions dopts = desktop()->dockOptions();
2932 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2933 else dopts &= ~QMainWindow::AnimatedDocks;
2934 desktop()->setDockOptions( dopts );
2935 desktop()->setOpaqueResize( opaqueResize );
2936 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2937 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2944 void LightApp_Application::savePreferences()
2946 CAM_Application::savePreferences();
2948 saveDockWindowsState();
2950 SUIT_ResourceMgr* aResMgr = resourceMgr();
2955 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2957 mru->saveLinks( aResMgr, "MRU" );
2959 for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it )
2960 aResMgr->setValue( "windows_geometry", it.key(), it.value() );
2962 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
2963 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
2966 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
2972 Updates desktop title
2974 void LightApp_Application::updateDesktopTitle()
2976 QString aTitle = applicationName();
2977 QString aVer = applicationVersion();
2978 if ( !aVer.isEmpty() )
2979 aTitle += QString( " " ) + aVer;
2981 if ( activeStudy() ) {
2982 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
2983 aTitle += QString( " - [%1]" ).arg( sName );
2986 desktop()->setWindowTitle( aTitle );
2990 \brief Get map of the operations which can be performed
2991 on the module activation.
2993 The method should return the map of the kind \c {<id>:<name>}
2994 where \c <id> is an integer identifier of the operation and
2995 \c <name> is a title for the button to be added to the
2996 dialog box. After user selects the required operation by the
2997 clicking the corresponding button in the dialog box, its identifier
2998 is passed to the moduleActionSelected() method to process
3001 \return map of the operations
3002 \sa moduleActionSelected()
3004 QMap<int, QString> LightApp_Application::activateModuleActions() const
3006 QMap<int, QString> opmap;
3007 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3008 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3013 \brief Called when the used selectes required operation chosen
3014 from "Activate module" dialog box.
3016 Performs the required operation according to the user choice.
3018 \param id operation identifier
3019 \sa activateModuleActions()
3021 void LightApp_Application::moduleActionSelected( const int id )
3036 Updates windows after close document
3038 void LightApp_Application::afterCloseDoc()
3042 CAM_Application::afterCloseDoc();
3046 Updates actions of active module
3048 void LightApp_Application::updateModuleActions()
3051 if ( activeModule() ) {
3052 modName = activeModule()->moduleName();
3053 if ( !isModuleAccessible( modName ) ) {
3054 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3055 foreach( SUIT_Application* app, apps ) {
3056 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3057 if ( lapp && lapp != this )
3058 lapp->removeModuleAction( modName );
3063 LightApp_ModuleAction* moduleAction =
3064 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3066 moduleAction->setActiveModule( modName );
3069 void LightApp_Application::removeModuleAction( const QString& modName )
3071 LightApp_ModuleAction* moduleAction =
3072 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3074 moduleAction->removeModule( modName );
3078 Gets current windows.
3079 \param winMap - output current windows map.
3081 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3084 if ( !activeStudy() )
3087 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3088 ((LightApp_Module*)activeModule())->windows( winMap );
3090 defaultWindows( winMap );
3094 Gets current view managers.
3095 \param lst - output current view managers list.
3097 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3100 if ( !activeStudy() )
3103 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3104 ((LightApp_Module*)activeModule())->viewManagers( lst );
3106 defaultViewManagers( lst );
3112 void LightApp_Application::updateWindows()
3114 QMap<int, int> winMap;
3115 currentWindows( winMap );
3117 if ( activeStudy() )
3119 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3121 if ( !dockWindow( it.key() ) )
3122 getWindow( it.key() );
3126 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3128 QWidget* wid = it.value();
3129 if ( activeStudy() )
3130 wid->setVisible( winMap.contains( it.key() ) );
3135 if ( activeStudy() )
3136 loadDockWindowsState();
3142 Updates view managers
3144 void LightApp_Application::updateViewManagers()
3147 currentViewManagers( lst );
3149 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3150 getViewManager( *it, true );
3154 Loads windows geometry
3156 void LightApp_Application::loadDockWindowsState()
3161 bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3166 if ( activeModule() )
3167 modName = activeModule()->name();
3169 if ( myWinGeom.contains( modName ) )
3170 desktop()->restoreState( myWinGeom[modName] );
3172 if ( !myWinVis.contains( modName ) )
3175 QMap<QString, bool> tbMap, dwMap;
3176 dockWindowsState( myWinVis[modName], tbMap, dwMap );
3178 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3179 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3181 QToolBar* tb = *tit;
3183 QObject* po = Qtx::findParent( tb, "QMainWindow" );
3184 if ( po != desktop() )
3187 if ( tbMap.contains( tb->objectName() ) )
3188 tb->setVisible( tbMap[tb->objectName()] );
3191 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3192 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3194 QDockWidget* dw = *dit;
3196 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3197 if ( po != desktop() )
3200 if ( dwMap.contains( dw->objectName() ) )
3201 dw->setVisible( dwMap[dw->objectName()] );
3206 Saves windows geometry
3208 void LightApp_Application::saveDockWindowsState()
3213 bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
3218 if ( activeModule() )
3219 modName = activeModule()->name();
3221 myWinGeom.insert( modName, desktop()->saveState() );
3224 if ( myWinVis.contains( modName ) )
3225 visArr = myWinVis[modName];
3227 QMap<QString, bool> tbMap, dwMap;
3228 dockWindowsState( visArr, tbMap, dwMap );
3230 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3231 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3234 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3237 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3238 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3240 QDockWidget* wid = *it;
3241 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3244 visArr = dockWindowsState( tbMap, dwMap );
3246 myWinVis.insert( modName, visArr );
3249 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3252 QDataStream stream( &visArr, QIODevice::WriteOnly );
3254 stream << (uchar)ToolBarMarker;
3255 stream << tb.size();
3256 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3258 stream << tit.key();
3259 stream << (uchar)( tit.value() ? 1 : 0 );
3262 stream << (uchar)DockWidgetMarker;
3263 stream << dw.size();
3264 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3266 stream << wit.key();
3267 stream << (uchar)( wit.value() ? 1 : 0 );
3273 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3278 QByteArray visArr = arr;
3279 QDataStream stream( &visArr, QIODevice::ReadOnly );
3283 if ( marker != ToolBarMarker )
3288 for ( int i = 0; i < lines; ++i )
3291 stream >> objectName;
3294 tb.insert( objectName, shown );
3298 if ( marker != DockWidgetMarker )
3302 for ( int j = 0; j < lines; ++j )
3305 stream >> objectName;
3308 dw.insert( objectName, shown );
3313 Adds icon names for modules
3315 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3319 SUIT_ResourceMgr* resMgr = resourceMgr();
3323 QStringList modList;
3324 modules( modList, false );
3326 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3328 QString modName = *it;
3329 QString modIntr = moduleName( modName );
3330 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3332 if ( modIcon.isEmpty() )
3335 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3336 modIcon += QString( ".png" );
3338 iconMap.insert( modName, modIcon );
3343 Inserts items in popup, which necessary for current application
3345 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3348 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3349 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3350 selMgr->setSelectionCacheEnabled( true );
3352 SUIT_DataBrowser* ob = objectBrowser();
3354 CAM_Application::contextMenuPopup( type, thePopup, title );
3356 if ( ob && type == ob->popupClientType() ) {
3357 thePopup->addSeparator();
3358 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3359 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3360 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3363 if ( selMgr && ob ) {
3364 SALOME_ListIO selected;
3365 selMgr->selectedObjects( selected );
3366 if(selected.Extent() == 1){
3367 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3368 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3369 if(obj && obj->renameAllowed()) {
3370 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3371 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3372 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3373 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3375 QList<QAction*> acts = thePopup->actions();
3376 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3377 thePopup->insertAction(firstAction,a);
3382 selMgr->setSelectionCacheEnabled( cacheIsOn );
3388 void LightApp_Application::createEmptyStudy()
3390 CAM_Application::createEmptyStudy();
3392 if ( objectBrowser() )
3393 objectBrowser()->updateTree();
3395 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3396 if ( aResMgr && activeStudy() ) {
3397 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3398 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3403 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3405 CAM_Application::setDesktop( desk );
3408 connect( desk, SIGNAL( message( const QString& ) ),
3409 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3415 \param mod - module to be activated
3417 bool LightApp_Application::activateModule( CAM_Module* mod )
3419 bool res = CAM_Application::activateModule( mod );
3421 if ( objectBrowser() )
3422 objectBrowser()->updateTree();
3428 \return keyborad accelerators manager object
3430 SUIT_Accel* LightApp_Application::accel() const
3436 Removes dead widget container from map
3438 void LightApp_Application::onWCDestroyed( QObject* ob )
3440 // remove destroyed widget container from windows map
3441 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3443 if ( itr.value() != ob )
3446 int key = itr.key();
3447 myWin.remove( key );
3452 void LightApp_Application::onMRUActivated( const QString& name )
3454 SUIT_Session* s = SUIT_Session::session();
3455 if ( s && s->activeApplication() == this )
3459 void LightApp_Application::onStylePreferences()
3461 Style_PrefDlg dlg( desktop() );
3464 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3467 void LightApp_Application::onFullScreen(){
3468 if(myScreenHelper) {
3469 if(desktop()->isFullScreen())
3470 myScreenHelper->switchToNormalScreen();
3472 myScreenHelper->switchToFullScreen();
3477 Connects just added view manager
3479 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3481 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3482 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3483 CAM_Application::addViewManager( vm );
3487 Remove view manager from memory
3489 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3491 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3492 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3493 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3495 aStudy->removeViewMgr(vm->getGlobalId());
3497 CAM_Application::removeViewManager( vm );
3499 LightApp_SelectionMgr* selMgr = selectionMgr();
3500 QList<SUIT_Selector*> selectors;
3501 selMgr->selectors( selectors );
3502 foreach( SUIT_Selector* selector, selectors ) {
3503 if ( selector->owner() == vm->getViewModel() ) {
3508 // IPAL22894: Crash on closing OCC view
3514 Renames active window of desktop
3516 void LightApp_Application::onRenameWindow()
3521 QWidget* w = desktop()->activeWindow();
3526 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3527 if( ok && !name.isEmpty() )
3528 w->setWindowTitle( name );
3532 Closes active window of desktop
3534 void LightApp_Application::onCloseWindow()
3539 QWidget* w = desktop()->activeWindow();
3547 Closes all windows of desktop
3549 void LightApp_Application::onCloseAllWindow()
3551 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3555 QList<SUIT_ViewWindow*> wndList = desk->windows();
3556 SUIT_ViewWindow* wnd;
3557 foreach( wnd, wndList )
3565 Groups all windows of desktop
3567 void LightApp_Application::onGroupAllWindow()
3569 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3573 QtxWorkstack* wgStack = desk->workstack();
3579 \return if the library of module exists
3580 \param moduleTitle - title of module
3582 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3584 if( moduleTitle.isEmpty() )
3587 QString lib = moduleLibrary( moduleTitle );
3589 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3590 bool isPythonModule = lib.contains("SalomePyQtGUI");
3591 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3595 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3597 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3600 bool isLibFound = false;
3601 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3602 for( ; anIt!=aLast; anIt++ )
3604 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
3615 INFOS( "****************************************************************" << std::endl
3616 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
3617 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
3618 << "****************************************************************" << std::endl );
3620 else if ( !isPythonModule && !isPythonLightModule)
3623 if ( isPythonModule || isPythonLightModule)
3625 QString pylib = moduleName( moduleTitle ) + QString(".py");
3626 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
3628 // Check the python library
3630 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3632 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
3634 bool isPyLib = false, isPyGuiLib = false;
3635 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3636 for( ; anIt!=aLast; anIt++ )
3638 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
3639 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
3641 if(!isPythonLightModule)
3642 if( !isPyLib && inf.exists() )
3645 if( !isPyGuiLib && infgui.exists() )
3648 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
3652 printf( "****************************************************************\n" );
3653 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
3655 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
3657 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
3658 printf( "****************************************************************\n" );
3665 \return default name for an active study
3667 void LightApp_Application::setDefaultStudyName( const QString& theName )
3669 QStringList anInfoList;
3670 modules( anInfoList, false );
3672 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
3673 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
3674 !aStudy->isSaved() )
3676 aStudy->setStudyName( theName );
3677 updateDesktopTitle();
3682 Custom event handler
3684 bool LightApp_Application::event( QEvent* e )
3686 if( e && e->type()==2000 )
3688 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
3689 QString* d = ( QString* )ce->data();
3690 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
3692 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
3693 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
3694 showPreferences( tr( "PREF_APP" ) );
3699 return CAM_Application::event( e );
3702 /*! Check data object */
3703 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
3707 bool isSuitable = !theObj->entry().isEmpty() &&
3708 !theObj->componentDataType().isEmpty() &&
3709 !theObj->name().isEmpty();
3716 int LightApp_Application::openChoice( const QString& aName )
3718 int choice = CAM_Application::openChoice( aName );
3720 if ( choice == OpenExist ) // The document is already open.
3722 // Do you want to reload it?
3723 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
3724 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
3725 choice = OpenReload;
3731 bool LightApp_Application::openAction( const int choice, const QString& aName )
3738 STD_Application* app = 0;
3739 SUIT_Session* session = SUIT_Session::session();
3740 QList<SUIT_Application*> appList = session->applications();
3741 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
3743 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
3744 app = ::qobject_cast<STD_Application*>( *it );
3749 app->onCloseDoc( false );
3750 appList = session->applications();
3751 STD_Application* other = 0;
3752 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
3753 other = ::qobject_cast<STD_Application*>( *it );
3756 res = other->onOpenDoc( aName );
3761 res = CAM_Application::openAction( choice, aName );
3768 QStringList LightApp_Application::viewManagersTypes() const
3770 QStringList aTypesList;
3771 aTypesList += myUserWmTypes;
3772 #ifndef DISABLE_GLVIEWER
3773 aTypesList<<GLViewer_Viewer::Type();
3775 #ifndef DISABLE_PLOT2DVIEWER
3776 aTypesList<<Plot2d_Viewer::Type();
3778 #ifndef DISABLE_QXGRAPHVIEWER
3779 aTypesList<<QxScene_Viewer::Type();
3781 #ifndef DISABLE_OCCVIEWER
3782 aTypesList<<OCCViewer_Viewer::Type();
3784 #ifndef DISABLE_VTKVIEWER
3785 #ifndef DISABLE_SALOMEOBJECT
3786 aTypesList<<SVTK_Viewer::Type();
3788 aTypesList<<VTKViewer_Viewer::Type();
3794 * Removes all view managers of known types
3795 * Other view managers are ignored
3797 void LightApp_Application::clearKnownViewManagers()
3799 QStringList aTypesList = viewManagersTypes();
3800 QList<SUIT_ViewManager*> aMgrList;
3801 viewManagers( aMgrList );
3802 foreach (SUIT_ViewManager* aMgr, aMgrList) {
3803 if (aTypesList.contains(aMgr->getType()))
3804 removeViewManager(aMgr);
3809 Copy of current selection
3811 void LightApp_Application::onCopy()
3813 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3819 Paste of current data in clipboard
3821 void LightApp_Application::onPaste()
3823 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3829 Browse (i.e. set focus on) the published objects
3830 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
3831 has been accepted by Ok (or Apply & Close) button
3832 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
3833 (to select the first published object only)
3834 \return entry of the selected object
3836 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
3837 const bool theIsApplyAndClose,
3838 const bool theIsOptimizedBrowsing )
3841 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
3843 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
3844 switch( aBrowsePolicy )
3848 case BP_ApplyAndClose:
3849 if( !theIsApplyAndClose )
3857 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
3861 SUIT_DataBrowser* anOB = objectBrowser();
3865 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
3869 QStringListIterator anIter( theEntryList );
3870 if( theIsOptimizedBrowsing )
3872 // go to the last entry
3874 if( anIter.hasPrevious() )
3878 // scroll to each entry in the list
3879 // (in optimized mode - to the last entry only)
3881 LightApp_DataObject* anObject = 0;
3882 while( anIter.hasNext() )
3884 anEntry = anIter.next();
3885 if( !anEntry.isEmpty() )
3887 anObject = aStudy->findObjectByEntry( anEntry );
3890 QModelIndex anIndex = aModel->index( anObject );
3891 anOB->treeView()->scrollTo( anIndex );
3896 // always select the last object
3897 if( anObject && !anEntry.isEmpty() )
3899 QList<SUIT_Selector*> aSelectorList;
3900 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
3901 if( !aSelectorList.isEmpty() )
3903 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
3905 bool anIsAutoBlock = aSelector->autoBlock();
3907 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
3908 aSelector->setAutoBlock( false );
3910 SUIT_DataOwnerPtrList aList;
3911 #ifndef DISABLE_SALOMEOBJECT
3912 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
3913 ( anObject->entry().toLatin1().constData(),
3914 anObject->componentDataType().toLatin1().constData(),
3915 anObject->name().toLatin1().constData() );
3916 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
3918 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
3921 aList.append( owner );
3922 selectionMgr()->setSelected( aList );
3925 // restore auto block flag
3926 aSelector->setAutoBlock( anIsAutoBlock );
3934 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
3936 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
3937 return study ? study->findObjectByEntry( id ) : 0;
3941 Checks that an object can be renamed.
3942 \param entry entry of the object
3943 \brief Return \c true if object can be renamed
3945 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
3950 Rename object by entry.
3951 \param entry entry of the object
3952 \param name new name of the object
3953 \brief Return \c true if rename operation finished successfully, \c false otherwise.
3955 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
3959 /*! Process standard messages from desktop */
3960 void LightApp_Application::onDesktopMessage( const QString& message )
3962 const QString sectionSeparator = "/";
3964 if ( message.toLower() == "updateobjectbrowser" ||
3965 message.toLower() == "updateobjbrowser" ) {
3966 // update object browser
3967 updateObjectBrowser();
3970 QStringList data = message.split( sectionSeparator );
3971 if ( data.count() > 1 ) {
3972 QString msgType = data[0].trimmed();
3973 LightApp_Module* sMod = 0;
3974 CAM_Module* mod = module( msgType );
3976 mod = module( moduleTitle( msgType ) );
3977 if ( mod && mod->inherits( "LightApp_Module" ) )
3978 sMod = (LightApp_Module*)mod;
3980 if ( msgType.toLower() == "preferences" ) {
3981 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
3982 // for example "preferences/Study/multi_file_dump/true"
3983 if ( data.count() > 3 ) {
3984 QString section = data[1].trimmed();
3985 QString param = data[2].trimmed();
3986 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
3987 resourceMgr()->setValue( section, param, value );
3991 // received message for the module
3992 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
3993 sMod->message( msg );