1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyEditor.h"
39 #include "PyConsole_Interp.h"
40 #include "PyConsole_Console.h"
43 #include "LightApp_Application.h"
44 #include "LightApp_Module.h"
45 #include "LightApp_DataModel.h"
46 #include "LightApp_DataOwner.h"
47 #include "LightApp_Displayer.h"
48 #include "LightApp_Study.h"
49 #include "LightApp_Preferences.h"
50 #include "LightApp_PreferencesDlg.h"
51 #include "LightApp_ModuleDlg.h"
52 #include "LightApp_AboutDlg.h"
53 #include "LightApp_ModuleAction.h"
54 // temporary commented
55 #include "LightApp_EventFilter.h"
56 #include "LightApp_OBSelector.h"
57 #include "LightApp_SelectionMgr.h"
58 #include "LightApp_DataObject.h"
59 #include "LightApp_WgViewModel.h"
60 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
64 #include <SALOME_Event.h>
66 #ifdef USE_SALOME_STYLE
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
69 #endif // USE_SALOME_STYLE
71 #include <CAM_Module.h>
72 #include <CAM_DataModel.h>
73 #include <CAM_Study.h>
74 #include <STD_TabDesktop.h>
76 #include <SUIT_DataBrowser.h>
77 #include <SUIT_Session.h>
78 #include <SUIT_Study.h>
79 #include <SUIT_FileDlg.h>
80 #include <SUIT_ResourceMgr.h>
81 #include <SUIT_ShortcutMgr.h>
82 #include <SUIT_Tools.h>
83 #include <SUIT_Accel.h>
84 #include <SUIT_MessageBox.h>
85 #include <SUIT_ViewWindow.h>
88 #include <QtxFontEdit.h>
89 #include <QtxToolBar.h>
90 #include <QtxTreeView.h>
91 #include <QtxMRUAction.h>
92 #include <QtxDockAction.h>
93 #include <QtxDockWidget.h>
94 #include <QtxActionToolMgr.h>
95 #include <QtxSearchTool.h>
96 #include <QtxWorkstack.h>
99 #include <LogWindow.h>
101 #ifndef DISABLE_GLVIEWER
102 #include <GLViewer_Viewer.h>
103 #include <GLViewer_ViewManager.h>
104 #include "LightApp_GLSelector.h"
107 #ifndef DISABLE_PLOT2DVIEWER
108 #include <Plot2d_ViewManager.h>
109 #include <Plot2d_ViewModel.h>
110 #include <Plot2d_ViewWindow.h>
111 #include <Plot2d_ViewFrame.h>
112 #include "LightApp_Plot2dSelector.h"
113 #ifndef DISABLE_SALOMEOBJECT
114 #include <SPlot2d_ViewModel.h>
116 #include <Plot2d_ViewModel.h>
120 #ifndef DISABLE_OCCVIEWER
121 #include <OCCViewer_ViewManager.h>
122 #include <OCCViewer_ViewFrame.h>
123 #include <OCCViewer_ViewPort3d.h>
124 #ifndef DISABLE_SALOMEOBJECT
125 #include <SOCC_ViewModel.h>
127 #include <OCCViewer_ViewModel.h>
129 #include "LightApp_OCCSelector.h"
132 #ifndef DISABLE_VTKVIEWER
133 #ifndef DISABLE_SALOMEOBJECT
134 #include <SVTK_ViewModel.h>
135 #include <SVTK_ViewManager.h>
136 #include "LightApp_VTKSelector.h"
138 #include <VTKViewer_ViewModel.h>
139 #include <VTKViewer_ViewManager.h>
141 #include <VTKViewer_ViewModel.h>
144 #ifndef DISABLE_QXGRAPHVIEWER
145 #include <QxScene_ViewManager.h>
146 #include <QxScene_ViewModel.h>
147 #include <QxScene_ViewWindow.h>
150 #ifndef DISABLE_GRAPHICSVIEW
151 #include "GraphicsView_Viewer.h"
152 #include "GraphicsView_ViewManager.h"
153 #include "LightApp_GVSelector.h"
156 #ifndef DISABLE_PVVIEWER
157 #include "PVViewer_ViewManager.h"
158 #include "PVViewer_ViewWindow.h"
159 #include "PVViewer_ViewModel.h"
162 #ifndef DISABLE_PYVIEWER
163 #include <PyViewer_ViewManager.h>
164 #include <PyViewer_ViewModel.h>
165 #include <PyViewer_ViewWindow.h>
169 #define VISIBILITY_COLUMN_WIDTH 25
175 #include <QStringList>
177 #include <QApplication>
179 #include <QStatusBar>
181 #include <QObjectList>
183 #include <QInputDialog>
184 #include <QFontDatabase>
186 #include <QByteArray>
190 #include <QHeaderView>
195 #include <utilities.h>
197 #define FIRST_HELP_ID 1000000
199 #ifndef DISABLE_SALOMEOBJECT
200 #include <SALOME_InteractiveObject.hxx>
201 #include <SALOME_ListIO.hxx>
204 #include <Standard_Version.hxx>
206 #define ToolBarMarker 0
207 #define DockWidgetMarker 1
209 static const char* imageEmptyIcon[] = {
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "....................",
231 "...................."};
233 int LightApp_Application::lastStudyId = 0;
235 // Markers used to parse array with dockable windows and toolbars state.
236 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
237 // in the Qt source code.
239 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
240 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
242 // Format of the Byte array with the windows and toolbar state is:
243 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
245 //Find toolbar marker position in the array in the following way:
246 //since the 'toolbar marker' is not unique, find index of first occurrence of the
247 //'toolbar marker' in the array and check that next string is name of the toolbar
251 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
252 int aResult = -1,tmp = 0;
253 int inputLen = input.length();
254 QDataStream anInputData( &input, QIODevice::ReadOnly );
255 while ( tmp < inputLen ) {
256 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
259 anInputData.device()->seek( tmp );
263 anInputData >> lines;
265 if ( lines == 0 && anInputData.atEnd() ) {
266 //Case then array doesn't contain information about toolbars,
277 if ( aFlags.contains( str ) ) {
285 QString langToName( const QString& lang )
287 // special processing for English language to avoid such result as "American English"
288 // as Qt cannot just say "English"
293 result = QLocale( lang ).nativeLanguageName();
299 \return last global id of study
301 int LightApp_Application::studyId()
303 return LightApp_Application::lastStudyId;
306 /*!Create new instance of LightApp_Application.*/
307 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
309 return new LightApp_Application();
312 /*! \var global preferences of LightApp */
313 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
317 \class LightApp_Application
318 Application containing LightApp module
322 LightApp_Application::LightApp_Application()
323 : CAM_Application( false ),
325 myScreenHelper(new LightApp_FullScreenHelper())
327 Q_INIT_RESOURCE( LightApp );
329 STD_TabDesktop* desk = new STD_TabDesktop();
330 desk->setFullScreenAllowed(false);
331 desk->setMinimizeAllowed(false);
335 // initialize auto save timer
336 myAutoSaveTimer = new QTimer( this );
337 myAutoSaveTimer->setSingleShot( true );
338 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
340 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
342 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
343 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
345 desktop()->setWindowIcon( aLogo );
346 desktop()->setDockableMenuBar( false );
347 desktop()->setDockableStatusBar( false );
349 // base logo (salome itself)
350 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
351 // extra logo (salome-based application)
352 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
356 mySelMgr = new LightApp_SelectionMgr( this );
358 myAccel = SUIT_Accel::getAccel();
360 #ifndef DISABLE_OCCVIEWER
361 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
374 #ifndef DISABLE_VTKVIEWER
375 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
386 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
388 #ifndef DISABLE_PLOT2DVIEWER
389 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
395 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
396 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
399 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
400 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
401 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
402 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
403 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
406 // Set existing font for the python console in resources
407 if( !aResMgr->hasValue( "PyConsole", "font" ) )
410 QFont f = aResMgr->fontValue( "PyConsole", "font" );
412 QStringList famdb = fdb.families();
414 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
417 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
419 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
422 if ( famdb.contains(aFamily) )
424 f.setFamily( aFamily );
425 aResMgr->setValue( "PyConsole", "font", f );
432 *\li Save window geometry.
433 *\li Save desktop geometry.
434 *\li Save resource maneger.
435 *\li Delete selection manager.
437 LightApp_Application::~LightApp_Application()
441 delete myScreenHelper;
444 /*!Start application.*/
445 void LightApp_Application::start()
447 CAM_Application::start();
450 updateViewManagers();
451 updateCommandsStatus();
454 desktop()->statusBar()->showMessage( "" );
456 LightApp_EventFilter::Init();
459 /*!Closeapplication.*/
460 void LightApp_Application::closeApplication()
462 #ifndef DISABLE_QTXWEBBROWSER
463 QProcess::startDetached( "HelpBrowser",
464 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
466 CAM_Application::closeApplication();
469 /*!Gets application name.*/
470 QString LightApp_Application::applicationName() const
472 static QString _app_name;
473 if ( _app_name.isEmpty() )
474 _app_name = tr( "APP_NAME" );
478 /*!Gets application version.*/
479 QString LightApp_Application::applicationVersion() const
481 static QString _app_version;
483 if ( _app_version.isEmpty() )
485 QString resVersion = tr( "APP_VERSION" );
486 if ( resVersion != "APP_VERSION" )
488 _app_version = resVersion;
492 _app_version = GUI_VERSION_STR;
498 /*!Load module by \a name.*/
499 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
501 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
504 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
505 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
506 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
511 /*!Activate module by \a modName*/
512 bool LightApp_Application::activateModule( const QString& modName )
515 CAM_Module* prevMod = activeModule();
518 actName = prevMod->moduleName();
520 if ( actName == modName )
523 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
525 saveDockWindowsState();
527 bool status = CAM_Application::activateModule( modName );
529 updateModuleActions();
537 updateViewManagers();
539 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
540 if ( objectBrowser()->root() != activeStudy()->root() )
541 objectBrowser()->setRoot( activeStudy()->root() );
542 updateObjectBrowser( true );
545 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
550 /*!Gets selection manager.*/
551 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
556 /*!Creat action "New window" for certain type of viewer:*/
557 void LightApp_Application::createActionForViewer( const int id,
559 const QString& suffix,
562 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
563 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
564 QAction* a = createAction( id, // menu action id
571 false, // toggle flag
573 SLOT( onNewWindow() ) ); // slot
574 createMenu( a, parentId, -1 );
579 void LightApp_Application::createActions()
581 CAM_Application::createActions();
583 SUIT_Desktop* desk = desktop();
584 SUIT_ResourceMgr* resMgr = resourceMgr();
587 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
588 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
589 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
593 // - Help for modules
595 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
596 createMenu( separator(), helpMenu, -1, 10 );
597 QStringList aModuleList;
598 modules( aModuleList, false );
599 aModuleList.prepend( "GUI" );
600 aModuleList.prepend( "KERNEL" );
602 int id = LightApp_Application::UserID + FIRST_HELP_ID;
605 foreach( aModule, aModuleList ) {
606 if ( aModule.isEmpty() ) // module title (user name)
608 IMap <QString, QString> helpData; // list of help files for the module
609 QString helpSubMenu; // help submenu name (empty if not needed)
610 QString modName = moduleName( aModule ); // module name
611 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
612 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
613 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
615 if (resMgr->hasValue( modName, "documentation" ) )
616 docSection = resMgr->stringValue(modName, "documentation");
617 else if ( resMgr->hasSection( modName + "_documentation" ) )
618 docSection = modName + "_documentation";
619 if ( !docSection.isEmpty() ) {
620 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
621 QStringList listOfParam = resMgr->parameters( docSection );
622 foreach( QString paramName, listOfParam ) {
623 QString valueStr = resMgr->stringValue( docSection, paramName );
624 if ( !valueStr.isEmpty() ) {
625 QFileInfo fi( valueStr );
626 if ( fi.isRelative() && !modDir.isEmpty() )
627 valueStr = Qtx::addSlash( modDir ) + valueStr;
628 if ( QFile::exists( valueStr ) )
629 helpData.insert( paramName.arg( aModule ), valueStr );
634 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
635 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
636 QString indexFile = idxLst.join( QDir::separator() ); // index file
637 if ( QFile::exists( indexFile ) )
638 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
641 IMapConstIterator<QString, QString > fileIt;
642 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
643 QString helpFileName = fileIt.key();
644 // remove all '//' occurances
645 while ( helpFileName.contains( "//" ) )
646 helpFileName.replace( "//", "" );
647 // obtain submenus hierarchy if given
648 QStringList smenus = helpFileName.split( "/" );
649 helpFileName = smenus.last();
651 QAction* a = createAction( id, helpFileName,
652 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
653 helpFileName, helpFileName,
654 0, desk, false, this, SLOT( onHelpContentsModule() ) );
655 a->setData( fileIt.value() );
656 if ( !helpSubMenu.isEmpty() ) {
657 smenus.prepend( helpSubMenu );
659 // create sub-menus hierarchy
660 int menuId = helpMenu;
661 foreach ( QString subMenu, smenus ) {
662 menuId = createMenu( subMenu, menuId, -1, 0 );
664 createMenu( a, menuId, -1, 0 );
669 // - Additional help items
671 createMenu( separator(), helpMenu, -1, 5 );
673 QStringList addHelpItems = resMgr->parameters( "add_help" );
674 foreach ( QString addHelpItem, addHelpItems ) {
675 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
676 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
677 QAction* a = createAction( id, addHelpItem,
678 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
679 addHelpItem, addHelpItem,
680 0, desk, false, this, SLOT( onHelpContentsModule() ) );
681 a->setData( valueStr );
682 createMenu( a, helpMenu, -1, 5 );
688 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
689 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
690 registerAction( MRUId, mru );
692 // default icon for neutral point ('SALOME' module)
693 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
694 if ( defIcon.isNull() )
695 defIcon = QPixmap( imageEmptyIcon );
697 //! default icon for any module
698 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
699 if ( modIcon.isNull() )
700 modIcon = QPixmap( imageEmptyIcon );
703 modules( modList, false );
705 if ( modList.count() > 1 )
707 LightApp_ModuleAction* moduleAction =
708 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
710 QMap<QString, QString> iconMap;
711 moduleIconNames( iconMap );
713 const int iconSize = 20;
715 QStringList::Iterator it;
716 for ( it = modList.begin(); it != modList.end(); ++it )
718 if ( !isLibExists( *it ) )
721 QString modName = moduleName( *it );
723 if ( !isModuleAccessible( *it ) )
727 if ( iconMap.contains( *it ) )
728 iconName = iconMap[*it];
730 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
734 INFOS ( "\n****************************************************************" << std::endl
735 << "* Icon for " << (*it).toLatin1().constData()
736 << " not found. Using the default one." << std::endl
737 << "****************************************************************" << std::endl );
740 icon = Qtx::scaleIcon( icon, iconSize );
742 moduleAction->insertModule( *it, icon );
745 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
746 this, SLOT( onModuleActivation( const QString& ) ) );
747 registerAction( ModulesListId, moduleAction );
751 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
752 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
754 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
755 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
756 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
757 0, desk, false, this, SLOT( onCloseAllWindow() ) );
758 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
759 0, desk, false, this, SLOT( onGroupAllWindow() ) );
761 createMenu( CloseId, windowMenu, 0, -1 );
762 createMenu( CloseAllId, windowMenu, 0, -1 );
763 createMenu( GroupAllId, windowMenu, 0, -1 );
764 createMenu( separator(), windowMenu, -1, 0 );
766 #ifndef DISABLE_GLVIEWER
767 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
769 #ifndef DISABLE_PLOT2DVIEWER
770 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
772 #ifndef DISABLE_OCCVIEWER
773 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
775 #ifndef DISABLE_VTKVIEWER
776 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
778 #ifndef DISABLE_QXGRAPHVIEWER
779 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
781 #ifndef DISABLE_GRAPHICSVIEW
782 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
784 #ifndef DISABLE_PVVIEWER
785 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
787 #ifndef DISABLE_PYVIEWER
788 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
791 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
792 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
793 createMenu( RenameId, windowMenu, -1 );
795 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
796 createMenu( PreferencesId, fileMenu, 50, -1 );
797 createMenu( separator(), fileMenu, -1, 50, -1 );
799 createMenu( separator(), fileMenu, -1, 100, -1 );
800 createMenu( MRUId, fileMenu, 100, -1 );
801 createMenu( separator(), fileMenu, -1, 100, -1 );
803 #ifdef USE_SALOME_STYLE
804 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
805 0, desk, false, this, SLOT( onStylePreferences() ) );
806 #endif // USE_SALOME_STYLE
808 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
809 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
812 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
813 createMenu( separator(), viewMenu, -1, 20, -1 );
814 #ifdef USE_SALOME_STYLE
815 createMenu( StyleId, viewMenu, 20, -1 );
816 #endif // USE_SALOME_STYLE
817 createMenu( FullScreenId, viewMenu, 20, -1 );
819 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
820 QString( "SalomeModules" ) ); // name (language-independant)
821 createTool( ModulesListId, modTBar );
824 /*!On module activation action.*/
825 void LightApp_Application::onModuleActivation( const QString& modName )
827 // Force user to create/open a study before module activation
828 QMap<QString, QString> iconMap;
829 moduleIconNames( iconMap );
830 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
832 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
834 bool cancelled = false;
836 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
837 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
838 QMap<int, QString> opmap = activateModuleActions();
839 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
840 aDlg.addButton( it.value(), it.key() );
842 int res = aDlg.exec();
844 // some operation is selected
845 moduleActionSelected( res );
849 putInfo( tr("INF_CANCELLED") );
851 LightApp_ModuleAction* moduleAction =
852 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
854 moduleAction->setActiveModule( QString() );
860 activateModule( modName );
863 /*!Default module activation.*/
864 QString LightApp_Application::defaultModule() const
866 QStringList aModuleNames;
867 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
868 //! If there's the one and only module --> activate it automatically
869 //! TODO: Possible improvement - default module can be taken from preferences
870 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
873 /*!On new window slot.*/
874 void LightApp_Application::onNewWindow()
876 const QObject* obj = sender();
877 if ( !obj || !obj->inherits( "QAction" ) )
881 int id = actionId( (QAction*)obj );
884 #ifndef DISABLE_GLVIEWER
886 type = GLViewer_Viewer::Type();
889 #ifndef DISABLE_PLOT2DVIEWER
891 type = Plot2d_Viewer::Type();
894 #ifndef DISABLE_OCCVIEWER
896 type = OCCViewer_Viewer::Type();
899 #ifndef DISABLE_VTKVIEWER
901 type = VTKViewer_Viewer::Type();
904 #ifndef DISABLE_QXGRAPHVIEWER
905 case NewQxSceneViewId:
906 type = QxScene_Viewer::Type();
909 #ifndef DISABLE_GRAPHICSVIEW
910 case NewGraphicsViewId:
911 type = GraphicsView_Viewer::Type();
914 #ifndef DISABLE_PVVIEWER
916 type = PVViewer_Viewer::Type();
919 #ifndef DISABLE_PYVIEWER
921 type = PyViewer_Viewer::Type();
926 if ( !type.isEmpty() )
927 createViewManager( type );
931 SLOT: Creates new document
933 void LightApp_Application::onNewDoc()
935 #ifdef SINGLE_DESKTOP
936 if ( !checkExistingDoc() )
940 //asl: fix for 0020515
941 saveDockWindowsState();
943 CAM_Application::onNewDoc();
947 SLOT: Opens new document
949 void LightApp_Application::onOpenDoc()
951 SUIT_Study* study = activeStudy();
953 #ifdef SINGLE_DESKTOP
954 if ( !checkExistingDoc() )
958 CAM_Application::onOpenDoc();
960 if ( !study ) // new study will be create in THIS application
963 updateViewManagers();
968 SLOT: Opens new document.
969 \param aName - name of file
971 bool LightApp_Application::onOpenDoc( const QString& aName )
973 #ifdef SINGLE_DESKTOP
974 if ( !checkExistingDoc() )
978 saveDockWindowsState();
980 // We should take mru action first because this application instance can be deleted later.
981 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
983 bool res = CAM_Application::onOpenDoc( aName );
988 mru->insert( aName );
990 mru->remove( aName );
996 SLOT: Displays "About" message box
998 void LightApp_Application::onHelpAbout()
1000 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1005 Private SLOT: Called on selection is changed
1006 Dispatchs active module that selection is changed
1008 void LightApp_Application::onSelection()
1010 //MESSAGE("onSelection")
1011 onSelectionChanged();
1013 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1014 ((LightApp_Module*)activeModule())->selectionChanged();
1019 \param study - SUIT_Study.
1021 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1023 CAM_Application::setActiveStudy( study );
1027 Enables/Disables menu items and toolbar buttons. Rebuild menu
1029 void LightApp_Application::updateCommandsStatus()
1031 CAM_Application::updateCommandsStatus();
1034 #ifndef DISABLE_GLVIEWER
1035 a = action( NewGLViewId );
1037 a->setEnabled( activeStudy() );
1040 #ifndef DISABLE_PLOT2DVIEWER
1041 a = action( NewPlot2dId );
1043 a->setEnabled( activeStudy() );
1046 #ifndef DISABLE_OCCVIEWER
1047 a = action( NewOCCViewId );
1049 a->setEnabled( activeStudy() );
1052 #ifndef DISABLE_VTKVIEWER
1053 a = action( NewVTKViewId );
1055 a->setEnabled( activeStudy() );
1058 #ifndef DISABLE_QXGRAPHVIEWER
1059 a = action( NewQxSceneViewId );
1061 a->setEnabled( activeStudy() );
1064 #ifndef DISABLE_GRAPHICSVIEW
1065 a = action( NewGraphicsViewId );
1067 a->setEnabled( activeStudy() );
1070 #ifndef DISABLE_PVVIEWER
1071 a = action( NewPVViewId );
1073 a->setEnabled( activeStudy() );
1076 #ifndef DISABLE_PYVIEWER
1077 a = action( NewPyViewerId );
1079 a->setEnabled( activeStudy() );
1085 Runs system command in separate thread
1087 class RunBrowser: public QThread
1090 RunBrowser( LightApp_Application* app,
1091 const QString& theApp,
1092 const QString& theParams,
1093 const QString& theHelpFile,
1094 const QString& theContext = QString() )
1096 myParams( theParams ),
1097 myContext( theContext ),
1101 //For the external browser always specify 'file://' protocol,
1102 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1103 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1108 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1109 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1111 QProcess* proc = new QProcess();
1113 proc->start( aCommand );
1114 if ( !proc->waitForStarted() ) {
1115 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1116 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1117 ce2000->setData( msg );
1118 QApplication::postEvent( myLApp, ce2000 );
1129 LightApp_Application* myLApp;
1133 SLOT: Displays help contents for choosen module
1135 void LightApp_Application::onHelpContentsModule()
1137 const QAction* a = (QAction*) sender();
1138 QString helpFile = a->data().toString();
1139 if ( helpFile.isEmpty() ) return;
1141 SUIT_ResourceMgr* resMgr = resourceMgr();
1144 platform = "winapplication";
1146 platform = "application";
1148 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1150 QString quote("\"");
1151 anApp.prepend( quote );
1152 anApp.append( quote );
1154 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1155 #if DISABLE_QTXWEBBROWSER
1156 bool useExtBrowser = true;
1158 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1161 if( useExtBrowser ) {
1162 if ( !anApp.isEmpty() ) {
1163 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1167 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1168 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1169 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1171 showPreferences( tr( "PREF_APP" ) );
1175 QStringList parameters;
1176 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1177 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1178 parameters << helpFile;
1179 QProcess::startDetached( "HelpBrowser", parameters );
1184 SLOT: Displays help contents for choosen dialog
1186 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1187 const QString& theFileName,
1188 const QString& theContext )
1190 QString fileName = theFileName;
1191 QString context = theContext;
1192 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1193 // context might be passed within theFileName argument
1194 QStringList comps = fileName.split("#");
1195 if ( comps.count() > 1 ) {
1196 context = comps.last();
1198 fileName = comps.join("#");
1202 QString homeDir = "";
1203 if ( !theComponentName.isEmpty() ) {
1204 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1205 if ( !dir.isEmpty() )
1206 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1207 Qtx::addSlash( "share" ) +
1208 Qtx::addSlash( "doc" ) +
1209 Qtx::addSlash( "salome" ) +
1210 Qtx::addSlash( "gui" ) +
1211 Qtx::addSlash( theComponentName ) );
1214 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1215 SUIT_ResourceMgr* resMgr = resourceMgr();
1218 platform = "winapplication";
1220 platform = "application";
1222 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1224 QString quote("\"");
1225 anApp.prepend( quote );
1226 anApp.append( quote );
1229 #if DISABLE_QTXWEBBROWSER
1230 bool useExtBrowser = true;
1232 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1236 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1238 if ( !anApp.isEmpty() ) {
1239 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1243 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1244 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1245 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1246 showPreferences( tr( "PREF_APP" ) );
1250 QStringList parameters;
1251 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1252 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1253 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1254 QProcess::startDetached( "HelpBrowser", parameters );
1259 Sets enable or disable some actions on selection changed.
1261 void LightApp_Application::onSelectionChanged()
1263 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1264 bool canCopy = m ? m->canCopy() : false;
1265 bool canPaste = m ? m->canPaste() : false;
1267 action( EditCopyId )->setEnabled(canCopy);
1268 action( EditPasteId )->setEnabled(canPaste);
1272 SLOT: Performs some actions when dockable windows are triggered
1274 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1278 QWidget* LightApp_Application::dockWindow( const int id ) const
1281 if ( myWin.contains( id ) )
1286 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1291 QDockWidget* dock = 0;
1292 QWidget* w = wid->parentWidget();
1293 while ( w && !dock )
1295 dock = ::qobject_cast<QDockWidget*>( w );
1296 w = w->parentWidget();
1301 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1306 if ( wid != dockWindow( id ) )
1307 removeDockWindow( id );
1309 myWin.insert( id, wid );
1311 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1312 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1314 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1315 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1316 QString( "%1Dock" ).arg( wid->objectName() ) );
1317 dock->setWidget( wid );
1318 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1319 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1320 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1322 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1323 if ( !accel.isEmpty() )
1324 dock->toggleViewAction()->setShortcut( accel );
1329 void LightApp_Application::removeDockWindow( const int id )
1331 QWidget* wid = dockWindow( id );
1337 QDockWidget* dock = windowDock( wid );
1341 dock->setWidget( 0 );
1342 wid->setParent( 0 );
1343 wid->setVisible( false );
1347 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1349 QDockWidget* dock = windowDock( dockWindow( id ) );
1350 if ( dock && desktop() ) {
1351 desktop()->addDockWidget( place, dock );
1352 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1353 if ( a ) a->update();
1359 \param flag - key for window
1360 \param studyId - study id
1361 Flag used how identificator of window in windows list.
1363 QWidget* LightApp_Application::getWindow( const int flag, const int )
1365 QWidget* wid = dockWindow( flag );
1367 insertDockWindow( flag, wid = createWindow( flag ) );
1369 QMap<int, int> winMap;
1370 currentWindows( winMap );
1371 if ( winMap.contains( flag ) )
1372 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1378 \return Object Browser
1380 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1382 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1388 LogWindow* LightApp_Application::logWindow()
1390 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1393 #ifndef DISABLE_PYCONSOLE
1395 This returns the python console integrated to the GUI. Depending
1396 when you request the python console, this function could return
1397 null. Then the optional parameter force (default to false) can be
1398 set to force the creation of the python console if it is not done
1400 \param force - if true, the pythonConsole is created if it does not exist yet
1401 \return Python Console
1403 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1405 QWidget* wid = dockWindow( WT_PyConsole );
1406 if ( !wid && force==true) {
1407 wid = getWindow(WT_PyConsole);
1409 return qobject_cast<PyConsole_Console*>( wid );
1414 Updates object browser and maybe data models
1415 \param updateModels - if it is true, then data models are updated
1417 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1419 // update existing data models
1422 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1423 if ( objectBrowser() )
1424 objectBrowser()->setAutoUpdate( false );
1426 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1428 CAM_Study::ModelList dm_list;
1429 study->dataModels( dm_list );
1430 QListIterator<CAM_DataModel*> it( dm_list );
1431 while ( it.hasNext() ) {
1432 CAM_DataModel* camDM = it.next();
1433 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1434 ((LightApp_DataModel*)camDM)->update();
1438 if( objectBrowser() )
1439 objectBrowser()->setAutoUpdate( isAutoUpdate );
1442 if ( objectBrowser() ) {
1443 objectBrowser()->updateGeometry();
1444 objectBrowser()->updateTree( 0, false );
1451 LightApp_Preferences* LightApp_Application::preferences() const
1453 return preferences( false );
1457 \return first view manager of some type
1458 \param vmType - type of view manager
1459 \param create - is it necessary to create view manager in case, when there is no manager of such type
1461 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1463 SUIT_ViewManager* aVM = viewManager( vmType );
1464 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1465 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1466 if ( anActiveVM && anActiveVM->getType() == vmType )
1468 MESSAGE("aVM = anActiveVM");
1472 if ( aVM && !aVM->getDetached() && create )
1474 if ( !aVM->getActiveView() )
1476 MESSAGE("aVM->createView()");
1481 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1482 desktop()->setActiveWindow( aVM->getActiveView() );
1487 MESSAGE("aVM = createViewManager( vmType )");
1488 aVM = createViewManager( vmType );
1495 Creates view manager of some type
1496 \param vmType - type of view manager
1498 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
1500 SUIT_ResourceMgr* resMgr = resourceMgr();
1502 SUIT_ViewManager* viewMgr = 0;
1503 #ifndef DISABLE_GLVIEWER
1504 if( vmType == GLViewer_Viewer::Type() )
1506 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1507 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1510 #ifndef DISABLE_PLOT2DVIEWER
1511 if( vmType == Plot2d_Viewer::Type() )
1513 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1515 #ifndef DISABLE_SALOMEOBJECT
1516 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1518 new LightApp_Plot2dSelector( v, mySelMgr );
1520 vm = new Plot2d_Viewer();
1522 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1523 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1526 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1527 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1531 #ifndef DISABLE_QXGRAPHVIEWER
1532 if( vmType == QxScene_Viewer::Type() )
1534 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1535 QxScene_Viewer* vm = new QxScene_Viewer();
1536 viewMgr->setViewModel( vm );
1537 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1540 #ifndef DISABLE_GRAPHICSVIEW
1541 if( vmType == GraphicsView_Viewer::Type() )
1543 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1544 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1547 #ifndef DISABLE_PVVIEWER
1548 if( vmType == PVViewer_Viewer::Type() )
1550 if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
1551 viewMgr->getActiveView()->setFocus();
1554 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1558 #ifndef DISABLE_PYVIEWER
1559 if( vmType == PyViewer_Viewer::Type() )
1561 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1564 #ifndef DISABLE_OCCVIEWER
1565 if( vmType == OCCViewer_Viewer::Type() )
1567 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1568 OCCViewer_Viewer* vm;
1569 #ifndef DISABLE_SALOMEOBJECT
1570 vm = new SOCC_Viewer();
1572 vm = new OCCViewer_Viewer( true );
1574 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1575 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1576 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1577 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1578 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1579 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1580 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1581 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1583 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1584 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1585 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1586 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1587 #if OCC_VERSION_LARGE > 0x06090000
1588 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1589 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1590 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1591 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1592 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1593 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1595 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1596 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1597 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1599 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1600 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1601 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1602 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1603 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1604 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1605 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1606 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1609 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1610 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1613 #ifndef DISABLE_VTKVIEWER
1614 #ifndef DISABLE_SALOMEOBJECT
1615 if ( vmType == SVTK_Viewer::Type() )
1617 if ( vmType == VTKViewer_Viewer::Type() )
1620 #ifndef DISABLE_SALOMEOBJECT
1621 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1622 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1625 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1626 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1627 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1628 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1629 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1630 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1631 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1632 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1633 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1634 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1635 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1636 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1637 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1638 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1639 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1640 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1641 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1642 new LightApp_VTKSelector( vm, mySelMgr );
1645 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1646 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1648 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1656 viewMgr->setDetached(detached);
1657 addViewManager( viewMgr );
1658 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1660 if ( viewWin && desktop() ) {
1661 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1662 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1668 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1670 SUIT_ResourceMgr* resMgr = resourceMgr();
1672 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1674 new LightApp_WgViewModel( vmType, w ) );
1675 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1677 addViewManager( vm );
1678 SUIT_ViewWindow* vw = vm->createViewWindow();
1679 if ( vw && desktop() ) {
1680 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1681 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1684 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1685 myUserWmTypes << vmType;
1690 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1692 SUIT_ResourceMgr* resMgr = resourceMgr();
1694 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1698 QString vmType = vm->getType();
1700 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1702 addViewManager( vm );
1703 SUIT_ViewWindow* vw = vm->createViewWindow();
1704 if ( vw && desktop() ) {
1705 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1706 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1709 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1710 myUserWmTypes << vmType;
1716 SLOT: Removes view manager from application
1718 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1720 removeViewManager( theVM );
1724 Protected SLOT: On study created.
1725 \param theStudy - just created study
1727 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1729 SUIT_DataObject* aRoot = 0;
1730 if ( theStudy && theStudy->root() )
1732 aRoot = theStudy->root();
1733 //aRoot->setName( tr( "DATA_MODELS" ) );
1736 getWindow( WT_ObjectBrowser );
1738 loadDockWindowsState();
1740 if ( objectBrowser() )
1741 objectBrowser()->setRoot( aRoot );
1743 activateModule( defaultModule() );
1745 if ( objectBrowser() )
1746 objectBrowser()->openLevels();
1748 #ifndef DISABLE_PYCONSOLE
1749 if( pythonConsole() )
1750 getPyInterp()->initStudy();
1755 Protected SLOT: On study opened.
1756 \param theStudy - just opened study
1758 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1760 SUIT_DataObject* aRoot = 0;
1761 if ( theStudy && theStudy->root() )
1763 aRoot = theStudy->root();
1767 getWindow( WT_ObjectBrowser );
1769 loadDockWindowsState();
1771 if ( objectBrowser() )
1772 objectBrowser()->setRoot( aRoot );
1774 activateModule( defaultModule() );
1776 if ( objectBrowser() )
1777 objectBrowser()->openLevels();
1779 #ifndef DISABLE_PYCONSOLE
1780 if( pythonConsole() )
1781 getPyInterp()->initStudy();
1787 /*!Protected SLOT. On study saved.*/
1788 void LightApp_Application::onStudySaved( SUIT_Study* s )
1790 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1792 mru->insert( s->studyName() );
1797 /*!Protected SLOT. On study closed.*/
1798 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1801 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1802 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1805 // stop auto-save timer
1806 myAutoSaveTimer->stop();
1808 // Bug 10396: clear selection
1809 mySelMgr->clearSelected();
1811 // Bug 12944: emit signal only after clear selection
1814 activateModule( "" );
1817 /*!Protected SLOT.On desktop activated.*/
1818 void LightApp_Application::onDesktopActivated()
1820 CAM_Application::onDesktopActivated();
1821 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1823 aModule->studyActivated();
1826 void LightApp_Application::studyOpened( SUIT_Study* s )
1828 CAM_Application::studyOpened( s );
1831 updateViewManagers();
1834 void LightApp_Application::studySaved( SUIT_Study* s )
1836 CAM_Application::studyOpened( s );
1837 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1838 if ( aResMgr && activeStudy() ) {
1839 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1840 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1844 void LightApp_Application::studyCreated( SUIT_Study* s )
1846 CAM_Application::studyCreated( s );
1849 updateViewManagers();
1852 /*!Gets file filter.
1853 *\retval QString "(*.hdf)"
1855 QString LightApp_Application::getFileFilter( bool /*open*/) const
1861 Shows file dialog and return user selected file name
1863 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1864 const QString& caption, QWidget* parent )
1868 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1869 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1872 /*! Gets directory*/
1873 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1877 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1880 /*! Get open file names*/
1881 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1882 const QString& caption, QWidget* parent )
1886 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1887 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1890 /*!Private SLOT. Update object browser.*/
1891 void LightApp_Application::onRefresh()
1893 updateObjectBrowser( true );
1896 /*!Private SLOT. Update actions after rename object.*/
1897 void LightApp_Application::onRenamed()
1899 activeStudy()->Modified();
1903 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1904 // To prevent reversion the window should be either aligned during movement and resize.
1905 /*!Private SLOT. Update actions after rename object.*/
1906 /*void LightApp_Application::onMoved()
1908 OCCViewer_ViewManager* viewMgr = 0;
1909 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1911 OCCViewer_ViewWindow* view = 0;
1912 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1914 view->getViewPort()->repaintViewAfterMove();
1919 /*!Private SLOT. Support drag-and-drop operation.*/
1920 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1922 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1926 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1928 aModule->dropObjects( objects, parentObj, row, action );
1931 /*!Private SLOT. On preferences.*/
1932 void LightApp_Application::onPreferences()
1934 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1937 /*!Private SLOT. On preferences.*/
1938 void LightApp_Application::showPreferences( const QString& itemText )
1940 QApplication::setOverrideCursor( Qt::WaitCursor );
1942 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1944 QApplication::restoreOverrideCursor();
1949 preferences()->activateItem( itemText );
1951 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1954 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1955 resourceMgr()->save();
1958 shortcutMgr()->updateShortcuts();
1964 /*!Protected SLOT. On preferences changed.*/
1965 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1967 LightApp_Module* sMod = 0;
1968 CAM_Module* mod = module( modName );
1969 if ( mod && mod->inherits( "LightApp_Module" ) )
1970 sMod = (LightApp_Module*)mod;
1973 sMod->preferencesChanged( section, param );
1975 preferencesChanged( section, param );
1976 // emit signal to allow additional preferences changing processing
1977 emit preferenceChanged( modName, section, param );
1980 /*!Remove all windows from study.*/
1981 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1983 saveDockWindowsState();
1985 if ( SUIT_DataBrowser* ob = objectBrowser() )
1988 CAM_Application::beforeCloseDoc( s );
1991 /*!Update actions.*/
1992 void LightApp_Application::updateActions()
1994 updateCommandsStatus();
2000 SUIT_Study* LightApp_Application::createNewStudy()
2002 LightApp_Application::lastStudyId++;
2004 LightApp_Study* aStudy = new LightApp_Study( this );
2006 // Set up processing of major study-related events
2007 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
2008 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
2009 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
2010 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2016 Creates window by flag.
2017 \param flag - identificator of window type
2019 QWidget* LightApp_Application::createWindow( const int flag )
2023 SUIT_ResourceMgr* resMgr = resourceMgr();
2025 if ( flag == WT_ObjectBrowser )
2027 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2028 ob->setObjectName( "objectBrowser" );
2029 ob->setSortMenuEnabled( true );
2030 ob->setAutoUpdate( true );
2031 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2032 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2034 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2035 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2036 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2038 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2039 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2040 treeModel->setSearcher( this );
2041 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2042 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2044 // Mantis issue 0020136: Drag&Drop in OB
2045 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2047 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2048 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2049 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2050 this, SLOT( onRenamed( ) ) );
2054 // temporary commented
2056 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2058 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2061 // Create OBSelector
2062 new LightApp_OBSelector( ob, mySelMgr );
2063 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2064 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2066 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2068 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2069 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2070 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2072 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2074 #ifndef DISABLE_PYCONSOLE
2075 else if ( flag == WT_PyConsole )
2077 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2078 pyCons->setObjectName( "pythonConsole" );
2079 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2080 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2081 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2082 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2083 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2087 else if ( flag == WT_LogWindow )
2089 LogWindow* logWin = new LogWindow( desktop() );
2090 logWin->setObjectName( "logWindow" );
2091 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2092 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2094 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2100 \return default windows( Object Browser, Python Console )
2101 Adds to map \a aMap.
2103 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2105 #ifndef DISABLE_PYCONSOLE
2106 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2108 if ( activeStudy() ) {
2109 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2110 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2114 /*!Default view managers*/
2115 void LightApp_Application::defaultViewManagers( QStringList& ) const
2121 \return preferences.
2122 Create preferences, if \a crt = true.
2124 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2129 LightApp_Application* that = (LightApp_Application*)this;
2131 bool toCreate = !_prefs_ && crt;
2134 _prefs_ = new LightApp_Preferences( resourceMgr() );
2135 that->createPreferences( _prefs_ );
2138 that->myPrefs = _prefs_;
2140 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2141 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2142 connect( myPrefs, SIGNAL( resetToDefaults() ),
2143 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2148 SUIT_ResourceMgr* resMgr = resourceMgr();
2150 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2151 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2153 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2157 QStringList modNameList;
2158 app->modules( modNameList, false );
2160 QMap<QString, QString> iconMap;
2161 app->moduleIconNames( iconMap );
2163 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2165 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2168 int modId = _prefs_->addPreference( *it );
2169 if ( iconMap.contains( *it ) )
2170 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2174 app->modules( modList );
2175 QListIterator<CAM_Module*> itr( modList );
2176 while ( itr.hasNext() )
2178 LightApp_Module* mod = 0;
2180 CAM_Module* anItem = itr.next();
2181 if ( anItem->inherits( "LightApp_Module" ) )
2182 mod = (LightApp_Module*)anItem;
2184 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2186 _prefs_->addPreference( mod->moduleName() );
2187 mod->createPreferences();
2188 that->emptyPreferences( mod->moduleName() );
2192 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2198 Adds new module to application
2200 void LightApp_Application::moduleAdded( CAM_Module* mod )
2202 CAM_Application::moduleAdded( mod );
2204 LightApp_Module* lightMod = 0;
2205 if ( mod && mod->inherits( "LightApp_Module" ) )
2206 lightMod = (LightApp_Module*)mod;
2208 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2210 myPrefs->addPreference( mod->moduleName() );
2211 lightMod->createPreferences();
2212 emptyPreferences( mod->moduleName() );
2216 void LightApp_Application::emptyPreferences( const QString& modName )
2218 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2219 if ( !item || !item->isEmpty() )
2222 // printf( "---------------------> Modify for empty module.\n" );
2224 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2225 frm->setIcon( item->icon() );
2226 frm->setStretch( false );
2227 item->parentItem()->insertItem( frm, item );
2228 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2235 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2240 QStringList aValuesList;
2241 QList<QVariant> anIndicesList;
2245 // . Top-level "SALOME" preferences group <<start>>
2246 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2247 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2249 // .. "General" preferences tab <<start>>
2250 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2252 // ... "Language" group <<start>>
2253 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2254 pref->setItemProperty( "columns", 2, langGroup );
2255 // .... -> application language
2256 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2257 LightApp_Preferences::Selector, "language", "language" );
2258 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2259 QList<QVariant> aIcons;
2260 QList<QVariant> aNumbers;
2261 QStringList aTitles;
2262 foreach ( QString aLang, aLangs ) {
2263 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2265 aTitles << langToName( aLang );
2267 pref->setItemProperty( "strings", aTitles, curLang );
2268 pref->setItemProperty( "ids", aNumbers, curLang );
2269 pref->setItemProperty( "icons", aIcons, curLang );
2270 pref->setItemProperty( "restart", true, curLang );
2272 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2273 LightApp_Preferences::Bool, "language", "locale" );
2274 pref->setItemProperty( "restart", true, curLocale );
2275 // ... "Language" group <<end>>
2277 // ... "Look and feel" group <<start>>
2278 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2279 pref->setItemProperty( "columns", 2, lookGroup );
2280 // .... -> show splash-screen
2281 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2282 // .... -> opaque resize
2283 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2284 // .... -> drop-down buttons
2285 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2286 // ... "Look and feel" group <<end>>
2288 // ... "Study properties" group <<start>>
2289 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2290 pref->setItemProperty( "columns", 2, studyGroup );
2291 // .... -> multi-file save
2292 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2293 // .... -> ascii save mode
2294 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2295 // .... -> store windows geometry
2296 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2297 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2298 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2299 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2300 // .... -> auto-save
2301 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2302 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2303 pref->setItemProperty( "min", 0, autoSaveInterval );
2304 pref->setItemProperty( "max", 1440, autoSaveInterval );
2305 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2306 // ... "Study properties" group <<end>>
2308 // ... "Help browser" group <<start>>
2309 #ifndef DISABLE_QTXWEBBROWSER
2310 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2312 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2316 QString platform = "winapplication";
2318 QString platform = "application";
2320 // .... -> browser application
2321 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2322 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2323 // .... -> browser parameters
2324 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2325 // ... "Help browser" group <<end>>
2327 // ... "Python console properties" group <<start>>
2328 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2329 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2331 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2332 // .... -> show banner
2333 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2334 // .... -> auto-completion
2335 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2336 // ... "Python console properties" group <<end>>
2338 // ... "MRU" preferences group <<start>>
2339 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2340 pref->setItemProperty( "columns", 4, mruGroup );
2341 // number of MRU items
2342 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2343 "MRU", "visible_count" );
2344 pref->setItemProperty( "min", 0, mruVisCount );
2345 pref->setItemProperty( "max", 100, mruVisCount );
2347 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2348 "MRU", "link_type" );
2349 aValuesList.clear();
2350 anIndicesList.clear();
2351 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2352 anIndicesList << 0 << 1 << 2 ;
2353 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2354 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2355 // ... "MRU" preferences group <<end>>
2357 // ... "Full-screen" group <<start>>
2358 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2359 pref->setItemProperty( "columns", 2, fullScreenGroup );
2360 // .... -> automatic hiding toolbars
2361 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2362 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2363 // ... "Full-screen" group <<end>>
2365 // .. "General" preferences tab <<end>>
2367 // .. "3D viewer" group <<start>>
2368 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2369 // ... -> navigation mode
2370 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2371 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2372 aValuesList.clear();
2373 anIndicesList.clear();
2374 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2375 anIndicesList << 0 << 1;
2376 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2377 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2378 // ... -> zooming mode
2379 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2380 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2381 aValuesList.clear();
2382 anIndicesList.clear();
2383 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2384 anIndicesList << 0 << 1;
2385 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2386 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2387 // ... "Trihedron" group <<start>>
2388 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2389 pref->setItemProperty( "columns", 2, occTriGroup );
2390 // .... -> trihedron size
2391 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2392 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2393 pref->setItemProperty( "min", 1.0E-06, occTS );
2394 pref->setItemProperty( "max", 1000, occTS );
2395 // .... -> relative size of trihedron
2396 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2397 // .... -> show static trihedron
2398 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2399 // ... "Trihedron" group <<end>>
2400 // .. "3D viewer" group <<end>>
2404 #ifndef DISABLE_OCCVIEWER
2405 // .. "OCC viewer" group <<start>>
2406 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2408 // .... -> Projection mode
2409 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2410 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2411 aValuesList.clear();
2412 anIndicesList.clear();
2413 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2414 anIndicesList << 0 << 1;
2415 pref->setItemProperty( "strings", aValuesList, occProjMode );
2416 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2417 #if OCC_VERSION_LARGE > 0x06090000
2418 // .... -> Stereo group
2419 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2420 pref->setItemProperty( "columns", 2, stereoGroup );
2421 // .... -> Stereo type
2422 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2423 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2424 aValuesList.clear();
2425 anIndicesList.clear();
2427 OCCViewer_Viewer::stereoData( aValuesList, idList);
2428 foreach( int gid, idList ) anIndicesList << gid;
2429 pref->setItemProperty( "strings", aValuesList, stereoType );
2430 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2432 // .... -> Anaglyph filter
2433 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2434 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2435 aValuesList.clear();
2436 anIndicesList.clear();
2437 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2438 anIndicesList << 0 << 1 << 2;
2440 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2441 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2443 // .... -> Convergence distance type
2444 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2445 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2446 aValuesList.clear();
2447 anIndicesList.clear();
2448 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2449 anIndicesList << 0 << 1;
2450 pref->setItemProperty( "strings", aValuesList, occFocusType );
2451 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2453 // .... -> Stereographic focus value
2454 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2455 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2456 pref->setItemProperty( "precision", 3, focusValue );
2457 pref->setItemProperty( "min", 1.0E-03, focusValue );
2458 pref->setItemProperty( "max", 1.0E03, focusValue );
2459 pref->setItemProperty( "step", 0.05, focusValue );
2462 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2463 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2464 aValuesList.clear();
2465 anIndicesList.clear();
2466 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2467 anIndicesList << 0 << 1;
2468 pref->setItemProperty( "strings", aValuesList, occIODType );
2469 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2471 // .... -> Interocular distance (IOD) value
2472 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2473 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2474 pref->setItemProperty( "precision", 3, IODValue );
2475 pref->setItemProperty( "min", 1.0E-03, IODValue );
2476 pref->setItemProperty( "max", 1.0E03, IODValue );
2477 pref->setItemProperty( "step", 0.05, IODValue );
2479 // .... -> Reverse stereo
2480 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2481 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2482 // .... -> Enable V-Sync
2483 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2484 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2485 // .... -> Enable quad-buffer support
2486 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2487 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2489 // ... "Background" group <<start>>
2490 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2491 // pref->setItemProperty( "columns", 2, bgGroup );
2492 aValuesList.clear();
2493 anIndicesList.clear();
2496 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2497 foreach( int gid, idList ) anIndicesList << gid;
2498 // .... -> 3D viewer background
2499 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2500 LightApp_Preferences::Background, "OCCViewer", "background" );
2501 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2502 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2503 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2504 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2505 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2506 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2507 pref->setItemProperty( "custom_enabled", false, bgId );
2508 pref->setItemProperty( "image_formats", formats, bgId );
2509 // .... -> XZ viewer background
2510 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2511 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2512 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2513 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2514 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2515 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2516 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2517 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2518 pref->setItemProperty( "custom_enabled", false, bgId );
2519 pref->setItemProperty( "image_formats", formats, bgId );
2520 // .... -> YZ viewer background
2521 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2522 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2523 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2524 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2525 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2526 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2527 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2528 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2529 pref->setItemProperty( "custom_enabled", false, bgId );
2530 pref->setItemProperty( "image_formats", formats, bgId );
2531 // .... -> XY viewer background
2532 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2533 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2534 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2535 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2536 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2537 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2538 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2539 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2540 pref->setItemProperty( "custom_enabled", false, bgId );
2541 pref->setItemProperty( "image_formats", formats, bgId );
2542 // ... "Background" group <<end>>
2545 // ... "Selection" group <<start>>
2546 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2547 pref->setItemProperty( "columns", 2, occSelectionGroup );
2548 // .... -> enable preselection
2549 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2550 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2551 // .... -> enable selection
2552 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2553 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2554 // ... "Selection" group <<end>>
2556 // ... "Clipping" group <<start>>
2557 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2558 // .... -> clipping color
2559 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2560 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2561 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2562 pref->setItemProperty( "columns", 2, texturePref );
2563 // .... -> use default texture
2564 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2565 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2566 // .... -> clipping texture
2567 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2568 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2569 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2571 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2572 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2573 // .... -> scale factor
2574 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2575 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2576 pref->setItemProperty( "precision", 3, scaleFactor );
2577 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2578 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2579 pref->setItemProperty( "step", 0.1, scaleFactor );
2580 // ... "Clipping" group <<end>>
2582 // ... "Ray tracing" group <<start>>
2583 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2584 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2585 pref->setItemProperty( "columns", 2, rtPref );
2587 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2588 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2589 pref->setItemProperty( "min", 1, rt_depth );
2590 pref->setItemProperty( "max", 10, rt_depth );
2591 pref->setItemProperty( "step", 1, rt_depth );
2592 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2593 // .... -> specular reflections
2594 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2595 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2596 // .... -> adaptive anti-aliasing
2597 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2598 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2599 // .... -> shadows rendering
2600 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2601 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2602 // .... -> transparent shadow
2603 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2604 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2605 // ... "Ray tracing" group <<end>>
2607 // ... "Light source" group <<start>>
2608 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2609 // .... -> light color
2610 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2611 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2612 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2613 pref->setItemProperty( "columns", 3, directionPref );
2614 // .... -> light direction (dx component)
2615 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2616 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2617 pref->setItemProperty( "precision", 2, light_dx );
2618 pref->setItemProperty( "min", -1.0E03, light_dx );
2619 pref->setItemProperty( "max", 1.0E03, light_dx );
2620 pref->setItemProperty( "step", 0.1, light_dx );
2621 // .... -> light direction (dy component)
2622 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2623 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2624 pref->setItemProperty( "precision", 2, light_dy );
2625 pref->setItemProperty( "min", -1.0E03, light_dy );
2626 pref->setItemProperty( "max", 1.0E03, light_dy );
2627 pref->setItemProperty( "step", 0.1, light_dy );
2628 // .... -> light direction (dz component)
2629 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2630 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2631 pref->setItemProperty( "precision", 2, light_dz );
2632 pref->setItemProperty( "min", -1.0E03, light_dz );
2633 pref->setItemProperty( "max", 1.0E03, light_dz );
2634 pref->setItemProperty( "step", 0.1, light_dz );
2635 // ... "Light source" group <<end>>
2637 // ... -> empty frame (for layout) <<start>>
2638 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2639 pref->setItemProperty( "margin", 0, occGen );
2640 pref->setItemProperty( "columns", 2, occGen );
2641 // ... -> empty frame (for layout) <<end>>
2643 // .. "OCC viewer" group <<end>>
2646 #ifndef DISABLE_VTKVIEWER
2647 // .. "VTK viewer" group <<start>>
2648 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2650 // ... -> empty frame (for layout) <<start>>
2651 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2652 //pref->setItemProperty( "columns", 2, vtkGen );
2653 // .... -> projection mode
2654 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2655 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2656 aValuesList.clear();
2657 anIndicesList.clear();
2658 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2659 anIndicesList << 0 << 1;
2660 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2661 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2663 // .... -> Stereo group
2664 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2665 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2666 // .... -> Stereo type
2667 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2668 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2669 aValuesList.clear();
2670 anIndicesList.clear();
2672 SVTK_Viewer::stereoData( aValuesList, idList);
2673 foreach( int gid, idList ) anIndicesList << gid;
2674 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2675 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2676 // .... -> Anaglyph filter
2677 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2678 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2679 aValuesList.clear();
2680 anIndicesList.clear();
2681 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2682 anIndicesList << 0 << 1 << 2;
2684 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2685 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2687 // .... -> Enable quad-buffer support
2688 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2689 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2691 // .... -> background
2692 aValuesList.clear();
2693 anIndicesList.clear();
2696 #ifndef DISABLE_SALOMEOBJECT
2697 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2699 foreach( int gid, idList ) anIndicesList << gid;
2700 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2701 LightApp_Preferences::Background, "VTKViewer", "background" );
2702 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2703 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2704 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2705 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2706 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2707 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2708 pref->setItemProperty( "custom_enabled", false, bgId );
2709 #ifndef DISABLE_SALOMEOBJECT
2710 pref->setItemProperty( "image_formats", formats, bgId );
2712 // .... -> speed increment
2713 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2714 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2715 pref->setItemProperty( "min", 1, vtkSpeed );
2716 pref->setItemProperty( "max", 1000, vtkSpeed );
2717 // .... -> speed mode
2718 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2719 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2720 aValuesList.clear();
2721 anIndicesList.clear();
2722 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2723 anIndicesList << 0 << 1;
2724 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2725 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2727 // ... "Selection" group <<start>>
2728 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2729 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2730 // .... -> preselection
2731 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2732 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2733 aValuesList.clear();
2734 anIndicesList.clear();
2735 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2736 anIndicesList << 0 << 1 << 2;
2737 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2738 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2739 // .... -> enable selection
2740 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2741 // ... "Selection" group <<end>>
2743 // ... -> empty frame (for layout) <<end>>
2745 // ... space mouse sub-group <<start>>
2746 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2747 //pref->setItemProperty( "columns", 2, vtkSM );
2748 // .... -> decrease speed increment
2749 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2750 LightApp_Preferences::Selector, "VTKViewer",
2751 "spacemouse_func1_btn" );
2752 // .... -> increase speed increment
2753 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2754 LightApp_Preferences::Selector, "VTKViewer",
2755 "spacemouse_func2_btn" );
2756 // .... -> dominant / combined switch
2757 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2758 LightApp_Preferences::Selector, "VTKViewer",
2759 "spacemouse_func5_btn" ); //
2760 aValuesList.clear();
2761 anIndicesList.clear();
2762 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2763 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2764 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2765 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2766 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2767 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2768 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2769 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2770 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2771 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2772 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2773 // ... space mouse sub-group <<end>>
2775 // ... avi recording sub-group <<start>>
2776 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2777 pref->setItemProperty( "columns", 2, vtkRec );
2778 // .... -> recording mode
2779 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2780 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2781 aValuesList.clear();
2782 anIndicesList.clear();
2783 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2784 anIndicesList << 0 << 1;
2785 pref->setItemProperty( "strings", aValuesList, modePref );
2786 pref->setItemProperty( "indexes", anIndicesList, modePref );
2788 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2789 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2790 pref->setItemProperty( "min", 0.1, fpsPref );
2791 pref->setItemProperty( "max", 100, fpsPref );
2793 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2794 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2795 pref->setItemProperty( "min", 1, qualityPref );
2796 pref->setItemProperty( "max", 100, qualityPref );
2797 // .... -> progressive mode
2798 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2799 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2800 // ... avi recording sub-group <<end>>
2802 // ... group names sub-group <<start>>
2803 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2804 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2805 pref->setItemProperty( "columns", 2, vtkGN );
2806 // .... -> text color
2807 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2808 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2809 // .... -> transparency
2810 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2811 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2812 pref->setItemProperty( "min", 0.0, transPref );
2813 pref->setItemProperty( "max", 1.0, transPref );
2814 pref->setItemProperty( "step", 0.1, transPref );
2815 // ... -> group names sub-group <<end>>
2816 // .. "VTK viewer" group <<end>>
2819 // .. "Plot2d viewer" group <<start>>
2820 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2821 //pref->setItemProperty( "columns", 2, plot2dGroup );
2823 // ... -> background
2824 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2825 LightApp_Preferences::Color, "Plot2d", "Background" );
2826 // ... -> selection color
2827 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2828 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2830 // ... "Viewer" group <<start>>
2831 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2833 // .... -> curve type
2834 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2835 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2836 aValuesList.clear();
2837 anIndicesList.clear();
2838 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2839 anIndicesList << 0 << 1 << 2 ;
2840 pref->setItemProperty( "strings", aValuesList, curveType );
2841 pref->setItemProperty( "indexes", anIndicesList, curveType );
2842 // .... -> marker size
2843 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2844 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2845 pref->setItemProperty( "min", 0, markerSize );
2846 pref->setItemProperty( "max", 100, markerSize );
2847 // .... -> horizontal scaling mode
2848 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2849 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2850 aValuesList.clear();
2851 anIndicesList.clear();
2852 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2853 anIndicesList << 0 << 1 ;
2854 pref->setItemProperty( "strings", aValuesList, horScale );
2855 pref->setItemProperty( "indexes", anIndicesList, horScale );
2856 // .... -> vertical scaling mode
2857 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2858 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2859 pref->setItemProperty( "strings", aValuesList, verScale );
2860 pref->setItemProperty( "indexes", anIndicesList, verScale );
2862 // .... -> errors/deviation colot
2863 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2864 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2865 // .... -> deviation markers line size
2866 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2867 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2868 pref->setItemProperty( "min", 1, deviationMarkerLw );
2869 pref->setItemProperty( "max", 5, deviationMarkerLw );
2870 // .... -> deviation markers tick mark size
2871 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2872 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2873 pref->setItemProperty( "min", 1, deviationMarkerTs );
2874 pref->setItemProperty( "max", 5, deviationMarkerTs );
2875 // .... "Viewer" group <<end>>
2877 // ... "Legend" group <<start>>
2878 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2880 // .... -> show legend
2881 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2882 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2883 // .... -> legend position
2884 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2885 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2886 aValuesList.clear();
2887 anIndicesList.clear();
2888 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2889 anIndicesList << 0 << 1 << 2 << 3 ;
2890 pref->setItemProperty( "strings", aValuesList, legendPosition );
2891 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2892 // .... -> Symbol type
2893 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2894 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2895 aValuesList.clear();
2896 anIndicesList.clear();
2897 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2898 anIndicesList << 0 << 1 ;
2899 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2900 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2901 // .... -> legend font
2902 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2903 // ... -> font color
2904 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2905 // ... -> selection font color
2906 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2907 // ... "Legend" group <<end>>
2909 // .. "Plot2d viewer" group <<end>>
2911 // .. "PyViewer" preferences tab <<start>>
2912 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2913 // ... "Font settings" group <<start>>
2914 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2915 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2916 LightApp_Preferences::Font, "PyEditor", "Font" );
2917 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2918 // ... "Font settings" group <<end>>
2919 // ... "Display settings" group <<start>>
2920 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2921 pref->setItemProperty( "columns", 2, pyDispGroup );
2922 // ... -> current line highlight
2923 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2924 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2925 // ... -> text wrapping
2926 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2927 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2928 // ... -> center cursor on scroll
2929 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2930 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2931 // ... -> line numbers area
2932 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2933 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2934 // ... "Display settings" group <<end>>
2935 // ... "Tab settings" group <<start>>
2936 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2937 pref->setItemProperty( "columns", 2, pyTabGroup );
2938 // ... -> tab whitespaces
2939 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2940 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2942 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2943 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2944 // ... "Tab settings" group <<end>>
2945 // ... "Vertical edge settings" group <<start>>
2946 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2947 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2948 // ... -> vertical edge
2949 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2950 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2951 // ... -> number of columns
2952 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2953 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2954 // ... "Vertical edge settings" group <<end>>
2955 // .. "PyEditor" preferences tab <<end>>
2957 // .. "Directories" preferences tab <<start>>
2958 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2959 // ... --> quick directories list
2960 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2961 pref->addPreference( tr( "" ), dirGroup,
2962 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2963 // .. "Directories" preferences tab <<end>>
2965 // .. "Object browser" preferences tab <<start>>
2966 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2968 // ... "Search tool" group <<start>>
2969 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2970 // .... --> auto-hide
2971 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2972 "ObjectBrowser", "auto_hide_search_tool" );
2973 // ... "Search tool" group <<end>>
2975 // ... "Object browser settings" group <<start>>
2976 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2977 pref->setItemProperty( "columns", 2, objSetGroup );
2978 // .... -> auto size first column
2979 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2980 "ObjectBrowser", "auto_size_first" );
2981 // .... -> auto size other columns
2982 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2983 "ObjectBrowser", "auto_size" );
2984 // .... -> resize columns on expand item
2985 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2986 "ObjectBrowser", "resize_on_expand_item" );
2987 // .... -> browse to published object
2988 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2989 "ObjectBrowser", "browse_published_object" );
2990 aValuesList.clear();
2991 anIndicesList.clear();
2992 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2993 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2994 pref->setItemProperty( "strings", aValuesList, browsePublished );
2995 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2996 // ... "Object browser settings" group <<end>>
2997 // .. "Object browser" preferences tab <<end>>
2999 // .. "Shortcuts" preferences tab <<start>>
3000 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3001 // ... "Shortcuts settings" group <<start>>
3002 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3003 pref->addPreference( tr( "" ), shortcutGroup,
3004 LightApp_Preferences::ShortcutTree, "shortcuts" );
3005 // ... "Shortcuts settings" group <<end>>
3006 // .. "Shortcuts" preferences tab <<end>>
3007 // . Top-level "SALOME" preferences group <<end>>
3013 Changes appearance of application according to changed preferences
3014 \param sec - section
3015 \param param - name of changed parameter
3017 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3019 SUIT_ResourceMgr* resMgr = resourceMgr();
3023 if ( sec == "viewers" && param == "drop_down_buttons" )
3025 ViewManagerList vmlist = viewManagers();
3026 foreach( SUIT_ViewManager* vm, vmlist )
3028 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3029 foreach( SUIT_ViewWindow* vw, vwlist )
3030 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3034 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3036 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3037 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3038 QList<SUIT_ViewManager*> lst;
3039 #ifndef DISABLE_OCCVIEWER
3040 viewManagers( OCCViewer_Viewer::Type(), lst );
3041 QListIterator<SUIT_ViewManager*> itOCC( lst );
3042 while ( itOCC.hasNext() && sz >= 0 )
3044 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3045 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3048 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3049 occVM->setTrihedronSize( sz, relative );
3050 occVM->getAISContext()->UpdateCurrentViewer();
3053 #ifndef DISABLE_VTKVIEWER
3054 #ifndef DISABLE_SALOMEOBJECT
3055 viewManagers( SVTK_Viewer::Type(), lst );
3056 QListIterator<SUIT_ViewManager*> itVTK( lst );
3057 while ( itVTK.hasNext() && sz >= 0 )
3059 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3060 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3063 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3066 vtkVM->setTrihedronSize( sz, relative );
3074 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3076 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3077 QList<SUIT_ViewManager*> lst;
3078 #ifndef DISABLE_OCCVIEWER
3079 viewManagers( OCCViewer_Viewer::Type(), lst );
3080 QListIterator<SUIT_ViewManager*> itOCC( lst );
3081 while ( itOCC.hasNext() )
3083 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3084 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3087 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3090 occVM->setStaticTrihedronDisplayed( isVisible );
3094 #ifndef DISABLE_VTKVIEWER
3095 #ifndef DISABLE_SALOMEOBJECT
3096 viewManagers( SVTK_Viewer::Type(), lst );
3097 QListIterator<SUIT_ViewManager*> itVTK( lst );
3098 while ( itVTK.hasNext() )
3100 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3101 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3104 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3107 vtkVM->setStaticTrihedronVisible( isVisible );
3115 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3117 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3118 QList<SUIT_ViewManager*> lst;
3119 #ifndef DISABLE_OCCVIEWER
3120 viewManagers( OCCViewer_Viewer::Type(), lst );
3121 QListIterator<SUIT_ViewManager*> itOCC( lst );
3122 while ( itOCC.hasNext() )
3124 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3125 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3128 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3129 occVM->setInteractionStyle( mode );
3132 #ifndef DISABLE_VTKVIEWER
3133 #ifndef DISABLE_SALOMEOBJECT
3134 viewManagers( SVTK_Viewer::Type(), lst );
3135 QListIterator<SUIT_ViewManager*> itVTK( lst );
3136 while ( itVTK.hasNext() )
3138 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3139 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3142 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3143 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3149 #ifndef DISABLE_OCCVIEWER
3150 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3152 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3153 QList<SUIT_ViewManager*> lst;
3154 viewManagers( OCCViewer_Viewer::Type(), lst );
3155 QListIterator<SUIT_ViewManager*> it( lst );
3156 while ( it.hasNext() )
3158 SUIT_ViewModel* vm = it.next()->getViewModel();
3159 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3162 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3163 occVM->enablePreselection( isToEnablePreselection );
3168 #ifndef DISABLE_OCCVIEWER
3169 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3171 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3172 QList<SUIT_ViewManager*> lst;
3173 viewManagers( OCCViewer_Viewer::Type(), lst );
3174 QListIterator<SUIT_ViewManager*> it( lst );
3175 while ( it.hasNext() )
3177 SUIT_ViewModel* vm = it.next()->getViewModel();
3178 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3181 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3182 occVM->enableSelection( isToEnableSelection );
3187 #ifndef DISABLE_OCCVIEWER
3188 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3190 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3191 QList<SUIT_ViewManager*> lst;
3192 viewManagers( OCCViewer_Viewer::Type(), lst );
3193 QListIterator<SUIT_ViewManager*> it( lst );
3194 while ( it.hasNext() )
3196 SUIT_ViewModel* vm = it.next()->getViewModel();
3197 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3200 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3201 occVM->setClippingColor( aColor );
3206 #ifndef DISABLE_OCCVIEWER
3207 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3208 param == QString( "clipping_texture" ) ||
3209 param == QString( "clipping_modulate" ) ||
3210 param == QString( "clipping_scale" ) ) )
3212 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3213 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3214 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3215 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3216 QList<SUIT_ViewManager*> lst;
3217 viewManagers( OCCViewer_Viewer::Type(), lst );
3218 QListIterator<SUIT_ViewManager*> it( lst );
3219 while ( it.hasNext() )
3221 SUIT_ViewModel* vm = it.next()->getViewModel();
3222 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3225 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3226 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3231 #ifndef DISABLE_OCCVIEWER
3232 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3234 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3235 QList<SUIT_ViewManager*> lst;
3236 viewManagers( OCCViewer_Viewer::Type(), lst );
3237 QListIterator<SUIT_ViewManager*> it( lst );
3238 while ( it.hasNext() )
3240 SUIT_ViewModel* vm = it.next()->getViewModel();
3241 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3244 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3245 occVM->setProjectionType( mode );
3249 #if OCC_VERSION_LARGE > 0x06090000
3250 #ifndef DISABLE_OCCVIEWER
3251 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3253 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3254 QList<SUIT_ViewManager*> lst;
3255 viewManagers( OCCViewer_Viewer::Type(), lst );
3256 QListIterator<SUIT_ViewManager*> it( lst );
3257 while ( it.hasNext() )
3259 SUIT_ViewModel* vm = it.next()->getViewModel();
3260 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3263 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3264 occVM->setStereoType( mode );
3269 #ifndef DISABLE_OCCVIEWER
3270 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3272 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3273 QList<SUIT_ViewManager*> lst;
3274 viewManagers( OCCViewer_Viewer::Type(), lst );
3275 QListIterator<SUIT_ViewManager*> it( lst );
3276 while ( it.hasNext() )
3278 SUIT_ViewModel* vm = it.next()->getViewModel();
3279 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3282 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3283 occVM->setAnaglyphFilter( mode );
3288 #ifndef DISABLE_OCCVIEWER
3289 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3290 param == QString( "focus_value" ) ) )
3292 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3293 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3294 QList<SUIT_ViewManager*> lst;
3295 viewManagers( OCCViewer_Viewer::Type(), lst );
3296 QListIterator<SUIT_ViewManager*> it( lst );
3297 while ( it.hasNext() )
3299 SUIT_ViewModel* vm = it.next()->getViewModel();
3300 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3303 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3304 occVM->setStereographicFocus( aType, aValue );
3309 #ifndef DISABLE_OCCVIEWER
3310 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3311 param == QString( "iod_value" ) ) )
3313 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3314 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3315 QList<SUIT_ViewManager*> lst;
3316 viewManagers( OCCViewer_Viewer::Type(), lst );
3317 QListIterator<SUIT_ViewManager*> it( lst );
3318 while ( it.hasNext() )
3320 SUIT_ViewModel* vm = it.next()->getViewModel();
3321 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3324 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3325 occVM->setInterocularDistance( aType, aValue );
3330 #ifndef DISABLE_OCCVIEWER
3331 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3333 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3334 QList<SUIT_ViewManager*> lst;
3335 viewManagers( OCCViewer_Viewer::Type(), lst );
3336 QListIterator<SUIT_ViewManager*> it( lst );
3337 while ( it.hasNext() )
3339 SUIT_ViewModel* vm = it.next()->getViewModel();
3340 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3343 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3344 occVM->setReverseStereo( reverse );
3349 #ifndef DISABLE_OCCVIEWER
3350 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3352 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3353 QList<SUIT_ViewManager*> lst;
3354 viewManagers( OCCViewer_Viewer::Type(), lst );
3355 QListIterator<SUIT_ViewManager*> it( lst );
3356 while ( it.hasNext() )
3358 SUIT_ViewModel* vm = it.next()->getViewModel();
3359 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3362 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3363 occVM->setVSync( enable );
3368 #ifndef DISABLE_OCCVIEWER
3369 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3371 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3372 QList<SUIT_ViewManager*> lst;
3373 viewManagers( OCCViewer_Viewer::Type(), lst );
3374 QListIterator<SUIT_ViewManager*> it( lst );
3375 while ( it.hasNext() )
3377 SUIT_ViewModel* vm = it.next()->getViewModel();
3378 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3381 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3382 occVM->setQuadBufferSupport( enable );
3387 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3389 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3390 QList<SUIT_ViewManager*> lst;
3391 #ifndef DISABLE_OCCVIEWER
3392 viewManagers( OCCViewer_Viewer::Type(), lst );
3393 QListIterator<SUIT_ViewManager*> itOCC( lst );
3394 while ( itOCC.hasNext() )
3396 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3397 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3400 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3401 occVM->setZoomingStyle( mode );
3404 #ifndef DISABLE_VTKVIEWER
3405 #ifndef DISABLE_SALOMEOBJECT
3406 viewManagers( SVTK_Viewer::Type(), lst );
3407 QListIterator<SUIT_ViewManager*> itVTK( lst );
3408 while ( itVTK.hasNext() )
3410 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3411 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3414 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3415 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3421 #ifndef DISABLE_VTKVIEWER
3422 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3424 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3425 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3426 QList<SUIT_ViewManager*> lst;
3427 #ifndef DISABLE_SALOMEOBJECT
3428 viewManagers( SVTK_Viewer::Type(), lst );
3429 QListIterator<SUIT_ViewManager*> it( lst );
3430 while ( it.hasNext() )
3432 SUIT_ViewModel* vm = it.next()->getViewModel();
3433 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3436 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3437 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3443 #ifndef DISABLE_VTKVIEWER
3444 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3446 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3447 QList<SUIT_ViewManager*> lst;
3448 #ifndef DISABLE_SALOMEOBJECT
3449 viewManagers( SVTK_Viewer::Type(), lst );
3450 QListIterator<SUIT_ViewManager*> it( lst );
3451 while ( it.hasNext() )
3453 SUIT_ViewModel* vm = it.next()->getViewModel();
3454 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3457 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3458 if( vtkVM ) vtkVM->setProjectionMode( mode );
3464 #ifndef DISABLE_VTKVIEWER
3465 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3467 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3468 QList<SUIT_ViewManager*> lst;
3469 #ifndef DISABLE_SALOMEOBJECT
3470 viewManagers( SVTK_Viewer::Type(), lst );
3471 QListIterator<SUIT_ViewManager*> it( lst );
3472 while ( it.hasNext() )
3474 SUIT_ViewModel* vm = it.next()->getViewModel();
3475 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3478 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3479 if( vtkVM ) vtkVM->setStereoType( mode );
3485 #ifndef DISABLE_VTKVIEWER
3486 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3488 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3489 QList<SUIT_ViewManager*> lst;
3490 #ifndef DISABLE_SALOMEOBJECT
3491 viewManagers( SVTK_Viewer::Type(), lst );
3492 QListIterator<SUIT_ViewManager*> it( lst );
3493 while ( it.hasNext() )
3495 SUIT_ViewModel* vm = it.next()->getViewModel();
3496 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3499 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3500 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3506 #ifndef DISABLE_VTKVIEWER
3507 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3509 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3510 QList<SUIT_ViewManager*> lst;
3511 #ifndef DISABLE_SALOMEOBJECT
3512 viewManagers( SVTK_Viewer::Type(), lst );
3513 QListIterator<SUIT_ViewManager*> it( lst );
3514 while ( it.hasNext() )
3516 SUIT_ViewModel* vm = it.next()->getViewModel();
3517 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3520 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3521 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3527 #ifndef DISABLE_VTKVIEWER
3528 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3530 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3531 QList<SUIT_ViewManager*> lst;
3532 #ifndef DISABLE_SALOMEOBJECT
3533 viewManagers( SVTK_Viewer::Type(), lst );
3534 QListIterator<SUIT_ViewManager*> it( lst );
3535 while ( it.hasNext() )
3537 SUIT_ViewModel* vm = it.next()->getViewModel();
3538 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3541 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3542 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3548 #ifndef DISABLE_VTKVIEWER
3549 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3551 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3552 QList<SUIT_ViewManager*> lst;
3553 #ifndef DISABLE_SALOMEOBJECT
3554 viewManagers( SVTK_Viewer::Type(), lst );
3555 QListIterator<SUIT_ViewManager*> it( lst );
3556 while ( it.hasNext() )
3558 SUIT_ViewModel* vm = it.next()->getViewModel();
3559 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3562 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3563 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3569 #ifndef DISABLE_VTKVIEWER
3570 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3571 param == QString( "spacemouse_func2_btn" ) ||
3572 param == QString( "spacemouse_func5_btn" ) ) )
3574 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3575 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3576 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3577 QList<SUIT_ViewManager*> lst;
3578 #ifndef DISABLE_SALOMEOBJECT
3579 viewManagers( SVTK_Viewer::Type(), lst );
3580 QListIterator<SUIT_ViewManager*> it( lst );
3581 while ( it.hasNext() )
3583 SUIT_ViewModel* vm = it.next()->getViewModel();
3584 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3587 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3588 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3593 if( sec=="ObjectBrowser" )
3595 SUIT_DataBrowser* ob = objectBrowser();
3599 if ( param=="auto_size_first" )
3601 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3602 ob->setAutoSizeFirstColumn( autoSizeFirst );
3603 if ( autoSizeFirst )
3604 ob->adjustFirstColumnWidth();
3606 else if ( param=="auto_size" ) {
3607 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3608 ob->setAutoSizeColumns(autoSize);
3610 ob->adjustColumnsWidth();
3612 else if ( param=="resize_on_expand_item" ) {
3613 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3614 ob->setResizeOnExpandItem(resizeOnExpandItem);
3616 else if ( param == "auto_hide_search_tool" ) {
3617 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3623 if( param=="auto_save_interval" ) {
3624 myAutoSaveTimer->stop();
3625 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3626 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3630 #ifndef DISABLE_PYCONSOLE
3631 if( sec=="PyConsole" && pythonConsole() )
3633 if ( param=="font" ) {
3634 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3636 else if ( param=="show_banner" ) {
3637 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3639 else if ( param=="auto_completion" ) {
3640 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3647 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3649 if ( param == "visible_count" )
3650 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3651 else if ( param == "max_count" )
3652 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3653 else if ( param == "insert_mode" )
3654 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3655 else if ( param == "link_type" )
3656 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3657 else if ( param == "show_clear" )
3658 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3659 else if ( param == "show_mru" )
3660 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3663 if ( sec == "language" && param == "language" )
3665 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3666 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3668 if ( sec == "language" && param == "locale")
3670 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3671 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3673 if ( sec == "desktop" && param == "opaque_resize" ) {
3674 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3675 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3676 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3677 // any dockable window can't be docked to the another area, except initial area.
3678 // It is possible to move window to another area, but it always returns to the initial area.
3680 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3681 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3682 // else dopts &= ~QMainWindow::AnimatedDocks;
3683 // desktop()->setDockOptions( dopts );
3684 desktop()->setOpaqueResize( opaqueResize );
3685 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3686 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3689 #ifndef DISABLE_PLOT2DVIEWER
3690 QList<SUIT_ViewManager*> lst;
3691 viewManagers( Plot2d_Viewer::Type(), lst );
3692 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3693 while ( itPlot2d.hasNext() ) {
3694 SUIT_ViewManager* viewMgr = itPlot2d.next();
3695 SUIT_ViewModel* vm = viewMgr->getViewModel();
3696 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3699 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3701 viewMgr->setViewModel( vm );
3702 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3704 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3705 frame->SetPreference();
3714 void LightApp_Application::loadPreferences()
3716 CAM_Application::loadPreferences();
3718 SUIT_ResourceMgr* aResMgr = resourceMgr();
3723 static bool mru_load = true;
3726 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3728 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3729 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3730 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3731 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3732 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3733 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3734 mru->loadLinks( aResMgr, "MRU" );
3740 QStringList mods = aResMgr->parameters( "windows_visibility" );
3741 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3744 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3745 myWinVis.insert( *itr, arr );
3749 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3750 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3751 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3752 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3753 // else dopts &= ~QMainWindow::AnimatedDocks;
3754 // desktop()->setDockOptions( dopts );
3755 desktop()->setOpaqueResize( opaqueResize );
3756 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3757 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3764 void LightApp_Application::savePreferences()
3766 CAM_Application::savePreferences();
3768 saveDockWindowsState();
3770 SUIT_ResourceMgr* aResMgr = resourceMgr();
3775 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3777 mru->saveLinks( aResMgr, "MRU" );
3779 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3780 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3783 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3785 #if GUI_DEVELOPMENT > 0
3786 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3788 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3795 Updates desktop title
3797 void LightApp_Application::updateDesktopTitle()
3799 QString aTitle = applicationName();
3800 QString aVer = applicationVersion();
3801 if ( !aVer.isEmpty() )
3802 aTitle += QString( " " ) + aVer;
3804 if ( activeStudy() ) {
3805 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3806 aTitle += QString( " - [%1]" ).arg( sName );
3809 desktop()->setWindowTitle( aTitle );
3813 \brief Get map of the operations which can be performed
3814 on the module activation.
3816 The method should return the map of the kind \c {<id>:<name>}
3817 where \c <id> is an integer identifier of the operation and
3818 \c <name> is a title for the button to be added to the
3819 dialog box. After user selects the required operation by the
3820 clicking the corresponding button in the dialog box, its identifier
3821 is passed to the moduleActionSelected() method to process
3824 \return map of the operations
3825 \sa moduleActionSelected()
3827 QMap<int, QString> LightApp_Application::activateModuleActions() const
3829 QMap<int, QString> opmap;
3830 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3831 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3836 \brief Called when the used selectes required operation chosen
3837 from "Activate module" dialog box.
3839 Performs the required operation according to the user choice.
3841 \param id operation identifier
3842 \sa activateModuleActions()
3844 void LightApp_Application::moduleActionSelected( const int id )
3859 Updates windows after close document
3861 void LightApp_Application::afterCloseDoc()
3865 CAM_Application::afterCloseDoc();
3869 Updates actions of active module
3871 void LightApp_Application::updateModuleActions()
3874 if ( activeModule() ) {
3875 modName = activeModule()->moduleName();
3876 if ( !isModuleAccessible( modName ) ) {
3877 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3878 foreach( SUIT_Application* app, apps ) {
3879 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3880 if ( lapp && lapp != this )
3881 lapp->removeModuleAction( modName );
3886 LightApp_ModuleAction* moduleAction =
3887 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3889 moduleAction->setActiveModule( modName );
3892 void LightApp_Application::removeModuleAction( const QString& modName )
3894 LightApp_ModuleAction* moduleAction =
3895 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3897 moduleAction->removeModule( modName );
3901 Gets current windows.
3902 \param winMap - output current windows map.
3904 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3907 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3908 ((LightApp_Module*)activeModule())->windows( winMap );
3910 defaultWindows( winMap );
3914 Gets current view managers.
3915 \param lst - output current view managers list.
3917 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3920 if ( !activeStudy() )
3923 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3924 ((LightApp_Module*)activeModule())->viewManagers( lst );
3926 defaultViewManagers( lst );
3932 void LightApp_Application::updateWindows()
3934 QMap<int, int> winMap;
3935 currentWindows( winMap );
3937 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3939 if ( !dockWindow( it.key() ) )
3940 getWindow( it.key() );
3943 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3945 QWidget* wid = it.value();
3946 if ( winMap.contains( it.key() ) )
3947 wid->setVisible( true );
3952 loadDockWindowsState();
3956 Updates view managers
3958 void LightApp_Application::updateViewManagers()
3961 currentViewManagers( lst );
3963 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3964 getViewManager( *it, true );
3968 Loads windows geometry
3970 void LightApp_Application::loadDockWindowsState()
3974 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3975 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3976 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3979 if ( activeModule() )
3980 modName = activeModule()->name();
3981 else if ( activeStudy() )
3982 modName = "nomodule";
3984 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3985 QByteArray aDefaultState;
3986 aResMgr->value( "windows_geometry", modName, aDefaultState );
3987 QByteArray aDefaultVisibility;
3988 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3989 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3990 aResMgr->setWorkingMode( prevMode );
3992 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3995 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3996 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3998 if ( version > Qtx::versionToId( "7.4.1" ) )
3999 aResMgr->value( "windows_geometry", modName , arr );
4001 arr = aDefaultState;
4002 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4003 desktop()->restoreState( aTargetArray );
4006 QStringList mainToolbarsNames;
4007 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4008 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4009 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4011 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4014 QMap<QString, bool> *tbMap = 0;
4015 QMap<QString, bool> *dwMap = 0;
4017 QMap<QString, bool> userTbMap, userDwMap;
4018 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4020 QMap<QString, bool> defaultTbMap, defaultDwMap;
4021 if(hasDefaultVisibility) {
4022 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4028 if(hasDefaultVisibility){
4029 tbMap = &defaultTbMap;
4036 if(hasDefaultVisibility){
4037 dwMap = &defaultDwMap;
4042 QList<QToolBar*> tbList = findToolBars();
4043 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4045 QToolBar* tb = *tit;
4046 if ( tbMap->contains( tb->objectName() ) ) {
4047 tb->setVisible( (*tbMap)[tb->objectName()] );
4053 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4054 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4056 QDockWidget* dw = *dit;
4058 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4059 if ( po != desktop() )
4062 if ( dwMap->contains( dw->objectName() ) )
4063 dw->setVisible( (*dwMap)[dw->objectName()] );
4071 Saves windows geometry
4073 void LightApp_Application::saveDockWindowsState()
4078 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4079 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4081 if( !storeWin && !storeTb )
4085 if ( activeModule() )
4086 modName = activeModule()->name();
4087 else if ( activeStudy() )
4088 modName = "nomodule";
4090 QString versionId = GUI_VERSION_STR;
4091 #if GUI_DEVELOPMENT > 0
4095 QByteArray arr = desktop()->saveState();
4096 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4097 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4100 if ( myWinVis.contains( modName ) )
4101 visArr = myWinVis[modName];
4103 QMap<QString, bool> tbMap, dwMap;
4104 dockWindowsState( visArr, tbMap, dwMap );
4106 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4107 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4110 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4113 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4114 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4116 QDockWidget* wid = *it;
4117 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4120 visArr = dockWindowsState( tbMap, dwMap );
4122 myWinVis.insert( modName, visArr );
4125 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4128 QDataStream stream( &visArr, QIODevice::WriteOnly );
4130 stream << (uchar)ToolBarMarker;
4131 stream << tb.size();
4132 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4134 stream << tit.key();
4135 stream << (uchar)( tit.value() ? 1 : 0 );
4138 stream << (uchar)DockWidgetMarker;
4139 stream << dw.size();
4140 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4142 stream << wit.key();
4143 stream << (uchar)( wit.value() ? 1 : 0 );
4149 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4154 QByteArray visArr = arr;
4155 QDataStream stream( &visArr, QIODevice::ReadOnly );
4159 if ( marker != ToolBarMarker )
4164 for ( int i = 0; i < lines; ++i )
4167 stream >> objectName;
4170 tb.insert( objectName, shown );
4174 if ( marker != DockWidgetMarker )
4178 for ( int j = 0; j < lines; ++j )
4181 stream >> objectName;
4184 dw.insert( objectName, shown );
4189 Adds icon names for modules
4191 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4195 SUIT_ResourceMgr* resMgr = resourceMgr();
4199 QStringList modList;
4200 modules( modList, false );
4202 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4204 QString modName = *it;
4205 QString modIntr = moduleName( modName );
4206 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4208 if ( modIcon.isEmpty() )
4211 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4212 modIcon += QString( ".png" );
4214 iconMap.insert( modName, modIcon );
4219 Inserts items in popup, which necessary for current application
4221 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4224 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4225 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4226 selMgr->setSelectionCacheEnabled( true );
4228 SUIT_DataBrowser* ob = objectBrowser();
4230 CAM_Application::contextMenuPopup( type, thePopup, title );
4232 if ( ob && type == ob->popupClientType() ) {
4233 thePopup->addSeparator();
4234 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4235 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4236 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4239 #ifndef DISABLE_SALOMEOBJECT
4240 if ( selMgr && ob ) {
4241 SALOME_ListIO selected;
4242 selMgr->selectedObjects( selected );
4243 if(selected.Extent() == 1){
4244 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4245 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4246 if(obj && obj->renameAllowed()) {
4247 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4248 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4249 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4250 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4252 QList<QAction*> acts = thePopup->actions();
4253 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4254 thePopup->insertAction(firstAction,a);
4260 selMgr->setSelectionCacheEnabled( cacheIsOn );
4266 void LightApp_Application::createEmptyStudy()
4268 CAM_Application::createEmptyStudy();
4270 if ( objectBrowser() )
4271 objectBrowser()->updateTree();
4273 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4274 if ( aResMgr && activeStudy() ) {
4275 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4276 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4281 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4283 CAM_Application::setDesktop( desk );
4286 connect( desk, SIGNAL( message( const QString& ) ),
4287 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4288 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4289 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4290 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4291 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4297 \param mod - module to be activated
4299 bool LightApp_Application::activateModule( CAM_Module* mod )
4301 bool res = CAM_Application::activateModule( mod );
4303 if ( objectBrowser() )
4304 objectBrowser()->updateTree();
4310 \return keyborad accelerators manager object
4312 SUIT_Accel* LightApp_Application::accel() const
4318 Removes dead widget container from map
4320 void LightApp_Application::onWCDestroyed( QObject* ob )
4322 // remove destroyed widget container from windows map
4323 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4325 if ( itr.value() != ob )
4328 int key = itr.key();
4329 myWin.remove( key );
4334 void LightApp_Application::onMRUActivated( const QString& name )
4336 SUIT_Session* s = SUIT_Session::session();
4337 if ( s && s->activeApplication() == this )
4341 void LightApp_Application::onStylePreferences()
4343 #ifdef USE_SALOME_STYLE
4344 Style_PrefDlg dlg( desktop() );
4347 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4348 #endif // USE_SALOME_STYLE
4351 void LightApp_Application::onFullScreen(){
4352 if(myScreenHelper) {
4353 if(desktop()->isFullScreen())
4354 myScreenHelper->switchToNormalScreen();
4356 myScreenHelper->switchToFullScreen();
4361 Connects just added view manager
4363 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4365 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4366 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4367 CAM_Application::addViewManager( vm );
4371 Remove view manager from memory
4373 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4375 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4376 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4377 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4379 aStudy->removeObjectProperties( vm->getGlobalId() );
4381 CAM_Application::removeViewManager( vm );
4383 LightApp_SelectionMgr* selMgr = selectionMgr();
4384 QList<SUIT_Selector*> selectors;
4385 selMgr->selectors( selectors );
4386 foreach( SUIT_Selector* selector, selectors ) {
4387 if ( selector->owner() == vm->getViewModel() ) {
4392 // IPAL22894: Crash on closing OCC view
4398 Renames active window of desktop
4400 void LightApp_Application::onRenameWindow()
4405 QWidget* w = desktop()->activeWindow();
4410 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4411 if( ok && !name.isEmpty() )
4412 w->setWindowTitle( name );
4416 Closes active window of desktop
4418 void LightApp_Application::onCloseWindow()
4423 QWidget* w = desktop()->activeWindow();
4431 Closes all windows of desktop
4433 void LightApp_Application::onCloseAllWindow()
4435 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4439 QList<SUIT_ViewWindow*> wndList = desk->windows();
4440 SUIT_ViewWindow* wnd;
4441 foreach( wnd, wndList )
4449 Groups all windows of desktop
4451 void LightApp_Application::onGroupAllWindow()
4453 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4457 QtxWorkstack* wgStack = desk->workstack();
4463 \return if the library of module exists
4464 \param moduleTitle - title of module
4466 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4468 if( moduleTitle.isEmpty() )
4471 QString lib = moduleLibrary( moduleTitle );
4473 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4474 bool isPythonModule = lib.contains("SalomePyQtGUI");
4475 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4479 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4480 #elif defined(__APPLE__)
4481 paths = QString(::getenv( "DYLD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4483 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4486 bool isLibFound = false;
4487 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4488 for( ; anIt!=aLast; anIt++ )
4490 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4501 INFOS( "\n****************************************************************" << std::endl
4502 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4503 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4504 << "****************************************************************" << std::endl );
4506 else if ( !isPythonModule && !isPythonLightModule)
4509 if ( isPythonModule || isPythonLightModule)
4511 QString pylib = moduleName( moduleTitle ) + QString(".py");
4512 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4514 // Check the python library
4516 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4518 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4520 bool isPyLib = false, isPyGuiLib = false;
4521 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4522 for( ; anIt!=aLast; anIt++ )
4524 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4525 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4527 if(!isPythonLightModule)
4528 if( !isPyLib && inf.exists() )
4531 if( !isPyGuiLib && infgui.exists() )
4534 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4538 printf( "\n****************************************************************\n" );
4539 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4541 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4543 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4544 printf( "****************************************************************\n" );
4551 \return default name for an active study
4553 void LightApp_Application::setDefaultStudyName( const QString& theName )
4555 QStringList anInfoList;
4556 modules( anInfoList, false );
4558 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4559 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4560 !aStudy->isSaved() )
4562 aStudy->setStudyName( theName );
4563 updateDesktopTitle();
4568 Custom event handler
4570 bool LightApp_Application::event( QEvent* e )
4572 if( e && e->type()==2000 )
4574 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4575 QString* d = ( QString* )ce->data();
4576 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4578 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4579 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4580 showPreferences( tr( "PREF_APP" ) );
4585 return CAM_Application::event( e );
4588 /*! Check data object */
4589 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4593 bool isSuitable = !theObj->entry().isEmpty() &&
4594 !theObj->componentDataType().isEmpty() &&
4595 !theObj->name().isEmpty();
4602 int LightApp_Application::openChoice( const QString& aName )
4604 int choice = CAM_Application::openChoice( aName );
4606 if ( choice == OpenExist ) // The document is already open.
4608 // Do you want to reload it?
4609 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4610 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4611 choice = OpenReload;
4617 bool LightApp_Application::openAction( const int choice, const QString& aName )
4624 STD_Application* app = 0;
4625 SUIT_Session* session = SUIT_Session::session();
4626 QList<SUIT_Application*> appList = session->applications();
4627 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4629 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4630 app = ::qobject_cast<STD_Application*>( *it );
4635 app->onCloseDoc( false );
4636 appList = session->applications();
4637 STD_Application* other = 0;
4638 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4639 other = ::qobject_cast<STD_Application*>( *it );
4642 res = other->onOpenDoc( aName );
4647 res = CAM_Application::openAction( choice, aName );
4654 QStringList LightApp_Application::viewManagersTypes() const
4656 QStringList aTypesList;
4657 aTypesList += myUserWmTypes;
4658 #ifndef DISABLE_GLVIEWER
4659 aTypesList<<GLViewer_Viewer::Type();
4661 #ifndef DISABLE_PLOT2DVIEWER
4662 aTypesList<<Plot2d_Viewer::Type();
4664 #ifndef DISABLE_QXGRAPHVIEWER
4665 aTypesList<<QxScene_Viewer::Type();
4667 #ifndef DISABLE_PVVIEWER
4668 aTypesList<<PVViewer_Viewer::Type();
4670 #ifndef DISABLE_PYVIEWER
4671 aTypesList<<PyViewer_Viewer::Type();
4673 #ifndef DISABLE_OCCVIEWER
4674 aTypesList<<OCCViewer_Viewer::Type();
4676 #ifndef DISABLE_VTKVIEWER
4677 #ifndef DISABLE_SALOMEOBJECT
4678 aTypesList<<SVTK_Viewer::Type();
4680 aTypesList<<VTKViewer_Viewer::Type();
4686 * Removes all view managers of known types
4687 * Other view managers are ignored
4689 void LightApp_Application::clearKnownViewManagers()
4691 QStringList aTypesList = viewManagersTypes();
4692 QList<SUIT_ViewManager*> aMgrList;
4693 viewManagers( aMgrList );
4694 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4695 if (aTypesList.contains(aMgr->getType()))
4696 removeViewManager(aMgr);
4701 Copy of current selection
4703 void LightApp_Application::onCopy()
4705 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4711 Paste of current data in clipboard
4713 void LightApp_Application::onPaste()
4715 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4721 Browse (i.e. set focus on) the published objects
4722 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4723 has been accepted by Ok (or Apply & Close) button
4724 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4725 (to select the first published object only)
4726 \return entry of the selected object
4728 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4729 const bool theIsApplyAndClose,
4730 const bool theIsOptimizedBrowsing )
4733 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4735 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4736 switch( aBrowsePolicy )
4740 case BP_ApplyAndClose:
4741 if( !theIsApplyAndClose )
4749 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4753 SUIT_DataBrowser* anOB = objectBrowser();
4757 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4761 QStringListIterator anIter( theEntryList );
4762 if( theIsOptimizedBrowsing )
4764 // go to the last entry
4766 if( anIter.hasPrevious() )
4770 // scroll to each entry in the list
4771 // (in optimized mode - to the last entry only)
4773 LightApp_DataObject* anObject = 0;
4774 while( anIter.hasNext() )
4776 anEntry = anIter.next();
4777 if( !anEntry.isEmpty() )
4779 anObject = aStudy->findObjectByEntry( anEntry );
4782 QModelIndex anIndex = aModel->index( anObject );
4783 anOB->treeView()->scrollTo( anIndex );
4788 // always select the last object
4789 if( anObject && !anEntry.isEmpty() )
4791 QList<SUIT_Selector*> aSelectorList;
4792 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4793 if( !aSelectorList.isEmpty() )
4795 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4797 bool anIsAutoBlock = aSelector->autoBlock();
4799 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4800 aSelector->setAutoBlock( false );
4802 SUIT_DataOwnerPtrList aList;
4803 #ifndef DISABLE_SALOMEOBJECT
4804 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4805 ( anObject->entry().toLatin1().constData(),
4806 anObject->componentDataType().toLatin1().constData(),
4807 anObject->name().toLatin1().constData() );
4808 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4810 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4813 aList.append( owner );
4814 selectionMgr()->setSelected( aList );
4817 // restore auto block flag
4818 aSelector->setAutoBlock( anIsAutoBlock );
4826 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4828 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4829 return study ? study->findObjectByEntry( id ) : 0;
4833 Checks that an object can be renamed.
4834 \param entry entry of the object
4835 \brief Return \c true if object can be renamed
4837 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4842 Rename object by entry.
4843 \param entry entry of the object
4844 \param name new name of the object
4845 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4847 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4851 /*! Process standard messages from desktop */
4852 void LightApp_Application::onDesktopMessage( const QString& message )
4854 const QString sectionSeparator = "/";
4856 if ( message.toLower() == "updateobjectbrowser" ||
4857 message.toLower() == "updateobjbrowser" ) {
4858 // update object browser
4859 updateObjectBrowser();
4861 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4862 QString vtype = message.split( sectionSeparator ).last();
4863 if ( !vtype.isEmpty() )
4864 getViewManager( vtype, true );
4867 QStringList data = message.split( sectionSeparator );
4868 if ( data.count() > 1 ) {
4869 QString msgType = data[0].trimmed();
4870 LightApp_Module* sMod = 0;
4871 CAM_Module* mod = module( msgType );
4873 mod = module( moduleTitle( msgType ) );
4874 if ( mod && mod->inherits( "LightApp_Module" ) )
4875 sMod = (LightApp_Module*)mod;
4877 if ( msgType.toLower() == "preferences" ) {
4878 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4879 // for example "preferences/Study/multi_file_dump/true"
4880 if ( data.count() > 3 ) {
4881 QString section = data[1].trimmed();
4882 QString param = data[2].trimmed();
4883 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4884 resourceMgr()->setValue( section, param, value );
4888 // received message for the module
4889 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4890 sMod->message( msg );
4898 Returns all top level toolbars.
4899 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4901 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4903 QList<QToolBar*> aResult;
4904 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4905 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4906 QToolBar* tb = *tit;
4907 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4908 if ( po != desktop() )
4910 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4917 Internal method to parse toolbars and dockable windows state.
4919 QByteArray LightApp_Application::processState(QByteArray& input,
4920 const bool processWin,
4921 const bool processTb,
4922 const bool isRestoring,
4923 QByteArray defaultState) {
4926 bool hasDefaultState = !defaultState.isEmpty();
4927 bool isDockWinWriten = false;
4929 //Write date from users settings
4931 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4932 int marker, version;
4934 tmpInputData >> marker;
4935 tmpInputData >> version;
4936 tmpInputData >> dockmarker;
4937 tmpInputData >> nbDocWin;
4939 if(processWin && processTb && !isRestoring) {
4941 } else if(!processWin && !processTb ) {
4943 aRes = defaultState;
4945 QDataStream aData(&aRes, QIODevice::WriteOnly);
4946 QList<QToolBar*> aToolBars = findToolBars();
4949 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4950 QToolBar* tb = *tit;
4951 aNames.append(tb->objectName());
4954 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4955 if(toolBarMarkerIndex < 0)
4957 QDataStream anInputData(&input, QIODevice::ReadOnly);
4959 int toolBarMarkerIndexDef;
4960 if(hasDefaultState) {
4961 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4962 if(toolBarMarkerIndexDef < 0)
4965 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4967 QDataStream* aTargetData = 0;
4968 int aTargetIndex = -1;
4970 QByteArray currentArr = desktop()->saveState();
4971 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4972 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4973 if(processWin && useInputData) {
4974 aTargetData = &anInputData;
4975 aTargetIndex = toolBarMarkerIndex;
4977 //Write date from default settings
4978 if(hasDefaultState) {
4979 aTargetData = &anInputDataDef;
4980 aTargetIndex = toolBarMarkerIndexDef;
4982 //If no default state, write current snapshot of the dockable windows
4984 aTargetData = &anInputDataCur;
4985 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4986 aTargetIndex = toolBarMarkerIndexCur;
4991 if(aTargetData && aTargetIndex >= 0 ) {
4992 aTargetData->device()->seek(0);
4993 while( aTargetData->device()->pos() < aTargetIndex ) {
4998 isDockWinWriten = true;
5005 aTargetData = &anInputData;
5006 aTargetIndex = toolBarMarkerIndex;
5008 if(hasDefaultState) {
5009 aTargetData = &anInputDataDef;
5010 aTargetIndex = toolBarMarkerIndexDef;
5014 if(aTargetData && aTargetIndex >= 0) {
5016 if(!isDockWinWriten ) {
5017 //Write version marker
5018 int marker, version;
5019 aTargetData->device()->seek(0);
5020 *aTargetData >> marker;
5021 *aTargetData >> version;
5024 aData << (uchar) QDockWidgetMarker;
5026 int shift = 4*sizeof(int) + sizeof(QSize);
5027 index = aTargetIndex - shift;
5029 index = aTargetIndex;
5032 aTargetData->device()->seek(index);
5033 while(!aTargetData->atEnd()) {
5038 } else { // Not treat toolbars
5039 aData << (uchar) QToolBarMarker;
5040 aData << (int) 0; //Nb toolbars = 0
5047 \brief Emits operationFinished signal.
5048 \param theModuleName the name of the module which perfomed the operation
5049 \param theOperationName the operation name
5050 \param theEntryList the list of the created objects entries
5052 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5053 const QString& theOperationName,
5054 const QStringList& theEntryList )
5056 emit operationFinished( theModuleName, theOperationName, theEntryList );
5060 Update visibility state of given objects
5062 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5063 SUIT_ViewModel* theViewModel )
5065 if ( !theViewModel || theList.isEmpty() ) return;
5067 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5068 if ( !aStudy ) return;
5070 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5072 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5073 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5075 if ( !obj || aStudy->isComponent( obj->entry() ) )
5078 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5079 if ( anObjModule ) {
5080 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5082 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5083 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5084 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5085 anObjState = Qtx::ShownState;
5087 anObjState = Qtx::HiddenState;
5089 aStudy->setVisibilityState( obj->entry(), anObjState );
5096 * Called when window activated
5098 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5100 SUIT_DataBrowser* anOB = objectBrowser();
5103 SUIT_DataObject* rootObj = anOB->root();
5107 DataObjectList listObj = rootObj->children( true );
5109 SUIT_ViewModel* vmod = 0;
5110 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5111 vmod = vman->getViewModel();
5112 updateVisibilityState( listObj, vmod );
5116 Called then view manager removed
5118 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5120 ViewManagerList lst;
5121 viewManagers( lst );
5122 if ( lst.count() == 1) { // in case if closed last view window
5123 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5125 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5130 Check existing document.
5132 bool LightApp_Application::checkExistingDoc()
5135 if( activeStudy() ) {
5136 int answer = SUIT_MessageBox::question( desktop(),
5137 tr( "APPCLOSE_CAPTION" ),
5138 tr( "STUDYCLOSE_DESCRIPTION" ),
5139 tr( "APPCLOSE_SAVE" ),
5140 tr( "APPCLOSE_CLOSE" ),
5141 tr( "APPCLOSE_CANCEL" ), 0 );
5143 if ( activeStudy()->isSaved() ) {
5146 } else if ( onSaveAsDoc() ) {
5147 if( !closeDoc( false ) ) {
5154 else if( answer == 1 ) {
5156 } else if( answer == 2 ) {
5163 #ifndef DISABLE_PYCONSOLE
5165 PyConsole_Interp* LightApp_Application::getPyInterp()
5167 static PyConsole_Interp* myInterp = 0;
5169 myInterp = createPyInterp();
5170 myInterp->initialize();
5175 PyConsole_Interp* LightApp_Application::createPyInterp()
5177 return new PyConsole_Interp();
5180 #endif // DISABLE_PYCONSOLE