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 && 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 )
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 addViewManager( viewMgr );
1657 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1659 if ( viewWin && desktop() ) {
1660 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1661 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1667 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1669 SUIT_ResourceMgr* resMgr = resourceMgr();
1671 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1673 new LightApp_WgViewModel( vmType, w ) );
1674 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1676 addViewManager( vm );
1677 SUIT_ViewWindow* vw = vm->createViewWindow();
1678 if ( vw && desktop() ) {
1679 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1680 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1683 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1684 myUserWmTypes << vmType;
1689 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1691 SUIT_ResourceMgr* resMgr = resourceMgr();
1693 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1697 QString vmType = vm->getType();
1699 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1701 addViewManager( vm );
1702 SUIT_ViewWindow* vw = vm->createViewWindow();
1703 if ( vw && desktop() ) {
1704 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1705 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1708 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1709 myUserWmTypes << vmType;
1715 SLOT: Removes view manager from application
1717 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1719 removeViewManager( theVM );
1723 Protected SLOT: On study created.
1724 \param theStudy - just created study
1726 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1728 SUIT_DataObject* aRoot = 0;
1729 if ( theStudy && theStudy->root() )
1731 aRoot = theStudy->root();
1732 //aRoot->setName( tr( "DATA_MODELS" ) );
1735 getWindow( WT_ObjectBrowser );
1737 loadDockWindowsState();
1739 if ( objectBrowser() )
1740 objectBrowser()->setRoot( aRoot );
1742 activateModule( defaultModule() );
1744 if ( objectBrowser() )
1745 objectBrowser()->openLevels();
1747 #ifndef DISABLE_PYCONSOLE
1748 if( pythonConsole() )
1749 getPyInterp()->initStudy();
1754 Protected SLOT: On study opened.
1755 \param theStudy - just opened study
1757 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1759 SUIT_DataObject* aRoot = 0;
1760 if ( theStudy && theStudy->root() )
1762 aRoot = theStudy->root();
1766 getWindow( WT_ObjectBrowser );
1768 loadDockWindowsState();
1770 if ( objectBrowser() )
1771 objectBrowser()->setRoot( aRoot );
1773 activateModule( defaultModule() );
1775 if ( objectBrowser() )
1776 objectBrowser()->openLevels();
1778 #ifndef DISABLE_PYCONSOLE
1779 if( pythonConsole() )
1780 getPyInterp()->initStudy();
1786 /*!Protected SLOT. On study saved.*/
1787 void LightApp_Application::onStudySaved( SUIT_Study* s )
1789 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1791 mru->insert( s->studyName() );
1796 /*!Protected SLOT. On study closed.*/
1797 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1800 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1801 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1804 // stop auto-save timer
1805 myAutoSaveTimer->stop();
1807 // Bug 10396: clear selection
1808 mySelMgr->clearSelected();
1810 // Bug 12944: emit signal only after clear selection
1813 activateModule( "" );
1816 /*!Protected SLOT.On desktop activated.*/
1817 void LightApp_Application::onDesktopActivated()
1819 CAM_Application::onDesktopActivated();
1820 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1822 aModule->studyActivated();
1825 void LightApp_Application::studyOpened( SUIT_Study* s )
1827 CAM_Application::studyOpened( s );
1830 updateViewManagers();
1833 void LightApp_Application::studySaved( SUIT_Study* s )
1835 CAM_Application::studyOpened( s );
1836 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1837 if ( aResMgr && activeStudy() ) {
1838 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1839 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1843 void LightApp_Application::studyCreated( SUIT_Study* s )
1845 CAM_Application::studyCreated( s );
1848 updateViewManagers();
1851 /*!Gets file filter.
1852 *\retval QString "(*.hdf)"
1854 QString LightApp_Application::getFileFilter( bool /*open*/) const
1860 Shows file dialog and return user selected file name
1862 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1863 const QString& caption, QWidget* parent )
1867 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1868 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1871 /*! Gets directory*/
1872 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1876 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1879 /*! Get open file names*/
1880 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1881 const QString& caption, QWidget* parent )
1885 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1886 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1889 /*!Private SLOT. Update object browser.*/
1890 void LightApp_Application::onRefresh()
1892 updateObjectBrowser( true );
1895 /*!Private SLOT. Update actions after rename object.*/
1896 void LightApp_Application::onRenamed()
1898 activeStudy()->Modified();
1902 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1903 // To prevent reversion the window should be either aligned during movement and resize.
1904 /*!Private SLOT. Update actions after rename object.*/
1905 /*void LightApp_Application::onMoved()
1907 OCCViewer_ViewManager* viewMgr = 0;
1908 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1910 OCCViewer_ViewWindow* view = 0;
1911 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1913 view->getViewPort()->repaintViewAfterMove();
1918 /*!Private SLOT. Support drag-and-drop operation.*/
1919 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1921 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1925 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1927 aModule->dropObjects( objects, parentObj, row, action );
1930 /*!Private SLOT. On preferences.*/
1931 void LightApp_Application::onPreferences()
1933 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1936 /*!Private SLOT. On preferences.*/
1937 void LightApp_Application::showPreferences( const QString& itemText )
1939 QApplication::setOverrideCursor( Qt::WaitCursor );
1941 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1943 QApplication::restoreOverrideCursor();
1948 preferences()->activateItem( itemText );
1950 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1953 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1954 resourceMgr()->save();
1957 shortcutMgr()->updateShortcuts();
1963 /*!Protected SLOT. On preferences changed.*/
1964 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1966 LightApp_Module* sMod = 0;
1967 CAM_Module* mod = module( modName );
1968 if ( mod && mod->inherits( "LightApp_Module" ) )
1969 sMod = (LightApp_Module*)mod;
1972 sMod->preferencesChanged( section, param );
1974 preferencesChanged( section, param );
1975 // emit signal to allow additional preferences changing processing
1976 emit preferenceChanged( modName, section, param );
1979 /*!Remove all windows from study.*/
1980 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1982 saveDockWindowsState();
1984 if ( SUIT_DataBrowser* ob = objectBrowser() )
1987 CAM_Application::beforeCloseDoc( s );
1990 /*!Update actions.*/
1991 void LightApp_Application::updateActions()
1993 updateCommandsStatus();
1999 SUIT_Study* LightApp_Application::createNewStudy()
2001 LightApp_Application::lastStudyId++;
2003 LightApp_Study* aStudy = new LightApp_Study( this );
2005 // Set up processing of major study-related events
2006 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
2007 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
2008 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
2009 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2015 Creates window by flag.
2016 \param flag - identificator of window type
2018 QWidget* LightApp_Application::createWindow( const int flag )
2022 SUIT_ResourceMgr* resMgr = resourceMgr();
2024 if ( flag == WT_ObjectBrowser )
2026 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2027 ob->setObjectName( "objectBrowser" );
2028 ob->setSortMenuEnabled( true );
2029 ob->setAutoUpdate( true );
2030 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2031 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2033 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2034 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2035 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2037 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2038 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2039 treeModel->setSearcher( this );
2040 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2041 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2043 // Mantis issue 0020136: Drag&Drop in OB
2044 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2046 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2047 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2048 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2049 this, SLOT( onRenamed( ) ) );
2053 // temporary commented
2055 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2057 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2060 // Create OBSelector
2061 new LightApp_OBSelector( ob, mySelMgr );
2062 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2063 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2065 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2067 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2068 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2069 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2071 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2073 #ifndef DISABLE_PYCONSOLE
2074 else if ( flag == WT_PyConsole )
2076 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2077 pyCons->setObjectName( "pythonConsole" );
2078 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2079 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2080 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2081 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2082 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2086 else if ( flag == WT_LogWindow )
2088 LogWindow* logWin = new LogWindow( desktop() );
2089 logWin->setObjectName( "logWindow" );
2090 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2091 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2093 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2099 \return default windows( Object Browser, Python Console )
2100 Adds to map \a aMap.
2102 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2104 #ifndef DISABLE_PYCONSOLE
2105 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2107 if ( activeStudy() ) {
2108 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2109 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2113 /*!Default view managers*/
2114 void LightApp_Application::defaultViewManagers( QStringList& ) const
2120 \return preferences.
2121 Create preferences, if \a crt = true.
2123 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2128 LightApp_Application* that = (LightApp_Application*)this;
2130 bool toCreate = !_prefs_ && crt;
2133 _prefs_ = new LightApp_Preferences( resourceMgr() );
2134 that->createPreferences( _prefs_ );
2137 that->myPrefs = _prefs_;
2139 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2140 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2141 connect( myPrefs, SIGNAL( resetToDefaults() ),
2142 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2147 SUIT_ResourceMgr* resMgr = resourceMgr();
2149 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2150 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2152 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2156 QStringList modNameList;
2157 app->modules( modNameList, false );
2159 QMap<QString, QString> iconMap;
2160 app->moduleIconNames( iconMap );
2162 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2164 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2167 int modId = _prefs_->addPreference( *it );
2168 if ( iconMap.contains( *it ) )
2169 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2173 app->modules( modList );
2174 QListIterator<CAM_Module*> itr( modList );
2175 while ( itr.hasNext() )
2177 LightApp_Module* mod = 0;
2179 CAM_Module* anItem = itr.next();
2180 if ( anItem->inherits( "LightApp_Module" ) )
2181 mod = (LightApp_Module*)anItem;
2183 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2185 _prefs_->addPreference( mod->moduleName() );
2186 mod->createPreferences();
2187 that->emptyPreferences( mod->moduleName() );
2191 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2197 Adds new module to application
2199 void LightApp_Application::moduleAdded( CAM_Module* mod )
2201 CAM_Application::moduleAdded( mod );
2203 LightApp_Module* lightMod = 0;
2204 if ( mod && mod->inherits( "LightApp_Module" ) )
2205 lightMod = (LightApp_Module*)mod;
2207 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2209 myPrefs->addPreference( mod->moduleName() );
2210 lightMod->createPreferences();
2211 emptyPreferences( mod->moduleName() );
2215 void LightApp_Application::emptyPreferences( const QString& modName )
2217 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2218 if ( !item || !item->isEmpty() )
2221 // printf( "---------------------> Modify for empty module.\n" );
2223 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2224 frm->setIcon( item->icon() );
2225 frm->setStretch( false );
2226 item->parentItem()->insertItem( frm, item );
2227 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2234 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2239 QStringList aValuesList;
2240 QList<QVariant> anIndicesList;
2244 // . Top-level "SALOME" preferences group <<start>>
2245 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2246 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2248 // .. "General" preferences tab <<start>>
2249 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2251 // ... "Language" group <<start>>
2252 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2253 pref->setItemProperty( "columns", 2, langGroup );
2254 // .... -> application language
2255 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2256 LightApp_Preferences::Selector, "language", "language" );
2257 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2258 QList<QVariant> aIcons;
2259 QList<QVariant> aNumbers;
2260 QStringList aTitles;
2261 foreach ( QString aLang, aLangs ) {
2262 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2264 aTitles << langToName( aLang );
2266 pref->setItemProperty( "strings", aTitles, curLang );
2267 pref->setItemProperty( "ids", aNumbers, curLang );
2268 pref->setItemProperty( "icons", aIcons, curLang );
2269 pref->setItemProperty( "restart", true, curLang );
2271 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2272 LightApp_Preferences::Bool, "language", "locale" );
2273 pref->setItemProperty( "restart", true, curLocale );
2274 // ... "Language" group <<end>>
2276 // ... "Look and feel" group <<start>>
2277 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2278 pref->setItemProperty( "columns", 2, lookGroup );
2279 // .... -> show splash-screen
2280 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2281 // .... -> opaque resize
2282 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2283 // .... -> drop-down buttons
2284 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2285 // ... "Look and feel" group <<end>>
2287 // ... "Study properties" group <<start>>
2288 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2289 pref->setItemProperty( "columns", 2, studyGroup );
2290 // .... -> multi-file save
2291 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2292 // .... -> ascii save mode
2293 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2294 // .... -> store windows geometry
2295 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2296 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2297 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2298 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2299 // .... -> auto-save
2300 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2301 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2302 pref->setItemProperty( "min", 0, autoSaveInterval );
2303 pref->setItemProperty( "max", 1440, autoSaveInterval );
2304 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2305 // ... "Study properties" group <<end>>
2307 // ... "Help browser" group <<start>>
2308 #ifndef DISABLE_QTXWEBBROWSER
2309 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2311 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2315 QString platform = "winapplication";
2317 QString platform = "application";
2319 // .... -> browser application
2320 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2321 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2322 // .... -> browser parameters
2323 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2324 // ... "Help browser" group <<end>>
2326 // ... "Python console properties" group <<start>>
2327 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2328 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2330 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2331 // .... -> show banner
2332 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2333 // .... -> auto-completion
2334 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2335 // ... "Python console properties" group <<end>>
2337 // ... "MRU" preferences group <<start>>
2338 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2339 pref->setItemProperty( "columns", 4, mruGroup );
2340 // number of MRU items
2341 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2342 "MRU", "visible_count" );
2343 pref->setItemProperty( "min", 0, mruVisCount );
2344 pref->setItemProperty( "max", 100, mruVisCount );
2346 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2347 "MRU", "link_type" );
2348 aValuesList.clear();
2349 anIndicesList.clear();
2350 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2351 anIndicesList << 0 << 1 << 2 ;
2352 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2353 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2354 // ... "MRU" preferences group <<end>>
2356 // ... "Full-screen" group <<start>>
2357 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2358 pref->setItemProperty( "columns", 2, fullScreenGroup );
2359 // .... -> automatic hiding toolbars
2360 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2361 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2362 // ... "Full-screen" group <<end>>
2364 // .. "General" preferences tab <<end>>
2366 // .. "3D viewer" group <<start>>
2367 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2368 // ... -> navigation mode
2369 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2370 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2371 aValuesList.clear();
2372 anIndicesList.clear();
2373 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2374 anIndicesList << 0 << 1;
2375 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2376 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2377 // ... -> zooming mode
2378 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2379 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2380 aValuesList.clear();
2381 anIndicesList.clear();
2382 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2383 anIndicesList << 0 << 1;
2384 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2385 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2386 // ... "Trihedron" group <<start>>
2387 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2388 pref->setItemProperty( "columns", 2, occTriGroup );
2389 // .... -> trihedron size
2390 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2391 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2392 pref->setItemProperty( "min", 1.0E-06, occTS );
2393 pref->setItemProperty( "max", 1000, occTS );
2394 // .... -> relative size of trihedron
2395 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2396 // .... -> show static trihedron
2397 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2398 // ... "Trihedron" group <<end>>
2399 // .. "3D viewer" group <<end>>
2403 #ifndef DISABLE_OCCVIEWER
2404 // .. "OCC viewer" group <<start>>
2405 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2407 // .... -> Projection mode
2408 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2409 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2410 aValuesList.clear();
2411 anIndicesList.clear();
2412 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2413 anIndicesList << 0 << 1;
2414 pref->setItemProperty( "strings", aValuesList, occProjMode );
2415 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2416 #if OCC_VERSION_LARGE > 0x06090000
2417 // .... -> Stereo group
2418 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2419 pref->setItemProperty( "columns", 2, stereoGroup );
2420 // .... -> Stereo type
2421 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2422 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2423 aValuesList.clear();
2424 anIndicesList.clear();
2426 OCCViewer_Viewer::stereoData( aValuesList, idList);
2427 foreach( int gid, idList ) anIndicesList << gid;
2428 pref->setItemProperty( "strings", aValuesList, stereoType );
2429 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2431 // .... -> Anaglyph filter
2432 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2433 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2434 aValuesList.clear();
2435 anIndicesList.clear();
2436 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2437 anIndicesList << 0 << 1 << 2;
2439 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2440 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2442 // .... -> Convergence distance type
2443 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2444 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2445 aValuesList.clear();
2446 anIndicesList.clear();
2447 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2448 anIndicesList << 0 << 1;
2449 pref->setItemProperty( "strings", aValuesList, occFocusType );
2450 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2452 // .... -> Stereographic focus value
2453 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2454 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2455 pref->setItemProperty( "precision", 3, focusValue );
2456 pref->setItemProperty( "min", 1.0E-03, focusValue );
2457 pref->setItemProperty( "max", 1.0E03, focusValue );
2458 pref->setItemProperty( "step", 0.05, focusValue );
2461 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2462 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2463 aValuesList.clear();
2464 anIndicesList.clear();
2465 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2466 anIndicesList << 0 << 1;
2467 pref->setItemProperty( "strings", aValuesList, occIODType );
2468 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2470 // .... -> Interocular distance (IOD) value
2471 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2472 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2473 pref->setItemProperty( "precision", 3, IODValue );
2474 pref->setItemProperty( "min", 1.0E-03, IODValue );
2475 pref->setItemProperty( "max", 1.0E03, IODValue );
2476 pref->setItemProperty( "step", 0.05, IODValue );
2478 // .... -> Reverse stereo
2479 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2480 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2481 // .... -> Enable V-Sync
2482 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2483 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2484 // .... -> Enable quad-buffer support
2485 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2486 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2488 // ... "Background" group <<start>>
2489 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2490 // pref->setItemProperty( "columns", 2, bgGroup );
2491 aValuesList.clear();
2492 anIndicesList.clear();
2495 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2496 foreach( int gid, idList ) anIndicesList << gid;
2497 // .... -> 3D viewer background
2498 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2499 LightApp_Preferences::Background, "OCCViewer", "background" );
2500 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2501 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2502 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2503 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2504 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2505 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2506 pref->setItemProperty( "custom_enabled", false, bgId );
2507 pref->setItemProperty( "image_formats", formats, bgId );
2508 // .... -> XZ viewer background
2509 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2510 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2511 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2512 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2513 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2514 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2515 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2516 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2517 pref->setItemProperty( "custom_enabled", false, bgId );
2518 pref->setItemProperty( "image_formats", formats, bgId );
2519 // .... -> YZ viewer background
2520 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2521 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2522 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2523 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2524 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2525 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2526 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2527 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2528 pref->setItemProperty( "custom_enabled", false, bgId );
2529 pref->setItemProperty( "image_formats", formats, bgId );
2530 // .... -> XY viewer background
2531 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2532 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2533 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2534 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2535 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2536 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2537 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2538 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2539 pref->setItemProperty( "custom_enabled", false, bgId );
2540 pref->setItemProperty( "image_formats", formats, bgId );
2541 // ... "Background" group <<end>>
2544 // ... "Selection" group <<start>>
2545 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2546 pref->setItemProperty( "columns", 2, occSelectionGroup );
2547 // .... -> enable preselection
2548 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2549 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2550 // .... -> enable selection
2551 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2552 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2553 // ... "Selection" group <<end>>
2555 // ... "Clipping" group <<start>>
2556 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2557 // .... -> clipping color
2558 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2559 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2560 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2561 pref->setItemProperty( "columns", 2, texturePref );
2562 // .... -> use default texture
2563 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2564 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2565 // .... -> clipping texture
2566 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2567 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2568 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2570 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2571 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2572 // .... -> scale factor
2573 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2574 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2575 pref->setItemProperty( "precision", 3, scaleFactor );
2576 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2577 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2578 pref->setItemProperty( "step", 0.1, scaleFactor );
2579 // ... "Clipping" group <<end>>
2581 // ... "Ray tracing" group <<start>>
2582 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2583 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2584 pref->setItemProperty( "columns", 2, rtPref );
2586 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2587 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2588 pref->setItemProperty( "min", 1, rt_depth );
2589 pref->setItemProperty( "max", 10, rt_depth );
2590 pref->setItemProperty( "step", 1, rt_depth );
2591 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2592 // .... -> specular reflections
2593 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2594 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2595 // .... -> adaptive anti-aliasing
2596 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2597 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2598 // .... -> shadows rendering
2599 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2600 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2601 // .... -> transparent shadow
2602 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2603 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2604 // ... "Ray tracing" group <<end>>
2606 // ... "Light source" group <<start>>
2607 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2608 // .... -> light color
2609 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2610 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2611 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2612 pref->setItemProperty( "columns", 3, directionPref );
2613 // .... -> light direction (dx component)
2614 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2615 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2616 pref->setItemProperty( "precision", 2, light_dx );
2617 pref->setItemProperty( "min", -1.0E03, light_dx );
2618 pref->setItemProperty( "max", 1.0E03, light_dx );
2619 pref->setItemProperty( "step", 0.1, light_dx );
2620 // .... -> light direction (dy component)
2621 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2622 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2623 pref->setItemProperty( "precision", 2, light_dy );
2624 pref->setItemProperty( "min", -1.0E03, light_dy );
2625 pref->setItemProperty( "max", 1.0E03, light_dy );
2626 pref->setItemProperty( "step", 0.1, light_dy );
2627 // .... -> light direction (dz component)
2628 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2629 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2630 pref->setItemProperty( "precision", 2, light_dz );
2631 pref->setItemProperty( "min", -1.0E03, light_dz );
2632 pref->setItemProperty( "max", 1.0E03, light_dz );
2633 pref->setItemProperty( "step", 0.1, light_dz );
2634 // ... "Light source" group <<end>>
2636 // ... -> empty frame (for layout) <<start>>
2637 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2638 pref->setItemProperty( "margin", 0, occGen );
2639 pref->setItemProperty( "columns", 2, occGen );
2640 // ... -> empty frame (for layout) <<end>>
2642 // .. "OCC viewer" group <<end>>
2645 #ifndef DISABLE_VTKVIEWER
2646 // .. "VTK viewer" group <<start>>
2647 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2649 // ... -> empty frame (for layout) <<start>>
2650 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2651 //pref->setItemProperty( "columns", 2, vtkGen );
2652 // .... -> projection mode
2653 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2654 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2655 aValuesList.clear();
2656 anIndicesList.clear();
2657 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2658 anIndicesList << 0 << 1;
2659 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2660 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2662 // .... -> Stereo group
2663 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2664 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2665 // .... -> Stereo type
2666 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2667 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2668 aValuesList.clear();
2669 anIndicesList.clear();
2671 SVTK_Viewer::stereoData( aValuesList, idList);
2672 foreach( int gid, idList ) anIndicesList << gid;
2673 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2674 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2675 // .... -> Anaglyph filter
2676 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2677 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2678 aValuesList.clear();
2679 anIndicesList.clear();
2680 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2681 anIndicesList << 0 << 1 << 2;
2683 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2684 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2686 // .... -> Enable quad-buffer support
2687 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2688 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2690 // .... -> background
2691 aValuesList.clear();
2692 anIndicesList.clear();
2695 #ifndef DISABLE_SALOMEOBJECT
2696 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2698 foreach( int gid, idList ) anIndicesList << gid;
2699 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2700 LightApp_Preferences::Background, "VTKViewer", "background" );
2701 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2702 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2703 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2704 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2705 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2706 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2707 pref->setItemProperty( "custom_enabled", false, bgId );
2708 #ifndef DISABLE_SALOMEOBJECT
2709 pref->setItemProperty( "image_formats", formats, bgId );
2711 // .... -> speed increment
2712 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2713 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2714 pref->setItemProperty( "min", 1, vtkSpeed );
2715 pref->setItemProperty( "max", 1000, vtkSpeed );
2716 // .... -> speed mode
2717 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2718 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2719 aValuesList.clear();
2720 anIndicesList.clear();
2721 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2722 anIndicesList << 0 << 1;
2723 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2724 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2726 // ... "Selection" group <<start>>
2727 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2728 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2729 // .... -> preselection
2730 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2731 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2732 aValuesList.clear();
2733 anIndicesList.clear();
2734 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2735 anIndicesList << 0 << 1 << 2;
2736 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2737 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2738 // .... -> enable selection
2739 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2740 // ... "Selection" group <<end>>
2742 // ... -> empty frame (for layout) <<end>>
2744 // ... space mouse sub-group <<start>>
2745 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2746 //pref->setItemProperty( "columns", 2, vtkSM );
2747 // .... -> decrease speed increment
2748 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2749 LightApp_Preferences::Selector, "VTKViewer",
2750 "spacemouse_func1_btn" );
2751 // .... -> increase speed increment
2752 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2753 LightApp_Preferences::Selector, "VTKViewer",
2754 "spacemouse_func2_btn" );
2755 // .... -> dominant / combined switch
2756 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2757 LightApp_Preferences::Selector, "VTKViewer",
2758 "spacemouse_func5_btn" ); //
2759 aValuesList.clear();
2760 anIndicesList.clear();
2761 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2762 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2763 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2764 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2765 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2766 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2767 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2768 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2769 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2770 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2771 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2772 // ... space mouse sub-group <<end>>
2774 // ... avi recording sub-group <<start>>
2775 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2776 pref->setItemProperty( "columns", 2, vtkRec );
2777 // .... -> recording mode
2778 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2779 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2780 aValuesList.clear();
2781 anIndicesList.clear();
2782 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2783 anIndicesList << 0 << 1;
2784 pref->setItemProperty( "strings", aValuesList, modePref );
2785 pref->setItemProperty( "indexes", anIndicesList, modePref );
2787 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2788 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2789 pref->setItemProperty( "min", 0.1, fpsPref );
2790 pref->setItemProperty( "max", 100, fpsPref );
2792 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2793 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2794 pref->setItemProperty( "min", 1, qualityPref );
2795 pref->setItemProperty( "max", 100, qualityPref );
2796 // .... -> progressive mode
2797 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2798 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2799 // ... avi recording sub-group <<end>>
2801 // ... group names sub-group <<start>>
2802 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2803 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2804 pref->setItemProperty( "columns", 2, vtkGN );
2805 // .... -> text color
2806 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2807 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2808 // .... -> transparency
2809 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2810 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2811 pref->setItemProperty( "min", 0.0, transPref );
2812 pref->setItemProperty( "max", 1.0, transPref );
2813 pref->setItemProperty( "step", 0.1, transPref );
2814 // ... -> group names sub-group <<end>>
2815 // .. "VTK viewer" group <<end>>
2818 // .. "Plot2d viewer" group <<start>>
2819 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2820 //pref->setItemProperty( "columns", 2, plot2dGroup );
2822 // ... -> background
2823 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2824 LightApp_Preferences::Color, "Plot2d", "Background" );
2825 // ... -> selection color
2826 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2827 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2829 // ... "Viewer" group <<start>>
2830 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2832 // .... -> curve type
2833 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2834 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2835 aValuesList.clear();
2836 anIndicesList.clear();
2837 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2838 anIndicesList << 0 << 1 << 2 ;
2839 pref->setItemProperty( "strings", aValuesList, curveType );
2840 pref->setItemProperty( "indexes", anIndicesList, curveType );
2841 // .... -> marker size
2842 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2843 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2844 pref->setItemProperty( "min", 0, markerSize );
2845 pref->setItemProperty( "max", 100, markerSize );
2846 // .... -> horizontal scaling mode
2847 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2848 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2849 aValuesList.clear();
2850 anIndicesList.clear();
2851 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2852 anIndicesList << 0 << 1 ;
2853 pref->setItemProperty( "strings", aValuesList, horScale );
2854 pref->setItemProperty( "indexes", anIndicesList, horScale );
2855 // .... -> vertical scaling mode
2856 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2857 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2858 pref->setItemProperty( "strings", aValuesList, verScale );
2859 pref->setItemProperty( "indexes", anIndicesList, verScale );
2861 // .... -> errors/deviation colot
2862 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2863 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2864 // .... -> deviation markers line size
2865 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2866 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2867 pref->setItemProperty( "min", 1, deviationMarkerLw );
2868 pref->setItemProperty( "max", 5, deviationMarkerLw );
2869 // .... -> deviation markers tick mark size
2870 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2871 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2872 pref->setItemProperty( "min", 1, deviationMarkerTs );
2873 pref->setItemProperty( "max", 5, deviationMarkerTs );
2874 // .... "Viewer" group <<end>>
2876 // ... "Legend" group <<start>>
2877 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2879 // .... -> show legend
2880 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2881 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2882 // .... -> legend position
2883 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2884 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2885 aValuesList.clear();
2886 anIndicesList.clear();
2887 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2888 anIndicesList << 0 << 1 << 2 << 3 ;
2889 pref->setItemProperty( "strings", aValuesList, legendPosition );
2890 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2891 // .... -> Symbol type
2892 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2893 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2894 aValuesList.clear();
2895 anIndicesList.clear();
2896 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2897 anIndicesList << 0 << 1 ;
2898 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2899 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2900 // .... -> legend font
2901 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2902 // ... -> font color
2903 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2904 // ... -> selection font color
2905 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2906 // ... "Legend" group <<end>>
2908 // .. "Plot2d viewer" group <<end>>
2910 // .. "PyViewer" preferences tab <<start>>
2911 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2912 // ... "Font settings" group <<start>>
2913 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2914 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2915 LightApp_Preferences::Font, "PyEditor", "Font" );
2916 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2917 // ... "Font settings" group <<end>>
2918 // ... "Display settings" group <<start>>
2919 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2920 pref->setItemProperty( "columns", 2, pyDispGroup );
2921 // ... -> current line highlight
2922 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2923 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2924 // ... -> text wrapping
2925 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2926 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2927 // ... -> center cursor on scroll
2928 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2929 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2930 // ... -> line numbers area
2931 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2932 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2933 // ... "Display settings" group <<end>>
2934 // ... "Tab settings" group <<start>>
2935 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2936 pref->setItemProperty( "columns", 2, pyTabGroup );
2937 // ... -> tab whitespaces
2938 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2939 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2941 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2942 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2943 // ... "Tab settings" group <<end>>
2944 // ... "Vertical edge settings" group <<start>>
2945 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2946 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2947 // ... -> vertical edge
2948 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2949 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2950 // ... -> number of columns
2951 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2952 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2953 // ... "Vertical edge settings" group <<end>>
2954 // .. "PyEditor" preferences tab <<end>>
2956 // .. "Directories" preferences tab <<start>>
2957 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2958 // ... --> quick directories list
2959 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2960 pref->addPreference( tr( "" ), dirGroup,
2961 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2962 // .. "Directories" preferences tab <<end>>
2964 // .. "Object browser" preferences tab <<start>>
2965 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2967 // ... "Search tool" group <<start>>
2968 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2969 // .... --> auto-hide
2970 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2971 "ObjectBrowser", "auto_hide_search_tool" );
2972 // ... "Search tool" group <<end>>
2974 // ... "Object browser settings" group <<start>>
2975 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2976 pref->setItemProperty( "columns", 2, objSetGroup );
2977 // .... -> auto size first column
2978 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2979 "ObjectBrowser", "auto_size_first" );
2980 // .... -> auto size other columns
2981 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2982 "ObjectBrowser", "auto_size" );
2983 // .... -> resize columns on expand item
2984 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2985 "ObjectBrowser", "resize_on_expand_item" );
2986 // .... -> browse to published object
2987 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2988 "ObjectBrowser", "browse_published_object" );
2989 aValuesList.clear();
2990 anIndicesList.clear();
2991 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2992 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2993 pref->setItemProperty( "strings", aValuesList, browsePublished );
2994 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2995 // ... "Object browser settings" group <<end>>
2996 // .. "Object browser" preferences tab <<end>>
2998 // .. "Shortcuts" preferences tab <<start>>
2999 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3000 // ... "Shortcuts settings" group <<start>>
3001 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3002 pref->addPreference( tr( "" ), shortcutGroup,
3003 LightApp_Preferences::ShortcutTree, "shortcuts" );
3004 // ... "Shortcuts settings" group <<end>>
3005 // .. "Shortcuts" preferences tab <<end>>
3006 // . Top-level "SALOME" preferences group <<end>>
3012 Changes appearance of application according to changed preferences
3013 \param sec - section
3014 \param param - name of changed parameter
3016 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3018 SUIT_ResourceMgr* resMgr = resourceMgr();
3022 if ( sec == "viewers" && param == "drop_down_buttons" )
3024 ViewManagerList vmlist = viewManagers();
3025 foreach( SUIT_ViewManager* vm, vmlist )
3027 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3028 foreach( SUIT_ViewWindow* vw, vwlist )
3029 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3033 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3035 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3036 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3037 QList<SUIT_ViewManager*> lst;
3038 #ifndef DISABLE_OCCVIEWER
3039 viewManagers( OCCViewer_Viewer::Type(), lst );
3040 QListIterator<SUIT_ViewManager*> itOCC( lst );
3041 while ( itOCC.hasNext() && sz >= 0 )
3043 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3044 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3047 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3048 occVM->setTrihedronSize( sz, relative );
3049 occVM->getAISContext()->UpdateCurrentViewer();
3052 #ifndef DISABLE_VTKVIEWER
3053 #ifndef DISABLE_SALOMEOBJECT
3054 viewManagers( SVTK_Viewer::Type(), lst );
3055 QListIterator<SUIT_ViewManager*> itVTK( lst );
3056 while ( itVTK.hasNext() && sz >= 0 )
3058 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3059 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3062 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3065 vtkVM->setTrihedronSize( sz, relative );
3073 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3075 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3076 QList<SUIT_ViewManager*> lst;
3077 #ifndef DISABLE_OCCVIEWER
3078 viewManagers( OCCViewer_Viewer::Type(), lst );
3079 QListIterator<SUIT_ViewManager*> itOCC( lst );
3080 while ( itOCC.hasNext() )
3082 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3083 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3086 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3089 occVM->setStaticTrihedronDisplayed( isVisible );
3093 #ifndef DISABLE_VTKVIEWER
3094 #ifndef DISABLE_SALOMEOBJECT
3095 viewManagers( SVTK_Viewer::Type(), lst );
3096 QListIterator<SUIT_ViewManager*> itVTK( lst );
3097 while ( itVTK.hasNext() )
3099 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3100 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3103 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3106 vtkVM->setStaticTrihedronVisible( isVisible );
3114 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3116 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3117 QList<SUIT_ViewManager*> lst;
3118 #ifndef DISABLE_OCCVIEWER
3119 viewManagers( OCCViewer_Viewer::Type(), lst );
3120 QListIterator<SUIT_ViewManager*> itOCC( lst );
3121 while ( itOCC.hasNext() )
3123 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3124 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3127 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3128 occVM->setInteractionStyle( mode );
3131 #ifndef DISABLE_VTKVIEWER
3132 #ifndef DISABLE_SALOMEOBJECT
3133 viewManagers( SVTK_Viewer::Type(), lst );
3134 QListIterator<SUIT_ViewManager*> itVTK( lst );
3135 while ( itVTK.hasNext() )
3137 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3138 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3141 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3142 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3148 #ifndef DISABLE_OCCVIEWER
3149 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3151 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3152 QList<SUIT_ViewManager*> lst;
3153 viewManagers( OCCViewer_Viewer::Type(), lst );
3154 QListIterator<SUIT_ViewManager*> it( lst );
3155 while ( it.hasNext() )
3157 SUIT_ViewModel* vm = it.next()->getViewModel();
3158 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3161 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3162 occVM->enablePreselection( isToEnablePreselection );
3167 #ifndef DISABLE_OCCVIEWER
3168 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3170 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3171 QList<SUIT_ViewManager*> lst;
3172 viewManagers( OCCViewer_Viewer::Type(), lst );
3173 QListIterator<SUIT_ViewManager*> it( lst );
3174 while ( it.hasNext() )
3176 SUIT_ViewModel* vm = it.next()->getViewModel();
3177 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3180 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3181 occVM->enableSelection( isToEnableSelection );
3186 #ifndef DISABLE_OCCVIEWER
3187 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3189 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3190 QList<SUIT_ViewManager*> lst;
3191 viewManagers( OCCViewer_Viewer::Type(), lst );
3192 QListIterator<SUIT_ViewManager*> it( lst );
3193 while ( it.hasNext() )
3195 SUIT_ViewModel* vm = it.next()->getViewModel();
3196 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3199 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3200 occVM->setClippingColor( aColor );
3205 #ifndef DISABLE_OCCVIEWER
3206 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3207 param == QString( "clipping_texture" ) ||
3208 param == QString( "clipping_modulate" ) ||
3209 param == QString( "clipping_scale" ) ) )
3211 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3212 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3213 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3214 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3215 QList<SUIT_ViewManager*> lst;
3216 viewManagers( OCCViewer_Viewer::Type(), lst );
3217 QListIterator<SUIT_ViewManager*> it( lst );
3218 while ( it.hasNext() )
3220 SUIT_ViewModel* vm = it.next()->getViewModel();
3221 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3224 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3225 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3230 #ifndef DISABLE_OCCVIEWER
3231 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3233 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3234 QList<SUIT_ViewManager*> lst;
3235 viewManagers( OCCViewer_Viewer::Type(), lst );
3236 QListIterator<SUIT_ViewManager*> it( lst );
3237 while ( it.hasNext() )
3239 SUIT_ViewModel* vm = it.next()->getViewModel();
3240 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3243 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3244 occVM->setProjectionType( mode );
3248 #if OCC_VERSION_LARGE > 0x06090000
3249 #ifndef DISABLE_OCCVIEWER
3250 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3252 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3253 QList<SUIT_ViewManager*> lst;
3254 viewManagers( OCCViewer_Viewer::Type(), lst );
3255 QListIterator<SUIT_ViewManager*> it( lst );
3256 while ( it.hasNext() )
3258 SUIT_ViewModel* vm = it.next()->getViewModel();
3259 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3262 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3263 occVM->setStereoType( mode );
3268 #ifndef DISABLE_OCCVIEWER
3269 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3271 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3272 QList<SUIT_ViewManager*> lst;
3273 viewManagers( OCCViewer_Viewer::Type(), lst );
3274 QListIterator<SUIT_ViewManager*> it( lst );
3275 while ( it.hasNext() )
3277 SUIT_ViewModel* vm = it.next()->getViewModel();
3278 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3281 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3282 occVM->setAnaglyphFilter( mode );
3287 #ifndef DISABLE_OCCVIEWER
3288 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3289 param == QString( "focus_value" ) ) )
3291 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3292 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3293 QList<SUIT_ViewManager*> lst;
3294 viewManagers( OCCViewer_Viewer::Type(), lst );
3295 QListIterator<SUIT_ViewManager*> it( lst );
3296 while ( it.hasNext() )
3298 SUIT_ViewModel* vm = it.next()->getViewModel();
3299 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3302 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3303 occVM->setStereographicFocus( aType, aValue );
3308 #ifndef DISABLE_OCCVIEWER
3309 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3310 param == QString( "iod_value" ) ) )
3312 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3313 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3314 QList<SUIT_ViewManager*> lst;
3315 viewManagers( OCCViewer_Viewer::Type(), lst );
3316 QListIterator<SUIT_ViewManager*> it( lst );
3317 while ( it.hasNext() )
3319 SUIT_ViewModel* vm = it.next()->getViewModel();
3320 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3323 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3324 occVM->setInterocularDistance( aType, aValue );
3329 #ifndef DISABLE_OCCVIEWER
3330 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3332 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3333 QList<SUIT_ViewManager*> lst;
3334 viewManagers( OCCViewer_Viewer::Type(), lst );
3335 QListIterator<SUIT_ViewManager*> it( lst );
3336 while ( it.hasNext() )
3338 SUIT_ViewModel* vm = it.next()->getViewModel();
3339 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3342 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3343 occVM->setReverseStereo( reverse );
3348 #ifndef DISABLE_OCCVIEWER
3349 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3351 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3352 QList<SUIT_ViewManager*> lst;
3353 viewManagers( OCCViewer_Viewer::Type(), lst );
3354 QListIterator<SUIT_ViewManager*> it( lst );
3355 while ( it.hasNext() )
3357 SUIT_ViewModel* vm = it.next()->getViewModel();
3358 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3361 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3362 occVM->setVSync( enable );
3367 #ifndef DISABLE_OCCVIEWER
3368 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3370 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3371 QList<SUIT_ViewManager*> lst;
3372 viewManagers( OCCViewer_Viewer::Type(), lst );
3373 QListIterator<SUIT_ViewManager*> it( lst );
3374 while ( it.hasNext() )
3376 SUIT_ViewModel* vm = it.next()->getViewModel();
3377 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3380 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3381 occVM->setQuadBufferSupport( enable );
3386 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3388 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3389 QList<SUIT_ViewManager*> lst;
3390 #ifndef DISABLE_OCCVIEWER
3391 viewManagers( OCCViewer_Viewer::Type(), lst );
3392 QListIterator<SUIT_ViewManager*> itOCC( lst );
3393 while ( itOCC.hasNext() )
3395 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3396 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3399 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3400 occVM->setZoomingStyle( mode );
3403 #ifndef DISABLE_VTKVIEWER
3404 #ifndef DISABLE_SALOMEOBJECT
3405 viewManagers( SVTK_Viewer::Type(), lst );
3406 QListIterator<SUIT_ViewManager*> itVTK( lst );
3407 while ( itVTK.hasNext() )
3409 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3410 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3413 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3414 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3420 #ifndef DISABLE_VTKVIEWER
3421 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3423 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3424 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3425 QList<SUIT_ViewManager*> lst;
3426 #ifndef DISABLE_SALOMEOBJECT
3427 viewManagers( SVTK_Viewer::Type(), lst );
3428 QListIterator<SUIT_ViewManager*> it( lst );
3429 while ( it.hasNext() )
3431 SUIT_ViewModel* vm = it.next()->getViewModel();
3432 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3435 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3436 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3442 #ifndef DISABLE_VTKVIEWER
3443 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3445 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3446 QList<SUIT_ViewManager*> lst;
3447 #ifndef DISABLE_SALOMEOBJECT
3448 viewManagers( SVTK_Viewer::Type(), lst );
3449 QListIterator<SUIT_ViewManager*> it( lst );
3450 while ( it.hasNext() )
3452 SUIT_ViewModel* vm = it.next()->getViewModel();
3453 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3456 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3457 if( vtkVM ) vtkVM->setProjectionMode( mode );
3463 #ifndef DISABLE_VTKVIEWER
3464 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3466 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3467 QList<SUIT_ViewManager*> lst;
3468 #ifndef DISABLE_SALOMEOBJECT
3469 viewManagers( SVTK_Viewer::Type(), lst );
3470 QListIterator<SUIT_ViewManager*> it( lst );
3471 while ( it.hasNext() )
3473 SUIT_ViewModel* vm = it.next()->getViewModel();
3474 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3477 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3478 if( vtkVM ) vtkVM->setStereoType( mode );
3484 #ifndef DISABLE_VTKVIEWER
3485 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3487 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3488 QList<SUIT_ViewManager*> lst;
3489 #ifndef DISABLE_SALOMEOBJECT
3490 viewManagers( SVTK_Viewer::Type(), lst );
3491 QListIterator<SUIT_ViewManager*> it( lst );
3492 while ( it.hasNext() )
3494 SUIT_ViewModel* vm = it.next()->getViewModel();
3495 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3498 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3499 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3505 #ifndef DISABLE_VTKVIEWER
3506 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3508 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3509 QList<SUIT_ViewManager*> lst;
3510 #ifndef DISABLE_SALOMEOBJECT
3511 viewManagers( SVTK_Viewer::Type(), lst );
3512 QListIterator<SUIT_ViewManager*> it( lst );
3513 while ( it.hasNext() )
3515 SUIT_ViewModel* vm = it.next()->getViewModel();
3516 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3519 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3520 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3526 #ifndef DISABLE_VTKVIEWER
3527 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3529 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3530 QList<SUIT_ViewManager*> lst;
3531 #ifndef DISABLE_SALOMEOBJECT
3532 viewManagers( SVTK_Viewer::Type(), lst );
3533 QListIterator<SUIT_ViewManager*> it( lst );
3534 while ( it.hasNext() )
3536 SUIT_ViewModel* vm = it.next()->getViewModel();
3537 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3540 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3541 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3547 #ifndef DISABLE_VTKVIEWER
3548 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3550 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3551 QList<SUIT_ViewManager*> lst;
3552 #ifndef DISABLE_SALOMEOBJECT
3553 viewManagers( SVTK_Viewer::Type(), lst );
3554 QListIterator<SUIT_ViewManager*> it( lst );
3555 while ( it.hasNext() )
3557 SUIT_ViewModel* vm = it.next()->getViewModel();
3558 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3561 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3562 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3568 #ifndef DISABLE_VTKVIEWER
3569 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3570 param == QString( "spacemouse_func2_btn" ) ||
3571 param == QString( "spacemouse_func5_btn" ) ) )
3573 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3574 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3575 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3576 QList<SUIT_ViewManager*> lst;
3577 #ifndef DISABLE_SALOMEOBJECT
3578 viewManagers( SVTK_Viewer::Type(), lst );
3579 QListIterator<SUIT_ViewManager*> it( lst );
3580 while ( it.hasNext() )
3582 SUIT_ViewModel* vm = it.next()->getViewModel();
3583 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3586 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3587 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3592 if( sec=="ObjectBrowser" )
3594 SUIT_DataBrowser* ob = objectBrowser();
3598 if ( param=="auto_size_first" )
3600 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3601 ob->setAutoSizeFirstColumn( autoSizeFirst );
3602 if ( autoSizeFirst )
3603 ob->adjustFirstColumnWidth();
3605 else if ( param=="auto_size" ) {
3606 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3607 ob->setAutoSizeColumns(autoSize);
3609 ob->adjustColumnsWidth();
3611 else if ( param=="resize_on_expand_item" ) {
3612 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3613 ob->setResizeOnExpandItem(resizeOnExpandItem);
3615 else if ( param == "auto_hide_search_tool" ) {
3616 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3622 if( param=="auto_save_interval" ) {
3623 myAutoSaveTimer->stop();
3624 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3625 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3629 #ifndef DISABLE_PYCONSOLE
3630 if( sec=="PyConsole" && pythonConsole() )
3632 if ( param=="font" ) {
3633 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3635 else if ( param=="show_banner" ) {
3636 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3638 else if ( param=="auto_completion" ) {
3639 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3646 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3648 if ( param == "visible_count" )
3649 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3650 else if ( param == "max_count" )
3651 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3652 else if ( param == "insert_mode" )
3653 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3654 else if ( param == "link_type" )
3655 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3656 else if ( param == "show_clear" )
3657 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3658 else if ( param == "show_mru" )
3659 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3662 if ( sec == "language" && param == "language" )
3664 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3665 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3667 if ( sec == "language" && param == "locale")
3669 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3670 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3672 if ( sec == "desktop" && param == "opaque_resize" ) {
3673 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3674 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3675 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3676 else dopts &= ~QMainWindow::AnimatedDocks;
3677 desktop()->setDockOptions( dopts );
3678 desktop()->setOpaqueResize( opaqueResize );
3679 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3680 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3683 #ifndef DISABLE_PLOT2DVIEWER
3684 QList<SUIT_ViewManager*> lst;
3685 viewManagers( Plot2d_Viewer::Type(), lst );
3686 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3687 while ( itPlot2d.hasNext() ) {
3688 SUIT_ViewManager* viewMgr = itPlot2d.next();
3689 SUIT_ViewModel* vm = viewMgr->getViewModel();
3690 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3693 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3695 viewMgr->setViewModel( vm );
3696 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3698 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3699 frame->SetPreference();
3708 void LightApp_Application::loadPreferences()
3710 CAM_Application::loadPreferences();
3712 SUIT_ResourceMgr* aResMgr = resourceMgr();
3717 static bool mru_load = true;
3720 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3722 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3723 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3724 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3725 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3726 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3727 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3728 mru->loadLinks( aResMgr, "MRU" );
3734 QStringList mods = aResMgr->parameters( "windows_visibility" );
3735 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3738 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3739 myWinVis.insert( *itr, arr );
3743 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3744 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3745 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3746 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3747 else dopts &= ~QMainWindow::AnimatedDocks;
3748 desktop()->setDockOptions( dopts );
3749 desktop()->setOpaqueResize( opaqueResize );
3750 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3751 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3758 void LightApp_Application::savePreferences()
3760 CAM_Application::savePreferences();
3762 saveDockWindowsState();
3764 SUIT_ResourceMgr* aResMgr = resourceMgr();
3769 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3771 mru->saveLinks( aResMgr, "MRU" );
3773 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3774 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3777 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3779 #if GUI_DEVELOPMENT > 0
3780 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3782 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3789 Updates desktop title
3791 void LightApp_Application::updateDesktopTitle()
3793 QString aTitle = applicationName();
3794 QString aVer = applicationVersion();
3795 if ( !aVer.isEmpty() )
3796 aTitle += QString( " " ) + aVer;
3798 if ( activeStudy() ) {
3799 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3800 aTitle += QString( " - [%1]" ).arg( sName );
3803 desktop()->setWindowTitle( aTitle );
3807 \brief Get map of the operations which can be performed
3808 on the module activation.
3810 The method should return the map of the kind \c {<id>:<name>}
3811 where \c <id> is an integer identifier of the operation and
3812 \c <name> is a title for the button to be added to the
3813 dialog box. After user selects the required operation by the
3814 clicking the corresponding button in the dialog box, its identifier
3815 is passed to the moduleActionSelected() method to process
3818 \return map of the operations
3819 \sa moduleActionSelected()
3821 QMap<int, QString> LightApp_Application::activateModuleActions() const
3823 QMap<int, QString> opmap;
3824 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3825 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3830 \brief Called when the used selectes required operation chosen
3831 from "Activate module" dialog box.
3833 Performs the required operation according to the user choice.
3835 \param id operation identifier
3836 \sa activateModuleActions()
3838 void LightApp_Application::moduleActionSelected( const int id )
3853 Updates windows after close document
3855 void LightApp_Application::afterCloseDoc()
3859 CAM_Application::afterCloseDoc();
3863 Updates actions of active module
3865 void LightApp_Application::updateModuleActions()
3868 if ( activeModule() ) {
3869 modName = activeModule()->moduleName();
3870 if ( !isModuleAccessible( modName ) ) {
3871 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3872 foreach( SUIT_Application* app, apps ) {
3873 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3874 if ( lapp && lapp != this )
3875 lapp->removeModuleAction( modName );
3880 LightApp_ModuleAction* moduleAction =
3881 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3883 moduleAction->setActiveModule( modName );
3886 void LightApp_Application::removeModuleAction( const QString& modName )
3888 LightApp_ModuleAction* moduleAction =
3889 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3891 moduleAction->removeModule( modName );
3895 Gets current windows.
3896 \param winMap - output current windows map.
3898 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3901 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3902 ((LightApp_Module*)activeModule())->windows( winMap );
3904 defaultWindows( winMap );
3908 Gets current view managers.
3909 \param lst - output current view managers list.
3911 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3914 if ( !activeStudy() )
3917 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3918 ((LightApp_Module*)activeModule())->viewManagers( lst );
3920 defaultViewManagers( lst );
3926 void LightApp_Application::updateWindows()
3928 QMap<int, int> winMap;
3929 currentWindows( winMap );
3931 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3933 if ( !dockWindow( it.key() ) )
3934 getWindow( it.key() );
3937 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3939 QWidget* wid = it.value();
3940 if ( winMap.contains( it.key() ) )
3941 wid->setVisible( true );
3946 loadDockWindowsState();
3950 Updates view managers
3952 void LightApp_Application::updateViewManagers()
3955 currentViewManagers( lst );
3957 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3958 getViewManager( *it, true );
3962 Loads windows geometry
3964 void LightApp_Application::loadDockWindowsState()
3968 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3969 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3970 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3973 if ( activeModule() )
3974 modName = activeModule()->name();
3975 else if ( activeStudy() )
3976 modName = "nomodule";
3978 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3979 QByteArray aDefaultState;
3980 aResMgr->value( "windows_geometry", modName, aDefaultState );
3981 QByteArray aDefaultVisibility;
3982 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3983 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3984 aResMgr->setWorkingMode( prevMode );
3986 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3989 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3990 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3992 if ( version > Qtx::versionToId( "7.4.1" ) )
3993 aResMgr->value( "windows_geometry", modName , arr );
3995 arr = aDefaultState;
3996 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3997 desktop()->restoreState( aTargetArray );
4000 QStringList mainToolbarsNames;
4001 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4002 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4003 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4005 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4008 QMap<QString, bool> *tbMap = 0;
4009 QMap<QString, bool> *dwMap = 0;
4011 QMap<QString, bool> userTbMap, userDwMap;
4012 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4014 QMap<QString, bool> defaultTbMap, defaultDwMap;
4015 if(hasDefaultVisibility) {
4016 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4022 if(hasDefaultVisibility){
4023 tbMap = &defaultTbMap;
4030 if(hasDefaultVisibility){
4031 dwMap = &defaultDwMap;
4036 QList<QToolBar*> tbList = findToolBars();
4037 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4039 QToolBar* tb = *tit;
4040 if ( tbMap->contains( tb->objectName() ) ) {
4041 tb->setVisible( (*tbMap)[tb->objectName()] );
4047 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4048 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4050 QDockWidget* dw = *dit;
4052 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4053 if ( po != desktop() )
4056 if ( dwMap->contains( dw->objectName() ) )
4057 dw->setVisible( (*dwMap)[dw->objectName()] );
4065 Saves windows geometry
4067 void LightApp_Application::saveDockWindowsState()
4072 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4073 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4075 if( !storeWin && !storeTb )
4079 if ( activeModule() )
4080 modName = activeModule()->name();
4081 else if ( activeStudy() )
4082 modName = "nomodule";
4084 QString versionId = GUI_VERSION_STR;
4085 #if GUI_DEVELOPMENT > 0
4089 QByteArray arr = desktop()->saveState();
4090 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4091 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4094 if ( myWinVis.contains( modName ) )
4095 visArr = myWinVis[modName];
4097 QMap<QString, bool> tbMap, dwMap;
4098 dockWindowsState( visArr, tbMap, dwMap );
4100 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4101 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4104 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4107 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4108 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4110 QDockWidget* wid = *it;
4111 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4114 visArr = dockWindowsState( tbMap, dwMap );
4116 myWinVis.insert( modName, visArr );
4119 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4122 QDataStream stream( &visArr, QIODevice::WriteOnly );
4124 stream << (uchar)ToolBarMarker;
4125 stream << tb.size();
4126 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4128 stream << tit.key();
4129 stream << (uchar)( tit.value() ? 1 : 0 );
4132 stream << (uchar)DockWidgetMarker;
4133 stream << dw.size();
4134 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4136 stream << wit.key();
4137 stream << (uchar)( wit.value() ? 1 : 0 );
4143 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4148 QByteArray visArr = arr;
4149 QDataStream stream( &visArr, QIODevice::ReadOnly );
4153 if ( marker != ToolBarMarker )
4158 for ( int i = 0; i < lines; ++i )
4161 stream >> objectName;
4164 tb.insert( objectName, shown );
4168 if ( marker != DockWidgetMarker )
4172 for ( int j = 0; j < lines; ++j )
4175 stream >> objectName;
4178 dw.insert( objectName, shown );
4183 Adds icon names for modules
4185 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4189 SUIT_ResourceMgr* resMgr = resourceMgr();
4193 QStringList modList;
4194 modules( modList, false );
4196 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4198 QString modName = *it;
4199 QString modIntr = moduleName( modName );
4200 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4202 if ( modIcon.isEmpty() )
4205 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4206 modIcon += QString( ".png" );
4208 iconMap.insert( modName, modIcon );
4213 Inserts items in popup, which necessary for current application
4215 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4218 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4219 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4220 selMgr->setSelectionCacheEnabled( true );
4222 SUIT_DataBrowser* ob = objectBrowser();
4224 CAM_Application::contextMenuPopup( type, thePopup, title );
4226 if ( ob && type == ob->popupClientType() ) {
4227 thePopup->addSeparator();
4228 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4229 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4230 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4233 #ifndef DISABLE_SALOMEOBJECT
4234 if ( selMgr && ob ) {
4235 SALOME_ListIO selected;
4236 selMgr->selectedObjects( selected );
4237 if(selected.Extent() == 1){
4238 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4239 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4240 if(obj && obj->renameAllowed()) {
4241 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4242 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4243 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4244 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4246 QList<QAction*> acts = thePopup->actions();
4247 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4248 thePopup->insertAction(firstAction,a);
4254 selMgr->setSelectionCacheEnabled( cacheIsOn );
4260 void LightApp_Application::createEmptyStudy()
4262 CAM_Application::createEmptyStudy();
4264 if ( objectBrowser() )
4265 objectBrowser()->updateTree();
4267 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4268 if ( aResMgr && activeStudy() ) {
4269 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4270 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4275 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4277 CAM_Application::setDesktop( desk );
4280 connect( desk, SIGNAL( message( const QString& ) ),
4281 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4282 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4283 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4284 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4285 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4291 \param mod - module to be activated
4293 bool LightApp_Application::activateModule( CAM_Module* mod )
4295 bool res = CAM_Application::activateModule( mod );
4297 if ( objectBrowser() )
4298 objectBrowser()->updateTree();
4304 \return keyborad accelerators manager object
4306 SUIT_Accel* LightApp_Application::accel() const
4312 Removes dead widget container from map
4314 void LightApp_Application::onWCDestroyed( QObject* ob )
4316 // remove destroyed widget container from windows map
4317 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4319 if ( itr.value() != ob )
4322 int key = itr.key();
4323 myWin.remove( key );
4328 void LightApp_Application::onMRUActivated( const QString& name )
4330 SUIT_Session* s = SUIT_Session::session();
4331 if ( s && s->activeApplication() == this )
4335 void LightApp_Application::onStylePreferences()
4337 #ifdef USE_SALOME_STYLE
4338 Style_PrefDlg dlg( desktop() );
4341 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4342 #endif // USE_SALOME_STYLE
4345 void LightApp_Application::onFullScreen(){
4346 if(myScreenHelper) {
4347 if(desktop()->isFullScreen())
4348 myScreenHelper->switchToNormalScreen();
4350 myScreenHelper->switchToFullScreen();
4355 Connects just added view manager
4357 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4359 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4360 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4361 CAM_Application::addViewManager( vm );
4365 Remove view manager from memory
4367 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4369 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4370 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4371 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4373 aStudy->removeObjectProperties( vm->getGlobalId() );
4375 CAM_Application::removeViewManager( vm );
4377 LightApp_SelectionMgr* selMgr = selectionMgr();
4378 QList<SUIT_Selector*> selectors;
4379 selMgr->selectors( selectors );
4380 foreach( SUIT_Selector* selector, selectors ) {
4381 if ( selector->owner() == vm->getViewModel() ) {
4386 // IPAL22894: Crash on closing OCC view
4392 Renames active window of desktop
4394 void LightApp_Application::onRenameWindow()
4399 QWidget* w = desktop()->activeWindow();
4404 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4405 if( ok && !name.isEmpty() )
4406 w->setWindowTitle( name );
4410 Closes active window of desktop
4412 void LightApp_Application::onCloseWindow()
4417 QWidget* w = desktop()->activeWindow();
4425 Closes all windows of desktop
4427 void LightApp_Application::onCloseAllWindow()
4429 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4433 QList<SUIT_ViewWindow*> wndList = desk->windows();
4434 SUIT_ViewWindow* wnd;
4435 foreach( wnd, wndList )
4443 Groups all windows of desktop
4445 void LightApp_Application::onGroupAllWindow()
4447 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4451 QtxWorkstack* wgStack = desk->workstack();
4457 \return if the library of module exists
4458 \param moduleTitle - title of module
4460 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4462 if( moduleTitle.isEmpty() )
4465 QString lib = moduleLibrary( moduleTitle );
4467 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4468 bool isPythonModule = lib.contains("SalomePyQtGUI");
4469 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4473 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4474 #elif defined(__APPLE__)
4475 paths = QString(::getenv( "DYLD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4477 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4480 bool isLibFound = false;
4481 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4482 for( ; anIt!=aLast; anIt++ )
4484 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4495 INFOS( "\n****************************************************************" << std::endl
4496 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4497 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4498 << "****************************************************************" << std::endl );
4500 else if ( !isPythonModule && !isPythonLightModule)
4503 if ( isPythonModule || isPythonLightModule)
4505 QString pylib = moduleName( moduleTitle ) + QString(".py");
4506 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4508 // Check the python library
4510 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4512 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4514 bool isPyLib = false, isPyGuiLib = false;
4515 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4516 for( ; anIt!=aLast; anIt++ )
4518 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4519 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4521 if(!isPythonLightModule)
4522 if( !isPyLib && inf.exists() )
4525 if( !isPyGuiLib && infgui.exists() )
4528 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4532 printf( "\n****************************************************************\n" );
4533 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4535 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4537 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4538 printf( "****************************************************************\n" );
4545 \return default name for an active study
4547 void LightApp_Application::setDefaultStudyName( const QString& theName )
4549 QStringList anInfoList;
4550 modules( anInfoList, false );
4552 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4553 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4554 !aStudy->isSaved() )
4556 aStudy->setStudyName( theName );
4557 updateDesktopTitle();
4562 Custom event handler
4564 bool LightApp_Application::event( QEvent* e )
4566 if( e && e->type()==2000 )
4568 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4569 QString* d = ( QString* )ce->data();
4570 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4572 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4573 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4574 showPreferences( tr( "PREF_APP" ) );
4579 return CAM_Application::event( e );
4582 /*! Check data object */
4583 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4587 bool isSuitable = !theObj->entry().isEmpty() &&
4588 !theObj->componentDataType().isEmpty() &&
4589 !theObj->name().isEmpty();
4596 int LightApp_Application::openChoice( const QString& aName )
4598 int choice = CAM_Application::openChoice( aName );
4600 if ( choice == OpenExist ) // The document is already open.
4602 // Do you want to reload it?
4603 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4604 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4605 choice = OpenReload;
4611 bool LightApp_Application::openAction( const int choice, const QString& aName )
4618 STD_Application* app = 0;
4619 SUIT_Session* session = SUIT_Session::session();
4620 QList<SUIT_Application*> appList = session->applications();
4621 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4623 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4624 app = ::qobject_cast<STD_Application*>( *it );
4629 app->onCloseDoc( false );
4630 appList = session->applications();
4631 STD_Application* other = 0;
4632 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4633 other = ::qobject_cast<STD_Application*>( *it );
4636 res = other->onOpenDoc( aName );
4641 res = CAM_Application::openAction( choice, aName );
4648 QStringList LightApp_Application::viewManagersTypes() const
4650 QStringList aTypesList;
4651 aTypesList += myUserWmTypes;
4652 #ifndef DISABLE_GLVIEWER
4653 aTypesList<<GLViewer_Viewer::Type();
4655 #ifndef DISABLE_PLOT2DVIEWER
4656 aTypesList<<Plot2d_Viewer::Type();
4658 #ifndef DISABLE_QXGRAPHVIEWER
4659 aTypesList<<QxScene_Viewer::Type();
4661 #ifndef DISABLE_PVVIEWER
4662 aTypesList<<PVViewer_Viewer::Type();
4664 #ifndef DISABLE_PYVIEWER
4665 aTypesList<<PyViewer_Viewer::Type();
4667 #ifndef DISABLE_OCCVIEWER
4668 aTypesList<<OCCViewer_Viewer::Type();
4670 #ifndef DISABLE_VTKVIEWER
4671 #ifndef DISABLE_SALOMEOBJECT
4672 aTypesList<<SVTK_Viewer::Type();
4674 aTypesList<<VTKViewer_Viewer::Type();
4680 * Removes all view managers of known types
4681 * Other view managers are ignored
4683 void LightApp_Application::clearKnownViewManagers()
4685 QStringList aTypesList = viewManagersTypes();
4686 QList<SUIT_ViewManager*> aMgrList;
4687 viewManagers( aMgrList );
4688 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4689 if (aTypesList.contains(aMgr->getType()))
4690 removeViewManager(aMgr);
4695 Copy of current selection
4697 void LightApp_Application::onCopy()
4699 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4705 Paste of current data in clipboard
4707 void LightApp_Application::onPaste()
4709 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4715 Browse (i.e. set focus on) the published objects
4716 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4717 has been accepted by Ok (or Apply & Close) button
4718 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4719 (to select the first published object only)
4720 \return entry of the selected object
4722 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4723 const bool theIsApplyAndClose,
4724 const bool theIsOptimizedBrowsing )
4727 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4729 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4730 switch( aBrowsePolicy )
4734 case BP_ApplyAndClose:
4735 if( !theIsApplyAndClose )
4743 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4747 SUIT_DataBrowser* anOB = objectBrowser();
4751 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4755 QStringListIterator anIter( theEntryList );
4756 if( theIsOptimizedBrowsing )
4758 // go to the last entry
4760 if( anIter.hasPrevious() )
4764 // scroll to each entry in the list
4765 // (in optimized mode - to the last entry only)
4767 LightApp_DataObject* anObject = 0;
4768 while( anIter.hasNext() )
4770 anEntry = anIter.next();
4771 if( !anEntry.isEmpty() )
4773 anObject = aStudy->findObjectByEntry( anEntry );
4776 QModelIndex anIndex = aModel->index( anObject );
4777 anOB->treeView()->scrollTo( anIndex );
4782 // always select the last object
4783 if( anObject && !anEntry.isEmpty() )
4785 QList<SUIT_Selector*> aSelectorList;
4786 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4787 if( !aSelectorList.isEmpty() )
4789 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4791 bool anIsAutoBlock = aSelector->autoBlock();
4793 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4794 aSelector->setAutoBlock( false );
4796 SUIT_DataOwnerPtrList aList;
4797 #ifndef DISABLE_SALOMEOBJECT
4798 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4799 ( anObject->entry().toLatin1().constData(),
4800 anObject->componentDataType().toLatin1().constData(),
4801 anObject->name().toLatin1().constData() );
4802 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4804 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4807 aList.append( owner );
4808 selectionMgr()->setSelected( aList );
4811 // restore auto block flag
4812 aSelector->setAutoBlock( anIsAutoBlock );
4820 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4822 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4823 return study ? study->findObjectByEntry( id ) : 0;
4827 Checks that an object can be renamed.
4828 \param entry entry of the object
4829 \brief Return \c true if object can be renamed
4831 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4836 Rename object by entry.
4837 \param entry entry of the object
4838 \param name new name of the object
4839 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4841 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4845 /*! Process standard messages from desktop */
4846 void LightApp_Application::onDesktopMessage( const QString& message )
4848 const QString sectionSeparator = "/";
4850 if ( message.toLower() == "updateobjectbrowser" ||
4851 message.toLower() == "updateobjbrowser" ) {
4852 // update object browser
4853 updateObjectBrowser();
4855 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4856 QString vtype = message.split( sectionSeparator ).last();
4857 if ( !vtype.isEmpty() )
4858 getViewManager( vtype, true );
4861 QStringList data = message.split( sectionSeparator );
4862 if ( data.count() > 1 ) {
4863 QString msgType = data[0].trimmed();
4864 LightApp_Module* sMod = 0;
4865 CAM_Module* mod = module( msgType );
4867 mod = module( moduleTitle( msgType ) );
4868 if ( mod && mod->inherits( "LightApp_Module" ) )
4869 sMod = (LightApp_Module*)mod;
4871 if ( msgType.toLower() == "preferences" ) {
4872 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4873 // for example "preferences/Study/multi_file_dump/true"
4874 if ( data.count() > 3 ) {
4875 QString section = data[1].trimmed();
4876 QString param = data[2].trimmed();
4877 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4878 resourceMgr()->setValue( section, param, value );
4882 // received message for the module
4883 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4884 sMod->message( msg );
4892 Returns all top level toolbars.
4893 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4895 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4897 QList<QToolBar*> aResult;
4898 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4899 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4900 QToolBar* tb = *tit;
4901 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4902 if ( po != desktop() )
4904 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4911 Internal method to parse toolbars and dockable windows state.
4913 QByteArray LightApp_Application::processState(QByteArray& input,
4914 const bool processWin,
4915 const bool processTb,
4916 const bool isRestoring,
4917 QByteArray defaultState) {
4920 bool hasDefaultState = !defaultState.isEmpty();
4921 bool isDockWinWriten = false;
4923 //Write date from users settings
4925 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4926 int marker, version;
4928 tmpInputData >> marker;
4929 tmpInputData >> version;
4930 tmpInputData >> dockmarker;
4931 tmpInputData >> nbDocWin;
4933 if(processWin && processTb && !isRestoring) {
4935 } else if(!processWin && !processTb ) {
4937 aRes = defaultState;
4939 QDataStream aData(&aRes, QIODevice::WriteOnly);
4940 QList<QToolBar*> aToolBars = findToolBars();
4943 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4944 QToolBar* tb = *tit;
4945 aNames.append(tb->objectName());
4948 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4949 if(toolBarMarkerIndex < 0)
4951 QDataStream anInputData(&input, QIODevice::ReadOnly);
4953 int toolBarMarkerIndexDef;
4954 if(hasDefaultState) {
4955 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4956 if(toolBarMarkerIndexDef < 0)
4959 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4961 QDataStream* aTargetData = 0;
4962 int aTargetIndex = -1;
4964 QByteArray currentArr = desktop()->saveState();
4965 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4966 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4967 if(processWin && useInputData) {
4968 aTargetData = &anInputData;
4969 aTargetIndex = toolBarMarkerIndex;
4971 //Write date from default settings
4972 if(hasDefaultState) {
4973 aTargetData = &anInputDataDef;
4974 aTargetIndex = toolBarMarkerIndexDef;
4976 //If no default state, write current snapshot of the dockable windows
4978 aTargetData = &anInputDataCur;
4979 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4980 aTargetIndex = toolBarMarkerIndexCur;
4985 if(aTargetData && aTargetIndex >= 0 ) {
4986 aTargetData->device()->seek(0);
4987 while( aTargetData->device()->pos() < aTargetIndex ) {
4992 isDockWinWriten = true;
4999 aTargetData = &anInputData;
5000 aTargetIndex = toolBarMarkerIndex;
5002 if(hasDefaultState) {
5003 aTargetData = &anInputDataDef;
5004 aTargetIndex = toolBarMarkerIndexDef;
5008 if(aTargetData && aTargetIndex >= 0) {
5010 if(!isDockWinWriten ) {
5011 //Write version marker
5012 int marker, version;
5013 aTargetData->device()->seek(0);
5014 *aTargetData >> marker;
5015 *aTargetData >> version;
5018 aData << (uchar) QDockWidgetMarker;
5020 int shift = 4*sizeof(int) + sizeof(QSize);
5021 index = aTargetIndex - shift;
5023 index = aTargetIndex;
5026 aTargetData->device()->seek(index);
5027 while(!aTargetData->atEnd()) {
5032 } else { // Not treat toolbars
5033 aData << (uchar) QToolBarMarker;
5034 aData << (int) 0; //Nb toolbars = 0
5041 \brief Emits operationFinished signal.
5042 \param theModuleName the name of the module which perfomed the operation
5043 \param theOperationName the operation name
5044 \param theEntryList the list of the created objects entries
5046 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5047 const QString& theOperationName,
5048 const QStringList& theEntryList )
5050 emit operationFinished( theModuleName, theOperationName, theEntryList );
5054 Update visibility state of given objects
5056 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5057 SUIT_ViewModel* theViewModel )
5059 if ( !theViewModel || theList.isEmpty() ) return;
5061 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5062 if ( !aStudy ) return;
5064 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5066 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5067 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5069 if ( !obj || aStudy->isComponent( obj->entry() ) )
5072 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5073 if ( anObjModule ) {
5074 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5076 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5077 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5078 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5079 anObjState = Qtx::ShownState;
5081 anObjState = Qtx::HiddenState;
5083 aStudy->setVisibilityState( obj->entry(), anObjState );
5090 * Called when window activated
5092 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5094 SUIT_DataBrowser* anOB = objectBrowser();
5097 SUIT_DataObject* rootObj = anOB->root();
5101 DataObjectList listObj = rootObj->children( true );
5103 SUIT_ViewModel* vmod = 0;
5104 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5105 vmod = vman->getViewModel();
5106 updateVisibilityState( listObj, vmod );
5110 Called then view manager removed
5112 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5114 ViewManagerList lst;
5115 viewManagers( lst );
5116 if ( lst.count() == 1) { // in case if closed last view window
5117 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5119 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5124 Check existing document.
5126 bool LightApp_Application::checkExistingDoc()
5129 if( activeStudy() ) {
5130 int answer = SUIT_MessageBox::question( desktop(),
5131 tr( "APPCLOSE_CAPTION" ),
5132 tr( "STUDYCLOSE_DESCRIPTION" ),
5133 tr( "APPCLOSE_SAVE" ),
5134 tr( "APPCLOSE_CLOSE" ),
5135 tr( "APPCLOSE_CANCEL" ), 0 );
5137 if ( activeStudy()->isSaved() ) {
5140 } else if ( onSaveAsDoc() ) {
5141 if( !closeDoc( false ) ) {
5148 else if( answer == 1 ) {
5150 } else if( answer == 2 ) {
5157 #ifndef DISABLE_PYCONSOLE
5159 PyConsole_Interp* LightApp_Application::getPyInterp()
5161 static PyConsole_Interp* myInterp = 0;
5163 myInterp = createPyInterp();
5164 myInterp->initialize();
5169 PyConsole_Interp* LightApp_Application::createPyInterp()
5171 return new PyConsole_Interp();
5174 #endif // DISABLE_PYCONSOLE