1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyInterp.h" // WARNING! This include must be the first!
39 #include <PyConsole_Console.h>
42 #include "LightApp_Application.h"
43 #include "LightApp_Module.h"
44 #include "LightApp_DataModel.h"
45 #include "LightApp_DataOwner.h"
46 #include "LightApp_Displayer.h"
47 #include "LightApp_Study.h"
48 #include "LightApp_Preferences.h"
49 #include "LightApp_PreferencesDlg.h"
50 #include "LightApp_ModuleDlg.h"
51 #include "LightApp_AboutDlg.h"
52 #include "LightApp_ModuleAction.h"
53 // temporary commented
54 #include "LightApp_EventFilter.h"
55 #include "LightApp_OBSelector.h"
56 #include "LightApp_SelectionMgr.h"
57 #include "LightApp_DataObject.h"
58 #include "LightApp_WgViewModel.h"
59 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
63 #include <Basics_OCCTVersion.hxx>
65 #include <SALOME_Event.h>
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
70 #include <CAM_Module.h>
71 #include <CAM_DataModel.h>
72 #include <CAM_Study.h>
73 #include <STD_TabDesktop.h>
75 #include <SUIT_DataBrowser.h>
76 #include <SUIT_Session.h>
77 #include <SUIT_Study.h>
78 #include <SUIT_FileDlg.h>
79 #include <SUIT_ResourceMgr.h>
80 #include <SUIT_ShortcutMgr.h>
81 #include <SUIT_Tools.h>
82 #include <SUIT_Accel.h>
83 #include <SUIT_MessageBox.h>
84 #include <SUIT_ViewWindow.h>
87 #include <QtxToolBar.h>
88 #include <QtxTreeView.h>
89 #include <QtxMRUAction.h>
90 #include <QtxDockAction.h>
91 #include <QtxDockWidget.h>
92 #include <QtxActionToolMgr.h>
93 #include <QtxSearchTool.h>
94 #include <QtxWorkstack.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_QXGRAPHVIEWER
142 #include <QxScene_ViewManager.h>
143 #include <QxScene_ViewModel.h>
144 #include <QxScene_ViewWindow.h>
147 #ifndef DISABLE_GRAPHICSVIEW
148 #include "GraphicsView_Viewer.h"
149 #include "GraphicsView_ViewManager.h"
150 #include "LightApp_GVSelector.h"
153 #define VISIBILITY_COLUMN_WIDTH 25
159 #include <QStringList>
161 #include <QApplication>
163 #include <QStatusBar>
165 #include <QObjectList>
167 #include <QInputDialog>
168 #include <QFontDatabase>
170 #include <QByteArray>
174 #include <QHeaderView>
179 #include <utilities.h>
181 #define FIRST_HELP_ID 1000000
183 #ifndef DISABLE_SALOMEOBJECT
184 #include <SALOME_InteractiveObject.hxx>
185 #include <SALOME_ListIO.hxx>
188 #include <Standard_Version.hxx>
190 #define ToolBarMarker 0
191 #define DockWidgetMarker 1
193 static const char* imageEmptyIcon[] = {
196 "....................",
197 "....................",
198 "....................",
199 "....................",
200 "....................",
201 "....................",
202 "....................",
203 "....................",
204 "....................",
205 "....................",
206 "....................",
207 "....................",
208 "....................",
209 "....................",
210 "....................",
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "...................."};
217 int LightApp_Application::lastStudyId = 0;
220 // Markers used to parse array with dockable windows and toolbars state.
221 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
222 // in the Qt source code.
224 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
225 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
227 // Format of the Byte array with the windows and toolbar state is:
228 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
230 //Find toolbar marker position in the array in the following way:
231 //since the 'toolbar marker' is not unique, find index of first occurrence of the
232 //'toolbar marker' in the array and check that next string is name of the toolbar
234 int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) {
235 int aResult = -1,tmp = 0;
236 int inputLen = input.length();
237 QDataStream anInputData(&input, QIODevice::ReadOnly);
238 while(tmp < inputLen) {
239 tmp = input.indexOf(QToolBarMarker, tmp + 1);
242 anInputData.device()->seek(tmp);
246 anInputData >> lines;
248 if(lines == 0 && anInputData.atEnd()){
249 //Case then array doesn't contain information about toolbars,
260 if(aFlags.contains(str)) {
269 \return last global id of study
271 int LightApp_Application::studyId()
273 return LightApp_Application::lastStudyId;
276 /*!Create new instance of LightApp_Application.*/
277 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
279 return new LightApp_Application();
282 /*! \var global preferences of LightApp */
283 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
287 \class LightApp_Application
288 Application containing LightApp module
292 LightApp_Application::LightApp_Application()
293 : CAM_Application( false ),
295 myScreenHelper(new LightApp_FullScreenHelper())
297 Q_INIT_RESOURCE( LightApp );
299 STD_TabDesktop* desk = new STD_TabDesktop();
300 desk->setFullScreenAllowed(false);
301 desk->setMinimizeAllowed(false);
305 // initialize auto save timer
306 myAutoSaveTimer = new QTimer( this );
307 myAutoSaveTimer->setSingleShot( true );
308 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
310 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
311 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
313 desktop()->setWindowIcon( aLogo );
314 desktop()->setDockableMenuBar( false );
315 desktop()->setDockableStatusBar( false );
317 // base logo (salome itself)
318 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
319 // extra logo (salome-based application)
320 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
324 mySelMgr = new LightApp_SelectionMgr( this );
326 myAccel = SUIT_Accel::getAccel();
328 #ifndef DISABLE_OCCVIEWER
329 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
330 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
331 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
332 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
333 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
334 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
335 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
336 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
337 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
338 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
339 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
340 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
342 #ifndef DISABLE_VTKVIEWER
343 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
344 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
345 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
346 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
347 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
348 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
349 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
350 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
351 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
354 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
356 #ifndef DISABLE_PLOT2DVIEWER
357 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
367 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
368 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
369 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
370 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
371 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
374 // Set existing font for the python console in resources
375 if( !aResMgr->hasValue( "PyConsole", "font" ) )
378 QFont f = aResMgr->fontValue( "PyConsole", "font" );
380 QStringList famdb = fdb.families();
382 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
385 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
387 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
390 if ( famdb.contains(aFamily) )
392 f.setFamily( aFamily );
393 aResMgr->setValue( "PyConsole", "font", f );
400 *\li Save window geometry.
401 *\li Save desktop geometry.
402 *\li Save resource maneger.
403 *\li Delete selection manager.
405 LightApp_Application::~LightApp_Application()
408 delete myScreenHelper;
411 /*!Start application.*/
412 void LightApp_Application::start()
414 CAM_Application::start();
417 updateViewManagers();
420 desktop()->statusBar()->showMessage( "" );
422 LightApp_EventFilter::Init();
425 /*!Gets application name.*/
426 QString LightApp_Application::applicationName() const
428 static QString _app_name;
429 if ( _app_name.isEmpty() )
430 _app_name = tr( "APP_NAME" );
434 /*!Gets application version.*/
435 QString LightApp_Application::applicationVersion() const
437 static QString _app_version;
439 if ( _app_version.isEmpty() )
441 QString resVersion = tr( "APP_VERSION" );
442 if ( resVersion != "APP_VERSION" )
444 _app_version = resVersion;
448 _app_version = GUI_VERSION_STR;
454 /*!Load module by \a name.*/
455 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
457 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
460 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
461 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
462 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
467 /*!Activate module by \a modName*/
468 bool LightApp_Application::activateModule( const QString& modName )
471 CAM_Module* prevMod = activeModule();
474 actName = prevMod->moduleName();
476 if ( actName == modName )
479 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
481 saveDockWindowsState();
483 bool status = CAM_Application::activateModule( modName );
485 updateModuleActions();
493 updateViewManagers();
498 /*!Gets selection manager.*/
499 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
504 /*!Creat action "New window" for certain type of viewer:*/
505 void LightApp_Application::createActionForViewer( const int id,
507 const QString& suffix,
510 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
511 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
512 QAction* a = createAction( id, // menu action id
519 false, // toggle flag
521 SLOT( onNewWindow() ) ); // slot
522 createMenu( a, parentId, -1 );
527 void LightApp_Application::createActions()
529 CAM_Application::createActions();
531 SUIT_Desktop* desk = desktop();
532 SUIT_ResourceMgr* resMgr = resourceMgr();
535 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
536 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
537 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
541 // - Help for modules
543 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
544 createMenu( separator(), helpMenu, -1, 10 );
545 QStringList aModuleList;
546 modules( aModuleList, false );
547 aModuleList.prepend( "GUI" );
548 aModuleList.prepend( "KERNEL" );
550 int id = LightApp_Application::UserID + FIRST_HELP_ID;
553 foreach( aModule, aModuleList ) {
554 if ( aModule.isEmpty() ) // module title (user name)
556 IMap <QString, QString> helpData; // list of help files for the module
557 QString helpSubMenu; // help submenu name (empty if not needed)
558 QString modName = moduleName( aModule ); // module name
559 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
560 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
561 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
563 if (resMgr->hasValue( modName, "documentation" ) )
564 docSection = resMgr->stringValue(modName, "documentation");
565 else if ( resMgr->hasSection( modName + "_documentation" ) )
566 docSection = modName + "_documentation";
567 if ( !docSection.isEmpty() ) {
568 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
569 QStringList listOfParam = resMgr->parameters( docSection );
570 foreach( QString paramName, listOfParam ) {
571 QString valueStr = resMgr->stringValue( docSection, paramName );
572 if ( !valueStr.isEmpty() ) {
573 QFileInfo fi( valueStr );
574 if ( fi.isRelative() && !modDir.isEmpty() )
575 valueStr = Qtx::addSlash( modDir ) + valueStr;
576 if ( QFile::exists( valueStr ) )
577 helpData.insert( paramName.arg( aModule ), valueStr );
582 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
583 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
584 QString indexFile = idxLst.join( QDir::separator() ); // index file
585 if ( QFile::exists( indexFile ) )
586 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
589 IMapConstIterator<QString, QString > fileIt;
590 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
591 QString helpFileName = fileIt.key();
592 // remove all '//' occurances
593 while ( helpFileName.contains( "//" ) )
594 helpFileName.replace( "//", "" );
595 // obtain submenus hierarchy if given
596 QStringList smenus = helpFileName.split( "/" );
597 helpFileName = smenus.last();
599 QAction* a = createAction( id, helpFileName,
600 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
601 helpFileName, helpFileName,
602 0, desk, false, this, SLOT( onHelpContentsModule() ) );
603 a->setData( fileIt.value() );
604 if ( !helpSubMenu.isEmpty() ) {
605 smenus.prepend( helpSubMenu );
607 // create sub-menus hierarchy
608 int menuId = helpMenu;
609 foreach ( QString subMenu, smenus ) {
610 menuId = createMenu( subMenu, menuId, -1, 0 );
612 createMenu( a, menuId, -1, 0 );
617 // - Additional help items
619 createMenu( separator(), helpMenu, -1, 5 );
621 QStringList addHelpItems = resMgr->parameters( "add_help" );
622 foreach ( QString addHelpItem, addHelpItems ) {
623 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
624 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
625 QAction* a = createAction( id, addHelpItem,
626 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
627 addHelpItem, addHelpItem,
628 0, desk, false, this, SLOT( onHelpContentsModule() ) );
629 a->setData( valueStr );
630 createMenu( a, helpMenu, -1, 5 );
636 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
637 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
638 registerAction( MRUId, mru );
640 // default icon for neutral point ('SALOME' module)
641 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
642 if ( defIcon.isNull() )
643 defIcon = QPixmap( imageEmptyIcon );
645 //! default icon for any module
646 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
647 if ( modIcon.isNull() )
648 modIcon = QPixmap( imageEmptyIcon );
651 modules( modList, false );
653 if ( modList.count() > 1 )
655 LightApp_ModuleAction* moduleAction =
656 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
658 QMap<QString, QString> iconMap;
659 moduleIconNames( iconMap );
661 const int iconSize = 20;
663 QStringList::Iterator it;
664 for ( it = modList.begin(); it != modList.end(); ++it )
666 if ( !isLibExists( *it ) )
669 QString modName = moduleName( *it );
671 if ( !isModuleAccessible( *it ) )
675 if ( iconMap.contains( *it ) )
676 iconName = iconMap[*it];
678 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
682 INFOS ( "\n****************************************************************" << std::endl
683 << "* Icon for " << (*it).toLatin1().constData()
684 << " not found. Using the default one." << std::endl
685 << "****************************************************************" << std::endl );
688 icon = Qtx::scaleIcon( icon, iconSize );
690 moduleAction->insertModule( *it, icon );
693 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
694 this, SLOT( onModuleActivation( const QString& ) ) );
695 registerAction( ModulesListId, moduleAction );
699 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
700 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
702 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
703 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
704 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
705 0, desk, false, this, SLOT( onCloseAllWindow() ) );
706 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
707 0, desk, false, this, SLOT( onGroupAllWindow() ) );
709 createMenu( CloseId, windowMenu, 0, -1 );
710 createMenu( CloseAllId, windowMenu, 0, -1 );
711 createMenu( GroupAllId, windowMenu, 0, -1 );
712 createMenu( separator(), windowMenu, -1, 0 );
714 #ifndef DISABLE_GLVIEWER
715 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
717 #ifndef DISABLE_PLOT2DVIEWER
718 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
720 #ifndef DISABLE_OCCVIEWER
721 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
723 #ifndef DISABLE_VTKVIEWER
724 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
726 #ifndef DISABLE_QXGRAPHVIEWER
727 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
729 #ifndef DISABLE_GRAPHICSVIEW
730 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_R );
733 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
734 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
735 createMenu( RenameId, windowMenu, -1 );
737 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
738 createMenu( PreferencesId, fileMenu, 50, -1 );
739 createMenu( separator(), fileMenu, -1, 50, -1 );
741 createMenu( separator(), fileMenu, -1, 100, -1 );
742 createMenu( MRUId, fileMenu, 100, -1 );
743 createMenu( separator(), fileMenu, -1, 100, -1 );
745 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
746 0, desk, false, this, SLOT( onStylePreferences() ) );
748 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
749 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
752 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
753 createMenu( separator(), viewMenu, -1, 20, -1 );
754 createMenu( StyleId, viewMenu, 20, -1 );
755 createMenu( FullScreenId, viewMenu, 20, -1 );
757 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
758 QString( "SalomeModules" ) ); // name (language-independant)
759 createTool( ModulesListId, modTBar );
762 /*!On module activation action.*/
763 void LightApp_Application::onModuleActivation( const QString& modName )
765 // Force user to create/open a study before module activation
766 QMap<QString, QString> iconMap;
767 moduleIconNames( iconMap );
768 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
770 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
772 bool cancelled = false;
774 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
775 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
776 QMap<int, QString> opmap = activateModuleActions();
777 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
778 aDlg.addButton( it.value(), it.key() );
780 int res = aDlg.exec();
782 // some operation is selected
783 moduleActionSelected( res );
787 putInfo( tr("INF_CANCELLED") );
789 LightApp_ModuleAction* moduleAction =
790 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
792 moduleAction->setActiveModule( QString() );
798 activateModule( modName );
801 /*!Default module activation.*/
802 QString LightApp_Application::defaultModule() const
804 QStringList aModuleNames;
805 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
806 //! If there's the one and only module --> activate it automatically
807 //! TODO: Possible improvement - default module can be taken from preferences
808 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
811 /*!On new window slot.*/
812 void LightApp_Application::onNewWindow()
814 const QObject* obj = sender();
815 if ( !obj || !obj->inherits( "QAction" ) )
819 int id = actionId( (QAction*)obj );
822 #ifndef DISABLE_GLVIEWER
824 type = GLViewer_Viewer::Type();
827 #ifndef DISABLE_PLOT2DVIEWER
829 type = Plot2d_Viewer::Type();
832 #ifndef DISABLE_OCCVIEWER
834 type = OCCViewer_Viewer::Type();
837 #ifndef DISABLE_VTKVIEWER
839 type = VTKViewer_Viewer::Type();
842 #ifndef DISABLE_QXGRAPHVIEWER
843 case NewQxSceneViewId:
844 type = QxScene_Viewer::Type();
847 #ifndef DISABLE_GRAPHICSVIEW
848 case NewGraphicsViewId:
849 type = GraphicsView_Viewer::Type();
854 if ( !type.isEmpty() )
855 createViewManager( type );
859 SLOT: Creates new document
861 void LightApp_Application::onNewDoc()
863 //asl: fix for 0020515
864 if ( activeStudy() ) {
865 saveDockWindowsState();
868 #ifdef SINGLE_DESKTOP
869 if ( !checkExistingDoc() )
873 CAM_Application::onNewDoc();
877 SLOT: Opens new document
879 void LightApp_Application::onOpenDoc()
881 SUIT_Study* study = activeStudy();
882 saveDockWindowsState();
884 #ifdef SINGLE_DESKTOP
885 if ( !checkExistingDoc() )
889 CAM_Application::onOpenDoc();
891 if ( !study ) // new study will be create in THIS application
894 updateViewManagers();
899 SLOT: Opens new document.
900 \param aName - name of file
902 bool LightApp_Application::onOpenDoc( const QString& aName )
904 #ifdef SINGLE_DESKTOP
905 if ( !checkExistingDoc() )
908 // We should take mru action first because this application instance can be deleted later.
909 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
911 bool res = CAM_Application::onOpenDoc( aName );
916 mru->insert( aName );
918 mru->remove( aName );
924 SLOT: Displays "About" message box
926 void LightApp_Application::onHelpAbout()
928 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
933 Private SLOT: Called on selection is changed
934 Dispatchs active module that selection is changed
936 void LightApp_Application::onSelection()
938 onSelectionChanged();
940 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
941 ((LightApp_Module*)activeModule())->selectionChanged();
946 \param study - SUIT_Study.
948 void LightApp_Application::setActiveStudy( SUIT_Study* study )
950 CAM_Application::setActiveStudy( study );
954 Enables/Disables menu items and toolbar buttons. Rebuild menu
956 void LightApp_Application::updateCommandsStatus()
958 CAM_Application::updateCommandsStatus();
961 #ifndef DISABLE_GLVIEWER
962 a = action( NewGLViewId );
964 a->setEnabled( activeStudy() );
967 #ifndef DISABLE_PLOT2DVIEWER
968 a = action( NewPlot2dId );
970 a->setEnabled( activeStudy() );
973 #ifndef DISABLE_OCCVIEWER
974 a = action( NewOCCViewId );
976 a->setEnabled( activeStudy() );
979 #ifndef DISABLE_VTKVIEWER
980 a = action( NewVTKViewId );
982 a->setEnabled( activeStudy() );
985 #ifndef DISABLE_QXGRAPHVIEWER
986 a = action( NewQxSceneViewId );
988 a->setEnabled( activeStudy() );
991 #ifndef DISABLE_GRAPHICSVIEW
992 a = action( NewGraphicsViewId );
994 a->setEnabled( activeStudy() );
1000 Runs system command in separate thread
1002 class RunBrowser: public QThread
1005 RunBrowser( LightApp_Application* app,
1006 const QString& theApp,
1007 const QString& theParams,
1008 const QString& theHelpFile,
1009 const QString& theContext = QString() )
1011 myParams( theParams ),
1012 myContext( theContext ),
1016 //For the external browser always specify 'file://' protocol,
1017 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1018 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1023 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1024 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1026 QProcess* proc = new QProcess();
1028 proc->start( aCommand );
1029 if ( !proc->waitForStarted() ) {
1030 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1031 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1032 ce2000->setData( msg );
1033 QApplication::postEvent( myLApp, ce2000 );
1044 LightApp_Application* myLApp;
1048 SLOT: Displays help contents for choosen module
1050 void LightApp_Application::onHelpContentsModule()
1052 const QAction* a = (QAction*) sender();
1053 QString helpFile = a->data().toString();
1054 if ( helpFile.isEmpty() ) return;
1056 SUIT_ResourceMgr* resMgr = resourceMgr();
1059 platform = "winapplication";
1061 platform = "application";
1063 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1065 QString quote("\"");
1066 anApp.prepend( quote );
1067 anApp.append( quote );
1069 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1070 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1072 if( useExtBrowser ) {
1073 if ( !anApp.isEmpty() ) {
1074 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1078 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1079 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1080 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1082 showPreferences( tr( "PREF_APP" ) );
1086 QStringList parameters;
1087 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1088 parameters << helpFile;
1089 QProcess::startDetached( "HelpBrowser", parameters );
1094 SLOT: Displays help contents for choosen dialog
1096 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1097 const QString& theFileName,
1098 const QString& theContext )
1100 QString fileName = theFileName;
1101 QString context = theContext;
1102 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1103 // context might be passed within theFileName argument
1104 QStringList comps = fileName.split("#");
1105 if ( comps.count() > 1 ) {
1106 context = comps.last();
1108 fileName = comps.join("#");
1112 QString homeDir = "";
1113 if ( !theComponentName.isEmpty() ) {
1114 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1115 if ( !dir.isEmpty() )
1116 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1117 Qtx::addSlash( "share" ) +
1118 Qtx::addSlash( "doc" ) +
1119 Qtx::addSlash( "salome" ) +
1120 Qtx::addSlash( "gui" ) +
1121 Qtx::addSlash( theComponentName ) );
1124 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1125 SUIT_ResourceMgr* resMgr = resourceMgr();
1128 platform = "winapplication";
1130 platform = "application";
1132 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1134 QString quote("\"");
1135 anApp.prepend( quote );
1136 anApp.append( quote );
1139 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1142 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1144 if ( !anApp.isEmpty() ) {
1145 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1149 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1150 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1151 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1152 showPreferences( tr( "PREF_APP" ) );
1156 QStringList parameters;
1157 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1158 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1159 QProcess::startDetached( "HelpBrowser", parameters );
1164 Sets enable or disable some actions on selection changed.
1166 void LightApp_Application::onSelectionChanged()
1168 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1169 bool canCopy = m ? m->canCopy() : false;
1170 bool canPaste = m ? m->canPaste() : false;
1172 action( EditCopyId )->setEnabled(canCopy);
1173 action( EditPasteId )->setEnabled(canPaste);
1176 QWidget* LightApp_Application::dockWindow( const int id ) const
1179 if ( myWin.contains( id ) )
1184 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1189 QDockWidget* dock = 0;
1190 QWidget* w = wid->parentWidget();
1191 while ( w && !dock )
1193 dock = ::qobject_cast<QDockWidget*>( w );
1194 w = w->parentWidget();
1199 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1204 if ( wid != dockWindow( id ) )
1205 removeDockWindow( id );
1207 myWin.insert( id, wid );
1209 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1210 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1212 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1213 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1214 QString( "%1Dock" ).arg( wid->objectName() ) );
1215 dock->setWidget( wid );
1217 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1218 if ( !accel.isEmpty() )
1219 dock->toggleViewAction()->setShortcut( accel );
1224 void LightApp_Application::removeDockWindow( const int id )
1226 QWidget* wid = dockWindow( id );
1232 QDockWidget* dock = windowDock( wid );
1236 dock->setWidget( 0 );
1237 wid->setParent( 0 );
1238 wid->setVisible( false );
1242 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1244 QDockWidget* dock = windowDock( dockWindow( id ) );
1245 if ( dock && desktop() ) {
1246 desktop()->addDockWidget( place, dock );
1247 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1248 if ( a ) a->update();
1254 \param flag - key for window
1255 \param studyId - study id
1256 Flag used how identificator of window in windows list.
1258 QWidget* LightApp_Application::getWindow( const int flag, const int )
1260 QWidget* wid = dockWindow( flag );
1262 insertDockWindow( flag, wid = createWindow( flag ) );
1264 QMap<int, int> winMap;
1265 currentWindows( winMap );
1266 if ( winMap.contains( flag ) )
1267 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1273 \return Object Browser
1275 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1277 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1283 LogWindow* LightApp_Application::logWindow()
1285 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1288 #ifndef DISABLE_PYCONSOLE
1290 This returns the python console integrated to the GUI. Depending
1291 when you request the python console, this function could return
1292 null. Then the optional parameter force (default to false) can be
1293 set to force the creation of the python console if it is not done
1295 \param force - if true, the pythonConsole is created if it does not exist yet
1296 \return Python Console
1298 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1300 QWidget* wid = dockWindow( WT_PyConsole );
1301 if ( !wid && force==true) {
1302 wid = getWindow(WT_PyConsole);
1304 return qobject_cast<PyConsole_Console*>( wid );
1309 Updates object browser and maybe data models
1310 \param updateModels - if it is true, then data models are updated
1312 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1314 // update existing data models
1317 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1318 if ( objectBrowser() )
1319 objectBrowser()->setAutoUpdate( false );
1321 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1323 CAM_Study::ModelList dm_list;
1324 study->dataModels( dm_list );
1325 QListIterator<CAM_DataModel*> it( dm_list );
1326 while ( it.hasNext() ) {
1327 CAM_DataModel* camDM = it.next();
1328 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1329 ((LightApp_DataModel*)camDM)->update();
1333 if( objectBrowser() )
1334 objectBrowser()->setAutoUpdate( isAutoUpdate );
1337 if ( objectBrowser() ) {
1338 objectBrowser()->updateGeometry();
1339 objectBrowser()->updateTree( 0, false );
1346 LightApp_Preferences* LightApp_Application::preferences() const
1348 return preferences( false );
1352 \return first view manager of some type
1353 \param vmType - type of view manager
1354 \param create - is it necessary to create view manager in case, when there is no manager of such type
1356 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1358 SUIT_ViewManager* aVM = viewManager( vmType );
1359 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1361 if ( anActiveVM && anActiveVM->getType() == vmType )
1364 if ( aVM && create )
1366 if ( !aVM->getActiveView() )
1369 aVM->getActiveView()->setFocus();
1372 aVM = createViewManager( vmType );
1378 Creates view manager of some type
1379 \param vmType - type of view manager
1381 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1383 SUIT_ResourceMgr* resMgr = resourceMgr();
1385 SUIT_ViewManager* viewMgr = 0;
1386 #ifndef DISABLE_GLVIEWER
1387 if( vmType == GLViewer_Viewer::Type() )
1389 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1390 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1393 #ifndef DISABLE_PLOT2DVIEWER
1394 if( vmType == Plot2d_Viewer::Type() )
1396 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1398 #ifndef DISABLE_SALOMEOBJECT
1399 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1401 new LightApp_Plot2dSelector( v, mySelMgr );
1403 vm = new Plot2d_Viewer();
1405 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1406 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1409 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1410 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1414 #ifndef DISABLE_QXGRAPHVIEWER
1415 if( vmType == QxScene_Viewer::Type() )
1417 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1418 QxScene_Viewer* vm = new QxScene_Viewer();
1419 viewMgr->setViewModel( vm );
1420 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1423 #ifndef DISABLE_GRAPHICSVIEW
1424 if( vmType == GraphicsView_Viewer::Type() )
1426 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1427 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1430 #ifndef DISABLE_OCCVIEWER
1431 if( vmType == OCCViewer_Viewer::Type() )
1433 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1434 OCCViewer_Viewer* vm;
1435 #ifndef DISABLE_SALOMEOBJECT
1436 vm = new SOCC_Viewer();
1438 vm = new OCCViewer_Viewer( true );
1440 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1441 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1442 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1443 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1444 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1445 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1446 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1447 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1449 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1450 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1451 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1452 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1453 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1454 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1456 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1457 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1460 #ifndef DISABLE_VTKVIEWER
1461 #ifndef DISABLE_SALOMEOBJECT
1462 if ( vmType == SVTK_Viewer::Type() )
1464 if ( vmType == VTKViewer_Viewer::Type() )
1467 #ifndef DISABLE_SALOMEOBJECT
1468 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1469 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1472 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1473 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1474 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1475 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1476 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1477 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1478 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1479 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1480 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1481 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1482 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1483 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1484 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1485 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1486 new LightApp_VTKSelector( vm, mySelMgr );
1489 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1490 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1492 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1500 addViewManager( viewMgr );
1501 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1503 if ( viewWin && desktop() ) {
1504 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1505 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1511 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1513 SUIT_ResourceMgr* resMgr = resourceMgr();
1515 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1517 new LightApp_WgViewModel( vmType, w ) );
1518 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1520 addViewManager( vm );
1521 SUIT_ViewWindow* vw = vm->createViewWindow();
1522 if ( vw && desktop() ) {
1523 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1524 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1527 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1528 myUserWmTypes << vmType;
1533 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1535 SUIT_ResourceMgr* resMgr = resourceMgr();
1537 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1541 QString vmType = vm->getType();
1543 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1545 addViewManager( vm );
1546 SUIT_ViewWindow* vw = vm->createViewWindow();
1547 if ( vw && desktop() ) {
1548 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1549 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1552 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1553 myUserWmTypes << vmType;
1559 SLOT: Removes view manager from application
1561 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1563 removeViewManager( theVM );
1567 Protected SLOT: On study created.
1568 \param theStudy - just created study
1570 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1572 SUIT_DataObject* aRoot = 0;
1573 if ( theStudy && theStudy->root() )
1575 aRoot = theStudy->root();
1576 //aRoot->setName( tr( "DATA_MODELS" ) );
1579 getWindow( WT_ObjectBrowser );
1581 loadDockWindowsState();
1583 if ( objectBrowser() )
1584 objectBrowser()->setRoot( aRoot );
1586 activateModule( defaultModule() );
1588 if ( objectBrowser() )
1589 objectBrowser()->openLevels();
1593 Protected SLOT: On study opened.
1594 \param theStudy - just opened study
1596 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1598 SUIT_DataObject* aRoot = 0;
1599 if ( theStudy && theStudy->root() )
1601 aRoot = theStudy->root();
1605 getWindow( WT_ObjectBrowser );
1607 loadDockWindowsState();
1609 if ( objectBrowser() )
1610 objectBrowser()->setRoot( aRoot );
1612 activateModule( defaultModule() );
1614 if ( objectBrowser() )
1615 objectBrowser()->openLevels();
1620 /*!Protected SLOT. On study saved.*/
1621 void LightApp_Application::onStudySaved( SUIT_Study* s )
1623 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1625 mru->insert( s->studyName() );
1630 /*!Protected SLOT. On study closed.*/
1631 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1634 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1635 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1638 // stop auto-save timer
1639 myAutoSaveTimer->stop();
1641 // Bug 10396: clear selection
1642 mySelMgr->clearSelected();
1644 // Bug 12944: emit signal only after clear selection
1647 activateModule( "" );
1650 /*!Protected SLOT.On desktop activated.*/
1651 void LightApp_Application::onDesktopActivated()
1653 CAM_Application::onDesktopActivated();
1654 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1656 aModule->studyActivated();
1659 void LightApp_Application::studyOpened( SUIT_Study* s )
1661 CAM_Application::studyOpened( s );
1664 updateViewManagers();
1667 void LightApp_Application::studySaved( SUIT_Study* s )
1669 CAM_Application::studyOpened( s );
1670 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1671 if ( aResMgr && activeStudy() ) {
1672 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1673 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1677 void LightApp_Application::studyCreated( SUIT_Study* s )
1679 CAM_Application::studyCreated( s );
1682 updateViewManagers();
1685 /*!Gets file filter.
1686 *\retval QString "(*.bin)"
1688 QString LightApp_Application::getFileFilter() const
1696 Shows file dialog and return user selected file name
1698 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1699 const QString& caption, QWidget* parent )
1703 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1704 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1707 /*! Gets directory*/
1708 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1712 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1715 /*! Get open file names*/
1716 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1717 const QString& caption, QWidget* parent )
1721 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1722 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1725 /*!Private SLOT. Update object browser.*/
1726 void LightApp_Application::onRefresh()
1728 updateObjectBrowser( true );
1731 /*!Private SLOT. Support drag-and-drop operation.*/
1732 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1734 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1738 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1740 aModule->dropObjects( objects, parentObj, row, action );
1743 /*!Private SLOT. On preferences.*/
1744 void LightApp_Application::onPreferences()
1746 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1749 /*!Private SLOT. On preferences.*/
1750 void LightApp_Application::showPreferences( const QString& itemText )
1752 QApplication::setOverrideCursor( Qt::WaitCursor );
1754 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1756 QApplication::restoreOverrideCursor();
1761 preferences()->activateItem( itemText );
1763 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1766 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1767 resourceMgr()->save();
1770 shortcutMgr()->updateShortcuts();
1776 /*!Protected SLOT. On preferences changed.*/
1777 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1779 LightApp_Module* sMod = 0;
1780 CAM_Module* mod = module( modName );
1781 if ( mod && mod->inherits( "LightApp_Module" ) )
1782 sMod = (LightApp_Module*)mod;
1785 sMod->preferencesChanged( section, param );
1787 preferencesChanged( section, param );
1788 // emit signal to allow additional preferences changing processing
1789 emit preferenceChanged( modName, section, param );
1792 /*!Remove all windows from study.*/
1793 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1795 if ( SUIT_DataBrowser* ob = objectBrowser() )
1798 CAM_Application::beforeCloseDoc( s );
1801 /*!Update actions.*/
1802 void LightApp_Application::updateActions()
1804 updateCommandsStatus();
1810 SUIT_Study* LightApp_Application::createNewStudy()
1812 LightApp_Application::lastStudyId++;
1814 LightApp_Study* aStudy = new LightApp_Study( this );
1816 // Set up processing of major study-related events
1817 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1818 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1819 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1820 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1826 Creates window by flag.
1827 \param flag - identificator of window type
1829 QWidget* LightApp_Application::createWindow( const int flag )
1833 SUIT_ResourceMgr* resMgr = resourceMgr();
1835 if ( flag == WT_ObjectBrowser )
1837 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
1838 ob->setObjectName( "objectBrowser" );
1839 ob->setSortMenuEnabled( true );
1840 ob->setAutoUpdate( true );
1841 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
1842 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
1844 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
1845 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
1846 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
1848 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
1849 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
1850 treeModel->setSearcher( this );
1851 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
1852 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
1854 // Mantis issue 0020136: Drag&Drop in OB
1855 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
1857 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
1858 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
1861 // temporary commented
1863 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
1865 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
1868 // Create OBSelector
1869 new LightApp_OBSelector( ob, mySelMgr );
1871 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
1872 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
1873 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
1874 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
1876 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1878 #ifndef DISABLE_PYCONSOLE
1879 else if ( flag == WT_PyConsole )
1881 PyConsole_Console* pyCons = new PyConsole_EnhConsole( desktop(),new LightApp_PyInterp());
1882 pyCons->setObjectName( "pythonConsole" );
1883 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
1884 pyCons->setFont(resourceMgr()->fontValue( "PyConsole", "font" ));
1885 pyCons->setIsShowBanner(resourceMgr()->booleanValue( "PyConsole", "show_banner", true ));
1886 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
1889 pyCons->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1892 else if ( flag == WT_LogWindow )
1894 LogWindow* logWin = new LogWindow( desktop() );
1895 logWin->setObjectName( "logWindow" );
1896 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
1897 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
1899 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
1905 \return default windows( Object Browser, Python Console )
1906 Adds to map \a aMap.
1908 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
1910 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
1911 #ifndef DISABLE_PYCONSOLE
1912 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
1914 // aMap.insert( WT_LogWindow, Qt::DockBottom );
1917 /*!Default view managers*/
1918 void LightApp_Application::defaultViewManagers( QStringList& ) const
1924 \return preferences.
1925 Create preferences, if \a crt = true.
1927 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
1932 LightApp_Application* that = (LightApp_Application*)this;
1934 bool toCreate = !_prefs_ && crt;
1937 _prefs_ = new LightApp_Preferences( resourceMgr() );
1938 that->createPreferences( _prefs_ );
1941 that->myPrefs = _prefs_;
1943 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
1944 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ) );
1949 SUIT_ResourceMgr* resMgr = resourceMgr();
1951 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
1952 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
1954 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
1958 QStringList modNameList;
1959 app->modules( modNameList, false );
1961 QMap<QString, QString> iconMap;
1962 app->moduleIconNames( iconMap );
1964 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
1966 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
1969 int modId = _prefs_->addPreference( *it );
1970 if ( iconMap.contains( *it ) )
1971 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
1975 app->modules( modList );
1976 QListIterator<CAM_Module*> itr( modList );
1977 while ( itr.hasNext() )
1979 LightApp_Module* mod = 0;
1981 CAM_Module* anItem = itr.next();
1982 if ( anItem->inherits( "LightApp_Module" ) )
1983 mod = (LightApp_Module*)anItem;
1985 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
1987 _prefs_->addPreference( mod->moduleName() );
1988 mod->createPreferences();
1989 that->emptyPreferences( mod->moduleName() );
1993 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
1999 Adds new module to application
2001 void LightApp_Application::moduleAdded( CAM_Module* mod )
2003 CAM_Application::moduleAdded( mod );
2005 LightApp_Module* lightMod = 0;
2006 if ( mod && mod->inherits( "LightApp_Module" ) )
2007 lightMod = (LightApp_Module*)mod;
2009 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2011 myPrefs->addPreference( mod->moduleName() );
2012 lightMod->createPreferences();
2013 emptyPreferences( mod->moduleName() );
2017 void LightApp_Application::emptyPreferences( const QString& modName )
2019 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2020 if ( !item || !item->isEmpty() )
2023 // printf( "---------------------> Modify for empty module.\n" );
2025 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2026 frm->setIcon( item->icon() );
2027 frm->setStretch( false );
2028 item->parentItem()->insertItem( frm, item );
2029 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2036 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2041 QStringList aValuesList;
2042 QList<QVariant> anIndicesList;
2046 // . Top-level "SALOME" preferences group <<start>>
2047 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2048 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2050 // .. "General" preferences tab <<start>>
2051 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2053 // ... "Language" group <<start>>
2054 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2055 pref->setItemProperty( "columns", 2, langGroup );
2056 // .... -> application language
2057 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2058 LightApp_Preferences::Selector, "language", "language" );
2059 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2060 QList<QVariant> aIcons;
2061 foreach ( QString aLang, aLangs ) {
2062 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2064 pref->setItemProperty( "strings", aLangs, curLang );
2065 pref->setItemProperty( "icons", aIcons, curLang );
2067 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2068 LightApp_Preferences::Bool, "language", "locale" );
2069 // ... "Language" group <<end>>
2071 // ... "Look and feel" group <<start>>
2072 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2073 pref->setItemProperty( "columns", 2, lookGroup );
2074 // .... -> show splash-screen
2075 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2076 // .... -> opaque resize
2077 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2078 // .... -> drop-down buttons
2079 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2080 // ... "Look and feel" group <<end>>
2082 // ... "Study properties" group <<start>>
2083 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2084 pref->setItemProperty( "columns", 2, studyGroup );
2085 // .... -> multi-file save
2086 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2087 // .... -> ascii save mode
2088 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2089 // .... -> store windows geometry
2090 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2091 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2092 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2093 // .... -> auto-save
2094 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2095 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2096 pref->setItemProperty( "min", 0, autoSaveInterval );
2097 pref->setItemProperty( "max", 1440, autoSaveInterval );
2098 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2099 // ... "Study properties" group <<end>>
2101 // ... "Help browser" group <<start>>
2102 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2104 QString platform = "winapplication";
2106 QString platform = "application";
2108 // .... -> browser application
2109 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2110 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2111 // .... -> browser parameters
2112 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2113 // ... "Help browser" group <<end>>
2115 // ... "Python console properties" group <<start>>
2116 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2118 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2119 // .... -> show banner
2120 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2121 // ... "Python console properties" group <<end>>
2123 // ... "MRU" preferences group <<start>>
2124 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2125 pref->setItemProperty( "columns", 4, mruGroup );
2126 // number of MRU items
2127 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2128 "MRU", "visible_count" );
2129 pref->setItemProperty( "min", 0, mruVisCount );
2130 pref->setItemProperty( "max", 100, mruVisCount );
2132 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2133 "MRU", "link_type" );
2134 aValuesList.clear();
2135 anIndicesList.clear();
2136 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2137 anIndicesList << 0 << 1 << 2 ;
2138 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2139 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2140 // ... "MRU" preferences group <<end>>
2141 // .. "General" preferences tab <<end>>
2143 // .. "3D viewer" group <<start>>
2144 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2145 // ... -> navigation mode
2146 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2147 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2148 aValuesList.clear();
2149 anIndicesList.clear();
2150 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2151 anIndicesList << 0 << 1;
2152 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2153 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2154 // ... -> zooming mode
2155 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2156 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2157 aValuesList.clear();
2158 anIndicesList.clear();
2159 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2160 anIndicesList << 0 << 1;
2161 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2162 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2163 // ... "Trihedron" group <<start>>
2164 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2165 pref->setItemProperty( "columns", 2, occTriGroup );
2166 // .... -> trihedron size
2167 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2168 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2169 pref->setItemProperty( "min", 1.0E-06, occTS );
2170 pref->setItemProperty( "max", 1000, occTS );
2171 // .... -> relative size of trihedron
2172 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2173 // .... -> show static trihedron
2174 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2175 // ... "Trihedron" group <<end>>
2176 // .. "3D viewer" group <<end>>
2180 #ifndef DISABLE_OCCVIEWER
2181 // .. "OCC viewer" group <<start>>
2182 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2184 // ... "Background" group <<start>>
2185 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2186 // pref->setItemProperty( "columns", 2, bgGroup );
2187 aValuesList.clear();
2188 anIndicesList.clear();
2190 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2191 foreach( int gid, idList ) anIndicesList << gid;
2192 // .... -> 3D viewer background
2193 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2194 LightApp_Preferences::Background, "OCCViewer", "background" );
2195 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2196 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2197 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2198 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2199 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2200 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2201 pref->setItemProperty( "custom_enabled", false, bgId );
2202 pref->setItemProperty( "image_formats", formats, bgId );
2203 // .... -> XZ viewer background
2204 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2205 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2206 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2207 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2208 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2209 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2210 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2211 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2212 pref->setItemProperty( "custom_enabled", false, bgId );
2213 pref->setItemProperty( "image_formats", formats, bgId );
2214 // .... -> YZ viewer background
2215 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2216 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2217 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2218 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2219 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2220 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2221 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2222 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2223 pref->setItemProperty( "custom_enabled", false, bgId );
2224 pref->setItemProperty( "image_formats", formats, bgId );
2225 // .... -> XY viewer background
2226 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2227 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2228 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2229 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2230 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2231 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2232 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2233 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2234 pref->setItemProperty( "custom_enabled", false, bgId );
2235 pref->setItemProperty( "image_formats", formats, bgId );
2236 // ... "Background" group <<end>>
2239 // ... "Selection" group <<start>>
2240 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2241 pref->setItemProperty( "columns", 2, occSelectionGroup );
2242 // .... -> enable preselection
2243 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2244 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2245 // .... -> enable selection
2246 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2247 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2248 // ... "Selection" group <<end>>
2250 // ... -> empty frame (for layout) <<start>>
2251 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2252 pref->setItemProperty( "margin", 0, occGen );
2253 pref->setItemProperty( "columns", 2, occGen );
2254 // ... -> empty frame (for layout) <<end>>
2255 // .. "OCC viewer" group <<end>>
2258 #ifndef DISABLE_VTKVIEWER
2259 // .. "VTK viewer" group <<start>>
2260 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2262 // ... -> empty frame (for layout) <<start>>
2263 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2264 //pref->setItemProperty( "columns", 2, vtkGen );
2265 // .... -> projection mode
2266 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2267 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2268 aValuesList.clear();
2269 anIndicesList.clear();
2270 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2271 anIndicesList << 0 << 1;
2272 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2273 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2274 // .... -> background
2275 aValuesList.clear();
2276 anIndicesList.clear();
2278 #ifndef DISABLE_SALOMEOBJECT
2279 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2281 foreach( int gid, idList ) anIndicesList << gid;
2282 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2283 LightApp_Preferences::Background, "VTKViewer", "background" );
2284 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2285 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2286 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2287 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2288 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2289 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2290 pref->setItemProperty( "custom_enabled", false, bgId );
2291 #ifndef DISABLE_SALOMEOBJECT
2292 pref->setItemProperty( "image_formats", formats, bgId );
2294 // .... -> speed increment
2295 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2296 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2297 pref->setItemProperty( "min", 1, vtkSpeed );
2298 pref->setItemProperty( "max", 1000, vtkSpeed );
2299 // .... -> speed mode
2300 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2301 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2302 aValuesList.clear();
2303 anIndicesList.clear();
2304 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2305 anIndicesList << 0 << 1;
2306 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2307 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2309 // ... "Selection" group <<start>>
2310 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2311 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2312 // .... -> preselection
2313 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2314 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2315 aValuesList.clear();
2316 anIndicesList.clear();
2317 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2318 anIndicesList << 0 << 1 << 2;
2319 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2320 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2321 // .... -> enable selection
2322 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2323 // ... "Selection" group <<end>>
2325 // ... -> empty frame (for layout) <<end>>
2327 // ... space mouse sub-group <<start>>
2328 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2329 //pref->setItemProperty( "columns", 2, vtkSM );
2330 // .... -> decrease speed increment
2331 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2332 LightApp_Preferences::Selector, "VTKViewer",
2333 "spacemouse_func1_btn" );
2334 // .... -> increase speed increment
2335 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2336 LightApp_Preferences::Selector, "VTKViewer",
2337 "spacemouse_func2_btn" );
2338 // .... -> dominant / combined switch
2339 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2340 LightApp_Preferences::Selector, "VTKViewer",
2341 "spacemouse_func5_btn" ); //
2342 aValuesList.clear();
2343 anIndicesList.clear();
2344 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2345 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2346 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2347 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2348 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2349 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2350 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2351 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2352 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2353 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2354 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2355 // ... space mouse sub-group <<end>>
2357 // ... avi recording sub-group <<start>>
2358 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2359 pref->setItemProperty( "columns", 2, vtkRec );
2360 // .... -> recording mode
2361 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2362 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2363 aValuesList.clear();
2364 anIndicesList.clear();
2365 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2366 anIndicesList << 0 << 1;
2367 pref->setItemProperty( "strings", aValuesList, modePref );
2368 pref->setItemProperty( "indexes", anIndicesList, modePref );
2370 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2371 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2372 pref->setItemProperty( "min", 0.1, fpsPref );
2373 pref->setItemProperty( "max", 100, fpsPref );
2375 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2376 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2377 pref->setItemProperty( "min", 1, qualityPref );
2378 pref->setItemProperty( "max", 100, qualityPref );
2379 // .... -> progressive mode
2380 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2381 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2382 // ... avi recording sub-group <<end>>
2384 // ... group names sub-group <<start>>
2385 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2386 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2387 pref->setItemProperty( "columns", 2, vtkGN );
2388 // .... -> text color
2389 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2390 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2391 // .... -> transparency
2392 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2393 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2394 pref->setItemProperty( "min", 0.0, transPref );
2395 pref->setItemProperty( "max", 1.0, transPref );
2396 pref->setItemProperty( "step", 0.1, transPref );
2397 // ... -> group names sub-group <<end>>
2398 // .. "VTK viewer" group <<end>>
2401 // .. "Plot2d viewer" group <<start>>
2402 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2403 //pref->setItemProperty( "columns", 2, plot2dGroup );
2405 // ... -> background
2406 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2407 LightApp_Preferences::Color, "Plot2d", "Background" );
2408 // ... -> selection color
2409 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2410 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2412 // ... "Viewer" group <<start>>
2413 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2415 // .... -> curve type
2416 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2417 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2418 aValuesList.clear();
2419 anIndicesList.clear();
2420 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2421 anIndicesList << 0 << 1 << 2 ;
2422 pref->setItemProperty( "strings", aValuesList, curveType );
2423 pref->setItemProperty( "indexes", anIndicesList, curveType );
2424 // .... -> marker size
2425 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2426 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2427 pref->setItemProperty( "min", 0, markerSize );
2428 pref->setItemProperty( "max", 100, markerSize );
2429 // .... -> horizontal scaling mode
2430 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2431 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2432 aValuesList.clear();
2433 anIndicesList.clear();
2434 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2435 anIndicesList << 0 << 1 ;
2436 pref->setItemProperty( "strings", aValuesList, horScale );
2437 pref->setItemProperty( "indexes", anIndicesList, horScale );
2438 // .... -> vertical scaling mode
2439 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2440 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2441 pref->setItemProperty( "strings", aValuesList, verScale );
2442 pref->setItemProperty( "indexes", anIndicesList, verScale );
2444 // .... -> errors/deviation colot
2445 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2446 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2447 // .... -> deviation markers line size
2448 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2449 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2450 pref->setItemProperty( "min", 1, deviationMarkerLw );
2451 pref->setItemProperty( "max", 5, deviationMarkerLw );
2452 // .... -> deviation markers tick mark size
2453 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2454 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2455 pref->setItemProperty( "min", 1, deviationMarkerTs );
2456 pref->setItemProperty( "max", 5, deviationMarkerTs );
2457 // .... "Viewer" group <<end>>
2459 // ... "Legend" group <<start>>
2460 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2462 // .... -> show legend
2463 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2464 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2465 // .... -> legend position
2466 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2467 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2468 aValuesList.clear();
2469 anIndicesList.clear();
2470 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2471 anIndicesList << 0 << 1 << 2 << 3 ;
2472 pref->setItemProperty( "strings", aValuesList, legendPosition );
2473 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2474 // .... -> Symbol type
2475 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2476 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2477 aValuesList.clear();
2478 anIndicesList.clear();
2479 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2480 anIndicesList << 0 << 1 ;
2481 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2482 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2483 // .... -> legend font
2484 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2485 // ... -> font color
2486 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2487 // ... -> selection font color
2488 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2489 // ... "Legend" group <<end>>
2491 // .. "Plot2d viewer" group <<end>>
2493 // .. "Directories" preferences tab <<start>>
2494 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2495 // ... --> quick directories list
2496 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2497 pref->addPreference( tr( "" ), dirGroup,
2498 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2499 // .. "Directories" preferences tab <<end>>
2501 // .. "Object browser" preferences tab <<start>>
2502 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2504 // ... "Search tool" group <<start>>
2505 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2506 // .... --> auto-hide
2507 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2508 "ObjectBrowser", "auto_hide_search_tool" );
2509 // ... "Search tool" group <<end>>
2511 // ... "Object browser settings" group <<start>>
2512 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2513 pref->setItemProperty( "columns", 2, objSetGroup );
2514 // .... -> auto size first column
2515 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2516 "ObjectBrowser", "auto_size_first" );
2517 // .... -> auto size other columns
2518 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2519 "ObjectBrowser", "auto_size" );
2520 // .... -> resize columns on expand item
2521 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2522 "ObjectBrowser", "resize_on_expand_item" );
2523 // .... -> browse to published object
2524 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2525 "ObjectBrowser", "browse_published_object" );
2526 aValuesList.clear();
2527 anIndicesList.clear();
2528 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2529 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2530 pref->setItemProperty( "strings", aValuesList, browsePublished );
2531 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2532 // ... "Object browser settings" group <<end>>
2533 // .. "Object browser" preferences tab <<end>>
2535 // .. "Shortcuts" preferences tab <<start>>
2536 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2537 // ... "Shortcuts settings" group <<start>>
2538 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2539 pref->addPreference( tr( "" ), shortcutGroup,
2540 LightApp_Preferences::ShortcutTree, "shortcuts" );
2541 // ... "Shortcuts settings" group <<end>>
2542 // .. "Shortcuts" preferences tab <<end>>
2543 // . Top-level "SALOME" preferences group <<end>>
2549 Changes appearance of application according to changed preferences
2550 \param sec - section
2551 \param param - name of changed parameter
2553 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
2555 SUIT_ResourceMgr* resMgr = resourceMgr();
2559 if ( sec == "viewers" && param == "drop_down_buttons" )
2561 ViewManagerList vmlist = viewManagers();
2562 foreach( SUIT_ViewManager* vm, vmlist )
2564 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
2565 foreach( SUIT_ViewWindow* vw, vwlist )
2566 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
2570 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
2572 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
2573 bool relative = resMgr->booleanValue( sec, "relative_size", true );
2574 QList<SUIT_ViewManager*> lst;
2575 #ifndef DISABLE_OCCVIEWER
2576 viewManagers( OCCViewer_Viewer::Type(), lst );
2577 QListIterator<SUIT_ViewManager*> itOCC( lst );
2578 while ( itOCC.hasNext() && sz >= 0 )
2580 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2581 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2584 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2585 occVM->setTrihedronSize( sz, relative );
2586 occVM->getAISContext()->UpdateCurrentViewer();
2589 #ifndef DISABLE_VTKVIEWER
2590 #ifndef DISABLE_SALOMEOBJECT
2591 viewManagers( SVTK_Viewer::Type(), lst );
2592 QListIterator<SUIT_ViewManager*> itVTK( lst );
2593 while ( itVTK.hasNext() && sz >= 0 )
2595 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2596 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2599 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2602 vtkVM->setTrihedronSize( sz, relative );
2610 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
2612 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
2613 QList<SUIT_ViewManager*> lst;
2614 #ifndef DISABLE_OCCVIEWER
2615 viewManagers( OCCViewer_Viewer::Type(), lst );
2616 QListIterator<SUIT_ViewManager*> itOCC( lst );
2617 while ( itOCC.hasNext() )
2619 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2620 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2623 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
2626 occVM->setStaticTrihedronDisplayed( isVisible );
2630 #ifndef DISABLE_VTKVIEWER
2631 #ifndef DISABLE_SALOMEOBJECT
2632 viewManagers( SVTK_Viewer::Type(), lst );
2633 QListIterator<SUIT_ViewManager*> itVTK( lst );
2634 while ( itVTK.hasNext() )
2636 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2637 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2640 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2643 vtkVM->setStaticTrihedronVisible( isVisible );
2651 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
2653 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
2654 QList<SUIT_ViewManager*> lst;
2655 #ifndef DISABLE_OCCVIEWER
2656 viewManagers( OCCViewer_Viewer::Type(), lst );
2657 QListIterator<SUIT_ViewManager*> itOCC( lst );
2658 while ( itOCC.hasNext() )
2660 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2661 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2664 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2665 occVM->setInteractionStyle( mode );
2668 #ifndef DISABLE_VTKVIEWER
2669 #ifndef DISABLE_SALOMEOBJECT
2670 viewManagers( SVTK_Viewer::Type(), lst );
2671 QListIterator<SUIT_ViewManager*> itVTK( lst );
2672 while ( itVTK.hasNext() )
2674 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2675 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2678 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2679 if( vtkVM ) vtkVM->setInteractionStyle( mode );
2685 #ifndef DISABLE_OCCVIEWER
2686 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
2688 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
2689 QList<SUIT_ViewManager*> lst;
2690 viewManagers( OCCViewer_Viewer::Type(), lst );
2691 QListIterator<SUIT_ViewManager*> it( lst );
2692 while ( it.hasNext() )
2694 SUIT_ViewModel* vm = it.next()->getViewModel();
2695 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2698 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2699 occVM->enablePreselection( isToEnablePreselection );
2704 #ifndef DISABLE_OCCVIEWER
2705 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
2707 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
2708 QList<SUIT_ViewManager*> lst;
2709 viewManagers( OCCViewer_Viewer::Type(), lst );
2710 QListIterator<SUIT_ViewManager*> it( lst );
2711 while ( it.hasNext() )
2713 SUIT_ViewModel* vm = it.next()->getViewModel();
2714 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2717 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2718 occVM->enableSelection( isToEnableSelection );
2723 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
2725 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
2726 QList<SUIT_ViewManager*> lst;
2727 #ifndef DISABLE_OCCVIEWER
2728 viewManagers( OCCViewer_Viewer::Type(), lst );
2729 QListIterator<SUIT_ViewManager*> itOCC( lst );
2730 while ( itOCC.hasNext() )
2732 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
2733 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
2736 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
2737 occVM->setZoomingStyle( mode );
2740 #ifndef DISABLE_VTKVIEWER
2741 #ifndef DISABLE_SALOMEOBJECT
2742 viewManagers( SVTK_Viewer::Type(), lst );
2743 QListIterator<SUIT_ViewManager*> itVTK( lst );
2744 while ( itVTK.hasNext() )
2746 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
2747 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2750 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2751 if( vtkVM ) vtkVM->setZoomingStyle( mode );
2757 #ifndef DISABLE_VTKVIEWER
2758 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
2760 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
2761 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
2762 QList<SUIT_ViewManager*> lst;
2763 #ifndef DISABLE_SALOMEOBJECT
2764 viewManagers( SVTK_Viewer::Type(), lst );
2765 QListIterator<SUIT_ViewManager*> it( lst );
2766 while ( it.hasNext() )
2768 SUIT_ViewModel* vm = it.next()->getViewModel();
2769 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2772 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2773 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
2779 #ifndef DISABLE_VTKVIEWER
2780 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
2782 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
2783 QList<SUIT_ViewManager*> lst;
2784 #ifndef DISABLE_SALOMEOBJECT
2785 viewManagers( SVTK_Viewer::Type(), lst );
2786 QListIterator<SUIT_ViewManager*> it( lst );
2787 while ( it.hasNext() )
2789 SUIT_ViewModel* vm = it.next()->getViewModel();
2790 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2793 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2794 if( vtkVM ) vtkVM->setProjectionMode( mode );
2800 #ifndef DISABLE_VTKVIEWER
2801 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
2803 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
2804 QList<SUIT_ViewManager*> lst;
2805 #ifndef DISABLE_SALOMEOBJECT
2806 viewManagers( SVTK_Viewer::Type(), lst );
2807 QListIterator<SUIT_ViewManager*> it( lst );
2808 while ( it.hasNext() )
2810 SUIT_ViewModel* vm = it.next()->getViewModel();
2811 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2814 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2815 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
2821 #ifndef DISABLE_VTKVIEWER
2822 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
2824 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
2825 QList<SUIT_ViewManager*> lst;
2826 #ifndef DISABLE_SALOMEOBJECT
2827 viewManagers( SVTK_Viewer::Type(), lst );
2828 QListIterator<SUIT_ViewManager*> it( lst );
2829 while ( it.hasNext() )
2831 SUIT_ViewModel* vm = it.next()->getViewModel();
2832 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2835 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2836 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
2842 #ifndef DISABLE_VTKVIEWER
2843 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
2844 param == QString( "spacemouse_func2_btn" ) ||
2845 param == QString( "spacemouse_func5_btn" ) ) )
2847 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
2848 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
2849 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
2850 QList<SUIT_ViewManager*> lst;
2851 #ifndef DISABLE_SALOMEOBJECT
2852 viewManagers( SVTK_Viewer::Type(), lst );
2853 QListIterator<SUIT_ViewManager*> it( lst );
2854 while ( it.hasNext() )
2856 SUIT_ViewModel* vm = it.next()->getViewModel();
2857 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
2860 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
2861 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
2866 if( sec=="ObjectBrowser" )
2868 SUIT_DataBrowser* ob = objectBrowser();
2872 if ( param=="auto_size_first" )
2874 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
2875 ob->setAutoSizeFirstColumn( autoSizeFirst );
2876 if ( autoSizeFirst )
2877 ob->adjustFirstColumnWidth();
2879 else if ( param=="auto_size" ) {
2880 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
2881 ob->setAutoSizeColumns(autoSize);
2883 ob->adjustColumnsWidth();
2885 else if ( param=="resize_on_expand_item" ) {
2886 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
2887 ob->setResizeOnExpandItem(resizeOnExpandItem);
2889 else if ( param == "auto_hide_search_tool" ) {
2890 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2896 if( param=="auto_save_interval" ) {
2897 myAutoSaveTimer->stop();
2898 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
2899 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
2903 #ifndef DISABLE_PYCONSOLE
2904 if( sec=="PyConsole" && pythonConsole() )
2906 if ( param=="font" ) {
2907 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2909 else if ( param=="show_banner" ) {
2910 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2917 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2919 if ( param == "visible_count" )
2920 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
2921 else if ( param == "max_count" )
2922 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
2923 else if ( param == "insert_mode" )
2924 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
2925 else if ( param == "link_type" )
2926 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
2927 else if ( param == "show_clear" )
2928 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2929 else if ( param == "show_mru" )
2930 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
2933 if ( sec == "language" && param == "language" )
2935 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
2937 if ( sec == "language" && param == "locale")
2939 SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
2941 if ( sec == "desktop" && param == "opaque_resize" ) {
2942 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
2943 QMainWindow::DockOptions dopts = desktop()->dockOptions();
2944 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
2945 else dopts &= ~QMainWindow::AnimatedDocks;
2946 desktop()->setDockOptions( dopts );
2947 desktop()->setOpaqueResize( opaqueResize );
2948 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
2949 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
2952 #ifndef DISABLE_PLOT2DVIEWER
2953 QList<SUIT_ViewManager*> lst;
2954 viewManagers( Plot2d_Viewer::Type(), lst );
2955 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
2956 while ( itPlot2d.hasNext() ) {
2957 SUIT_ViewManager* viewMgr = itPlot2d.next();
2958 SUIT_ViewModel* vm = viewMgr->getViewModel();
2959 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
2962 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
2964 viewMgr->setViewModel( vm );
2965 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
2967 Plot2d_ViewFrame* frame = wnd->getViewFrame();
2968 frame->SetPreference();
2977 void LightApp_Application::loadPreferences()
2979 CAM_Application::loadPreferences();
2981 SUIT_ResourceMgr* aResMgr = resourceMgr();
2986 static bool mru_load = true;
2989 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
2991 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
2992 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
2993 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
2994 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
2995 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
2996 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
2997 mru->loadLinks( aResMgr, "MRU" );
3003 QStringList mods = aResMgr->parameters( "windows_visibility" );
3004 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3007 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3008 myWinVis.insert( *itr, arr );
3012 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3013 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3014 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3015 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3016 else dopts &= ~QMainWindow::AnimatedDocks;
3017 desktop()->setDockOptions( dopts );
3018 desktop()->setOpaqueResize( opaqueResize );
3019 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3020 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3027 void LightApp_Application::savePreferences()
3029 CAM_Application::savePreferences();
3031 saveDockWindowsState();
3033 SUIT_ResourceMgr* aResMgr = resourceMgr();
3038 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3040 mru->saveLinks( aResMgr, "MRU" );
3042 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3043 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3046 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3048 #if GUI_DEVELOPMENT > 0
3049 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3051 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3058 Updates desktop title
3060 void LightApp_Application::updateDesktopTitle()
3062 QString aTitle = applicationName();
3063 QString aVer = applicationVersion();
3064 if ( !aVer.isEmpty() )
3065 aTitle += QString( " " ) + aVer;
3067 if ( activeStudy() ) {
3068 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3069 aTitle += QString( " - [%1]" ).arg( sName );
3072 desktop()->setWindowTitle( aTitle );
3076 \brief Get map of the operations which can be performed
3077 on the module activation.
3079 The method should return the map of the kind \c {<id>:<name>}
3080 where \c <id> is an integer identifier of the operation and
3081 \c <name> is a title for the button to be added to the
3082 dialog box. After user selects the required operation by the
3083 clicking the corresponding button in the dialog box, its identifier
3084 is passed to the moduleActionSelected() method to process
3087 \return map of the operations
3088 \sa moduleActionSelected()
3090 QMap<int, QString> LightApp_Application::activateModuleActions() const
3092 QMap<int, QString> opmap;
3093 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3094 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3099 \brief Called when the used selectes required operation chosen
3100 from "Activate module" dialog box.
3102 Performs the required operation according to the user choice.
3104 \param id operation identifier
3105 \sa activateModuleActions()
3107 void LightApp_Application::moduleActionSelected( const int id )
3122 Updates windows after close document
3124 void LightApp_Application::afterCloseDoc()
3128 CAM_Application::afterCloseDoc();
3132 Updates actions of active module
3134 void LightApp_Application::updateModuleActions()
3137 if ( activeModule() ) {
3138 modName = activeModule()->moduleName();
3139 if ( !isModuleAccessible( modName ) ) {
3140 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3141 foreach( SUIT_Application* app, apps ) {
3142 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3143 if ( lapp && lapp != this )
3144 lapp->removeModuleAction( modName );
3149 LightApp_ModuleAction* moduleAction =
3150 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3152 moduleAction->setActiveModule( modName );
3155 void LightApp_Application::removeModuleAction( const QString& modName )
3157 LightApp_ModuleAction* moduleAction =
3158 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3160 moduleAction->removeModule( modName );
3164 Gets current windows.
3165 \param winMap - output current windows map.
3167 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3170 if ( !activeStudy() )
3173 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3174 ((LightApp_Module*)activeModule())->windows( winMap );
3176 defaultWindows( winMap );
3180 Gets current view managers.
3181 \param lst - output current view managers list.
3183 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3186 if ( !activeStudy() )
3189 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3190 ((LightApp_Module*)activeModule())->viewManagers( lst );
3192 defaultViewManagers( lst );
3198 void LightApp_Application::updateWindows()
3200 QMap<int, int> winMap;
3201 currentWindows( winMap );
3203 if ( activeStudy() )
3205 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3207 if ( !dockWindow( it.key() ) )
3208 getWindow( it.key() );
3212 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3214 QWidget* wid = it.value();
3215 if ( activeStudy() )
3216 wid->setVisible( winMap.contains( it.key() ) );
3221 if ( activeStudy() )
3222 loadDockWindowsState();
3228 Updates view managers
3230 void LightApp_Application::updateViewManagers()
3233 currentViewManagers( lst );
3235 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3236 getViewManager( *it, true );
3240 Loads windows geometry
3242 void LightApp_Application::loadDockWindowsState()
3246 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3247 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3248 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3249 long version = Qtx::versionToId( aResMgr->stringValue( "salome", "version", "" ) );
3252 if ( activeModule() )
3253 modName = activeModule()->name();
3255 QtxResourceMgr::WorkingMode prevMode = aResMgr->workingMode();
3256 aResMgr->setWorkingMode(QtxResourceMgr::IgnoreUserValues);
3257 QByteArray aDefaultState;
3258 aResMgr->value("windows_geometry", modName , aDefaultState );
3259 QByteArray aDefaultVisibility;
3260 aResMgr->value("windows_visibility", modName , aDefaultVisibility );
3261 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3262 aResMgr->setWorkingMode(prevMode);
3264 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3267 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3269 if ( version > Qtx::versionToId( "7.4.1" ) )
3270 aResMgr->value( "windows_geometry", modName , arr );
3272 arr = aDefaultState;
3273 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3274 desktop()->restoreState( aTargetArray );
3277 QStringList mainToolbarsNames;
3278 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3279 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3280 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3282 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3285 QMap<QString, bool> *tbMap = 0;
3286 QMap<QString, bool> *dwMap = 0;
3288 QMap<QString, bool> userTbMap, userDwMap;
3289 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
3291 QMap<QString, bool> defaultTbMap, defaultDwMap;
3292 if(hasDefaultVisibility) {
3293 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
3299 if(hasDefaultVisibility){
3300 tbMap = &defaultTbMap;
3307 if(hasDefaultVisibility){
3308 dwMap = &defaultDwMap;
3313 QList<QToolBar*> tbList = findToolBars();
3314 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
3316 QToolBar* tb = *tit;
3317 if ( tbMap->contains( tb->objectName() ) ) {
3318 tb->setVisible( (*tbMap)[tb->objectName()] );
3324 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3325 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
3327 QDockWidget* dw = *dit;
3329 QObject* po = Qtx::findParent( dw, "QMainWindow" );
3330 if ( po != desktop() )
3333 if ( dwMap->contains( dw->objectName() ) )
3334 dw->setVisible( (*dwMap)[dw->objectName()] );
3342 Saves windows geometry
3344 void LightApp_Application::saveDockWindowsState()
3349 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
3350 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
3352 if( !storeWin && !storeTb )
3356 if ( activeModule() )
3357 modName = activeModule()->name();
3359 QByteArray arr = desktop()->saveState();
3360 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
3363 if ( myWinVis.contains( modName ) )
3364 visArr = myWinVis[modName];
3366 QMap<QString, bool> tbMap, dwMap;
3367 dockWindowsState( visArr, tbMap, dwMap );
3369 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
3370 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
3373 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
3376 QList<QDockWidget*> dwList = qFindChildren<QDockWidget*>( desktop() );
3377 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
3379 QDockWidget* wid = *it;
3380 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
3383 visArr = dockWindowsState( tbMap, dwMap );
3385 myWinVis.insert( modName, visArr );
3388 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
3391 QDataStream stream( &visArr, QIODevice::WriteOnly );
3393 stream << (uchar)ToolBarMarker;
3394 stream << tb.size();
3395 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
3397 stream << tit.key();
3398 stream << (uchar)( tit.value() ? 1 : 0 );
3401 stream << (uchar)DockWidgetMarker;
3402 stream << dw.size();
3403 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
3405 stream << wit.key();
3406 stream << (uchar)( wit.value() ? 1 : 0 );
3412 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
3417 QByteArray visArr = arr;
3418 QDataStream stream( &visArr, QIODevice::ReadOnly );
3422 if ( marker != ToolBarMarker )
3427 for ( int i = 0; i < lines; ++i )
3430 stream >> objectName;
3433 tb.insert( objectName, shown );
3437 if ( marker != DockWidgetMarker )
3441 for ( int j = 0; j < lines; ++j )
3444 stream >> objectName;
3447 dw.insert( objectName, shown );
3452 Adds icon names for modules
3454 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
3458 SUIT_ResourceMgr* resMgr = resourceMgr();
3462 QStringList modList;
3463 modules( modList, false );
3465 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
3467 QString modName = *it;
3468 QString modIntr = moduleName( modName );
3469 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
3471 if ( modIcon.isEmpty() )
3474 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
3475 modIcon += QString( ".png" );
3477 iconMap.insert( modName, modIcon );
3482 Inserts items in popup, which necessary for current application
3484 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
3487 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
3488 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
3489 selMgr->setSelectionCacheEnabled( true );
3491 SUIT_DataBrowser* ob = objectBrowser();
3493 CAM_Application::contextMenuPopup( type, thePopup, title );
3495 if ( ob && type == ob->popupClientType() ) {
3496 thePopup->addSeparator();
3497 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
3498 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
3499 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
3502 #ifndef DISABLE_SALOMEOBJECT
3503 if ( selMgr && ob ) {
3504 SALOME_ListIO selected;
3505 selMgr->selectedObjects( selected );
3506 if(selected.Extent() == 1){
3507 Handle(SALOME_InteractiveObject) anIObject = selected.First();
3508 SUIT_DataObject* obj = findObject(anIObject->getEntry());
3509 if(obj && obj->renameAllowed()) {
3510 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
3511 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
3512 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
3513 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
3515 QList<QAction*> acts = thePopup->actions();
3516 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
3517 thePopup->insertAction(firstAction,a);
3523 selMgr->setSelectionCacheEnabled( cacheIsOn );
3529 void LightApp_Application::createEmptyStudy()
3531 CAM_Application::createEmptyStudy();
3533 if ( objectBrowser() )
3534 objectBrowser()->updateTree();
3536 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3537 if ( aResMgr && activeStudy() ) {
3538 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
3539 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3544 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
3546 CAM_Application::setDesktop( desk );
3549 connect( desk, SIGNAL( message( const QString& ) ),
3550 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
3551 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
3552 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
3558 \param mod - module to be activated
3560 bool LightApp_Application::activateModule( CAM_Module* mod )
3562 bool res = CAM_Application::activateModule( mod );
3564 if ( objectBrowser() )
3565 objectBrowser()->updateTree();
3571 \return keyborad accelerators manager object
3573 SUIT_Accel* LightApp_Application::accel() const
3579 Removes dead widget container from map
3581 void LightApp_Application::onWCDestroyed( QObject* ob )
3583 // remove destroyed widget container from windows map
3584 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
3586 if ( itr.value() != ob )
3589 int key = itr.key();
3590 myWin.remove( key );
3595 void LightApp_Application::onMRUActivated( const QString& name )
3597 SUIT_Session* s = SUIT_Session::session();
3598 if ( s && s->activeApplication() == this )
3602 void LightApp_Application::onStylePreferences()
3604 Style_PrefDlg dlg( desktop() );
3607 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
3610 void LightApp_Application::onFullScreen(){
3611 if(myScreenHelper) {
3612 if(desktop()->isFullScreen())
3613 myScreenHelper->switchToNormalScreen();
3615 myScreenHelper->switchToFullScreen();
3620 Connects just added view manager
3622 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
3624 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3625 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3626 CAM_Application::addViewManager( vm );
3630 Remove view manager from memory
3632 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
3634 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
3635 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
3636 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
3638 aStudy->removeViewMgr(vm->getGlobalId());
3640 CAM_Application::removeViewManager( vm );
3642 LightApp_SelectionMgr* selMgr = selectionMgr();
3643 QList<SUIT_Selector*> selectors;
3644 selMgr->selectors( selectors );
3645 foreach( SUIT_Selector* selector, selectors ) {
3646 if ( selector->owner() == vm->getViewModel() ) {
3651 // IPAL22894: Crash on closing OCC view
3657 Renames active window of desktop
3659 void LightApp_Application::onRenameWindow()
3664 QWidget* w = desktop()->activeWindow();
3669 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
3670 if( ok && !name.isEmpty() )
3671 w->setWindowTitle( name );
3675 Closes active window of desktop
3677 void LightApp_Application::onCloseWindow()
3682 QWidget* w = desktop()->activeWindow();
3690 Closes all windows of desktop
3692 void LightApp_Application::onCloseAllWindow()
3694 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3698 QList<SUIT_ViewWindow*> wndList = desk->windows();
3699 SUIT_ViewWindow* wnd;
3700 foreach( wnd, wndList )
3708 Groups all windows of desktop
3710 void LightApp_Application::onGroupAllWindow()
3712 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
3716 QtxWorkstack* wgStack = desk->workstack();
3722 \return if the library of module exists
3723 \param moduleTitle - title of module
3725 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
3727 if( moduleTitle.isEmpty() )
3730 QString lib = moduleLibrary( moduleTitle );
3732 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
3733 bool isPythonModule = lib.contains("SalomePyQtGUI");
3734 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
3738 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3740 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
3743 bool isLibFound = false;
3744 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3745 for( ; anIt!=aLast; anIt++ )
3747 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
3758 INFOS( "\n****************************************************************" << std::endl
3759 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
3760 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
3761 << "****************************************************************" << std::endl );
3763 else if ( !isPythonModule && !isPythonLightModule)
3766 if ( isPythonModule || isPythonLightModule)
3768 QString pylib = moduleName( moduleTitle ) + QString(".py");
3769 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
3771 // Check the python library
3773 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
3775 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
3777 bool isPyLib = false, isPyGuiLib = false;
3778 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
3779 for( ; anIt!=aLast; anIt++ )
3781 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
3782 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
3784 if(!isPythonLightModule)
3785 if( !isPyLib && inf.exists() )
3788 if( !isPyGuiLib && infgui.exists() )
3791 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
3795 printf( "\n****************************************************************\n" );
3796 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
3798 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
3800 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
3801 printf( "****************************************************************\n" );
3808 \return default name for an active study
3810 void LightApp_Application::setDefaultStudyName( const QString& theName )
3812 QStringList anInfoList;
3813 modules( anInfoList, false );
3815 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
3816 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
3817 !aStudy->isSaved() )
3819 aStudy->setStudyName( theName );
3820 updateDesktopTitle();
3825 Custom event handler
3827 bool LightApp_Application::event( QEvent* e )
3829 if( e && e->type()==2000 )
3831 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
3832 QString* d = ( QString* )ce->data();
3833 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
3835 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
3836 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
3837 showPreferences( tr( "PREF_APP" ) );
3842 return CAM_Application::event( e );
3845 /*! Check data object */
3846 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
3850 bool isSuitable = !theObj->entry().isEmpty() &&
3851 !theObj->componentDataType().isEmpty() &&
3852 !theObj->name().isEmpty();
3859 int LightApp_Application::openChoice( const QString& aName )
3861 int choice = CAM_Application::openChoice( aName );
3863 if ( choice == OpenExist ) // The document is already open.
3865 // Do you want to reload it?
3866 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
3867 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
3868 choice = OpenReload;
3874 bool LightApp_Application::openAction( const int choice, const QString& aName )
3881 STD_Application* app = 0;
3882 SUIT_Session* session = SUIT_Session::session();
3883 QList<SUIT_Application*> appList = session->applications();
3884 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
3886 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
3887 app = ::qobject_cast<STD_Application*>( *it );
3892 app->onCloseDoc( false );
3893 appList = session->applications();
3894 STD_Application* other = 0;
3895 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
3896 other = ::qobject_cast<STD_Application*>( *it );
3899 res = other->onOpenDoc( aName );
3904 res = CAM_Application::openAction( choice, aName );
3911 QStringList LightApp_Application::viewManagersTypes() const
3913 QStringList aTypesList;
3914 aTypesList += myUserWmTypes;
3915 #ifndef DISABLE_GLVIEWER
3916 aTypesList<<GLViewer_Viewer::Type();
3918 #ifndef DISABLE_PLOT2DVIEWER
3919 aTypesList<<Plot2d_Viewer::Type();
3921 #ifndef DISABLE_QXGRAPHVIEWER
3922 aTypesList<<QxScene_Viewer::Type();
3924 #ifndef DISABLE_OCCVIEWER
3925 aTypesList<<OCCViewer_Viewer::Type();
3927 #ifndef DISABLE_VTKVIEWER
3928 #ifndef DISABLE_SALOMEOBJECT
3929 aTypesList<<SVTK_Viewer::Type();
3931 aTypesList<<VTKViewer_Viewer::Type();
3937 * Removes all view managers of known types
3938 * Other view managers are ignored
3940 void LightApp_Application::clearKnownViewManagers()
3942 QStringList aTypesList = viewManagersTypes();
3943 QList<SUIT_ViewManager*> aMgrList;
3944 viewManagers( aMgrList );
3945 foreach (SUIT_ViewManager* aMgr, aMgrList) {
3946 if (aTypesList.contains(aMgr->getType()))
3947 removeViewManager(aMgr);
3952 Copy of current selection
3954 void LightApp_Application::onCopy()
3956 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3962 Paste of current data in clipboard
3964 void LightApp_Application::onPaste()
3966 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
3972 Browse (i.e. set focus on) the published objects
3973 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
3974 has been accepted by Ok (or Apply & Close) button
3975 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
3976 (to select the first published object only)
3977 \return entry of the selected object
3979 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
3980 const bool theIsApplyAndClose,
3981 const bool theIsOptimizedBrowsing )
3984 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
3986 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
3987 switch( aBrowsePolicy )
3991 case BP_ApplyAndClose:
3992 if( !theIsApplyAndClose )
4000 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4004 SUIT_DataBrowser* anOB = objectBrowser();
4008 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4012 QStringListIterator anIter( theEntryList );
4013 if( theIsOptimizedBrowsing )
4015 // go to the last entry
4017 if( anIter.hasPrevious() )
4021 // scroll to each entry in the list
4022 // (in optimized mode - to the last entry only)
4024 LightApp_DataObject* anObject = 0;
4025 while( anIter.hasNext() )
4027 anEntry = anIter.next();
4028 if( !anEntry.isEmpty() )
4030 anObject = aStudy->findObjectByEntry( anEntry );
4033 QModelIndex anIndex = aModel->index( anObject );
4034 anOB->treeView()->scrollTo( anIndex );
4039 // always select the last object
4040 if( anObject && !anEntry.isEmpty() )
4042 QList<SUIT_Selector*> aSelectorList;
4043 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4044 if( !aSelectorList.isEmpty() )
4046 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4048 bool anIsAutoBlock = aSelector->autoBlock();
4050 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4051 aSelector->setAutoBlock( false );
4053 SUIT_DataOwnerPtrList aList;
4054 #ifndef DISABLE_SALOMEOBJECT
4055 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4056 ( anObject->entry().toLatin1().constData(),
4057 anObject->componentDataType().toLatin1().constData(),
4058 anObject->name().toLatin1().constData() );
4059 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4061 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4064 aList.append( owner );
4065 selectionMgr()->setSelected( aList );
4068 // restore auto block flag
4069 aSelector->setAutoBlock( anIsAutoBlock );
4077 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4079 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4080 return study ? study->findObjectByEntry( id ) : 0;
4084 Checks that an object can be renamed.
4085 \param entry entry of the object
4086 \brief Return \c true if object can be renamed
4088 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4093 Rename object by entry.
4094 \param entry entry of the object
4095 \param name new name of the object
4096 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4098 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4102 /*! Process standard messages from desktop */
4103 void LightApp_Application::onDesktopMessage( const QString& message )
4105 const QString sectionSeparator = "/";
4107 if ( message.toLower() == "updateobjectbrowser" ||
4108 message.toLower() == "updateobjbrowser" ) {
4109 // update object browser
4110 updateObjectBrowser();
4113 QStringList data = message.split( sectionSeparator );
4114 if ( data.count() > 1 ) {
4115 QString msgType = data[0].trimmed();
4116 LightApp_Module* sMod = 0;
4117 CAM_Module* mod = module( msgType );
4119 mod = module( moduleTitle( msgType ) );
4120 if ( mod && mod->inherits( "LightApp_Module" ) )
4121 sMod = (LightApp_Module*)mod;
4123 if ( msgType.toLower() == "preferences" ) {
4124 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4125 // for example "preferences/Study/multi_file_dump/true"
4126 if ( data.count() > 3 ) {
4127 QString section = data[1].trimmed();
4128 QString param = data[2].trimmed();
4129 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4130 resourceMgr()->setValue( section, param, value );
4134 // received message for the module
4135 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4136 sMod->message( msg );
4144 Returns all top level toolbars.
4145 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4147 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4149 QList<QToolBar*> aResult;
4150 QList<QToolBar*> tbList = qFindChildren<QToolBar*>( desktop() );
4151 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4152 QToolBar* tb = *tit;
4153 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4154 if ( po != desktop() )
4156 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4163 Internal method to parse toolbars and dockable windows state.
4165 QByteArray LightApp_Application::processState(QByteArray& input,
4166 const bool processWin,
4167 const bool processTb,
4168 const bool isRestoring,
4169 QByteArray defaultState) {
4172 bool hasDefaultState = !defaultState.isEmpty();
4173 bool isDockWinWriten = false;
4175 //Write date from users settings
4177 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4178 int marker, version;
4180 tmpInputData >> marker;
4181 tmpInputData >> version;
4182 tmpInputData >> dockmarker;
4183 tmpInputData >> nbDocWin;
4185 if(processWin && processTb && !isRestoring) {
4187 } else if(!processWin && !processTb ) {
4189 aRes = defaultState;
4191 QDataStream aData(&aRes, QIODevice::WriteOnly);
4192 QList<QToolBar*> aToolBars = findToolBars();
4195 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4196 QToolBar* tb = *tit;
4197 aNames.append(tb->objectName());
4200 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4201 if(toolBarMarkerIndex < 0)
4203 QDataStream anInputData(&input, QIODevice::ReadOnly);
4205 int toolBarMarkerIndexDef;
4206 if(hasDefaultState) {
4207 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4208 if(toolBarMarkerIndexDef < 0)
4211 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4213 QDataStream* aTargetData = 0;
4214 int aTargetIndex = -1;
4216 QByteArray currentArr = desktop()->saveState();
4217 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4218 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4219 if(processWin && useInputData) {
4220 aTargetData = &anInputData;
4221 aTargetIndex = toolBarMarkerIndex;
4223 //Write date from default settings
4224 if(hasDefaultState) {
4225 aTargetData = &anInputDataDef;
4226 aTargetIndex = toolBarMarkerIndexDef;
4228 //If no default state, write current snapshot of the dockable windows
4230 aTargetData = &anInputDataCur;
4231 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4232 aTargetIndex = toolBarMarkerIndexCur;
4237 if(aTargetData && aTargetIndex >= 0 ) {
4238 aTargetData->device()->seek(0);
4239 while( aTargetData->device()->pos() < aTargetIndex ) {
4244 isDockWinWriten = true;
4251 aTargetData = &anInputData;
4252 aTargetIndex = toolBarMarkerIndex;
4254 if(hasDefaultState) {
4255 aTargetData = &anInputDataDef;
4256 aTargetIndex = toolBarMarkerIndexDef;
4260 if(aTargetData && aTargetIndex >= 0) {
4262 if(!isDockWinWriten ) {
4263 //Write version marker
4264 int marker, version;
4265 aTargetData->device()->seek(0);
4266 *aTargetData >> marker;
4267 *aTargetData >> version;
4270 aData << (uchar) QDockWidgetMarker;
4272 int shift = 4*sizeof(int) + sizeof(QSize);
4273 index = aTargetIndex - shift;
4275 index = aTargetIndex;
4278 aTargetData->device()->seek(index);
4279 while(!aTargetData->atEnd()) {
4284 } else { // Not treat toolbars
4285 aData << (uchar) QToolBarMarker;
4286 aData << (int) 0; //Nb toolbars = 0
4293 \brief Emits operationFinished signal.
4294 \param theModuleName the name of the module which perfomed the operation
4295 \param theOperationName the operation name
4296 \param theEntryList the list of the created objects entries
4298 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
4299 const QString& theOperationName,
4300 const QStringList& theEntryList )
4302 emit operationFinished( theModuleName, theOperationName, theEntryList );
4306 Update visibility state of given objects
4308 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
4309 SUIT_ViewModel* theViewModel )
4311 if ( !theViewModel || theList.isEmpty() ) return;
4313 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4314 if ( !aStudy ) return;
4316 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
4318 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
4319 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
4321 if ( !obj || aStudy->isComponent( obj->entry() ) )
4324 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
4325 if ( anObjModule ) {
4326 LightApp_Displayer* aDisplayer = anObjModule->displayer();
4328 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
4329 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
4330 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
4331 anObjState = Qtx::ShownState;
4333 anObjState = Qtx::HiddenState;
4335 aStudy->setVisibilityState( obj->entry(), anObjState );
4342 * Called when window activated
4344 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
4346 SUIT_DataBrowser* anOB = objectBrowser();
4349 SUIT_DataObject* rootObj = anOB->root();
4353 DataObjectList listObj = rootObj->children( true );
4355 SUIT_ViewModel* vmod = 0;
4356 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
4357 vmod = vman->getViewModel();
4358 updateVisibilityState( listObj, vmod );
4362 Called then view manager removed
4364 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
4366 ViewManagerList lst;
4367 viewManagers( lst );
4368 if ( lst.count() == 1) { // in case if closed last view window
4369 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4371 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
4376 Check existing document.
4378 bool LightApp_Application::checkExistingDoc() {