1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyEditor.h"
39 #include "PyConsole_Interp.h"
40 #include "PyConsole_Console.h"
43 #include "LightApp_Application.h"
44 #include "LightApp_Module.h"
45 #include "LightApp_DataModel.h"
46 #include "LightApp_DataOwner.h"
47 #include "LightApp_Displayer.h"
48 #include "LightApp_Study.h"
49 #include "LightApp_Preferences.h"
50 #include "LightApp_PreferencesDlg.h"
51 #include "LightApp_ModuleDlg.h"
52 #include "LightApp_AboutDlg.h"
53 #include "LightApp_ModuleAction.h"
54 // temporary commented
55 #include "LightApp_EventFilter.h"
56 #include "LightApp_OBSelector.h"
57 #include "LightApp_SelectionMgr.h"
58 #include "LightApp_DataObject.h"
59 #include "LightApp_WgViewModel.h"
60 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
64 #include <SALOME_Event.h>
66 #ifdef USE_SALOME_STYLE
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
69 #endif // USE_SALOME_STYLE
71 #include <CAM_Module.h>
72 #include <CAM_DataModel.h>
73 #include <CAM_Study.h>
74 #include <STD_TabDesktop.h>
76 #include <SUIT_DataBrowser.h>
77 #include <SUIT_Session.h>
78 #include <SUIT_Study.h>
79 #include <SUIT_FileDlg.h>
80 #include <SUIT_ResourceMgr.h>
81 #include <SUIT_ShortcutMgr.h>
82 #include <SUIT_Tools.h>
83 #include <SUIT_Accel.h>
84 #include <SUIT_MessageBox.h>
85 #include <SUIT_ViewWindow.h>
88 #include <QtxFontEdit.h>
89 #include <QtxToolBar.h>
90 #include <QtxTreeView.h>
91 #include <QtxMRUAction.h>
92 #include <QtxDockAction.h>
93 #include <QtxDockWidget.h>
94 #include <QtxActionToolMgr.h>
95 #include <QtxSearchTool.h>
96 #include <QtxWorkstack.h>
99 #include <LogWindow.h>
101 #ifndef DISABLE_GLVIEWER
102 #include <GLViewer_Viewer.h>
103 #include <GLViewer_ViewManager.h>
104 #include "LightApp_GLSelector.h"
107 #ifndef DISABLE_PLOT2DVIEWER
108 #include <Plot2d_ViewManager.h>
109 #include <Plot2d_ViewModel.h>
110 #include <Plot2d_ViewWindow.h>
111 #include <Plot2d_ViewFrame.h>
112 #include "LightApp_Plot2dSelector.h"
113 #ifndef DISABLE_SALOMEOBJECT
114 #include <SPlot2d_ViewModel.h>
116 #include <Plot2d_ViewModel.h>
120 #ifndef DISABLE_OCCVIEWER
121 #include <OCCViewer_ViewManager.h>
122 #include <OCCViewer_ViewFrame.h>
123 #include <OCCViewer_ViewPort3d.h>
124 #ifndef DISABLE_SALOMEOBJECT
125 #include <SOCC_ViewModel.h>
127 #include <OCCViewer_ViewModel.h>
129 #include "LightApp_OCCSelector.h"
132 #ifndef DISABLE_VTKVIEWER
133 #ifndef DISABLE_SALOMEOBJECT
134 #include <SVTK_ViewModel.h>
135 #include <SVTK_ViewManager.h>
136 #include "LightApp_VTKSelector.h"
138 #include <VTKViewer_ViewModel.h>
139 #include <VTKViewer_ViewManager.h>
141 #include <VTKViewer_ViewModel.h>
144 #ifndef DISABLE_QXGRAPHVIEWER
145 #include <QxScene_ViewManager.h>
146 #include <QxScene_ViewModel.h>
147 #include <QxScene_ViewWindow.h>
150 #ifndef DISABLE_GRAPHICSVIEW
151 #include "GraphicsView_Viewer.h"
152 #include "GraphicsView_ViewManager.h"
153 #include "LightApp_GVSelector.h"
156 #ifndef DISABLE_PVVIEWER
157 #include "PVViewer_ViewManager.h"
158 #include "PVViewer_ViewWindow.h"
159 #include "PVViewer_ViewModel.h"
162 #ifndef DISABLE_PYVIEWER
163 #include <PyViewer_ViewManager.h>
164 #include <PyViewer_ViewModel.h>
165 #include <PyViewer_ViewWindow.h>
169 #define VISIBILITY_COLUMN_WIDTH 25
175 #include <QStringList>
177 #include <QApplication>
179 #include <QStatusBar>
181 #include <QObjectList>
183 #include <QInputDialog>
184 #include <QFontDatabase>
186 #include <QByteArray>
190 #include <QHeaderView>
195 #include <utilities.h>
197 #define FIRST_HELP_ID 1000000
199 #ifndef DISABLE_SALOMEOBJECT
200 #include <SALOME_InteractiveObject.hxx>
201 #include <SALOME_ListIO.hxx>
204 #include <Standard_Version.hxx>
206 #define ToolBarMarker 0
207 #define DockWidgetMarker 1
209 static const char* imageEmptyIcon[] = {
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "....................",
231 "...................."};
233 // Markers used to parse array with dockable windows and toolbars state.
234 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
235 // in the Qt source code.
237 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
238 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
240 // Format of the Byte array with the windows and toolbar state is:
241 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
243 //Find toolbar marker position in the array in the following way:
244 //since the 'toolbar marker' is not unique, find index of first occurrence of the
245 //'toolbar marker' in the array and check that next string is name of the toolbar
249 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
250 int aResult = -1,tmp = 0;
251 int inputLen = input.length();
252 QDataStream anInputData( &input, QIODevice::ReadOnly );
253 while ( tmp < inputLen ) {
254 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
257 anInputData.device()->seek( tmp );
261 anInputData >> lines;
263 if ( lines == 0 && anInputData.atEnd() ) {
264 //Case then array doesn't contain information about toolbars,
275 if ( aFlags.contains( str ) ) {
283 QString langToName( const QString& lang )
285 // special processing for English language to avoid such result as "American English"
286 // as Qt cannot just say "English"
291 result = QLocale( lang ).nativeLanguageName();
296 /*!Create new instance of LightApp_Application.*/
297 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
299 return new LightApp_Application();
302 /*! \var global preferences of LightApp */
303 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
307 \class LightApp_Application
308 Application containing LightApp module
312 LightApp_Application::LightApp_Application()
313 : CAM_Application( false ),
315 myScreenHelper(new LightApp_FullScreenHelper())
317 Q_INIT_RESOURCE( LightApp );
319 STD_TabDesktop* desk = new STD_TabDesktop();
320 desk->setFullScreenAllowed(false);
321 desk->setMinimizeAllowed(false);
325 // initialize auto save timer
326 myAutoSaveTimer = new QTimer( this );
327 myAutoSaveTimer->setSingleShot( true );
328 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
330 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
332 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
333 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
335 desktop()->setWindowIcon( aLogo );
336 desktop()->setDockableMenuBar( false );
337 desktop()->setDockableStatusBar( false );
339 // base logo (salome itself)
340 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
341 // extra logo (salome-based application)
342 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
346 mySelMgr = new LightApp_SelectionMgr( this );
348 myAccel = SUIT_Accel::getAccel();
350 #ifndef DISABLE_OCCVIEWER
351 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
352 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
353 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
354 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
355 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
356 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
357 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
358 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
359 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
360 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
364 #ifndef DISABLE_VTKVIEWER
365 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
373 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
374 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
378 #ifndef DISABLE_PLOT2DVIEWER
379 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
386 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
389 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
390 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
391 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
392 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
393 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
396 // Set existing font for the python console in resources
397 if( !aResMgr->hasValue( "PyConsole", "font" ) )
400 QFont f = aResMgr->fontValue( "PyConsole", "font" );
402 QStringList famdb = fdb.families();
404 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
407 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
409 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
412 if ( famdb.contains(aFamily) )
414 f.setFamily( aFamily );
415 aResMgr->setValue( "PyConsole", "font", f );
422 *\li Save window geometry.
423 *\li Save desktop geometry.
424 *\li Save resource maneger.
425 *\li Delete selection manager.
427 LightApp_Application::~LightApp_Application()
431 delete myScreenHelper;
434 /*!Start application.*/
435 void LightApp_Application::start()
437 CAM_Application::start();
440 updateViewManagers();
441 updateCommandsStatus();
444 desktop()->statusBar()->showMessage( "" );
446 LightApp_EventFilter::Init();
451 /*!Closeapplication.*/
452 void LightApp_Application::closeApplication()
454 #ifndef DISABLE_QTXWEBBROWSER
455 QProcess::startDetached( "HelpBrowser",
456 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
458 CAM_Application::closeApplication();
461 /*!Gets application name.*/
462 QString LightApp_Application::applicationName() const
464 static QString _app_name;
465 if ( _app_name.isEmpty() )
466 _app_name = tr( "APP_NAME" );
470 /*!Gets application version.*/
471 QString LightApp_Application::applicationVersion() const
473 static QString _app_version;
475 if ( _app_version.isEmpty() )
477 QString resVersion = tr( "APP_VERSION" );
478 if ( resVersion != "APP_VERSION" )
480 _app_version = resVersion;
484 _app_version = GUI_VERSION_STR;
490 /*!Load module by \a name.*/
491 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
493 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
496 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
497 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
498 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
503 /*!Activate module by \a modName*/
504 bool LightApp_Application::activateModule( const QString& modName )
507 CAM_Module* prevMod = activeModule();
510 actName = prevMod->moduleName();
512 if ( actName == modName )
515 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
517 saveDockWindowsState();
519 bool status = CAM_Application::activateModule( modName );
521 updateModuleActions();
529 updateViewManagers();
531 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
532 if ( objectBrowser()->root() != activeStudy()->root() )
533 objectBrowser()->setRoot( activeStudy()->root() );
534 updateObjectBrowser( true );
537 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
542 /*!Gets selection manager.*/
543 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
548 /*!Creat action "New window" for certain type of viewer:*/
549 void LightApp_Application::createActionForViewer( const int id,
551 const QString& suffix,
554 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
555 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
556 QAction* a = createAction( id, // menu action id
563 false, // toggle flag
565 SLOT( onNewWindow() ) ); // slot
566 createMenu( a, parentId, -1 );
571 void LightApp_Application::createActions()
573 CAM_Application::createActions();
575 SUIT_Desktop* desk = desktop();
576 SUIT_ResourceMgr* resMgr = resourceMgr();
579 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
580 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
581 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
585 // - Help for modules
587 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
588 createMenu( separator(), helpMenu, -1, 10 );
589 QStringList aModuleList;
590 modules( aModuleList, false );
591 aModuleList.prepend( "GUI" );
592 aModuleList.prepend( "KERNEL" );
594 int id = LightApp_Application::UserID + FIRST_HELP_ID;
597 foreach( aModule, aModuleList ) {
598 if ( aModule.isEmpty() ) // module title (user name)
600 IMap <QString, QString> helpData; // list of help files for the module
601 QString helpSubMenu; // help submenu name (empty if not needed)
602 QString modName = moduleName( aModule ); // module name
603 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
604 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
605 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
607 if (resMgr->hasValue( modName, "documentation" ) )
608 docSection = resMgr->stringValue(modName, "documentation");
609 else if ( resMgr->hasSection( modName + "_documentation" ) )
610 docSection = modName + "_documentation";
611 if ( !docSection.isEmpty() ) {
612 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
613 QStringList listOfParam = resMgr->parameters( docSection );
614 foreach( QString paramName, listOfParam ) {
615 QString valueStr = resMgr->stringValue( docSection, paramName );
616 if ( !valueStr.isEmpty() ) {
617 QFileInfo fi( valueStr );
618 if ( fi.isRelative() && !modDir.isEmpty() )
619 valueStr = Qtx::addSlash( modDir ) + valueStr;
620 if ( QFile::exists( valueStr ) )
621 helpData.insert( paramName.arg( aModule ), valueStr );
626 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
627 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
628 QString indexFile = idxLst.join( QDir::separator() ); // index file
629 if ( QFile::exists( indexFile ) )
630 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
633 IMapConstIterator<QString, QString > fileIt;
634 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
635 QString helpFileName = fileIt.key();
636 // remove all '//' occurances
637 while ( helpFileName.contains( "//" ) )
638 helpFileName.replace( "//", "" );
639 // obtain submenus hierarchy if given
640 QStringList smenus = helpFileName.split( "/" );
641 helpFileName = smenus.last();
643 QAction* a = createAction( id, helpFileName,
644 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
645 helpFileName, helpFileName,
646 0, desk, false, this, SLOT( onHelpContentsModule() ) );
647 a->setData( fileIt.value() );
648 if ( !helpSubMenu.isEmpty() ) {
649 smenus.prepend( helpSubMenu );
651 // create sub-menus hierarchy
652 int menuId = helpMenu;
653 foreach ( QString subMenu, smenus ) {
654 menuId = createMenu( subMenu, menuId, -1, 0 );
656 createMenu( a, menuId, -1, 0 );
661 // - Additional help items
663 createMenu( separator(), helpMenu, -1, 5 );
665 QStringList addHelpItems = resMgr->parameters( "add_help" );
666 foreach ( QString addHelpItem, addHelpItems ) {
667 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
668 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
669 QAction* a = createAction( id, addHelpItem,
670 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
671 addHelpItem, addHelpItem,
672 0, desk, false, this, SLOT( onHelpContentsModule() ) );
673 a->setData( valueStr );
674 createMenu( a, helpMenu, -1, 5 );
680 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
681 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
682 registerAction( MRUId, mru );
684 // default icon for neutral point ('SALOME' module)
685 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
686 if ( defIcon.isNull() )
687 defIcon = QPixmap( imageEmptyIcon );
689 //! default icon for any module
690 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
691 if ( modIcon.isNull() )
692 modIcon = QPixmap( imageEmptyIcon );
695 modules( modList, false );
697 if ( modList.count() > 1 )
699 LightApp_ModuleAction* moduleAction =
700 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
702 QMap<QString, QString> iconMap;
703 moduleIconNames( iconMap );
705 const int iconSize = 20;
707 QStringList::Iterator it;
708 for ( it = modList.begin(); it != modList.end(); ++it )
710 if ( !isLibExists( *it ) )
713 QString modName = moduleName( *it );
715 if ( !isModuleAccessible( *it ) )
719 if ( iconMap.contains( *it ) )
720 iconName = iconMap[*it];
722 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
726 INFOS ( "\n****************************************************************" << std::endl
727 << "* Icon for " << (*it).toLatin1().constData()
728 << " not found. Using the default one." << std::endl
729 << "****************************************************************" << std::endl );
732 icon = Qtx::scaleIcon( icon, iconSize );
734 moduleAction->insertModule( *it, icon );
737 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
738 this, SLOT( onModuleActivation( const QString& ) ) );
739 registerAction( ModulesListId, moduleAction );
743 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
744 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
746 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
747 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
748 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
749 0, desk, false, this, SLOT( onCloseAllWindow() ) );
750 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
751 0, desk, false, this, SLOT( onGroupAllWindow() ) );
753 createMenu( CloseId, windowMenu, 0, -1 );
754 createMenu( CloseAllId, windowMenu, 0, -1 );
755 createMenu( GroupAllId, windowMenu, 0, -1 );
756 createMenu( separator(), windowMenu, -1, 0 );
758 #ifndef DISABLE_GLVIEWER
759 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
761 #ifndef DISABLE_PLOT2DVIEWER
762 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
764 #ifndef DISABLE_OCCVIEWER
765 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
767 #ifndef DISABLE_VTKVIEWER
768 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
770 #ifndef DISABLE_QXGRAPHVIEWER
771 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
773 #ifndef DISABLE_GRAPHICSVIEW
774 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
776 #ifndef DISABLE_PVVIEWER
777 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
779 #ifndef DISABLE_PYVIEWER
780 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
783 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
784 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
785 createMenu( RenameId, windowMenu, -1 );
787 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
788 createMenu( PreferencesId, fileMenu, 50, -1 );
789 createMenu( separator(), fileMenu, -1, 50, -1 );
791 createMenu( separator(), fileMenu, -1, 100, -1 );
792 createMenu( MRUId, fileMenu, 100, -1 );
793 createMenu( separator(), fileMenu, -1, 100, -1 );
795 #ifdef USE_SALOME_STYLE
796 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
797 0, desk, false, this, SLOT( onStylePreferences() ) );
798 #endif // USE_SALOME_STYLE
800 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
801 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
804 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
805 createMenu( separator(), viewMenu, -1, 20, -1 );
806 #ifdef USE_SALOME_STYLE
807 createMenu( StyleId, viewMenu, 20, -1 );
808 #endif // USE_SALOME_STYLE
809 createMenu( FullScreenId, viewMenu, 20, -1 );
811 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
812 QString( "SalomeModules" ) ); // name (language-independant)
813 createTool( ModulesListId, modTBar );
816 /*!On module activation action.*/
817 void LightApp_Application::onModuleActivation( const QString& modName )
819 // Force user to create/open a study before module activation
820 QMap<QString, QString> iconMap;
821 moduleIconNames( iconMap );
822 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
824 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
826 bool cancelled = false;
828 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
829 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
830 QMap<int, QString> opmap = activateModuleActions();
831 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
832 aDlg.addButton( it.value(), it.key() );
834 int res = aDlg.exec();
836 // some operation is selected
837 moduleActionSelected( res );
841 putInfo( tr("INF_CANCELLED") );
843 LightApp_ModuleAction* moduleAction =
844 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
846 moduleAction->setActiveModule( QString() );
852 activateModule( modName );
855 /*!Default module activation.*/
856 QString LightApp_Application::defaultModule() const
858 QStringList aModuleNames;
859 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
860 //! If there's the one and only module --> activate it automatically
861 //! TODO: Possible improvement - default module can be taken from preferences
862 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
865 /*!On new window slot.*/
866 void LightApp_Application::onNewWindow()
868 const QObject* obj = sender();
869 if ( !obj || !obj->inherits( "QAction" ) )
873 int id = actionId( (QAction*)obj );
876 #ifndef DISABLE_GLVIEWER
878 type = GLViewer_Viewer::Type();
881 #ifndef DISABLE_PLOT2DVIEWER
883 type = Plot2d_Viewer::Type();
886 #ifndef DISABLE_OCCVIEWER
888 type = OCCViewer_Viewer::Type();
891 #ifndef DISABLE_VTKVIEWER
893 type = VTKViewer_Viewer::Type();
896 #ifndef DISABLE_QXGRAPHVIEWER
897 case NewQxSceneViewId:
898 type = QxScene_Viewer::Type();
901 #ifndef DISABLE_GRAPHICSVIEW
902 case NewGraphicsViewId:
903 type = GraphicsView_Viewer::Type();
906 #ifndef DISABLE_PVVIEWER
908 type = PVViewer_Viewer::Type();
911 #ifndef DISABLE_PYVIEWER
913 type = PyViewer_Viewer::Type();
918 if ( !type.isEmpty() )
919 createViewManager( type );
923 SLOT: Creates new document
925 void LightApp_Application::onNewDoc()
927 if ( !checkExistingDoc() )
930 //asl: fix for 0020515
931 saveDockWindowsState();
933 CAM_Application::onNewDoc();
937 SLOT: Opens new document
939 void LightApp_Application::onOpenDoc()
941 SUIT_Study* study = activeStudy();
943 if ( !checkExistingDoc() )
946 CAM_Application::onOpenDoc();
948 if ( !study ) // new study will be create in THIS application
951 updateViewManagers();
956 SLOT: Opens new document.
957 \param aName - name of file
959 bool LightApp_Application::onOpenDoc( const QString& aName )
961 if ( !checkExistingDoc() )
964 saveDockWindowsState();
966 // We should take mru action first because this application instance can be deleted later.
967 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
969 bool res = CAM_Application::onOpenDoc( aName );
974 mru->insert( aName );
976 mru->remove( aName );
982 SLOT: Displays "About" message box
984 void LightApp_Application::onHelpAbout()
986 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
991 Private SLOT: Called on selection is changed
992 Dispatchs active module that selection is changed
994 void LightApp_Application::onSelection()
996 //MESSAGE("onSelection")
997 onSelectionChanged();
999 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1000 ((LightApp_Module*)activeModule())->selectionChanged();
1005 \param study - SUIT_Study.
1007 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1009 CAM_Application::setActiveStudy( study );
1013 Enables/Disables menu items and toolbar buttons. Rebuild menu
1015 void LightApp_Application::updateCommandsStatus()
1017 CAM_Application::updateCommandsStatus();
1020 #ifndef DISABLE_GLVIEWER
1021 a = action( NewGLViewId );
1023 a->setEnabled( activeStudy() );
1026 #ifndef DISABLE_PLOT2DVIEWER
1027 a = action( NewPlot2dId );
1029 a->setEnabled( activeStudy() );
1032 #ifndef DISABLE_OCCVIEWER
1033 a = action( NewOCCViewId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_VTKVIEWER
1039 a = action( NewVTKViewId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_QXGRAPHVIEWER
1045 a = action( NewQxSceneViewId );
1047 a->setEnabled( activeStudy() );
1050 #ifndef DISABLE_GRAPHICSVIEW
1051 a = action( NewGraphicsViewId );
1053 a->setEnabled( activeStudy() );
1056 #ifndef DISABLE_PVVIEWER
1057 a = action( NewPVViewId );
1059 a->setEnabled( activeStudy() );
1062 #ifndef DISABLE_PYVIEWER
1063 a = action( NewPyViewerId );
1065 a->setEnabled( activeStudy() );
1071 Runs system command in separate thread
1073 class RunBrowser: public QThread
1076 RunBrowser( LightApp_Application* app,
1077 const QString& theApp,
1078 const QString& theParams,
1079 const QString& theHelpFile,
1080 const QString& theContext = QString() )
1082 myParams( theParams ),
1083 myContext( theContext ),
1087 //For the external browser always specify 'file://' protocol,
1088 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1089 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1094 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1095 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1097 QProcess* proc = new QProcess();
1099 proc->start( aCommand );
1100 if ( !proc->waitForStarted() ) {
1101 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1102 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1103 ce2000->setData( msg );
1104 QApplication::postEvent( myLApp, ce2000 );
1115 LightApp_Application* myLApp;
1119 SLOT: Displays help contents for choosen module
1121 void LightApp_Application::onHelpContentsModule()
1123 const QAction* a = (QAction*) sender();
1124 QString helpFile = a->data().toString();
1125 if ( helpFile.isEmpty() ) return;
1127 SUIT_ResourceMgr* resMgr = resourceMgr();
1130 platform = "winapplication";
1132 platform = "application";
1134 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1136 QString quote("\"");
1137 anApp.prepend( quote );
1138 anApp.append( quote );
1140 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1141 #if DISABLE_QTXWEBBROWSER
1142 bool useExtBrowser = true;
1144 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1147 if( useExtBrowser ) {
1148 if ( !anApp.isEmpty() ) {
1149 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1153 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1154 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1155 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1157 showPreferences( tr( "PREF_APP" ) );
1161 QStringList parameters;
1162 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1163 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1164 parameters << helpFile;
1165 QProcess::startDetached( "HelpBrowser", parameters );
1170 SLOT: Displays help contents for choosen dialog
1172 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1173 const QString& theFileName,
1174 const QString& theContext )
1176 QString fileName = theFileName;
1177 QString context = theContext;
1178 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1179 // context might be passed within theFileName argument
1180 QStringList comps = fileName.split("#");
1181 if ( comps.count() > 1 ) {
1182 context = comps.last();
1184 fileName = comps.join("#");
1188 QString homeDir = "";
1189 if ( !theComponentName.isEmpty() ) {
1190 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1191 if ( !dir.isEmpty() )
1192 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1193 Qtx::addSlash( "share" ) +
1194 Qtx::addSlash( "doc" ) +
1195 Qtx::addSlash( "salome" ) +
1196 Qtx::addSlash( "gui" ) +
1197 Qtx::addSlash( theComponentName ) );
1200 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1201 SUIT_ResourceMgr* resMgr = resourceMgr();
1204 platform = "winapplication";
1206 platform = "application";
1208 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1210 QString quote("\"");
1211 anApp.prepend( quote );
1212 anApp.append( quote );
1215 #if DISABLE_QTXWEBBROWSER
1216 bool useExtBrowser = true;
1218 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1222 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1224 if ( !anApp.isEmpty() ) {
1225 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1229 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1230 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1231 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1232 showPreferences( tr( "PREF_APP" ) );
1236 QStringList parameters;
1237 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1238 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1239 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1240 QProcess::startDetached( "HelpBrowser", parameters );
1245 Sets enable or disable some actions on selection changed.
1247 void LightApp_Application::onSelectionChanged()
1249 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1250 bool canCopy = m ? m->canCopy() : false;
1251 bool canPaste = m ? m->canPaste() : false;
1253 action( EditCopyId )->setEnabled(canCopy);
1254 action( EditPasteId )->setEnabled(canPaste);
1258 SLOT: Performs some actions when dockable windows are triggered
1260 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1264 QWidget* LightApp_Application::dockWindow( const int id ) const
1267 if ( myWin.contains( id ) )
1272 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1277 QDockWidget* dock = 0;
1278 QWidget* w = wid->parentWidget();
1279 while ( w && !dock )
1281 dock = ::qobject_cast<QDockWidget*>( w );
1282 w = w->parentWidget();
1287 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1292 if ( wid != dockWindow( id ) )
1293 removeDockWindow( id );
1295 myWin.insert( id, wid );
1297 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1298 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1300 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1301 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1302 QString( "%1Dock" ).arg( wid->objectName() ) );
1303 dock->setWidget( wid );
1304 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1305 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1306 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1308 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1309 if ( !accel.isEmpty() )
1310 dock->toggleViewAction()->setShortcut( accel );
1315 void LightApp_Application::removeDockWindow( const int id )
1317 QWidget* wid = dockWindow( id );
1323 QDockWidget* dock = windowDock( wid );
1327 dock->setWidget( 0 );
1328 wid->setParent( 0 );
1329 wid->setVisible( false );
1333 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1335 QDockWidget* dock = windowDock( dockWindow( id ) );
1336 if ( dock && desktop() ) {
1337 desktop()->addDockWidget( place, dock );
1338 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1339 if ( a ) a->update();
1345 \param flag - key for window
1346 Flag used how identificator of window in windows list.
1348 QWidget* LightApp_Application::getWindow( const int flag)
1350 QWidget* wid = dockWindow( flag );
1352 insertDockWindow( flag, wid = createWindow( flag ) );
1354 QMap<int, int> winMap;
1355 currentWindows( winMap );
1356 if ( winMap.contains( flag ) )
1357 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1363 \return Object Browser
1365 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1367 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1373 LogWindow* LightApp_Application::logWindow()
1375 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1378 #ifndef DISABLE_PYCONSOLE
1380 This returns the python console integrated to the GUI. Depending
1381 when you request the python console, this function could return
1382 null. Then the optional parameter force (default to false) can be
1383 set to force the creation of the python console if it is not done
1385 \param force - if true, the pythonConsole is created if it does not exist yet
1386 \return Python Console
1388 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1390 QWidget* wid = dockWindow( WT_PyConsole );
1391 if ( !wid && force==true) {
1392 wid = getWindow(WT_PyConsole);
1394 return qobject_cast<PyConsole_Console*>( wid );
1399 Updates object browser and maybe data models
1400 \param updateModels - if it is true, then data models are updated
1402 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1404 // update existing data models
1407 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1408 if ( objectBrowser() )
1409 objectBrowser()->setAutoUpdate( false );
1411 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1413 CAM_Study::ModelList dm_list;
1414 study->dataModels( dm_list );
1415 QListIterator<CAM_DataModel*> it( dm_list );
1416 while ( it.hasNext() ) {
1417 CAM_DataModel* camDM = it.next();
1418 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1419 ((LightApp_DataModel*)camDM)->update();
1423 if( objectBrowser() )
1424 objectBrowser()->setAutoUpdate( isAutoUpdate );
1427 if ( objectBrowser() ) {
1428 objectBrowser()->updateGeometry();
1429 objectBrowser()->updateTree( 0, false );
1436 LightApp_Preferences* LightApp_Application::preferences() const
1438 return preferences( false );
1442 \return first view manager of some type
1443 \param vmType - type of view manager
1444 \param create - is it necessary to create view manager in case, when there is no manager of such type
1446 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1448 SUIT_ViewManager* aVM = viewManager( vmType );
1449 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1450 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1451 if ( anActiveVM && anActiveVM->getType() == vmType )
1453 MESSAGE("aVM = anActiveVM");
1457 if ( aVM && !aVM->getDetached() && create )
1459 if ( !aVM->getActiveView() )
1461 MESSAGE("aVM->createView()");
1466 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1467 desktop()->setActiveWindow( aVM->getActiveView() );
1472 MESSAGE("aVM = createViewManager( vmType )");
1473 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, bool detached )
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 viewMgr->setDetached(detached);
1642 addViewManager( viewMgr );
1643 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1645 if ( viewWin && desktop() ) {
1646 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1647 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1653 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1655 SUIT_ResourceMgr* resMgr = resourceMgr();
1657 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1659 new LightApp_WgViewModel( vmType, w ) );
1660 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1662 addViewManager( vm );
1663 SUIT_ViewWindow* vw = vm->createViewWindow();
1664 if ( vw && desktop() ) {
1665 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1666 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1669 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1670 myUserWmTypes << vmType;
1675 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1677 SUIT_ResourceMgr* resMgr = resourceMgr();
1679 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1683 QString vmType = vm->getType();
1685 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1687 addViewManager( vm );
1688 SUIT_ViewWindow* vw = vm->createViewWindow();
1689 if ( vw && desktop() ) {
1690 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1691 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1694 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1695 myUserWmTypes << vmType;
1701 SLOT: Removes view manager from application
1703 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1705 removeViewManager( theVM );
1709 Protected SLOT: On study created.
1710 \param theStudy - just created study
1712 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1714 SUIT_DataObject* aRoot = 0;
1715 if ( theStudy && theStudy->root() )
1717 aRoot = theStudy->root();
1718 //aRoot->setName( tr( "DATA_MODELS" ) );
1721 getWindow( WT_ObjectBrowser );
1723 loadDockWindowsState();
1725 if ( objectBrowser() )
1726 objectBrowser()->setRoot( aRoot );
1728 activateModule( defaultModule() );
1730 if ( objectBrowser() )
1731 objectBrowser()->openLevels();
1733 #ifndef DISABLE_PYCONSOLE
1734 if( pythonConsole() )
1735 getPyInterp()->initStudy();
1740 Protected SLOT: On study opened.
1741 \param theStudy - just opened study
1743 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1745 SUIT_DataObject* aRoot = 0;
1746 if ( theStudy && theStudy->root() )
1748 aRoot = theStudy->root();
1752 getWindow( WT_ObjectBrowser );
1754 loadDockWindowsState();
1756 if ( objectBrowser() )
1757 objectBrowser()->setRoot( aRoot );
1759 activateModule( defaultModule() );
1761 if ( objectBrowser() )
1762 objectBrowser()->openLevels();
1764 #ifndef DISABLE_PYCONSOLE
1765 if( pythonConsole() )
1766 getPyInterp()->initStudy();
1772 /*!Protected SLOT. On study saved.*/
1773 void LightApp_Application::onStudySaved( SUIT_Study* s )
1775 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1777 mru->insert( s->studyName() );
1782 /*!Protected SLOT. On study closed.*/
1783 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1786 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1787 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1790 // stop auto-save timer
1791 myAutoSaveTimer->stop();
1793 // Bug 10396: clear selection
1794 mySelMgr->clearSelected();
1796 // Bug 12944: emit signal only after clear selection
1799 activateModule( "" );
1802 /*!Protected SLOT.On desktop activated.*/
1803 void LightApp_Application::onDesktopActivated()
1805 CAM_Application::onDesktopActivated();
1806 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1808 aModule->studyActivated();
1811 void LightApp_Application::studyOpened( SUIT_Study* s )
1813 CAM_Application::studyOpened( s );
1816 updateViewManagers();
1819 void LightApp_Application::studySaved( SUIT_Study* s )
1821 CAM_Application::studyOpened( s );
1822 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1823 if ( aResMgr && activeStudy() ) {
1824 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1825 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1829 void LightApp_Application::studyCreated( SUIT_Study* s )
1831 CAM_Application::studyCreated( s );
1834 updateViewManagers();
1837 /*!Gets file filter.
1838 *\retval QString "(*.hdf)"
1840 QString LightApp_Application::getFileFilter( bool /*open*/) const
1846 Shows file dialog and return user selected file name
1848 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1849 const QString& caption, QWidget* parent )
1853 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1854 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1857 /*! Gets directory*/
1858 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1862 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1865 /*! Get open file names*/
1866 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1867 const QString& caption, QWidget* parent )
1871 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1872 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1875 /*!Private SLOT. Update object browser.*/
1876 void LightApp_Application::onRefresh()
1878 updateObjectBrowser( true );
1881 /*!Private SLOT. Update actions after rename object.*/
1882 void LightApp_Application::onRenamed()
1884 activeStudy()->Modified();
1888 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1889 // To prevent reversion the window should be either aligned during movement and resize.
1890 /*!Private SLOT. Update actions after rename object.*/
1891 /*void LightApp_Application::onMoved()
1893 OCCViewer_ViewManager* viewMgr = 0;
1894 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1896 OCCViewer_ViewWindow* view = 0;
1897 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1899 view->getViewPort()->repaintViewAfterMove();
1904 /*!Private SLOT. Support drag-and-drop operation.*/
1905 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1907 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1911 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1913 aModule->dropObjects( objects, parentObj, row, action );
1916 /*!Private SLOT. On preferences.*/
1917 void LightApp_Application::onPreferences()
1919 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1922 /*!Private SLOT. On preferences.*/
1923 void LightApp_Application::showPreferences( const QString& itemText )
1925 QApplication::setOverrideCursor( Qt::WaitCursor );
1927 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1929 QApplication::restoreOverrideCursor();
1934 preferences()->activateItem( itemText );
1936 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1939 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1940 resourceMgr()->save();
1943 shortcutMgr()->updateShortcuts();
1949 /*!Protected SLOT. On preferences changed.*/
1950 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1952 LightApp_Module* sMod = 0;
1953 CAM_Module* mod = module( modName );
1954 if ( mod && mod->inherits( "LightApp_Module" ) )
1955 sMod = (LightApp_Module*)mod;
1958 sMod->preferencesChanged( section, param );
1960 preferencesChanged( section, param );
1961 // emit signal to allow additional preferences changing processing
1962 emit preferenceChanged( modName, section, param );
1965 /*!Remove all windows from study.*/
1966 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1968 saveDockWindowsState();
1970 if ( SUIT_DataBrowser* ob = objectBrowser() )
1973 CAM_Application::beforeCloseDoc( s );
1976 /*!Update actions.*/
1977 void LightApp_Application::updateActions()
1979 updateCommandsStatus();
1985 SUIT_Study* LightApp_Application::createNewStudy()
1987 LightApp_Study* aStudy = new LightApp_Study( this );
1989 // Set up processing of major study-related events
1990 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1991 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1992 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1993 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
1999 Creates window by flag.
2000 \param flag - identificator of window type
2002 QWidget* LightApp_Application::createWindow( const int flag )
2006 SUIT_ResourceMgr* resMgr = resourceMgr();
2008 if ( flag == WT_ObjectBrowser )
2010 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2011 ob->setObjectName( "objectBrowser" );
2012 ob->setSortMenuEnabled( true );
2013 ob->setAutoUpdate( true );
2014 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2015 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2017 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2018 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2019 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2021 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2022 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2023 treeModel->setSearcher( this );
2024 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2025 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2027 // Mantis issue 0020136: Drag&Drop in OB
2028 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2030 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2031 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2032 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2033 this, SLOT( onRenamed( ) ) );
2037 // temporary commented
2039 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2041 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2044 // Create OBSelector
2045 new LightApp_OBSelector( ob, mySelMgr );
2046 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2047 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2049 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2051 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2052 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2053 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2055 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2057 #ifndef DISABLE_PYCONSOLE
2058 else if ( flag == WT_PyConsole )
2060 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2061 pyCons->setObjectName( "pythonConsole" );
2062 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2063 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2064 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2065 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2066 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2070 else if ( flag == WT_LogWindow )
2072 LogWindow* logWin = new LogWindow( desktop() );
2073 logWin->setObjectName( "logWindow" );
2074 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2075 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2077 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2083 \return default windows( Object Browser, Python Console )
2084 Adds to map \a aMap.
2086 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2088 #ifndef DISABLE_PYCONSOLE
2089 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2091 if ( activeStudy() ) {
2092 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2093 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2097 /*!Default view managers*/
2098 void LightApp_Application::defaultViewManagers( QStringList& ) const
2104 \return preferences.
2105 Create preferences, if \a crt = true.
2107 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2112 LightApp_Application* that = (LightApp_Application*)this;
2114 bool toCreate = !_prefs_ && crt;
2117 _prefs_ = new LightApp_Preferences( resourceMgr() );
2118 that->createPreferences( _prefs_ );
2121 that->myPrefs = _prefs_;
2123 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2124 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2125 connect( myPrefs, SIGNAL( resetToDefaults() ),
2126 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2131 SUIT_ResourceMgr* resMgr = resourceMgr();
2133 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2134 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2136 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2140 QStringList modNameList;
2141 app->modules( modNameList, false );
2143 QMap<QString, QString> iconMap;
2144 app->moduleIconNames( iconMap );
2146 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2148 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2151 int modId = _prefs_->addPreference( *it );
2152 if ( iconMap.contains( *it ) )
2153 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2157 app->modules( modList );
2158 QListIterator<CAM_Module*> itr( modList );
2159 while ( itr.hasNext() )
2161 LightApp_Module* mod = 0;
2163 CAM_Module* anItem = itr.next();
2164 if ( anItem->inherits( "LightApp_Module" ) )
2165 mod = (LightApp_Module*)anItem;
2167 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2169 _prefs_->addPreference( mod->moduleName() );
2170 mod->createPreferences();
2171 that->emptyPreferences( mod->moduleName() );
2175 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2181 Adds new module to application
2183 void LightApp_Application::moduleAdded( CAM_Module* mod )
2185 CAM_Application::moduleAdded( mod );
2187 LightApp_Module* lightMod = 0;
2188 if ( mod && mod->inherits( "LightApp_Module" ) )
2189 lightMod = (LightApp_Module*)mod;
2191 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2193 myPrefs->addPreference( mod->moduleName() );
2194 lightMod->createPreferences();
2195 emptyPreferences( mod->moduleName() );
2199 void LightApp_Application::emptyPreferences( const QString& modName )
2201 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2202 if ( !item || !item->isEmpty() )
2205 // printf( "---------------------> Modify for empty module.\n" );
2207 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2208 frm->setIcon( item->icon() );
2209 frm->setStretch( false );
2210 item->parentItem()->insertItem( frm, item );
2211 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2218 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2223 QStringList aValuesList;
2224 QList<QVariant> anIndicesList;
2228 // . Top-level "SALOME" preferences group <<start>>
2229 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2230 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2232 // .. "General" preferences tab <<start>>
2233 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2235 // ... "Language" group <<start>>
2236 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2237 pref->setItemProperty( "columns", 2, langGroup );
2238 // .... -> application language
2239 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2240 LightApp_Preferences::Selector, "language", "language" );
2241 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2242 QList<QVariant> aIcons;
2243 QList<QVariant> aNumbers;
2244 QStringList aTitles;
2245 foreach ( QString aLang, aLangs ) {
2246 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2248 aTitles << langToName( aLang );
2250 pref->setItemProperty( "strings", aTitles, curLang );
2251 pref->setItemProperty( "ids", aNumbers, curLang );
2252 pref->setItemProperty( "icons", aIcons, curLang );
2253 pref->setItemProperty( "restart", true, curLang );
2255 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2256 LightApp_Preferences::Bool, "language", "locale" );
2257 pref->setItemProperty( "restart", true, curLocale );
2258 // ... "Language" group <<end>>
2260 // ... "Look and feel" group <<start>>
2261 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2262 pref->setItemProperty( "columns", 2, lookGroup );
2263 // .... -> show splash-screen
2264 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2265 // .... -> opaque resize
2266 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2267 // .... -> drop-down buttons
2268 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2269 // ... "Look and feel" group <<end>>
2271 // ... "Study properties" group <<start>>
2272 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2273 pref->setItemProperty( "columns", 2, studyGroup );
2274 // .... -> multi-file save
2275 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2276 // .... -> ascii save mode
2277 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2278 // .... -> store windows geometry
2279 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2280 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2281 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2282 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2283 // .... -> auto-save
2284 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2285 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2286 pref->setItemProperty( "min", 0, autoSaveInterval );
2287 pref->setItemProperty( "max", 1440, autoSaveInterval );
2288 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2289 // ... "Study properties" group <<end>>
2291 // ... "Help browser" group <<start>>
2292 #ifndef DISABLE_QTXWEBBROWSER
2293 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2295 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2299 QString platform = "winapplication";
2301 QString platform = "application";
2303 // .... -> browser application
2304 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2305 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2306 // .... -> browser parameters
2307 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2308 // ... "Help browser" group <<end>>
2310 // ... "Python console properties" group <<start>>
2311 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2312 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2314 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2315 // .... -> show banner
2316 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2317 // .... -> auto-completion
2318 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2319 // ... "Python console properties" group <<end>>
2321 // ... "MRU" preferences group <<start>>
2322 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2323 pref->setItemProperty( "columns", 4, mruGroup );
2324 // number of MRU items
2325 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2326 "MRU", "visible_count" );
2327 pref->setItemProperty( "min", 0, mruVisCount );
2328 pref->setItemProperty( "max", 100, mruVisCount );
2330 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2331 "MRU", "link_type" );
2332 aValuesList.clear();
2333 anIndicesList.clear();
2334 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2335 anIndicesList << 0 << 1 << 2 ;
2336 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2337 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2338 // ... "MRU" preferences group <<end>>
2340 // ... "Full-screen" group <<start>>
2341 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2342 pref->setItemProperty( "columns", 2, fullScreenGroup );
2343 // .... -> automatic hiding toolbars
2344 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2345 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2346 // ... "Full-screen" group <<end>>
2348 // .. "General" preferences tab <<end>>
2350 // .. "3D viewer" group <<start>>
2351 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2352 // ... -> navigation mode
2353 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2354 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2355 aValuesList.clear();
2356 anIndicesList.clear();
2357 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2358 anIndicesList << 0 << 1;
2359 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2360 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2361 // ... -> zooming mode
2362 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2363 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2364 aValuesList.clear();
2365 anIndicesList.clear();
2366 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2367 anIndicesList << 0 << 1;
2368 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2369 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2370 // ... "Trihedron" group <<start>>
2371 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2372 pref->setItemProperty( "columns", 2, occTriGroup );
2373 // .... -> trihedron size
2374 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2375 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2376 pref->setItemProperty( "min", 1.0E-06, occTS );
2377 pref->setItemProperty( "max", 1000, occTS );
2378 // .... -> relative size of trihedron
2379 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2380 // .... -> show static trihedron
2381 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2382 // ... "Trihedron" group <<end>>
2383 // .. "3D viewer" group <<end>>
2387 #ifndef DISABLE_OCCVIEWER
2388 // .. "OCC viewer" group <<start>>
2389 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2391 // .... -> Projection mode
2392 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2393 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2394 aValuesList.clear();
2395 anIndicesList.clear();
2396 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2397 anIndicesList << 0 << 1;
2398 pref->setItemProperty( "strings", aValuesList, occProjMode );
2399 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2400 #if OCC_VERSION_LARGE > 0x06090000
2401 // .... -> Stereo group
2402 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2403 pref->setItemProperty( "columns", 2, stereoGroup );
2404 // .... -> Stereo type
2405 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2406 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2407 aValuesList.clear();
2408 anIndicesList.clear();
2410 OCCViewer_Viewer::stereoData( aValuesList, idList);
2411 foreach( int gid, idList ) anIndicesList << gid;
2412 pref->setItemProperty( "strings", aValuesList, stereoType );
2413 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2415 // .... -> Anaglyph filter
2416 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2417 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2418 aValuesList.clear();
2419 anIndicesList.clear();
2420 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2421 anIndicesList << 0 << 1 << 2;
2423 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2424 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2426 // .... -> Convergence distance type
2427 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2428 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2429 aValuesList.clear();
2430 anIndicesList.clear();
2431 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2432 anIndicesList << 0 << 1;
2433 pref->setItemProperty( "strings", aValuesList, occFocusType );
2434 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2436 // .... -> Stereographic focus value
2437 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2438 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2439 pref->setItemProperty( "precision", 3, focusValue );
2440 pref->setItemProperty( "min", 1.0E-03, focusValue );
2441 pref->setItemProperty( "max", 1.0E03, focusValue );
2442 pref->setItemProperty( "step", 0.05, focusValue );
2445 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2446 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2447 aValuesList.clear();
2448 anIndicesList.clear();
2449 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2450 anIndicesList << 0 << 1;
2451 pref->setItemProperty( "strings", aValuesList, occIODType );
2452 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2454 // .... -> Interocular distance (IOD) value
2455 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2456 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2457 pref->setItemProperty( "precision", 3, IODValue );
2458 pref->setItemProperty( "min", 1.0E-03, IODValue );
2459 pref->setItemProperty( "max", 1.0E03, IODValue );
2460 pref->setItemProperty( "step", 0.05, IODValue );
2462 // .... -> Reverse stereo
2463 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2464 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2465 // .... -> Enable V-Sync
2466 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2467 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2468 // .... -> Enable quad-buffer support
2469 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2470 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2472 // ... "Background" group <<start>>
2473 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2474 // pref->setItemProperty( "columns", 2, bgGroup );
2475 aValuesList.clear();
2476 anIndicesList.clear();
2479 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2480 foreach( int gid, idList ) anIndicesList << gid;
2481 // .... -> 3D viewer background
2482 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2483 LightApp_Preferences::Background, "OCCViewer", "background" );
2484 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2485 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2486 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2487 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2488 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2489 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2490 pref->setItemProperty( "custom_enabled", false, bgId );
2491 pref->setItemProperty( "image_formats", formats, bgId );
2492 // .... -> XZ viewer background
2493 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2494 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2495 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2496 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2497 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2498 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2499 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2500 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2501 pref->setItemProperty( "custom_enabled", false, bgId );
2502 pref->setItemProperty( "image_formats", formats, bgId );
2503 // .... -> YZ viewer background
2504 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2505 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2506 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2507 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2508 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2509 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2510 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2511 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2512 pref->setItemProperty( "custom_enabled", false, bgId );
2513 pref->setItemProperty( "image_formats", formats, bgId );
2514 // .... -> XY viewer background
2515 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2516 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2517 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2518 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2519 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2520 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2521 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2522 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2523 pref->setItemProperty( "custom_enabled", false, bgId );
2524 pref->setItemProperty( "image_formats", formats, bgId );
2525 // ... "Background" group <<end>>
2528 // ... "Selection" group <<start>>
2529 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2530 pref->setItemProperty( "columns", 2, occSelectionGroup );
2531 // .... -> enable preselection
2532 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2533 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2534 // .... -> enable selection
2535 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2536 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2537 // ... "Selection" group <<end>>
2539 // ... "Clipping" group <<start>>
2540 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2541 // .... -> clipping color
2542 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2543 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2544 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2545 pref->setItemProperty( "columns", 2, texturePref );
2546 // .... -> use default texture
2547 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2548 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2549 // .... -> clipping texture
2550 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2551 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2552 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2554 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2555 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2556 // .... -> scale factor
2557 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2558 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2559 pref->setItemProperty( "precision", 3, scaleFactor );
2560 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2561 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2562 pref->setItemProperty( "step", 0.1, scaleFactor );
2563 // ... "Clipping" group <<end>>
2565 // ... "Ray tracing" group <<start>>
2566 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2567 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2568 pref->setItemProperty( "columns", 2, rtPref );
2570 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2571 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2572 pref->setItemProperty( "min", 1, rt_depth );
2573 pref->setItemProperty( "max", 10, rt_depth );
2574 pref->setItemProperty( "step", 1, rt_depth );
2575 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2576 // .... -> specular reflections
2577 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2578 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2579 // .... -> adaptive anti-aliasing
2580 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2581 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2582 // .... -> shadows rendering
2583 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2584 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2585 // .... -> transparent shadow
2586 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2587 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2588 // ... "Ray tracing" group <<end>>
2590 // ... "Light source" group <<start>>
2591 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2592 // .... -> light color
2593 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2594 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2595 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2596 pref->setItemProperty( "columns", 3, directionPref );
2597 // .... -> light direction (dx component)
2598 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2599 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2600 pref->setItemProperty( "precision", 2, light_dx );
2601 pref->setItemProperty( "min", -1.0E03, light_dx );
2602 pref->setItemProperty( "max", 1.0E03, light_dx );
2603 pref->setItemProperty( "step", 0.1, light_dx );
2604 // .... -> light direction (dy component)
2605 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2606 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2607 pref->setItemProperty( "precision", 2, light_dy );
2608 pref->setItemProperty( "min", -1.0E03, light_dy );
2609 pref->setItemProperty( "max", 1.0E03, light_dy );
2610 pref->setItemProperty( "step", 0.1, light_dy );
2611 // .... -> light direction (dz component)
2612 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2613 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2614 pref->setItemProperty( "precision", 2, light_dz );
2615 pref->setItemProperty( "min", -1.0E03, light_dz );
2616 pref->setItemProperty( "max", 1.0E03, light_dz );
2617 pref->setItemProperty( "step", 0.1, light_dz );
2618 // ... "Light source" group <<end>>
2620 // ... -> empty frame (for layout) <<start>>
2621 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2622 pref->setItemProperty( "margin", 0, occGen );
2623 pref->setItemProperty( "columns", 2, occGen );
2624 // ... -> empty frame (for layout) <<end>>
2626 // .. "OCC viewer" group <<end>>
2629 #ifndef DISABLE_VTKVIEWER
2630 // .. "VTK viewer" group <<start>>
2631 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2633 // ... -> empty frame (for layout) <<start>>
2634 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2635 //pref->setItemProperty( "columns", 2, vtkGen );
2636 // .... -> projection mode
2637 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2638 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2639 aValuesList.clear();
2640 anIndicesList.clear();
2641 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2642 anIndicesList << 0 << 1;
2643 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2644 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2646 // .... -> Stereo group
2647 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2648 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2649 // .... -> Stereo type
2650 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2651 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2652 aValuesList.clear();
2653 anIndicesList.clear();
2655 SVTK_Viewer::stereoData( aValuesList, idList);
2656 foreach( int gid, idList ) anIndicesList << gid;
2657 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2658 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2659 // .... -> Anaglyph filter
2660 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2661 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2662 aValuesList.clear();
2663 anIndicesList.clear();
2664 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2665 anIndicesList << 0 << 1 << 2;
2667 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2668 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2670 // .... -> Enable quad-buffer support
2671 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2672 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2674 // .... -> background
2675 aValuesList.clear();
2676 anIndicesList.clear();
2679 #ifndef DISABLE_SALOMEOBJECT
2680 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2682 foreach( int gid, idList ) anIndicesList << gid;
2683 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2684 LightApp_Preferences::Background, "VTKViewer", "background" );
2685 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2686 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2687 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2688 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2689 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2690 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2691 pref->setItemProperty( "custom_enabled", false, bgId );
2692 #ifndef DISABLE_SALOMEOBJECT
2693 pref->setItemProperty( "image_formats", formats, bgId );
2695 // .... -> speed increment
2696 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2697 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2698 pref->setItemProperty( "min", 1, vtkSpeed );
2699 pref->setItemProperty( "max", 1000, vtkSpeed );
2700 // .... -> speed mode
2701 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2702 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2703 aValuesList.clear();
2704 anIndicesList.clear();
2705 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2706 anIndicesList << 0 << 1;
2707 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2708 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2710 // ... "Selection" group <<start>>
2711 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2712 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2713 // .... -> preselection
2714 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2715 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2716 aValuesList.clear();
2717 anIndicesList.clear();
2718 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2719 anIndicesList << 0 << 1 << 2;
2720 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2721 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2722 // .... -> enable selection
2723 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2724 // ... "Selection" group <<end>>
2726 // ... -> empty frame (for layout) <<end>>
2728 // ... space mouse sub-group <<start>>
2729 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2730 //pref->setItemProperty( "columns", 2, vtkSM );
2731 // .... -> decrease speed increment
2732 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2733 LightApp_Preferences::Selector, "VTKViewer",
2734 "spacemouse_func1_btn" );
2735 // .... -> increase speed increment
2736 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2737 LightApp_Preferences::Selector, "VTKViewer",
2738 "spacemouse_func2_btn" );
2739 // .... -> dominant / combined switch
2740 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2741 LightApp_Preferences::Selector, "VTKViewer",
2742 "spacemouse_func5_btn" ); //
2743 aValuesList.clear();
2744 anIndicesList.clear();
2745 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2746 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2747 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2748 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2749 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2750 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2751 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2752 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2753 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2754 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2755 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2756 // ... space mouse sub-group <<end>>
2758 // ... avi recording sub-group <<start>>
2759 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2760 pref->setItemProperty( "columns", 2, vtkRec );
2761 // .... -> recording mode
2762 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2763 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2764 aValuesList.clear();
2765 anIndicesList.clear();
2766 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2767 anIndicesList << 0 << 1;
2768 pref->setItemProperty( "strings", aValuesList, modePref );
2769 pref->setItemProperty( "indexes", anIndicesList, modePref );
2771 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2772 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2773 pref->setItemProperty( "min", 0.1, fpsPref );
2774 pref->setItemProperty( "max", 100, fpsPref );
2776 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2777 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2778 pref->setItemProperty( "min", 1, qualityPref );
2779 pref->setItemProperty( "max", 100, qualityPref );
2780 // .... -> progressive mode
2781 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2782 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2783 // ... avi recording sub-group <<end>>
2785 // ... group names sub-group <<start>>
2786 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2787 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2788 pref->setItemProperty( "columns", 2, vtkGN );
2789 // .... -> text color
2790 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2791 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2792 // .... -> transparency
2793 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2794 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2795 pref->setItemProperty( "min", 0.0, transPref );
2796 pref->setItemProperty( "max", 1.0, transPref );
2797 pref->setItemProperty( "step", 0.1, transPref );
2798 // ... -> group names sub-group <<end>>
2799 // .. "VTK viewer" group <<end>>
2802 // .. "Plot2d viewer" group <<start>>
2803 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2804 //pref->setItemProperty( "columns", 2, plot2dGroup );
2806 // ... -> background
2807 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2808 LightApp_Preferences::Color, "Plot2d", "Background" );
2809 // ... -> selection color
2810 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2811 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2813 // ... "Viewer" group <<start>>
2814 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2816 // .... -> curve type
2817 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2818 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2819 aValuesList.clear();
2820 anIndicesList.clear();
2821 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2822 anIndicesList << 0 << 1 << 2 ;
2823 pref->setItemProperty( "strings", aValuesList, curveType );
2824 pref->setItemProperty( "indexes", anIndicesList, curveType );
2825 // .... -> marker size
2826 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2827 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2828 pref->setItemProperty( "min", 0, markerSize );
2829 pref->setItemProperty( "max", 100, markerSize );
2830 // .... -> horizontal scaling mode
2831 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2832 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2833 aValuesList.clear();
2834 anIndicesList.clear();
2835 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2836 anIndicesList << 0 << 1 ;
2837 pref->setItemProperty( "strings", aValuesList, horScale );
2838 pref->setItemProperty( "indexes", anIndicesList, horScale );
2839 // .... -> vertical scaling mode
2840 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2841 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2842 pref->setItemProperty( "strings", aValuesList, verScale );
2843 pref->setItemProperty( "indexes", anIndicesList, verScale );
2845 // .... -> errors/deviation colot
2846 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2847 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2848 // .... -> deviation markers line size
2849 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2850 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2851 pref->setItemProperty( "min", 1, deviationMarkerLw );
2852 pref->setItemProperty( "max", 5, deviationMarkerLw );
2853 // .... -> deviation markers tick mark size
2854 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2855 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2856 pref->setItemProperty( "min", 1, deviationMarkerTs );
2857 pref->setItemProperty( "max", 5, deviationMarkerTs );
2858 // .... "Viewer" group <<end>>
2860 // ... "Legend" group <<start>>
2861 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2863 // .... -> show legend
2864 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2865 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2866 // .... -> legend position
2867 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2868 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2869 aValuesList.clear();
2870 anIndicesList.clear();
2871 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2872 anIndicesList << 0 << 1 << 2 << 3 ;
2873 pref->setItemProperty( "strings", aValuesList, legendPosition );
2874 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2875 // .... -> Symbol type
2876 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2877 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2878 aValuesList.clear();
2879 anIndicesList.clear();
2880 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2881 anIndicesList << 0 << 1 ;
2882 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2883 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2884 // .... -> legend font
2885 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2886 // ... -> font color
2887 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2888 // ... -> selection font color
2889 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2890 // ... "Legend" group <<end>>
2892 // .. "Plot2d viewer" group <<end>>
2894 // .. "PyViewer" preferences tab <<start>>
2895 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2896 // ... "Font settings" group <<start>>
2897 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2898 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2899 LightApp_Preferences::Font, "PyEditor", "Font" );
2900 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2901 // ... "Font settings" group <<end>>
2902 // ... "Display settings" group <<start>>
2903 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2904 pref->setItemProperty( "columns", 2, pyDispGroup );
2905 // ... -> current line highlight
2906 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2907 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2908 // ... -> text wrapping
2909 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2910 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2911 // ... -> center cursor on scroll
2912 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2913 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2914 // ... -> line numbers area
2915 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2916 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2917 // ... "Display settings" group <<end>>
2919 // ... "Editor settings" group <<start>>
2920 int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
2921 // ... -> navigation mode
2922 int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
2923 LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
2924 aValuesList.clear();
2925 anIndicesList.clear();
2926 aValuesList << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
2927 anIndicesList << 0 << 1 << 2 << 3 ;
2928 pref->setItemProperty( "strings", aValuesList, pyCompletion );
2929 pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
2930 // ... "Editor settings" group <<end>>
2932 // ... "Tab settings" group <<start>>
2933 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2934 pref->setItemProperty( "columns", 2, pyTabGroup );
2935 // ... -> tab whitespaces
2936 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2937 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2939 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2940 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2941 // ... "Tab settings" group <<end>>
2942 // ... "Vertical edge settings" group <<start>>
2943 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2944 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2945 // ... -> vertical edge
2946 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2947 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2948 // ... -> number of columns
2949 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2950 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2951 // ... "Vertical edge settings" group <<end>>
2952 // .. "PyEditor" preferences tab <<end>>
2954 // .. "Directories" preferences tab <<start>>
2955 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2956 // ... --> quick directories list
2957 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2958 pref->addPreference( tr( "" ), dirGroup,
2959 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2960 // .. "Directories" preferences tab <<end>>
2962 // .. "Object browser" preferences tab <<start>>
2963 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2965 // ... "Search tool" group <<start>>
2966 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2967 // .... --> auto-hide
2968 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2969 "ObjectBrowser", "auto_hide_search_tool" );
2970 // ... "Search tool" group <<end>>
2972 // ... "Object browser settings" group <<start>>
2973 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2974 pref->setItemProperty( "columns", 2, objSetGroup );
2975 // .... -> auto size first column
2976 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2977 "ObjectBrowser", "auto_size_first" );
2978 // .... -> auto size other columns
2979 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2980 "ObjectBrowser", "auto_size" );
2981 // .... -> resize columns on expand item
2982 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2983 "ObjectBrowser", "resize_on_expand_item" );
2984 // .... -> browse to published object
2985 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2986 "ObjectBrowser", "browse_published_object" );
2987 aValuesList.clear();
2988 anIndicesList.clear();
2989 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2990 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2991 pref->setItemProperty( "strings", aValuesList, browsePublished );
2992 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2993 // ... "Object browser settings" group <<end>>
2994 // .. "Object browser" preferences tab <<end>>
2996 // .. "Shortcuts" preferences tab <<start>>
2997 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2998 // ... "Shortcuts settings" group <<start>>
2999 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3000 pref->addPreference( tr( "" ), shortcutGroup,
3001 LightApp_Preferences::ShortcutTree, "shortcuts" );
3002 // ... "Shortcuts settings" group <<end>>
3003 // .. "Shortcuts" preferences tab <<end>>
3004 // . Top-level "SALOME" preferences group <<end>>
3010 Changes appearance of application according to changed preferences
3011 \param sec - section
3012 \param param - name of changed parameter
3014 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3016 SUIT_ResourceMgr* resMgr = resourceMgr();
3020 if ( sec == "viewers" && param == "drop_down_buttons" )
3022 ViewManagerList vmlist = viewManagers();
3023 foreach( SUIT_ViewManager* vm, vmlist )
3025 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3026 foreach( SUIT_ViewWindow* vw, vwlist )
3027 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3031 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3033 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3034 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3035 QList<SUIT_ViewManager*> lst;
3036 #ifndef DISABLE_OCCVIEWER
3037 viewManagers( OCCViewer_Viewer::Type(), lst );
3038 QListIterator<SUIT_ViewManager*> itOCC( lst );
3039 while ( itOCC.hasNext() && sz >= 0 )
3041 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3042 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3045 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3046 occVM->setTrihedronSize( sz, relative );
3047 occVM->getAISContext()->UpdateCurrentViewer();
3050 #ifndef DISABLE_VTKVIEWER
3051 #ifndef DISABLE_SALOMEOBJECT
3052 viewManagers( SVTK_Viewer::Type(), lst );
3053 QListIterator<SUIT_ViewManager*> itVTK( lst );
3054 while ( itVTK.hasNext() && sz >= 0 )
3056 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3057 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3060 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3063 vtkVM->setTrihedronSize( sz, relative );
3071 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3073 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3074 QList<SUIT_ViewManager*> lst;
3075 #ifndef DISABLE_OCCVIEWER
3076 viewManagers( OCCViewer_Viewer::Type(), lst );
3077 QListIterator<SUIT_ViewManager*> itOCC( lst );
3078 while ( itOCC.hasNext() )
3080 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3081 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3084 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3087 occVM->setStaticTrihedronDisplayed( isVisible );
3091 #ifndef DISABLE_VTKVIEWER
3092 #ifndef DISABLE_SALOMEOBJECT
3093 viewManagers( SVTK_Viewer::Type(), lst );
3094 QListIterator<SUIT_ViewManager*> itVTK( lst );
3095 while ( itVTK.hasNext() )
3097 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3098 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3101 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3104 vtkVM->setStaticTrihedronVisible( isVisible );
3112 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3114 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3115 QList<SUIT_ViewManager*> lst;
3116 #ifndef DISABLE_OCCVIEWER
3117 viewManagers( OCCViewer_Viewer::Type(), lst );
3118 QListIterator<SUIT_ViewManager*> itOCC( lst );
3119 while ( itOCC.hasNext() )
3121 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3122 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3125 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3126 occVM->setInteractionStyle( mode );
3129 #ifndef DISABLE_VTKVIEWER
3130 #ifndef DISABLE_SALOMEOBJECT
3131 viewManagers( SVTK_Viewer::Type(), lst );
3132 QListIterator<SUIT_ViewManager*> itVTK( lst );
3133 while ( itVTK.hasNext() )
3135 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3136 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3139 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3140 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3146 #ifndef DISABLE_OCCVIEWER
3147 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3149 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3150 QList<SUIT_ViewManager*> lst;
3151 viewManagers( OCCViewer_Viewer::Type(), lst );
3152 QListIterator<SUIT_ViewManager*> it( lst );
3153 while ( it.hasNext() )
3155 SUIT_ViewModel* vm = it.next()->getViewModel();
3156 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3159 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3160 occVM->enablePreselection( isToEnablePreselection );
3165 #ifndef DISABLE_OCCVIEWER
3166 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3168 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3169 QList<SUIT_ViewManager*> lst;
3170 viewManagers( OCCViewer_Viewer::Type(), lst );
3171 QListIterator<SUIT_ViewManager*> it( lst );
3172 while ( it.hasNext() )
3174 SUIT_ViewModel* vm = it.next()->getViewModel();
3175 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3178 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3179 occVM->enableSelection( isToEnableSelection );
3184 #ifndef DISABLE_OCCVIEWER
3185 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3187 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3188 QList<SUIT_ViewManager*> lst;
3189 viewManagers( OCCViewer_Viewer::Type(), lst );
3190 QListIterator<SUIT_ViewManager*> it( lst );
3191 while ( it.hasNext() )
3193 SUIT_ViewModel* vm = it.next()->getViewModel();
3194 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3197 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3198 occVM->setClippingColor( aColor );
3203 #ifndef DISABLE_OCCVIEWER
3204 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3205 param == QString( "clipping_texture" ) ||
3206 param == QString( "clipping_modulate" ) ||
3207 param == QString( "clipping_scale" ) ) )
3209 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3210 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3211 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3212 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3213 QList<SUIT_ViewManager*> lst;
3214 viewManagers( OCCViewer_Viewer::Type(), lst );
3215 QListIterator<SUIT_ViewManager*> it( lst );
3216 while ( it.hasNext() )
3218 SUIT_ViewModel* vm = it.next()->getViewModel();
3219 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3222 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3223 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3228 #ifndef DISABLE_OCCVIEWER
3229 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3231 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3232 QList<SUIT_ViewManager*> lst;
3233 viewManagers( OCCViewer_Viewer::Type(), lst );
3234 QListIterator<SUIT_ViewManager*> it( lst );
3235 while ( it.hasNext() )
3237 SUIT_ViewModel* vm = it.next()->getViewModel();
3238 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3241 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3242 occVM->setProjectionType( mode );
3246 #if OCC_VERSION_LARGE > 0x06090000
3247 #ifndef DISABLE_OCCVIEWER
3248 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3250 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3251 QList<SUIT_ViewManager*> lst;
3252 viewManagers( OCCViewer_Viewer::Type(), lst );
3253 QListIterator<SUIT_ViewManager*> it( lst );
3254 while ( it.hasNext() )
3256 SUIT_ViewModel* vm = it.next()->getViewModel();
3257 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3260 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3261 occVM->setStereoType( mode );
3266 #ifndef DISABLE_OCCVIEWER
3267 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3269 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3270 QList<SUIT_ViewManager*> lst;
3271 viewManagers( OCCViewer_Viewer::Type(), lst );
3272 QListIterator<SUIT_ViewManager*> it( lst );
3273 while ( it.hasNext() )
3275 SUIT_ViewModel* vm = it.next()->getViewModel();
3276 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3279 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3280 occVM->setAnaglyphFilter( mode );
3285 #ifndef DISABLE_OCCVIEWER
3286 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3287 param == QString( "focus_value" ) ) )
3289 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3290 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3291 QList<SUIT_ViewManager*> lst;
3292 viewManagers( OCCViewer_Viewer::Type(), lst );
3293 QListIterator<SUIT_ViewManager*> it( lst );
3294 while ( it.hasNext() )
3296 SUIT_ViewModel* vm = it.next()->getViewModel();
3297 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3300 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3301 occVM->setStereographicFocus( aType, aValue );
3306 #ifndef DISABLE_OCCVIEWER
3307 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3308 param == QString( "iod_value" ) ) )
3310 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3311 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3312 QList<SUIT_ViewManager*> lst;
3313 viewManagers( OCCViewer_Viewer::Type(), lst );
3314 QListIterator<SUIT_ViewManager*> it( lst );
3315 while ( it.hasNext() )
3317 SUIT_ViewModel* vm = it.next()->getViewModel();
3318 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3321 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3322 occVM->setInterocularDistance( aType, aValue );
3327 #ifndef DISABLE_OCCVIEWER
3328 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3330 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3331 QList<SUIT_ViewManager*> lst;
3332 viewManagers( OCCViewer_Viewer::Type(), lst );
3333 QListIterator<SUIT_ViewManager*> it( lst );
3334 while ( it.hasNext() )
3336 SUIT_ViewModel* vm = it.next()->getViewModel();
3337 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3340 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3341 occVM->setReverseStereo( reverse );
3346 #ifndef DISABLE_OCCVIEWER
3347 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3349 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3350 QList<SUIT_ViewManager*> lst;
3351 viewManagers( OCCViewer_Viewer::Type(), lst );
3352 QListIterator<SUIT_ViewManager*> it( lst );
3353 while ( it.hasNext() )
3355 SUIT_ViewModel* vm = it.next()->getViewModel();
3356 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3359 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3360 occVM->setVSync( enable );
3365 #ifndef DISABLE_OCCVIEWER
3366 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3368 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3369 QList<SUIT_ViewManager*> lst;
3370 viewManagers( OCCViewer_Viewer::Type(), lst );
3371 QListIterator<SUIT_ViewManager*> it( lst );
3372 while ( it.hasNext() )
3374 SUIT_ViewModel* vm = it.next()->getViewModel();
3375 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3378 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3379 occVM->setQuadBufferSupport( enable );
3384 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3386 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3387 QList<SUIT_ViewManager*> lst;
3388 #ifndef DISABLE_OCCVIEWER
3389 viewManagers( OCCViewer_Viewer::Type(), lst );
3390 QListIterator<SUIT_ViewManager*> itOCC( lst );
3391 while ( itOCC.hasNext() )
3393 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3394 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3397 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3398 occVM->setZoomingStyle( mode );
3401 #ifndef DISABLE_VTKVIEWER
3402 #ifndef DISABLE_SALOMEOBJECT
3403 viewManagers( SVTK_Viewer::Type(), lst );
3404 QListIterator<SUIT_ViewManager*> itVTK( lst );
3405 while ( itVTK.hasNext() )
3407 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3408 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3411 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3412 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3418 #ifndef DISABLE_VTKVIEWER
3419 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3421 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3422 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3423 QList<SUIT_ViewManager*> lst;
3424 #ifndef DISABLE_SALOMEOBJECT
3425 viewManagers( SVTK_Viewer::Type(), lst );
3426 QListIterator<SUIT_ViewManager*> it( lst );
3427 while ( it.hasNext() )
3429 SUIT_ViewModel* vm = it.next()->getViewModel();
3430 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3433 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3434 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3440 #ifndef DISABLE_VTKVIEWER
3441 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3443 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3444 QList<SUIT_ViewManager*> lst;
3445 #ifndef DISABLE_SALOMEOBJECT
3446 viewManagers( SVTK_Viewer::Type(), lst );
3447 QListIterator<SUIT_ViewManager*> it( lst );
3448 while ( it.hasNext() )
3450 SUIT_ViewModel* vm = it.next()->getViewModel();
3451 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3454 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3455 if( vtkVM ) vtkVM->setProjectionMode( mode );
3461 #ifndef DISABLE_VTKVIEWER
3462 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3464 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3465 QList<SUIT_ViewManager*> lst;
3466 #ifndef DISABLE_SALOMEOBJECT
3467 viewManagers( SVTK_Viewer::Type(), lst );
3468 QListIterator<SUIT_ViewManager*> it( lst );
3469 while ( it.hasNext() )
3471 SUIT_ViewModel* vm = it.next()->getViewModel();
3472 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3475 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3476 if( vtkVM ) vtkVM->setStereoType( mode );
3482 #ifndef DISABLE_VTKVIEWER
3483 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3485 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3486 QList<SUIT_ViewManager*> lst;
3487 #ifndef DISABLE_SALOMEOBJECT
3488 viewManagers( SVTK_Viewer::Type(), lst );
3489 QListIterator<SUIT_ViewManager*> it( lst );
3490 while ( it.hasNext() )
3492 SUIT_ViewModel* vm = it.next()->getViewModel();
3493 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3496 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3497 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3503 #ifndef DISABLE_VTKVIEWER
3504 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3506 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3507 QList<SUIT_ViewManager*> lst;
3508 #ifndef DISABLE_SALOMEOBJECT
3509 viewManagers( SVTK_Viewer::Type(), lst );
3510 QListIterator<SUIT_ViewManager*> it( lst );
3511 while ( it.hasNext() )
3513 SUIT_ViewModel* vm = it.next()->getViewModel();
3514 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3517 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3518 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3524 #ifndef DISABLE_VTKVIEWER
3525 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3527 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3528 QList<SUIT_ViewManager*> lst;
3529 #ifndef DISABLE_SALOMEOBJECT
3530 viewManagers( SVTK_Viewer::Type(), lst );
3531 QListIterator<SUIT_ViewManager*> it( lst );
3532 while ( it.hasNext() )
3534 SUIT_ViewModel* vm = it.next()->getViewModel();
3535 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3538 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3539 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3545 #ifndef DISABLE_VTKVIEWER
3546 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3548 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3549 QList<SUIT_ViewManager*> lst;
3550 #ifndef DISABLE_SALOMEOBJECT
3551 viewManagers( SVTK_Viewer::Type(), lst );
3552 QListIterator<SUIT_ViewManager*> it( lst );
3553 while ( it.hasNext() )
3555 SUIT_ViewModel* vm = it.next()->getViewModel();
3556 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3559 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3560 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3566 #ifndef DISABLE_VTKVIEWER
3567 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3568 param == QString( "spacemouse_func2_btn" ) ||
3569 param == QString( "spacemouse_func5_btn" ) ) )
3571 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3572 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3573 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3574 QList<SUIT_ViewManager*> lst;
3575 #ifndef DISABLE_SALOMEOBJECT
3576 viewManagers( SVTK_Viewer::Type(), lst );
3577 QListIterator<SUIT_ViewManager*> it( lst );
3578 while ( it.hasNext() )
3580 SUIT_ViewModel* vm = it.next()->getViewModel();
3581 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3584 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3585 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3590 if( sec=="ObjectBrowser" )
3592 SUIT_DataBrowser* ob = objectBrowser();
3596 if ( param=="auto_size_first" )
3598 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3599 ob->setAutoSizeFirstColumn( autoSizeFirst );
3600 if ( autoSizeFirst )
3601 ob->adjustFirstColumnWidth();
3603 else if ( param=="auto_size" ) {
3604 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3605 ob->setAutoSizeColumns(autoSize);
3607 ob->adjustColumnsWidth();
3609 else if ( param=="resize_on_expand_item" ) {
3610 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3611 ob->setResizeOnExpandItem(resizeOnExpandItem);
3613 else if ( param == "auto_hide_search_tool" ) {
3614 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3620 if( param=="auto_save_interval" ) {
3621 myAutoSaveTimer->stop();
3622 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3623 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3627 #ifndef DISABLE_PYCONSOLE
3628 if( sec=="PyConsole" && pythonConsole() )
3630 if ( param=="font" ) {
3631 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3633 else if ( param=="show_banner" ) {
3634 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3636 else if ( param=="auto_completion" ) {
3637 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3644 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3646 if ( param == "visible_count" )
3647 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3648 else if ( param == "max_count" )
3649 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3650 else if ( param == "insert_mode" )
3651 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3652 else if ( param == "link_type" )
3653 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3654 else if ( param == "show_clear" )
3655 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3656 else if ( param == "show_mru" )
3657 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3660 if ( sec == "language" && param == "language" )
3662 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3663 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3665 if ( sec == "language" && param == "locale")
3667 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3668 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3670 if ( sec == "desktop" && param == "opaque_resize" ) {
3671 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3672 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3673 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3674 // any dockable window can't be docked to the another area, except initial area.
3675 // It is possible to move window to another area, but it always returns to the initial area.
3677 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3678 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3679 // else dopts &= ~QMainWindow::AnimatedDocks;
3680 // desktop()->setDockOptions( dopts );
3681 desktop()->setOpaqueResize( opaqueResize );
3682 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3683 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3686 #ifndef DISABLE_PLOT2DVIEWER
3687 QList<SUIT_ViewManager*> lst;
3688 viewManagers( Plot2d_Viewer::Type(), lst );
3689 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3690 while ( itPlot2d.hasNext() ) {
3691 SUIT_ViewManager* viewMgr = itPlot2d.next();
3692 SUIT_ViewModel* vm = viewMgr->getViewModel();
3693 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3696 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3698 viewMgr->setViewModel( vm );
3699 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3701 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3702 frame->SetPreference();
3711 void LightApp_Application::loadPreferences()
3713 CAM_Application::loadPreferences();
3715 SUIT_ResourceMgr* aResMgr = resourceMgr();
3720 static bool mru_load = true;
3723 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3725 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3726 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3727 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3728 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3729 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3730 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3731 mru->loadLinks( aResMgr, "MRU" );
3737 QStringList mods = aResMgr->parameters( "windows_visibility" );
3738 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3741 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3742 myWinVis.insert( *itr, arr );
3746 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3747 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3748 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3749 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3750 // else dopts &= ~QMainWindow::AnimatedDocks;
3751 // desktop()->setDockOptions( dopts );
3752 desktop()->setOpaqueResize( opaqueResize );
3753 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3754 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3761 void LightApp_Application::savePreferences()
3763 CAM_Application::savePreferences();
3765 saveDockWindowsState();
3767 SUIT_ResourceMgr* aResMgr = resourceMgr();
3772 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3774 mru->saveLinks( aResMgr, "MRU" );
3776 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3777 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3780 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3782 #if GUI_DEVELOPMENT > 0
3783 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3785 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3792 Updates desktop title
3794 void LightApp_Application::updateDesktopTitle()
3796 QString aTitle = applicationName();
3797 QString aVer = applicationVersion();
3798 if ( !aVer.isEmpty() )
3799 aTitle += QString( " " ) + aVer;
3801 if ( activeStudy() ) {
3802 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3803 aTitle += QString( " - [%1]" ).arg( sName );
3806 desktop()->setWindowTitle( aTitle );
3810 \brief Get map of the operations which can be performed
3811 on the module activation.
3813 The method should return the map of the kind \c {<id>:<name>}
3814 where \c <id> is an integer identifier of the operation and
3815 \c <name> is a title for the button to be added to the
3816 dialog box. After user selects the required operation by the
3817 clicking the corresponding button in the dialog box, its identifier
3818 is passed to the moduleActionSelected() method to process
3821 \return map of the operations
3822 \sa moduleActionSelected()
3824 QMap<int, QString> LightApp_Application::activateModuleActions() const
3826 QMap<int, QString> opmap;
3827 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3828 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3833 \brief Called when the used selectes required operation chosen
3834 from "Activate module" dialog box.
3836 Performs the required operation according to the user choice.
3838 \param id operation identifier
3839 \sa activateModuleActions()
3841 void LightApp_Application::moduleActionSelected( const int id )
3856 Updates windows after close document
3858 void LightApp_Application::afterCloseDoc()
3862 CAM_Application::afterCloseDoc();
3866 Updates actions of active module
3868 void LightApp_Application::updateModuleActions()
3871 if ( activeModule() ) {
3872 modName = activeModule()->moduleName();
3873 if ( !isModuleAccessible( modName ) ) {
3874 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3875 foreach( SUIT_Application* app, apps ) {
3876 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3877 if ( lapp && lapp != this )
3878 lapp->removeModuleAction( modName );
3883 LightApp_ModuleAction* moduleAction =
3884 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3886 moduleAction->setActiveModule( modName );
3889 void LightApp_Application::removeModuleAction( const QString& modName )
3891 LightApp_ModuleAction* moduleAction =
3892 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3894 moduleAction->removeModule( modName );
3898 Gets current windows.
3899 \param winMap - output current windows map.
3901 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3904 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3905 ((LightApp_Module*)activeModule())->windows( winMap );
3907 defaultWindows( winMap );
3911 Gets current view managers.
3912 \param lst - output current view managers list.
3914 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3917 if ( !activeStudy() )
3920 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3921 ((LightApp_Module*)activeModule())->viewManagers( lst );
3923 defaultViewManagers( lst );
3929 void LightApp_Application::updateWindows()
3931 QMap<int, int> winMap;
3932 currentWindows( winMap );
3934 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3936 if ( !dockWindow( it.key() ) )
3937 getWindow( it.key() );
3940 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3942 QWidget* wid = it.value();
3943 if ( winMap.contains( it.key() ) )
3944 wid->setVisible( true );
3949 loadDockWindowsState();
3953 Updates view managers
3955 void LightApp_Application::updateViewManagers()
3958 currentViewManagers( lst );
3960 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3961 getViewManager( *it, true );
3965 Loads windows geometry
3967 void LightApp_Application::loadDockWindowsState()
3971 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3972 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3973 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3976 if ( activeModule() )
3977 modName = activeModule()->name();
3978 else if ( activeStudy() )
3979 modName = "nomodule";
3981 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3982 QByteArray aDefaultState;
3983 aResMgr->value( "windows_geometry", modName, aDefaultState );
3984 QByteArray aDefaultVisibility;
3985 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3986 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3987 aResMgr->setWorkingMode( prevMode );
3989 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3992 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3993 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3995 if ( version > Qtx::versionToId( "7.4.1" ) )
3996 aResMgr->value( "windows_geometry", modName , arr );
3998 arr = aDefaultState;
3999 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4000 desktop()->restoreState( aTargetArray );
4003 QStringList mainToolbarsNames;
4004 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4005 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4006 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4008 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4011 QMap<QString, bool> *tbMap = 0;
4012 QMap<QString, bool> *dwMap = 0;
4014 QMap<QString, bool> userTbMap, userDwMap;
4015 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4017 QMap<QString, bool> defaultTbMap, defaultDwMap;
4018 if(hasDefaultVisibility) {
4019 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4025 if(hasDefaultVisibility){
4026 tbMap = &defaultTbMap;
4033 if(hasDefaultVisibility){
4034 dwMap = &defaultDwMap;
4039 QList<QToolBar*> tbList = findToolBars();
4040 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4042 QToolBar* tb = *tit;
4043 if ( tbMap->contains( tb->objectName() ) ) {
4044 tb->setVisible( (*tbMap)[tb->objectName()] );
4050 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4051 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4053 QDockWidget* dw = *dit;
4055 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4056 if ( po != desktop() )
4059 if ( dwMap->contains( dw->objectName() ) )
4060 dw->setVisible( (*dwMap)[dw->objectName()] );
4068 Saves windows geometry
4070 void LightApp_Application::saveDockWindowsState()
4075 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4076 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4078 if( !storeWin && !storeTb )
4082 if ( activeModule() )
4083 modName = activeModule()->name();
4084 else if ( activeStudy() )
4085 modName = "nomodule";
4087 QString versionId = GUI_VERSION_STR;
4088 #if GUI_DEVELOPMENT > 0
4092 QByteArray arr = desktop()->saveState();
4093 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4094 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4097 if ( myWinVis.contains( modName ) )
4098 visArr = myWinVis[modName];
4100 QMap<QString, bool> tbMap, dwMap;
4101 dockWindowsState( visArr, tbMap, dwMap );
4103 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4104 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4107 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4110 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4111 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4113 QDockWidget* wid = *it;
4114 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4117 visArr = dockWindowsState( tbMap, dwMap );
4119 myWinVis.insert( modName, visArr );
4122 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4125 QDataStream stream( &visArr, QIODevice::WriteOnly );
4127 stream << (uchar)ToolBarMarker;
4128 stream << tb.size();
4129 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4131 stream << tit.key();
4132 stream << (uchar)( tit.value() ? 1 : 0 );
4135 stream << (uchar)DockWidgetMarker;
4136 stream << dw.size();
4137 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4139 stream << wit.key();
4140 stream << (uchar)( wit.value() ? 1 : 0 );
4146 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4151 QByteArray visArr = arr;
4152 QDataStream stream( &visArr, QIODevice::ReadOnly );
4156 if ( marker != ToolBarMarker )
4161 for ( int i = 0; i < lines; ++i )
4164 stream >> objectName;
4167 tb.insert( objectName, shown );
4171 if ( marker != DockWidgetMarker )
4175 for ( int j = 0; j < lines; ++j )
4178 stream >> objectName;
4181 dw.insert( objectName, shown );
4186 Adds icon names for modules
4188 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4192 SUIT_ResourceMgr* resMgr = resourceMgr();
4196 QStringList modList;
4197 modules( modList, false );
4199 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4201 QString modName = *it;
4202 QString modIntr = moduleName( modName );
4203 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4205 if ( modIcon.isEmpty() )
4208 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4209 modIcon += QString( ".png" );
4211 iconMap.insert( modName, modIcon );
4216 Inserts items in popup, which necessary for current application
4218 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4221 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4222 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4223 selMgr->setSelectionCacheEnabled( true );
4225 SUIT_DataBrowser* ob = objectBrowser();
4227 CAM_Application::contextMenuPopup( type, thePopup, title );
4229 if ( ob && type == ob->popupClientType() ) {
4230 thePopup->addSeparator();
4231 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4232 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4233 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4236 #ifndef DISABLE_SALOMEOBJECT
4237 if ( selMgr && ob ) {
4238 SALOME_ListIO selected;
4239 selMgr->selectedObjects( selected );
4240 if(selected.Extent() == 1){
4241 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4242 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4243 if(obj && obj->renameAllowed()) {
4244 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4245 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4246 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4247 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4249 QList<QAction*> acts = thePopup->actions();
4250 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4251 thePopup->insertAction(firstAction,a);
4257 selMgr->setSelectionCacheEnabled( cacheIsOn );
4263 void LightApp_Application::createEmptyStudy()
4265 CAM_Application::createEmptyStudy();
4267 if ( objectBrowser() )
4268 objectBrowser()->updateTree();
4270 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4271 if ( aResMgr && activeStudy() ) {
4272 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4273 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4278 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4280 CAM_Application::setDesktop( desk );
4283 connect( desk, SIGNAL( message( const QString& ) ),
4284 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4285 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4286 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4287 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4288 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4294 \param mod - module to be activated
4296 bool LightApp_Application::activateModule( CAM_Module* mod )
4298 bool res = CAM_Application::activateModule( mod );
4300 if ( objectBrowser() )
4301 objectBrowser()->updateTree();
4307 \return keyborad accelerators manager object
4309 SUIT_Accel* LightApp_Application::accel() const
4315 Removes dead widget container from map
4317 void LightApp_Application::onWCDestroyed( QObject* ob )
4319 // remove destroyed widget container from windows map
4320 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4322 if ( itr.value() != ob )
4325 int key = itr.key();
4326 myWin.remove( key );
4331 void LightApp_Application::onMRUActivated( const QString& name )
4333 SUIT_Session* s = SUIT_Session::session();
4334 if ( s && s->activeApplication() == this )
4338 void LightApp_Application::onStylePreferences()
4340 #ifdef USE_SALOME_STYLE
4341 Style_PrefDlg dlg( desktop() );
4344 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4345 #endif // USE_SALOME_STYLE
4348 void LightApp_Application::onFullScreen(){
4349 if(myScreenHelper) {
4350 if(desktop()->isFullScreen())
4351 myScreenHelper->switchToNormalScreen();
4353 myScreenHelper->switchToFullScreen();
4358 Connects just added view manager
4360 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4362 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4363 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4364 CAM_Application::addViewManager( vm );
4368 Remove view manager from memory
4370 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4372 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4373 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4374 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4376 aStudy->removeObjectProperties( vm->getGlobalId() );
4378 CAM_Application::removeViewManager( vm );
4380 LightApp_SelectionMgr* selMgr = selectionMgr();
4381 QList<SUIT_Selector*> selectors;
4382 selMgr->selectors( selectors );
4383 foreach( SUIT_Selector* selector, selectors ) {
4384 if ( selector->owner() == vm->getViewModel() ) {
4389 // IPAL22894: Crash on closing OCC view
4395 Renames active window of desktop
4397 void LightApp_Application::onRenameWindow()
4402 QWidget* w = desktop()->activeWindow();
4407 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4408 if( ok && !name.isEmpty() )
4409 w->setWindowTitle( name );
4413 Closes active window of desktop
4415 void LightApp_Application::onCloseWindow()
4420 QWidget* w = desktop()->activeWindow();
4428 Closes all windows of desktop
4430 void LightApp_Application::onCloseAllWindow()
4432 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4436 QList<SUIT_ViewWindow*> wndList = desk->windows();
4437 SUIT_ViewWindow* wnd;
4438 foreach( wnd, wndList )
4446 Groups all windows of desktop
4448 void LightApp_Application::onGroupAllWindow()
4450 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4454 QtxWorkstack* wgStack = desk->workstack();
4460 \return if the library of module exists
4461 \param moduleTitle - title of module
4463 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4465 if( moduleTitle.isEmpty() )
4468 QString lib = moduleLibrary( moduleTitle );
4470 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4471 bool isPythonModule = lib.contains("SalomePyQtGUI");
4472 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4476 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4477 #elif defined(__APPLE__)
4478 paths = QString(::getenv( "DYLD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4480 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4483 bool isLibFound = false;
4484 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4485 for( ; anIt!=aLast; anIt++ )
4487 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4498 INFOS( "\n****************************************************************" << std::endl
4499 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4500 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4501 << "****************************************************************" << std::endl );
4503 else if ( !isPythonModule && !isPythonLightModule)
4506 if ( isPythonModule || isPythonLightModule)
4508 QString pylib = moduleName( moduleTitle ) + QString(".py");
4509 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4511 // Check the python library
4513 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4515 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4517 bool isPyLib = false, isPyGuiLib = false;
4518 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4519 for( ; anIt!=aLast; anIt++ )
4521 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4522 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4524 if(!isPythonLightModule)
4525 if( !isPyLib && inf.exists() )
4528 if( !isPyGuiLib && infgui.exists() )
4531 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4535 printf( "\n****************************************************************\n" );
4536 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4538 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4540 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4541 printf( "****************************************************************\n" );
4548 \return default name for an active study
4550 void LightApp_Application::setDefaultStudyName( const QString& theName )
4552 QStringList anInfoList;
4553 modules( anInfoList, false );
4555 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4556 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4557 !aStudy->isSaved() )
4559 aStudy->setStudyName( theName );
4560 updateDesktopTitle();
4565 Custom event handler
4567 bool LightApp_Application::event( QEvent* e )
4569 if( e && e->type()==2000 )
4571 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4572 QString* d = ( QString* )ce->data();
4573 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4575 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4576 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4577 showPreferences( tr( "PREF_APP" ) );
4582 return CAM_Application::event( e );
4585 /*! Check data object */
4586 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4590 bool isSuitable = !theObj->entry().isEmpty() &&
4591 !theObj->componentDataType().isEmpty() &&
4592 !theObj->name().isEmpty();
4599 int LightApp_Application::openChoice( const QString& aName )
4601 int choice = CAM_Application::openChoice( aName );
4603 if ( choice == OpenExist ) // The document is already open.
4605 // Do you want to reload it?
4606 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4607 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4608 choice = OpenReload;
4614 bool LightApp_Application::openAction( const int choice, const QString& aName )
4621 STD_Application* app = 0;
4622 SUIT_Session* session = SUIT_Session::session();
4623 QList<SUIT_Application*> appList = session->applications();
4624 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4626 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4627 app = ::qobject_cast<STD_Application*>( *it );
4632 app->onCloseDoc( false );
4633 appList = session->applications();
4634 STD_Application* other = 0;
4635 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4636 other = ::qobject_cast<STD_Application*>( *it );
4639 res = other->onOpenDoc( aName );
4644 res = CAM_Application::openAction( choice, aName );
4651 QStringList LightApp_Application::viewManagersTypes() const
4653 QStringList aTypesList;
4654 aTypesList += myUserWmTypes;
4655 #ifndef DISABLE_GLVIEWER
4656 aTypesList<<GLViewer_Viewer::Type();
4658 #ifndef DISABLE_PLOT2DVIEWER
4659 aTypesList<<Plot2d_Viewer::Type();
4661 #ifndef DISABLE_QXGRAPHVIEWER
4662 aTypesList<<QxScene_Viewer::Type();
4664 #ifndef DISABLE_PVVIEWER
4665 aTypesList<<PVViewer_Viewer::Type();
4667 #ifndef DISABLE_PYVIEWER
4668 aTypesList<<PyViewer_Viewer::Type();
4670 #ifndef DISABLE_OCCVIEWER
4671 aTypesList<<OCCViewer_Viewer::Type();
4673 #ifndef DISABLE_VTKVIEWER
4674 #ifndef DISABLE_SALOMEOBJECT
4675 aTypesList<<SVTK_Viewer::Type();
4677 aTypesList<<VTKViewer_Viewer::Type();
4683 * Removes all view managers of known types
4684 * Other view managers are ignored
4686 void LightApp_Application::clearKnownViewManagers()
4688 QStringList aTypesList = viewManagersTypes();
4689 QList<SUIT_ViewManager*> aMgrList;
4690 viewManagers( aMgrList );
4691 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4692 if (aTypesList.contains(aMgr->getType()))
4693 removeViewManager(aMgr);
4698 Copy of current selection
4700 void LightApp_Application::onCopy()
4702 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4708 Paste of current data in clipboard
4710 void LightApp_Application::onPaste()
4712 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4718 Browse (i.e. set focus on) the published objects
4719 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4720 has been accepted by Ok (or Apply & Close) button
4721 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4722 (to select the first published object only)
4723 \return entry of the selected object
4725 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4726 const bool theIsApplyAndClose,
4727 const bool theIsOptimizedBrowsing )
4730 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4732 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4733 switch( aBrowsePolicy )
4737 case BP_ApplyAndClose:
4738 if( !theIsApplyAndClose )
4746 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4750 SUIT_DataBrowser* anOB = objectBrowser();
4754 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4758 QStringListIterator anIter( theEntryList );
4759 if( theIsOptimizedBrowsing )
4761 // go to the last entry
4763 if( anIter.hasPrevious() )
4767 // scroll to each entry in the list
4768 // (in optimized mode - to the last entry only)
4770 LightApp_DataObject* anObject = 0;
4771 while( anIter.hasNext() )
4773 anEntry = anIter.next();
4774 if( !anEntry.isEmpty() )
4776 anObject = aStudy->findObjectByEntry( anEntry );
4779 QModelIndex anIndex = aModel->index( anObject );
4780 anOB->treeView()->scrollTo( anIndex );
4785 // always select the last object
4786 if( anObject && !anEntry.isEmpty() )
4788 QList<SUIT_Selector*> aSelectorList;
4789 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4790 if( !aSelectorList.isEmpty() )
4792 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4794 bool anIsAutoBlock = aSelector->autoBlock();
4796 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4797 aSelector->setAutoBlock( false );
4799 SUIT_DataOwnerPtrList aList;
4800 #ifndef DISABLE_SALOMEOBJECT
4801 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4802 ( anObject->entry().toLatin1().constData(),
4803 anObject->componentDataType().toLatin1().constData(),
4804 anObject->name().toLatin1().constData() );
4805 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4807 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4810 aList.append( owner );
4811 selectionMgr()->setSelected( aList );
4814 // restore auto block flag
4815 aSelector->setAutoBlock( anIsAutoBlock );
4823 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4825 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4826 return study ? study->findObjectByEntry( id ) : 0;
4830 Checks that an object can be renamed.
4831 \param entry entry of the object
4832 \brief Return \c true if object can be renamed
4834 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4839 Rename object by entry.
4840 \param entry entry of the object
4841 \param name new name of the object
4842 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4844 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4848 /*! Process standard messages from desktop */
4849 void LightApp_Application::onDesktopMessage( const QString& message )
4851 const QString sectionSeparator = "/";
4853 if ( message.toLower() == "updateobjectbrowser" ||
4854 message.toLower() == "updateobjbrowser" ) {
4855 // update object browser
4856 updateObjectBrowser();
4858 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4859 QString vtype = message.split( sectionSeparator ).last();
4860 if ( !vtype.isEmpty() )
4861 getViewManager( vtype, true );
4864 QStringList data = message.split( sectionSeparator );
4865 if ( data.count() > 1 ) {
4866 QString msgType = data[0].trimmed();
4867 LightApp_Module* sMod = 0;
4868 CAM_Module* mod = module( msgType );
4870 mod = module( moduleTitle( msgType ) );
4871 if ( mod && mod->inherits( "LightApp_Module" ) )
4872 sMod = (LightApp_Module*)mod;
4874 if ( msgType.toLower() == "preferences" ) {
4875 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4876 // for example "preferences/Study/multi_file_dump/true"
4877 if ( data.count() > 3 ) {
4878 QString section = data[1].trimmed();
4879 QString param = data[2].trimmed();
4880 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4881 resourceMgr()->setValue( section, param, value );
4885 // received message for the module
4886 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4887 sMod->message( msg );
4895 Returns all top level toolbars.
4896 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4898 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4900 QList<QToolBar*> aResult;
4901 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4902 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4903 QToolBar* tb = *tit;
4904 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4905 if ( po != desktop() )
4907 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4914 Internal method to parse toolbars and dockable windows state.
4916 QByteArray LightApp_Application::processState(QByteArray& input,
4917 const bool processWin,
4918 const bool processTb,
4919 const bool isRestoring,
4920 QByteArray defaultState) {
4923 bool hasDefaultState = !defaultState.isEmpty();
4924 bool isDockWinWriten = false;
4926 //Write date from users settings
4928 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4929 int marker, version;
4931 tmpInputData >> marker;
4932 tmpInputData >> version;
4933 tmpInputData >> dockmarker;
4934 tmpInputData >> nbDocWin;
4936 if(processWin && processTb && !isRestoring) {
4938 } else if(!processWin && !processTb ) {
4940 aRes = defaultState;
4942 QDataStream aData(&aRes, QIODevice::WriteOnly);
4943 QList<QToolBar*> aToolBars = findToolBars();
4946 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4947 QToolBar* tb = *tit;
4948 aNames.append(tb->objectName());
4951 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4952 if(toolBarMarkerIndex < 0)
4954 QDataStream anInputData(&input, QIODevice::ReadOnly);
4956 int toolBarMarkerIndexDef;
4957 if(hasDefaultState) {
4958 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4959 if(toolBarMarkerIndexDef < 0)
4962 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4964 QDataStream* aTargetData = 0;
4965 int aTargetIndex = -1;
4967 QByteArray currentArr = desktop()->saveState();
4968 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4969 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4970 if(processWin && useInputData) {
4971 aTargetData = &anInputData;
4972 aTargetIndex = toolBarMarkerIndex;
4974 //Write date from default settings
4975 if(hasDefaultState) {
4976 aTargetData = &anInputDataDef;
4977 aTargetIndex = toolBarMarkerIndexDef;
4979 //If no default state, write current snapshot of the dockable windows
4981 aTargetData = &anInputDataCur;
4982 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4983 aTargetIndex = toolBarMarkerIndexCur;
4988 if(aTargetData && aTargetIndex >= 0 ) {
4989 aTargetData->device()->seek(0);
4990 while( aTargetData->device()->pos() < aTargetIndex ) {
4995 isDockWinWriten = true;
5002 aTargetData = &anInputData;
5003 aTargetIndex = toolBarMarkerIndex;
5005 if(hasDefaultState) {
5006 aTargetData = &anInputDataDef;
5007 aTargetIndex = toolBarMarkerIndexDef;
5011 if(aTargetData && aTargetIndex >= 0) {
5013 if(!isDockWinWriten ) {
5014 //Write version marker
5015 int marker, version;
5016 aTargetData->device()->seek(0);
5017 *aTargetData >> marker;
5018 *aTargetData >> version;
5021 aData << (uchar) QDockWidgetMarker;
5023 int shift = 4*sizeof(int) + sizeof(QSize);
5024 index = aTargetIndex - shift;
5026 index = aTargetIndex;
5029 aTargetData->device()->seek(index);
5030 while(!aTargetData->atEnd()) {
5035 } else { // Not treat toolbars
5036 aData << (uchar) QToolBarMarker;
5037 aData << (int) 0; //Nb toolbars = 0
5044 \brief Emits operationFinished signal.
5045 \param theModuleName the name of the module which perfomed the operation
5046 \param theOperationName the operation name
5047 \param theEntryList the list of the created objects entries
5049 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5050 const QString& theOperationName,
5051 const QStringList& theEntryList )
5053 emit operationFinished( theModuleName, theOperationName, theEntryList );
5057 Update visibility state of given objects
5059 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5060 SUIT_ViewModel* theViewModel )
5062 if ( !theViewModel || theList.isEmpty() ) return;
5064 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5065 if ( !aStudy ) return;
5067 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5069 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5070 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5072 if ( !obj || aStudy->isComponent( obj->entry() ) )
5075 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5076 if ( anObjModule ) {
5077 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5079 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5080 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5081 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5082 anObjState = Qtx::ShownState;
5084 anObjState = Qtx::HiddenState;
5086 aStudy->setVisibilityState( obj->entry(), anObjState );
5093 * Called when window activated
5095 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5097 SUIT_DataBrowser* anOB = objectBrowser();
5100 SUIT_DataObject* rootObj = anOB->root();
5104 DataObjectList listObj = rootObj->children( true );
5106 SUIT_ViewModel* vmod = 0;
5107 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5108 vmod = vman->getViewModel();
5109 updateVisibilityState( listObj, vmod );
5113 Called then view manager removed
5115 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5117 ViewManagerList lst;
5118 viewManagers( lst );
5119 if ( lst.count() == 1) { // in case if closed last view window
5120 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5122 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5127 Check existing document.
5129 bool LightApp_Application::checkExistingDoc()
5132 if( activeStudy() ) {
5133 int answer = !activeStudy()->isModified() ? 1 :
5134 SUIT_MessageBox::question( desktop(),
5135 tr( "APPCLOSE_CAPTION" ),
5136 tr( "STUDYCLOSE_DESCRIPTION" ),
5137 tr( "APPCLOSE_SAVE" ),
5138 tr( "APPCLOSE_CLOSE" ),
5139 tr( "APPCLOSE_CANCEL" ), 0 );
5141 if ( activeStudy()->isSaved() ) {
5144 } else if ( onSaveAsDoc() ) {
5145 if( !closeDoc( false ) ) {
5152 else if( answer == 1 ) {
5154 } else if( answer == 2 ) {
5161 #ifndef DISABLE_PYCONSOLE
5163 PyConsole_Interp* LightApp_Application::getPyInterp()
5165 static PyConsole_Interp* myInterp = 0;
5167 myInterp = createPyInterp();
5168 myInterp->initialize();
5173 PyConsole_Interp* LightApp_Application::createPyInterp()
5175 return new PyConsole_Interp();
5178 #endif // DISABLE_PYCONSOLE