1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyEditor.h"
39 #include "PyConsole_Interp.h"
40 #include "PyConsole_Console.h"
43 #include "LightApp_Application.h"
44 #include "LightApp_Module.h"
45 #include "LightApp_DataModel.h"
46 #include "LightApp_DataOwner.h"
47 #include "LightApp_Displayer.h"
48 #include "LightApp_Study.h"
49 #include "LightApp_Preferences.h"
50 #include "LightApp_PreferencesDlg.h"
51 #include "LightApp_ModuleDlg.h"
52 #include "LightApp_AboutDlg.h"
53 #include "LightApp_ModuleAction.h"
54 // temporary commented
55 #include "LightApp_EventFilter.h"
56 #include "LightApp_OBSelector.h"
57 #include "LightApp_SelectionMgr.h"
58 #include "LightApp_DataObject.h"
59 #include "LightApp_WgViewModel.h"
60 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
64 #include <SALOME_Event.h>
66 #ifdef USE_SALOME_STYLE
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
69 #endif // USE_SALOME_STYLE
71 #include <CAM_Module.h>
72 #include <CAM_DataModel.h>
73 #include <CAM_Study.h>
74 #include <STD_TabDesktop.h>
76 #include <SUIT_DataBrowser.h>
77 #include <SUIT_Session.h>
78 #include <SUIT_Study.h>
79 #include <SUIT_FileDlg.h>
80 #include <SUIT_ResourceMgr.h>
81 #include <SUIT_ShortcutMgr.h>
82 #include <SUIT_Tools.h>
83 #include <SUIT_Accel.h>
84 #include <SUIT_MessageBox.h>
85 #include <SUIT_ViewWindow.h>
88 #include <QtxToolBar.h>
89 #include <QtxTreeView.h>
90 #include <QtxMRUAction.h>
91 #include <QtxDockAction.h>
92 #include <QtxDockWidget.h>
93 #include <QtxActionToolMgr.h>
94 #include <QtxSearchTool.h>
95 #include <QtxWorkstack.h>
98 #include <LogWindow.h>
100 #ifndef DISABLE_GLVIEWER
101 #include <GLViewer_Viewer.h>
102 #include <GLViewer_ViewManager.h>
103 #include "LightApp_GLSelector.h"
106 #ifndef DISABLE_PLOT2DVIEWER
107 #include <Plot2d_ViewManager.h>
108 #include <Plot2d_ViewModel.h>
109 #include <Plot2d_ViewWindow.h>
110 #include <Plot2d_ViewFrame.h>
111 #include "LightApp_Plot2dSelector.h"
112 #ifndef DISABLE_SALOMEOBJECT
113 #include <SPlot2d_ViewModel.h>
115 #include <Plot2d_ViewModel.h>
119 #ifndef DISABLE_OCCVIEWER
120 #include <OCCViewer_ViewManager.h>
121 #include <OCCViewer_ViewFrame.h>
122 #include <OCCViewer_ViewPort3d.h>
123 #ifndef DISABLE_SALOMEOBJECT
124 #include <SOCC_ViewModel.h>
126 #include <OCCViewer_ViewModel.h>
128 #include "LightApp_OCCSelector.h"
131 #ifndef DISABLE_VTKVIEWER
132 #ifndef DISABLE_SALOMEOBJECT
133 #include <SVTK_ViewModel.h>
134 #include <SVTK_ViewManager.h>
135 #include "LightApp_VTKSelector.h"
137 #include <VTKViewer_ViewModel.h>
138 #include <VTKViewer_ViewManager.h>
140 #include <VTKViewer_ViewModel.h>
143 #ifndef DISABLE_QXGRAPHVIEWER
144 #include <QxScene_ViewManager.h>
145 #include <QxScene_ViewModel.h>
146 #include <QxScene_ViewWindow.h>
149 #ifndef DISABLE_GRAPHICSVIEW
150 #include "GraphicsView_Viewer.h"
151 #include "GraphicsView_ViewManager.h"
152 #include "LightApp_GVSelector.h"
155 #ifndef DISABLE_PVVIEWER
156 #include "PVViewer_ViewManager.h"
157 #include "PVViewer_ViewWindow.h"
158 #include "PVViewer_ViewModel.h"
161 #ifndef DISABLE_PYVIEWER
162 #include <PyViewer_ViewManager.h>
163 #include <PyViewer_ViewModel.h>
164 #include <PyViewer_ViewWindow.h>
168 #define VISIBILITY_COLUMN_WIDTH 25
174 #include <QStringList>
176 #include <QApplication>
178 #include <QStatusBar>
180 #include <QObjectList>
182 #include <QInputDialog>
183 #include <QFontDatabase>
185 #include <QByteArray>
189 #include <QHeaderView>
194 #include <utilities.h>
196 #define FIRST_HELP_ID 1000000
198 #ifndef DISABLE_SALOMEOBJECT
199 #include <SALOME_InteractiveObject.hxx>
200 #include <SALOME_ListIO.hxx>
203 #include <Standard_Version.hxx>
205 #define ToolBarMarker 0
206 #define DockWidgetMarker 1
208 static const char* imageEmptyIcon[] = {
211 "....................",
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "...................."};
232 int LightApp_Application::lastStudyId = 0;
234 // Markers used to parse array with dockable windows and toolbars state.
235 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
236 // in the Qt source code.
238 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
239 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
241 // Format of the Byte array with the windows and toolbar state is:
242 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
244 //Find toolbar marker position in the array in the following way:
245 //since the 'toolbar marker' is not unique, find index of first occurrence of the
246 //'toolbar marker' in the array and check that next string is name of the toolbar
250 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
251 int aResult = -1,tmp = 0;
252 int inputLen = input.length();
253 QDataStream anInputData( &input, QIODevice::ReadOnly );
254 while ( tmp < inputLen ) {
255 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
258 anInputData.device()->seek( tmp );
262 anInputData >> lines;
264 if ( lines == 0 && anInputData.atEnd() ) {
265 //Case then array doesn't contain information about toolbars,
276 if ( aFlags.contains( str ) ) {
284 QString langToName( const QString& lang )
286 // special processing for English language to avoid such result as "American English"
287 // as Qt cannot just say "English"
292 result = QLocale( lang ).nativeLanguageName();
298 \return last global id of study
300 int LightApp_Application::studyId()
302 return LightApp_Application::lastStudyId;
305 /*!Create new instance of LightApp_Application.*/
306 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
308 return new LightApp_Application();
311 /*! \var global preferences of LightApp */
312 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
316 \class LightApp_Application
317 Application containing LightApp module
321 LightApp_Application::LightApp_Application()
322 : CAM_Application( false ),
324 myScreenHelper(new LightApp_FullScreenHelper())
326 Q_INIT_RESOURCE( LightApp );
328 STD_TabDesktop* desk = new STD_TabDesktop();
329 desk->setFullScreenAllowed(false);
330 desk->setMinimizeAllowed(false);
334 // initialize auto save timer
335 myAutoSaveTimer = new QTimer( this );
336 myAutoSaveTimer->setSingleShot( true );
337 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
339 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
341 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
342 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
344 desktop()->setWindowIcon( aLogo );
345 desktop()->setDockableMenuBar( false );
346 desktop()->setDockableStatusBar( false );
348 // base logo (salome itself)
349 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
350 // extra logo (salome-based application)
351 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
355 mySelMgr = new LightApp_SelectionMgr( this );
357 myAccel = SUIT_Accel::getAccel();
359 #ifndef DISABLE_OCCVIEWER
360 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
373 #ifndef DISABLE_VTKVIEWER
374 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
387 #ifndef DISABLE_PLOT2DVIEWER
388 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
389 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
395 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
398 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
399 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
400 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
401 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
402 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
405 // Set existing font for the python console in resources
406 if( !aResMgr->hasValue( "PyConsole", "font" ) )
409 QFont f = aResMgr->fontValue( "PyConsole", "font" );
411 QStringList famdb = fdb.families();
413 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
416 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
418 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
421 if ( famdb.contains(aFamily) )
423 f.setFamily( aFamily );
424 aResMgr->setValue( "PyConsole", "font", f );
431 *\li Save window geometry.
432 *\li Save desktop geometry.
433 *\li Save resource maneger.
434 *\li Delete selection manager.
436 LightApp_Application::~LightApp_Application()
439 delete myScreenHelper;
442 /*!Start application.*/
443 void LightApp_Application::start()
445 CAM_Application::start();
448 updateViewManagers();
449 updateCommandsStatus();
452 desktop()->statusBar()->showMessage( "" );
454 LightApp_EventFilter::Init();
457 /*!Closeapplication.*/
458 void LightApp_Application::closeApplication()
460 #ifndef DISABLE_QTXWEBBROWSER
461 QProcess::startDetached( "HelpBrowser",
462 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
464 CAM_Application::closeApplication();
467 /*!Gets application name.*/
468 QString LightApp_Application::applicationName() const
470 static QString _app_name;
471 if ( _app_name.isEmpty() )
472 _app_name = tr( "APP_NAME" );
476 /*!Gets application version.*/
477 QString LightApp_Application::applicationVersion() const
479 static QString _app_version;
481 if ( _app_version.isEmpty() )
483 QString resVersion = tr( "APP_VERSION" );
484 if ( resVersion != "APP_VERSION" )
486 _app_version = resVersion;
490 _app_version = GUI_VERSION_STR;
496 /*!Load module by \a name.*/
497 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
499 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
502 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
503 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
504 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
509 /*!Activate module by \a modName*/
510 bool LightApp_Application::activateModule( const QString& modName )
513 CAM_Module* prevMod = activeModule();
516 actName = prevMod->moduleName();
518 if ( actName == modName )
521 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
523 saveDockWindowsState();
525 bool status = CAM_Application::activateModule( modName );
527 updateModuleActions();
535 updateViewManagers();
537 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
538 if ( objectBrowser()->root() != activeStudy()->root() )
539 objectBrowser()->setRoot( activeStudy()->root() );
540 updateObjectBrowser( true );
543 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
548 /*!Gets selection manager.*/
549 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
554 /*!Creat action "New window" for certain type of viewer:*/
555 void LightApp_Application::createActionForViewer( const int id,
557 const QString& suffix,
560 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
561 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
562 QAction* a = createAction( id, // menu action id
569 false, // toggle flag
571 SLOT( onNewWindow() ) ); // slot
572 createMenu( a, parentId, -1 );
577 void LightApp_Application::createActions()
579 CAM_Application::createActions();
581 SUIT_Desktop* desk = desktop();
582 SUIT_ResourceMgr* resMgr = resourceMgr();
585 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
586 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
587 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
591 // - Help for modules
593 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
594 createMenu( separator(), helpMenu, -1, 10 );
595 QStringList aModuleList;
596 modules( aModuleList, false );
597 aModuleList.prepend( "GUI" );
598 aModuleList.prepend( "KERNEL" );
600 int id = LightApp_Application::UserID + FIRST_HELP_ID;
603 foreach( aModule, aModuleList ) {
604 if ( aModule.isEmpty() ) // module title (user name)
606 IMap <QString, QString> helpData; // list of help files for the module
607 QString helpSubMenu; // help submenu name (empty if not needed)
608 QString modName = moduleName( aModule ); // module name
609 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
610 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
611 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
613 if (resMgr->hasValue( modName, "documentation" ) )
614 docSection = resMgr->stringValue(modName, "documentation");
615 else if ( resMgr->hasSection( modName + "_documentation" ) )
616 docSection = modName + "_documentation";
617 if ( !docSection.isEmpty() ) {
618 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
619 QStringList listOfParam = resMgr->parameters( docSection );
620 foreach( QString paramName, listOfParam ) {
621 QString valueStr = resMgr->stringValue( docSection, paramName );
622 if ( !valueStr.isEmpty() ) {
623 QFileInfo fi( valueStr );
624 if ( fi.isRelative() && !modDir.isEmpty() )
625 valueStr = Qtx::addSlash( modDir ) + valueStr;
626 if ( QFile::exists( valueStr ) )
627 helpData.insert( paramName.arg( aModule ), valueStr );
632 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
633 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
634 QString indexFile = idxLst.join( QDir::separator() ); // index file
635 if ( QFile::exists( indexFile ) )
636 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
639 IMapConstIterator<QString, QString > fileIt;
640 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
641 QString helpFileName = fileIt.key();
642 // remove all '//' occurances
643 while ( helpFileName.contains( "//" ) )
644 helpFileName.replace( "//", "" );
645 // obtain submenus hierarchy if given
646 QStringList smenus = helpFileName.split( "/" );
647 helpFileName = smenus.last();
649 QAction* a = createAction( id, helpFileName,
650 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
651 helpFileName, helpFileName,
652 0, desk, false, this, SLOT( onHelpContentsModule() ) );
653 a->setData( fileIt.value() );
654 if ( !helpSubMenu.isEmpty() ) {
655 smenus.prepend( helpSubMenu );
657 // create sub-menus hierarchy
658 int menuId = helpMenu;
659 foreach ( QString subMenu, smenus ) {
660 menuId = createMenu( subMenu, menuId, -1, 0 );
662 createMenu( a, menuId, -1, 0 );
667 // - Additional help items
669 createMenu( separator(), helpMenu, -1, 5 );
671 QStringList addHelpItems = resMgr->parameters( "add_help" );
672 foreach ( QString addHelpItem, addHelpItems ) {
673 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
674 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
675 QAction* a = createAction( id, addHelpItem,
676 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
677 addHelpItem, addHelpItem,
678 0, desk, false, this, SLOT( onHelpContentsModule() ) );
679 a->setData( valueStr );
680 createMenu( a, helpMenu, -1, 5 );
686 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
687 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
688 registerAction( MRUId, mru );
690 // default icon for neutral point ('SALOME' module)
691 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
692 if ( defIcon.isNull() )
693 defIcon = QPixmap( imageEmptyIcon );
695 //! default icon for any module
696 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
697 if ( modIcon.isNull() )
698 modIcon = QPixmap( imageEmptyIcon );
701 modules( modList, false );
703 if ( modList.count() > 1 )
705 LightApp_ModuleAction* moduleAction =
706 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
708 QMap<QString, QString> iconMap;
709 moduleIconNames( iconMap );
711 const int iconSize = 20;
713 QStringList::Iterator it;
714 for ( it = modList.begin(); it != modList.end(); ++it )
716 if ( !isLibExists( *it ) )
719 QString modName = moduleName( *it );
721 if ( !isModuleAccessible( *it ) )
725 if ( iconMap.contains( *it ) )
726 iconName = iconMap[*it];
728 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
732 INFOS ( "\n****************************************************************" << std::endl
733 << "* Icon for " << (*it).toLatin1().constData()
734 << " not found. Using the default one." << std::endl
735 << "****************************************************************" << 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 #ifdef SINGLE_DESKTOP
934 if ( !checkExistingDoc() )
938 //asl: fix for 0020515
939 saveDockWindowsState();
941 CAM_Application::onNewDoc();
945 SLOT: Opens new document
947 void LightApp_Application::onOpenDoc()
949 SUIT_Study* study = activeStudy();
951 #ifdef SINGLE_DESKTOP
952 if ( !checkExistingDoc() )
956 CAM_Application::onOpenDoc();
958 if ( !study ) // new study will be create in THIS application
961 updateViewManagers();
966 SLOT: Opens new document.
967 \param aName - name of file
969 bool LightApp_Application::onOpenDoc( const QString& aName )
971 #ifdef SINGLE_DESKTOP
972 if ( !checkExistingDoc() )
976 saveDockWindowsState();
978 // We should take mru action first because this application instance can be deleted later.
979 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
981 bool res = CAM_Application::onOpenDoc( aName );
986 mru->insert( aName );
988 mru->remove( aName );
994 SLOT: Displays "About" message box
996 void LightApp_Application::onHelpAbout()
998 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1003 Private SLOT: Called on selection is changed
1004 Dispatchs active module that selection is changed
1006 void LightApp_Application::onSelection()
1008 onSelectionChanged();
1010 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1011 ((LightApp_Module*)activeModule())->selectionChanged();
1016 \param study - SUIT_Study.
1018 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1020 CAM_Application::setActiveStudy( study );
1024 Enables/Disables menu items and toolbar buttons. Rebuild menu
1026 void LightApp_Application::updateCommandsStatus()
1028 CAM_Application::updateCommandsStatus();
1031 #ifndef DISABLE_GLVIEWER
1032 a = action( NewGLViewId );
1034 a->setEnabled( activeStudy() );
1037 #ifndef DISABLE_PLOT2DVIEWER
1038 a = action( NewPlot2dId );
1040 a->setEnabled( activeStudy() );
1043 #ifndef DISABLE_OCCVIEWER
1044 a = action( NewOCCViewId );
1046 a->setEnabled( activeStudy() );
1049 #ifndef DISABLE_VTKVIEWER
1050 a = action( NewVTKViewId );
1052 a->setEnabled( activeStudy() );
1055 #ifndef DISABLE_QXGRAPHVIEWER
1056 a = action( NewQxSceneViewId );
1058 a->setEnabled( activeStudy() );
1061 #ifndef DISABLE_GRAPHICSVIEW
1062 a = action( NewGraphicsViewId );
1064 a->setEnabled( activeStudy() );
1067 #ifndef DISABLE_PVVIEWER
1068 a = action( NewPVViewId );
1070 a->setEnabled( activeStudy() );
1073 #ifndef DISABLE_PYVIEWER
1074 a = action( NewPyViewerId );
1076 a->setEnabled( activeStudy() );
1082 Runs system command in separate thread
1084 class RunBrowser: public QThread
1087 RunBrowser( LightApp_Application* app,
1088 const QString& theApp,
1089 const QString& theParams,
1090 const QString& theHelpFile,
1091 const QString& theContext = QString() )
1093 myParams( theParams ),
1094 myContext( theContext ),
1098 //For the external browser always specify 'file://' protocol,
1099 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1100 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1105 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1106 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1108 QProcess* proc = new QProcess();
1110 proc->start( aCommand );
1111 if ( !proc->waitForStarted() ) {
1112 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1113 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1114 ce2000->setData( msg );
1115 QApplication::postEvent( myLApp, ce2000 );
1126 LightApp_Application* myLApp;
1130 SLOT: Displays help contents for choosen module
1132 void LightApp_Application::onHelpContentsModule()
1134 const QAction* a = (QAction*) sender();
1135 QString helpFile = a->data().toString();
1136 if ( helpFile.isEmpty() ) return;
1138 SUIT_ResourceMgr* resMgr = resourceMgr();
1141 platform = "winapplication";
1143 platform = "application";
1145 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1147 QString quote("\"");
1148 anApp.prepend( quote );
1149 anApp.append( quote );
1151 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1152 #if DISABLE_QTXWEBBROWSER
1153 bool useExtBrowser = true;
1155 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1158 if( useExtBrowser ) {
1159 if ( !anApp.isEmpty() ) {
1160 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1164 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1165 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1166 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1168 showPreferences( tr( "PREF_APP" ) );
1172 QStringList parameters;
1173 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1174 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1175 parameters << helpFile;
1176 QProcess::startDetached( "HelpBrowser", parameters );
1181 SLOT: Displays help contents for choosen dialog
1183 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1184 const QString& theFileName,
1185 const QString& theContext )
1187 QString fileName = theFileName;
1188 QString context = theContext;
1189 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1190 // context might be passed within theFileName argument
1191 QStringList comps = fileName.split("#");
1192 if ( comps.count() > 1 ) {
1193 context = comps.last();
1195 fileName = comps.join("#");
1199 QString homeDir = "";
1200 if ( !theComponentName.isEmpty() ) {
1201 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1202 if ( !dir.isEmpty() )
1203 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1204 Qtx::addSlash( "share" ) +
1205 Qtx::addSlash( "doc" ) +
1206 Qtx::addSlash( "salome" ) +
1207 Qtx::addSlash( "gui" ) +
1208 Qtx::addSlash( theComponentName ) );
1211 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1212 SUIT_ResourceMgr* resMgr = resourceMgr();
1215 platform = "winapplication";
1217 platform = "application";
1219 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1221 QString quote("\"");
1222 anApp.prepend( quote );
1223 anApp.append( quote );
1226 #if DISABLE_QTXWEBBROWSER
1227 bool useExtBrowser = true;
1229 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1233 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1235 if ( !anApp.isEmpty() ) {
1236 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1240 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1241 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1242 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1243 showPreferences( tr( "PREF_APP" ) );
1247 QStringList parameters;
1248 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1249 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1250 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1251 QProcess::startDetached( "HelpBrowser", parameters );
1256 Sets enable or disable some actions on selection changed.
1258 void LightApp_Application::onSelectionChanged()
1260 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1261 bool canCopy = m ? m->canCopy() : false;
1262 bool canPaste = m ? m->canPaste() : false;
1264 action( EditCopyId )->setEnabled(canCopy);
1265 action( EditPasteId )->setEnabled(canPaste);
1269 SLOT: Performs some actions when dockable windows are triggered
1271 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1275 QWidget* LightApp_Application::dockWindow( const int id ) const
1278 if ( myWin.contains( id ) )
1283 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1288 QDockWidget* dock = 0;
1289 QWidget* w = wid->parentWidget();
1290 while ( w && !dock )
1292 dock = ::qobject_cast<QDockWidget*>( w );
1293 w = w->parentWidget();
1298 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1303 if ( wid != dockWindow( id ) )
1304 removeDockWindow( id );
1306 myWin.insert( id, wid );
1308 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1309 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1311 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1312 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1313 QString( "%1Dock" ).arg( wid->objectName() ) );
1314 dock->setWidget( wid );
1315 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1316 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1317 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1319 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1320 if ( !accel.isEmpty() )
1321 dock->toggleViewAction()->setShortcut( accel );
1326 void LightApp_Application::removeDockWindow( const int id )
1328 QWidget* wid = dockWindow( id );
1334 QDockWidget* dock = windowDock( wid );
1338 dock->setWidget( 0 );
1339 wid->setParent( 0 );
1340 wid->setVisible( false );
1344 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1346 QDockWidget* dock = windowDock( dockWindow( id ) );
1347 if ( dock && desktop() ) {
1348 desktop()->addDockWidget( place, dock );
1349 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1350 if ( a ) a->update();
1356 \param flag - key for window
1357 \param studyId - study id
1358 Flag used how identificator of window in windows list.
1360 QWidget* LightApp_Application::getWindow( const int flag, const int )
1362 QWidget* wid = dockWindow( flag );
1364 insertDockWindow( flag, wid = createWindow( flag ) );
1366 QMap<int, int> winMap;
1367 currentWindows( winMap );
1368 if ( winMap.contains( flag ) )
1369 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1375 \return Object Browser
1377 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1379 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1385 LogWindow* LightApp_Application::logWindow()
1387 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1390 #ifndef DISABLE_PYCONSOLE
1392 This returns the python console integrated to the GUI. Depending
1393 when you request the python console, this function could return
1394 null. Then the optional parameter force (default to false) can be
1395 set to force the creation of the python console if it is not done
1397 \param force - if true, the pythonConsole is created if it does not exist yet
1398 \return Python Console
1400 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1402 QWidget* wid = dockWindow( WT_PyConsole );
1403 if ( !wid && force==true) {
1404 wid = getWindow(WT_PyConsole);
1406 return qobject_cast<PyConsole_Console*>( wid );
1411 Updates object browser and maybe data models
1412 \param updateModels - if it is true, then data models are updated
1414 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1416 // update existing data models
1419 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1420 if ( objectBrowser() )
1421 objectBrowser()->setAutoUpdate( false );
1423 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1425 CAM_Study::ModelList dm_list;
1426 study->dataModels( dm_list );
1427 QListIterator<CAM_DataModel*> it( dm_list );
1428 while ( it.hasNext() ) {
1429 CAM_DataModel* camDM = it.next();
1430 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1431 ((LightApp_DataModel*)camDM)->update();
1435 if( objectBrowser() )
1436 objectBrowser()->setAutoUpdate( isAutoUpdate );
1439 if ( objectBrowser() ) {
1440 objectBrowser()->updateGeometry();
1441 objectBrowser()->updateTree( 0, false );
1448 LightApp_Preferences* LightApp_Application::preferences() const
1450 return preferences( false );
1454 \return first view manager of some type
1455 \param vmType - type of view manager
1456 \param create - is it necessary to create view manager in case, when there is no manager of such type
1458 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1460 SUIT_ViewManager* aVM = viewManager( vmType );
1461 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1463 if ( anActiveVM && anActiveVM->getType() == vmType )
1466 if ( aVM && create )
1468 if ( !aVM->getActiveView() )
1471 desktop()->setActiveWindow( aVM->getActiveView() );
1474 aVM = createViewManager( vmType );
1480 Creates view manager of some type
1481 \param vmType - type of view manager
1483 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1485 SUIT_ResourceMgr* resMgr = resourceMgr();
1487 SUIT_ViewManager* viewMgr = 0;
1488 #ifndef DISABLE_GLVIEWER
1489 if( vmType == GLViewer_Viewer::Type() )
1491 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1492 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1495 #ifndef DISABLE_PLOT2DVIEWER
1496 if( vmType == Plot2d_Viewer::Type() )
1498 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1500 #ifndef DISABLE_SALOMEOBJECT
1501 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1503 new LightApp_Plot2dSelector( v, mySelMgr );
1505 vm = new Plot2d_Viewer();
1507 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1508 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1511 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1512 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1516 #ifndef DISABLE_QXGRAPHVIEWER
1517 if( vmType == QxScene_Viewer::Type() )
1519 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1520 QxScene_Viewer* vm = new QxScene_Viewer();
1521 viewMgr->setViewModel( vm );
1522 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1525 #ifndef DISABLE_GRAPHICSVIEW
1526 if( vmType == GraphicsView_Viewer::Type() )
1528 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1529 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1532 #ifndef DISABLE_PVVIEWER
1533 if( vmType == PVViewer_Viewer::Type() )
1535 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1536 viewMgr->getActiveView()->setFocus();
1539 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1543 #ifndef DISABLE_PYVIEWER
1544 if( vmType == PyViewer_Viewer::Type() )
1546 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1549 #ifndef DISABLE_OCCVIEWER
1550 if( vmType == OCCViewer_Viewer::Type() )
1552 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1553 OCCViewer_Viewer* vm;
1554 #ifndef DISABLE_SALOMEOBJECT
1555 vm = new SOCC_Viewer();
1557 vm = new OCCViewer_Viewer( true );
1559 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1560 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1561 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1562 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1563 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1564 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1565 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1566 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1568 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1569 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1570 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1571 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1572 #if OCC_VERSION_LARGE > 0x06090000
1573 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1574 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1575 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1576 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1577 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1578 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1580 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1581 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1582 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1584 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1585 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1586 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1587 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1588 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1589 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1590 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1591 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1594 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1595 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1598 #ifndef DISABLE_VTKVIEWER
1599 #ifndef DISABLE_SALOMEOBJECT
1600 if ( vmType == SVTK_Viewer::Type() )
1602 if ( vmType == VTKViewer_Viewer::Type() )
1605 #ifndef DISABLE_SALOMEOBJECT
1606 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1607 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1610 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1611 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1612 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1613 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1614 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1615 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1616 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1617 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1618 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1619 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1620 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1621 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1622 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1623 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1624 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1625 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1626 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1627 new LightApp_VTKSelector( vm, mySelMgr );
1630 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1631 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1633 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1641 addViewManager( viewMgr );
1642 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1644 if ( viewWin && desktop() ) {
1645 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1646 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1652 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1654 SUIT_ResourceMgr* resMgr = resourceMgr();
1656 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1658 new LightApp_WgViewModel( vmType, w ) );
1659 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1661 addViewManager( vm );
1662 SUIT_ViewWindow* vw = vm->createViewWindow();
1663 if ( vw && desktop() ) {
1664 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1665 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1668 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1669 myUserWmTypes << vmType;
1674 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1676 SUIT_ResourceMgr* resMgr = resourceMgr();
1678 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1682 QString vmType = vm->getType();
1684 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1686 addViewManager( vm );
1687 SUIT_ViewWindow* vw = vm->createViewWindow();
1688 if ( vw && desktop() ) {
1689 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1690 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1693 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1694 myUserWmTypes << vmType;
1700 SLOT: Removes view manager from application
1702 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1704 removeViewManager( theVM );
1708 Protected SLOT: On study created.
1709 \param theStudy - just created study
1711 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1713 SUIT_DataObject* aRoot = 0;
1714 if ( theStudy && theStudy->root() )
1716 aRoot = theStudy->root();
1717 //aRoot->setName( tr( "DATA_MODELS" ) );
1720 getWindow( WT_ObjectBrowser );
1722 loadDockWindowsState();
1724 if ( objectBrowser() )
1725 objectBrowser()->setRoot( aRoot );
1727 activateModule( defaultModule() );
1729 if ( objectBrowser() )
1730 objectBrowser()->openLevels();
1732 #ifndef DISABLE_PYCONSOLE
1733 if( pythonConsole() )
1734 getPyInterp()->initStudy();
1739 Protected SLOT: On study opened.
1740 \param theStudy - just opened study
1742 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1744 SUIT_DataObject* aRoot = 0;
1745 if ( theStudy && theStudy->root() )
1747 aRoot = theStudy->root();
1751 getWindow( WT_ObjectBrowser );
1753 loadDockWindowsState();
1755 if ( objectBrowser() )
1756 objectBrowser()->setRoot( aRoot );
1758 activateModule( defaultModule() );
1760 if ( objectBrowser() )
1761 objectBrowser()->openLevels();
1763 #ifndef DISABLE_PYCONSOLE
1764 if( pythonConsole() )
1765 getPyInterp()->initStudy();
1771 /*!Protected SLOT. On study saved.*/
1772 void LightApp_Application::onStudySaved( SUIT_Study* s )
1774 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1776 mru->insert( s->studyName() );
1781 /*!Protected SLOT. On study closed.*/
1782 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1785 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1786 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1789 // stop auto-save timer
1790 myAutoSaveTimer->stop();
1792 // Bug 10396: clear selection
1793 mySelMgr->clearSelected();
1795 // Bug 12944: emit signal only after clear selection
1798 activateModule( "" );
1801 /*!Protected SLOT.On desktop activated.*/
1802 void LightApp_Application::onDesktopActivated()
1804 CAM_Application::onDesktopActivated();
1805 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1807 aModule->studyActivated();
1810 void LightApp_Application::studyOpened( SUIT_Study* s )
1812 CAM_Application::studyOpened( s );
1815 updateViewManagers();
1818 void LightApp_Application::studySaved( SUIT_Study* s )
1820 CAM_Application::studyOpened( s );
1821 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1822 if ( aResMgr && activeStudy() ) {
1823 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1824 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1828 void LightApp_Application::studyCreated( SUIT_Study* s )
1830 CAM_Application::studyCreated( s );
1833 updateViewManagers();
1836 /*!Gets file filter.
1837 *\retval QString "(*.bin)"
1839 QString LightApp_Application::getFileFilter() const
1847 Shows file dialog and return user selected file name
1849 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1850 const QString& caption, QWidget* parent )
1854 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1855 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1858 /*! Gets directory*/
1859 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1863 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1866 /*! Get open file names*/
1867 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1868 const QString& caption, QWidget* parent )
1872 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1873 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1876 /*!Private SLOT. Update object browser.*/
1877 void LightApp_Application::onRefresh()
1879 updateObjectBrowser( true );
1882 /*!Private SLOT. Update actions after rename object.*/
1883 void LightApp_Application::onRenamed()
1885 activeStudy()->Modified();
1889 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1890 // To prevent reversion the window should be either aligned during movement and resize.
1891 /*!Private SLOT. Update actions after rename object.*/
1892 /*void LightApp_Application::onMoved()
1894 OCCViewer_ViewManager* viewMgr = 0;
1895 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1897 OCCViewer_ViewWindow* view = 0;
1898 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1900 view->getViewPort()->repaintViewAfterMove();
1905 /*!Private SLOT. Support drag-and-drop operation.*/
1906 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1908 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1912 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1914 aModule->dropObjects( objects, parentObj, row, action );
1917 /*!Private SLOT. On preferences.*/
1918 void LightApp_Application::onPreferences()
1920 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1923 /*!Private SLOT. On preferences.*/
1924 void LightApp_Application::showPreferences( const QString& itemText )
1926 QApplication::setOverrideCursor( Qt::WaitCursor );
1928 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1930 QApplication::restoreOverrideCursor();
1935 preferences()->activateItem( itemText );
1937 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1940 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1941 resourceMgr()->save();
1944 shortcutMgr()->updateShortcuts();
1950 /*!Protected SLOT. On preferences changed.*/
1951 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1953 LightApp_Module* sMod = 0;
1954 CAM_Module* mod = module( modName );
1955 if ( mod && mod->inherits( "LightApp_Module" ) )
1956 sMod = (LightApp_Module*)mod;
1959 sMod->preferencesChanged( section, param );
1961 preferencesChanged( section, param );
1962 // emit signal to allow additional preferences changing processing
1963 emit preferenceChanged( modName, section, param );
1966 /*!Remove all windows from study.*/
1967 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1969 saveDockWindowsState();
1971 if ( SUIT_DataBrowser* ob = objectBrowser() )
1974 CAM_Application::beforeCloseDoc( s );
1977 /*!Update actions.*/
1978 void LightApp_Application::updateActions()
1980 updateCommandsStatus();
1986 SUIT_Study* LightApp_Application::createNewStudy()
1988 LightApp_Application::lastStudyId++;
1990 LightApp_Study* aStudy = new LightApp_Study( this );
1992 // Set up processing of major study-related events
1993 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1994 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1995 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1996 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2002 Creates window by flag.
2003 \param flag - identificator of window type
2005 QWidget* LightApp_Application::createWindow( const int flag )
2009 SUIT_ResourceMgr* resMgr = resourceMgr();
2011 if ( flag == WT_ObjectBrowser )
2013 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2014 ob->setObjectName( "objectBrowser" );
2015 ob->setSortMenuEnabled( true );
2016 ob->setAutoUpdate( true );
2017 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2018 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2020 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2021 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2022 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2024 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2025 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2026 treeModel->setSearcher( this );
2027 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2028 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2030 // Mantis issue 0020136: Drag&Drop in OB
2031 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2033 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2034 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2035 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2036 this, SLOT( onRenamed( ) ) );
2040 // temporary commented
2042 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2044 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2047 // Create OBSelector
2048 new LightApp_OBSelector( ob, mySelMgr );
2049 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2050 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2052 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2054 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2055 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2056 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2058 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2060 #ifndef DISABLE_PYCONSOLE
2061 else if ( flag == WT_PyConsole )
2063 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2064 pyCons->setObjectName( "pythonConsole" );
2065 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2066 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2067 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2068 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2069 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2073 else if ( flag == WT_LogWindow )
2075 LogWindow* logWin = new LogWindow( desktop() );
2076 logWin->setObjectName( "logWindow" );
2077 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2078 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2080 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2086 \return default windows( Object Browser, Python Console )
2087 Adds to map \a aMap.
2089 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2091 #ifndef DISABLE_PYCONSOLE
2092 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2094 if ( activeStudy() ) {
2095 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2096 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2100 /*!Default view managers*/
2101 void LightApp_Application::defaultViewManagers( QStringList& ) const
2107 \return preferences.
2108 Create preferences, if \a crt = true.
2110 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2115 LightApp_Application* that = (LightApp_Application*)this;
2117 bool toCreate = !_prefs_ && crt;
2120 _prefs_ = new LightApp_Preferences( resourceMgr() );
2121 that->createPreferences( _prefs_ );
2124 that->myPrefs = _prefs_;
2126 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2127 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2128 connect( myPrefs, SIGNAL( resetToDefaults() ),
2129 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2134 SUIT_ResourceMgr* resMgr = resourceMgr();
2136 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2137 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2139 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2143 QStringList modNameList;
2144 app->modules( modNameList, false );
2146 QMap<QString, QString> iconMap;
2147 app->moduleIconNames( iconMap );
2149 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2151 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2154 int modId = _prefs_->addPreference( *it );
2155 if ( iconMap.contains( *it ) )
2156 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2160 app->modules( modList );
2161 QListIterator<CAM_Module*> itr( modList );
2162 while ( itr.hasNext() )
2164 LightApp_Module* mod = 0;
2166 CAM_Module* anItem = itr.next();
2167 if ( anItem->inherits( "LightApp_Module" ) )
2168 mod = (LightApp_Module*)anItem;
2170 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2172 _prefs_->addPreference( mod->moduleName() );
2173 mod->createPreferences();
2174 that->emptyPreferences( mod->moduleName() );
2178 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2184 Adds new module to application
2186 void LightApp_Application::moduleAdded( CAM_Module* mod )
2188 CAM_Application::moduleAdded( mod );
2190 LightApp_Module* lightMod = 0;
2191 if ( mod && mod->inherits( "LightApp_Module" ) )
2192 lightMod = (LightApp_Module*)mod;
2194 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2196 myPrefs->addPreference( mod->moduleName() );
2197 lightMod->createPreferences();
2198 emptyPreferences( mod->moduleName() );
2202 void LightApp_Application::emptyPreferences( const QString& modName )
2204 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2205 if ( !item || !item->isEmpty() )
2208 // printf( "---------------------> Modify for empty module.\n" );
2210 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2211 frm->setIcon( item->icon() );
2212 frm->setStretch( false );
2213 item->parentItem()->insertItem( frm, item );
2214 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2221 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2226 QStringList aValuesList;
2227 QList<QVariant> anIndicesList;
2231 // . Top-level "SALOME" preferences group <<start>>
2232 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2233 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2235 // .. "General" preferences tab <<start>>
2236 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2238 // ... "Language" group <<start>>
2239 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2240 pref->setItemProperty( "columns", 2, langGroup );
2241 // .... -> application language
2242 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2243 LightApp_Preferences::Selector, "language", "language" );
2244 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2245 QList<QVariant> aIcons;
2246 QList<QVariant> aNumbers;
2247 QStringList aTitles;
2248 foreach ( QString aLang, aLangs ) {
2249 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2251 aTitles << langToName( aLang );
2253 pref->setItemProperty( "strings", aTitles, curLang );
2254 pref->setItemProperty( "ids", aNumbers, curLang );
2255 pref->setItemProperty( "icons", aIcons, curLang );
2256 pref->setItemProperty( "restart", true, curLang );
2258 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2259 LightApp_Preferences::Bool, "language", "locale" );
2260 pref->setItemProperty( "restart", true, curLocale );
2261 // ... "Language" group <<end>>
2263 // ... "Look and feel" group <<start>>
2264 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2265 pref->setItemProperty( "columns", 2, lookGroup );
2266 // .... -> show splash-screen
2267 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2268 // .... -> opaque resize
2269 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2270 // .... -> drop-down buttons
2271 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2272 // ... "Look and feel" group <<end>>
2274 // ... "Study properties" group <<start>>
2275 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2276 pref->setItemProperty( "columns", 2, studyGroup );
2277 // .... -> multi-file save
2278 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2279 // .... -> ascii save mode
2280 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2281 // .... -> store windows geometry
2282 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2283 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2284 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2285 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2286 // .... -> auto-save
2287 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2288 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2289 pref->setItemProperty( "min", 0, autoSaveInterval );
2290 pref->setItemProperty( "max", 1440, autoSaveInterval );
2291 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2292 // ... "Study properties" group <<end>>
2294 // ... "Help browser" group <<start>>
2295 #ifndef DISABLE_QTXWEBBROWSER
2296 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2298 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2302 QString platform = "winapplication";
2304 QString platform = "application";
2306 // .... -> browser application
2307 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2308 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2309 // .... -> browser parameters
2310 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2311 // ... "Help browser" group <<end>>
2313 // ... "Python console properties" group <<start>>
2314 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2315 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2317 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2318 // .... -> show banner
2319 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2320 // .... -> auto-completion
2321 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2322 // ... "Python console properties" group <<end>>
2324 // ... "MRU" preferences group <<start>>
2325 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2326 pref->setItemProperty( "columns", 4, mruGroup );
2327 // number of MRU items
2328 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2329 "MRU", "visible_count" );
2330 pref->setItemProperty( "min", 0, mruVisCount );
2331 pref->setItemProperty( "max", 100, mruVisCount );
2333 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2334 "MRU", "link_type" );
2335 aValuesList.clear();
2336 anIndicesList.clear();
2337 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2338 anIndicesList << 0 << 1 << 2 ;
2339 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2340 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2341 // ... "MRU" preferences group <<end>>
2343 // ... "Full-screen" group <<start>>
2344 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2345 pref->setItemProperty( "columns", 2, fullScreenGroup );
2346 // .... -> automatic hiding toolbars
2347 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2348 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2349 // ... "Full-screen" group <<end>>
2351 // .. "General" preferences tab <<end>>
2353 // .. "3D viewer" group <<start>>
2354 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2355 // ... -> navigation mode
2356 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2357 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2358 aValuesList.clear();
2359 anIndicesList.clear();
2360 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2361 anIndicesList << 0 << 1;
2362 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2363 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2364 // ... -> zooming mode
2365 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2366 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2367 aValuesList.clear();
2368 anIndicesList.clear();
2369 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2370 anIndicesList << 0 << 1;
2371 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2372 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2373 // ... "Trihedron" group <<start>>
2374 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2375 pref->setItemProperty( "columns", 2, occTriGroup );
2376 // .... -> trihedron size
2377 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2378 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2379 pref->setItemProperty( "min", 1.0E-06, occTS );
2380 pref->setItemProperty( "max", 1000, occTS );
2381 // .... -> relative size of trihedron
2382 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2383 // .... -> show static trihedron
2384 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2385 // ... "Trihedron" group <<end>>
2386 // .. "3D viewer" group <<end>>
2390 #ifndef DISABLE_OCCVIEWER
2391 // .. "OCC viewer" group <<start>>
2392 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2394 // .... -> Projection mode
2395 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2396 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2397 aValuesList.clear();
2398 anIndicesList.clear();
2399 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2400 anIndicesList << 0 << 1;
2401 pref->setItemProperty( "strings", aValuesList, occProjMode );
2402 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2403 #if OCC_VERSION_LARGE > 0x06090000
2404 // .... -> Stereo group
2405 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2406 pref->setItemProperty( "columns", 2, stereoGroup );
2407 // .... -> Stereo type
2408 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2409 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2410 aValuesList.clear();
2411 anIndicesList.clear();
2413 OCCViewer_Viewer::stereoData( aValuesList, idList);
2414 foreach( int gid, idList ) anIndicesList << gid;
2415 pref->setItemProperty( "strings", aValuesList, stereoType );
2416 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2418 // .... -> Anaglyph filter
2419 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2420 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2421 aValuesList.clear();
2422 anIndicesList.clear();
2423 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2424 anIndicesList << 0 << 1 << 2;
2426 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2427 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2429 // .... -> Convergence distance type
2430 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2431 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2432 aValuesList.clear();
2433 anIndicesList.clear();
2434 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2435 anIndicesList << 0 << 1;
2436 pref->setItemProperty( "strings", aValuesList, occFocusType );
2437 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2439 // .... -> Stereographic focus value
2440 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2441 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2442 pref->setItemProperty( "precision", 3, focusValue );
2443 pref->setItemProperty( "min", 1.0E-03, focusValue );
2444 pref->setItemProperty( "max", 1.0E03, focusValue );
2445 pref->setItemProperty( "step", 0.05, focusValue );
2448 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2449 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2450 aValuesList.clear();
2451 anIndicesList.clear();
2452 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2453 anIndicesList << 0 << 1;
2454 pref->setItemProperty( "strings", aValuesList, occIODType );
2455 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2457 // .... -> Interocular distance (IOD) value
2458 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2459 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2460 pref->setItemProperty( "precision", 3, IODValue );
2461 pref->setItemProperty( "min", 1.0E-03, IODValue );
2462 pref->setItemProperty( "max", 1.0E03, IODValue );
2463 pref->setItemProperty( "step", 0.05, IODValue );
2465 // .... -> Reverse stereo
2466 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2467 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2468 // .... -> Enable V-Sync
2469 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2470 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2471 // .... -> Enable quad-buffer support
2472 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2473 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2475 // ... "Background" group <<start>>
2476 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2477 // pref->setItemProperty( "columns", 2, bgGroup );
2478 aValuesList.clear();
2479 anIndicesList.clear();
2482 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2483 foreach( int gid, idList ) anIndicesList << gid;
2484 // .... -> 3D viewer background
2485 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2486 LightApp_Preferences::Background, "OCCViewer", "background" );
2487 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2488 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2489 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2490 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2491 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2492 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2493 pref->setItemProperty( "custom_enabled", false, bgId );
2494 pref->setItemProperty( "image_formats", formats, bgId );
2495 // .... -> XZ viewer background
2496 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2497 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2498 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2499 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2500 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2501 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2502 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2503 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2504 pref->setItemProperty( "custom_enabled", false, bgId );
2505 pref->setItemProperty( "image_formats", formats, bgId );
2506 // .... -> YZ viewer background
2507 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2508 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2509 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2510 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2511 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2512 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2513 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2514 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2515 pref->setItemProperty( "custom_enabled", false, bgId );
2516 pref->setItemProperty( "image_formats", formats, bgId );
2517 // .... -> XY viewer background
2518 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2519 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2520 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2521 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2522 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2523 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2524 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2525 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2526 pref->setItemProperty( "custom_enabled", false, bgId );
2527 pref->setItemProperty( "image_formats", formats, bgId );
2528 // ... "Background" group <<end>>
2531 // ... "Selection" group <<start>>
2532 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2533 pref->setItemProperty( "columns", 2, occSelectionGroup );
2534 // .... -> enable preselection
2535 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2536 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2537 // .... -> enable selection
2538 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2539 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2540 // ... "Selection" group <<end>>
2542 // ... "Clipping" group <<start>>
2543 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2544 // .... -> clipping color
2545 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2546 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2547 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2548 pref->setItemProperty( "columns", 2, texturePref );
2549 // .... -> use default texture
2550 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2551 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2552 // .... -> clipping texture
2553 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2554 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2555 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2557 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2558 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2559 // .... -> scale factor
2560 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2561 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2562 pref->setItemProperty( "precision", 3, scaleFactor );
2563 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2564 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2565 pref->setItemProperty( "step", 0.1, scaleFactor );
2566 // ... "Clipping" group <<end>>
2568 // ... "Ray tracing" group <<start>>
2569 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2570 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2571 pref->setItemProperty( "columns", 2, rtPref );
2573 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2574 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2575 pref->setItemProperty( "min", 1, rt_depth );
2576 pref->setItemProperty( "max", 10, rt_depth );
2577 pref->setItemProperty( "step", 1, rt_depth );
2578 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2579 // .... -> specular reflections
2580 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2581 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2582 // .... -> adaptive anti-aliasing
2583 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2584 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2585 // .... -> shadows rendering
2586 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2587 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2588 // .... -> transparent shadow
2589 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2590 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2591 // ... "Ray tracing" group <<end>>
2593 // ... "Light source" group <<start>>
2594 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2595 // .... -> light color
2596 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2597 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2598 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2599 pref->setItemProperty( "columns", 3, directionPref );
2600 // .... -> light direction (dx component)
2601 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2602 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2603 pref->setItemProperty( "precision", 2, light_dx );
2604 pref->setItemProperty( "min", -1.0E03, light_dx );
2605 pref->setItemProperty( "max", 1.0E03, light_dx );
2606 pref->setItemProperty( "step", 0.1, light_dx );
2607 // .... -> light direction (dy component)
2608 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2609 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2610 pref->setItemProperty( "precision", 2, light_dy );
2611 pref->setItemProperty( "min", -1.0E03, light_dy );
2612 pref->setItemProperty( "max", 1.0E03, light_dy );
2613 pref->setItemProperty( "step", 0.1, light_dy );
2614 // .... -> light direction (dz component)
2615 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2616 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2617 pref->setItemProperty( "precision", 2, light_dz );
2618 pref->setItemProperty( "min", -1.0E03, light_dz );
2619 pref->setItemProperty( "max", 1.0E03, light_dz );
2620 pref->setItemProperty( "step", 0.1, light_dz );
2621 // ... "Light source" group <<end>>
2623 // ... -> empty frame (for layout) <<start>>
2624 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2625 pref->setItemProperty( "margin", 0, occGen );
2626 pref->setItemProperty( "columns", 2, occGen );
2627 // ... -> empty frame (for layout) <<end>>
2629 // .. "OCC viewer" group <<end>>
2632 #ifndef DISABLE_VTKVIEWER
2633 // .. "VTK viewer" group <<start>>
2634 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2636 // ... -> empty frame (for layout) <<start>>
2637 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2638 //pref->setItemProperty( "columns", 2, vtkGen );
2639 // .... -> projection mode
2640 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2641 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2642 aValuesList.clear();
2643 anIndicesList.clear();
2644 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2645 anIndicesList << 0 << 1;
2646 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2647 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2649 // .... -> Stereo group
2650 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2651 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2652 // .... -> Stereo type
2653 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2654 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2655 aValuesList.clear();
2656 anIndicesList.clear();
2658 SVTK_Viewer::stereoData( aValuesList, idList);
2659 foreach( int gid, idList ) anIndicesList << gid;
2660 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2661 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2662 // .... -> Anaglyph filter
2663 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2664 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2665 aValuesList.clear();
2666 anIndicesList.clear();
2667 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2668 anIndicesList << 0 << 1 << 2;
2670 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2671 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2673 // .... -> Enable quad-buffer support
2674 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2675 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2677 // .... -> background
2678 aValuesList.clear();
2679 anIndicesList.clear();
2682 #ifndef DISABLE_SALOMEOBJECT
2683 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2685 foreach( int gid, idList ) anIndicesList << gid;
2686 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2687 LightApp_Preferences::Background, "VTKViewer", "background" );
2688 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2689 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2690 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2691 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2692 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2693 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2694 pref->setItemProperty( "custom_enabled", false, bgId );
2695 #ifndef DISABLE_SALOMEOBJECT
2696 pref->setItemProperty( "image_formats", formats, bgId );
2698 // .... -> speed increment
2699 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2700 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2701 pref->setItemProperty( "min", 1, vtkSpeed );
2702 pref->setItemProperty( "max", 1000, vtkSpeed );
2703 // .... -> speed mode
2704 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2705 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2706 aValuesList.clear();
2707 anIndicesList.clear();
2708 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2709 anIndicesList << 0 << 1;
2710 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2711 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2713 // ... "Selection" group <<start>>
2714 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2715 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2716 // .... -> preselection
2717 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2718 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2719 aValuesList.clear();
2720 anIndicesList.clear();
2721 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2722 anIndicesList << 0 << 1 << 2;
2723 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2724 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2725 // .... -> enable selection
2726 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2727 // ... "Selection" group <<end>>
2729 // ... -> empty frame (for layout) <<end>>
2731 // ... space mouse sub-group <<start>>
2732 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2733 //pref->setItemProperty( "columns", 2, vtkSM );
2734 // .... -> decrease speed increment
2735 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2736 LightApp_Preferences::Selector, "VTKViewer",
2737 "spacemouse_func1_btn" );
2738 // .... -> increase speed increment
2739 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2740 LightApp_Preferences::Selector, "VTKViewer",
2741 "spacemouse_func2_btn" );
2742 // .... -> dominant / combined switch
2743 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2744 LightApp_Preferences::Selector, "VTKViewer",
2745 "spacemouse_func5_btn" ); //
2746 aValuesList.clear();
2747 anIndicesList.clear();
2748 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2749 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2750 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2751 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2752 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2753 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2754 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2755 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2756 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2757 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2758 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2759 // ... space mouse sub-group <<end>>
2761 // ... avi recording sub-group <<start>>
2762 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2763 pref->setItemProperty( "columns", 2, vtkRec );
2764 // .... -> recording mode
2765 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2766 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2767 aValuesList.clear();
2768 anIndicesList.clear();
2769 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2770 anIndicesList << 0 << 1;
2771 pref->setItemProperty( "strings", aValuesList, modePref );
2772 pref->setItemProperty( "indexes", anIndicesList, modePref );
2774 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2775 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2776 pref->setItemProperty( "min", 0.1, fpsPref );
2777 pref->setItemProperty( "max", 100, fpsPref );
2779 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2780 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2781 pref->setItemProperty( "min", 1, qualityPref );
2782 pref->setItemProperty( "max", 100, qualityPref );
2783 // .... -> progressive mode
2784 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2785 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2786 // ... avi recording sub-group <<end>>
2788 // ... group names sub-group <<start>>
2789 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2790 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2791 pref->setItemProperty( "columns", 2, vtkGN );
2792 // .... -> text color
2793 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2794 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2795 // .... -> transparency
2796 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2797 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2798 pref->setItemProperty( "min", 0.0, transPref );
2799 pref->setItemProperty( "max", 1.0, transPref );
2800 pref->setItemProperty( "step", 0.1, transPref );
2801 // ... -> group names sub-group <<end>>
2802 // .. "VTK viewer" group <<end>>
2805 // .. "Plot2d viewer" group <<start>>
2806 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2807 //pref->setItemProperty( "columns", 2, plot2dGroup );
2809 // ... -> background
2810 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2811 LightApp_Preferences::Color, "Plot2d", "Background" );
2812 // ... -> selection color
2813 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2814 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2816 // ... "Viewer" group <<start>>
2817 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2819 // .... -> curve type
2820 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2821 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2822 aValuesList.clear();
2823 anIndicesList.clear();
2824 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2825 anIndicesList << 0 << 1 << 2 ;
2826 pref->setItemProperty( "strings", aValuesList, curveType );
2827 pref->setItemProperty( "indexes", anIndicesList, curveType );
2828 // .... -> marker size
2829 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2830 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2831 pref->setItemProperty( "min", 0, markerSize );
2832 pref->setItemProperty( "max", 100, markerSize );
2833 // .... -> horizontal scaling mode
2834 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2835 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2836 aValuesList.clear();
2837 anIndicesList.clear();
2838 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2839 anIndicesList << 0 << 1 ;
2840 pref->setItemProperty( "strings", aValuesList, horScale );
2841 pref->setItemProperty( "indexes", anIndicesList, horScale );
2842 // .... -> vertical scaling mode
2843 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2844 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2845 pref->setItemProperty( "strings", aValuesList, verScale );
2846 pref->setItemProperty( "indexes", anIndicesList, verScale );
2848 // .... -> errors/deviation colot
2849 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2850 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2851 // .... -> deviation markers line size
2852 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2853 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2854 pref->setItemProperty( "min", 1, deviationMarkerLw );
2855 pref->setItemProperty( "max", 5, deviationMarkerLw );
2856 // .... -> deviation markers tick mark size
2857 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2858 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2859 pref->setItemProperty( "min", 1, deviationMarkerTs );
2860 pref->setItemProperty( "max", 5, deviationMarkerTs );
2861 // .... "Viewer" group <<end>>
2863 // ... "Legend" group <<start>>
2864 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2866 // .... -> show legend
2867 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2868 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2869 // .... -> legend position
2870 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2871 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2872 aValuesList.clear();
2873 anIndicesList.clear();
2874 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2875 anIndicesList << 0 << 1 << 2 << 3 ;
2876 pref->setItemProperty( "strings", aValuesList, legendPosition );
2877 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2878 // .... -> Symbol type
2879 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2880 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2881 aValuesList.clear();
2882 anIndicesList.clear();
2883 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2884 anIndicesList << 0 << 1 ;
2885 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2886 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2887 // .... -> legend font
2888 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2889 // ... -> font color
2890 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2891 // ... -> selection font color
2892 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2893 // ... "Legend" group <<end>>
2895 // .. "Plot2d viewer" group <<end>>
2897 // .. "PyViewer" preferences tab <<start>>
2898 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2899 // ... "Font settings" group <<start>>
2900 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2901 pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2902 LightApp_Preferences::Font, "PyEditor", "Font" );
2903 // ... "Font settings" group <<end>>
2904 // ... "Display settings" group <<start>>
2905 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2906 pref->setItemProperty( "columns", 2, pyDispGroup );
2907 // ... -> current line highlight
2908 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2909 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2910 // ... -> text wrapping
2911 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2912 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2913 // ... -> center cursor on scroll
2914 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2915 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2916 // ... -> line numbers area
2917 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2918 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2919 // ... "Display settings" group <<end>>
2920 // ... "Tab settings" group <<start>>
2921 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2922 pref->setItemProperty( "columns", 2, pyTabGroup );
2923 // ... -> tab whitespaces
2924 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2925 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2927 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2928 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2929 // ... "Tab settings" group <<end>>
2930 // ... "Vertical edge settings" group <<start>>
2931 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2932 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2933 // ... -> vertical edge
2934 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2935 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2936 // ... -> number of columns
2937 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2938 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2939 // ... "Vertical edge settings" group <<end>>
2940 // .. "PyEditor" preferences tab <<end>>
2942 // .. "Directories" preferences tab <<start>>
2943 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2944 // ... --> quick directories list
2945 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2946 pref->addPreference( tr( "" ), dirGroup,
2947 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2948 // .. "Directories" preferences tab <<end>>
2950 // .. "Object browser" preferences tab <<start>>
2951 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2953 // ... "Search tool" group <<start>>
2954 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2955 // .... --> auto-hide
2956 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2957 "ObjectBrowser", "auto_hide_search_tool" );
2958 // ... "Search tool" group <<end>>
2960 // ... "Object browser settings" group <<start>>
2961 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2962 pref->setItemProperty( "columns", 2, objSetGroup );
2963 // .... -> auto size first column
2964 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2965 "ObjectBrowser", "auto_size_first" );
2966 // .... -> auto size other columns
2967 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2968 "ObjectBrowser", "auto_size" );
2969 // .... -> resize columns on expand item
2970 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2971 "ObjectBrowser", "resize_on_expand_item" );
2972 // .... -> browse to published object
2973 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2974 "ObjectBrowser", "browse_published_object" );
2975 aValuesList.clear();
2976 anIndicesList.clear();
2977 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2978 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2979 pref->setItemProperty( "strings", aValuesList, browsePublished );
2980 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2981 // ... "Object browser settings" group <<end>>
2982 // .. "Object browser" preferences tab <<end>>
2984 // .. "Shortcuts" preferences tab <<start>>
2985 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2986 // ... "Shortcuts settings" group <<start>>
2987 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2988 pref->addPreference( tr( "" ), shortcutGroup,
2989 LightApp_Preferences::ShortcutTree, "shortcuts" );
2990 // ... "Shortcuts settings" group <<end>>
2991 // .. "Shortcuts" preferences tab <<end>>
2992 // . Top-level "SALOME" preferences group <<end>>
2998 Changes appearance of application according to changed preferences
2999 \param sec - section
3000 \param param - name of changed parameter
3002 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3004 SUIT_ResourceMgr* resMgr = resourceMgr();
3008 if ( sec == "viewers" && param == "drop_down_buttons" )
3010 ViewManagerList vmlist = viewManagers();
3011 foreach( SUIT_ViewManager* vm, vmlist )
3013 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3014 foreach( SUIT_ViewWindow* vw, vwlist )
3015 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3019 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3021 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3022 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3023 QList<SUIT_ViewManager*> lst;
3024 #ifndef DISABLE_OCCVIEWER
3025 viewManagers( OCCViewer_Viewer::Type(), lst );
3026 QListIterator<SUIT_ViewManager*> itOCC( lst );
3027 while ( itOCC.hasNext() && sz >= 0 )
3029 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3030 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3033 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3034 occVM->setTrihedronSize( sz, relative );
3035 occVM->getAISContext()->UpdateCurrentViewer();
3038 #ifndef DISABLE_VTKVIEWER
3039 #ifndef DISABLE_SALOMEOBJECT
3040 viewManagers( SVTK_Viewer::Type(), lst );
3041 QListIterator<SUIT_ViewManager*> itVTK( lst );
3042 while ( itVTK.hasNext() && sz >= 0 )
3044 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3045 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3048 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3051 vtkVM->setTrihedronSize( sz, relative );
3059 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3061 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3062 QList<SUIT_ViewManager*> lst;
3063 #ifndef DISABLE_OCCVIEWER
3064 viewManagers( OCCViewer_Viewer::Type(), lst );
3065 QListIterator<SUIT_ViewManager*> itOCC( lst );
3066 while ( itOCC.hasNext() )
3068 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3069 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3072 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3075 occVM->setStaticTrihedronDisplayed( isVisible );
3079 #ifndef DISABLE_VTKVIEWER
3080 #ifndef DISABLE_SALOMEOBJECT
3081 viewManagers( SVTK_Viewer::Type(), lst );
3082 QListIterator<SUIT_ViewManager*> itVTK( lst );
3083 while ( itVTK.hasNext() )
3085 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3086 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3089 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3092 vtkVM->setStaticTrihedronVisible( isVisible );
3100 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3102 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3103 QList<SUIT_ViewManager*> lst;
3104 #ifndef DISABLE_OCCVIEWER
3105 viewManagers( OCCViewer_Viewer::Type(), lst );
3106 QListIterator<SUIT_ViewManager*> itOCC( lst );
3107 while ( itOCC.hasNext() )
3109 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3110 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3113 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3114 occVM->setInteractionStyle( mode );
3117 #ifndef DISABLE_VTKVIEWER
3118 #ifndef DISABLE_SALOMEOBJECT
3119 viewManagers( SVTK_Viewer::Type(), lst );
3120 QListIterator<SUIT_ViewManager*> itVTK( lst );
3121 while ( itVTK.hasNext() )
3123 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3124 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3127 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3128 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3134 #ifndef DISABLE_OCCVIEWER
3135 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3137 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3138 QList<SUIT_ViewManager*> lst;
3139 viewManagers( OCCViewer_Viewer::Type(), lst );
3140 QListIterator<SUIT_ViewManager*> it( lst );
3141 while ( it.hasNext() )
3143 SUIT_ViewModel* vm = it.next()->getViewModel();
3144 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3147 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3148 occVM->enablePreselection( isToEnablePreselection );
3153 #ifndef DISABLE_OCCVIEWER
3154 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3156 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3157 QList<SUIT_ViewManager*> lst;
3158 viewManagers( OCCViewer_Viewer::Type(), lst );
3159 QListIterator<SUIT_ViewManager*> it( lst );
3160 while ( it.hasNext() )
3162 SUIT_ViewModel* vm = it.next()->getViewModel();
3163 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3166 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3167 occVM->enableSelection( isToEnableSelection );
3172 #ifndef DISABLE_OCCVIEWER
3173 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3175 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3176 QList<SUIT_ViewManager*> lst;
3177 viewManagers( OCCViewer_Viewer::Type(), lst );
3178 QListIterator<SUIT_ViewManager*> it( lst );
3179 while ( it.hasNext() )
3181 SUIT_ViewModel* vm = it.next()->getViewModel();
3182 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3185 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3186 occVM->setClippingColor( aColor );
3191 #ifndef DISABLE_OCCVIEWER
3192 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3193 param == QString( "clipping_texture" ) ||
3194 param == QString( "clipping_modulate" ) ||
3195 param == QString( "clipping_scale" ) ) )
3197 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3198 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3199 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3200 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3201 QList<SUIT_ViewManager*> lst;
3202 viewManagers( OCCViewer_Viewer::Type(), lst );
3203 QListIterator<SUIT_ViewManager*> it( lst );
3204 while ( it.hasNext() )
3206 SUIT_ViewModel* vm = it.next()->getViewModel();
3207 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3210 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3211 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3216 #ifndef DISABLE_OCCVIEWER
3217 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3219 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3220 QList<SUIT_ViewManager*> lst;
3221 viewManagers( OCCViewer_Viewer::Type(), lst );
3222 QListIterator<SUIT_ViewManager*> it( lst );
3223 while ( it.hasNext() )
3225 SUIT_ViewModel* vm = it.next()->getViewModel();
3226 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3229 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3230 occVM->setProjectionType( mode );
3234 #if OCC_VERSION_LARGE > 0x06090000
3235 #ifndef DISABLE_OCCVIEWER
3236 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3238 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3239 QList<SUIT_ViewManager*> lst;
3240 viewManagers( OCCViewer_Viewer::Type(), lst );
3241 QListIterator<SUIT_ViewManager*> it( lst );
3242 while ( it.hasNext() )
3244 SUIT_ViewModel* vm = it.next()->getViewModel();
3245 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3248 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3249 occVM->setStereoType( mode );
3254 #ifndef DISABLE_OCCVIEWER
3255 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3257 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3258 QList<SUIT_ViewManager*> lst;
3259 viewManagers( OCCViewer_Viewer::Type(), lst );
3260 QListIterator<SUIT_ViewManager*> it( lst );
3261 while ( it.hasNext() )
3263 SUIT_ViewModel* vm = it.next()->getViewModel();
3264 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3267 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3268 occVM->setAnaglyphFilter( mode );
3273 #ifndef DISABLE_OCCVIEWER
3274 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3275 param == QString( "focus_value" ) ) )
3277 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3278 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3279 QList<SUIT_ViewManager*> lst;
3280 viewManagers( OCCViewer_Viewer::Type(), lst );
3281 QListIterator<SUIT_ViewManager*> it( lst );
3282 while ( it.hasNext() )
3284 SUIT_ViewModel* vm = it.next()->getViewModel();
3285 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3288 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3289 occVM->setStereographicFocus( aType, aValue );
3294 #ifndef DISABLE_OCCVIEWER
3295 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3296 param == QString( "iod_value" ) ) )
3298 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3299 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3300 QList<SUIT_ViewManager*> lst;
3301 viewManagers( OCCViewer_Viewer::Type(), lst );
3302 QListIterator<SUIT_ViewManager*> it( lst );
3303 while ( it.hasNext() )
3305 SUIT_ViewModel* vm = it.next()->getViewModel();
3306 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3309 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3310 occVM->setInterocularDistance( aType, aValue );
3315 #ifndef DISABLE_OCCVIEWER
3316 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3318 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3319 QList<SUIT_ViewManager*> lst;
3320 viewManagers( OCCViewer_Viewer::Type(), lst );
3321 QListIterator<SUIT_ViewManager*> it( lst );
3322 while ( it.hasNext() )
3324 SUIT_ViewModel* vm = it.next()->getViewModel();
3325 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3328 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3329 occVM->setReverseStereo( reverse );
3334 #ifndef DISABLE_OCCVIEWER
3335 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3337 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3338 QList<SUIT_ViewManager*> lst;
3339 viewManagers( OCCViewer_Viewer::Type(), lst );
3340 QListIterator<SUIT_ViewManager*> it( lst );
3341 while ( it.hasNext() )
3343 SUIT_ViewModel* vm = it.next()->getViewModel();
3344 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3347 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3348 occVM->setVSync( enable );
3353 #ifndef DISABLE_OCCVIEWER
3354 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3356 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3357 QList<SUIT_ViewManager*> lst;
3358 viewManagers( OCCViewer_Viewer::Type(), lst );
3359 QListIterator<SUIT_ViewManager*> it( lst );
3360 while ( it.hasNext() )
3362 SUIT_ViewModel* vm = it.next()->getViewModel();
3363 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3366 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3367 occVM->setQuadBufferSupport( enable );
3372 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3374 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3375 QList<SUIT_ViewManager*> lst;
3376 #ifndef DISABLE_OCCVIEWER
3377 viewManagers( OCCViewer_Viewer::Type(), lst );
3378 QListIterator<SUIT_ViewManager*> itOCC( lst );
3379 while ( itOCC.hasNext() )
3381 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3382 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3385 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3386 occVM->setZoomingStyle( mode );
3389 #ifndef DISABLE_VTKVIEWER
3390 #ifndef DISABLE_SALOMEOBJECT
3391 viewManagers( SVTK_Viewer::Type(), lst );
3392 QListIterator<SUIT_ViewManager*> itVTK( lst );
3393 while ( itVTK.hasNext() )
3395 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3396 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3399 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3400 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3406 #ifndef DISABLE_VTKVIEWER
3407 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3409 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3410 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3411 QList<SUIT_ViewManager*> lst;
3412 #ifndef DISABLE_SALOMEOBJECT
3413 viewManagers( SVTK_Viewer::Type(), lst );
3414 QListIterator<SUIT_ViewManager*> it( lst );
3415 while ( it.hasNext() )
3417 SUIT_ViewModel* vm = it.next()->getViewModel();
3418 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3421 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3422 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3428 #ifndef DISABLE_VTKVIEWER
3429 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3431 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3432 QList<SUIT_ViewManager*> lst;
3433 #ifndef DISABLE_SALOMEOBJECT
3434 viewManagers( SVTK_Viewer::Type(), lst );
3435 QListIterator<SUIT_ViewManager*> it( lst );
3436 while ( it.hasNext() )
3438 SUIT_ViewModel* vm = it.next()->getViewModel();
3439 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3442 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3443 if( vtkVM ) vtkVM->setProjectionMode( mode );
3449 #ifndef DISABLE_VTKVIEWER
3450 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3452 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3453 QList<SUIT_ViewManager*> lst;
3454 #ifndef DISABLE_SALOMEOBJECT
3455 viewManagers( SVTK_Viewer::Type(), lst );
3456 QListIterator<SUIT_ViewManager*> it( lst );
3457 while ( it.hasNext() )
3459 SUIT_ViewModel* vm = it.next()->getViewModel();
3460 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3463 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3464 if( vtkVM ) vtkVM->setStereoType( mode );
3470 #ifndef DISABLE_VTKVIEWER
3471 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3473 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3474 QList<SUIT_ViewManager*> lst;
3475 #ifndef DISABLE_SALOMEOBJECT
3476 viewManagers( SVTK_Viewer::Type(), lst );
3477 QListIterator<SUIT_ViewManager*> it( lst );
3478 while ( it.hasNext() )
3480 SUIT_ViewModel* vm = it.next()->getViewModel();
3481 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3484 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3485 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3491 #ifndef DISABLE_VTKVIEWER
3492 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3494 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3495 QList<SUIT_ViewManager*> lst;
3496 #ifndef DISABLE_SALOMEOBJECT
3497 viewManagers( SVTK_Viewer::Type(), lst );
3498 QListIterator<SUIT_ViewManager*> it( lst );
3499 while ( it.hasNext() )
3501 SUIT_ViewModel* vm = it.next()->getViewModel();
3502 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3505 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3506 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3512 #ifndef DISABLE_VTKVIEWER
3513 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3515 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3516 QList<SUIT_ViewManager*> lst;
3517 #ifndef DISABLE_SALOMEOBJECT
3518 viewManagers( SVTK_Viewer::Type(), lst );
3519 QListIterator<SUIT_ViewManager*> it( lst );
3520 while ( it.hasNext() )
3522 SUIT_ViewModel* vm = it.next()->getViewModel();
3523 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3526 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3527 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3533 #ifndef DISABLE_VTKVIEWER
3534 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3536 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3537 QList<SUIT_ViewManager*> lst;
3538 #ifndef DISABLE_SALOMEOBJECT
3539 viewManagers( SVTK_Viewer::Type(), lst );
3540 QListIterator<SUIT_ViewManager*> it( lst );
3541 while ( it.hasNext() )
3543 SUIT_ViewModel* vm = it.next()->getViewModel();
3544 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3547 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3548 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3554 #ifndef DISABLE_VTKVIEWER
3555 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3556 param == QString( "spacemouse_func2_btn" ) ||
3557 param == QString( "spacemouse_func5_btn" ) ) )
3559 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3560 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3561 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3562 QList<SUIT_ViewManager*> lst;
3563 #ifndef DISABLE_SALOMEOBJECT
3564 viewManagers( SVTK_Viewer::Type(), lst );
3565 QListIterator<SUIT_ViewManager*> it( lst );
3566 while ( it.hasNext() )
3568 SUIT_ViewModel* vm = it.next()->getViewModel();
3569 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3572 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3573 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3578 if( sec=="ObjectBrowser" )
3580 SUIT_DataBrowser* ob = objectBrowser();
3584 if ( param=="auto_size_first" )
3586 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3587 ob->setAutoSizeFirstColumn( autoSizeFirst );
3588 if ( autoSizeFirst )
3589 ob->adjustFirstColumnWidth();
3591 else if ( param=="auto_size" ) {
3592 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3593 ob->setAutoSizeColumns(autoSize);
3595 ob->adjustColumnsWidth();
3597 else if ( param=="resize_on_expand_item" ) {
3598 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3599 ob->setResizeOnExpandItem(resizeOnExpandItem);
3601 else if ( param == "auto_hide_search_tool" ) {
3602 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3608 if( param=="auto_save_interval" ) {
3609 myAutoSaveTimer->stop();
3610 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3611 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3615 #ifndef DISABLE_PYCONSOLE
3616 if( sec=="PyConsole" && pythonConsole() )
3618 if ( param=="font" ) {
3619 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3621 else if ( param=="show_banner" ) {
3622 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3624 else if ( param=="auto_completion" ) {
3625 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3632 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3634 if ( param == "visible_count" )
3635 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3636 else if ( param == "max_count" )
3637 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3638 else if ( param == "insert_mode" )
3639 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3640 else if ( param == "link_type" )
3641 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3642 else if ( param == "show_clear" )
3643 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3644 else if ( param == "show_mru" )
3645 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3648 if ( sec == "language" && param == "language" )
3650 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3651 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3653 if ( sec == "language" && param == "locale")
3655 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3656 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3658 if ( sec == "desktop" && param == "opaque_resize" ) {
3659 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3660 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3661 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3662 else dopts &= ~QMainWindow::AnimatedDocks;
3663 desktop()->setDockOptions( dopts );
3664 desktop()->setOpaqueResize( opaqueResize );
3665 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3666 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3669 #ifndef DISABLE_PLOT2DVIEWER
3670 QList<SUIT_ViewManager*> lst;
3671 viewManagers( Plot2d_Viewer::Type(), lst );
3672 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3673 while ( itPlot2d.hasNext() ) {
3674 SUIT_ViewManager* viewMgr = itPlot2d.next();
3675 SUIT_ViewModel* vm = viewMgr->getViewModel();
3676 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3679 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3681 viewMgr->setViewModel( vm );
3682 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3684 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3685 frame->SetPreference();
3690 #ifndef DISABLE_PYVIEWER
3691 if ( sec == QString( "PyViewer" ) && ( param == QString( "HighlightCurrentLine" ) ||
3692 param == QString( "LineNumberArea" ) ||
3693 param == QString( "TextWrapping" ) ||
3694 param == QString( "CenterCursorOnScroll" ) ||
3695 param == QString( "TabSpaceVisible" ) ||
3696 param == QString( "TabSize" ) ||
3697 param == QString( "VerticalEdge" ) ||
3698 param == QString( "NumberColumns" ) ||
3699 param == QString( "Font" ) ) )
3701 QList<SUIT_ViewManager*> lst;
3702 viewManagers( PyViewer_Viewer::Type(), lst );
3703 QListIterator<SUIT_ViewManager*> itPy( lst );
3704 while ( itPy.hasNext() )
3706 SUIT_ViewManager* viewMgr = itPy.next();
3707 SUIT_ViewModel* vm = viewMgr->getViewModel();
3708 if ( !vm || !vm->inherits( "PyViewer_Viewer" ) )
3711 PyViewer_Viewer* pyEditVM = dynamic_cast<PyViewer_Viewer*>( vm );
3713 viewMgr->setViewModel( vm );
3714 PyViewer_ViewWindow* pyView = dynamic_cast<PyViewer_ViewWindow*>( viewMgr->getActiveView() );
3717 pyView->setPreferences();
3727 void LightApp_Application::loadPreferences()
3729 CAM_Application::loadPreferences();
3731 SUIT_ResourceMgr* aResMgr = resourceMgr();
3736 static bool mru_load = true;
3739 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3741 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3742 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3743 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3744 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3745 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3746 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3747 mru->loadLinks( aResMgr, "MRU" );
3753 QStringList mods = aResMgr->parameters( "windows_visibility" );
3754 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3757 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3758 myWinVis.insert( *itr, arr );
3762 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3763 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3764 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3765 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3766 else dopts &= ~QMainWindow::AnimatedDocks;
3767 desktop()->setDockOptions( dopts );
3768 desktop()->setOpaqueResize( opaqueResize );
3769 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3770 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3777 void LightApp_Application::savePreferences()
3779 CAM_Application::savePreferences();
3781 saveDockWindowsState();
3783 SUIT_ResourceMgr* aResMgr = resourceMgr();
3788 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3790 mru->saveLinks( aResMgr, "MRU" );
3792 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3793 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3796 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3798 #if GUI_DEVELOPMENT > 0
3799 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3801 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3808 Updates desktop title
3810 void LightApp_Application::updateDesktopTitle()
3812 QString aTitle = applicationName();
3813 QString aVer = applicationVersion();
3814 if ( !aVer.isEmpty() )
3815 aTitle += QString( " " ) + aVer;
3817 if ( activeStudy() ) {
3818 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3819 aTitle += QString( " - [%1]" ).arg( sName );
3822 desktop()->setWindowTitle( aTitle );
3826 \brief Get map of the operations which can be performed
3827 on the module activation.
3829 The method should return the map of the kind \c {<id>:<name>}
3830 where \c <id> is an integer identifier of the operation and
3831 \c <name> is a title for the button to be added to the
3832 dialog box. After user selects the required operation by the
3833 clicking the corresponding button in the dialog box, its identifier
3834 is passed to the moduleActionSelected() method to process
3837 \return map of the operations
3838 \sa moduleActionSelected()
3840 QMap<int, QString> LightApp_Application::activateModuleActions() const
3842 QMap<int, QString> opmap;
3843 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3844 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3849 \brief Called when the used selectes required operation chosen
3850 from "Activate module" dialog box.
3852 Performs the required operation according to the user choice.
3854 \param id operation identifier
3855 \sa activateModuleActions()
3857 void LightApp_Application::moduleActionSelected( const int id )
3872 Updates windows after close document
3874 void LightApp_Application::afterCloseDoc()
3878 CAM_Application::afterCloseDoc();
3882 Updates actions of active module
3884 void LightApp_Application::updateModuleActions()
3887 if ( activeModule() ) {
3888 modName = activeModule()->moduleName();
3889 if ( !isModuleAccessible( modName ) ) {
3890 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3891 foreach( SUIT_Application* app, apps ) {
3892 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3893 if ( lapp && lapp != this )
3894 lapp->removeModuleAction( modName );
3899 LightApp_ModuleAction* moduleAction =
3900 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3902 moduleAction->setActiveModule( modName );
3905 void LightApp_Application::removeModuleAction( const QString& modName )
3907 LightApp_ModuleAction* moduleAction =
3908 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3910 moduleAction->removeModule( modName );
3914 Gets current windows.
3915 \param winMap - output current windows map.
3917 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3920 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3921 ((LightApp_Module*)activeModule())->windows( winMap );
3923 defaultWindows( winMap );
3927 Gets current view managers.
3928 \param lst - output current view managers list.
3930 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3933 if ( !activeStudy() )
3936 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3937 ((LightApp_Module*)activeModule())->viewManagers( lst );
3939 defaultViewManagers( lst );
3945 void LightApp_Application::updateWindows()
3947 QMap<int, int> winMap;
3948 currentWindows( winMap );
3950 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3952 if ( !dockWindow( it.key() ) )
3953 getWindow( it.key() );
3956 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3958 QWidget* wid = it.value();
3959 if ( winMap.contains( it.key() ) )
3960 wid->setVisible( true );
3965 loadDockWindowsState();
3969 Updates view managers
3971 void LightApp_Application::updateViewManagers()
3974 currentViewManagers( lst );
3976 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3977 getViewManager( *it, true );
3981 Loads windows geometry
3983 void LightApp_Application::loadDockWindowsState()
3987 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3988 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3989 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3992 if ( activeModule() )
3993 modName = activeModule()->name();
3994 else if ( activeStudy() )
3995 modName = "nomodule";
3997 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3998 QByteArray aDefaultState;
3999 aResMgr->value( "windows_geometry", modName, aDefaultState );
4000 QByteArray aDefaultVisibility;
4001 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
4002 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
4003 aResMgr->setWorkingMode( prevMode );
4005 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
4008 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
4009 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
4011 if ( version > Qtx::versionToId( "7.4.1" ) )
4012 aResMgr->value( "windows_geometry", modName , arr );
4014 arr = aDefaultState;
4015 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4016 desktop()->restoreState( aTargetArray );
4019 QStringList mainToolbarsNames;
4020 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4021 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4022 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4024 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4027 QMap<QString, bool> *tbMap = 0;
4028 QMap<QString, bool> *dwMap = 0;
4030 QMap<QString, bool> userTbMap, userDwMap;
4031 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4033 QMap<QString, bool> defaultTbMap, defaultDwMap;
4034 if(hasDefaultVisibility) {
4035 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4041 if(hasDefaultVisibility){
4042 tbMap = &defaultTbMap;
4049 if(hasDefaultVisibility){
4050 dwMap = &defaultDwMap;
4055 QList<QToolBar*> tbList = findToolBars();
4056 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4058 QToolBar* tb = *tit;
4059 if ( tbMap->contains( tb->objectName() ) ) {
4060 tb->setVisible( (*tbMap)[tb->objectName()] );
4066 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4067 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4069 QDockWidget* dw = *dit;
4071 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4072 if ( po != desktop() )
4075 if ( dwMap->contains( dw->objectName() ) )
4076 dw->setVisible( (*dwMap)[dw->objectName()] );
4084 Saves windows geometry
4086 void LightApp_Application::saveDockWindowsState()
4091 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4092 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4094 if( !storeWin && !storeTb )
4098 if ( activeModule() )
4099 modName = activeModule()->name();
4100 else if ( activeStudy() )
4101 modName = "nomodule";
4103 QString versionId = GUI_VERSION_STR;
4104 #if GUI_DEVELOPMENT > 0
4108 QByteArray arr = desktop()->saveState();
4109 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4110 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4113 if ( myWinVis.contains( modName ) )
4114 visArr = myWinVis[modName];
4116 QMap<QString, bool> tbMap, dwMap;
4117 dockWindowsState( visArr, tbMap, dwMap );
4119 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4120 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4123 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4126 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4127 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4129 QDockWidget* wid = *it;
4130 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4133 visArr = dockWindowsState( tbMap, dwMap );
4135 myWinVis.insert( modName, visArr );
4138 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4141 QDataStream stream( &visArr, QIODevice::WriteOnly );
4143 stream << (uchar)ToolBarMarker;
4144 stream << tb.size();
4145 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4147 stream << tit.key();
4148 stream << (uchar)( tit.value() ? 1 : 0 );
4151 stream << (uchar)DockWidgetMarker;
4152 stream << dw.size();
4153 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4155 stream << wit.key();
4156 stream << (uchar)( wit.value() ? 1 : 0 );
4162 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4167 QByteArray visArr = arr;
4168 QDataStream stream( &visArr, QIODevice::ReadOnly );
4172 if ( marker != ToolBarMarker )
4177 for ( int i = 0; i < lines; ++i )
4180 stream >> objectName;
4183 tb.insert( objectName, shown );
4187 if ( marker != DockWidgetMarker )
4191 for ( int j = 0; j < lines; ++j )
4194 stream >> objectName;
4197 dw.insert( objectName, shown );
4202 Adds icon names for modules
4204 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4208 SUIT_ResourceMgr* resMgr = resourceMgr();
4212 QStringList modList;
4213 modules( modList, false );
4215 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4217 QString modName = *it;
4218 QString modIntr = moduleName( modName );
4219 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4221 if ( modIcon.isEmpty() )
4224 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4225 modIcon += QString( ".png" );
4227 iconMap.insert( modName, modIcon );
4232 Inserts items in popup, which necessary for current application
4234 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4237 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4238 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4239 selMgr->setSelectionCacheEnabled( true );
4241 SUIT_DataBrowser* ob = objectBrowser();
4243 CAM_Application::contextMenuPopup( type, thePopup, title );
4245 if ( ob && type == ob->popupClientType() ) {
4246 thePopup->addSeparator();
4247 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4248 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4249 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4252 #ifndef DISABLE_SALOMEOBJECT
4253 if ( selMgr && ob ) {
4254 SALOME_ListIO selected;
4255 selMgr->selectedObjects( selected );
4256 if(selected.Extent() == 1){
4257 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4258 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4259 if(obj && obj->renameAllowed()) {
4260 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4261 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4262 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4263 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4265 QList<QAction*> acts = thePopup->actions();
4266 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4267 thePopup->insertAction(firstAction,a);
4273 selMgr->setSelectionCacheEnabled( cacheIsOn );
4279 void LightApp_Application::createEmptyStudy()
4281 CAM_Application::createEmptyStudy();
4283 if ( objectBrowser() )
4284 objectBrowser()->updateTree();
4286 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4287 if ( aResMgr && activeStudy() ) {
4288 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4289 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4294 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4296 CAM_Application::setDesktop( desk );
4299 connect( desk, SIGNAL( message( const QString& ) ),
4300 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4301 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4302 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4303 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4304 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4310 \param mod - module to be activated
4312 bool LightApp_Application::activateModule( CAM_Module* mod )
4314 bool res = CAM_Application::activateModule( mod );
4316 if ( objectBrowser() )
4317 objectBrowser()->updateTree();
4323 \return keyborad accelerators manager object
4325 SUIT_Accel* LightApp_Application::accel() const
4331 Removes dead widget container from map
4333 void LightApp_Application::onWCDestroyed( QObject* ob )
4335 // remove destroyed widget container from windows map
4336 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4338 if ( itr.value() != ob )
4341 int key = itr.key();
4342 myWin.remove( key );
4347 void LightApp_Application::onMRUActivated( const QString& name )
4349 SUIT_Session* s = SUIT_Session::session();
4350 if ( s && s->activeApplication() == this )
4354 void LightApp_Application::onStylePreferences()
4356 #ifdef USE_SALOME_STYLE
4357 Style_PrefDlg dlg( desktop() );
4360 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4361 #endif // USE_SALOME_STYLE
4364 void LightApp_Application::onFullScreen(){
4365 if(myScreenHelper) {
4366 if(desktop()->isFullScreen())
4367 myScreenHelper->switchToNormalScreen();
4369 myScreenHelper->switchToFullScreen();
4374 Connects just added view manager
4376 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4378 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4379 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4380 CAM_Application::addViewManager( vm );
4384 Remove view manager from memory
4386 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4388 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4389 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4390 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4392 aStudy->removeObjectProperties( vm->getGlobalId() );
4394 CAM_Application::removeViewManager( vm );
4396 LightApp_SelectionMgr* selMgr = selectionMgr();
4397 QList<SUIT_Selector*> selectors;
4398 selMgr->selectors( selectors );
4399 foreach( SUIT_Selector* selector, selectors ) {
4400 if ( selector->owner() == vm->getViewModel() ) {
4405 // IPAL22894: Crash on closing OCC view
4411 Renames active window of desktop
4413 void LightApp_Application::onRenameWindow()
4418 QWidget* w = desktop()->activeWindow();
4423 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4424 if( ok && !name.isEmpty() )
4425 w->setWindowTitle( name );
4429 Closes active window of desktop
4431 void LightApp_Application::onCloseWindow()
4436 QWidget* w = desktop()->activeWindow();
4444 Closes all windows of desktop
4446 void LightApp_Application::onCloseAllWindow()
4448 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4452 QList<SUIT_ViewWindow*> wndList = desk->windows();
4453 SUIT_ViewWindow* wnd;
4454 foreach( wnd, wndList )
4462 Groups all windows of desktop
4464 void LightApp_Application::onGroupAllWindow()
4466 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4470 QtxWorkstack* wgStack = desk->workstack();
4476 \return if the library of module exists
4477 \param moduleTitle - title of module
4479 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4481 if( moduleTitle.isEmpty() )
4484 QString lib = moduleLibrary( moduleTitle );
4486 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4487 bool isPythonModule = lib.contains("SalomePyQtGUI");
4488 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4492 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4494 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4497 bool isLibFound = false;
4498 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4499 for( ; anIt!=aLast; anIt++ )
4501 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4512 INFOS( "\n****************************************************************" << std::endl
4513 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4514 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4515 << "****************************************************************" << std::endl );
4517 else if ( !isPythonModule && !isPythonLightModule)
4520 if ( isPythonModule || isPythonLightModule)
4522 QString pylib = moduleName( moduleTitle ) + QString(".py");
4523 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4525 // Check the python library
4527 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4529 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4531 bool isPyLib = false, isPyGuiLib = false;
4532 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4533 for( ; anIt!=aLast; anIt++ )
4535 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4536 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4538 if(!isPythonLightModule)
4539 if( !isPyLib && inf.exists() )
4542 if( !isPyGuiLib && infgui.exists() )
4545 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4549 printf( "\n****************************************************************\n" );
4550 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4552 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4554 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4555 printf( "****************************************************************\n" );
4562 \return default name for an active study
4564 void LightApp_Application::setDefaultStudyName( const QString& theName )
4566 QStringList anInfoList;
4567 modules( anInfoList, false );
4569 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4570 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4571 !aStudy->isSaved() )
4573 aStudy->setStudyName( theName );
4574 updateDesktopTitle();
4579 Custom event handler
4581 bool LightApp_Application::event( QEvent* e )
4583 if( e && e->type()==2000 )
4585 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4586 QString* d = ( QString* )ce->data();
4587 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4589 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4590 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4591 showPreferences( tr( "PREF_APP" ) );
4596 return CAM_Application::event( e );
4599 /*! Check data object */
4600 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4604 bool isSuitable = !theObj->entry().isEmpty() &&
4605 !theObj->componentDataType().isEmpty() &&
4606 !theObj->name().isEmpty();
4613 int LightApp_Application::openChoice( const QString& aName )
4615 int choice = CAM_Application::openChoice( aName );
4617 if ( choice == OpenExist ) // The document is already open.
4619 // Do you want to reload it?
4620 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4621 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4622 choice = OpenReload;
4628 bool LightApp_Application::openAction( const int choice, const QString& aName )
4635 STD_Application* app = 0;
4636 SUIT_Session* session = SUIT_Session::session();
4637 QList<SUIT_Application*> appList = session->applications();
4638 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4640 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4641 app = ::qobject_cast<STD_Application*>( *it );
4646 app->onCloseDoc( false );
4647 appList = session->applications();
4648 STD_Application* other = 0;
4649 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4650 other = ::qobject_cast<STD_Application*>( *it );
4653 res = other->onOpenDoc( aName );
4658 res = CAM_Application::openAction( choice, aName );
4665 QStringList LightApp_Application::viewManagersTypes() const
4667 QStringList aTypesList;
4668 aTypesList += myUserWmTypes;
4669 #ifndef DISABLE_GLVIEWER
4670 aTypesList<<GLViewer_Viewer::Type();
4672 #ifndef DISABLE_PLOT2DVIEWER
4673 aTypesList<<Plot2d_Viewer::Type();
4675 #ifndef DISABLE_QXGRAPHVIEWER
4676 aTypesList<<QxScene_Viewer::Type();
4678 #ifndef DISABLE_PVVIEWER
4679 aTypesList<<PVViewer_Viewer::Type();
4681 #ifndef DISABLE_PYVIEWER
4682 aTypesList<<PyViewer_Viewer::Type();
4684 #ifndef DISABLE_OCCVIEWER
4685 aTypesList<<OCCViewer_Viewer::Type();
4687 #ifndef DISABLE_VTKVIEWER
4688 #ifndef DISABLE_SALOMEOBJECT
4689 aTypesList<<SVTK_Viewer::Type();
4691 aTypesList<<VTKViewer_Viewer::Type();
4697 * Removes all view managers of known types
4698 * Other view managers are ignored
4700 void LightApp_Application::clearKnownViewManagers()
4702 QStringList aTypesList = viewManagersTypes();
4703 QList<SUIT_ViewManager*> aMgrList;
4704 viewManagers( aMgrList );
4705 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4706 if (aTypesList.contains(aMgr->getType()))
4707 removeViewManager(aMgr);
4712 Copy of current selection
4714 void LightApp_Application::onCopy()
4716 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4722 Paste of current data in clipboard
4724 void LightApp_Application::onPaste()
4726 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4732 Browse (i.e. set focus on) the published objects
4733 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4734 has been accepted by Ok (or Apply & Close) button
4735 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4736 (to select the first published object only)
4737 \return entry of the selected object
4739 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4740 const bool theIsApplyAndClose,
4741 const bool theIsOptimizedBrowsing )
4744 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4746 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4747 switch( aBrowsePolicy )
4751 case BP_ApplyAndClose:
4752 if( !theIsApplyAndClose )
4760 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4764 SUIT_DataBrowser* anOB = objectBrowser();
4768 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4772 QStringListIterator anIter( theEntryList );
4773 if( theIsOptimizedBrowsing )
4775 // go to the last entry
4777 if( anIter.hasPrevious() )
4781 // scroll to each entry in the list
4782 // (in optimized mode - to the last entry only)
4784 LightApp_DataObject* anObject = 0;
4785 while( anIter.hasNext() )
4787 anEntry = anIter.next();
4788 if( !anEntry.isEmpty() )
4790 anObject = aStudy->findObjectByEntry( anEntry );
4793 QModelIndex anIndex = aModel->index( anObject );
4794 anOB->treeView()->scrollTo( anIndex );
4799 // always select the last object
4800 if( anObject && !anEntry.isEmpty() )
4802 QList<SUIT_Selector*> aSelectorList;
4803 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4804 if( !aSelectorList.isEmpty() )
4806 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4808 bool anIsAutoBlock = aSelector->autoBlock();
4810 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4811 aSelector->setAutoBlock( false );
4813 SUIT_DataOwnerPtrList aList;
4814 #ifndef DISABLE_SALOMEOBJECT
4815 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4816 ( anObject->entry().toLatin1().constData(),
4817 anObject->componentDataType().toLatin1().constData(),
4818 anObject->name().toLatin1().constData() );
4819 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4821 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4824 aList.append( owner );
4825 selectionMgr()->setSelected( aList );
4828 // restore auto block flag
4829 aSelector->setAutoBlock( anIsAutoBlock );
4837 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4839 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4840 return study ? study->findObjectByEntry( id ) : 0;
4844 Checks that an object can be renamed.
4845 \param entry entry of the object
4846 \brief Return \c true if object can be renamed
4848 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4853 Rename object by entry.
4854 \param entry entry of the object
4855 \param name new name of the object
4856 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4858 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4862 /*! Process standard messages from desktop */
4863 void LightApp_Application::onDesktopMessage( const QString& message )
4865 const QString sectionSeparator = "/";
4867 if ( message.toLower() == "updateobjectbrowser" ||
4868 message.toLower() == "updateobjbrowser" ) {
4869 // update object browser
4870 updateObjectBrowser();
4872 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4873 QString vtype = message.split( sectionSeparator ).last();
4874 if ( !vtype.isEmpty() )
4875 getViewManager( vtype, true );
4878 QStringList data = message.split( sectionSeparator );
4879 if ( data.count() > 1 ) {
4880 QString msgType = data[0].trimmed();
4881 LightApp_Module* sMod = 0;
4882 CAM_Module* mod = module( msgType );
4884 mod = module( moduleTitle( msgType ) );
4885 if ( mod && mod->inherits( "LightApp_Module" ) )
4886 sMod = (LightApp_Module*)mod;
4888 if ( msgType.toLower() == "preferences" ) {
4889 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4890 // for example "preferences/Study/multi_file_dump/true"
4891 if ( data.count() > 3 ) {
4892 QString section = data[1].trimmed();
4893 QString param = data[2].trimmed();
4894 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4895 resourceMgr()->setValue( section, param, value );
4899 // received message for the module
4900 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4901 sMod->message( msg );
4909 Returns all top level toolbars.
4910 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4912 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4914 QList<QToolBar*> aResult;
4915 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4916 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4917 QToolBar* tb = *tit;
4918 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4919 if ( po != desktop() )
4921 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4928 Internal method to parse toolbars and dockable windows state.
4930 QByteArray LightApp_Application::processState(QByteArray& input,
4931 const bool processWin,
4932 const bool processTb,
4933 const bool isRestoring,
4934 QByteArray defaultState) {
4937 bool hasDefaultState = !defaultState.isEmpty();
4938 bool isDockWinWriten = false;
4940 //Write date from users settings
4942 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4943 int marker, version;
4945 tmpInputData >> marker;
4946 tmpInputData >> version;
4947 tmpInputData >> dockmarker;
4948 tmpInputData >> nbDocWin;
4950 if(processWin && processTb && !isRestoring) {
4952 } else if(!processWin && !processTb ) {
4954 aRes = defaultState;
4956 QDataStream aData(&aRes, QIODevice::WriteOnly);
4957 QList<QToolBar*> aToolBars = findToolBars();
4960 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4961 QToolBar* tb = *tit;
4962 aNames.append(tb->objectName());
4965 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4966 if(toolBarMarkerIndex < 0)
4968 QDataStream anInputData(&input, QIODevice::ReadOnly);
4970 int toolBarMarkerIndexDef;
4971 if(hasDefaultState) {
4972 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4973 if(toolBarMarkerIndexDef < 0)
4976 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4978 QDataStream* aTargetData = 0;
4979 int aTargetIndex = -1;
4981 QByteArray currentArr = desktop()->saveState();
4982 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4983 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4984 if(processWin && useInputData) {
4985 aTargetData = &anInputData;
4986 aTargetIndex = toolBarMarkerIndex;
4988 //Write date from default settings
4989 if(hasDefaultState) {
4990 aTargetData = &anInputDataDef;
4991 aTargetIndex = toolBarMarkerIndexDef;
4993 //If no default state, write current snapshot of the dockable windows
4995 aTargetData = &anInputDataCur;
4996 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4997 aTargetIndex = toolBarMarkerIndexCur;
5002 if(aTargetData && aTargetIndex >= 0 ) {
5003 aTargetData->device()->seek(0);
5004 while( aTargetData->device()->pos() < aTargetIndex ) {
5009 isDockWinWriten = true;
5016 aTargetData = &anInputData;
5017 aTargetIndex = toolBarMarkerIndex;
5019 if(hasDefaultState) {
5020 aTargetData = &anInputDataDef;
5021 aTargetIndex = toolBarMarkerIndexDef;
5025 if(aTargetData && aTargetIndex >= 0) {
5027 if(!isDockWinWriten ) {
5028 //Write version marker
5029 int marker, version;
5030 aTargetData->device()->seek(0);
5031 *aTargetData >> marker;
5032 *aTargetData >> version;
5035 aData << (uchar) QDockWidgetMarker;
5037 int shift = 4*sizeof(int) + sizeof(QSize);
5038 index = aTargetIndex - shift;
5040 index = aTargetIndex;
5043 aTargetData->device()->seek(index);
5044 while(!aTargetData->atEnd()) {
5049 } else { // Not treat toolbars
5050 aData << (uchar) QToolBarMarker;
5051 aData << (int) 0; //Nb toolbars = 0
5058 \brief Emits operationFinished signal.
5059 \param theModuleName the name of the module which perfomed the operation
5060 \param theOperationName the operation name
5061 \param theEntryList the list of the created objects entries
5063 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5064 const QString& theOperationName,
5065 const QStringList& theEntryList )
5067 emit operationFinished( theModuleName, theOperationName, theEntryList );
5071 Update visibility state of given objects
5073 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5074 SUIT_ViewModel* theViewModel )
5076 if ( !theViewModel || theList.isEmpty() ) return;
5078 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5079 if ( !aStudy ) return;
5081 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5083 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5084 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5086 if ( !obj || aStudy->isComponent( obj->entry() ) )
5089 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5090 if ( anObjModule ) {
5091 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5093 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5094 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5095 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5096 anObjState = Qtx::ShownState;
5098 anObjState = Qtx::HiddenState;
5100 aStudy->setVisibilityState( obj->entry(), anObjState );
5107 * Called when window activated
5109 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5111 SUIT_DataBrowser* anOB = objectBrowser();
5114 SUIT_DataObject* rootObj = anOB->root();
5118 DataObjectList listObj = rootObj->children( true );
5120 SUIT_ViewModel* vmod = 0;
5121 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5122 vmod = vman->getViewModel();
5123 updateVisibilityState( listObj, vmod );
5127 Called then view manager removed
5129 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5131 ViewManagerList lst;
5132 viewManagers( lst );
5133 if ( lst.count() == 1) { // in case if closed last view window
5134 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5136 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5141 Check existing document.
5143 bool LightApp_Application::checkExistingDoc()
5146 if( activeStudy() ) {
5147 int answer = SUIT_MessageBox::question( desktop(),
5148 tr( "APPCLOSE_CAPTION" ),
5149 tr( "STUDYCLOSE_DESCRIPTION" ),
5150 tr( "APPCLOSE_SAVE" ),
5151 tr( "APPCLOSE_CLOSE" ),
5152 tr( "APPCLOSE_CANCEL" ), 0 );
5154 if ( activeStudy()->isSaved() ) {
5157 } else if ( onSaveAsDoc() ) {
5158 if( !closeDoc( false ) ) {
5165 else if( answer == 1 ) {
5167 } else if( answer == 2 ) {
5174 #ifndef DISABLE_PYCONSOLE
5176 PyConsole_Interp* LightApp_Application::getPyInterp()
5178 static PyConsole_Interp* myInterp = 0;
5180 myInterp = createPyInterp();
5181 myInterp->initialize();
5186 PyConsole_Interp* LightApp_Application::createPyInterp()
5188 return new PyConsole_Interp();
5191 #endif // DISABLE_PYCONSOLE