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 "PyConsole_Interp.h"
39 #include "LightApp_PyEditor.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 // Markers used to parse array with dockable windows and toolbars state.
234 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
235 // in the Qt source code.
237 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
238 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
240 // Format of the Byte array with the windows and toolbar state is:
241 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
243 //Find toolbar marker position in the array in the following way:
244 //since the 'toolbar marker' is not unique, find index of first occurrence of the
245 //'toolbar marker' in the array and check that next string is name of the toolbar
247 void LightAppCleanUpAppResources()
249 if ( LightApp_Application::_prefs_ ) {
250 delete LightApp_Application::_prefs_;
251 LightApp_Application::_prefs_ = 0;
257 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
258 int aResult = -1,tmp = 0;
259 int inputLen = input.length();
260 QDataStream anInputData( &input, QIODevice::ReadOnly );
261 while ( tmp < inputLen ) {
262 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
265 anInputData.device()->seek( tmp );
269 anInputData >> lines;
271 if ( lines == 0 && anInputData.atEnd() ) {
272 //Case then array doesn't contain information about toolbars,
283 if ( aFlags.contains( str ) ) {
291 QString langToName( const QString& lang )
293 // special processing for English language to avoid such result as "American English"
294 // as Qt cannot just say "English"
299 result = QLocale( lang ).nativeLanguageName();
304 /*!Create new instance of LightApp_Application.*/
305 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
307 return new LightApp_Application();
310 /*! \var global preferences of LightApp */
311 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
315 \class LightApp_Application
316 Application containing LightApp module
320 LightApp_Application::LightApp_Application()
321 : CAM_Application( false ),
323 myScreenHelper(new LightApp_FullScreenHelper())
325 Q_INIT_RESOURCE( LightApp );
327 STD_TabDesktop* desk = new STD_TabDesktop();
328 desk->setFullScreenAllowed(false);
329 desk->setMinimizeAllowed(false);
333 // initialize auto save timer
334 myAutoSaveTimer = new QTimer( this );
335 myAutoSaveTimer->setSingleShot( true );
336 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
338 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
340 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
341 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
343 desktop()->setWindowIcon( aLogo );
344 desktop()->setDockableMenuBar( false );
345 desktop()->setDockableStatusBar( false );
347 // base logo (salome itself)
348 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
349 // extra logo (salome-based application)
350 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
354 mySelMgr = new LightApp_SelectionMgr( this );
356 myAccel = SUIT_Accel::getAccel();
358 #ifndef DISABLE_OCCVIEWER
359 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
372 #ifndef DISABLE_VTKVIEWER
373 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
386 #ifndef DISABLE_PLOT2DVIEWER
387 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
388 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
389 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
397 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
398 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
399 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
400 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
401 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
404 // Set existing font for the python console in resources
405 if( !aResMgr->hasValue( "PyConsole", "font" ) )
408 QFont f = aResMgr->fontValue( "PyConsole", "font" );
410 QStringList famdb = fdb.families();
412 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
415 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
417 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
420 if ( famdb.contains(aFamily) )
422 f.setFamily( aFamily );
423 aResMgr->setValue( "PyConsole", "font", f );
430 *\li Save window geometry.
431 *\li Save desktop geometry.
432 *\li Save resource maneger.
433 *\li Delete selection manager.
435 LightApp_Application::~LightApp_Application()
439 delete myScreenHelper;
443 /*!Start application.*/
444 void LightApp_Application::start()
446 CAM_Application::start();
449 updateViewManagers();
450 updateCommandsStatus();
453 desktop()->statusBar()->showMessage( "" );
455 LightApp_EventFilter::Init();
460 /*!Closeapplication.*/
461 void LightApp_Application::closeApplication()
463 #ifndef DISABLE_QTXWEBBROWSER
464 QProcess::startDetached( "HelpBrowser",
465 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
467 CAM_Application::closeApplication();
470 /*!Gets application name.*/
471 QString LightApp_Application::applicationName() const
473 static QString _app_name;
474 if ( _app_name.isEmpty() )
475 _app_name = tr( "APP_NAME" );
479 /*!Gets application version.*/
480 QString LightApp_Application::applicationVersion() const
482 static QString _app_version;
484 if ( _app_version.isEmpty() )
486 QString resVersion = tr( "APP_VERSION" );
487 if ( resVersion != "APP_VERSION" )
489 _app_version = resVersion;
493 _app_version = GUI_VERSION_STR;
499 /*!Load module by \a name.*/
500 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
502 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
505 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
506 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
507 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
512 /*!Activate module by \a modName*/
513 bool LightApp_Application::activateModule( const QString& modName )
516 CAM_Module* prevMod = activeModule();
519 actName = prevMod->moduleName();
521 if ( actName == modName )
524 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
526 saveDockWindowsState();
528 bool status = CAM_Application::activateModule( modName );
530 updateModuleActions();
538 updateViewManagers();
540 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
541 if ( objectBrowser()->root() != activeStudy()->root() )
542 objectBrowser()->setRoot( activeStudy()->root() );
543 updateObjectBrowser( true );
546 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
551 /*!Gets selection manager.*/
552 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
557 /*!Creat action "New window" for certain type of viewer:*/
558 void LightApp_Application::createActionForViewer( const int id,
560 const QString& suffix,
563 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
564 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
565 QAction* a = createAction( id, // menu action id
572 false, // toggle flag
574 SLOT( onNewWindow() ) ); // slot
575 createMenu( a, parentId, -1 );
580 void LightApp_Application::createActions()
582 CAM_Application::createActions();
584 SUIT_Desktop* desk = desktop();
585 SUIT_ResourceMgr* resMgr = resourceMgr();
588 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
589 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
590 Qt::CTRL+Qt::Key_P, desk, false, this, SLOT( onPreferences() ) );
594 // - Help for modules
596 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
597 createMenu( separator(), helpMenu, -1, 10 );
598 QStringList aModuleList;
599 modules( aModuleList, false );
600 aModuleList.prepend( "GUI" );
601 aModuleList.prepend( "KERNEL" );
603 int id = LightApp_Application::UserID + FIRST_HELP_ID;
606 foreach( aModule, aModuleList ) {
607 if ( aModule.isEmpty() ) // module title (user name)
609 IMap <QString, QString> helpData; // list of help files for the module
610 QString helpSubMenu; // help submenu name (empty if not needed)
611 QString modName = moduleName( aModule ); // module name
612 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
613 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
614 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
616 if (resMgr->hasValue( modName, "documentation" ) )
617 docSection = resMgr->stringValue(modName, "documentation");
618 else if ( resMgr->hasSection( modName + "_documentation" ) )
619 docSection = modName + "_documentation";
620 if ( !docSection.isEmpty() ) {
621 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
622 QStringList listOfParam = resMgr->parameters( docSection );
623 foreach( QString paramName, listOfParam ) {
624 QString valueStr = resMgr->stringValue( docSection, paramName );
625 if ( !valueStr.isEmpty() ) {
626 QFileInfo fi( valueStr );
627 if ( fi.isRelative() && !modDir.isEmpty() )
628 valueStr = Qtx::addSlash( modDir ) + valueStr;
629 if ( QFile::exists( valueStr ) )
630 helpData.insert( paramName.arg( aModule ), valueStr );
635 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
636 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
637 QString indexFile = idxLst.join( QDir::separator() ); // index file
638 if ( QFile::exists( indexFile ) )
639 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
642 IMapConstIterator<QString, QString > fileIt;
643 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
644 QString helpFileName = fileIt.key();
645 // remove all '//' occurances
646 while ( helpFileName.contains( "//" ) )
647 helpFileName.replace( "//", "" );
648 // obtain submenus hierarchy if given
649 QStringList smenus = helpFileName.split( "/" );
650 helpFileName = smenus.last();
652 QAction* a = createAction( id, helpFileName,
653 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
654 helpFileName, helpFileName,
655 0, desk, false, this, SLOT( onHelpContentsModule() ) );
656 a->setData( fileIt.value() );
657 if ( !helpSubMenu.isEmpty() ) {
658 smenus.prepend( helpSubMenu );
660 // create sub-menus hierarchy
661 int menuId = helpMenu;
662 foreach ( QString subMenu, smenus ) {
663 menuId = createMenu( subMenu, menuId, -1, 0 );
665 createMenu( a, menuId, -1, 0 );
670 // - Additional help items
672 createMenu( separator(), helpMenu, -1, 5 );
674 QStringList addHelpItems = resMgr->parameters( "add_help" );
675 foreach ( QString addHelpItem, addHelpItems ) {
676 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
677 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
678 QAction* a = createAction( id, addHelpItem,
679 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
680 addHelpItem, addHelpItem,
681 0, desk, false, this, SLOT( onHelpContentsModule() ) );
682 a->setData( valueStr );
683 createMenu( a, helpMenu, -1, 5 );
689 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
690 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
691 registerAction( MRUId, mru );
693 // default icon for neutral point ('SALOME' module)
694 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
695 if ( defIcon.isNull() )
696 defIcon = QPixmap( imageEmptyIcon );
698 //! default icon for any module
699 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
700 if ( modIcon.isNull() )
701 modIcon = QPixmap( imageEmptyIcon );
704 modules( modList, false );
706 if ( modList.count() > 1 )
708 LightApp_ModuleAction* moduleAction =
709 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
711 QMap<QString, QString> iconMap;
712 moduleIconNames( iconMap );
714 const int iconSize = 20;
716 QStringList::Iterator it;
717 for ( it = modList.begin(); it != modList.end(); ++it )
719 if ( !isModuleAccessible( *it ) )
722 QString modName = moduleName( *it );
725 if ( iconMap.contains( *it ) )
726 iconName = iconMap[*it];
728 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
733 "****************************************************************" << std::endl <<
734 " Warning: icon for " << qPrintable(*it) << " is not found!" << std::endl <<
735 " Using the default icon." << std::endl <<
736 "****************************************************************" << std::endl);
738 icon = Qtx::scaleIcon( icon, iconSize );
740 moduleAction->insertModule( *it, icon );
743 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
744 this, SLOT( onModuleActivation( const QString& ) ) );
745 registerAction( ModulesListId, moduleAction );
749 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
750 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
752 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
753 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
754 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
755 0, desk, false, this, SLOT( onCloseAllWindow() ) );
756 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
757 0, desk, false, this, SLOT( onGroupAllWindow() ) );
759 createMenu( CloseId, windowMenu, 0, -1 );
760 createMenu( CloseAllId, windowMenu, 0, -1 );
761 createMenu( GroupAllId, windowMenu, 0, -1 );
762 createMenu( separator(), windowMenu, -1, 0 );
764 #ifndef DISABLE_GLVIEWER
765 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
767 #ifndef DISABLE_PLOT2DVIEWER
768 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
770 #ifndef DISABLE_OCCVIEWER
771 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
773 #ifndef DISABLE_VTKVIEWER
774 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
776 #ifndef DISABLE_QXGRAPHVIEWER
777 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
779 #ifndef DISABLE_GRAPHICSVIEW
780 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
782 #ifndef DISABLE_PVVIEWER
783 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
785 #ifndef DISABLE_PYVIEWER
786 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
789 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
790 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
791 createMenu( RenameId, windowMenu, -1 );
793 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
794 createMenu( PreferencesId, fileMenu, 50, -1 );
795 createMenu( separator(), fileMenu, -1, 50, -1 );
797 createMenu( separator(), fileMenu, -1, 100, -1 );
798 createMenu( MRUId, fileMenu, 100, -1 );
799 createMenu( separator(), fileMenu, -1, 100, -1 );
801 #ifdef USE_SALOME_STYLE
802 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
803 0, desk, false, this, SLOT( onStylePreferences() ) );
804 #endif // USE_SALOME_STYLE
806 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
807 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
810 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
811 createMenu( separator(), viewMenu, -1, 20, -1 );
812 #ifdef USE_SALOME_STYLE
813 createMenu( StyleId, viewMenu, 20, -1 );
814 #endif // USE_SALOME_STYLE
815 createMenu( FullScreenId, viewMenu, 20, -1 );
817 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
818 QString( "SalomeModules" ) ); // name (language-independant)
819 createTool( ModulesListId, modTBar );
822 /*!On module activation action.*/
823 void LightApp_Application::onModuleActivation( const QString& modName )
825 // Force user to create/open a study before module activation
826 QMap<QString, QString> iconMap;
827 moduleIconNames( iconMap );
828 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
830 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
832 bool cancelled = false;
834 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
835 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
836 QMap<int, QString> opmap = activateModuleActions();
837 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
838 aDlg.addButton( it.value(), it.key() );
840 int res = aDlg.exec();
842 // some operation is selected
843 moduleActionSelected( res );
847 putInfo( tr("INF_CANCELLED") );
849 LightApp_ModuleAction* moduleAction =
850 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
852 moduleAction->setActiveModule( QString() );
858 activateModule( modName );
861 /*!Default module activation.*/
862 QString LightApp_Application::defaultModule() const
864 QStringList aModuleNames;
865 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
866 //! If there's the one and only module --> activate it automatically
867 //! TODO: Possible improvement - default module can be taken from preferences
868 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
871 /*!On new window slot.*/
872 void LightApp_Application::onNewWindow()
874 const QObject* obj = sender();
875 if ( !obj || !obj->inherits( "QAction" ) )
879 int id = actionId( (QAction*)obj );
882 #ifndef DISABLE_GLVIEWER
884 type = GLViewer_Viewer::Type();
887 #ifndef DISABLE_PLOT2DVIEWER
889 type = Plot2d_Viewer::Type();
892 #ifndef DISABLE_OCCVIEWER
894 type = OCCViewer_Viewer::Type();
897 #ifndef DISABLE_VTKVIEWER
899 type = VTKViewer_Viewer::Type();
902 #ifndef DISABLE_QXGRAPHVIEWER
903 case NewQxSceneViewId:
904 type = QxScene_Viewer::Type();
907 #ifndef DISABLE_GRAPHICSVIEW
908 case NewGraphicsViewId:
909 type = GraphicsView_Viewer::Type();
912 #ifndef DISABLE_PVVIEWER
914 type = PVViewer_Viewer::Type();
917 #ifndef DISABLE_PYVIEWER
919 type = PyViewer_Viewer::Type();
924 if ( !type.isEmpty() )
925 createViewManager( type );
929 SLOT: Creates new document
931 void LightApp_Application::onNewDoc()
933 if ( !checkExistingDoc() )
936 //asl: fix for 0020515
937 saveDockWindowsState();
939 CAM_Application::onNewDoc();
943 SLOT: Opens new document
945 void LightApp_Application::onOpenDoc()
947 SUIT_Study* study = activeStudy();
949 if ( !checkExistingDoc() )
952 CAM_Application::onOpenDoc();
954 if ( !study ) // new study will be create in THIS application
957 updateViewManagers();
962 SLOT: Opens new document.
963 \param aName - name of file
965 bool LightApp_Application::onOpenDoc( const QString& aName )
967 if ( !checkExistingDoc() )
970 saveDockWindowsState();
972 // We should take mru action first because this application instance can be deleted later.
973 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
975 bool res = CAM_Application::onOpenDoc( aName );
980 mru->insert( aName );
982 mru->remove( aName );
988 SLOT: Displays "About" message box
990 void LightApp_Application::onHelpAbout()
992 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
997 Private SLOT: Called on selection is changed
998 Dispatchs active module that selection is changed
1000 void LightApp_Application::onSelection()
1002 //MESSAGE("onSelection")
1003 onSelectionChanged();
1005 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1006 ((LightApp_Module*)activeModule())->selectionChanged();
1011 \param study - SUIT_Study.
1013 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1015 CAM_Application::setActiveStudy( study );
1019 Enables/Disables menu items and toolbar buttons. Rebuild menu
1021 void LightApp_Application::updateCommandsStatus()
1023 CAM_Application::updateCommandsStatus();
1026 #ifndef DISABLE_GLVIEWER
1027 a = action( NewGLViewId );
1029 a->setEnabled( activeStudy() );
1032 #ifndef DISABLE_PLOT2DVIEWER
1033 a = action( NewPlot2dId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_OCCVIEWER
1039 a = action( NewOCCViewId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_VTKVIEWER
1045 a = action( NewVTKViewId );
1047 a->setEnabled( activeStudy() );
1050 #ifndef DISABLE_QXGRAPHVIEWER
1051 a = action( NewQxSceneViewId );
1053 a->setEnabled( activeStudy() );
1056 #ifndef DISABLE_GRAPHICSVIEW
1057 a = action( NewGraphicsViewId );
1059 a->setEnabled( activeStudy() );
1062 #ifndef DISABLE_PVVIEWER
1063 a = action( NewPVViewId );
1065 a->setEnabled( activeStudy() );
1068 #ifndef DISABLE_PYVIEWER
1069 a = action( NewPyViewerId );
1071 a->setEnabled( activeStudy() );
1077 Runs system command in separate thread
1079 class RunBrowser: public QThread
1082 RunBrowser( LightApp_Application* app,
1083 const QString& theApp,
1084 const QString& theParams,
1085 const QString& theHelpFile,
1086 const QString& theContext = QString() )
1088 myParams( theParams ),
1089 myContext( theContext ),
1093 //For the external browser always specify 'file://' protocol,
1094 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1095 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1100 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1101 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1103 QProcess* proc = new QProcess();
1105 proc->start( aCommand );
1106 if ( !proc->waitForStarted() ) {
1107 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1108 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1109 ce2000->setData( msg );
1110 QApplication::postEvent( myLApp, ce2000 );
1121 LightApp_Application* myLApp;
1125 SLOT: Displays help contents for choosen module
1127 void LightApp_Application::onHelpContentsModule()
1129 const QAction* a = (QAction*) sender();
1130 QString helpFile = a->data().toString();
1131 if ( helpFile.isEmpty() ) return;
1133 SUIT_ResourceMgr* resMgr = resourceMgr();
1136 platform = "winapplication";
1138 platform = "application";
1140 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1142 QString quote("\"");
1143 anApp.prepend( quote );
1144 anApp.append( quote );
1146 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1147 #if DISABLE_QTXWEBBROWSER
1148 bool useExtBrowser = true;
1150 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1153 if( useExtBrowser ) {
1154 if ( !anApp.isEmpty() ) {
1155 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1159 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1160 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1161 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1163 showPreferences( tr( "PREF_APP" ) );
1167 QStringList parameters;
1168 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1169 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1170 parameters << helpFile;
1171 QProcess::startDetached( "HelpBrowser", parameters );
1176 SLOT: Displays help contents for choosen dialog
1178 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1179 const QString& theFileName,
1180 const QString& theContext )
1182 QString fileName = theFileName;
1183 QString context = theContext;
1184 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1185 // context might be passed within theFileName argument
1186 QStringList comps = fileName.split("#");
1187 if ( comps.count() > 1 ) {
1188 context = comps.last();
1190 fileName = comps.join("#");
1194 QString homeDir = "";
1195 if ( !theComponentName.isEmpty() ) {
1196 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1197 if ( !dir.isEmpty() )
1198 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1199 Qtx::addSlash( "share" ) +
1200 Qtx::addSlash( "doc" ) +
1201 Qtx::addSlash( "salome" ) +
1202 Qtx::addSlash( "gui" ) +
1203 Qtx::addSlash( theComponentName ) );
1206 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1207 SUIT_ResourceMgr* resMgr = resourceMgr();
1210 platform = "winapplication";
1212 platform = "application";
1214 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1216 QString quote("\"");
1217 anApp.prepend( quote );
1218 anApp.append( quote );
1221 #if DISABLE_QTXWEBBROWSER
1222 bool useExtBrowser = true;
1224 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1228 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1230 if ( !anApp.isEmpty() ) {
1231 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1235 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1236 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1237 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1238 showPreferences( tr( "PREF_APP" ) );
1242 QStringList parameters;
1243 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1244 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1245 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1246 QProcess::startDetached( "HelpBrowser", parameters );
1251 Sets enable or disable some actions on selection changed.
1253 void LightApp_Application::onSelectionChanged()
1255 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1256 bool canCopy = m ? m->canCopy() : false;
1257 bool canPaste = m ? m->canPaste() : false;
1259 action( EditCopyId )->setEnabled(canCopy);
1260 action( EditPasteId )->setEnabled(canPaste);
1264 SLOT: Performs some actions when dockable windows are triggered
1266 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1270 QWidget* LightApp_Application::dockWindow( const int id ) const
1273 if ( myWin.contains( id ) )
1278 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1283 QDockWidget* dock = 0;
1284 QWidget* w = wid->parentWidget();
1285 while ( w && !dock )
1287 dock = ::qobject_cast<QDockWidget*>( w );
1288 w = w->parentWidget();
1293 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1298 if ( wid != dockWindow( id ) )
1299 removeDockWindow( id );
1301 myWin.insert( id, wid );
1303 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1304 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1306 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1307 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1308 QString( "%1Dock" ).arg( wid->objectName() ) );
1309 dock->setWidget( wid );
1310 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1311 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1312 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1314 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1315 if ( !accel.isEmpty() )
1316 dock->toggleViewAction()->setShortcut( accel );
1321 void LightApp_Application::removeDockWindow( const int id )
1323 QWidget* wid = dockWindow( id );
1329 QDockWidget* dock = windowDock( wid );
1333 dock->setWidget( 0 );
1334 wid->setParent( 0 );
1335 wid->setVisible( false );
1339 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1341 QDockWidget* dock = windowDock( dockWindow( id ) );
1342 if ( dock && desktop() ) {
1343 desktop()->addDockWidget( place, dock );
1344 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1345 if ( a ) a->update();
1351 \param flag - key for window
1352 Flag used how identificator of window in windows list.
1354 QWidget* LightApp_Application::getWindow( const int flag)
1356 QWidget* wid = dockWindow( flag );
1358 insertDockWindow( flag, wid = createWindow( flag ) );
1360 QMap<int, int> winMap;
1361 currentWindows( winMap );
1362 if ( winMap.contains( flag ) )
1363 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1369 \return Object Browser
1371 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1373 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1379 LogWindow* LightApp_Application::logWindow()
1381 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1384 #ifndef DISABLE_PYCONSOLE
1386 This returns the python console integrated to the GUI. Depending
1387 when you request the python console, this function could return
1388 null. Then the optional parameter force (default to false) can be
1389 set to force the creation of the python console if it is not done
1391 \param force - if true, the pythonConsole is created if it does not exist yet
1392 \return Python Console
1394 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1396 QWidget* wid = dockWindow( WT_PyConsole );
1397 if ( !wid && force==true) {
1398 wid = getWindow(WT_PyConsole);
1400 return qobject_cast<PyConsole_Console*>( wid );
1405 Updates object browser and maybe data models
1406 \param updateModels - if it is true, then data models are updated
1408 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1410 // update existing data models
1413 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1414 if ( objectBrowser() )
1415 objectBrowser()->setAutoUpdate( false );
1417 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1419 CAM_Study::ModelList dm_list;
1420 study->dataModels( dm_list );
1421 QListIterator<CAM_DataModel*> it( dm_list );
1422 while ( it.hasNext() ) {
1423 CAM_DataModel* camDM = it.next();
1424 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1425 ((LightApp_DataModel*)camDM)->update();
1429 if( objectBrowser() )
1430 objectBrowser()->setAutoUpdate( isAutoUpdate );
1433 if ( objectBrowser() ) {
1434 objectBrowser()->updateGeometry();
1435 objectBrowser()->updateTree( 0, false );
1442 LightApp_Preferences* LightApp_Application::preferences() const
1444 return preferences( false );
1448 \return first view manager of some type
1449 \param vmType - type of view manager
1450 \param create - is it necessary to create view manager in case, when there is no manager of such type
1452 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1454 SUIT_ViewManager* aVM = viewManager( vmType );
1455 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1456 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1457 if ( anActiveVM && anActiveVM->getType() == vmType )
1459 MESSAGE("aVM = anActiveVM");
1463 if ( aVM && !aVM->getDetached() && create )
1465 if ( !aVM->getActiveView() )
1467 MESSAGE("aVM->createView()");
1472 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1473 desktop()->setActiveWindow( aVM->getActiveView() );
1478 MESSAGE("aVM = createViewManager( vmType )");
1479 aVM = createViewManager( vmType );
1486 Creates view manager of some type
1487 \param vmType - type of view manager
1489 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
1491 SUIT_ResourceMgr* resMgr = resourceMgr();
1493 SUIT_ViewManager* viewMgr = 0;
1494 #ifndef DISABLE_GLVIEWER
1495 if( vmType == GLViewer_Viewer::Type() )
1497 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1498 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1501 #ifndef DISABLE_PLOT2DVIEWER
1502 if( vmType == Plot2d_Viewer::Type() )
1504 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1506 #ifndef DISABLE_SALOMEOBJECT
1507 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1509 new LightApp_Plot2dSelector( v, mySelMgr );
1511 vm = new Plot2d_Viewer();
1513 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1514 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1517 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1518 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1522 #ifndef DISABLE_QXGRAPHVIEWER
1523 if( vmType == QxScene_Viewer::Type() )
1525 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1526 QxScene_Viewer* vm = new QxScene_Viewer();
1527 viewMgr->setViewModel( vm );
1528 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1531 #ifndef DISABLE_GRAPHICSVIEW
1532 if( vmType == GraphicsView_Viewer::Type() )
1534 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1535 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1538 #ifndef DISABLE_PVVIEWER
1539 if( vmType == PVViewer_Viewer::Type() )
1541 if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
1542 viewMgr->getActiveView()->setFocus();
1545 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1549 #ifndef DISABLE_PYVIEWER
1550 if( vmType == PyViewer_Viewer::Type() )
1552 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1555 #ifndef DISABLE_OCCVIEWER
1556 if( vmType == OCCViewer_Viewer::Type() )
1558 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1559 OCCViewer_Viewer* vm;
1560 #ifndef DISABLE_SALOMEOBJECT
1561 vm = new SOCC_Viewer();
1563 vm = new OCCViewer_Viewer( true );
1565 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1566 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1567 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1568 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1569 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1570 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1571 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1572 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1574 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1575 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1576 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1577 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1578 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1579 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1580 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1581 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1582 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1583 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1585 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1586 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1587 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1588 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1589 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1590 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1591 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1592 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1593 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1594 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1595 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1598 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1599 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1602 #ifndef DISABLE_VTKVIEWER
1603 #ifndef DISABLE_SALOMEOBJECT
1604 if ( vmType == SVTK_Viewer::Type() )
1606 if ( vmType == VTKViewer_Viewer::Type() )
1609 #ifndef DISABLE_SALOMEOBJECT
1610 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1611 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1614 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1615 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1616 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1617 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1618 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1619 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1620 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1621 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1622 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1623 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1624 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1625 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1626 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1627 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1628 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1629 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1630 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1631 new LightApp_VTKSelector( vm, mySelMgr );
1634 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1635 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1637 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1645 viewMgr->setDetached(detached);
1646 addViewManager( viewMgr );
1647 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1649 if ( viewWin && desktop() ) {
1650 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1651 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1657 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1659 SUIT_ResourceMgr* resMgr = resourceMgr();
1661 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1663 new LightApp_WgViewModel( vmType, w ) );
1664 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1666 addViewManager( vm );
1667 SUIT_ViewWindow* vw = vm->createViewWindow();
1668 if ( vw && desktop() ) {
1669 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1670 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1673 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1674 myUserWmTypes << vmType;
1679 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1681 SUIT_ResourceMgr* resMgr = resourceMgr();
1683 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1687 QString vmType = vm->getType();
1689 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1691 addViewManager( vm );
1692 SUIT_ViewWindow* vw = vm->createViewWindow();
1693 if ( vw && desktop() ) {
1694 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1695 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1698 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1699 myUserWmTypes << vmType;
1705 SLOT: Removes view manager from application
1707 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1709 removeViewManager( theVM );
1713 Protected SLOT: On study created.
1714 \param theStudy - just created study
1716 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1718 SUIT_DataObject* aRoot = 0;
1719 if ( theStudy && theStudy->root() )
1721 aRoot = theStudy->root();
1722 //aRoot->setName( tr( "DATA_MODELS" ) );
1725 getWindow( WT_ObjectBrowser );
1727 loadDockWindowsState();
1729 if ( objectBrowser() )
1730 objectBrowser()->setRoot( aRoot );
1732 activateModule( defaultModule() );
1734 if ( objectBrowser() )
1735 objectBrowser()->openLevels();
1737 #ifndef DISABLE_PYCONSOLE
1738 if( pythonConsole() )
1739 getPyInterp()->initStudy();
1744 Protected SLOT: On study opened.
1745 \param theStudy - just opened study
1747 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1749 SUIT_DataObject* aRoot = 0;
1750 if ( theStudy && theStudy->root() )
1752 aRoot = theStudy->root();
1756 getWindow( WT_ObjectBrowser );
1758 loadDockWindowsState();
1760 if ( objectBrowser() )
1761 objectBrowser()->setRoot( aRoot );
1763 activateModule( defaultModule() );
1765 if ( objectBrowser() )
1766 objectBrowser()->openLevels();
1768 #ifndef DISABLE_PYCONSOLE
1769 if( pythonConsole() )
1770 getPyInterp()->initStudy();
1776 /*!Protected SLOT. On study saved.*/
1777 void LightApp_Application::onStudySaved( SUIT_Study* s )
1779 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1781 mru->insert( s->studyName() );
1786 /*!Protected SLOT. On study closed.*/
1787 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1790 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1791 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1794 // stop auto-save timer
1795 myAutoSaveTimer->stop();
1797 // Bug 10396: clear selection
1798 mySelMgr->clearSelected();
1800 // Bug 12944: emit signal only after clear selection
1803 activateModule( "" );
1806 /*!Protected SLOT.On desktop activated.*/
1807 void LightApp_Application::onDesktopActivated()
1809 CAM_Application::onDesktopActivated();
1810 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1812 aModule->studyActivated();
1815 void LightApp_Application::studyOpened( SUIT_Study* s )
1817 CAM_Application::studyOpened( s );
1820 updateViewManagers();
1823 void LightApp_Application::studySaved( SUIT_Study* s )
1825 CAM_Application::studyOpened( s );
1826 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1827 if ( aResMgr && activeStudy() ) {
1828 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1829 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1833 void LightApp_Application::studyCreated( SUIT_Study* s )
1835 CAM_Application::studyCreated( s );
1838 updateViewManagers();
1841 /*!Gets file filter.
1842 *\retval QString "(*.hdf)"
1844 QString LightApp_Application::getFileFilter( bool /*open*/) const
1850 Shows file dialog and return user selected file name
1852 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1853 const QString& caption, QWidget* parent )
1857 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1858 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1861 /*! Gets directory*/
1862 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1866 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1869 /*! Get open file names*/
1870 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1871 const QString& caption, QWidget* parent )
1875 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1876 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1879 /*!Private SLOT. Update object browser.*/
1880 void LightApp_Application::onRefresh()
1882 updateObjectBrowser( true );
1885 /*!Private SLOT. Update actions after rename object.*/
1886 void LightApp_Application::onRenamed()
1888 activeStudy()->Modified();
1892 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1893 // To prevent reversion the window should be either aligned during movement and resize.
1894 /*!Private SLOT. Update actions after rename object.*/
1895 /*void LightApp_Application::onMoved()
1897 OCCViewer_ViewManager* viewMgr = 0;
1898 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1900 OCCViewer_ViewWindow* view = 0;
1901 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1903 view->getViewPort()->repaintViewAfterMove();
1908 /*!Private SLOT. Support drag-and-drop operation.*/
1909 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1911 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1915 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1917 aModule->dropObjects( objects, parentObj, row, action );
1920 /*!Private SLOT. On preferences.*/
1921 void LightApp_Application::onPreferences()
1923 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1926 /*!Private SLOT. On preferences.*/
1927 void LightApp_Application::showPreferences( const QString& itemText )
1929 QApplication::setOverrideCursor( Qt::WaitCursor );
1931 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1933 QApplication::restoreOverrideCursor();
1938 preferences()->activateItem( itemText );
1940 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1943 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1944 resourceMgr()->save();
1947 shortcutMgr()->updateShortcuts();
1953 /*!Protected SLOT. On preferences changed.*/
1954 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1956 LightApp_Module* sMod = 0;
1957 CAM_Module* mod = module( modName );
1958 if ( mod && mod->inherits( "LightApp_Module" ) )
1959 sMod = (LightApp_Module*)mod;
1962 sMod->preferencesChanged( section, param );
1964 preferencesChanged( section, param );
1965 // emit signal to allow additional preferences changing processing
1966 emit preferenceChanged( modName, section, param );
1969 /*!Remove all windows from study.*/
1970 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1972 saveDockWindowsState();
1974 if ( SUIT_DataBrowser* ob = objectBrowser() )
1977 CAM_Application::beforeCloseDoc( s );
1980 /*!Update actions.*/
1981 void LightApp_Application::updateActions()
1983 updateCommandsStatus();
1989 SUIT_Study* LightApp_Application::createNewStudy()
1991 LightApp_Study* aStudy = new LightApp_Study( this );
1993 // Set up processing of major study-related events
1994 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1995 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1996 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1997 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2003 Creates window by flag.
2004 \param flag - identificator of window type
2006 QWidget* LightApp_Application::createWindow( const int flag )
2010 SUIT_ResourceMgr* resMgr = resourceMgr();
2012 if ( flag == WT_ObjectBrowser )
2014 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2015 ob->setObjectName( "objectBrowser" );
2016 ob->setSortMenuEnabled( true );
2017 ob->setAutoUpdate( true );
2018 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2019 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2021 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2022 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2023 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2025 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2026 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2027 treeModel->setSearcher( this );
2028 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2029 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2031 // Mantis issue 0020136: Drag&Drop in OB
2032 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2034 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2035 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2036 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2037 this, SLOT( onRenamed( ) ) );
2041 // temporary commented
2043 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2045 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2048 // Create OBSelector
2049 new LightApp_OBSelector( ob, mySelMgr );
2050 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2051 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2053 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2055 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2056 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2057 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2059 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2061 #ifndef DISABLE_PYCONSOLE
2062 else if ( flag == WT_PyConsole )
2064 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2065 pyCons->setObjectName( "pythonConsole" );
2066 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2067 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2068 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2069 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2070 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2074 else if ( flag == WT_LogWindow )
2076 LogWindow* logWin = new LogWindow( desktop() );
2077 logWin->setObjectName( "logWindow" );
2078 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2079 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2081 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2087 \return default windows( Object Browser, Python Console )
2088 Adds to map \a aMap.
2090 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2092 #ifndef DISABLE_PYCONSOLE
2093 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2095 if ( activeStudy() ) {
2096 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2097 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2101 /*!Default view managers*/
2102 void LightApp_Application::defaultViewManagers( QStringList& ) const
2108 \return preferences.
2109 Create preferences, if \a crt = true.
2111 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2116 LightApp_Application* that = (LightApp_Application*)this;
2118 bool toCreate = !_prefs_ && crt;
2121 _prefs_ = new LightApp_Preferences( resourceMgr() );
2122 that->createPreferences( _prefs_ );
2123 qAddPostRoutine( LightAppCleanUpAppResources );
2126 that->myPrefs = _prefs_;
2128 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2129 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2130 connect( myPrefs, SIGNAL( resetToDefaults() ),
2131 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2136 SUIT_ResourceMgr* resMgr = resourceMgr();
2138 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2139 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2141 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2145 QStringList modNameList;
2146 app->modules( modNameList, false );
2148 QMap<QString, QString> iconMap;
2149 app->moduleIconNames( iconMap );
2151 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2153 if ( !app->isModuleAccessible( *it ) || _prefs_->hasModule( *it ) )
2156 int modId = _prefs_->addPreference( *it );
2157 if ( iconMap.contains( *it ) )
2158 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2162 app->modules( modList );
2163 QListIterator<CAM_Module*> itr( modList );
2164 while ( itr.hasNext() )
2166 LightApp_Module* mod = 0;
2168 CAM_Module* anItem = itr.next();
2169 if ( anItem->inherits( "LightApp_Module" ) )
2170 mod = (LightApp_Module*)anItem;
2172 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2174 _prefs_->addPreference( mod->moduleName() );
2175 mod->createPreferences();
2176 that->emptyPreferences( mod->moduleName() );
2180 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2186 Adds new module to application
2188 void LightApp_Application::moduleAdded( CAM_Module* mod )
2190 CAM_Application::moduleAdded( mod );
2192 LightApp_Module* lightMod = 0;
2193 if ( mod && mod->inherits( "LightApp_Module" ) )
2194 lightMod = (LightApp_Module*)mod;
2196 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2198 myPrefs->addPreference( mod->moduleName() );
2199 lightMod->createPreferences();
2200 emptyPreferences( mod->moduleName() );
2204 void LightApp_Application::emptyPreferences( const QString& modName )
2206 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2207 if ( !item || !item->isEmpty() )
2210 // printf( "---------------------> Modify for empty module.\n" );
2212 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2213 frm->setIcon( item->icon() );
2214 frm->setStretch( false );
2215 item->parentItem()->insertItem( frm, item );
2216 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2223 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2228 QStringList aValuesList;
2229 QList<QVariant> anIndicesList;
2233 // . Top-level "SALOME" preferences group <<start>>
2234 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2235 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2237 // .. "General" preferences tab <<start>>
2238 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2240 // ... "Language" group <<start>>
2241 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2242 pref->setItemProperty( "columns", 2, langGroup );
2243 // .... -> application language
2244 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2245 LightApp_Preferences::Selector, "language", "language" );
2246 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2247 QList<QVariant> aIcons;
2248 QList<QVariant> aNumbers;
2249 QStringList aTitles;
2250 foreach ( QString aLang, aLangs ) {
2251 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2253 aTitles << langToName( aLang );
2255 pref->setItemProperty( "strings", aTitles, curLang );
2256 pref->setItemProperty( "ids", aNumbers, curLang );
2257 pref->setItemProperty( "icons", aIcons, curLang );
2258 pref->setItemProperty( "restart", true, curLang );
2260 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2261 LightApp_Preferences::Bool, "language", "locale" );
2262 pref->setItemProperty( "restart", true, curLocale );
2263 // ... "Language" group <<end>>
2265 // ... "Look and feel" group <<start>>
2266 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2267 pref->setItemProperty( "columns", 2, lookGroup );
2268 // .... -> show splash-screen
2269 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2270 // .... -> opaque resize
2271 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2272 // .... -> drop-down buttons
2273 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2274 // ... "Look and feel" group <<end>>
2276 // ... "Study properties" group <<start>>
2277 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2278 pref->setItemProperty( "columns", 2, studyGroup );
2279 // .... -> multi-file save
2280 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2281 // .... -> ascii save mode
2282 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2283 // .... -> store windows geometry
2284 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2285 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2286 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2287 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2288 // .... -> auto-save
2289 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2290 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2291 pref->setItemProperty( "min", 0, autoSaveInterval );
2292 pref->setItemProperty( "max", 1440, autoSaveInterval );
2293 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2294 // ... "Study properties" group <<end>>
2296 // ... "Help browser" group <<start>>
2297 #ifndef DISABLE_QTXWEBBROWSER
2298 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2300 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2304 QString platform = "winapplication";
2306 QString platform = "application";
2308 // .... -> browser application
2309 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2310 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2311 // .... -> browser parameters
2312 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2313 // ... "Help browser" group <<end>>
2315 // ... "Python console properties" group <<start>>
2316 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2317 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2319 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2320 // .... -> show banner
2321 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2322 // .... -> auto-completion
2323 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2324 // ... "Python console properties" group <<end>>
2326 // ... "MRU" preferences group <<start>>
2327 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2328 pref->setItemProperty( "columns", 4, mruGroup );
2329 // number of MRU items
2330 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2331 "MRU", "visible_count" );
2332 pref->setItemProperty( "min", 0, mruVisCount );
2333 pref->setItemProperty( "max", 100, mruVisCount );
2335 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2336 "MRU", "link_type" );
2337 aValuesList.clear();
2338 anIndicesList.clear();
2339 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2340 anIndicesList << 0 << 1 << 2 ;
2341 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2342 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2343 // ... "MRU" preferences group <<end>>
2345 // ... "Full-screen" group <<start>>
2346 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2347 pref->setItemProperty( "columns", 2, fullScreenGroup );
2348 // .... -> automatic hiding toolbars
2349 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2350 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2351 // ... "Full-screen" group <<end>>
2353 // .. "General" preferences tab <<end>>
2355 // .. "3D viewer" group <<start>>
2356 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2357 // ... -> navigation mode
2358 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2359 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2360 aValuesList.clear();
2361 anIndicesList.clear();
2362 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2363 anIndicesList << 0 << 1;
2364 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2365 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2366 // ... -> zooming mode
2367 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2368 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2369 aValuesList.clear();
2370 anIndicesList.clear();
2371 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2372 anIndicesList << 0 << 1;
2373 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2374 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2375 // ... "Trihedron" group <<start>>
2376 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2377 pref->setItemProperty( "columns", 2, occTriGroup );
2378 // .... -> trihedron size
2379 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2380 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2381 pref->setItemProperty( "min", 1.0E-06, occTS );
2382 pref->setItemProperty( "max", 1000, occTS );
2383 // .... -> relative size of trihedron
2384 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2385 // .... -> show static trihedron
2386 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2387 // ... "Trihedron" group <<end>>
2388 // .. "3D viewer" group <<end>>
2392 #ifndef DISABLE_OCCVIEWER
2393 // .. "OCC viewer" group <<start>>
2394 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2396 // .... -> Projection mode
2397 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2398 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2399 aValuesList.clear();
2400 anIndicesList.clear();
2401 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2402 anIndicesList << 0 << 1;
2403 pref->setItemProperty( "strings", aValuesList, occProjMode );
2404 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2406 // .... -> Stereo group
2407 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2408 pref->setItemProperty( "columns", 2, stereoGroup );
2409 // .... -> Stereo type
2410 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2411 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2412 aValuesList.clear();
2413 anIndicesList.clear();
2415 OCCViewer_Viewer::stereoData( aValuesList, idList);
2416 foreach( int gid, idList ) anIndicesList << gid;
2417 pref->setItemProperty( "strings", aValuesList, stereoType );
2418 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2420 // .... -> Anaglyph filter
2421 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2422 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2423 aValuesList.clear();
2424 anIndicesList.clear();
2425 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2426 anIndicesList << 0 << 1 << 2;
2428 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2429 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2431 // .... -> Convergence distance type
2432 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2433 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2434 aValuesList.clear();
2435 anIndicesList.clear();
2436 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2437 anIndicesList << 0 << 1;
2438 pref->setItemProperty( "strings", aValuesList, occFocusType );
2439 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2441 // .... -> Stereographic focus value
2442 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2443 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2444 pref->setItemProperty( "precision", 3, focusValue );
2445 pref->setItemProperty( "min", 1.0E-03, focusValue );
2446 pref->setItemProperty( "max", 1.0E03, focusValue );
2447 pref->setItemProperty( "step", 0.05, focusValue );
2450 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2451 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2452 aValuesList.clear();
2453 anIndicesList.clear();
2454 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2455 anIndicesList << 0 << 1;
2456 pref->setItemProperty( "strings", aValuesList, occIODType );
2457 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2459 // .... -> Interocular distance (IOD) value
2460 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2461 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2462 pref->setItemProperty( "precision", 3, IODValue );
2463 pref->setItemProperty( "min", 1.0E-03, IODValue );
2464 pref->setItemProperty( "max", 1.0E03, IODValue );
2465 pref->setItemProperty( "step", 0.05, IODValue );
2467 // .... -> Reverse stereo
2468 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2469 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2470 // .... -> Enable V-Sync
2471 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2472 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2473 // .... -> Enable quad-buffer support
2474 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2475 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2477 // ... "Background" group <<start>>
2478 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2479 // pref->setItemProperty( "columns", 2, bgGroup );
2480 aValuesList.clear();
2481 anIndicesList.clear();
2484 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2485 foreach( int gid, idList ) anIndicesList << gid;
2486 // .... -> 3D viewer background
2487 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2488 LightApp_Preferences::Background, "OCCViewer", "background" );
2489 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2490 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2491 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2492 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2493 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2494 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2495 pref->setItemProperty( "custom_enabled", false, bgId );
2496 pref->setItemProperty( "image_formats", formats, bgId );
2497 // .... -> XZ viewer background
2498 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2499 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2500 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2501 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2502 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2503 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2504 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2505 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2506 pref->setItemProperty( "custom_enabled", false, bgId );
2507 pref->setItemProperty( "image_formats", formats, bgId );
2508 // .... -> YZ viewer background
2509 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2510 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2511 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2512 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2513 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2514 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2515 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2516 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2517 pref->setItemProperty( "custom_enabled", false, bgId );
2518 pref->setItemProperty( "image_formats", formats, bgId );
2519 // .... -> XY viewer background
2520 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2521 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2522 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2523 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2524 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2525 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2526 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2527 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2528 pref->setItemProperty( "custom_enabled", false, bgId );
2529 pref->setItemProperty( "image_formats", formats, bgId );
2530 // ... "Background" group <<end>>
2533 // ... "Selection" group <<start>>
2534 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2535 pref->setItemProperty( "columns", 2, occSelectionGroup );
2536 // .... -> enable preselection
2537 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2538 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2539 // .... -> enable selection
2540 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2541 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2542 // ... "Selection" group <<end>>
2544 // ... "Clipping" group <<start>>
2545 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2546 // .... -> clipping color
2547 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2548 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2549 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2550 pref->setItemProperty( "columns", 2, texturePref );
2551 // .... -> use default texture
2552 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2553 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2554 // .... -> clipping texture
2555 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2556 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2557 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2559 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2560 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2561 // .... -> scale factor
2562 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2563 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2564 pref->setItemProperty( "precision", 3, scaleFactor );
2565 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2566 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2567 pref->setItemProperty( "step", 0.1, scaleFactor );
2568 // ... "Clipping" group <<end>>
2570 // ... "Ray tracing" group <<start>>
2571 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2572 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2573 pref->setItemProperty( "columns", 2, rtPref );
2575 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2576 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2577 pref->setItemProperty( "min", 1, rt_depth );
2578 pref->setItemProperty( "max", 10, rt_depth );
2579 pref->setItemProperty( "step", 1, rt_depth );
2580 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2581 // .... -> specular reflections
2582 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2583 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2584 // .... -> adaptive anti-aliasing
2585 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2586 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2587 // .... -> shadows rendering
2588 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2589 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2590 // .... -> transparent shadow
2591 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2592 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2593 // ... "Ray tracing" group <<end>>
2595 // ... "Light source" group <<start>>
2596 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2597 // .... -> light color
2598 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2599 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2600 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2601 pref->setItemProperty( "columns", 3, directionPref );
2602 // .... -> light direction (dx component)
2603 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2604 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2605 pref->setItemProperty( "precision", 2, light_dx );
2606 pref->setItemProperty( "min", -1.0E03, light_dx );
2607 pref->setItemProperty( "max", 1.0E03, light_dx );
2608 pref->setItemProperty( "step", 0.1, light_dx );
2609 // .... -> light direction (dy component)
2610 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2611 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2612 pref->setItemProperty( "precision", 2, light_dy );
2613 pref->setItemProperty( "min", -1.0E03, light_dy );
2614 pref->setItemProperty( "max", 1.0E03, light_dy );
2615 pref->setItemProperty( "step", 0.1, light_dy );
2616 // .... -> light direction (dz component)
2617 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2618 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2619 pref->setItemProperty( "precision", 2, light_dz );
2620 pref->setItemProperty( "min", -1.0E03, light_dz );
2621 pref->setItemProperty( "max", 1.0E03, light_dz );
2622 pref->setItemProperty( "step", 0.1, light_dz );
2623 // ... "Light source" group <<end>>
2625 // ... -> empty frame (for layout) <<start>>
2626 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2627 pref->setItemProperty( "margin", 0, occGen );
2628 pref->setItemProperty( "columns", 2, occGen );
2629 // ... -> empty frame (for layout) <<end>>
2631 // .. "OCC viewer" group <<end>>
2634 #ifndef DISABLE_VTKVIEWER
2635 // .. "VTK viewer" group <<start>>
2636 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2638 // ... -> empty frame (for layout) <<start>>
2639 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2640 //pref->setItemProperty( "columns", 2, vtkGen );
2641 // .... -> projection mode
2642 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2643 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2644 aValuesList.clear();
2645 anIndicesList.clear();
2646 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2647 anIndicesList << 0 << 1;
2648 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2649 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2651 // .... -> Stereo group
2652 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2653 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2654 // .... -> Stereo type
2655 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2656 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2657 aValuesList.clear();
2658 anIndicesList.clear();
2660 SVTK_Viewer::stereoData( aValuesList, idList);
2661 foreach( int gid, idList ) anIndicesList << gid;
2662 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2663 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2664 // .... -> Anaglyph filter
2665 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2666 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2667 aValuesList.clear();
2668 anIndicesList.clear();
2669 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2670 anIndicesList << 0 << 1 << 2;
2672 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2673 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2675 // .... -> Enable quad-buffer support
2676 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2677 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2679 // .... -> background
2680 aValuesList.clear();
2681 anIndicesList.clear();
2684 #ifndef DISABLE_SALOMEOBJECT
2685 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2687 foreach( int gid, idList ) anIndicesList << gid;
2688 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2689 LightApp_Preferences::Background, "VTKViewer", "background" );
2690 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2691 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2692 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2693 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2694 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2695 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2696 pref->setItemProperty( "custom_enabled", false, bgId );
2697 #ifndef DISABLE_SALOMEOBJECT
2698 pref->setItemProperty( "image_formats", formats, bgId );
2700 // .... -> speed increment
2701 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2702 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2703 pref->setItemProperty( "min", 1, vtkSpeed );
2704 pref->setItemProperty( "max", 1000, vtkSpeed );
2705 // .... -> speed mode
2706 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2707 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2708 aValuesList.clear();
2709 anIndicesList.clear();
2710 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2711 anIndicesList << 0 << 1;
2712 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2713 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2715 // ... "Selection" group <<start>>
2716 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2717 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2718 // .... -> preselection
2719 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2720 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2721 aValuesList.clear();
2722 anIndicesList.clear();
2723 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2724 anIndicesList << 0 << 1 << 2;
2725 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2726 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2727 // .... -> enable selection
2728 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2729 // ... "Selection" group <<end>>
2731 // ... -> empty frame (for layout) <<end>>
2733 // ... space mouse sub-group <<start>>
2734 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2735 //pref->setItemProperty( "columns", 2, vtkSM );
2736 // .... -> decrease speed increment
2737 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2738 LightApp_Preferences::Selector, "VTKViewer",
2739 "spacemouse_func1_btn" );
2740 // .... -> increase speed increment
2741 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2742 LightApp_Preferences::Selector, "VTKViewer",
2743 "spacemouse_func2_btn" );
2744 // .... -> dominant / combined switch
2745 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2746 LightApp_Preferences::Selector, "VTKViewer",
2747 "spacemouse_func5_btn" ); //
2748 aValuesList.clear();
2749 anIndicesList.clear();
2750 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2751 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2752 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2753 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2754 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2755 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2756 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2757 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2758 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2759 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2760 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2761 // ... space mouse sub-group <<end>>
2763 // ... avi recording sub-group <<start>>
2764 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2765 pref->setItemProperty( "columns", 2, vtkRec );
2766 // .... -> recording mode
2767 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2768 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2769 aValuesList.clear();
2770 anIndicesList.clear();
2771 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2772 anIndicesList << 0 << 1;
2773 pref->setItemProperty( "strings", aValuesList, modePref );
2774 pref->setItemProperty( "indexes", anIndicesList, modePref );
2776 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2777 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2778 pref->setItemProperty( "min", 0.1, fpsPref );
2779 pref->setItemProperty( "max", 100, fpsPref );
2781 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2782 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2783 pref->setItemProperty( "min", 1, qualityPref );
2784 pref->setItemProperty( "max", 100, qualityPref );
2785 // .... -> progressive mode
2786 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2787 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2788 // ... avi recording sub-group <<end>>
2790 // ... group names sub-group <<start>>
2791 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2792 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2793 pref->setItemProperty( "columns", 2, vtkGN );
2794 // .... -> text color
2795 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2796 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2797 // .... -> transparency
2798 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2799 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2800 pref->setItemProperty( "min", 0.0, transPref );
2801 pref->setItemProperty( "max", 1.0, transPref );
2802 pref->setItemProperty( "step", 0.1, transPref );
2803 // ... -> group names sub-group <<end>>
2804 // .. "VTK viewer" group <<end>>
2807 // .. "Plot2d viewer" group <<start>>
2808 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2809 //pref->setItemProperty( "columns", 2, plot2dGroup );
2811 // ... -> background
2812 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2813 LightApp_Preferences::Color, "Plot2d", "Background" );
2814 // ... -> selection color
2815 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2816 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2818 // ... "Viewer" group <<start>>
2819 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2821 // .... -> curve type
2822 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2823 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2824 aValuesList.clear();
2825 anIndicesList.clear();
2826 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2827 anIndicesList << 0 << 1 << 2 ;
2828 pref->setItemProperty( "strings", aValuesList, curveType );
2829 pref->setItemProperty( "indexes", anIndicesList, curveType );
2830 // .... -> marker size
2831 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2832 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2833 pref->setItemProperty( "min", 0, markerSize );
2834 pref->setItemProperty( "max", 100, markerSize );
2835 // .... -> horizontal scaling mode
2836 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2837 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2838 aValuesList.clear();
2839 anIndicesList.clear();
2840 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2841 anIndicesList << 0 << 1 ;
2842 pref->setItemProperty( "strings", aValuesList, horScale );
2843 pref->setItemProperty( "indexes", anIndicesList, horScale );
2844 // .... -> vertical scaling mode
2845 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2846 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2847 pref->setItemProperty( "strings", aValuesList, verScale );
2848 pref->setItemProperty( "indexes", anIndicesList, verScale );
2850 // .... -> errors/deviation colot
2851 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2852 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2853 // .... -> deviation markers line size
2854 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2855 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2856 pref->setItemProperty( "min", 1, deviationMarkerLw );
2857 pref->setItemProperty( "max", 5, deviationMarkerLw );
2858 // .... -> deviation markers tick mark size
2859 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2860 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2861 pref->setItemProperty( "min", 1, deviationMarkerTs );
2862 pref->setItemProperty( "max", 5, deviationMarkerTs );
2863 // .... "Viewer" group <<end>>
2865 // ... "Legend" group <<start>>
2866 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2868 // .... -> show legend
2869 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2870 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2871 // .... -> legend position
2872 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2873 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2874 aValuesList.clear();
2875 anIndicesList.clear();
2876 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2877 anIndicesList << 0 << 1 << 2 << 3 ;
2878 pref->setItemProperty( "strings", aValuesList, legendPosition );
2879 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2880 // .... -> Symbol type
2881 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2882 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2883 aValuesList.clear();
2884 anIndicesList.clear();
2885 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2886 anIndicesList << 0 << 1 ;
2887 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2888 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2889 // .... -> legend font
2890 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2891 // ... -> font color
2892 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2893 // ... -> selection font color
2894 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2895 // ... "Legend" group <<end>>
2897 // .. "Plot2d viewer" group <<end>>
2899 // .. "PyViewer" preferences tab <<start>>
2900 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2901 // ... "Font settings" group <<start>>
2902 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2903 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2904 LightApp_Preferences::Font, "PyEditor", "Font" );
2905 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2906 // ... "Font settings" group <<end>>
2907 // ... "Display settings" group <<start>>
2908 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2909 pref->setItemProperty( "columns", 2, pyDispGroup );
2910 // ... -> current line highlight
2911 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2912 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2913 // ... -> text wrapping
2914 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2915 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2916 // ... -> center cursor on scroll
2917 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2918 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2919 // ... -> line numbers area
2920 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2921 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2922 // ... "Display settings" group <<end>>
2924 // ... "Editor settings" group <<start>>
2925 int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
2926 // ... -> navigation mode
2927 int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
2928 LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
2929 aValuesList.clear();
2930 anIndicesList.clear();
2931 aValuesList << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
2932 anIndicesList << 0 << 1 << 2 << 3 ;
2933 pref->setItemProperty( "strings", aValuesList, pyCompletion );
2934 pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
2935 // ... "Editor settings" group <<end>>
2937 // ... "Tab settings" group <<start>>
2938 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2939 pref->setItemProperty( "columns", 2, pyTabGroup );
2940 // ... -> tab whitespaces
2941 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2942 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2944 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2945 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2946 // ... "Tab settings" group <<end>>
2947 // ... "Vertical edge settings" group <<start>>
2948 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2949 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2950 // ... -> vertical edge
2951 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2952 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2953 // ... -> number of columns
2954 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2955 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2956 // ... "Vertical edge settings" group <<end>>
2957 // .. "PyEditor" preferences tab <<end>>
2959 // .. "Directories" preferences tab <<start>>
2960 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2961 // ... --> quick directories list
2962 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2963 pref->addPreference( tr( "" ), dirGroup,
2964 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2965 // .. "Directories" preferences tab <<end>>
2967 // .. "Object browser" preferences tab <<start>>
2968 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2970 // ... "Search tool" group <<start>>
2971 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2972 // .... --> auto-hide
2973 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2974 "ObjectBrowser", "auto_hide_search_tool" );
2975 // ... "Search tool" group <<end>>
2977 // ... "Object browser settings" group <<start>>
2978 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2979 pref->setItemProperty( "columns", 2, objSetGroup );
2980 // .... -> auto size first column
2981 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2982 "ObjectBrowser", "auto_size_first" );
2983 // .... -> auto size other columns
2984 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2985 "ObjectBrowser", "auto_size" );
2986 // .... -> resize columns on expand item
2987 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2988 "ObjectBrowser", "resize_on_expand_item" );
2989 // .... -> browse to published object
2990 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2991 "ObjectBrowser", "browse_published_object" );
2992 aValuesList.clear();
2993 anIndicesList.clear();
2994 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2995 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2996 pref->setItemProperty( "strings", aValuesList, browsePublished );
2997 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2998 // ... "Object browser settings" group <<end>>
2999 // .. "Object browser" preferences tab <<end>>
3001 // .. "Shortcuts" preferences tab <<start>>
3002 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3003 // ... "Shortcuts settings" group <<start>>
3004 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3005 pref->addPreference( tr( "" ), shortcutGroup,
3006 LightApp_Preferences::ShortcutTree, "shortcuts" );
3007 // ... "Shortcuts settings" group <<end>>
3008 // .. "Shortcuts" preferences tab <<end>>
3009 // . Top-level "SALOME" preferences group <<end>>
3015 Changes appearance of application according to changed preferences
3016 \param sec - section
3017 \param param - name of changed parameter
3019 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3021 SUIT_ResourceMgr* resMgr = resourceMgr();
3025 if ( sec == "viewers" && param == "drop_down_buttons" )
3027 ViewManagerList vmlist = viewManagers();
3028 foreach( SUIT_ViewManager* vm, vmlist )
3030 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3031 foreach( SUIT_ViewWindow* vw, vwlist )
3032 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3036 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3038 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3039 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3040 QList<SUIT_ViewManager*> lst;
3041 #ifndef DISABLE_OCCVIEWER
3042 viewManagers( OCCViewer_Viewer::Type(), lst );
3043 QListIterator<SUIT_ViewManager*> itOCC( lst );
3044 while ( itOCC.hasNext() && sz >= 0 )
3046 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3047 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3050 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3051 occVM->setTrihedronSize( sz, relative );
3052 occVM->getAISContext()->UpdateCurrentViewer();
3055 #ifndef DISABLE_VTKVIEWER
3056 #ifndef DISABLE_SALOMEOBJECT
3057 viewManagers( SVTK_Viewer::Type(), lst );
3058 QListIterator<SUIT_ViewManager*> itVTK( lst );
3059 while ( itVTK.hasNext() && sz >= 0 )
3061 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3062 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3065 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3068 vtkVM->setTrihedronSize( sz, relative );
3076 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3078 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3079 QList<SUIT_ViewManager*> lst;
3080 #ifndef DISABLE_OCCVIEWER
3081 viewManagers( OCCViewer_Viewer::Type(), lst );
3082 QListIterator<SUIT_ViewManager*> itOCC( lst );
3083 while ( itOCC.hasNext() )
3085 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3086 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3089 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3092 occVM->setStaticTrihedronDisplayed( isVisible );
3096 #ifndef DISABLE_VTKVIEWER
3097 #ifndef DISABLE_SALOMEOBJECT
3098 viewManagers( SVTK_Viewer::Type(), lst );
3099 QListIterator<SUIT_ViewManager*> itVTK( lst );
3100 while ( itVTK.hasNext() )
3102 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3103 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3106 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3109 vtkVM->setStaticTrihedronVisible( isVisible );
3117 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3119 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3120 QList<SUIT_ViewManager*> lst;
3121 #ifndef DISABLE_OCCVIEWER
3122 viewManagers( OCCViewer_Viewer::Type(), lst );
3123 QListIterator<SUIT_ViewManager*> itOCC( lst );
3124 while ( itOCC.hasNext() )
3126 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3127 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3130 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3131 occVM->setInteractionStyle( mode );
3134 #ifndef DISABLE_VTKVIEWER
3135 #ifndef DISABLE_SALOMEOBJECT
3136 viewManagers( SVTK_Viewer::Type(), lst );
3137 QListIterator<SUIT_ViewManager*> itVTK( lst );
3138 while ( itVTK.hasNext() )
3140 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3141 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3144 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3145 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3151 #ifndef DISABLE_OCCVIEWER
3152 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3154 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3155 QList<SUIT_ViewManager*> lst;
3156 viewManagers( OCCViewer_Viewer::Type(), lst );
3157 QListIterator<SUIT_ViewManager*> it( lst );
3158 while ( it.hasNext() )
3160 SUIT_ViewModel* vm = it.next()->getViewModel();
3161 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3164 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3165 occVM->enablePreselection( isToEnablePreselection );
3170 #ifndef DISABLE_OCCVIEWER
3171 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3173 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3174 QList<SUIT_ViewManager*> lst;
3175 viewManagers( OCCViewer_Viewer::Type(), lst );
3176 QListIterator<SUIT_ViewManager*> it( lst );
3177 while ( it.hasNext() )
3179 SUIT_ViewModel* vm = it.next()->getViewModel();
3180 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3183 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3184 occVM->enableSelection( isToEnableSelection );
3189 #ifndef DISABLE_OCCVIEWER
3190 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3192 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3193 QList<SUIT_ViewManager*> lst;
3194 viewManagers( OCCViewer_Viewer::Type(), lst );
3195 QListIterator<SUIT_ViewManager*> it( lst );
3196 while ( it.hasNext() )
3198 SUIT_ViewModel* vm = it.next()->getViewModel();
3199 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3202 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3203 occVM->setClippingColor( aColor );
3208 #ifndef DISABLE_OCCVIEWER
3209 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3210 param == QString( "clipping_texture" ) ||
3211 param == QString( "clipping_modulate" ) ||
3212 param == QString( "clipping_scale" ) ) )
3214 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3215 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3216 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3217 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3218 QList<SUIT_ViewManager*> lst;
3219 viewManagers( OCCViewer_Viewer::Type(), lst );
3220 QListIterator<SUIT_ViewManager*> it( lst );
3221 while ( it.hasNext() )
3223 SUIT_ViewModel* vm = it.next()->getViewModel();
3224 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3227 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3228 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3233 #ifndef DISABLE_OCCVIEWER
3234 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3236 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3237 QList<SUIT_ViewManager*> lst;
3238 viewManagers( OCCViewer_Viewer::Type(), lst );
3239 QListIterator<SUIT_ViewManager*> it( lst );
3240 while ( it.hasNext() )
3242 SUIT_ViewModel* vm = it.next()->getViewModel();
3243 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3246 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3247 occVM->setProjectionType( mode );
3252 #ifndef DISABLE_OCCVIEWER
3253 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3255 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3256 QList<SUIT_ViewManager*> lst;
3257 viewManagers( OCCViewer_Viewer::Type(), lst );
3258 QListIterator<SUIT_ViewManager*> it( lst );
3259 while ( it.hasNext() )
3261 SUIT_ViewModel* vm = it.next()->getViewModel();
3262 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3265 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3266 occVM->setStereoType( mode );
3271 #ifndef DISABLE_OCCVIEWER
3272 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3274 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3275 QList<SUIT_ViewManager*> lst;
3276 viewManagers( OCCViewer_Viewer::Type(), lst );
3277 QListIterator<SUIT_ViewManager*> it( lst );
3278 while ( it.hasNext() )
3280 SUIT_ViewModel* vm = it.next()->getViewModel();
3281 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3284 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3285 occVM->setAnaglyphFilter( mode );
3290 #ifndef DISABLE_OCCVIEWER
3291 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3292 param == QString( "focus_value" ) ) )
3294 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3295 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3296 QList<SUIT_ViewManager*> lst;
3297 viewManagers( OCCViewer_Viewer::Type(), lst );
3298 QListIterator<SUIT_ViewManager*> it( lst );
3299 while ( it.hasNext() )
3301 SUIT_ViewModel* vm = it.next()->getViewModel();
3302 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3305 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3306 occVM->setStereographicFocus( aType, aValue );
3311 #ifndef DISABLE_OCCVIEWER
3312 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3313 param == QString( "iod_value" ) ) )
3315 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3316 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3317 QList<SUIT_ViewManager*> lst;
3318 viewManagers( OCCViewer_Viewer::Type(), lst );
3319 QListIterator<SUIT_ViewManager*> it( lst );
3320 while ( it.hasNext() )
3322 SUIT_ViewModel* vm = it.next()->getViewModel();
3323 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3326 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3327 occVM->setInterocularDistance( aType, aValue );
3332 #ifndef DISABLE_OCCVIEWER
3333 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3335 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3336 QList<SUIT_ViewManager*> lst;
3337 viewManagers( OCCViewer_Viewer::Type(), lst );
3338 QListIterator<SUIT_ViewManager*> it( lst );
3339 while ( it.hasNext() )
3341 SUIT_ViewModel* vm = it.next()->getViewModel();
3342 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3345 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3346 occVM->setReverseStereo( reverse );
3351 #ifndef DISABLE_OCCVIEWER
3352 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3354 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3355 QList<SUIT_ViewManager*> lst;
3356 viewManagers( OCCViewer_Viewer::Type(), lst );
3357 QListIterator<SUIT_ViewManager*> it( lst );
3358 while ( it.hasNext() )
3360 SUIT_ViewModel* vm = it.next()->getViewModel();
3361 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3364 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3365 occVM->setVSync( enable );
3370 #ifndef DISABLE_OCCVIEWER
3371 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3373 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3374 QList<SUIT_ViewManager*> lst;
3375 viewManagers( OCCViewer_Viewer::Type(), lst );
3376 QListIterator<SUIT_ViewManager*> it( lst );
3377 while ( it.hasNext() )
3379 SUIT_ViewModel* vm = it.next()->getViewModel();
3380 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3383 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3384 occVM->setQuadBufferSupport( enable );
3389 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3391 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3392 QList<SUIT_ViewManager*> lst;
3393 #ifndef DISABLE_OCCVIEWER
3394 viewManagers( OCCViewer_Viewer::Type(), lst );
3395 QListIterator<SUIT_ViewManager*> itOCC( lst );
3396 while ( itOCC.hasNext() )
3398 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3399 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3402 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3403 occVM->setZoomingStyle( mode );
3406 #ifndef DISABLE_VTKVIEWER
3407 #ifndef DISABLE_SALOMEOBJECT
3408 viewManagers( SVTK_Viewer::Type(), lst );
3409 QListIterator<SUIT_ViewManager*> itVTK( lst );
3410 while ( itVTK.hasNext() )
3412 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3413 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3416 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3417 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3423 #ifndef DISABLE_VTKVIEWER
3424 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3426 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3427 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3428 QList<SUIT_ViewManager*> lst;
3429 #ifndef DISABLE_SALOMEOBJECT
3430 viewManagers( SVTK_Viewer::Type(), lst );
3431 QListIterator<SUIT_ViewManager*> it( lst );
3432 while ( it.hasNext() )
3434 SUIT_ViewModel* vm = it.next()->getViewModel();
3435 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3438 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3439 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3445 #ifndef DISABLE_VTKVIEWER
3446 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3448 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3449 QList<SUIT_ViewManager*> lst;
3450 #ifndef DISABLE_SALOMEOBJECT
3451 viewManagers( SVTK_Viewer::Type(), lst );
3452 QListIterator<SUIT_ViewManager*> it( lst );
3453 while ( it.hasNext() )
3455 SUIT_ViewModel* vm = it.next()->getViewModel();
3456 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3459 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3460 if( vtkVM ) vtkVM->setProjectionMode( mode );
3466 #ifndef DISABLE_VTKVIEWER
3467 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3469 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3470 QList<SUIT_ViewManager*> lst;
3471 #ifndef DISABLE_SALOMEOBJECT
3472 viewManagers( SVTK_Viewer::Type(), lst );
3473 QListIterator<SUIT_ViewManager*> it( lst );
3474 while ( it.hasNext() )
3476 SUIT_ViewModel* vm = it.next()->getViewModel();
3477 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3480 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3481 if( vtkVM ) vtkVM->setStereoType( mode );
3487 #ifndef DISABLE_VTKVIEWER
3488 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3490 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3491 QList<SUIT_ViewManager*> lst;
3492 #ifndef DISABLE_SALOMEOBJECT
3493 viewManagers( SVTK_Viewer::Type(), lst );
3494 QListIterator<SUIT_ViewManager*> it( lst );
3495 while ( it.hasNext() )
3497 SUIT_ViewModel* vm = it.next()->getViewModel();
3498 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3501 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3502 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3508 #ifndef DISABLE_VTKVIEWER
3509 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3511 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3512 QList<SUIT_ViewManager*> lst;
3513 #ifndef DISABLE_SALOMEOBJECT
3514 viewManagers( SVTK_Viewer::Type(), lst );
3515 QListIterator<SUIT_ViewManager*> it( lst );
3516 while ( it.hasNext() )
3518 SUIT_ViewModel* vm = it.next()->getViewModel();
3519 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3522 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3523 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3529 #ifndef DISABLE_VTKVIEWER
3530 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3532 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3533 QList<SUIT_ViewManager*> lst;
3534 #ifndef DISABLE_SALOMEOBJECT
3535 viewManagers( SVTK_Viewer::Type(), lst );
3536 QListIterator<SUIT_ViewManager*> it( lst );
3537 while ( it.hasNext() )
3539 SUIT_ViewModel* vm = it.next()->getViewModel();
3540 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3543 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3544 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3550 #ifndef DISABLE_VTKVIEWER
3551 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3553 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3554 QList<SUIT_ViewManager*> lst;
3555 #ifndef DISABLE_SALOMEOBJECT
3556 viewManagers( SVTK_Viewer::Type(), lst );
3557 QListIterator<SUIT_ViewManager*> it( lst );
3558 while ( it.hasNext() )
3560 SUIT_ViewModel* vm = it.next()->getViewModel();
3561 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3564 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3565 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3571 #ifndef DISABLE_VTKVIEWER
3572 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3573 param == QString( "spacemouse_func2_btn" ) ||
3574 param == QString( "spacemouse_func5_btn" ) ) )
3576 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3577 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3578 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3579 QList<SUIT_ViewManager*> lst;
3580 #ifndef DISABLE_SALOMEOBJECT
3581 viewManagers( SVTK_Viewer::Type(), lst );
3582 QListIterator<SUIT_ViewManager*> it( lst );
3583 while ( it.hasNext() )
3585 SUIT_ViewModel* vm = it.next()->getViewModel();
3586 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3589 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3590 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3595 if( sec=="ObjectBrowser" )
3597 SUIT_DataBrowser* ob = objectBrowser();
3601 if ( param=="auto_size_first" )
3603 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3604 ob->setAutoSizeFirstColumn( autoSizeFirst );
3605 if ( autoSizeFirst )
3606 ob->adjustFirstColumnWidth();
3608 else if ( param=="auto_size" ) {
3609 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3610 ob->setAutoSizeColumns(autoSize);
3612 ob->adjustColumnsWidth();
3614 else if ( param=="resize_on_expand_item" ) {
3615 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3616 ob->setResizeOnExpandItem(resizeOnExpandItem);
3618 else if ( param == "auto_hide_search_tool" ) {
3619 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3625 if( param=="auto_save_interval" ) {
3626 myAutoSaveTimer->stop();
3627 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3628 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3632 #ifndef DISABLE_PYCONSOLE
3633 if( sec=="PyConsole" && pythonConsole() )
3635 if ( param=="font" ) {
3636 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3638 else if ( param=="show_banner" ) {
3639 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3641 else if ( param=="auto_completion" ) {
3642 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3649 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3651 if ( param == "visible_count" )
3652 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3653 else if ( param == "max_count" )
3654 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3655 else if ( param == "insert_mode" )
3656 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3657 else if ( param == "link_type" )
3658 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3659 else if ( param == "show_clear" )
3660 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3661 else if ( param == "show_mru" )
3662 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3665 if ( sec == "language" && param == "language" )
3667 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3668 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3670 if ( sec == "language" && param == "locale")
3672 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3673 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3675 if ( sec == "desktop" && param == "opaque_resize" ) {
3676 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3677 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3678 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3679 // any dockable window can't be docked to the another area, except initial area.
3680 // It is possible to move window to another area, but it always returns to the initial area.
3682 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3683 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3684 // else dopts &= ~QMainWindow::AnimatedDocks;
3685 // desktop()->setDockOptions( dopts );
3686 desktop()->setOpaqueResize( opaqueResize );
3687 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3688 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3691 #ifndef DISABLE_PLOT2DVIEWER
3692 QList<SUIT_ViewManager*> lst;
3693 viewManagers( Plot2d_Viewer::Type(), lst );
3694 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3695 while ( itPlot2d.hasNext() ) {
3696 SUIT_ViewManager* viewMgr = itPlot2d.next();
3697 SUIT_ViewModel* vm = viewMgr->getViewModel();
3698 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3701 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3703 viewMgr->setViewModel( vm );
3704 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3706 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3707 frame->SetPreference();
3716 void LightApp_Application::loadPreferences()
3718 CAM_Application::loadPreferences();
3720 SUIT_ResourceMgr* aResMgr = resourceMgr();
3725 static bool mru_load = true;
3728 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3730 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3731 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3732 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3733 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3734 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3735 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3736 mru->loadLinks( aResMgr, "MRU" );
3742 QStringList mods = aResMgr->parameters( "windows_visibility" );
3743 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3746 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3747 myWinVis.insert( *itr, arr );
3751 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3752 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3753 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3754 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3755 // else dopts &= ~QMainWindow::AnimatedDocks;
3756 // desktop()->setDockOptions( dopts );
3757 desktop()->setOpaqueResize( opaqueResize );
3758 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3759 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3766 void LightApp_Application::savePreferences()
3768 CAM_Application::savePreferences();
3770 saveDockWindowsState();
3772 SUIT_ResourceMgr* aResMgr = resourceMgr();
3777 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3779 mru->saveLinks( aResMgr, "MRU" );
3781 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3782 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3785 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3787 #if GUI_DEVELOPMENT > 0
3788 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3790 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3797 Updates desktop title
3799 void LightApp_Application::updateDesktopTitle()
3801 QString aTitle = applicationName();
3802 QString aVer = applicationVersion();
3803 if ( !aVer.isEmpty() )
3804 aTitle += QString( " " ) + aVer;
3806 if ( activeStudy() ) {
3807 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3808 aTitle += QString( " - [%1]" ).arg( sName );
3811 desktop()->setWindowTitle( aTitle );
3815 \brief Get map of the operations which can be performed
3816 on the module activation.
3818 The method should return the map of the kind \c {<id>:<name>}
3819 where \c <id> is an integer identifier of the operation and
3820 \c <name> is a title for the button to be added to the
3821 dialog box. After user selects the required operation by the
3822 clicking the corresponding button in the dialog box, its identifier
3823 is passed to the moduleActionSelected() method to process
3826 \return map of the operations
3827 \sa moduleActionSelected()
3829 QMap<int, QString> LightApp_Application::activateModuleActions() const
3831 QMap<int, QString> opmap;
3832 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3833 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3838 \brief Called when the used selectes required operation chosen
3839 from "Activate module" dialog box.
3841 Performs the required operation according to the user choice.
3843 \param id operation identifier
3844 \sa activateModuleActions()
3846 void LightApp_Application::moduleActionSelected( const int id )
3861 Updates windows after close document
3863 void LightApp_Application::afterCloseDoc()
3867 CAM_Application::afterCloseDoc();
3871 Updates actions of active module
3873 void LightApp_Application::updateModuleActions()
3876 if ( activeModule() ) {
3877 modName = activeModule()->moduleName();
3878 if ( !isModuleAccessible( modName ) ) {
3879 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3880 foreach( SUIT_Application* app, apps ) {
3881 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3882 if ( lapp && lapp != this )
3883 lapp->removeModuleAction( modName );
3888 LightApp_ModuleAction* moduleAction =
3889 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3891 moduleAction->setActiveModule( modName );
3894 void LightApp_Application::removeModuleAction( const QString& modName )
3896 LightApp_ModuleAction* moduleAction =
3897 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3899 moduleAction->removeModule( modName );
3902 bool LightApp_Application::checkModule( const QString& title )
3904 if ( title.isEmpty() )
3907 QString library = moduleLibrary( title, true );
3908 if ( library.isEmpty() )
3911 QString name = moduleName( title );
3913 bool isPyModule = library.contains( "SalomePyQtGUI" ) || library.contains( "SalomePyQtGUILight" );
3917 paths = QString( ::getenv( "PATH" ) ).split( ";", QString::SkipEmptyParts );
3918 #elif defined(__APPLE__)
3919 paths = QString( ::getenv( "DYLD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3921 paths = QString( ::getenv( "LD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3924 bool isFound = false;
3925 QStringList::const_iterator it;
3926 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3928 isFound = QFileInfo( Qtx::addSlash( *it ) + library ).exists();
3934 "****************************************************************" << std::endl <<
3935 " Warning: library " << qPrintable( library ) << " is not found!" << std::endl <<
3936 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3937 "****************************************************************" << std::endl);
3943 QString pyModule = QString( "%1GUI.py" ).arg( name );
3944 paths = QString( ::getenv( "PYTHONPATH" ) ).split( ":", QString::SkipEmptyParts );
3947 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3949 isFound = QFileInfo( Qtx::addSlash( *it ) + pyModule ).exists();
3955 "****************************************************************" << std::endl <<
3956 " Warning: Python module " << qPrintable( pyModule ) << " is not found!" << std::endl <<
3957 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3958 "****************************************************************" << std::endl);
3967 Gets current windows.
3968 \param winMap - output current windows map.
3970 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3973 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3974 ((LightApp_Module*)activeModule())->windows( winMap );
3976 defaultWindows( winMap );
3980 Gets current view managers.
3981 \param lst - output current view managers list.
3983 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3986 if ( !activeStudy() )
3989 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3990 ((LightApp_Module*)activeModule())->viewManagers( lst );
3992 defaultViewManagers( lst );
3998 void LightApp_Application::updateWindows()
4000 QMap<int, int> winMap;
4001 currentWindows( winMap );
4003 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
4005 if ( !dockWindow( it.key() ) )
4006 getWindow( it.key() );
4009 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
4011 QWidget* wid = it.value();
4012 if ( winMap.contains( it.key() ) )
4013 wid->setVisible( true );
4018 loadDockWindowsState();
4022 Updates view managers
4024 void LightApp_Application::updateViewManagers()
4027 currentViewManagers( lst );
4029 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
4030 getViewManager( *it, true );
4034 Loads windows geometry
4036 void LightApp_Application::loadDockWindowsState()
4040 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4041 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
4042 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
4045 if ( activeModule() )
4046 modName = activeModule()->name();
4047 else if ( activeStudy() )
4048 modName = "nomodule";
4050 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
4051 QByteArray aDefaultState;
4052 aResMgr->value( "windows_geometry", modName, aDefaultState );
4053 QByteArray aDefaultVisibility;
4054 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
4055 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
4056 aResMgr->setWorkingMode( prevMode );
4058 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
4061 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
4062 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
4064 if ( version > Qtx::versionToId( "7.4.1" ) )
4065 aResMgr->value( "windows_geometry", modName , arr );
4067 arr = aDefaultState;
4068 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4069 desktop()->restoreState( aTargetArray );
4072 QStringList mainToolbarsNames;
4073 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4074 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4075 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4077 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4080 QMap<QString, bool> *tbMap = 0;
4081 QMap<QString, bool> *dwMap = 0;
4083 QMap<QString, bool> userTbMap, userDwMap;
4084 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4086 QMap<QString, bool> defaultTbMap, defaultDwMap;
4087 if(hasDefaultVisibility) {
4088 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4094 if(hasDefaultVisibility){
4095 tbMap = &defaultTbMap;
4102 if(hasDefaultVisibility){
4103 dwMap = &defaultDwMap;
4108 QList<QToolBar*> tbList = findToolBars();
4109 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4111 QToolBar* tb = *tit;
4112 if ( tbMap->contains( tb->objectName() ) ) {
4113 tb->setVisible( (*tbMap)[tb->objectName()] );
4119 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4120 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4122 QDockWidget* dw = *dit;
4124 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4125 if ( po != desktop() )
4128 if ( dwMap->contains( dw->objectName() ) )
4129 dw->setVisible( (*dwMap)[dw->objectName()] );
4137 Saves windows geometry
4139 void LightApp_Application::saveDockWindowsState()
4144 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4145 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4147 if( !storeWin && !storeTb )
4151 if ( activeModule() )
4152 modName = activeModule()->name();
4153 else if ( activeStudy() )
4154 modName = "nomodule";
4156 QString versionId = GUI_VERSION_STR;
4157 #if GUI_DEVELOPMENT > 0
4161 QByteArray arr = desktop()->saveState();
4162 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4163 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4166 if ( myWinVis.contains( modName ) )
4167 visArr = myWinVis[modName];
4169 QMap<QString, bool> tbMap, dwMap;
4170 dockWindowsState( visArr, tbMap, dwMap );
4172 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4173 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4176 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4179 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4180 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4182 QDockWidget* wid = *it;
4183 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4186 visArr = dockWindowsState( tbMap, dwMap );
4188 myWinVis.insert( modName, visArr );
4191 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4194 QDataStream stream( &visArr, QIODevice::WriteOnly );
4196 stream << (uchar)ToolBarMarker;
4197 stream << tb.size();
4198 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4200 stream << tit.key();
4201 stream << (uchar)( tit.value() ? 1 : 0 );
4204 stream << (uchar)DockWidgetMarker;
4205 stream << dw.size();
4206 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4208 stream << wit.key();
4209 stream << (uchar)( wit.value() ? 1 : 0 );
4215 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4220 QByteArray visArr = arr;
4221 QDataStream stream( &visArr, QIODevice::ReadOnly );
4225 if ( marker != ToolBarMarker )
4230 for ( int i = 0; i < lines; ++i )
4233 stream >> objectName;
4236 tb.insert( objectName, shown );
4240 if ( marker != DockWidgetMarker )
4244 for ( int j = 0; j < lines; ++j )
4247 stream >> objectName;
4250 dw.insert( objectName, shown );
4255 Adds icon names for modules
4257 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4261 SUIT_ResourceMgr* resMgr = resourceMgr();
4265 QStringList modList;
4266 modules( modList, false );
4268 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4270 QString modName = *it;
4271 QString modIntr = moduleName( modName );
4272 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4274 if ( modIcon.isEmpty() )
4277 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4278 modIcon += QString( ".png" );
4280 iconMap.insert( modName, modIcon );
4285 Inserts items in popup, which necessary for current application
4287 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4290 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4291 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4292 selMgr->setSelectionCacheEnabled( true );
4294 SUIT_DataBrowser* ob = objectBrowser();
4296 CAM_Application::contextMenuPopup( type, thePopup, title );
4298 if ( ob && type == ob->popupClientType() ) {
4299 thePopup->addSeparator();
4300 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4301 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4302 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4305 #ifndef DISABLE_SALOMEOBJECT
4306 if ( selMgr && ob ) {
4307 SALOME_ListIO selected;
4308 selMgr->selectedObjects( selected );
4309 if(selected.Extent() == 1){
4310 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4311 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4312 if(obj && obj->renameAllowed()) {
4313 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4314 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4315 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4316 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4318 QList<QAction*> acts = thePopup->actions();
4319 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4320 thePopup->insertAction(firstAction,a);
4326 selMgr->setSelectionCacheEnabled( cacheIsOn );
4332 void LightApp_Application::createEmptyStudy()
4334 CAM_Application::createEmptyStudy();
4336 if ( objectBrowser() )
4337 objectBrowser()->updateTree();
4339 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4340 if ( aResMgr && activeStudy() ) {
4341 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4342 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4347 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4349 CAM_Application::setDesktop( desk );
4352 connect( desk, SIGNAL( message( const QString& ) ),
4353 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4354 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4355 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4356 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4357 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4363 \param mod - module to be activated
4365 bool LightApp_Application::activateModule( CAM_Module* mod )
4367 bool res = CAM_Application::activateModule( mod );
4369 if ( objectBrowser() )
4370 objectBrowser()->updateTree();
4376 \return keyborad accelerators manager object
4378 SUIT_Accel* LightApp_Application::accel() const
4384 Removes dead widget container from map
4386 void LightApp_Application::onWCDestroyed( QObject* ob )
4388 // remove destroyed widget container from windows map
4389 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4391 if ( itr.value() != ob )
4394 int key = itr.key();
4395 myWin.remove( key );
4400 void LightApp_Application::onMRUActivated( const QString& name )
4402 SUIT_Session* s = SUIT_Session::session();
4403 if ( s && s->activeApplication() == this )
4407 void LightApp_Application::onStylePreferences()
4409 #ifdef USE_SALOME_STYLE
4410 Style_PrefDlg dlg( desktop() );
4413 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4414 #endif // USE_SALOME_STYLE
4417 void LightApp_Application::onFullScreen(){
4418 if(myScreenHelper) {
4419 if(desktop()->isFullScreen())
4420 myScreenHelper->switchToNormalScreen();
4422 myScreenHelper->switchToFullScreen();
4427 Connects just added view manager
4429 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4431 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4432 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4433 CAM_Application::addViewManager( vm );
4437 Remove view manager from memory
4439 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4441 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4442 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4443 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4445 aStudy->removeObjectProperties( vm->getGlobalId() );
4447 CAM_Application::removeViewManager( vm );
4449 LightApp_SelectionMgr* selMgr = selectionMgr();
4450 QList<SUIT_Selector*> selectors;
4451 selMgr->selectors( selectors );
4452 foreach( SUIT_Selector* selector, selectors ) {
4453 if ( selector->owner() == vm->getViewModel() ) {
4458 // IPAL22894: Crash on closing OCC view
4464 Renames active window of desktop
4466 void LightApp_Application::onRenameWindow()
4471 QWidget* w = desktop()->activeWindow();
4476 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4477 if( ok && !name.isEmpty() )
4478 w->setWindowTitle( name );
4482 Closes active window of desktop
4484 void LightApp_Application::onCloseWindow()
4489 QWidget* w = desktop()->activeWindow();
4497 Closes all windows of desktop
4499 void LightApp_Application::onCloseAllWindow()
4501 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4505 QList<SUIT_ViewWindow*> wndList = desk->windows();
4506 SUIT_ViewWindow* wnd;
4507 foreach( wnd, wndList )
4515 Groups all windows of desktop
4517 void LightApp_Application::onGroupAllWindow()
4519 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4523 QtxWorkstack* wgStack = desk->workstack();
4529 \return default name for an active study
4531 void LightApp_Application::setDefaultStudyName( const QString& theName )
4533 QStringList anInfoList;
4534 modules( anInfoList, false );
4536 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4537 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4538 !aStudy->isSaved() )
4540 aStudy->setStudyName( theName );
4541 updateDesktopTitle();
4546 Custom event handler
4548 bool LightApp_Application::event( QEvent* e )
4550 if( e && e->type()==2000 )
4552 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4553 QString* d = ( QString* )ce->data();
4554 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4556 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4557 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4558 showPreferences( tr( "PREF_APP" ) );
4563 return CAM_Application::event( e );
4566 /*! Check data object */
4567 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4571 bool isSuitable = !theObj->entry().isEmpty() &&
4572 !theObj->componentDataType().isEmpty() &&
4573 !theObj->name().isEmpty();
4580 int LightApp_Application::openChoice( const QString& aName )
4582 int choice = CAM_Application::openChoice( aName );
4584 if ( choice == OpenExist ) // The document is already open.
4586 // Do you want to reload it?
4587 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4588 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4589 choice = OpenReload;
4595 bool LightApp_Application::openAction( const int choice, const QString& aName )
4602 STD_Application* app = 0;
4603 SUIT_Session* session = SUIT_Session::session();
4604 QList<SUIT_Application*> appList = session->applications();
4605 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4607 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4608 app = ::qobject_cast<STD_Application*>( *it );
4613 app->onCloseDoc( false );
4614 appList = session->applications();
4615 STD_Application* other = 0;
4616 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4617 other = ::qobject_cast<STD_Application*>( *it );
4620 res = other->onOpenDoc( aName );
4625 res = CAM_Application::openAction( choice, aName );
4632 QStringList LightApp_Application::viewManagersTypes() const
4634 QStringList aTypesList;
4635 aTypesList += myUserWmTypes;
4636 #ifndef DISABLE_GLVIEWER
4637 aTypesList<<GLViewer_Viewer::Type();
4639 #ifndef DISABLE_PLOT2DVIEWER
4640 aTypesList<<Plot2d_Viewer::Type();
4642 #ifndef DISABLE_QXGRAPHVIEWER
4643 aTypesList<<QxScene_Viewer::Type();
4645 #ifndef DISABLE_PVVIEWER
4646 aTypesList<<PVViewer_Viewer::Type();
4648 #ifndef DISABLE_PYVIEWER
4649 aTypesList<<PyViewer_Viewer::Type();
4651 #ifndef DISABLE_OCCVIEWER
4652 aTypesList<<OCCViewer_Viewer::Type();
4654 #ifndef DISABLE_VTKVIEWER
4655 #ifndef DISABLE_SALOMEOBJECT
4656 aTypesList<<SVTK_Viewer::Type();
4658 aTypesList<<VTKViewer_Viewer::Type();
4664 * Removes all view managers of known types
4665 * Other view managers are ignored
4667 void LightApp_Application::clearKnownViewManagers()
4669 QStringList aTypesList = viewManagersTypes();
4670 QList<SUIT_ViewManager*> aMgrList;
4671 viewManagers( aMgrList );
4672 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4673 if (aTypesList.contains(aMgr->getType()))
4674 removeViewManager(aMgr);
4679 Copy of current selection
4681 void LightApp_Application::onCopy()
4683 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4689 Paste of current data in clipboard
4691 void LightApp_Application::onPaste()
4693 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4699 Browse (i.e. set focus on) the published objects
4700 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4701 has been accepted by Ok (or Apply & Close) button
4702 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4703 (to select the first published object only)
4704 \return entry of the selected object
4706 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4707 const bool theIsApplyAndClose,
4708 const bool theIsOptimizedBrowsing )
4711 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4713 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4714 switch( aBrowsePolicy )
4718 case BP_ApplyAndClose:
4719 if( !theIsApplyAndClose )
4727 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4731 SUIT_DataBrowser* anOB = objectBrowser();
4735 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4739 QStringListIterator anIter( theEntryList );
4740 if( theIsOptimizedBrowsing )
4742 // go to the last entry
4744 if( anIter.hasPrevious() )
4748 // scroll to each entry in the list
4749 // (in optimized mode - to the last entry only)
4751 LightApp_DataObject* anObject = 0;
4752 while( anIter.hasNext() )
4754 anEntry = anIter.next();
4755 if( !anEntry.isEmpty() )
4757 anObject = aStudy->findObjectByEntry( anEntry );
4760 QModelIndex anIndex = aModel->index( anObject );
4761 anOB->treeView()->scrollTo( anIndex );
4766 // always select the last object
4767 if( anObject && !anEntry.isEmpty() )
4769 QList<SUIT_Selector*> aSelectorList;
4770 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4771 if( !aSelectorList.isEmpty() )
4773 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4775 bool anIsAutoBlock = aSelector->autoBlock();
4777 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4778 aSelector->setAutoBlock( false );
4780 SUIT_DataOwnerPtrList aList;
4781 #ifndef DISABLE_SALOMEOBJECT
4782 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4783 ( anObject->entry().toLatin1().constData(),
4784 anObject->componentDataType().toLatin1().constData(),
4785 anObject->name().toLatin1().constData() );
4786 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4788 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4791 aList.append( owner );
4792 selectionMgr()->setSelected( aList );
4795 // restore auto block flag
4796 aSelector->setAutoBlock( anIsAutoBlock );
4804 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4806 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4807 return study ? study->findObjectByEntry( id ) : 0;
4811 Checks that an object can be renamed.
4812 \param entry entry of the object
4813 \brief Return \c true if object can be renamed
4815 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4820 Rename object by entry.
4821 \param entry entry of the object
4822 \param name new name of the object
4823 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4825 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4829 /*! Process standard messages from desktop */
4830 void LightApp_Application::onDesktopMessage( const QString& message )
4832 const QString sectionSeparator = "/";
4834 if ( message.toLower() == "updateobjectbrowser" ||
4835 message.toLower() == "updateobjbrowser" ) {
4836 // update object browser
4837 updateObjectBrowser();
4839 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4840 QString vtype = message.split( sectionSeparator ).last();
4841 if ( !vtype.isEmpty() )
4842 getViewManager( vtype, true );
4845 QStringList data = message.split( sectionSeparator );
4846 if ( data.count() > 1 ) {
4847 QString msgType = data[0].trimmed();
4848 LightApp_Module* sMod = 0;
4849 CAM_Module* mod = module( msgType );
4851 mod = module( moduleTitle( msgType ) );
4852 if ( mod && mod->inherits( "LightApp_Module" ) )
4853 sMod = (LightApp_Module*)mod;
4855 if ( msgType.toLower() == "preferences" ) {
4856 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4857 // for example "preferences/Study/multi_file_dump/true"
4858 if ( data.count() > 3 ) {
4859 QString section = data[1].trimmed();
4860 QString param = data[2].trimmed();
4861 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4862 resourceMgr()->setValue( section, param, value );
4866 // received message for the module
4867 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4868 sMod->message( msg );
4876 Returns all top level toolbars.
4877 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4879 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4881 QList<QToolBar*> aResult;
4882 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4883 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4884 QToolBar* tb = *tit;
4885 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4886 if ( po != desktop() )
4888 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4895 Internal method to parse toolbars and dockable windows state.
4897 QByteArray LightApp_Application::processState(QByteArray& input,
4898 const bool processWin,
4899 const bool processTb,
4900 const bool isRestoring,
4901 QByteArray defaultState) {
4904 bool hasDefaultState = !defaultState.isEmpty();
4905 bool isDockWinWriten = false;
4907 //Write date from users settings
4909 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4910 int marker, version;
4912 tmpInputData >> marker;
4913 tmpInputData >> version;
4914 tmpInputData >> dockmarker;
4915 tmpInputData >> nbDocWin;
4917 if(processWin && processTb && !isRestoring) {
4919 } else if(!processWin && !processTb ) {
4921 aRes = defaultState;
4923 QDataStream aData(&aRes, QIODevice::WriteOnly);
4924 QList<QToolBar*> aToolBars = findToolBars();
4927 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4928 QToolBar* tb = *tit;
4929 aNames.append(tb->objectName());
4932 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4933 if(toolBarMarkerIndex < 0)
4935 QDataStream anInputData(&input, QIODevice::ReadOnly);
4937 int toolBarMarkerIndexDef;
4938 if(hasDefaultState) {
4939 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4940 if(toolBarMarkerIndexDef < 0)
4943 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4945 QDataStream* aTargetData = 0;
4946 int aTargetIndex = -1;
4948 QByteArray currentArr = desktop()->saveState();
4949 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4950 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4951 if(processWin && useInputData) {
4952 aTargetData = &anInputData;
4953 aTargetIndex = toolBarMarkerIndex;
4955 //Write date from default settings
4956 if(hasDefaultState) {
4957 aTargetData = &anInputDataDef;
4958 aTargetIndex = toolBarMarkerIndexDef;
4960 //If no default state, write current snapshot of the dockable windows
4962 aTargetData = &anInputDataCur;
4963 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4964 aTargetIndex = toolBarMarkerIndexCur;
4969 if(aTargetData && aTargetIndex >= 0 ) {
4970 aTargetData->device()->seek(0);
4971 while( aTargetData->device()->pos() < aTargetIndex ) {
4976 isDockWinWriten = true;
4983 aTargetData = &anInputData;
4984 aTargetIndex = toolBarMarkerIndex;
4986 if(hasDefaultState) {
4987 aTargetData = &anInputDataDef;
4988 aTargetIndex = toolBarMarkerIndexDef;
4992 if(aTargetData && aTargetIndex >= 0) {
4994 if(!isDockWinWriten ) {
4995 //Write version marker
4996 int marker, version;
4997 aTargetData->device()->seek(0);
4998 *aTargetData >> marker;
4999 *aTargetData >> version;
5002 aData << (uchar) QDockWidgetMarker;
5004 int shift = 4*sizeof(int) + sizeof(QSize);
5005 index = aTargetIndex - shift;
5007 index = aTargetIndex;
5010 aTargetData->device()->seek(index);
5011 while(!aTargetData->atEnd()) {
5016 } else { // Not treat toolbars
5017 aData << (uchar) QToolBarMarker;
5018 aData << (int) 0; //Nb toolbars = 0
5025 \brief Emits operationFinished signal.
5026 \param theModuleName the name of the module which perfomed the operation
5027 \param theOperationName the operation name
5028 \param theEntryList the list of the created objects entries
5030 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5031 const QString& theOperationName,
5032 const QStringList& theEntryList )
5034 emit operationFinished( theModuleName, theOperationName, theEntryList );
5038 Update visibility state of given objects
5040 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5041 SUIT_ViewModel* theViewModel )
5043 if ( !theViewModel || theList.isEmpty() ) return;
5045 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5046 if ( !aStudy ) return;
5048 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5050 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5051 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5053 if ( !obj || aStudy->isComponent( obj->entry() ) )
5056 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5057 if ( anObjModule ) {
5058 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5060 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5061 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5062 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5063 anObjState = Qtx::ShownState;
5065 anObjState = Qtx::HiddenState;
5067 aStudy->setVisibilityState( obj->entry(), anObjState );
5074 * Called when window activated
5076 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5078 SUIT_DataBrowser* anOB = objectBrowser();
5081 SUIT_DataObject* rootObj = anOB->root();
5085 DataObjectList listObj = rootObj->children( true );
5087 SUIT_ViewModel* vmod = 0;
5088 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5089 vmod = vman->getViewModel();
5090 updateVisibilityState( listObj, vmod );
5094 Called then view manager removed
5096 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5098 ViewManagerList lst;
5099 viewManagers( lst );
5100 if ( lst.count() == 1) { // in case if closed last view window
5101 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5103 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5108 Check existing document.
5110 bool LightApp_Application::checkExistingDoc()
5113 if( activeStudy() ) {
5114 int answer = !activeStudy()->isModified() ? 1 :
5115 SUIT_MessageBox::question( desktop(),
5116 tr( "APPCLOSE_CAPTION" ),
5117 tr( "STUDYCLOSE_DESCRIPTION" ),
5118 tr( "APPCLOSE_SAVE" ),
5119 tr( "APPCLOSE_CLOSE" ),
5120 tr( "APPCLOSE_CANCEL" ), 0 );
5122 if ( activeStudy()->isSaved() ) {
5125 } else if ( onSaveAsDoc() ) {
5126 if( !closeDoc( false ) ) {
5133 else if( answer == 1 ) {
5135 } else if( answer == 2 ) {
5142 #ifndef DISABLE_PYCONSOLE
5144 PyConsole_Interp* LightApp_Application::getPyInterp()
5146 static PyConsole_Interp* myInterp = 0;
5148 myInterp = createPyInterp();
5149 myInterp->initialize();
5154 PyConsole_Interp* LightApp_Application::createPyInterp()
5156 return new PyConsole_Interp();
5159 #endif // DISABLE_PYCONSOLE