1 // Copyright (C) 2007-2016 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_PyEditor.h"
39 #include "PyConsole_Interp.h"
40 #include "PyConsole_Console.h"
43 #include "LightApp_Application.h"
44 #include "LightApp_Module.h"
45 #include "LightApp_DataModel.h"
46 #include "LightApp_DataOwner.h"
47 #include "LightApp_Displayer.h"
48 #include "LightApp_Study.h"
49 #include "LightApp_Preferences.h"
50 #include "LightApp_PreferencesDlg.h"
51 #include "LightApp_ModuleDlg.h"
52 #include "LightApp_AboutDlg.h"
53 #include "LightApp_ModuleAction.h"
54 // temporary commented
55 #include "LightApp_EventFilter.h"
56 #include "LightApp_OBSelector.h"
57 #include "LightApp_SelectionMgr.h"
58 #include "LightApp_DataObject.h"
59 #include "LightApp_WgViewModel.h"
60 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
64 #include <SALOME_Event.h>
66 #ifdef USE_SALOME_STYLE
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
69 #endif // USE_SALOME_STYLE
71 #include <CAM_Module.h>
72 #include <CAM_DataModel.h>
73 #include <CAM_Study.h>
74 #include <STD_TabDesktop.h>
76 #include <SUIT_DataBrowser.h>
77 #include <SUIT_Session.h>
78 #include <SUIT_Study.h>
79 #include <SUIT_FileDlg.h>
80 #include <SUIT_ResourceMgr.h>
81 #include <SUIT_ShortcutMgr.h>
82 #include <SUIT_Tools.h>
83 #include <SUIT_Accel.h>
84 #include <SUIT_MessageBox.h>
85 #include <SUIT_ViewWindow.h>
88 #include <QtxFontEdit.h>
89 #include <QtxToolBar.h>
90 #include <QtxTreeView.h>
91 #include <QtxMRUAction.h>
92 #include <QtxDockAction.h>
93 #include <QtxDockWidget.h>
94 #include <QtxActionToolMgr.h>
95 #include <QtxSearchTool.h>
96 #include <QtxWorkstack.h>
99 #include <LogWindow.h>
101 #ifndef DISABLE_GLVIEWER
102 #include <GLViewer_Viewer.h>
103 #include <GLViewer_ViewManager.h>
104 #include "LightApp_GLSelector.h"
107 #ifndef DISABLE_PLOT2DVIEWER
108 #include <Plot2d_ViewManager.h>
109 #include <Plot2d_ViewModel.h>
110 #include <Plot2d_ViewWindow.h>
111 #include <Plot2d_ViewFrame.h>
112 #include "LightApp_Plot2dSelector.h"
113 #ifndef DISABLE_SALOMEOBJECT
114 #include <SPlot2d_ViewModel.h>
116 #include <Plot2d_ViewModel.h>
120 #ifndef DISABLE_OCCVIEWER
121 #include <OCCViewer_ViewManager.h>
122 #include <OCCViewer_ViewFrame.h>
123 #include <OCCViewer_ViewPort3d.h>
124 #ifndef DISABLE_SALOMEOBJECT
125 #include <SOCC_ViewModel.h>
127 #include <OCCViewer_ViewModel.h>
129 #include "LightApp_OCCSelector.h"
132 #ifndef DISABLE_VTKVIEWER
133 #ifndef DISABLE_SALOMEOBJECT
134 #include <SVTK_ViewModel.h>
135 #include <SVTK_ViewManager.h>
136 #include "LightApp_VTKSelector.h"
138 #include <VTKViewer_ViewModel.h>
139 #include <VTKViewer_ViewManager.h>
141 #include <VTKViewer_ViewModel.h>
144 #ifndef DISABLE_QXGRAPHVIEWER
145 #include <QxScene_ViewManager.h>
146 #include <QxScene_ViewModel.h>
147 #include <QxScene_ViewWindow.h>
150 #ifndef DISABLE_GRAPHICSVIEW
151 #include "GraphicsView_Viewer.h"
152 #include "GraphicsView_ViewManager.h"
153 #include "LightApp_GVSelector.h"
156 #ifndef DISABLE_PVVIEWER
157 #include "PVViewer_ViewManager.h"
158 #include "PVViewer_ViewWindow.h"
159 #include "PVViewer_ViewModel.h"
162 #ifndef DISABLE_PYVIEWER
163 #include <PyViewer_ViewManager.h>
164 #include <PyViewer_ViewModel.h>
165 #include <PyViewer_ViewWindow.h>
169 #define VISIBILITY_COLUMN_WIDTH 25
175 #include <QStringList>
177 #include <QApplication>
179 #include <QStatusBar>
181 #include <QObjectList>
183 #include <QInputDialog>
184 #include <QFontDatabase>
186 #include <QByteArray>
190 #include <QHeaderView>
195 #include <utilities.h>
197 #define FIRST_HELP_ID 1000000
199 #ifndef DISABLE_SALOMEOBJECT
200 #include <SALOME_InteractiveObject.hxx>
201 #include <SALOME_ListIO.hxx>
204 #include <Standard_Version.hxx>
206 #define ToolBarMarker 0
207 #define DockWidgetMarker 1
209 static const char* imageEmptyIcon[] = {
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "....................",
231 "...................."};
233 int LightApp_Application::lastStudyId = 0;
235 // Markers used to parse array with dockable windows and toolbars state.
236 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
237 // in the Qt source code.
239 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
240 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
242 // Format of the Byte array with the windows and toolbar state is:
243 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
245 //Find toolbar marker position in the array in the following way:
246 //since the 'toolbar marker' is not unique, find index of first occurrence of the
247 //'toolbar marker' in the array and check that next string is name of the toolbar
251 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
252 int aResult = -1,tmp = 0;
253 int inputLen = input.length();
254 QDataStream anInputData( &input, QIODevice::ReadOnly );
255 while ( tmp < inputLen ) {
256 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
259 anInputData.device()->seek( tmp );
263 anInputData >> lines;
265 if ( lines == 0 && anInputData.atEnd() ) {
266 //Case then array doesn't contain information about toolbars,
277 if ( aFlags.contains( str ) ) {
285 QString langToName( const QString& lang )
287 // special processing for English language to avoid such result as "American English"
288 // as Qt cannot just say "English"
293 result = QLocale( lang ).nativeLanguageName();
299 \return last global id of study
301 int LightApp_Application::studyId()
303 return LightApp_Application::lastStudyId;
306 /*!Create new instance of LightApp_Application.*/
307 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
309 return new LightApp_Application();
312 /*! \var global preferences of LightApp */
313 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
317 \class LightApp_Application
318 Application containing LightApp module
322 LightApp_Application::LightApp_Application()
323 : CAM_Application( false ),
325 myScreenHelper(new LightApp_FullScreenHelper())
327 Q_INIT_RESOURCE( LightApp );
329 STD_TabDesktop* desk = new STD_TabDesktop();
330 desk->setFullScreenAllowed(false);
331 desk->setMinimizeAllowed(false);
335 // initialize auto save timer
336 myAutoSaveTimer = new QTimer( this );
337 myAutoSaveTimer->setSingleShot( true );
338 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
340 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
342 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
343 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
345 desktop()->setWindowIcon( aLogo );
346 desktop()->setDockableMenuBar( false );
347 desktop()->setDockableStatusBar( false );
349 // base logo (salome itself)
350 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
351 // extra logo (salome-based application)
352 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
356 mySelMgr = new LightApp_SelectionMgr( this );
358 myAccel = SUIT_Accel::getAccel();
360 #ifndef DISABLE_OCCVIEWER
361 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
374 #ifndef DISABLE_VTKVIEWER
375 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
386 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
388 #ifndef DISABLE_PLOT2DVIEWER
389 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
395 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
396 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
399 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
400 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
401 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
402 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
403 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
406 // Set existing font for the python console in resources
407 if( !aResMgr->hasValue( "PyConsole", "font" ) )
410 QFont f = aResMgr->fontValue( "PyConsole", "font" );
412 QStringList famdb = fdb.families();
414 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
417 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
419 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
422 if ( famdb.contains(aFamily) )
424 f.setFamily( aFamily );
425 aResMgr->setValue( "PyConsole", "font", f );
432 *\li Save window geometry.
433 *\li Save desktop geometry.
434 *\li Save resource maneger.
435 *\li Delete selection manager.
437 LightApp_Application::~LightApp_Application()
441 delete myScreenHelper;
444 /*!Start application.*/
445 void LightApp_Application::start()
447 CAM_Application::start();
450 updateViewManagers();
451 updateCommandsStatus();
454 desktop()->statusBar()->showMessage( "" );
456 LightApp_EventFilter::Init();
459 /*!Closeapplication.*/
460 void LightApp_Application::closeApplication()
462 #ifndef DISABLE_QTXWEBBROWSER
463 QProcess::startDetached( "HelpBrowser",
464 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
466 CAM_Application::closeApplication();
469 /*!Gets application name.*/
470 QString LightApp_Application::applicationName() const
472 static QString _app_name;
473 if ( _app_name.isEmpty() )
474 _app_name = tr( "APP_NAME" );
478 /*!Gets application version.*/
479 QString LightApp_Application::applicationVersion() const
481 static QString _app_version;
483 if ( _app_version.isEmpty() )
485 QString resVersion = tr( "APP_VERSION" );
486 if ( resVersion != "APP_VERSION" )
488 _app_version = resVersion;
492 _app_version = GUI_VERSION_STR;
498 /*!Load module by \a name.*/
499 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
501 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
504 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
505 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
506 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
511 /*!Activate module by \a modName*/
512 bool LightApp_Application::activateModule( const QString& modName )
515 CAM_Module* prevMod = activeModule();
518 actName = prevMod->moduleName();
520 if ( actName == modName )
523 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
525 saveDockWindowsState();
527 bool status = CAM_Application::activateModule( modName );
529 updateModuleActions();
537 updateViewManagers();
539 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
540 if ( objectBrowser()->root() != activeStudy()->root() )
541 objectBrowser()->setRoot( activeStudy()->root() );
542 updateObjectBrowser( true );
545 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
550 /*!Gets selection manager.*/
551 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
556 /*!Creat action "New window" for certain type of viewer:*/
557 void LightApp_Application::createActionForViewer( const int id,
559 const QString& suffix,
562 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
563 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
564 QAction* a = createAction( id, // menu action id
571 false, // toggle flag
573 SLOT( onNewWindow() ) ); // slot
574 createMenu( a, parentId, -1 );
579 void LightApp_Application::createActions()
581 CAM_Application::createActions();
583 SUIT_Desktop* desk = desktop();
584 SUIT_ResourceMgr* resMgr = resourceMgr();
587 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
588 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
589 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
593 // - Help for modules
595 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
596 createMenu( separator(), helpMenu, -1, 10 );
597 QStringList aModuleList;
598 modules( aModuleList, false );
599 aModuleList.prepend( "GUI" );
600 aModuleList.prepend( "KERNEL" );
602 int id = LightApp_Application::UserID + FIRST_HELP_ID;
605 foreach( aModule, aModuleList ) {
606 if ( aModule.isEmpty() ) // module title (user name)
608 IMap <QString, QString> helpData; // list of help files for the module
609 QString helpSubMenu; // help submenu name (empty if not needed)
610 QString modName = moduleName( aModule ); // module name
611 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
612 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
613 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
615 if (resMgr->hasValue( modName, "documentation" ) )
616 docSection = resMgr->stringValue(modName, "documentation");
617 else if ( resMgr->hasSection( modName + "_documentation" ) )
618 docSection = modName + "_documentation";
619 if ( !docSection.isEmpty() ) {
620 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
621 QStringList listOfParam = resMgr->parameters( docSection );
622 foreach( QString paramName, listOfParam ) {
623 QString valueStr = resMgr->stringValue( docSection, paramName );
624 if ( !valueStr.isEmpty() ) {
625 QFileInfo fi( valueStr );
626 if ( fi.isRelative() && !modDir.isEmpty() )
627 valueStr = Qtx::addSlash( modDir ) + valueStr;
628 if ( QFile::exists( valueStr ) )
629 helpData.insert( paramName.arg( aModule ), valueStr );
634 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
635 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
636 QString indexFile = idxLst.join( QDir::separator() ); // index file
637 if ( QFile::exists( indexFile ) )
638 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
641 IMapConstIterator<QString, QString > fileIt;
642 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
643 QString helpFileName = fileIt.key();
644 // remove all '//' occurances
645 while ( helpFileName.contains( "//" ) )
646 helpFileName.replace( "//", "" );
647 // obtain submenus hierarchy if given
648 QStringList smenus = helpFileName.split( "/" );
649 helpFileName = smenus.last();
651 QAction* a = createAction( id, helpFileName,
652 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
653 helpFileName, helpFileName,
654 0, desk, false, this, SLOT( onHelpContentsModule() ) );
655 a->setData( fileIt.value() );
656 if ( !helpSubMenu.isEmpty() ) {
657 smenus.prepend( helpSubMenu );
659 // create sub-menus hierarchy
660 int menuId = helpMenu;
661 foreach ( QString subMenu, smenus ) {
662 menuId = createMenu( subMenu, menuId, -1, 0 );
664 createMenu( a, menuId, -1, 0 );
669 // - Additional help items
671 createMenu( separator(), helpMenu, -1, 5 );
673 QStringList addHelpItems = resMgr->parameters( "add_help" );
674 foreach ( QString addHelpItem, addHelpItems ) {
675 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
676 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
677 QAction* a = createAction( id, addHelpItem,
678 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
679 addHelpItem, addHelpItem,
680 0, desk, false, this, SLOT( onHelpContentsModule() ) );
681 a->setData( valueStr );
682 createMenu( a, helpMenu, -1, 5 );
688 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
689 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
690 registerAction( MRUId, mru );
692 // default icon for neutral point ('SALOME' module)
693 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
694 if ( defIcon.isNull() )
695 defIcon = QPixmap( imageEmptyIcon );
697 //! default icon for any module
698 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
699 if ( modIcon.isNull() )
700 modIcon = QPixmap( imageEmptyIcon );
703 modules( modList, false );
705 if ( modList.count() > 1 )
707 LightApp_ModuleAction* moduleAction =
708 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
710 QMap<QString, QString> iconMap;
711 moduleIconNames( iconMap );
713 const int iconSize = 20;
715 QStringList::Iterator it;
716 for ( it = modList.begin(); it != modList.end(); ++it )
718 if ( !isLibExists( *it ) )
721 QString modName = moduleName( *it );
723 if ( !isModuleAccessible( *it ) )
727 if ( iconMap.contains( *it ) )
728 iconName = iconMap[*it];
730 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
734 INFOS ( "\n****************************************************************" << std::endl
735 << "* Icon for " << (*it).toLatin1().constData()
736 << " not found. Using the default one." << std::endl
737 << "****************************************************************" << std::endl );
740 icon = Qtx::scaleIcon( icon, iconSize );
742 moduleAction->insertModule( *it, icon );
745 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
746 this, SLOT( onModuleActivation( const QString& ) ) );
747 registerAction( ModulesListId, moduleAction );
751 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
752 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
754 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
755 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
756 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
757 0, desk, false, this, SLOT( onCloseAllWindow() ) );
758 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
759 0, desk, false, this, SLOT( onGroupAllWindow() ) );
761 createMenu( CloseId, windowMenu, 0, -1 );
762 createMenu( CloseAllId, windowMenu, 0, -1 );
763 createMenu( GroupAllId, windowMenu, 0, -1 );
764 createMenu( separator(), windowMenu, -1, 0 );
766 #ifndef DISABLE_GLVIEWER
767 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
769 #ifndef DISABLE_PLOT2DVIEWER
770 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
772 #ifndef DISABLE_OCCVIEWER
773 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
775 #ifndef DISABLE_VTKVIEWER
776 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
778 #ifndef DISABLE_QXGRAPHVIEWER
779 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
781 #ifndef DISABLE_GRAPHICSVIEW
782 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
784 #ifndef DISABLE_PVVIEWER
785 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
787 #ifndef DISABLE_PYVIEWER
788 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
791 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
792 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
793 createMenu( RenameId, windowMenu, -1 );
795 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
796 createMenu( PreferencesId, fileMenu, 50, -1 );
797 createMenu( separator(), fileMenu, -1, 50, -1 );
799 createMenu( separator(), fileMenu, -1, 100, -1 );
800 createMenu( MRUId, fileMenu, 100, -1 );
801 createMenu( separator(), fileMenu, -1, 100, -1 );
803 #ifdef USE_SALOME_STYLE
804 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
805 0, desk, false, this, SLOT( onStylePreferences() ) );
806 #endif // USE_SALOME_STYLE
808 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
809 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
812 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
813 createMenu( separator(), viewMenu, -1, 20, -1 );
814 #ifdef USE_SALOME_STYLE
815 createMenu( StyleId, viewMenu, 20, -1 );
816 #endif // USE_SALOME_STYLE
817 createMenu( FullScreenId, viewMenu, 20, -1 );
819 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
820 QString( "SalomeModules" ) ); // name (language-independant)
821 createTool( ModulesListId, modTBar );
824 /*!On module activation action.*/
825 void LightApp_Application::onModuleActivation( const QString& modName )
827 // Force user to create/open a study before module activation
828 QMap<QString, QString> iconMap;
829 moduleIconNames( iconMap );
830 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
832 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
834 bool cancelled = false;
836 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
837 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
838 QMap<int, QString> opmap = activateModuleActions();
839 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
840 aDlg.addButton( it.value(), it.key() );
842 int res = aDlg.exec();
844 // some operation is selected
845 moduleActionSelected( res );
849 putInfo( tr("INF_CANCELLED") );
851 LightApp_ModuleAction* moduleAction =
852 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
854 moduleAction->setActiveModule( QString() );
860 activateModule( modName );
863 /*!Default module activation.*/
864 QString LightApp_Application::defaultModule() const
866 QStringList aModuleNames;
867 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
868 //! If there's the one and only module --> activate it automatically
869 //! TODO: Possible improvement - default module can be taken from preferences
870 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
873 /*!On new window slot.*/
874 void LightApp_Application::onNewWindow()
876 const QObject* obj = sender();
877 if ( !obj || !obj->inherits( "QAction" ) )
881 int id = actionId( (QAction*)obj );
884 #ifndef DISABLE_GLVIEWER
886 type = GLViewer_Viewer::Type();
889 #ifndef DISABLE_PLOT2DVIEWER
891 type = Plot2d_Viewer::Type();
894 #ifndef DISABLE_OCCVIEWER
896 type = OCCViewer_Viewer::Type();
899 #ifndef DISABLE_VTKVIEWER
901 type = VTKViewer_Viewer::Type();
904 #ifndef DISABLE_QXGRAPHVIEWER
905 case NewQxSceneViewId:
906 type = QxScene_Viewer::Type();
909 #ifndef DISABLE_GRAPHICSVIEW
910 case NewGraphicsViewId:
911 type = GraphicsView_Viewer::Type();
914 #ifndef DISABLE_PVVIEWER
916 type = PVViewer_Viewer::Type();
919 #ifndef DISABLE_PYVIEWER
921 type = PyViewer_Viewer::Type();
926 if ( !type.isEmpty() )
927 createViewManager( type );
931 SLOT: Creates new document
933 void LightApp_Application::onNewDoc()
935 #ifdef SINGLE_DESKTOP
936 if ( !checkExistingDoc() )
940 //asl: fix for 0020515
941 saveDockWindowsState();
943 CAM_Application::onNewDoc();
947 SLOT: Opens new document
949 void LightApp_Application::onOpenDoc()
951 SUIT_Study* study = activeStudy();
953 #ifdef SINGLE_DESKTOP
954 if ( !checkExistingDoc() )
958 CAM_Application::onOpenDoc();
960 if ( !study ) // new study will be create in THIS application
963 updateViewManagers();
968 SLOT: Opens new document.
969 \param aName - name of file
971 bool LightApp_Application::onOpenDoc( const QString& aName )
973 #ifdef SINGLE_DESKTOP
974 if ( !checkExistingDoc() )
978 saveDockWindowsState();
980 // We should take mru action first because this application instance can be deleted later.
981 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
983 bool res = CAM_Application::onOpenDoc( aName );
988 mru->insert( aName );
990 mru->remove( aName );
996 SLOT: Displays "About" message box
998 void LightApp_Application::onHelpAbout()
1000 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1005 Private SLOT: Called on selection is changed
1006 Dispatchs active module that selection is changed
1008 void LightApp_Application::onSelection()
1010 onSelectionChanged();
1012 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1013 ((LightApp_Module*)activeModule())->selectionChanged();
1018 \param study - SUIT_Study.
1020 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1022 CAM_Application::setActiveStudy( study );
1026 Enables/Disables menu items and toolbar buttons. Rebuild menu
1028 void LightApp_Application::updateCommandsStatus()
1030 CAM_Application::updateCommandsStatus();
1033 #ifndef DISABLE_GLVIEWER
1034 a = action( NewGLViewId );
1036 a->setEnabled( activeStudy() );
1039 #ifndef DISABLE_PLOT2DVIEWER
1040 a = action( NewPlot2dId );
1042 a->setEnabled( activeStudy() );
1045 #ifndef DISABLE_OCCVIEWER
1046 a = action( NewOCCViewId );
1048 a->setEnabled( activeStudy() );
1051 #ifndef DISABLE_VTKVIEWER
1052 a = action( NewVTKViewId );
1054 a->setEnabled( activeStudy() );
1057 #ifndef DISABLE_QXGRAPHVIEWER
1058 a = action( NewQxSceneViewId );
1060 a->setEnabled( activeStudy() );
1063 #ifndef DISABLE_GRAPHICSVIEW
1064 a = action( NewGraphicsViewId );
1066 a->setEnabled( activeStudy() );
1069 #ifndef DISABLE_PVVIEWER
1070 a = action( NewPVViewId );
1072 a->setEnabled( activeStudy() );
1075 #ifndef DISABLE_PYVIEWER
1076 a = action( NewPyViewerId );
1078 a->setEnabled( activeStudy() );
1084 Runs system command in separate thread
1086 class RunBrowser: public QThread
1089 RunBrowser( LightApp_Application* app,
1090 const QString& theApp,
1091 const QString& theParams,
1092 const QString& theHelpFile,
1093 const QString& theContext = QString() )
1095 myParams( theParams ),
1096 myContext( theContext ),
1100 //For the external browser always specify 'file://' protocol,
1101 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1102 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1107 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1108 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1110 QProcess* proc = new QProcess();
1112 proc->start( aCommand );
1113 if ( !proc->waitForStarted() ) {
1114 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1115 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1116 ce2000->setData( msg );
1117 QApplication::postEvent( myLApp, ce2000 );
1128 LightApp_Application* myLApp;
1132 SLOT: Displays help contents for choosen module
1134 void LightApp_Application::onHelpContentsModule()
1136 const QAction* a = (QAction*) sender();
1137 QString helpFile = a->data().toString();
1138 if ( helpFile.isEmpty() ) return;
1140 SUIT_ResourceMgr* resMgr = resourceMgr();
1143 platform = "winapplication";
1145 platform = "application";
1147 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1149 QString quote("\"");
1150 anApp.prepend( quote );
1151 anApp.append( quote );
1153 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1154 #if DISABLE_QTXWEBBROWSER
1155 bool useExtBrowser = true;
1157 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1160 if( useExtBrowser ) {
1161 if ( !anApp.isEmpty() ) {
1162 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1166 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1167 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1168 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1170 showPreferences( tr( "PREF_APP" ) );
1174 QStringList parameters;
1175 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1176 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1177 parameters << helpFile;
1178 QProcess::startDetached( "HelpBrowser", parameters );
1183 SLOT: Displays help contents for choosen dialog
1185 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1186 const QString& theFileName,
1187 const QString& theContext )
1189 QString fileName = theFileName;
1190 QString context = theContext;
1191 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1192 // context might be passed within theFileName argument
1193 QStringList comps = fileName.split("#");
1194 if ( comps.count() > 1 ) {
1195 context = comps.last();
1197 fileName = comps.join("#");
1201 QString homeDir = "";
1202 if ( !theComponentName.isEmpty() ) {
1203 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1204 if ( !dir.isEmpty() )
1205 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1206 Qtx::addSlash( "share" ) +
1207 Qtx::addSlash( "doc" ) +
1208 Qtx::addSlash( "salome" ) +
1209 Qtx::addSlash( "gui" ) +
1210 Qtx::addSlash( theComponentName ) );
1213 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1214 SUIT_ResourceMgr* resMgr = resourceMgr();
1217 platform = "winapplication";
1219 platform = "application";
1221 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1223 QString quote("\"");
1224 anApp.prepend( quote );
1225 anApp.append( quote );
1228 #if DISABLE_QTXWEBBROWSER
1229 bool useExtBrowser = true;
1231 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1235 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1237 if ( !anApp.isEmpty() ) {
1238 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1242 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1243 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1244 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1245 showPreferences( tr( "PREF_APP" ) );
1249 QStringList parameters;
1250 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1251 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1252 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1253 QProcess::startDetached( "HelpBrowser", parameters );
1258 Sets enable or disable some actions on selection changed.
1260 void LightApp_Application::onSelectionChanged()
1262 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1263 bool canCopy = m ? m->canCopy() : false;
1264 bool canPaste = m ? m->canPaste() : false;
1266 action( EditCopyId )->setEnabled(canCopy);
1267 action( EditPasteId )->setEnabled(canPaste);
1271 SLOT: Performs some actions when dockable windows are triggered
1273 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1277 QWidget* LightApp_Application::dockWindow( const int id ) const
1280 if ( myWin.contains( id ) )
1285 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1290 QDockWidget* dock = 0;
1291 QWidget* w = wid->parentWidget();
1292 while ( w && !dock )
1294 dock = ::qobject_cast<QDockWidget*>( w );
1295 w = w->parentWidget();
1300 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1305 if ( wid != dockWindow( id ) )
1306 removeDockWindow( id );
1308 myWin.insert( id, wid );
1310 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1311 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1313 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1314 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1315 QString( "%1Dock" ).arg( wid->objectName() ) );
1316 dock->setWidget( wid );
1317 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1318 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1319 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1321 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1322 if ( !accel.isEmpty() )
1323 dock->toggleViewAction()->setShortcut( accel );
1328 void LightApp_Application::removeDockWindow( const int id )
1330 QWidget* wid = dockWindow( id );
1336 QDockWidget* dock = windowDock( wid );
1340 dock->setWidget( 0 );
1341 wid->setParent( 0 );
1342 wid->setVisible( false );
1346 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1348 QDockWidget* dock = windowDock( dockWindow( id ) );
1349 if ( dock && desktop() ) {
1350 desktop()->addDockWidget( place, dock );
1351 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1352 if ( a ) a->update();
1358 \param flag - key for window
1359 \param studyId - study id
1360 Flag used how identificator of window in windows list.
1362 QWidget* LightApp_Application::getWindow( const int flag, const int )
1364 QWidget* wid = dockWindow( flag );
1366 insertDockWindow( flag, wid = createWindow( flag ) );
1368 QMap<int, int> winMap;
1369 currentWindows( winMap );
1370 if ( winMap.contains( flag ) )
1371 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1377 \return Object Browser
1379 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1381 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1387 LogWindow* LightApp_Application::logWindow()
1389 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1392 #ifndef DISABLE_PYCONSOLE
1394 This returns the python console integrated to the GUI. Depending
1395 when you request the python console, this function could return
1396 null. Then the optional parameter force (default to false) can be
1397 set to force the creation of the python console if it is not done
1399 \param force - if true, the pythonConsole is created if it does not exist yet
1400 \return Python Console
1402 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1404 QWidget* wid = dockWindow( WT_PyConsole );
1405 if ( !wid && force==true) {
1406 wid = getWindow(WT_PyConsole);
1408 return qobject_cast<PyConsole_Console*>( wid );
1413 Updates object browser and maybe data models
1414 \param updateModels - if it is true, then data models are updated
1416 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1418 // update existing data models
1421 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1422 if ( objectBrowser() )
1423 objectBrowser()->setAutoUpdate( false );
1425 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1427 CAM_Study::ModelList dm_list;
1428 study->dataModels( dm_list );
1429 QListIterator<CAM_DataModel*> it( dm_list );
1430 while ( it.hasNext() ) {
1431 CAM_DataModel* camDM = it.next();
1432 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1433 ((LightApp_DataModel*)camDM)->update();
1437 if( objectBrowser() )
1438 objectBrowser()->setAutoUpdate( isAutoUpdate );
1441 if ( objectBrowser() ) {
1442 objectBrowser()->updateGeometry();
1443 objectBrowser()->updateTree( 0, false );
1450 LightApp_Preferences* LightApp_Application::preferences() const
1452 return preferences( false );
1456 \return first view manager of some type
1457 \param vmType - type of view manager
1458 \param create - is it necessary to create view manager in case, when there is no manager of such type
1460 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1462 SUIT_ViewManager* aVM = viewManager( vmType );
1463 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1465 if ( anActiveVM && anActiveVM->getType() == vmType )
1468 if ( aVM && create )
1470 if ( !aVM->getActiveView() )
1473 desktop()->setActiveWindow( aVM->getActiveView() );
1476 aVM = createViewManager( vmType );
1482 Creates view manager of some type
1483 \param vmType - type of view manager
1485 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1487 SUIT_ResourceMgr* resMgr = resourceMgr();
1489 SUIT_ViewManager* viewMgr = 0;
1490 #ifndef DISABLE_GLVIEWER
1491 if( vmType == GLViewer_Viewer::Type() )
1493 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1494 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1497 #ifndef DISABLE_PLOT2DVIEWER
1498 if( vmType == Plot2d_Viewer::Type() )
1500 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1502 #ifndef DISABLE_SALOMEOBJECT
1503 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1505 new LightApp_Plot2dSelector( v, mySelMgr );
1507 vm = new Plot2d_Viewer();
1509 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1510 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1513 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1514 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1518 #ifndef DISABLE_QXGRAPHVIEWER
1519 if( vmType == QxScene_Viewer::Type() )
1521 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1522 QxScene_Viewer* vm = new QxScene_Viewer();
1523 viewMgr->setViewModel( vm );
1524 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1527 #ifndef DISABLE_GRAPHICSVIEW
1528 if( vmType == GraphicsView_Viewer::Type() )
1530 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1531 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1534 #ifndef DISABLE_PVVIEWER
1535 if( vmType == PVViewer_Viewer::Type() )
1537 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1538 viewMgr->getActiveView()->setFocus();
1541 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1545 #ifndef DISABLE_PYVIEWER
1546 if( vmType == PyViewer_Viewer::Type() )
1548 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1551 #ifndef DISABLE_OCCVIEWER
1552 if( vmType == OCCViewer_Viewer::Type() )
1554 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1555 OCCViewer_Viewer* vm;
1556 #ifndef DISABLE_SALOMEOBJECT
1557 vm = new SOCC_Viewer();
1559 vm = new OCCViewer_Viewer( true );
1561 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1562 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1563 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1564 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1565 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1566 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1567 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1568 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1570 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1571 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1572 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1573 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1574 #if OCC_VERSION_LARGE > 0x06090000
1575 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1576 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1577 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1578 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1579 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1580 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1582 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1583 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1584 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1586 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1587 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1588 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1589 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1590 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1591 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1592 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1593 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1596 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1597 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1600 #ifndef DISABLE_VTKVIEWER
1601 #ifndef DISABLE_SALOMEOBJECT
1602 if ( vmType == SVTK_Viewer::Type() )
1604 if ( vmType == VTKViewer_Viewer::Type() )
1607 #ifndef DISABLE_SALOMEOBJECT
1608 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1609 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1612 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1613 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1614 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1615 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1616 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1617 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1618 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1619 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1620 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1621 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1622 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1623 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1624 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1625 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1626 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1627 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1628 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1629 new LightApp_VTKSelector( vm, mySelMgr );
1632 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1633 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1635 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1643 addViewManager( viewMgr );
1644 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1646 if ( viewWin && desktop() ) {
1647 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1648 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1654 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1656 SUIT_ResourceMgr* resMgr = resourceMgr();
1658 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1660 new LightApp_WgViewModel( vmType, w ) );
1661 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1663 addViewManager( vm );
1664 SUIT_ViewWindow* vw = vm->createViewWindow();
1665 if ( vw && desktop() ) {
1666 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1667 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1670 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1671 myUserWmTypes << vmType;
1676 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1678 SUIT_ResourceMgr* resMgr = resourceMgr();
1680 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1684 QString vmType = vm->getType();
1686 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1688 addViewManager( vm );
1689 SUIT_ViewWindow* vw = vm->createViewWindow();
1690 if ( vw && desktop() ) {
1691 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1692 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1695 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1696 myUserWmTypes << vmType;
1702 SLOT: Removes view manager from application
1704 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1706 removeViewManager( theVM );
1710 Protected SLOT: On study created.
1711 \param theStudy - just created study
1713 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1715 SUIT_DataObject* aRoot = 0;
1716 if ( theStudy && theStudy->root() )
1718 aRoot = theStudy->root();
1719 //aRoot->setName( tr( "DATA_MODELS" ) );
1722 getWindow( WT_ObjectBrowser );
1724 loadDockWindowsState();
1726 if ( objectBrowser() )
1727 objectBrowser()->setRoot( aRoot );
1729 activateModule( defaultModule() );
1731 if ( objectBrowser() )
1732 objectBrowser()->openLevels();
1734 #ifndef DISABLE_PYCONSOLE
1735 if( pythonConsole() )
1736 getPyInterp()->initStudy();
1741 Protected SLOT: On study opened.
1742 \param theStudy - just opened study
1744 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1746 SUIT_DataObject* aRoot = 0;
1747 if ( theStudy && theStudy->root() )
1749 aRoot = theStudy->root();
1753 getWindow( WT_ObjectBrowser );
1755 loadDockWindowsState();
1757 if ( objectBrowser() )
1758 objectBrowser()->setRoot( aRoot );
1760 activateModule( defaultModule() );
1762 if ( objectBrowser() )
1763 objectBrowser()->openLevels();
1765 #ifndef DISABLE_PYCONSOLE
1766 if( pythonConsole() )
1767 getPyInterp()->initStudy();
1773 /*!Protected SLOT. On study saved.*/
1774 void LightApp_Application::onStudySaved( SUIT_Study* s )
1776 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1778 mru->insert( s->studyName() );
1783 /*!Protected SLOT. On study closed.*/
1784 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1787 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1788 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1791 // stop auto-save timer
1792 myAutoSaveTimer->stop();
1794 // Bug 10396: clear selection
1795 mySelMgr->clearSelected();
1797 // Bug 12944: emit signal only after clear selection
1800 activateModule( "" );
1803 /*!Protected SLOT.On desktop activated.*/
1804 void LightApp_Application::onDesktopActivated()
1806 CAM_Application::onDesktopActivated();
1807 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1809 aModule->studyActivated();
1812 void LightApp_Application::studyOpened( SUIT_Study* s )
1814 CAM_Application::studyOpened( s );
1817 updateViewManagers();
1820 void LightApp_Application::studySaved( SUIT_Study* s )
1822 CAM_Application::studyOpened( s );
1823 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1824 if ( aResMgr && activeStudy() ) {
1825 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1826 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1830 void LightApp_Application::studyCreated( SUIT_Study* s )
1832 CAM_Application::studyCreated( s );
1835 updateViewManagers();
1838 /*!Gets file filter.
1839 *\retval QString "(*.hdf)"
1841 QString LightApp_Application::getFileFilter( bool /*open*/) const
1847 Shows file dialog and return user selected file name
1849 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1850 const QString& caption, QWidget* parent )
1854 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1855 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1858 /*! Gets directory*/
1859 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1863 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1866 /*! Get open file names*/
1867 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1868 const QString& caption, QWidget* parent )
1872 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1873 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1876 /*!Private SLOT. Update object browser.*/
1877 void LightApp_Application::onRefresh()
1879 updateObjectBrowser( true );
1882 /*!Private SLOT. Update actions after rename object.*/
1883 void LightApp_Application::onRenamed()
1885 activeStudy()->Modified();
1889 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1890 // To prevent reversion the window should be either aligned during movement and resize.
1891 /*!Private SLOT. Update actions after rename object.*/
1892 /*void LightApp_Application::onMoved()
1894 OCCViewer_ViewManager* viewMgr = 0;
1895 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1897 OCCViewer_ViewWindow* view = 0;
1898 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1900 view->getViewPort()->repaintViewAfterMove();
1905 /*!Private SLOT. Support drag-and-drop operation.*/
1906 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1908 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1912 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1914 aModule->dropObjects( objects, parentObj, row, action );
1917 /*!Private SLOT. On preferences.*/
1918 void LightApp_Application::onPreferences()
1920 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1923 /*!Private SLOT. On preferences.*/
1924 void LightApp_Application::showPreferences( const QString& itemText )
1926 QApplication::setOverrideCursor( Qt::WaitCursor );
1928 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1930 QApplication::restoreOverrideCursor();
1935 preferences()->activateItem( itemText );
1937 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1940 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1941 resourceMgr()->save();
1944 shortcutMgr()->updateShortcuts();
1950 /*!Protected SLOT. On preferences changed.*/
1951 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1953 LightApp_Module* sMod = 0;
1954 CAM_Module* mod = module( modName );
1955 if ( mod && mod->inherits( "LightApp_Module" ) )
1956 sMod = (LightApp_Module*)mod;
1959 sMod->preferencesChanged( section, param );
1961 preferencesChanged( section, param );
1962 // emit signal to allow additional preferences changing processing
1963 emit preferenceChanged( modName, section, param );
1966 /*!Remove all windows from study.*/
1967 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1969 saveDockWindowsState();
1971 if ( SUIT_DataBrowser* ob = objectBrowser() )
1974 CAM_Application::beforeCloseDoc( s );
1977 /*!Update actions.*/
1978 void LightApp_Application::updateActions()
1980 updateCommandsStatus();
1986 SUIT_Study* LightApp_Application::createNewStudy()
1988 LightApp_Application::lastStudyId++;
1990 LightApp_Study* aStudy = new LightApp_Study( this );
1992 // Set up processing of major study-related events
1993 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1994 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1995 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1996 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2002 Creates window by flag.
2003 \param flag - identificator of window type
2005 QWidget* LightApp_Application::createWindow( const int flag )
2009 SUIT_ResourceMgr* resMgr = resourceMgr();
2011 if ( flag == WT_ObjectBrowser )
2013 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2014 ob->setObjectName( "objectBrowser" );
2015 ob->setSortMenuEnabled( true );
2016 ob->setAutoUpdate( true );
2017 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2018 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2020 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2021 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2022 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2024 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2025 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2026 treeModel->setSearcher( this );
2027 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2028 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2030 // Mantis issue 0020136: Drag&Drop in OB
2031 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2033 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2034 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2035 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2036 this, SLOT( onRenamed( ) ) );
2040 // temporary commented
2042 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2044 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2047 // Create OBSelector
2048 new LightApp_OBSelector( ob, mySelMgr );
2049 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2050 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2052 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2054 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2055 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2056 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2058 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2060 #ifndef DISABLE_PYCONSOLE
2061 else if ( flag == WT_PyConsole )
2063 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2064 pyCons->setObjectName( "pythonConsole" );
2065 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2066 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2067 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2068 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2069 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2073 else if ( flag == WT_LogWindow )
2075 LogWindow* logWin = new LogWindow( desktop() );
2076 logWin->setObjectName( "logWindow" );
2077 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2078 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2080 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2086 \return default windows( Object Browser, Python Console )
2087 Adds to map \a aMap.
2089 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2091 #ifndef DISABLE_PYCONSOLE
2092 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2094 if ( activeStudy() ) {
2095 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2096 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2100 /*!Default view managers*/
2101 void LightApp_Application::defaultViewManagers( QStringList& ) const
2107 \return preferences.
2108 Create preferences, if \a crt = true.
2110 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2115 LightApp_Application* that = (LightApp_Application*)this;
2117 bool toCreate = !_prefs_ && crt;
2120 _prefs_ = new LightApp_Preferences( resourceMgr() );
2121 that->createPreferences( _prefs_ );
2124 that->myPrefs = _prefs_;
2126 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2127 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2128 connect( myPrefs, SIGNAL( resetToDefaults() ),
2129 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2134 SUIT_ResourceMgr* resMgr = resourceMgr();
2136 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2137 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2139 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2143 QStringList modNameList;
2144 app->modules( modNameList, false );
2146 QMap<QString, QString> iconMap;
2147 app->moduleIconNames( iconMap );
2149 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2151 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2154 int modId = _prefs_->addPreference( *it );
2155 if ( iconMap.contains( *it ) )
2156 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2160 app->modules( modList );
2161 QListIterator<CAM_Module*> itr( modList );
2162 while ( itr.hasNext() )
2164 LightApp_Module* mod = 0;
2166 CAM_Module* anItem = itr.next();
2167 if ( anItem->inherits( "LightApp_Module" ) )
2168 mod = (LightApp_Module*)anItem;
2170 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2172 _prefs_->addPreference( mod->moduleName() );
2173 mod->createPreferences();
2174 that->emptyPreferences( mod->moduleName() );
2178 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2184 Adds new module to application
2186 void LightApp_Application::moduleAdded( CAM_Module* mod )
2188 CAM_Application::moduleAdded( mod );
2190 LightApp_Module* lightMod = 0;
2191 if ( mod && mod->inherits( "LightApp_Module" ) )
2192 lightMod = (LightApp_Module*)mod;
2194 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2196 myPrefs->addPreference( mod->moduleName() );
2197 lightMod->createPreferences();
2198 emptyPreferences( mod->moduleName() );
2202 void LightApp_Application::emptyPreferences( const QString& modName )
2204 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2205 if ( !item || !item->isEmpty() )
2208 // printf( "---------------------> Modify for empty module.\n" );
2210 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2211 frm->setIcon( item->icon() );
2212 frm->setStretch( false );
2213 item->parentItem()->insertItem( frm, item );
2214 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2221 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2226 QStringList aValuesList;
2227 QList<QVariant> anIndicesList;
2231 // . Top-level "SALOME" preferences group <<start>>
2232 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2233 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2235 // .. "General" preferences tab <<start>>
2236 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2238 // ... "Language" group <<start>>
2239 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2240 pref->setItemProperty( "columns", 2, langGroup );
2241 // .... -> application language
2242 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2243 LightApp_Preferences::Selector, "language", "language" );
2244 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2245 QList<QVariant> aIcons;
2246 QList<QVariant> aNumbers;
2247 QStringList aTitles;
2248 foreach ( QString aLang, aLangs ) {
2249 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2251 aTitles << langToName( aLang );
2253 pref->setItemProperty( "strings", aTitles, curLang );
2254 pref->setItemProperty( "ids", aNumbers, curLang );
2255 pref->setItemProperty( "icons", aIcons, curLang );
2256 pref->setItemProperty( "restart", true, curLang );
2258 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2259 LightApp_Preferences::Bool, "language", "locale" );
2260 pref->setItemProperty( "restart", true, curLocale );
2261 // ... "Language" group <<end>>
2263 // ... "Look and feel" group <<start>>
2264 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2265 pref->setItemProperty( "columns", 2, lookGroup );
2266 // .... -> show splash-screen
2267 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2268 // .... -> opaque resize
2269 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2270 // .... -> drop-down buttons
2271 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2272 // ... "Look and feel" group <<end>>
2274 // ... "Study properties" group <<start>>
2275 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2276 pref->setItemProperty( "columns", 2, studyGroup );
2277 // .... -> multi-file save
2278 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2279 // .... -> ascii save mode
2280 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2281 // .... -> store windows geometry
2282 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2283 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2284 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2285 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2286 // .... -> auto-save
2287 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2288 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2289 pref->setItemProperty( "min", 0, autoSaveInterval );
2290 pref->setItemProperty( "max", 1440, autoSaveInterval );
2291 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2292 // ... "Study properties" group <<end>>
2294 // ... "Help browser" group <<start>>
2295 #ifndef DISABLE_QTXWEBBROWSER
2296 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2298 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2302 QString platform = "winapplication";
2304 QString platform = "application";
2306 // .... -> browser application
2307 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2308 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2309 // .... -> browser parameters
2310 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2311 // ... "Help browser" group <<end>>
2313 // ... "Python console properties" group <<start>>
2314 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2315 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2317 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2318 // .... -> show banner
2319 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2320 // .... -> auto-completion
2321 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2322 // ... "Python console properties" group <<end>>
2324 // ... "MRU" preferences group <<start>>
2325 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2326 pref->setItemProperty( "columns", 4, mruGroup );
2327 // number of MRU items
2328 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2329 "MRU", "visible_count" );
2330 pref->setItemProperty( "min", 0, mruVisCount );
2331 pref->setItemProperty( "max", 100, mruVisCount );
2333 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2334 "MRU", "link_type" );
2335 aValuesList.clear();
2336 anIndicesList.clear();
2337 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2338 anIndicesList << 0 << 1 << 2 ;
2339 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2340 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2341 // ... "MRU" preferences group <<end>>
2343 // ... "Full-screen" group <<start>>
2344 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2345 pref->setItemProperty( "columns", 2, fullScreenGroup );
2346 // .... -> automatic hiding toolbars
2347 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2348 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2349 // ... "Full-screen" group <<end>>
2351 // .. "General" preferences tab <<end>>
2353 // .. "3D viewer" group <<start>>
2354 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2355 // ... -> navigation mode
2356 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2357 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2358 aValuesList.clear();
2359 anIndicesList.clear();
2360 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2361 anIndicesList << 0 << 1;
2362 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2363 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2364 // ... -> zooming mode
2365 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2366 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2367 aValuesList.clear();
2368 anIndicesList.clear();
2369 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2370 anIndicesList << 0 << 1;
2371 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2372 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2373 // ... "Trihedron" group <<start>>
2374 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2375 pref->setItemProperty( "columns", 2, occTriGroup );
2376 // .... -> trihedron size
2377 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2378 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2379 pref->setItemProperty( "min", 1.0E-06, occTS );
2380 pref->setItemProperty( "max", 1000, occTS );
2381 // .... -> relative size of trihedron
2382 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2383 // .... -> show static trihedron
2384 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2385 // ... "Trihedron" group <<end>>
2386 // .. "3D viewer" group <<end>>
2390 #ifndef DISABLE_OCCVIEWER
2391 // .. "OCC viewer" group <<start>>
2392 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2394 // .... -> Projection mode
2395 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2396 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2397 aValuesList.clear();
2398 anIndicesList.clear();
2399 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2400 anIndicesList << 0 << 1;
2401 pref->setItemProperty( "strings", aValuesList, occProjMode );
2402 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2403 #if OCC_VERSION_LARGE > 0x06090000
2404 // .... -> Stereo group
2405 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2406 pref->setItemProperty( "columns", 2, stereoGroup );
2407 // .... -> Stereo type
2408 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2409 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2410 aValuesList.clear();
2411 anIndicesList.clear();
2413 OCCViewer_Viewer::stereoData( aValuesList, idList);
2414 foreach( int gid, idList ) anIndicesList << gid;
2415 pref->setItemProperty( "strings", aValuesList, stereoType );
2416 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2418 // .... -> Anaglyph filter
2419 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2420 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2421 aValuesList.clear();
2422 anIndicesList.clear();
2423 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2424 anIndicesList << 0 << 1 << 2;
2426 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2427 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2429 // .... -> Convergence distance type
2430 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2431 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2432 aValuesList.clear();
2433 anIndicesList.clear();
2434 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2435 anIndicesList << 0 << 1;
2436 pref->setItemProperty( "strings", aValuesList, occFocusType );
2437 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2439 // .... -> Stereographic focus value
2440 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2441 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2442 pref->setItemProperty( "precision", 3, focusValue );
2443 pref->setItemProperty( "min", 1.0E-03, focusValue );
2444 pref->setItemProperty( "max", 1.0E03, focusValue );
2445 pref->setItemProperty( "step", 0.05, focusValue );
2448 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2449 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2450 aValuesList.clear();
2451 anIndicesList.clear();
2452 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2453 anIndicesList << 0 << 1;
2454 pref->setItemProperty( "strings", aValuesList, occIODType );
2455 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2457 // .... -> Interocular distance (IOD) value
2458 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2459 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2460 pref->setItemProperty( "precision", 3, IODValue );
2461 pref->setItemProperty( "min", 1.0E-03, IODValue );
2462 pref->setItemProperty( "max", 1.0E03, IODValue );
2463 pref->setItemProperty( "step", 0.05, IODValue );
2465 // .... -> Reverse stereo
2466 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2467 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2468 // .... -> Enable V-Sync
2469 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2470 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2471 // .... -> Enable quad-buffer support
2472 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2473 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2475 // ... "Background" group <<start>>
2476 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2477 // pref->setItemProperty( "columns", 2, bgGroup );
2478 aValuesList.clear();
2479 anIndicesList.clear();
2482 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2483 foreach( int gid, idList ) anIndicesList << gid;
2484 // .... -> 3D viewer background
2485 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2486 LightApp_Preferences::Background, "OCCViewer", "background" );
2487 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2488 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2489 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2490 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2491 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2492 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2493 pref->setItemProperty( "custom_enabled", false, bgId );
2494 pref->setItemProperty( "image_formats", formats, bgId );
2495 // .... -> XZ viewer background
2496 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2497 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2498 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2499 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2500 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2501 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2502 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2503 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2504 pref->setItemProperty( "custom_enabled", false, bgId );
2505 pref->setItemProperty( "image_formats", formats, bgId );
2506 // .... -> YZ viewer background
2507 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2508 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2509 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2510 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2511 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2512 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2513 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2514 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2515 pref->setItemProperty( "custom_enabled", false, bgId );
2516 pref->setItemProperty( "image_formats", formats, bgId );
2517 // .... -> XY viewer background
2518 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2519 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2520 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2521 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2522 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2523 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2524 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2525 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2526 pref->setItemProperty( "custom_enabled", false, bgId );
2527 pref->setItemProperty( "image_formats", formats, bgId );
2528 // ... "Background" group <<end>>
2531 // ... "Selection" group <<start>>
2532 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2533 pref->setItemProperty( "columns", 2, occSelectionGroup );
2534 // .... -> enable preselection
2535 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2536 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2537 // .... -> enable selection
2538 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2539 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2540 // ... "Selection" group <<end>>
2542 // ... "Clipping" group <<start>>
2543 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2544 // .... -> clipping color
2545 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2546 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2547 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2548 pref->setItemProperty( "columns", 2, texturePref );
2549 // .... -> use default texture
2550 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2551 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2552 // .... -> clipping texture
2553 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2554 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2555 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2557 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2558 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2559 // .... -> scale factor
2560 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2561 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2562 pref->setItemProperty( "precision", 3, scaleFactor );
2563 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2564 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2565 pref->setItemProperty( "step", 0.1, scaleFactor );
2566 // ... "Clipping" group <<end>>
2568 // ... "Ray tracing" group <<start>>
2569 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2570 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2571 pref->setItemProperty( "columns", 2, rtPref );
2573 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2574 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2575 pref->setItemProperty( "min", 1, rt_depth );
2576 pref->setItemProperty( "max", 10, rt_depth );
2577 pref->setItemProperty( "step", 1, rt_depth );
2578 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2579 // .... -> specular reflections
2580 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2581 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2582 // .... -> adaptive anti-aliasing
2583 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2584 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2585 // .... -> shadows rendering
2586 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2587 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2588 // .... -> transparent shadow
2589 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2590 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2591 // ... "Ray tracing" group <<end>>
2593 // ... "Light source" group <<start>>
2594 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2595 // .... -> light color
2596 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2597 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2598 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2599 pref->setItemProperty( "columns", 3, directionPref );
2600 // .... -> light direction (dx component)
2601 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2602 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2603 pref->setItemProperty( "precision", 2, light_dx );
2604 pref->setItemProperty( "min", -1.0E03, light_dx );
2605 pref->setItemProperty( "max", 1.0E03, light_dx );
2606 pref->setItemProperty( "step", 0.1, light_dx );
2607 // .... -> light direction (dy component)
2608 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2609 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2610 pref->setItemProperty( "precision", 2, light_dy );
2611 pref->setItemProperty( "min", -1.0E03, light_dy );
2612 pref->setItemProperty( "max", 1.0E03, light_dy );
2613 pref->setItemProperty( "step", 0.1, light_dy );
2614 // .... -> light direction (dz component)
2615 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2616 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2617 pref->setItemProperty( "precision", 2, light_dz );
2618 pref->setItemProperty( "min", -1.0E03, light_dz );
2619 pref->setItemProperty( "max", 1.0E03, light_dz );
2620 pref->setItemProperty( "step", 0.1, light_dz );
2621 // ... "Light source" group <<end>>
2623 // ... -> empty frame (for layout) <<start>>
2624 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2625 pref->setItemProperty( "margin", 0, occGen );
2626 pref->setItemProperty( "columns", 2, occGen );
2627 // ... -> empty frame (for layout) <<end>>
2629 // .. "OCC viewer" group <<end>>
2632 #ifndef DISABLE_VTKVIEWER
2633 // .. "VTK viewer" group <<start>>
2634 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2636 // ... -> empty frame (for layout) <<start>>
2637 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2638 //pref->setItemProperty( "columns", 2, vtkGen );
2639 // .... -> projection mode
2640 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2641 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2642 aValuesList.clear();
2643 anIndicesList.clear();
2644 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2645 anIndicesList << 0 << 1;
2646 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2647 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2649 // .... -> Stereo group
2650 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2651 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2652 // .... -> Stereo type
2653 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2654 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2655 aValuesList.clear();
2656 anIndicesList.clear();
2658 SVTK_Viewer::stereoData( aValuesList, idList);
2659 foreach( int gid, idList ) anIndicesList << gid;
2660 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2661 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2662 // .... -> Anaglyph filter
2663 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2664 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2665 aValuesList.clear();
2666 anIndicesList.clear();
2667 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2668 anIndicesList << 0 << 1 << 2;
2670 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2671 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2673 // .... -> Enable quad-buffer support
2674 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2675 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2677 // .... -> background
2678 aValuesList.clear();
2679 anIndicesList.clear();
2682 #ifndef DISABLE_SALOMEOBJECT
2683 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2685 foreach( int gid, idList ) anIndicesList << gid;
2686 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2687 LightApp_Preferences::Background, "VTKViewer", "background" );
2688 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2689 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2690 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2691 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2692 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2693 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2694 pref->setItemProperty( "custom_enabled", false, bgId );
2695 #ifndef DISABLE_SALOMEOBJECT
2696 pref->setItemProperty( "image_formats", formats, bgId );
2698 // .... -> speed increment
2699 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2700 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2701 pref->setItemProperty( "min", 1, vtkSpeed );
2702 pref->setItemProperty( "max", 1000, vtkSpeed );
2703 // .... -> speed mode
2704 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2705 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2706 aValuesList.clear();
2707 anIndicesList.clear();
2708 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2709 anIndicesList << 0 << 1;
2710 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2711 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2713 // ... "Selection" group <<start>>
2714 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2715 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2716 // .... -> preselection
2717 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2718 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2719 aValuesList.clear();
2720 anIndicesList.clear();
2721 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2722 anIndicesList << 0 << 1 << 2;
2723 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2724 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2725 // .... -> enable selection
2726 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2727 // ... "Selection" group <<end>>
2729 // ... -> empty frame (for layout) <<end>>
2731 // ... space mouse sub-group <<start>>
2732 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2733 //pref->setItemProperty( "columns", 2, vtkSM );
2734 // .... -> decrease speed increment
2735 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2736 LightApp_Preferences::Selector, "VTKViewer",
2737 "spacemouse_func1_btn" );
2738 // .... -> increase speed increment
2739 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2740 LightApp_Preferences::Selector, "VTKViewer",
2741 "spacemouse_func2_btn" );
2742 // .... -> dominant / combined switch
2743 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2744 LightApp_Preferences::Selector, "VTKViewer",
2745 "spacemouse_func5_btn" ); //
2746 aValuesList.clear();
2747 anIndicesList.clear();
2748 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2749 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2750 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2751 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2752 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2753 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2754 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2755 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2756 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2757 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2758 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2759 // ... space mouse sub-group <<end>>
2761 // ... avi recording sub-group <<start>>
2762 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2763 pref->setItemProperty( "columns", 2, vtkRec );
2764 // .... -> recording mode
2765 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2766 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2767 aValuesList.clear();
2768 anIndicesList.clear();
2769 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2770 anIndicesList << 0 << 1;
2771 pref->setItemProperty( "strings", aValuesList, modePref );
2772 pref->setItemProperty( "indexes", anIndicesList, modePref );
2774 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2775 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2776 pref->setItemProperty( "min", 0.1, fpsPref );
2777 pref->setItemProperty( "max", 100, fpsPref );
2779 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2780 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2781 pref->setItemProperty( "min", 1, qualityPref );
2782 pref->setItemProperty( "max", 100, qualityPref );
2783 // .... -> progressive mode
2784 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2785 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2786 // ... avi recording sub-group <<end>>
2788 // ... group names sub-group <<start>>
2789 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2790 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2791 pref->setItemProperty( "columns", 2, vtkGN );
2792 // .... -> text color
2793 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2794 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2795 // .... -> transparency
2796 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2797 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2798 pref->setItemProperty( "min", 0.0, transPref );
2799 pref->setItemProperty( "max", 1.0, transPref );
2800 pref->setItemProperty( "step", 0.1, transPref );
2801 // ... -> group names sub-group <<end>>
2802 // .. "VTK viewer" group <<end>>
2805 // .. "Plot2d viewer" group <<start>>
2806 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2807 //pref->setItemProperty( "columns", 2, plot2dGroup );
2809 // ... -> background
2810 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2811 LightApp_Preferences::Color, "Plot2d", "Background" );
2812 // ... -> selection color
2813 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2814 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2816 // ... "Viewer" group <<start>>
2817 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2819 // .... -> curve type
2820 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2821 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2822 aValuesList.clear();
2823 anIndicesList.clear();
2824 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2825 anIndicesList << 0 << 1 << 2 ;
2826 pref->setItemProperty( "strings", aValuesList, curveType );
2827 pref->setItemProperty( "indexes", anIndicesList, curveType );
2828 // .... -> marker size
2829 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2830 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2831 pref->setItemProperty( "min", 0, markerSize );
2832 pref->setItemProperty( "max", 100, markerSize );
2833 // .... -> horizontal scaling mode
2834 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2835 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2836 aValuesList.clear();
2837 anIndicesList.clear();
2838 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2839 anIndicesList << 0 << 1 ;
2840 pref->setItemProperty( "strings", aValuesList, horScale );
2841 pref->setItemProperty( "indexes", anIndicesList, horScale );
2842 // .... -> vertical scaling mode
2843 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2844 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2845 pref->setItemProperty( "strings", aValuesList, verScale );
2846 pref->setItemProperty( "indexes", anIndicesList, verScale );
2848 // .... -> errors/deviation colot
2849 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2850 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2851 // .... -> deviation markers line size
2852 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2853 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2854 pref->setItemProperty( "min", 1, deviationMarkerLw );
2855 pref->setItemProperty( "max", 5, deviationMarkerLw );
2856 // .... -> deviation markers tick mark size
2857 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2858 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2859 pref->setItemProperty( "min", 1, deviationMarkerTs );
2860 pref->setItemProperty( "max", 5, deviationMarkerTs );
2861 // .... "Viewer" group <<end>>
2863 // ... "Legend" group <<start>>
2864 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2866 // .... -> show legend
2867 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2868 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2869 // .... -> legend position
2870 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2871 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2872 aValuesList.clear();
2873 anIndicesList.clear();
2874 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2875 anIndicesList << 0 << 1 << 2 << 3 ;
2876 pref->setItemProperty( "strings", aValuesList, legendPosition );
2877 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2878 // .... -> Symbol type
2879 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2880 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2881 aValuesList.clear();
2882 anIndicesList.clear();
2883 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2884 anIndicesList << 0 << 1 ;
2885 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2886 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2887 // .... -> legend font
2888 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2889 // ... -> font color
2890 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2891 // ... -> selection font color
2892 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2893 // ... "Legend" group <<end>>
2895 // .. "Plot2d viewer" group <<end>>
2897 // .. "PyViewer" preferences tab <<start>>
2898 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2899 // ... "Font settings" group <<start>>
2900 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2901 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2902 LightApp_Preferences::Font, "PyEditor", "Font" );
2903 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2904 // ... "Font settings" group <<end>>
2905 // ... "Display settings" group <<start>>
2906 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2907 pref->setItemProperty( "columns", 2, pyDispGroup );
2908 // ... -> current line highlight
2909 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2910 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2911 // ... -> text wrapping
2912 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2913 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2914 // ... -> center cursor on scroll
2915 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2916 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2917 // ... -> line numbers area
2918 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2919 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2920 // ... "Display settings" group <<end>>
2921 // ... "Tab settings" group <<start>>
2922 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2923 pref->setItemProperty( "columns", 2, pyTabGroup );
2924 // ... -> tab whitespaces
2925 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2926 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2928 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2929 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2930 // ... "Tab settings" group <<end>>
2931 // ... "Vertical edge settings" group <<start>>
2932 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2933 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2934 // ... -> vertical edge
2935 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2936 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2937 // ... -> number of columns
2938 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2939 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2940 // ... "Vertical edge settings" group <<end>>
2941 // .. "PyEditor" preferences tab <<end>>
2943 // .. "Directories" preferences tab <<start>>
2944 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2945 // ... --> quick directories list
2946 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2947 pref->addPreference( tr( "" ), dirGroup,
2948 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2949 // .. "Directories" preferences tab <<end>>
2951 // .. "Object browser" preferences tab <<start>>
2952 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2954 // ... "Search tool" group <<start>>
2955 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2956 // .... --> auto-hide
2957 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2958 "ObjectBrowser", "auto_hide_search_tool" );
2959 // ... "Search tool" group <<end>>
2961 // ... "Object browser settings" group <<start>>
2962 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2963 pref->setItemProperty( "columns", 2, objSetGroup );
2964 // .... -> auto size first column
2965 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2966 "ObjectBrowser", "auto_size_first" );
2967 // .... -> auto size other columns
2968 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2969 "ObjectBrowser", "auto_size" );
2970 // .... -> resize columns on expand item
2971 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2972 "ObjectBrowser", "resize_on_expand_item" );
2973 // .... -> browse to published object
2974 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2975 "ObjectBrowser", "browse_published_object" );
2976 aValuesList.clear();
2977 anIndicesList.clear();
2978 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2979 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2980 pref->setItemProperty( "strings", aValuesList, browsePublished );
2981 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2982 // ... "Object browser settings" group <<end>>
2983 // .. "Object browser" preferences tab <<end>>
2985 // .. "Shortcuts" preferences tab <<start>>
2986 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2987 // ... "Shortcuts settings" group <<start>>
2988 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2989 pref->addPreference( tr( "" ), shortcutGroup,
2990 LightApp_Preferences::ShortcutTree, "shortcuts" );
2991 // ... "Shortcuts settings" group <<end>>
2992 // .. "Shortcuts" preferences tab <<end>>
2993 // . Top-level "SALOME" preferences group <<end>>
2999 Changes appearance of application according to changed preferences
3000 \param sec - section
3001 \param param - name of changed parameter
3003 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3005 SUIT_ResourceMgr* resMgr = resourceMgr();
3009 if ( sec == "viewers" && param == "drop_down_buttons" )
3011 ViewManagerList vmlist = viewManagers();
3012 foreach( SUIT_ViewManager* vm, vmlist )
3014 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3015 foreach( SUIT_ViewWindow* vw, vwlist )
3016 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3020 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3022 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3023 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3024 QList<SUIT_ViewManager*> lst;
3025 #ifndef DISABLE_OCCVIEWER
3026 viewManagers( OCCViewer_Viewer::Type(), lst );
3027 QListIterator<SUIT_ViewManager*> itOCC( lst );
3028 while ( itOCC.hasNext() && sz >= 0 )
3030 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3031 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3034 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3035 occVM->setTrihedronSize( sz, relative );
3036 occVM->getAISContext()->UpdateCurrentViewer();
3039 #ifndef DISABLE_VTKVIEWER
3040 #ifndef DISABLE_SALOMEOBJECT
3041 viewManagers( SVTK_Viewer::Type(), lst );
3042 QListIterator<SUIT_ViewManager*> itVTK( lst );
3043 while ( itVTK.hasNext() && sz >= 0 )
3045 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3046 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3049 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3052 vtkVM->setTrihedronSize( sz, relative );
3060 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3062 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3063 QList<SUIT_ViewManager*> lst;
3064 #ifndef DISABLE_OCCVIEWER
3065 viewManagers( OCCViewer_Viewer::Type(), lst );
3066 QListIterator<SUIT_ViewManager*> itOCC( lst );
3067 while ( itOCC.hasNext() )
3069 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3070 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3073 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3076 occVM->setStaticTrihedronDisplayed( isVisible );
3080 #ifndef DISABLE_VTKVIEWER
3081 #ifndef DISABLE_SALOMEOBJECT
3082 viewManagers( SVTK_Viewer::Type(), lst );
3083 QListIterator<SUIT_ViewManager*> itVTK( lst );
3084 while ( itVTK.hasNext() )
3086 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3087 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3090 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3093 vtkVM->setStaticTrihedronVisible( isVisible );
3101 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3103 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3104 QList<SUIT_ViewManager*> lst;
3105 #ifndef DISABLE_OCCVIEWER
3106 viewManagers( OCCViewer_Viewer::Type(), lst );
3107 QListIterator<SUIT_ViewManager*> itOCC( lst );
3108 while ( itOCC.hasNext() )
3110 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3111 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3114 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3115 occVM->setInteractionStyle( mode );
3118 #ifndef DISABLE_VTKVIEWER
3119 #ifndef DISABLE_SALOMEOBJECT
3120 viewManagers( SVTK_Viewer::Type(), lst );
3121 QListIterator<SUIT_ViewManager*> itVTK( lst );
3122 while ( itVTK.hasNext() )
3124 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3125 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3128 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3129 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3135 #ifndef DISABLE_OCCVIEWER
3136 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3138 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3139 QList<SUIT_ViewManager*> lst;
3140 viewManagers( OCCViewer_Viewer::Type(), lst );
3141 QListIterator<SUIT_ViewManager*> it( lst );
3142 while ( it.hasNext() )
3144 SUIT_ViewModel* vm = it.next()->getViewModel();
3145 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3148 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3149 occVM->enablePreselection( isToEnablePreselection );
3154 #ifndef DISABLE_OCCVIEWER
3155 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3157 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3158 QList<SUIT_ViewManager*> lst;
3159 viewManagers( OCCViewer_Viewer::Type(), lst );
3160 QListIterator<SUIT_ViewManager*> it( lst );
3161 while ( it.hasNext() )
3163 SUIT_ViewModel* vm = it.next()->getViewModel();
3164 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3167 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3168 occVM->enableSelection( isToEnableSelection );
3173 #ifndef DISABLE_OCCVIEWER
3174 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3176 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3177 QList<SUIT_ViewManager*> lst;
3178 viewManagers( OCCViewer_Viewer::Type(), lst );
3179 QListIterator<SUIT_ViewManager*> it( lst );
3180 while ( it.hasNext() )
3182 SUIT_ViewModel* vm = it.next()->getViewModel();
3183 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3186 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3187 occVM->setClippingColor( aColor );
3192 #ifndef DISABLE_OCCVIEWER
3193 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3194 param == QString( "clipping_texture" ) ||
3195 param == QString( "clipping_modulate" ) ||
3196 param == QString( "clipping_scale" ) ) )
3198 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3199 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3200 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3201 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3202 QList<SUIT_ViewManager*> lst;
3203 viewManagers( OCCViewer_Viewer::Type(), lst );
3204 QListIterator<SUIT_ViewManager*> it( lst );
3205 while ( it.hasNext() )
3207 SUIT_ViewModel* vm = it.next()->getViewModel();
3208 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3211 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3212 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3217 #ifndef DISABLE_OCCVIEWER
3218 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3220 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3221 QList<SUIT_ViewManager*> lst;
3222 viewManagers( OCCViewer_Viewer::Type(), lst );
3223 QListIterator<SUIT_ViewManager*> it( lst );
3224 while ( it.hasNext() )
3226 SUIT_ViewModel* vm = it.next()->getViewModel();
3227 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3230 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3231 occVM->setProjectionType( mode );
3235 #if OCC_VERSION_LARGE > 0x06090000
3236 #ifndef DISABLE_OCCVIEWER
3237 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3239 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3240 QList<SUIT_ViewManager*> lst;
3241 viewManagers( OCCViewer_Viewer::Type(), lst );
3242 QListIterator<SUIT_ViewManager*> it( lst );
3243 while ( it.hasNext() )
3245 SUIT_ViewModel* vm = it.next()->getViewModel();
3246 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3249 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3250 occVM->setStereoType( mode );
3255 #ifndef DISABLE_OCCVIEWER
3256 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3258 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3259 QList<SUIT_ViewManager*> lst;
3260 viewManagers( OCCViewer_Viewer::Type(), lst );
3261 QListIterator<SUIT_ViewManager*> it( lst );
3262 while ( it.hasNext() )
3264 SUIT_ViewModel* vm = it.next()->getViewModel();
3265 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3268 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3269 occVM->setAnaglyphFilter( mode );
3274 #ifndef DISABLE_OCCVIEWER
3275 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3276 param == QString( "focus_value" ) ) )
3278 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3279 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3280 QList<SUIT_ViewManager*> lst;
3281 viewManagers( OCCViewer_Viewer::Type(), lst );
3282 QListIterator<SUIT_ViewManager*> it( lst );
3283 while ( it.hasNext() )
3285 SUIT_ViewModel* vm = it.next()->getViewModel();
3286 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3289 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3290 occVM->setStereographicFocus( aType, aValue );
3295 #ifndef DISABLE_OCCVIEWER
3296 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3297 param == QString( "iod_value" ) ) )
3299 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3300 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3301 QList<SUIT_ViewManager*> lst;
3302 viewManagers( OCCViewer_Viewer::Type(), lst );
3303 QListIterator<SUIT_ViewManager*> it( lst );
3304 while ( it.hasNext() )
3306 SUIT_ViewModel* vm = it.next()->getViewModel();
3307 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3310 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3311 occVM->setInterocularDistance( aType, aValue );
3316 #ifndef DISABLE_OCCVIEWER
3317 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3319 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3320 QList<SUIT_ViewManager*> lst;
3321 viewManagers( OCCViewer_Viewer::Type(), lst );
3322 QListIterator<SUIT_ViewManager*> it( lst );
3323 while ( it.hasNext() )
3325 SUIT_ViewModel* vm = it.next()->getViewModel();
3326 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3329 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3330 occVM->setReverseStereo( reverse );
3335 #ifndef DISABLE_OCCVIEWER
3336 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3338 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3339 QList<SUIT_ViewManager*> lst;
3340 viewManagers( OCCViewer_Viewer::Type(), lst );
3341 QListIterator<SUIT_ViewManager*> it( lst );
3342 while ( it.hasNext() )
3344 SUIT_ViewModel* vm = it.next()->getViewModel();
3345 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3348 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3349 occVM->setVSync( enable );
3354 #ifndef DISABLE_OCCVIEWER
3355 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3357 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3358 QList<SUIT_ViewManager*> lst;
3359 viewManagers( OCCViewer_Viewer::Type(), lst );
3360 QListIterator<SUIT_ViewManager*> it( lst );
3361 while ( it.hasNext() )
3363 SUIT_ViewModel* vm = it.next()->getViewModel();
3364 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3367 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3368 occVM->setQuadBufferSupport( enable );
3373 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3375 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3376 QList<SUIT_ViewManager*> lst;
3377 #ifndef DISABLE_OCCVIEWER
3378 viewManagers( OCCViewer_Viewer::Type(), lst );
3379 QListIterator<SUIT_ViewManager*> itOCC( lst );
3380 while ( itOCC.hasNext() )
3382 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3383 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3386 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3387 occVM->setZoomingStyle( mode );
3390 #ifndef DISABLE_VTKVIEWER
3391 #ifndef DISABLE_SALOMEOBJECT
3392 viewManagers( SVTK_Viewer::Type(), lst );
3393 QListIterator<SUIT_ViewManager*> itVTK( lst );
3394 while ( itVTK.hasNext() )
3396 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3397 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3400 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3401 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3407 #ifndef DISABLE_VTKVIEWER
3408 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3410 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3411 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3412 QList<SUIT_ViewManager*> lst;
3413 #ifndef DISABLE_SALOMEOBJECT
3414 viewManagers( SVTK_Viewer::Type(), lst );
3415 QListIterator<SUIT_ViewManager*> it( lst );
3416 while ( it.hasNext() )
3418 SUIT_ViewModel* vm = it.next()->getViewModel();
3419 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3422 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3423 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3429 #ifndef DISABLE_VTKVIEWER
3430 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3432 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3433 QList<SUIT_ViewManager*> lst;
3434 #ifndef DISABLE_SALOMEOBJECT
3435 viewManagers( SVTK_Viewer::Type(), lst );
3436 QListIterator<SUIT_ViewManager*> it( lst );
3437 while ( it.hasNext() )
3439 SUIT_ViewModel* vm = it.next()->getViewModel();
3440 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3443 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3444 if( vtkVM ) vtkVM->setProjectionMode( mode );
3450 #ifndef DISABLE_VTKVIEWER
3451 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3453 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3454 QList<SUIT_ViewManager*> lst;
3455 #ifndef DISABLE_SALOMEOBJECT
3456 viewManagers( SVTK_Viewer::Type(), lst );
3457 QListIterator<SUIT_ViewManager*> it( lst );
3458 while ( it.hasNext() )
3460 SUIT_ViewModel* vm = it.next()->getViewModel();
3461 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3464 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3465 if( vtkVM ) vtkVM->setStereoType( mode );
3471 #ifndef DISABLE_VTKVIEWER
3472 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3474 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3475 QList<SUIT_ViewManager*> lst;
3476 #ifndef DISABLE_SALOMEOBJECT
3477 viewManagers( SVTK_Viewer::Type(), lst );
3478 QListIterator<SUIT_ViewManager*> it( lst );
3479 while ( it.hasNext() )
3481 SUIT_ViewModel* vm = it.next()->getViewModel();
3482 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3485 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3486 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3492 #ifndef DISABLE_VTKVIEWER
3493 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3495 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3496 QList<SUIT_ViewManager*> lst;
3497 #ifndef DISABLE_SALOMEOBJECT
3498 viewManagers( SVTK_Viewer::Type(), lst );
3499 QListIterator<SUIT_ViewManager*> it( lst );
3500 while ( it.hasNext() )
3502 SUIT_ViewModel* vm = it.next()->getViewModel();
3503 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3506 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3507 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3513 #ifndef DISABLE_VTKVIEWER
3514 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3516 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3517 QList<SUIT_ViewManager*> lst;
3518 #ifndef DISABLE_SALOMEOBJECT
3519 viewManagers( SVTK_Viewer::Type(), lst );
3520 QListIterator<SUIT_ViewManager*> it( lst );
3521 while ( it.hasNext() )
3523 SUIT_ViewModel* vm = it.next()->getViewModel();
3524 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3527 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3528 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3534 #ifndef DISABLE_VTKVIEWER
3535 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3537 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3538 QList<SUIT_ViewManager*> lst;
3539 #ifndef DISABLE_SALOMEOBJECT
3540 viewManagers( SVTK_Viewer::Type(), lst );
3541 QListIterator<SUIT_ViewManager*> it( lst );
3542 while ( it.hasNext() )
3544 SUIT_ViewModel* vm = it.next()->getViewModel();
3545 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3548 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3549 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3555 #ifndef DISABLE_VTKVIEWER
3556 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3557 param == QString( "spacemouse_func2_btn" ) ||
3558 param == QString( "spacemouse_func5_btn" ) ) )
3560 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3561 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3562 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3563 QList<SUIT_ViewManager*> lst;
3564 #ifndef DISABLE_SALOMEOBJECT
3565 viewManagers( SVTK_Viewer::Type(), lst );
3566 QListIterator<SUIT_ViewManager*> it( lst );
3567 while ( it.hasNext() )
3569 SUIT_ViewModel* vm = it.next()->getViewModel();
3570 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3573 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3574 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3579 if( sec=="ObjectBrowser" )
3581 SUIT_DataBrowser* ob = objectBrowser();
3585 if ( param=="auto_size_first" )
3587 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3588 ob->setAutoSizeFirstColumn( autoSizeFirst );
3589 if ( autoSizeFirst )
3590 ob->adjustFirstColumnWidth();
3592 else if ( param=="auto_size" ) {
3593 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3594 ob->setAutoSizeColumns(autoSize);
3596 ob->adjustColumnsWidth();
3598 else if ( param=="resize_on_expand_item" ) {
3599 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3600 ob->setResizeOnExpandItem(resizeOnExpandItem);
3602 else if ( param == "auto_hide_search_tool" ) {
3603 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3609 if( param=="auto_save_interval" ) {
3610 myAutoSaveTimer->stop();
3611 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3612 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3616 #ifndef DISABLE_PYCONSOLE
3617 if( sec=="PyConsole" && pythonConsole() )
3619 if ( param=="font" ) {
3620 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3622 else if ( param=="show_banner" ) {
3623 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3625 else if ( param=="auto_completion" ) {
3626 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3633 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3635 if ( param == "visible_count" )
3636 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3637 else if ( param == "max_count" )
3638 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3639 else if ( param == "insert_mode" )
3640 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3641 else if ( param == "link_type" )
3642 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3643 else if ( param == "show_clear" )
3644 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3645 else if ( param == "show_mru" )
3646 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3649 if ( sec == "language" && param == "language" )
3651 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3652 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3654 if ( sec == "language" && param == "locale")
3656 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3657 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3659 if ( sec == "desktop" && param == "opaque_resize" ) {
3660 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3661 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3662 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3663 else dopts &= ~QMainWindow::AnimatedDocks;
3664 desktop()->setDockOptions( dopts );
3665 desktop()->setOpaqueResize( opaqueResize );
3666 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3667 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3670 #ifndef DISABLE_PLOT2DVIEWER
3671 QList<SUIT_ViewManager*> lst;
3672 viewManagers( Plot2d_Viewer::Type(), lst );
3673 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3674 while ( itPlot2d.hasNext() ) {
3675 SUIT_ViewManager* viewMgr = itPlot2d.next();
3676 SUIT_ViewModel* vm = viewMgr->getViewModel();
3677 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3680 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3682 viewMgr->setViewModel( vm );
3683 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3685 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3686 frame->SetPreference();
3695 void LightApp_Application::loadPreferences()
3697 CAM_Application::loadPreferences();
3699 SUIT_ResourceMgr* aResMgr = resourceMgr();
3704 static bool mru_load = true;
3707 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3709 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3710 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3711 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3712 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3713 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3714 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3715 mru->loadLinks( aResMgr, "MRU" );
3721 QStringList mods = aResMgr->parameters( "windows_visibility" );
3722 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3725 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3726 myWinVis.insert( *itr, arr );
3730 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3731 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3732 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3733 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3734 else dopts &= ~QMainWindow::AnimatedDocks;
3735 desktop()->setDockOptions( dopts );
3736 desktop()->setOpaqueResize( opaqueResize );
3737 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3738 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3745 void LightApp_Application::savePreferences()
3747 CAM_Application::savePreferences();
3749 saveDockWindowsState();
3751 SUIT_ResourceMgr* aResMgr = resourceMgr();
3756 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3758 mru->saveLinks( aResMgr, "MRU" );
3760 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3761 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3764 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3766 #if GUI_DEVELOPMENT > 0
3767 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3769 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3776 Updates desktop title
3778 void LightApp_Application::updateDesktopTitle()
3780 QString aTitle = applicationName();
3781 QString aVer = applicationVersion();
3782 if ( !aVer.isEmpty() )
3783 aTitle += QString( " " ) + aVer;
3785 if ( activeStudy() ) {
3786 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3787 aTitle += QString( " - [%1]" ).arg( sName );
3790 desktop()->setWindowTitle( aTitle );
3794 \brief Get map of the operations which can be performed
3795 on the module activation.
3797 The method should return the map of the kind \c {<id>:<name>}
3798 where \c <id> is an integer identifier of the operation and
3799 \c <name> is a title for the button to be added to the
3800 dialog box. After user selects the required operation by the
3801 clicking the corresponding button in the dialog box, its identifier
3802 is passed to the moduleActionSelected() method to process
3805 \return map of the operations
3806 \sa moduleActionSelected()
3808 QMap<int, QString> LightApp_Application::activateModuleActions() const
3810 QMap<int, QString> opmap;
3811 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3812 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3817 \brief Called when the used selectes required operation chosen
3818 from "Activate module" dialog box.
3820 Performs the required operation according to the user choice.
3822 \param id operation identifier
3823 \sa activateModuleActions()
3825 void LightApp_Application::moduleActionSelected( const int id )
3840 Updates windows after close document
3842 void LightApp_Application::afterCloseDoc()
3846 CAM_Application::afterCloseDoc();
3850 Updates actions of active module
3852 void LightApp_Application::updateModuleActions()
3855 if ( activeModule() ) {
3856 modName = activeModule()->moduleName();
3857 if ( !isModuleAccessible( modName ) ) {
3858 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3859 foreach( SUIT_Application* app, apps ) {
3860 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3861 if ( lapp && lapp != this )
3862 lapp->removeModuleAction( modName );
3867 LightApp_ModuleAction* moduleAction =
3868 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3870 moduleAction->setActiveModule( modName );
3873 void LightApp_Application::removeModuleAction( const QString& modName )
3875 LightApp_ModuleAction* moduleAction =
3876 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3878 moduleAction->removeModule( modName );
3882 Gets current windows.
3883 \param winMap - output current windows map.
3885 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3888 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3889 ((LightApp_Module*)activeModule())->windows( winMap );
3891 defaultWindows( winMap );
3895 Gets current view managers.
3896 \param lst - output current view managers list.
3898 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3901 if ( !activeStudy() )
3904 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3905 ((LightApp_Module*)activeModule())->viewManagers( lst );
3907 defaultViewManagers( lst );
3913 void LightApp_Application::updateWindows()
3915 QMap<int, int> winMap;
3916 currentWindows( winMap );
3918 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3920 if ( !dockWindow( it.key() ) )
3921 getWindow( it.key() );
3924 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3926 QWidget* wid = it.value();
3927 if ( winMap.contains( it.key() ) )
3928 wid->setVisible( true );
3933 loadDockWindowsState();
3937 Updates view managers
3939 void LightApp_Application::updateViewManagers()
3942 currentViewManagers( lst );
3944 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3945 getViewManager( *it, true );
3949 Loads windows geometry
3951 void LightApp_Application::loadDockWindowsState()
3955 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3956 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3957 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3960 if ( activeModule() )
3961 modName = activeModule()->name();
3962 else if ( activeStudy() )
3963 modName = "nomodule";
3965 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3966 QByteArray aDefaultState;
3967 aResMgr->value( "windows_geometry", modName, aDefaultState );
3968 QByteArray aDefaultVisibility;
3969 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3970 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3971 aResMgr->setWorkingMode( prevMode );
3973 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3976 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3977 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3979 if ( version > Qtx::versionToId( "7.4.1" ) )
3980 aResMgr->value( "windows_geometry", modName , arr );
3982 arr = aDefaultState;
3983 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3984 desktop()->restoreState( aTargetArray );
3987 QStringList mainToolbarsNames;
3988 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3989 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3990 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3992 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3995 QMap<QString, bool> *tbMap = 0;
3996 QMap<QString, bool> *dwMap = 0;
3998 QMap<QString, bool> userTbMap, userDwMap;
3999 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4001 QMap<QString, bool> defaultTbMap, defaultDwMap;
4002 if(hasDefaultVisibility) {
4003 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4009 if(hasDefaultVisibility){
4010 tbMap = &defaultTbMap;
4017 if(hasDefaultVisibility){
4018 dwMap = &defaultDwMap;
4023 QList<QToolBar*> tbList = findToolBars();
4024 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4026 QToolBar* tb = *tit;
4027 if ( tbMap->contains( tb->objectName() ) ) {
4028 tb->setVisible( (*tbMap)[tb->objectName()] );
4034 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4035 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4037 QDockWidget* dw = *dit;
4039 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4040 if ( po != desktop() )
4043 if ( dwMap->contains( dw->objectName() ) )
4044 dw->setVisible( (*dwMap)[dw->objectName()] );
4052 Saves windows geometry
4054 void LightApp_Application::saveDockWindowsState()
4059 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4060 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4062 if( !storeWin && !storeTb )
4066 if ( activeModule() )
4067 modName = activeModule()->name();
4068 else if ( activeStudy() )
4069 modName = "nomodule";
4071 QString versionId = GUI_VERSION_STR;
4072 #if GUI_DEVELOPMENT > 0
4076 QByteArray arr = desktop()->saveState();
4077 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4078 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4081 if ( myWinVis.contains( modName ) )
4082 visArr = myWinVis[modName];
4084 QMap<QString, bool> tbMap, dwMap;
4085 dockWindowsState( visArr, tbMap, dwMap );
4087 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4088 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4091 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4094 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4095 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4097 QDockWidget* wid = *it;
4098 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4101 visArr = dockWindowsState( tbMap, dwMap );
4103 myWinVis.insert( modName, visArr );
4106 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4109 QDataStream stream( &visArr, QIODevice::WriteOnly );
4111 stream << (uchar)ToolBarMarker;
4112 stream << tb.size();
4113 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4115 stream << tit.key();
4116 stream << (uchar)( tit.value() ? 1 : 0 );
4119 stream << (uchar)DockWidgetMarker;
4120 stream << dw.size();
4121 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4123 stream << wit.key();
4124 stream << (uchar)( wit.value() ? 1 : 0 );
4130 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4135 QByteArray visArr = arr;
4136 QDataStream stream( &visArr, QIODevice::ReadOnly );
4140 if ( marker != ToolBarMarker )
4145 for ( int i = 0; i < lines; ++i )
4148 stream >> objectName;
4151 tb.insert( objectName, shown );
4155 if ( marker != DockWidgetMarker )
4159 for ( int j = 0; j < lines; ++j )
4162 stream >> objectName;
4165 dw.insert( objectName, shown );
4170 Adds icon names for modules
4172 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4176 SUIT_ResourceMgr* resMgr = resourceMgr();
4180 QStringList modList;
4181 modules( modList, false );
4183 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4185 QString modName = *it;
4186 QString modIntr = moduleName( modName );
4187 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4189 if ( modIcon.isEmpty() )
4192 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4193 modIcon += QString( ".png" );
4195 iconMap.insert( modName, modIcon );
4200 Inserts items in popup, which necessary for current application
4202 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4205 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4206 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4207 selMgr->setSelectionCacheEnabled( true );
4209 SUIT_DataBrowser* ob = objectBrowser();
4211 CAM_Application::contextMenuPopup( type, thePopup, title );
4213 if ( ob && type == ob->popupClientType() ) {
4214 thePopup->addSeparator();
4215 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4216 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4217 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4220 #ifndef DISABLE_SALOMEOBJECT
4221 if ( selMgr && ob ) {
4222 SALOME_ListIO selected;
4223 selMgr->selectedObjects( selected );
4224 if(selected.Extent() == 1){
4225 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4226 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4227 if(obj && obj->renameAllowed()) {
4228 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4229 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4230 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4231 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4233 QList<QAction*> acts = thePopup->actions();
4234 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4235 thePopup->insertAction(firstAction,a);
4241 selMgr->setSelectionCacheEnabled( cacheIsOn );
4247 void LightApp_Application::createEmptyStudy()
4249 CAM_Application::createEmptyStudy();
4251 if ( objectBrowser() )
4252 objectBrowser()->updateTree();
4254 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4255 if ( aResMgr && activeStudy() ) {
4256 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4257 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4262 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4264 CAM_Application::setDesktop( desk );
4267 connect( desk, SIGNAL( message( const QString& ) ),
4268 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4269 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4270 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4271 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4272 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4278 \param mod - module to be activated
4280 bool LightApp_Application::activateModule( CAM_Module* mod )
4282 bool res = CAM_Application::activateModule( mod );
4284 if ( objectBrowser() )
4285 objectBrowser()->updateTree();
4291 \return keyborad accelerators manager object
4293 SUIT_Accel* LightApp_Application::accel() const
4299 Removes dead widget container from map
4301 void LightApp_Application::onWCDestroyed( QObject* ob )
4303 // remove destroyed widget container from windows map
4304 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4306 if ( itr.value() != ob )
4309 int key = itr.key();
4310 myWin.remove( key );
4315 void LightApp_Application::onMRUActivated( const QString& name )
4317 SUIT_Session* s = SUIT_Session::session();
4318 if ( s && s->activeApplication() == this )
4322 void LightApp_Application::onStylePreferences()
4324 #ifdef USE_SALOME_STYLE
4325 Style_PrefDlg dlg( desktop() );
4328 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4329 #endif // USE_SALOME_STYLE
4332 void LightApp_Application::onFullScreen(){
4333 if(myScreenHelper) {
4334 if(desktop()->isFullScreen())
4335 myScreenHelper->switchToNormalScreen();
4337 myScreenHelper->switchToFullScreen();
4342 Connects just added view manager
4344 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4346 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4347 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4348 CAM_Application::addViewManager( vm );
4352 Remove view manager from memory
4354 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4356 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4357 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4358 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4360 aStudy->removeObjectProperties( vm->getGlobalId() );
4362 CAM_Application::removeViewManager( vm );
4364 LightApp_SelectionMgr* selMgr = selectionMgr();
4365 QList<SUIT_Selector*> selectors;
4366 selMgr->selectors( selectors );
4367 foreach( SUIT_Selector* selector, selectors ) {
4368 if ( selector->owner() == vm->getViewModel() ) {
4373 // IPAL22894: Crash on closing OCC view
4379 Renames active window of desktop
4381 void LightApp_Application::onRenameWindow()
4386 QWidget* w = desktop()->activeWindow();
4391 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4392 if( ok && !name.isEmpty() )
4393 w->setWindowTitle( name );
4397 Closes active window of desktop
4399 void LightApp_Application::onCloseWindow()
4404 QWidget* w = desktop()->activeWindow();
4412 Closes all windows of desktop
4414 void LightApp_Application::onCloseAllWindow()
4416 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4420 QList<SUIT_ViewWindow*> wndList = desk->windows();
4421 SUIT_ViewWindow* wnd;
4422 foreach( wnd, wndList )
4430 Groups all windows of desktop
4432 void LightApp_Application::onGroupAllWindow()
4434 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4438 QtxWorkstack* wgStack = desk->workstack();
4444 \return if the library of module exists
4445 \param moduleTitle - title of module
4447 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4449 if( moduleTitle.isEmpty() )
4452 QString lib = moduleLibrary( moduleTitle );
4454 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4455 bool isPythonModule = lib.contains("SalomePyQtGUI");
4456 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4460 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4461 #elif defined(__APPLE__)
4462 paths = QString(::getenv( "DYLD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4464 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4467 bool isLibFound = false;
4468 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4469 for( ; anIt!=aLast; anIt++ )
4471 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4482 INFOS( "\n****************************************************************" << std::endl
4483 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4484 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4485 << "****************************************************************" << std::endl );
4487 else if ( !isPythonModule && !isPythonLightModule)
4490 if ( isPythonModule || isPythonLightModule)
4492 QString pylib = moduleName( moduleTitle ) + QString(".py");
4493 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4495 // Check the python library
4497 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4499 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4501 bool isPyLib = false, isPyGuiLib = false;
4502 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4503 for( ; anIt!=aLast; anIt++ )
4505 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4506 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4508 if(!isPythonLightModule)
4509 if( !isPyLib && inf.exists() )
4512 if( !isPyGuiLib && infgui.exists() )
4515 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4519 printf( "\n****************************************************************\n" );
4520 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4522 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4524 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4525 printf( "****************************************************************\n" );
4532 \return default name for an active study
4534 void LightApp_Application::setDefaultStudyName( const QString& theName )
4536 QStringList anInfoList;
4537 modules( anInfoList, false );
4539 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4540 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4541 !aStudy->isSaved() )
4543 aStudy->setStudyName( theName );
4544 updateDesktopTitle();
4549 Custom event handler
4551 bool LightApp_Application::event( QEvent* e )
4553 if( e && e->type()==2000 )
4555 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4556 QString* d = ( QString* )ce->data();
4557 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4559 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4560 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4561 showPreferences( tr( "PREF_APP" ) );
4566 return CAM_Application::event( e );
4569 /*! Check data object */
4570 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4574 bool isSuitable = !theObj->entry().isEmpty() &&
4575 !theObj->componentDataType().isEmpty() &&
4576 !theObj->name().isEmpty();
4583 int LightApp_Application::openChoice( const QString& aName )
4585 int choice = CAM_Application::openChoice( aName );
4587 if ( choice == OpenExist ) // The document is already open.
4589 // Do you want to reload it?
4590 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4591 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4592 choice = OpenReload;
4598 bool LightApp_Application::openAction( const int choice, const QString& aName )
4605 STD_Application* app = 0;
4606 SUIT_Session* session = SUIT_Session::session();
4607 QList<SUIT_Application*> appList = session->applications();
4608 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4610 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4611 app = ::qobject_cast<STD_Application*>( *it );
4616 app->onCloseDoc( false );
4617 appList = session->applications();
4618 STD_Application* other = 0;
4619 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4620 other = ::qobject_cast<STD_Application*>( *it );
4623 res = other->onOpenDoc( aName );
4628 res = CAM_Application::openAction( choice, aName );
4635 QStringList LightApp_Application::viewManagersTypes() const
4637 QStringList aTypesList;
4638 aTypesList += myUserWmTypes;
4639 #ifndef DISABLE_GLVIEWER
4640 aTypesList<<GLViewer_Viewer::Type();
4642 #ifndef DISABLE_PLOT2DVIEWER
4643 aTypesList<<Plot2d_Viewer::Type();
4645 #ifndef DISABLE_QXGRAPHVIEWER
4646 aTypesList<<QxScene_Viewer::Type();
4648 #ifndef DISABLE_PVVIEWER
4649 aTypesList<<PVViewer_Viewer::Type();
4651 #ifndef DISABLE_PYVIEWER
4652 aTypesList<<PyViewer_Viewer::Type();
4654 #ifndef DISABLE_OCCVIEWER
4655 aTypesList<<OCCViewer_Viewer::Type();
4657 #ifndef DISABLE_VTKVIEWER
4658 #ifndef DISABLE_SALOMEOBJECT
4659 aTypesList<<SVTK_Viewer::Type();
4661 aTypesList<<VTKViewer_Viewer::Type();
4667 * Removes all view managers of known types
4668 * Other view managers are ignored
4670 void LightApp_Application::clearKnownViewManagers()
4672 QStringList aTypesList = viewManagersTypes();
4673 QList<SUIT_ViewManager*> aMgrList;
4674 viewManagers( aMgrList );
4675 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4676 if (aTypesList.contains(aMgr->getType()))
4677 removeViewManager(aMgr);
4682 Copy of current selection
4684 void LightApp_Application::onCopy()
4686 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4692 Paste of current data in clipboard
4694 void LightApp_Application::onPaste()
4696 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4702 Browse (i.e. set focus on) the published objects
4703 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4704 has been accepted by Ok (or Apply & Close) button
4705 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4706 (to select the first published object only)
4707 \return entry of the selected object
4709 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4710 const bool theIsApplyAndClose,
4711 const bool theIsOptimizedBrowsing )
4714 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4716 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4717 switch( aBrowsePolicy )
4721 case BP_ApplyAndClose:
4722 if( !theIsApplyAndClose )
4730 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4734 SUIT_DataBrowser* anOB = objectBrowser();
4738 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4742 QStringListIterator anIter( theEntryList );
4743 if( theIsOptimizedBrowsing )
4745 // go to the last entry
4747 if( anIter.hasPrevious() )
4751 // scroll to each entry in the list
4752 // (in optimized mode - to the last entry only)
4754 LightApp_DataObject* anObject = 0;
4755 while( anIter.hasNext() )
4757 anEntry = anIter.next();
4758 if( !anEntry.isEmpty() )
4760 anObject = aStudy->findObjectByEntry( anEntry );
4763 QModelIndex anIndex = aModel->index( anObject );
4764 anOB->treeView()->scrollTo( anIndex );
4769 // always select the last object
4770 if( anObject && !anEntry.isEmpty() )
4772 QList<SUIT_Selector*> aSelectorList;
4773 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4774 if( !aSelectorList.isEmpty() )
4776 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4778 bool anIsAutoBlock = aSelector->autoBlock();
4780 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4781 aSelector->setAutoBlock( false );
4783 SUIT_DataOwnerPtrList aList;
4784 #ifndef DISABLE_SALOMEOBJECT
4785 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4786 ( anObject->entry().toLatin1().constData(),
4787 anObject->componentDataType().toLatin1().constData(),
4788 anObject->name().toLatin1().constData() );
4789 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4791 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4794 aList.append( owner );
4795 selectionMgr()->setSelected( aList );
4798 // restore auto block flag
4799 aSelector->setAutoBlock( anIsAutoBlock );
4807 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4809 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4810 return study ? study->findObjectByEntry( id ) : 0;
4814 Checks that an object can be renamed.
4815 \param entry entry of the object
4816 \brief Return \c true if object can be renamed
4818 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4823 Rename object by entry.
4824 \param entry entry of the object
4825 \param name new name of the object
4826 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4828 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4832 /*! Process standard messages from desktop */
4833 void LightApp_Application::onDesktopMessage( const QString& message )
4835 const QString sectionSeparator = "/";
4837 if ( message.toLower() == "updateobjectbrowser" ||
4838 message.toLower() == "updateobjbrowser" ) {
4839 // update object browser
4840 updateObjectBrowser();
4842 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4843 QString vtype = message.split( sectionSeparator ).last();
4844 if ( !vtype.isEmpty() )
4845 getViewManager( vtype, true );
4848 QStringList data = message.split( sectionSeparator );
4849 if ( data.count() > 1 ) {
4850 QString msgType = data[0].trimmed();
4851 LightApp_Module* sMod = 0;
4852 CAM_Module* mod = module( msgType );
4854 mod = module( moduleTitle( msgType ) );
4855 if ( mod && mod->inherits( "LightApp_Module" ) )
4856 sMod = (LightApp_Module*)mod;
4858 if ( msgType.toLower() == "preferences" ) {
4859 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4860 // for example "preferences/Study/multi_file_dump/true"
4861 if ( data.count() > 3 ) {
4862 QString section = data[1].trimmed();
4863 QString param = data[2].trimmed();
4864 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4865 resourceMgr()->setValue( section, param, value );
4869 // received message for the module
4870 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4871 sMod->message( msg );
4879 Returns all top level toolbars.
4880 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4882 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4884 QList<QToolBar*> aResult;
4885 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4886 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4887 QToolBar* tb = *tit;
4888 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4889 if ( po != desktop() )
4891 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4898 Internal method to parse toolbars and dockable windows state.
4900 QByteArray LightApp_Application::processState(QByteArray& input,
4901 const bool processWin,
4902 const bool processTb,
4903 const bool isRestoring,
4904 QByteArray defaultState) {
4907 bool hasDefaultState = !defaultState.isEmpty();
4908 bool isDockWinWriten = false;
4910 //Write date from users settings
4912 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4913 int marker, version;
4915 tmpInputData >> marker;
4916 tmpInputData >> version;
4917 tmpInputData >> dockmarker;
4918 tmpInputData >> nbDocWin;
4920 if(processWin && processTb && !isRestoring) {
4922 } else if(!processWin && !processTb ) {
4924 aRes = defaultState;
4926 QDataStream aData(&aRes, QIODevice::WriteOnly);
4927 QList<QToolBar*> aToolBars = findToolBars();
4930 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4931 QToolBar* tb = *tit;
4932 aNames.append(tb->objectName());
4935 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4936 if(toolBarMarkerIndex < 0)
4938 QDataStream anInputData(&input, QIODevice::ReadOnly);
4940 int toolBarMarkerIndexDef;
4941 if(hasDefaultState) {
4942 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4943 if(toolBarMarkerIndexDef < 0)
4946 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4948 QDataStream* aTargetData = 0;
4949 int aTargetIndex = -1;
4951 QByteArray currentArr = desktop()->saveState();
4952 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4953 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4954 if(processWin && useInputData) {
4955 aTargetData = &anInputData;
4956 aTargetIndex = toolBarMarkerIndex;
4958 //Write date from default settings
4959 if(hasDefaultState) {
4960 aTargetData = &anInputDataDef;
4961 aTargetIndex = toolBarMarkerIndexDef;
4963 //If no default state, write current snapshot of the dockable windows
4965 aTargetData = &anInputDataCur;
4966 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4967 aTargetIndex = toolBarMarkerIndexCur;
4972 if(aTargetData && aTargetIndex >= 0 ) {
4973 aTargetData->device()->seek(0);
4974 while( aTargetData->device()->pos() < aTargetIndex ) {
4979 isDockWinWriten = true;
4986 aTargetData = &anInputData;
4987 aTargetIndex = toolBarMarkerIndex;
4989 if(hasDefaultState) {
4990 aTargetData = &anInputDataDef;
4991 aTargetIndex = toolBarMarkerIndexDef;
4995 if(aTargetData && aTargetIndex >= 0) {
4997 if(!isDockWinWriten ) {
4998 //Write version marker
4999 int marker, version;
5000 aTargetData->device()->seek(0);
5001 *aTargetData >> marker;
5002 *aTargetData >> version;
5005 aData << (uchar) QDockWidgetMarker;
5007 int shift = 4*sizeof(int) + sizeof(QSize);
5008 index = aTargetIndex - shift;
5010 index = aTargetIndex;
5013 aTargetData->device()->seek(index);
5014 while(!aTargetData->atEnd()) {
5019 } else { // Not treat toolbars
5020 aData << (uchar) QToolBarMarker;
5021 aData << (int) 0; //Nb toolbars = 0
5028 \brief Emits operationFinished signal.
5029 \param theModuleName the name of the module which perfomed the operation
5030 \param theOperationName the operation name
5031 \param theEntryList the list of the created objects entries
5033 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5034 const QString& theOperationName,
5035 const QStringList& theEntryList )
5037 emit operationFinished( theModuleName, theOperationName, theEntryList );
5041 Update visibility state of given objects
5043 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5044 SUIT_ViewModel* theViewModel )
5046 if ( !theViewModel || theList.isEmpty() ) return;
5048 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5049 if ( !aStudy ) return;
5051 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5053 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5054 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5056 if ( !obj || aStudy->isComponent( obj->entry() ) )
5059 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5060 if ( anObjModule ) {
5061 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5063 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5064 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5065 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5066 anObjState = Qtx::ShownState;
5068 anObjState = Qtx::HiddenState;
5070 aStudy->setVisibilityState( obj->entry(), anObjState );
5077 * Called when window activated
5079 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5081 SUIT_DataBrowser* anOB = objectBrowser();
5084 SUIT_DataObject* rootObj = anOB->root();
5088 DataObjectList listObj = rootObj->children( true );
5090 SUIT_ViewModel* vmod = 0;
5091 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5092 vmod = vman->getViewModel();
5093 updateVisibilityState( listObj, vmod );
5097 Called then view manager removed
5099 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5101 ViewManagerList lst;
5102 viewManagers( lst );
5103 if ( lst.count() == 1) { // in case if closed last view window
5104 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5106 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5111 Check existing document.
5113 bool LightApp_Application::checkExistingDoc()
5116 if( activeStudy() ) {
5117 int answer = SUIT_MessageBox::question( desktop(),
5118 tr( "APPCLOSE_CAPTION" ),
5119 tr( "STUDYCLOSE_DESCRIPTION" ),
5120 tr( "APPCLOSE_SAVE" ),
5121 tr( "APPCLOSE_CLOSE" ),
5122 tr( "APPCLOSE_CANCEL" ), 0 );
5124 if ( activeStudy()->isSaved() ) {
5127 } else if ( onSaveAsDoc() ) {
5128 if( !closeDoc( false ) ) {
5135 else if( answer == 1 ) {
5137 } else if( answer == 2 ) {
5144 #ifndef DISABLE_PYCONSOLE
5146 PyConsole_Interp* LightApp_Application::getPyInterp()
5148 static PyConsole_Interp* myInterp = 0;
5150 myInterp = createPyInterp();
5151 myInterp->initialize();
5156 PyConsole_Interp* LightApp_Application::createPyInterp()
5158 return new PyConsole_Interp();
5161 #endif // DISABLE_PYCONSOLE