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_P, 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 ( !isModuleAccessible( *it ) )
721 QString modName = moduleName( *it );
724 if ( iconMap.contains( *it ) )
725 iconName = iconMap[*it];
727 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
732 "****************************************************************" << std::endl <<
733 " Warning: icon for " << qPrintable(*it) << " is not found!" << std::endl <<
734 " Using the default icon." << std::endl <<
735 "****************************************************************" << std::endl);
737 icon = Qtx::scaleIcon( icon, iconSize );
739 moduleAction->insertModule( *it, icon );
742 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
743 this, SLOT( onModuleActivation( const QString& ) ) );
744 registerAction( ModulesListId, moduleAction );
748 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
749 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
751 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
752 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
753 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
754 0, desk, false, this, SLOT( onCloseAllWindow() ) );
755 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
756 0, desk, false, this, SLOT( onGroupAllWindow() ) );
758 createMenu( CloseId, windowMenu, 0, -1 );
759 createMenu( CloseAllId, windowMenu, 0, -1 );
760 createMenu( GroupAllId, windowMenu, 0, -1 );
761 createMenu( separator(), windowMenu, -1, 0 );
763 #ifndef DISABLE_GLVIEWER
764 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
766 #ifndef DISABLE_PLOT2DVIEWER
767 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
769 #ifndef DISABLE_OCCVIEWER
770 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
772 #ifndef DISABLE_VTKVIEWER
773 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
775 #ifndef DISABLE_QXGRAPHVIEWER
776 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
778 #ifndef DISABLE_GRAPHICSVIEW
779 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
781 #ifndef DISABLE_PVVIEWER
782 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
784 #ifndef DISABLE_PYVIEWER
785 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
788 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
789 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
790 createMenu( RenameId, windowMenu, -1 );
792 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
793 createMenu( PreferencesId, fileMenu, 50, -1 );
794 createMenu( separator(), fileMenu, -1, 50, -1 );
796 createMenu( separator(), fileMenu, -1, 100, -1 );
797 createMenu( MRUId, fileMenu, 100, -1 );
798 createMenu( separator(), fileMenu, -1, 100, -1 );
800 #ifdef USE_SALOME_STYLE
801 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
802 0, desk, false, this, SLOT( onStylePreferences() ) );
803 #endif // USE_SALOME_STYLE
805 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
806 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
809 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
810 createMenu( separator(), viewMenu, -1, 20, -1 );
811 #ifdef USE_SALOME_STYLE
812 createMenu( StyleId, viewMenu, 20, -1 );
813 #endif // USE_SALOME_STYLE
814 createMenu( FullScreenId, viewMenu, 20, -1 );
816 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
817 QString( "SalomeModules" ) ); // name (language-independant)
818 createTool( ModulesListId, modTBar );
821 /*!On module activation action.*/
822 void LightApp_Application::onModuleActivation( const QString& modName )
824 // Force user to create/open a study before module activation
825 QMap<QString, QString> iconMap;
826 moduleIconNames( iconMap );
827 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
829 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
831 bool cancelled = false;
833 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
834 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
835 QMap<int, QString> opmap = activateModuleActions();
836 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
837 aDlg.addButton( it.value(), it.key() );
839 int res = aDlg.exec();
841 // some operation is selected
842 moduleActionSelected( res );
846 putInfo( tr("INF_CANCELLED") );
848 LightApp_ModuleAction* moduleAction =
849 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
851 moduleAction->setActiveModule( QString() );
857 activateModule( modName );
860 /*!Default module activation.*/
861 QString LightApp_Application::defaultModule() const
863 QStringList aModuleNames;
864 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
865 //! If there's the one and only module --> activate it automatically
866 //! TODO: Possible improvement - default module can be taken from preferences
867 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
870 /*!On new window slot.*/
871 void LightApp_Application::onNewWindow()
873 const QObject* obj = sender();
874 if ( !obj || !obj->inherits( "QAction" ) )
878 int id = actionId( (QAction*)obj );
881 #ifndef DISABLE_GLVIEWER
883 type = GLViewer_Viewer::Type();
886 #ifndef DISABLE_PLOT2DVIEWER
888 type = Plot2d_Viewer::Type();
891 #ifndef DISABLE_OCCVIEWER
893 type = OCCViewer_Viewer::Type();
896 #ifndef DISABLE_VTKVIEWER
898 type = VTKViewer_Viewer::Type();
901 #ifndef DISABLE_QXGRAPHVIEWER
902 case NewQxSceneViewId:
903 type = QxScene_Viewer::Type();
906 #ifndef DISABLE_GRAPHICSVIEW
907 case NewGraphicsViewId:
908 type = GraphicsView_Viewer::Type();
911 #ifndef DISABLE_PVVIEWER
913 type = PVViewer_Viewer::Type();
916 #ifndef DISABLE_PYVIEWER
918 type = PyViewer_Viewer::Type();
923 if ( !type.isEmpty() )
924 createViewManager( type );
928 SLOT: Creates new document
930 void LightApp_Application::onNewDoc()
932 #ifdef SINGLE_DESKTOP
933 if ( !checkExistingDoc() )
937 //asl: fix for 0020515
938 saveDockWindowsState();
940 CAM_Application::onNewDoc();
944 SLOT: Opens new document
946 void LightApp_Application::onOpenDoc()
948 SUIT_Study* study = activeStudy();
950 #ifdef SINGLE_DESKTOP
951 if ( !checkExistingDoc() )
955 CAM_Application::onOpenDoc();
957 if ( !study ) // new study will be create in THIS application
960 updateViewManagers();
965 SLOT: Opens new document.
966 \param aName - name of file
968 bool LightApp_Application::onOpenDoc( const QString& aName )
970 #ifdef SINGLE_DESKTOP
971 if ( !checkExistingDoc() )
975 saveDockWindowsState();
977 // We should take mru action first because this application instance can be deleted later.
978 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
980 bool res = CAM_Application::onOpenDoc( aName );
985 mru->insert( aName );
987 mru->remove( aName );
993 SLOT: Displays "About" message box
995 void LightApp_Application::onHelpAbout()
997 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1002 Private SLOT: Called on selection is changed
1003 Dispatchs active module that selection is changed
1005 void LightApp_Application::onSelection()
1007 //MESSAGE("onSelection")
1008 onSelectionChanged();
1010 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1011 ((LightApp_Module*)activeModule())->selectionChanged();
1016 \param study - SUIT_Study.
1018 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1020 CAM_Application::setActiveStudy( study );
1024 Enables/Disables menu items and toolbar buttons. Rebuild menu
1026 void LightApp_Application::updateCommandsStatus()
1028 CAM_Application::updateCommandsStatus();
1031 #ifndef DISABLE_GLVIEWER
1032 a = action( NewGLViewId );
1034 a->setEnabled( activeStudy() );
1037 #ifndef DISABLE_PLOT2DVIEWER
1038 a = action( NewPlot2dId );
1040 a->setEnabled( activeStudy() );
1043 #ifndef DISABLE_OCCVIEWER
1044 a = action( NewOCCViewId );
1046 a->setEnabled( activeStudy() );
1049 #ifndef DISABLE_VTKVIEWER
1050 a = action( NewVTKViewId );
1052 a->setEnabled( activeStudy() );
1055 #ifndef DISABLE_QXGRAPHVIEWER
1056 a = action( NewQxSceneViewId );
1058 a->setEnabled( activeStudy() );
1061 #ifndef DISABLE_GRAPHICSVIEW
1062 a = action( NewGraphicsViewId );
1064 a->setEnabled( activeStudy() );
1067 #ifndef DISABLE_PVVIEWER
1068 a = action( NewPVViewId );
1070 a->setEnabled( activeStudy() );
1073 #ifndef DISABLE_PYVIEWER
1074 a = action( NewPyViewerId );
1076 a->setEnabled( activeStudy() );
1082 Runs system command in separate thread
1084 class RunBrowser: public QThread
1087 RunBrowser( LightApp_Application* app,
1088 const QString& theApp,
1089 const QString& theParams,
1090 const QString& theHelpFile,
1091 const QString& theContext = QString() )
1093 myParams( theParams ),
1094 myContext( theContext ),
1098 //For the external browser always specify 'file://' protocol,
1099 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1100 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1105 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1106 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1108 QProcess* proc = new QProcess();
1110 proc->start( aCommand );
1111 if ( !proc->waitForStarted() ) {
1112 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1113 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1114 ce2000->setData( msg );
1115 QApplication::postEvent( myLApp, ce2000 );
1126 LightApp_Application* myLApp;
1130 SLOT: Displays help contents for choosen module
1132 void LightApp_Application::onHelpContentsModule()
1134 const QAction* a = (QAction*) sender();
1135 QString helpFile = a->data().toString();
1136 if ( helpFile.isEmpty() ) return;
1138 SUIT_ResourceMgr* resMgr = resourceMgr();
1141 platform = "winapplication";
1143 platform = "application";
1145 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1147 QString quote("\"");
1148 anApp.prepend( quote );
1149 anApp.append( quote );
1151 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1152 #if DISABLE_QTXWEBBROWSER
1153 bool useExtBrowser = true;
1155 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1158 if( useExtBrowser ) {
1159 if ( !anApp.isEmpty() ) {
1160 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1164 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1165 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1166 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1168 showPreferences( tr( "PREF_APP" ) );
1172 QStringList parameters;
1173 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1174 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1175 parameters << helpFile;
1176 QProcess::startDetached( "HelpBrowser", parameters );
1181 SLOT: Displays help contents for choosen dialog
1183 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1184 const QString& theFileName,
1185 const QString& theContext )
1187 QString fileName = theFileName;
1188 QString context = theContext;
1189 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1190 // context might be passed within theFileName argument
1191 QStringList comps = fileName.split("#");
1192 if ( comps.count() > 1 ) {
1193 context = comps.last();
1195 fileName = comps.join("#");
1199 QString homeDir = "";
1200 if ( !theComponentName.isEmpty() ) {
1201 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1202 if ( !dir.isEmpty() )
1203 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1204 Qtx::addSlash( "share" ) +
1205 Qtx::addSlash( "doc" ) +
1206 Qtx::addSlash( "salome" ) +
1207 Qtx::addSlash( "gui" ) +
1208 Qtx::addSlash( theComponentName ) );
1211 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1212 SUIT_ResourceMgr* resMgr = resourceMgr();
1215 platform = "winapplication";
1217 platform = "application";
1219 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1221 QString quote("\"");
1222 anApp.prepend( quote );
1223 anApp.append( quote );
1226 #if DISABLE_QTXWEBBROWSER
1227 bool useExtBrowser = true;
1229 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1233 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1235 if ( !anApp.isEmpty() ) {
1236 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1240 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1241 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1242 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1243 showPreferences( tr( "PREF_APP" ) );
1247 QStringList parameters;
1248 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1249 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1250 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1251 QProcess::startDetached( "HelpBrowser", parameters );
1256 Sets enable or disable some actions on selection changed.
1258 void LightApp_Application::onSelectionChanged()
1260 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1261 bool canCopy = m ? m->canCopy() : false;
1262 bool canPaste = m ? m->canPaste() : false;
1264 action( EditCopyId )->setEnabled(canCopy);
1265 action( EditPasteId )->setEnabled(canPaste);
1269 SLOT: Performs some actions when dockable windows are triggered
1271 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1275 QWidget* LightApp_Application::dockWindow( const int id ) const
1278 if ( myWin.contains( id ) )
1283 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1288 QDockWidget* dock = 0;
1289 QWidget* w = wid->parentWidget();
1290 while ( w && !dock )
1292 dock = ::qobject_cast<QDockWidget*>( w );
1293 w = w->parentWidget();
1298 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1303 if ( wid != dockWindow( id ) )
1304 removeDockWindow( id );
1306 myWin.insert( id, wid );
1308 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1309 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1311 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1312 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1313 QString( "%1Dock" ).arg( wid->objectName() ) );
1314 dock->setWidget( wid );
1315 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1316 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1317 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1319 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1320 if ( !accel.isEmpty() )
1321 dock->toggleViewAction()->setShortcut( accel );
1326 void LightApp_Application::removeDockWindow( const int id )
1328 QWidget* wid = dockWindow( id );
1334 QDockWidget* dock = windowDock( wid );
1338 dock->setWidget( 0 );
1339 wid->setParent( 0 );
1340 wid->setVisible( false );
1344 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1346 QDockWidget* dock = windowDock( dockWindow( id ) );
1347 if ( dock && desktop() ) {
1348 desktop()->addDockWidget( place, dock );
1349 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1350 if ( a ) a->update();
1356 \param flag - key for window
1357 \param studyId - study id
1358 Flag used how identificator of window in windows list.
1360 QWidget* LightApp_Application::getWindow( const int flag, const int )
1362 QWidget* wid = dockWindow( flag );
1364 insertDockWindow( flag, wid = createWindow( flag ) );
1366 QMap<int, int> winMap;
1367 currentWindows( winMap );
1368 if ( winMap.contains( flag ) )
1369 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1375 \return Object Browser
1377 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1379 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1385 LogWindow* LightApp_Application::logWindow()
1387 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1390 #ifndef DISABLE_PYCONSOLE
1392 This returns the python console integrated to the GUI. Depending
1393 when you request the python console, this function could return
1394 null. Then the optional parameter force (default to false) can be
1395 set to force the creation of the python console if it is not done
1397 \param force - if true, the pythonConsole is created if it does not exist yet
1398 \return Python Console
1400 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1402 QWidget* wid = dockWindow( WT_PyConsole );
1403 if ( !wid && force==true) {
1404 wid = getWindow(WT_PyConsole);
1406 return qobject_cast<PyConsole_Console*>( wid );
1411 Updates object browser and maybe data models
1412 \param updateModels - if it is true, then data models are updated
1414 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1416 // update existing data models
1419 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1420 if ( objectBrowser() )
1421 objectBrowser()->setAutoUpdate( false );
1423 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1425 CAM_Study::ModelList dm_list;
1426 study->dataModels( dm_list );
1427 QListIterator<CAM_DataModel*> it( dm_list );
1428 while ( it.hasNext() ) {
1429 CAM_DataModel* camDM = it.next();
1430 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1431 ((LightApp_DataModel*)camDM)->update();
1435 if( objectBrowser() )
1436 objectBrowser()->setAutoUpdate( isAutoUpdate );
1439 if ( objectBrowser() ) {
1440 objectBrowser()->updateGeometry();
1441 objectBrowser()->updateTree( 0, false );
1448 LightApp_Preferences* LightApp_Application::preferences() const
1450 return preferences( false );
1454 \return first view manager of some type
1455 \param vmType - type of view manager
1456 \param create - is it necessary to create view manager in case, when there is no manager of such type
1458 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1460 SUIT_ViewManager* aVM = viewManager( vmType );
1461 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1462 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1463 if ( anActiveVM && anActiveVM->getType() == vmType )
1465 MESSAGE("aVM = anActiveVM");
1469 if ( aVM && !aVM->getDetached() && create )
1471 if ( !aVM->getActiveView() )
1473 MESSAGE("aVM->createView()");
1478 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1479 desktop()->setActiveWindow( aVM->getActiveView() );
1484 MESSAGE("aVM = createViewManager( vmType )");
1485 aVM = createViewManager( vmType );
1492 Creates view manager of some type
1493 \param vmType - type of view manager
1495 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
1497 SUIT_ResourceMgr* resMgr = resourceMgr();
1499 SUIT_ViewManager* viewMgr = 0;
1500 #ifndef DISABLE_GLVIEWER
1501 if( vmType == GLViewer_Viewer::Type() )
1503 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1504 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1507 #ifndef DISABLE_PLOT2DVIEWER
1508 if( vmType == Plot2d_Viewer::Type() )
1510 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1512 #ifndef DISABLE_SALOMEOBJECT
1513 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1515 new LightApp_Plot2dSelector( v, mySelMgr );
1517 vm = new Plot2d_Viewer();
1519 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1520 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1523 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1524 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1528 #ifndef DISABLE_QXGRAPHVIEWER
1529 if( vmType == QxScene_Viewer::Type() )
1531 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1532 QxScene_Viewer* vm = new QxScene_Viewer();
1533 viewMgr->setViewModel( vm );
1534 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1537 #ifndef DISABLE_GRAPHICSVIEW
1538 if( vmType == GraphicsView_Viewer::Type() )
1540 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1541 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1544 #ifndef DISABLE_PVVIEWER
1545 if( vmType == PVViewer_Viewer::Type() )
1547 if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
1548 viewMgr->getActiveView()->setFocus();
1551 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1555 #ifndef DISABLE_PYVIEWER
1556 if( vmType == PyViewer_Viewer::Type() )
1558 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1561 #ifndef DISABLE_OCCVIEWER
1562 if( vmType == OCCViewer_Viewer::Type() )
1564 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1565 OCCViewer_Viewer* vm;
1566 #ifndef DISABLE_SALOMEOBJECT
1567 vm = new SOCC_Viewer();
1569 vm = new OCCViewer_Viewer( true );
1571 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1572 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1573 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1574 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1575 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1576 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1577 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1578 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1580 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1581 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1582 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1583 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1584 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1585 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1586 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1587 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1588 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1589 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1591 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1592 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1593 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1594 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1595 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1596 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1597 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1598 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1599 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1600 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1601 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1604 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1605 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1608 #ifndef DISABLE_VTKVIEWER
1609 #ifndef DISABLE_SALOMEOBJECT
1610 if ( vmType == SVTK_Viewer::Type() )
1612 if ( vmType == VTKViewer_Viewer::Type() )
1615 #ifndef DISABLE_SALOMEOBJECT
1616 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1617 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1620 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1621 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1622 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1623 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1624 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1625 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1626 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1627 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1628 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1629 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1630 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1631 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1632 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1633 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1634 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1635 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1636 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1637 new LightApp_VTKSelector( vm, mySelMgr );
1640 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1641 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1643 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1651 viewMgr->setDetached(detached);
1652 addViewManager( viewMgr );
1653 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1655 if ( viewWin && desktop() ) {
1656 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1657 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1663 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1665 SUIT_ResourceMgr* resMgr = resourceMgr();
1667 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1669 new LightApp_WgViewModel( vmType, w ) );
1670 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1672 addViewManager( vm );
1673 SUIT_ViewWindow* vw = vm->createViewWindow();
1674 if ( vw && desktop() ) {
1675 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1676 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1679 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1680 myUserWmTypes << vmType;
1685 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1687 SUIT_ResourceMgr* resMgr = resourceMgr();
1689 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1693 QString vmType = vm->getType();
1695 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1697 addViewManager( vm );
1698 SUIT_ViewWindow* vw = vm->createViewWindow();
1699 if ( vw && desktop() ) {
1700 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1701 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1704 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1705 myUserWmTypes << vmType;
1711 SLOT: Removes view manager from application
1713 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1715 removeViewManager( theVM );
1719 Protected SLOT: On study created.
1720 \param theStudy - just created study
1722 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1724 SUIT_DataObject* aRoot = 0;
1725 if ( theStudy && theStudy->root() )
1727 aRoot = theStudy->root();
1728 //aRoot->setName( tr( "DATA_MODELS" ) );
1731 getWindow( WT_ObjectBrowser );
1733 loadDockWindowsState();
1735 if ( objectBrowser() )
1736 objectBrowser()->setRoot( aRoot );
1738 activateModule( defaultModule() );
1740 if ( objectBrowser() )
1741 objectBrowser()->openLevels();
1743 #ifndef DISABLE_PYCONSOLE
1744 if( pythonConsole() )
1745 getPyInterp()->initStudy();
1750 Protected SLOT: On study opened.
1751 \param theStudy - just opened study
1753 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1755 SUIT_DataObject* aRoot = 0;
1756 if ( theStudy && theStudy->root() )
1758 aRoot = theStudy->root();
1762 getWindow( WT_ObjectBrowser );
1764 loadDockWindowsState();
1766 if ( objectBrowser() )
1767 objectBrowser()->setRoot( aRoot );
1769 activateModule( defaultModule() );
1771 if ( objectBrowser() )
1772 objectBrowser()->openLevels();
1774 #ifndef DISABLE_PYCONSOLE
1775 if( pythonConsole() )
1776 getPyInterp()->initStudy();
1782 /*!Protected SLOT. On study saved.*/
1783 void LightApp_Application::onStudySaved( SUIT_Study* s )
1785 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1787 mru->insert( s->studyName() );
1792 /*!Protected SLOT. On study closed.*/
1793 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1796 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1797 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1800 // stop auto-save timer
1801 myAutoSaveTimer->stop();
1803 // Bug 10396: clear selection
1804 mySelMgr->clearSelected();
1806 // Bug 12944: emit signal only after clear selection
1809 activateModule( "" );
1812 /*!Protected SLOT.On desktop activated.*/
1813 void LightApp_Application::onDesktopActivated()
1815 CAM_Application::onDesktopActivated();
1816 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1818 aModule->studyActivated();
1821 void LightApp_Application::studyOpened( SUIT_Study* s )
1823 CAM_Application::studyOpened( s );
1826 updateViewManagers();
1829 void LightApp_Application::studySaved( SUIT_Study* s )
1831 CAM_Application::studyOpened( s );
1832 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1833 if ( aResMgr && activeStudy() ) {
1834 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1835 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1839 void LightApp_Application::studyCreated( SUIT_Study* s )
1841 CAM_Application::studyCreated( s );
1844 updateViewManagers();
1847 /*!Gets file filter.
1848 *\retval QString "(*.hdf)"
1850 QString LightApp_Application::getFileFilter( bool /*open*/) const
1856 Shows file dialog and return user selected file name
1858 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1859 const QString& caption, QWidget* parent )
1863 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1864 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1867 /*! Gets directory*/
1868 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1872 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1875 /*! Get open file names*/
1876 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1877 const QString& caption, QWidget* parent )
1881 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1882 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1885 /*!Private SLOT. Update object browser.*/
1886 void LightApp_Application::onRefresh()
1888 updateObjectBrowser( true );
1891 /*!Private SLOT. Update actions after rename object.*/
1892 void LightApp_Application::onRenamed()
1894 activeStudy()->Modified();
1898 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1899 // To prevent reversion the window should be either aligned during movement and resize.
1900 /*!Private SLOT. Update actions after rename object.*/
1901 /*void LightApp_Application::onMoved()
1903 OCCViewer_ViewManager* viewMgr = 0;
1904 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1906 OCCViewer_ViewWindow* view = 0;
1907 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1909 view->getViewPort()->repaintViewAfterMove();
1914 /*!Private SLOT. Support drag-and-drop operation.*/
1915 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1917 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1921 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1923 aModule->dropObjects( objects, parentObj, row, action );
1926 /*!Private SLOT. On preferences.*/
1927 void LightApp_Application::onPreferences()
1929 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1932 /*!Private SLOT. On preferences.*/
1933 void LightApp_Application::showPreferences( const QString& itemText )
1935 QApplication::setOverrideCursor( Qt::WaitCursor );
1937 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1939 QApplication::restoreOverrideCursor();
1944 preferences()->activateItem( itemText );
1946 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1949 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1950 resourceMgr()->save();
1953 shortcutMgr()->updateShortcuts();
1959 /*!Protected SLOT. On preferences changed.*/
1960 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1962 LightApp_Module* sMod = 0;
1963 CAM_Module* mod = module( modName );
1964 if ( mod && mod->inherits( "LightApp_Module" ) )
1965 sMod = (LightApp_Module*)mod;
1968 sMod->preferencesChanged( section, param );
1970 preferencesChanged( section, param );
1971 // emit signal to allow additional preferences changing processing
1972 emit preferenceChanged( modName, section, param );
1975 /*!Remove all windows from study.*/
1976 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1978 saveDockWindowsState();
1980 if ( SUIT_DataBrowser* ob = objectBrowser() )
1983 CAM_Application::beforeCloseDoc( s );
1986 /*!Update actions.*/
1987 void LightApp_Application::updateActions()
1989 updateCommandsStatus();
1995 SUIT_Study* LightApp_Application::createNewStudy()
1997 LightApp_Application::lastStudyId++;
1999 LightApp_Study* aStudy = new LightApp_Study( this );
2001 // Set up processing of major study-related events
2002 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
2003 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
2004 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
2005 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2011 Creates window by flag.
2012 \param flag - identificator of window type
2014 QWidget* LightApp_Application::createWindow( const int flag )
2018 SUIT_ResourceMgr* resMgr = resourceMgr();
2020 if ( flag == WT_ObjectBrowser )
2022 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2023 ob->setObjectName( "objectBrowser" );
2024 ob->setSortMenuEnabled( true );
2025 ob->setAutoUpdate( true );
2026 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2027 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2029 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2030 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2031 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2033 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2034 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2035 treeModel->setSearcher( this );
2036 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2037 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2039 // Mantis issue 0020136: Drag&Drop in OB
2040 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2042 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2043 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2044 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2045 this, SLOT( onRenamed( ) ) );
2049 // temporary commented
2051 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2053 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2056 // Create OBSelector
2057 new LightApp_OBSelector( ob, mySelMgr );
2058 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2059 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2061 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2063 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2064 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2065 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2067 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2069 #ifndef DISABLE_PYCONSOLE
2070 else if ( flag == WT_PyConsole )
2072 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2073 pyCons->setObjectName( "pythonConsole" );
2074 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2075 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2076 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2077 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2078 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2082 else if ( flag == WT_LogWindow )
2084 LogWindow* logWin = new LogWindow( desktop() );
2085 logWin->setObjectName( "logWindow" );
2086 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2087 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2089 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2095 \return default windows( Object Browser, Python Console )
2096 Adds to map \a aMap.
2098 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2100 #ifndef DISABLE_PYCONSOLE
2101 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2103 if ( activeStudy() ) {
2104 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2105 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2109 /*!Default view managers*/
2110 void LightApp_Application::defaultViewManagers( QStringList& ) const
2116 \return preferences.
2117 Create preferences, if \a crt = true.
2119 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2124 LightApp_Application* that = (LightApp_Application*)this;
2126 bool toCreate = !_prefs_ && crt;
2129 _prefs_ = new LightApp_Preferences( resourceMgr() );
2130 that->createPreferences( _prefs_ );
2133 that->myPrefs = _prefs_;
2135 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2136 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2137 connect( myPrefs, SIGNAL( resetToDefaults() ),
2138 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2143 SUIT_ResourceMgr* resMgr = resourceMgr();
2145 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2146 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2148 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2152 QStringList modNameList;
2153 app->modules( modNameList, false );
2155 QMap<QString, QString> iconMap;
2156 app->moduleIconNames( iconMap );
2158 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2160 if ( !app->isModuleAccessible( *it ) || _prefs_->hasModule( *it ) )
2163 int modId = _prefs_->addPreference( *it );
2164 if ( iconMap.contains( *it ) )
2165 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2169 app->modules( modList );
2170 QListIterator<CAM_Module*> itr( modList );
2171 while ( itr.hasNext() )
2173 LightApp_Module* mod = 0;
2175 CAM_Module* anItem = itr.next();
2176 if ( anItem->inherits( "LightApp_Module" ) )
2177 mod = (LightApp_Module*)anItem;
2179 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2181 _prefs_->addPreference( mod->moduleName() );
2182 mod->createPreferences();
2183 that->emptyPreferences( mod->moduleName() );
2187 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2193 Adds new module to application
2195 void LightApp_Application::moduleAdded( CAM_Module* mod )
2197 CAM_Application::moduleAdded( mod );
2199 LightApp_Module* lightMod = 0;
2200 if ( mod && mod->inherits( "LightApp_Module" ) )
2201 lightMod = (LightApp_Module*)mod;
2203 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2205 myPrefs->addPreference( mod->moduleName() );
2206 lightMod->createPreferences();
2207 emptyPreferences( mod->moduleName() );
2211 void LightApp_Application::emptyPreferences( const QString& modName )
2213 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2214 if ( !item || !item->isEmpty() )
2217 // printf( "---------------------> Modify for empty module.\n" );
2219 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2220 frm->setIcon( item->icon() );
2221 frm->setStretch( false );
2222 item->parentItem()->insertItem( frm, item );
2223 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2230 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2235 QStringList aValuesList;
2236 QList<QVariant> anIndicesList;
2240 // . Top-level "SALOME" preferences group <<start>>
2241 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2242 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2244 // .. "General" preferences tab <<start>>
2245 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2247 // ... "Language" group <<start>>
2248 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2249 pref->setItemProperty( "columns", 2, langGroup );
2250 // .... -> application language
2251 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2252 LightApp_Preferences::Selector, "language", "language" );
2253 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2254 QList<QVariant> aIcons;
2255 QList<QVariant> aNumbers;
2256 QStringList aTitles;
2257 foreach ( QString aLang, aLangs ) {
2258 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2260 aTitles << langToName( aLang );
2262 pref->setItemProperty( "strings", aTitles, curLang );
2263 pref->setItemProperty( "ids", aNumbers, curLang );
2264 pref->setItemProperty( "icons", aIcons, curLang );
2265 pref->setItemProperty( "restart", true, curLang );
2267 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2268 LightApp_Preferences::Bool, "language", "locale" );
2269 pref->setItemProperty( "restart", true, curLocale );
2270 // ... "Language" group <<end>>
2272 // ... "Look and feel" group <<start>>
2273 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2274 pref->setItemProperty( "columns", 2, lookGroup );
2275 // .... -> show splash-screen
2276 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2277 // .... -> opaque resize
2278 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2279 // .... -> drop-down buttons
2280 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2281 // ... "Look and feel" group <<end>>
2283 // ... "Study properties" group <<start>>
2284 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2285 pref->setItemProperty( "columns", 2, studyGroup );
2286 // .... -> multi-file save
2287 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2288 // .... -> ascii save mode
2289 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2290 // .... -> store windows geometry
2291 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2292 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2293 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2294 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2295 // .... -> auto-save
2296 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2297 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2298 pref->setItemProperty( "min", 0, autoSaveInterval );
2299 pref->setItemProperty( "max", 1440, autoSaveInterval );
2300 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2301 // ... "Study properties" group <<end>>
2303 // ... "Help browser" group <<start>>
2304 #ifndef DISABLE_QTXWEBBROWSER
2305 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2307 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2311 QString platform = "winapplication";
2313 QString platform = "application";
2315 // .... -> browser application
2316 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2317 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2318 // .... -> browser parameters
2319 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2320 // ... "Help browser" group <<end>>
2322 // ... "Python console properties" group <<start>>
2323 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2324 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2326 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2327 // .... -> show banner
2328 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2329 // .... -> auto-completion
2330 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2331 // ... "Python console properties" group <<end>>
2333 // ... "MRU" preferences group <<start>>
2334 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2335 pref->setItemProperty( "columns", 4, mruGroup );
2336 // number of MRU items
2337 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2338 "MRU", "visible_count" );
2339 pref->setItemProperty( "min", 0, mruVisCount );
2340 pref->setItemProperty( "max", 100, mruVisCount );
2342 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2343 "MRU", "link_type" );
2344 aValuesList.clear();
2345 anIndicesList.clear();
2346 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2347 anIndicesList << 0 << 1 << 2 ;
2348 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2349 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2350 // ... "MRU" preferences group <<end>>
2352 // ... "Full-screen" group <<start>>
2353 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2354 pref->setItemProperty( "columns", 2, fullScreenGroup );
2355 // .... -> automatic hiding toolbars
2356 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2357 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2358 // ... "Full-screen" group <<end>>
2360 // .. "General" preferences tab <<end>>
2362 // .. "3D viewer" group <<start>>
2363 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2364 // ... -> navigation mode
2365 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2366 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2367 aValuesList.clear();
2368 anIndicesList.clear();
2369 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2370 anIndicesList << 0 << 1;
2371 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2372 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2373 // ... -> zooming mode
2374 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2375 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2376 aValuesList.clear();
2377 anIndicesList.clear();
2378 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2379 anIndicesList << 0 << 1;
2380 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2381 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2382 // ... "Trihedron" group <<start>>
2383 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2384 pref->setItemProperty( "columns", 2, occTriGroup );
2385 // .... -> trihedron size
2386 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2387 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2388 pref->setItemProperty( "min", 1.0E-06, occTS );
2389 pref->setItemProperty( "max", 1000, occTS );
2390 // .... -> relative size of trihedron
2391 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2392 // .... -> show static trihedron
2393 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2394 // ... "Trihedron" group <<end>>
2395 // .. "3D viewer" group <<end>>
2399 #ifndef DISABLE_OCCVIEWER
2400 // .. "OCC viewer" group <<start>>
2401 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2403 // .... -> Projection mode
2404 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2405 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2406 aValuesList.clear();
2407 anIndicesList.clear();
2408 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2409 anIndicesList << 0 << 1;
2410 pref->setItemProperty( "strings", aValuesList, occProjMode );
2411 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2413 // .... -> Stereo group
2414 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2415 pref->setItemProperty( "columns", 2, stereoGroup );
2416 // .... -> Stereo type
2417 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2418 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2419 aValuesList.clear();
2420 anIndicesList.clear();
2422 OCCViewer_Viewer::stereoData( aValuesList, idList);
2423 foreach( int gid, idList ) anIndicesList << gid;
2424 pref->setItemProperty( "strings", aValuesList, stereoType );
2425 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2427 // .... -> Anaglyph filter
2428 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2429 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2430 aValuesList.clear();
2431 anIndicesList.clear();
2432 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2433 anIndicesList << 0 << 1 << 2;
2435 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2436 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2438 // .... -> Convergence distance type
2439 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2440 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2441 aValuesList.clear();
2442 anIndicesList.clear();
2443 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2444 anIndicesList << 0 << 1;
2445 pref->setItemProperty( "strings", aValuesList, occFocusType );
2446 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2448 // .... -> Stereographic focus value
2449 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2450 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2451 pref->setItemProperty( "precision", 3, focusValue );
2452 pref->setItemProperty( "min", 1.0E-03, focusValue );
2453 pref->setItemProperty( "max", 1.0E03, focusValue );
2454 pref->setItemProperty( "step", 0.05, focusValue );
2457 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2458 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2459 aValuesList.clear();
2460 anIndicesList.clear();
2461 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2462 anIndicesList << 0 << 1;
2463 pref->setItemProperty( "strings", aValuesList, occIODType );
2464 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2466 // .... -> Interocular distance (IOD) value
2467 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2468 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2469 pref->setItemProperty( "precision", 3, IODValue );
2470 pref->setItemProperty( "min", 1.0E-03, IODValue );
2471 pref->setItemProperty( "max", 1.0E03, IODValue );
2472 pref->setItemProperty( "step", 0.05, IODValue );
2474 // .... -> Reverse stereo
2475 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2476 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2477 // .... -> Enable V-Sync
2478 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2479 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2480 // .... -> Enable quad-buffer support
2481 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2482 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2484 // ... "Background" group <<start>>
2485 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2486 // pref->setItemProperty( "columns", 2, bgGroup );
2487 aValuesList.clear();
2488 anIndicesList.clear();
2491 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2492 foreach( int gid, idList ) anIndicesList << gid;
2493 // .... -> 3D viewer background
2494 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2495 LightApp_Preferences::Background, "OCCViewer", "background" );
2496 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2497 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2498 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2499 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2500 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2501 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2502 pref->setItemProperty( "custom_enabled", false, bgId );
2503 pref->setItemProperty( "image_formats", formats, bgId );
2504 // .... -> XZ viewer background
2505 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2506 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2507 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2508 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2509 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2510 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2511 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2512 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2513 pref->setItemProperty( "custom_enabled", false, bgId );
2514 pref->setItemProperty( "image_formats", formats, bgId );
2515 // .... -> YZ viewer background
2516 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2517 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2518 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2519 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2520 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2521 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2522 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2523 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2524 pref->setItemProperty( "custom_enabled", false, bgId );
2525 pref->setItemProperty( "image_formats", formats, bgId );
2526 // .... -> XY viewer background
2527 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2528 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2529 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2530 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2531 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2532 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2533 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2534 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2535 pref->setItemProperty( "custom_enabled", false, bgId );
2536 pref->setItemProperty( "image_formats", formats, bgId );
2537 // ... "Background" group <<end>>
2540 // ... "Selection" group <<start>>
2541 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2542 pref->setItemProperty( "columns", 2, occSelectionGroup );
2543 // .... -> enable preselection
2544 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2545 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2546 // .... -> enable selection
2547 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2548 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2549 // ... "Selection" group <<end>>
2551 // ... "Clipping" group <<start>>
2552 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2553 // .... -> clipping color
2554 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2555 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2556 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2557 pref->setItemProperty( "columns", 2, texturePref );
2558 // .... -> use default texture
2559 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2560 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2561 // .... -> clipping texture
2562 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2563 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2564 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2566 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2567 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2568 // .... -> scale factor
2569 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2570 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2571 pref->setItemProperty( "precision", 3, scaleFactor );
2572 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2573 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2574 pref->setItemProperty( "step", 0.1, scaleFactor );
2575 // ... "Clipping" group <<end>>
2577 // ... "Ray tracing" group <<start>>
2578 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2579 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2580 pref->setItemProperty( "columns", 2, rtPref );
2582 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2583 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2584 pref->setItemProperty( "min", 1, rt_depth );
2585 pref->setItemProperty( "max", 10, rt_depth );
2586 pref->setItemProperty( "step", 1, rt_depth );
2587 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2588 // .... -> specular reflections
2589 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2590 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2591 // .... -> adaptive anti-aliasing
2592 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2593 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2594 // .... -> shadows rendering
2595 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2596 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2597 // .... -> transparent shadow
2598 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2599 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2600 // ... "Ray tracing" group <<end>>
2602 // ... "Light source" group <<start>>
2603 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2604 // .... -> light color
2605 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2606 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2607 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2608 pref->setItemProperty( "columns", 3, directionPref );
2609 // .... -> light direction (dx component)
2610 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2611 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2612 pref->setItemProperty( "precision", 2, light_dx );
2613 pref->setItemProperty( "min", -1.0E03, light_dx );
2614 pref->setItemProperty( "max", 1.0E03, light_dx );
2615 pref->setItemProperty( "step", 0.1, light_dx );
2616 // .... -> light direction (dy component)
2617 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2618 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2619 pref->setItemProperty( "precision", 2, light_dy );
2620 pref->setItemProperty( "min", -1.0E03, light_dy );
2621 pref->setItemProperty( "max", 1.0E03, light_dy );
2622 pref->setItemProperty( "step", 0.1, light_dy );
2623 // .... -> light direction (dz component)
2624 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2625 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2626 pref->setItemProperty( "precision", 2, light_dz );
2627 pref->setItemProperty( "min", -1.0E03, light_dz );
2628 pref->setItemProperty( "max", 1.0E03, light_dz );
2629 pref->setItemProperty( "step", 0.1, light_dz );
2630 // ... "Light source" group <<end>>
2632 // ... -> empty frame (for layout) <<start>>
2633 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2634 pref->setItemProperty( "margin", 0, occGen );
2635 pref->setItemProperty( "columns", 2, occGen );
2636 // ... -> empty frame (for layout) <<end>>
2638 // .. "OCC viewer" group <<end>>
2641 #ifndef DISABLE_VTKVIEWER
2642 // .. "VTK viewer" group <<start>>
2643 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2645 // ... -> empty frame (for layout) <<start>>
2646 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2647 //pref->setItemProperty( "columns", 2, vtkGen );
2648 // .... -> projection mode
2649 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2650 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2651 aValuesList.clear();
2652 anIndicesList.clear();
2653 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2654 anIndicesList << 0 << 1;
2655 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2656 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2658 // .... -> Stereo group
2659 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2660 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2661 // .... -> Stereo type
2662 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2663 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2664 aValuesList.clear();
2665 anIndicesList.clear();
2667 SVTK_Viewer::stereoData( aValuesList, idList);
2668 foreach( int gid, idList ) anIndicesList << gid;
2669 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2670 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2671 // .... -> Anaglyph filter
2672 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2673 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2674 aValuesList.clear();
2675 anIndicesList.clear();
2676 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2677 anIndicesList << 0 << 1 << 2;
2679 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2680 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2682 // .... -> Enable quad-buffer support
2683 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2684 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2686 // .... -> background
2687 aValuesList.clear();
2688 anIndicesList.clear();
2691 #ifndef DISABLE_SALOMEOBJECT
2692 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2694 foreach( int gid, idList ) anIndicesList << gid;
2695 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2696 LightApp_Preferences::Background, "VTKViewer", "background" );
2697 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2698 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2699 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2700 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2701 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2702 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2703 pref->setItemProperty( "custom_enabled", false, bgId );
2704 #ifndef DISABLE_SALOMEOBJECT
2705 pref->setItemProperty( "image_formats", formats, bgId );
2707 // .... -> speed increment
2708 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2709 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2710 pref->setItemProperty( "min", 1, vtkSpeed );
2711 pref->setItemProperty( "max", 1000, vtkSpeed );
2712 // .... -> speed mode
2713 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2714 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2715 aValuesList.clear();
2716 anIndicesList.clear();
2717 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2718 anIndicesList << 0 << 1;
2719 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2720 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2722 // ... "Selection" group <<start>>
2723 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2724 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2725 // .... -> preselection
2726 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2727 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2728 aValuesList.clear();
2729 anIndicesList.clear();
2730 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2731 anIndicesList << 0 << 1 << 2;
2732 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2733 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2734 // .... -> enable selection
2735 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2736 // ... "Selection" group <<end>>
2738 // ... -> empty frame (for layout) <<end>>
2740 // ... space mouse sub-group <<start>>
2741 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2742 //pref->setItemProperty( "columns", 2, vtkSM );
2743 // .... -> decrease speed increment
2744 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2745 LightApp_Preferences::Selector, "VTKViewer",
2746 "spacemouse_func1_btn" );
2747 // .... -> increase speed increment
2748 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2749 LightApp_Preferences::Selector, "VTKViewer",
2750 "spacemouse_func2_btn" );
2751 // .... -> dominant / combined switch
2752 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2753 LightApp_Preferences::Selector, "VTKViewer",
2754 "spacemouse_func5_btn" ); //
2755 aValuesList.clear();
2756 anIndicesList.clear();
2757 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2758 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2759 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2760 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2761 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2762 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2763 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2764 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2765 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2766 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2767 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2768 // ... space mouse sub-group <<end>>
2770 // ... avi recording sub-group <<start>>
2771 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2772 pref->setItemProperty( "columns", 2, vtkRec );
2773 // .... -> recording mode
2774 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2775 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2776 aValuesList.clear();
2777 anIndicesList.clear();
2778 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2779 anIndicesList << 0 << 1;
2780 pref->setItemProperty( "strings", aValuesList, modePref );
2781 pref->setItemProperty( "indexes", anIndicesList, modePref );
2783 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2784 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2785 pref->setItemProperty( "min", 0.1, fpsPref );
2786 pref->setItemProperty( "max", 100, fpsPref );
2788 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2789 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2790 pref->setItemProperty( "min", 1, qualityPref );
2791 pref->setItemProperty( "max", 100, qualityPref );
2792 // .... -> progressive mode
2793 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2794 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2795 // ... avi recording sub-group <<end>>
2797 // ... group names sub-group <<start>>
2798 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2799 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2800 pref->setItemProperty( "columns", 2, vtkGN );
2801 // .... -> text color
2802 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2803 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2804 // .... -> transparency
2805 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2806 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2807 pref->setItemProperty( "min", 0.0, transPref );
2808 pref->setItemProperty( "max", 1.0, transPref );
2809 pref->setItemProperty( "step", 0.1, transPref );
2810 // ... -> group names sub-group <<end>>
2811 // .. "VTK viewer" group <<end>>
2814 // .. "Plot2d viewer" group <<start>>
2815 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2816 //pref->setItemProperty( "columns", 2, plot2dGroup );
2818 // ... -> background
2819 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2820 LightApp_Preferences::Color, "Plot2d", "Background" );
2821 // ... -> selection color
2822 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2823 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2825 // ... "Viewer" group <<start>>
2826 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2828 // .... -> curve type
2829 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2830 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2831 aValuesList.clear();
2832 anIndicesList.clear();
2833 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2834 anIndicesList << 0 << 1 << 2 ;
2835 pref->setItemProperty( "strings", aValuesList, curveType );
2836 pref->setItemProperty( "indexes", anIndicesList, curveType );
2837 // .... -> marker size
2838 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2839 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2840 pref->setItemProperty( "min", 0, markerSize );
2841 pref->setItemProperty( "max", 100, markerSize );
2842 // .... -> horizontal scaling mode
2843 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2844 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2845 aValuesList.clear();
2846 anIndicesList.clear();
2847 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2848 anIndicesList << 0 << 1 ;
2849 pref->setItemProperty( "strings", aValuesList, horScale );
2850 pref->setItemProperty( "indexes", anIndicesList, horScale );
2851 // .... -> vertical scaling mode
2852 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2853 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2854 pref->setItemProperty( "strings", aValuesList, verScale );
2855 pref->setItemProperty( "indexes", anIndicesList, verScale );
2857 // .... -> errors/deviation colot
2858 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2859 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2860 // .... -> deviation markers line size
2861 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2862 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2863 pref->setItemProperty( "min", 1, deviationMarkerLw );
2864 pref->setItemProperty( "max", 5, deviationMarkerLw );
2865 // .... -> deviation markers tick mark size
2866 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2867 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2868 pref->setItemProperty( "min", 1, deviationMarkerTs );
2869 pref->setItemProperty( "max", 5, deviationMarkerTs );
2870 // .... "Viewer" group <<end>>
2872 // ... "Legend" group <<start>>
2873 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2875 // .... -> show legend
2876 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2877 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2878 // .... -> legend position
2879 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2880 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2881 aValuesList.clear();
2882 anIndicesList.clear();
2883 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2884 anIndicesList << 0 << 1 << 2 << 3 ;
2885 pref->setItemProperty( "strings", aValuesList, legendPosition );
2886 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2887 // .... -> Symbol type
2888 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2889 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2890 aValuesList.clear();
2891 anIndicesList.clear();
2892 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2893 anIndicesList << 0 << 1 ;
2894 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2895 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2896 // .... -> legend font
2897 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2898 // ... -> font color
2899 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2900 // ... -> selection font color
2901 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2902 // ... "Legend" group <<end>>
2904 // .. "Plot2d viewer" group <<end>>
2906 // .. "PyViewer" preferences tab <<start>>
2907 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2908 // ... "Font settings" group <<start>>
2909 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2910 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2911 LightApp_Preferences::Font, "PyEditor", "Font" );
2912 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2913 // ... "Font settings" group <<end>>
2914 // ... "Display settings" group <<start>>
2915 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2916 pref->setItemProperty( "columns", 2, pyDispGroup );
2917 // ... -> current line highlight
2918 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2919 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2920 // ... -> text wrapping
2921 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2922 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2923 // ... -> center cursor on scroll
2924 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2925 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2926 // ... -> line numbers area
2927 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2928 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2929 // ... "Display settings" group <<end>>
2931 // ... "Editor settings" group <<start>>
2932 int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
2933 // ... -> navigation mode
2934 int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
2935 LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
2936 aValuesList.clear();
2937 anIndicesList.clear();
2938 aValuesList << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
2939 anIndicesList << 0 << 1 << 2 << 3 ;
2940 pref->setItemProperty( "strings", aValuesList, pyCompletion );
2941 pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
2942 // ... "Editor settings" group <<end>>
2944 // ... "Tab settings" group <<start>>
2945 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2946 pref->setItemProperty( "columns", 2, pyTabGroup );
2947 // ... -> tab whitespaces
2948 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2949 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2951 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2952 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2953 // ... "Tab settings" group <<end>>
2954 // ... "Vertical edge settings" group <<start>>
2955 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2956 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2957 // ... -> vertical edge
2958 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2959 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2960 // ... -> number of columns
2961 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2962 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2963 // ... "Vertical edge settings" group <<end>>
2964 // .. "PyEditor" preferences tab <<end>>
2966 // .. "Directories" preferences tab <<start>>
2967 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2968 // ... --> quick directories list
2969 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2970 pref->addPreference( tr( "" ), dirGroup,
2971 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2972 // .. "Directories" preferences tab <<end>>
2974 // .. "Object browser" preferences tab <<start>>
2975 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2977 // ... "Search tool" group <<start>>
2978 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2979 // .... --> auto-hide
2980 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2981 "ObjectBrowser", "auto_hide_search_tool" );
2982 // ... "Search tool" group <<end>>
2984 // ... "Object browser settings" group <<start>>
2985 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2986 pref->setItemProperty( "columns", 2, objSetGroup );
2987 // .... -> auto size first column
2988 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2989 "ObjectBrowser", "auto_size_first" );
2990 // .... -> auto size other columns
2991 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2992 "ObjectBrowser", "auto_size" );
2993 // .... -> resize columns on expand item
2994 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2995 "ObjectBrowser", "resize_on_expand_item" );
2996 // .... -> browse to published object
2997 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2998 "ObjectBrowser", "browse_published_object" );
2999 aValuesList.clear();
3000 anIndicesList.clear();
3001 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
3002 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
3003 pref->setItemProperty( "strings", aValuesList, browsePublished );
3004 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
3005 // ... "Object browser settings" group <<end>>
3006 // .. "Object browser" preferences tab <<end>>
3008 // .. "Shortcuts" preferences tab <<start>>
3009 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3010 // ... "Shortcuts settings" group <<start>>
3011 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3012 pref->addPreference( tr( "" ), shortcutGroup,
3013 LightApp_Preferences::ShortcutTree, "shortcuts" );
3014 // ... "Shortcuts settings" group <<end>>
3015 // .. "Shortcuts" preferences tab <<end>>
3016 // . Top-level "SALOME" preferences group <<end>>
3022 Changes appearance of application according to changed preferences
3023 \param sec - section
3024 \param param - name of changed parameter
3026 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3028 SUIT_ResourceMgr* resMgr = resourceMgr();
3032 if ( sec == "viewers" && param == "drop_down_buttons" )
3034 ViewManagerList vmlist = viewManagers();
3035 foreach( SUIT_ViewManager* vm, vmlist )
3037 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3038 foreach( SUIT_ViewWindow* vw, vwlist )
3039 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3043 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3045 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3046 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3047 QList<SUIT_ViewManager*> lst;
3048 #ifndef DISABLE_OCCVIEWER
3049 viewManagers( OCCViewer_Viewer::Type(), lst );
3050 QListIterator<SUIT_ViewManager*> itOCC( lst );
3051 while ( itOCC.hasNext() && sz >= 0 )
3053 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3054 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3057 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3058 occVM->setTrihedronSize( sz, relative );
3059 occVM->getAISContext()->UpdateCurrentViewer();
3062 #ifndef DISABLE_VTKVIEWER
3063 #ifndef DISABLE_SALOMEOBJECT
3064 viewManagers( SVTK_Viewer::Type(), lst );
3065 QListIterator<SUIT_ViewManager*> itVTK( lst );
3066 while ( itVTK.hasNext() && sz >= 0 )
3068 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3069 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3072 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3075 vtkVM->setTrihedronSize( sz, relative );
3083 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3085 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3086 QList<SUIT_ViewManager*> lst;
3087 #ifndef DISABLE_OCCVIEWER
3088 viewManagers( OCCViewer_Viewer::Type(), lst );
3089 QListIterator<SUIT_ViewManager*> itOCC( lst );
3090 while ( itOCC.hasNext() )
3092 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3093 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3096 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3099 occVM->setStaticTrihedronDisplayed( isVisible );
3103 #ifndef DISABLE_VTKVIEWER
3104 #ifndef DISABLE_SALOMEOBJECT
3105 viewManagers( SVTK_Viewer::Type(), lst );
3106 QListIterator<SUIT_ViewManager*> itVTK( lst );
3107 while ( itVTK.hasNext() )
3109 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3110 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3113 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3116 vtkVM->setStaticTrihedronVisible( isVisible );
3124 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3126 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3127 QList<SUIT_ViewManager*> lst;
3128 #ifndef DISABLE_OCCVIEWER
3129 viewManagers( OCCViewer_Viewer::Type(), lst );
3130 QListIterator<SUIT_ViewManager*> itOCC( lst );
3131 while ( itOCC.hasNext() )
3133 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3134 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3137 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3138 occVM->setInteractionStyle( mode );
3141 #ifndef DISABLE_VTKVIEWER
3142 #ifndef DISABLE_SALOMEOBJECT
3143 viewManagers( SVTK_Viewer::Type(), lst );
3144 QListIterator<SUIT_ViewManager*> itVTK( lst );
3145 while ( itVTK.hasNext() )
3147 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3148 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3151 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3152 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3158 #ifndef DISABLE_OCCVIEWER
3159 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3161 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3162 QList<SUIT_ViewManager*> lst;
3163 viewManagers( OCCViewer_Viewer::Type(), lst );
3164 QListIterator<SUIT_ViewManager*> it( lst );
3165 while ( it.hasNext() )
3167 SUIT_ViewModel* vm = it.next()->getViewModel();
3168 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3171 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3172 occVM->enablePreselection( isToEnablePreselection );
3177 #ifndef DISABLE_OCCVIEWER
3178 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3180 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3181 QList<SUIT_ViewManager*> lst;
3182 viewManagers( OCCViewer_Viewer::Type(), lst );
3183 QListIterator<SUIT_ViewManager*> it( lst );
3184 while ( it.hasNext() )
3186 SUIT_ViewModel* vm = it.next()->getViewModel();
3187 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3190 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3191 occVM->enableSelection( isToEnableSelection );
3196 #ifndef DISABLE_OCCVIEWER
3197 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3199 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3200 QList<SUIT_ViewManager*> lst;
3201 viewManagers( OCCViewer_Viewer::Type(), lst );
3202 QListIterator<SUIT_ViewManager*> it( lst );
3203 while ( it.hasNext() )
3205 SUIT_ViewModel* vm = it.next()->getViewModel();
3206 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3209 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3210 occVM->setClippingColor( aColor );
3215 #ifndef DISABLE_OCCVIEWER
3216 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3217 param == QString( "clipping_texture" ) ||
3218 param == QString( "clipping_modulate" ) ||
3219 param == QString( "clipping_scale" ) ) )
3221 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3222 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3223 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3224 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3225 QList<SUIT_ViewManager*> lst;
3226 viewManagers( OCCViewer_Viewer::Type(), lst );
3227 QListIterator<SUIT_ViewManager*> it( lst );
3228 while ( it.hasNext() )
3230 SUIT_ViewModel* vm = it.next()->getViewModel();
3231 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3234 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3235 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3240 #ifndef DISABLE_OCCVIEWER
3241 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3243 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3244 QList<SUIT_ViewManager*> lst;
3245 viewManagers( OCCViewer_Viewer::Type(), lst );
3246 QListIterator<SUIT_ViewManager*> it( lst );
3247 while ( it.hasNext() )
3249 SUIT_ViewModel* vm = it.next()->getViewModel();
3250 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3253 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3254 occVM->setProjectionType( mode );
3259 #ifndef DISABLE_OCCVIEWER
3260 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3262 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3263 QList<SUIT_ViewManager*> lst;
3264 viewManagers( OCCViewer_Viewer::Type(), lst );
3265 QListIterator<SUIT_ViewManager*> it( lst );
3266 while ( it.hasNext() )
3268 SUIT_ViewModel* vm = it.next()->getViewModel();
3269 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3272 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3273 occVM->setStereoType( mode );
3278 #ifndef DISABLE_OCCVIEWER
3279 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3281 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3282 QList<SUIT_ViewManager*> lst;
3283 viewManagers( OCCViewer_Viewer::Type(), lst );
3284 QListIterator<SUIT_ViewManager*> it( lst );
3285 while ( it.hasNext() )
3287 SUIT_ViewModel* vm = it.next()->getViewModel();
3288 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3291 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3292 occVM->setAnaglyphFilter( mode );
3297 #ifndef DISABLE_OCCVIEWER
3298 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3299 param == QString( "focus_value" ) ) )
3301 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3302 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3303 QList<SUIT_ViewManager*> lst;
3304 viewManagers( OCCViewer_Viewer::Type(), lst );
3305 QListIterator<SUIT_ViewManager*> it( lst );
3306 while ( it.hasNext() )
3308 SUIT_ViewModel* vm = it.next()->getViewModel();
3309 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3312 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3313 occVM->setStereographicFocus( aType, aValue );
3318 #ifndef DISABLE_OCCVIEWER
3319 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3320 param == QString( "iod_value" ) ) )
3322 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3323 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3324 QList<SUIT_ViewManager*> lst;
3325 viewManagers( OCCViewer_Viewer::Type(), lst );
3326 QListIterator<SUIT_ViewManager*> it( lst );
3327 while ( it.hasNext() )
3329 SUIT_ViewModel* vm = it.next()->getViewModel();
3330 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3333 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3334 occVM->setInterocularDistance( aType, aValue );
3339 #ifndef DISABLE_OCCVIEWER
3340 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3342 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3343 QList<SUIT_ViewManager*> lst;
3344 viewManagers( OCCViewer_Viewer::Type(), lst );
3345 QListIterator<SUIT_ViewManager*> it( lst );
3346 while ( it.hasNext() )
3348 SUIT_ViewModel* vm = it.next()->getViewModel();
3349 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3352 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3353 occVM->setReverseStereo( reverse );
3358 #ifndef DISABLE_OCCVIEWER
3359 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3361 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3362 QList<SUIT_ViewManager*> lst;
3363 viewManagers( OCCViewer_Viewer::Type(), lst );
3364 QListIterator<SUIT_ViewManager*> it( lst );
3365 while ( it.hasNext() )
3367 SUIT_ViewModel* vm = it.next()->getViewModel();
3368 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3371 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3372 occVM->setVSync( enable );
3377 #ifndef DISABLE_OCCVIEWER
3378 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3380 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3381 QList<SUIT_ViewManager*> lst;
3382 viewManagers( OCCViewer_Viewer::Type(), lst );
3383 QListIterator<SUIT_ViewManager*> it( lst );
3384 while ( it.hasNext() )
3386 SUIT_ViewModel* vm = it.next()->getViewModel();
3387 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3390 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3391 occVM->setQuadBufferSupport( enable );
3396 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3398 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3399 QList<SUIT_ViewManager*> lst;
3400 #ifndef DISABLE_OCCVIEWER
3401 viewManagers( OCCViewer_Viewer::Type(), lst );
3402 QListIterator<SUIT_ViewManager*> itOCC( lst );
3403 while ( itOCC.hasNext() )
3405 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3406 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3409 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3410 occVM->setZoomingStyle( mode );
3413 #ifndef DISABLE_VTKVIEWER
3414 #ifndef DISABLE_SALOMEOBJECT
3415 viewManagers( SVTK_Viewer::Type(), lst );
3416 QListIterator<SUIT_ViewManager*> itVTK( lst );
3417 while ( itVTK.hasNext() )
3419 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3420 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3423 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3424 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3430 #ifndef DISABLE_VTKVIEWER
3431 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3433 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3434 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3435 QList<SUIT_ViewManager*> lst;
3436 #ifndef DISABLE_SALOMEOBJECT
3437 viewManagers( SVTK_Viewer::Type(), lst );
3438 QListIterator<SUIT_ViewManager*> it( lst );
3439 while ( it.hasNext() )
3441 SUIT_ViewModel* vm = it.next()->getViewModel();
3442 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3445 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3446 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3452 #ifndef DISABLE_VTKVIEWER
3453 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3455 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3456 QList<SUIT_ViewManager*> lst;
3457 #ifndef DISABLE_SALOMEOBJECT
3458 viewManagers( SVTK_Viewer::Type(), lst );
3459 QListIterator<SUIT_ViewManager*> it( lst );
3460 while ( it.hasNext() )
3462 SUIT_ViewModel* vm = it.next()->getViewModel();
3463 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3466 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3467 if( vtkVM ) vtkVM->setProjectionMode( mode );
3473 #ifndef DISABLE_VTKVIEWER
3474 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3476 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3477 QList<SUIT_ViewManager*> lst;
3478 #ifndef DISABLE_SALOMEOBJECT
3479 viewManagers( SVTK_Viewer::Type(), lst );
3480 QListIterator<SUIT_ViewManager*> it( lst );
3481 while ( it.hasNext() )
3483 SUIT_ViewModel* vm = it.next()->getViewModel();
3484 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3487 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3488 if( vtkVM ) vtkVM->setStereoType( mode );
3494 #ifndef DISABLE_VTKVIEWER
3495 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3497 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3498 QList<SUIT_ViewManager*> lst;
3499 #ifndef DISABLE_SALOMEOBJECT
3500 viewManagers( SVTK_Viewer::Type(), lst );
3501 QListIterator<SUIT_ViewManager*> it( lst );
3502 while ( it.hasNext() )
3504 SUIT_ViewModel* vm = it.next()->getViewModel();
3505 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3508 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3509 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3515 #ifndef DISABLE_VTKVIEWER
3516 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3518 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3519 QList<SUIT_ViewManager*> lst;
3520 #ifndef DISABLE_SALOMEOBJECT
3521 viewManagers( SVTK_Viewer::Type(), lst );
3522 QListIterator<SUIT_ViewManager*> it( lst );
3523 while ( it.hasNext() )
3525 SUIT_ViewModel* vm = it.next()->getViewModel();
3526 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3529 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3530 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3536 #ifndef DISABLE_VTKVIEWER
3537 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3539 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3540 QList<SUIT_ViewManager*> lst;
3541 #ifndef DISABLE_SALOMEOBJECT
3542 viewManagers( SVTK_Viewer::Type(), lst );
3543 QListIterator<SUIT_ViewManager*> it( lst );
3544 while ( it.hasNext() )
3546 SUIT_ViewModel* vm = it.next()->getViewModel();
3547 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3550 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3551 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3557 #ifndef DISABLE_VTKVIEWER
3558 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3560 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3561 QList<SUIT_ViewManager*> lst;
3562 #ifndef DISABLE_SALOMEOBJECT
3563 viewManagers( SVTK_Viewer::Type(), lst );
3564 QListIterator<SUIT_ViewManager*> it( lst );
3565 while ( it.hasNext() )
3567 SUIT_ViewModel* vm = it.next()->getViewModel();
3568 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3571 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3572 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3578 #ifndef DISABLE_VTKVIEWER
3579 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3580 param == QString( "spacemouse_func2_btn" ) ||
3581 param == QString( "spacemouse_func5_btn" ) ) )
3583 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3584 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3585 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3586 QList<SUIT_ViewManager*> lst;
3587 #ifndef DISABLE_SALOMEOBJECT
3588 viewManagers( SVTK_Viewer::Type(), lst );
3589 QListIterator<SUIT_ViewManager*> it( lst );
3590 while ( it.hasNext() )
3592 SUIT_ViewModel* vm = it.next()->getViewModel();
3593 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3596 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3597 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3602 if( sec=="ObjectBrowser" )
3604 SUIT_DataBrowser* ob = objectBrowser();
3608 if ( param=="auto_size_first" )
3610 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3611 ob->setAutoSizeFirstColumn( autoSizeFirst );
3612 if ( autoSizeFirst )
3613 ob->adjustFirstColumnWidth();
3615 else if ( param=="auto_size" ) {
3616 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3617 ob->setAutoSizeColumns(autoSize);
3619 ob->adjustColumnsWidth();
3621 else if ( param=="resize_on_expand_item" ) {
3622 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3623 ob->setResizeOnExpandItem(resizeOnExpandItem);
3625 else if ( param == "auto_hide_search_tool" ) {
3626 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3632 if( param=="auto_save_interval" ) {
3633 myAutoSaveTimer->stop();
3634 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3635 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3639 #ifndef DISABLE_PYCONSOLE
3640 if( sec=="PyConsole" && pythonConsole() )
3642 if ( param=="font" ) {
3643 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3645 else if ( param=="show_banner" ) {
3646 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3648 else if ( param=="auto_completion" ) {
3649 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3656 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3658 if ( param == "visible_count" )
3659 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3660 else if ( param == "max_count" )
3661 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3662 else if ( param == "insert_mode" )
3663 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3664 else if ( param == "link_type" )
3665 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3666 else if ( param == "show_clear" )
3667 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3668 else if ( param == "show_mru" )
3669 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3672 if ( sec == "language" && param == "language" )
3674 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3675 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3677 if ( sec == "language" && param == "locale")
3679 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3680 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3682 if ( sec == "desktop" && param == "opaque_resize" ) {
3683 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3684 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3685 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3686 // any dockable window can't be docked to the another area, except initial area.
3687 // It is possible to move window to another area, but it always returns to the initial area.
3689 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3690 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3691 // else dopts &= ~QMainWindow::AnimatedDocks;
3692 // desktop()->setDockOptions( dopts );
3693 desktop()->setOpaqueResize( opaqueResize );
3694 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3695 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3698 #ifndef DISABLE_PLOT2DVIEWER
3699 QList<SUIT_ViewManager*> lst;
3700 viewManagers( Plot2d_Viewer::Type(), lst );
3701 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3702 while ( itPlot2d.hasNext() ) {
3703 SUIT_ViewManager* viewMgr = itPlot2d.next();
3704 SUIT_ViewModel* vm = viewMgr->getViewModel();
3705 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3708 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3710 viewMgr->setViewModel( vm );
3711 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3713 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3714 frame->SetPreference();
3723 void LightApp_Application::loadPreferences()
3725 CAM_Application::loadPreferences();
3727 SUIT_ResourceMgr* aResMgr = resourceMgr();
3732 static bool mru_load = true;
3735 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3737 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3738 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3739 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3740 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3741 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3742 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3743 mru->loadLinks( aResMgr, "MRU" );
3749 QStringList mods = aResMgr->parameters( "windows_visibility" );
3750 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3753 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3754 myWinVis.insert( *itr, arr );
3758 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3759 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3760 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3761 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3762 // else dopts &= ~QMainWindow::AnimatedDocks;
3763 // desktop()->setDockOptions( dopts );
3764 desktop()->setOpaqueResize( opaqueResize );
3765 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3766 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3773 void LightApp_Application::savePreferences()
3775 CAM_Application::savePreferences();
3777 saveDockWindowsState();
3779 SUIT_ResourceMgr* aResMgr = resourceMgr();
3784 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3786 mru->saveLinks( aResMgr, "MRU" );
3788 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3789 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3792 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3794 #if GUI_DEVELOPMENT > 0
3795 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3797 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3804 Updates desktop title
3806 void LightApp_Application::updateDesktopTitle()
3808 QString aTitle = applicationName();
3809 QString aVer = applicationVersion();
3810 if ( !aVer.isEmpty() )
3811 aTitle += QString( " " ) + aVer;
3813 if ( activeStudy() ) {
3814 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3815 aTitle += QString( " - [%1]" ).arg( sName );
3818 desktop()->setWindowTitle( aTitle );
3822 \brief Get map of the operations which can be performed
3823 on the module activation.
3825 The method should return the map of the kind \c {<id>:<name>}
3826 where \c <id> is an integer identifier of the operation and
3827 \c <name> is a title for the button to be added to the
3828 dialog box. After user selects the required operation by the
3829 clicking the corresponding button in the dialog box, its identifier
3830 is passed to the moduleActionSelected() method to process
3833 \return map of the operations
3834 \sa moduleActionSelected()
3836 QMap<int, QString> LightApp_Application::activateModuleActions() const
3838 QMap<int, QString> opmap;
3839 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3840 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3845 \brief Called when the used selectes required operation chosen
3846 from "Activate module" dialog box.
3848 Performs the required operation according to the user choice.
3850 \param id operation identifier
3851 \sa activateModuleActions()
3853 void LightApp_Application::moduleActionSelected( const int id )
3868 Updates windows after close document
3870 void LightApp_Application::afterCloseDoc()
3874 CAM_Application::afterCloseDoc();
3878 Updates actions of active module
3880 void LightApp_Application::updateModuleActions()
3883 if ( activeModule() ) {
3884 modName = activeModule()->moduleName();
3885 if ( !isModuleAccessible( modName ) ) {
3886 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3887 foreach( SUIT_Application* app, apps ) {
3888 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3889 if ( lapp && lapp != this )
3890 lapp->removeModuleAction( modName );
3895 LightApp_ModuleAction* moduleAction =
3896 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3898 moduleAction->setActiveModule( modName );
3901 void LightApp_Application::removeModuleAction( const QString& modName )
3903 LightApp_ModuleAction* moduleAction =
3904 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3906 moduleAction->removeModule( modName );
3909 bool LightApp_Application::checkModule( const QString& title )
3911 if ( title.isEmpty() )
3914 QString library = moduleLibrary( title, true );
3915 if ( library.isEmpty() )
3918 QString name = moduleName( title );
3920 bool isPyModule = library.contains( "SalomePyQtGUI" ) || library.contains( "SalomePyQtGUILight" );
3924 paths = QString( ::getenv( "PATH" ) ).split( ";", QString::SkipEmptyParts );
3925 #elif defined(__APPLE__)
3926 paths = QString( ::getenv( "DYLD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3928 paths = QString( ::getenv( "LD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3931 bool isFound = false;
3932 QStringList::const_iterator it;
3933 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3935 isFound = QFileInfo( Qtx::addSlash( *it ) + library ).exists();
3941 "****************************************************************" << std::endl <<
3942 " Warning: library " << qPrintable( library ) << " is not found!" << std::endl <<
3943 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3944 "****************************************************************" << std::endl);
3950 QString pyModule = QString( "%1GUI.py" ).arg( name );
3951 paths = QString( ::getenv( "PYTHONPATH" ) ).split( ":", QString::SkipEmptyParts );
3954 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3956 isFound = QFileInfo( Qtx::addSlash( *it ) + pyModule ).exists();
3962 "****************************************************************" << std::endl <<
3963 " Warning: Python module " << qPrintable( pyModule ) << " is not found!" << std::endl <<
3964 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3965 "****************************************************************" << std::endl);
3974 Gets current windows.
3975 \param winMap - output current windows map.
3977 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3980 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3981 ((LightApp_Module*)activeModule())->windows( winMap );
3983 defaultWindows( winMap );
3987 Gets current view managers.
3988 \param lst - output current view managers list.
3990 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3993 if ( !activeStudy() )
3996 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3997 ((LightApp_Module*)activeModule())->viewManagers( lst );
3999 defaultViewManagers( lst );
4005 void LightApp_Application::updateWindows()
4007 QMap<int, int> winMap;
4008 currentWindows( winMap );
4010 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
4012 if ( !dockWindow( it.key() ) )
4013 getWindow( it.key() );
4016 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
4018 QWidget* wid = it.value();
4019 if ( winMap.contains( it.key() ) )
4020 wid->setVisible( true );
4025 loadDockWindowsState();
4029 Updates view managers
4031 void LightApp_Application::updateViewManagers()
4034 currentViewManagers( lst );
4036 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
4037 getViewManager( *it, true );
4041 Loads windows geometry
4043 void LightApp_Application::loadDockWindowsState()
4047 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4048 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
4049 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
4052 if ( activeModule() )
4053 modName = activeModule()->name();
4054 else if ( activeStudy() )
4055 modName = "nomodule";
4057 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
4058 QByteArray aDefaultState;
4059 aResMgr->value( "windows_geometry", modName, aDefaultState );
4060 QByteArray aDefaultVisibility;
4061 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
4062 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
4063 aResMgr->setWorkingMode( prevMode );
4065 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
4068 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
4069 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
4071 if ( version > Qtx::versionToId( "7.4.1" ) )
4072 aResMgr->value( "windows_geometry", modName , arr );
4074 arr = aDefaultState;
4075 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4076 desktop()->restoreState( aTargetArray );
4079 QStringList mainToolbarsNames;
4080 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4081 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4082 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4084 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4087 QMap<QString, bool> *tbMap = 0;
4088 QMap<QString, bool> *dwMap = 0;
4090 QMap<QString, bool> userTbMap, userDwMap;
4091 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4093 QMap<QString, bool> defaultTbMap, defaultDwMap;
4094 if(hasDefaultVisibility) {
4095 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4101 if(hasDefaultVisibility){
4102 tbMap = &defaultTbMap;
4109 if(hasDefaultVisibility){
4110 dwMap = &defaultDwMap;
4115 QList<QToolBar*> tbList = findToolBars();
4116 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4118 QToolBar* tb = *tit;
4119 if ( tbMap->contains( tb->objectName() ) ) {
4120 tb->setVisible( (*tbMap)[tb->objectName()] );
4126 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4127 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4129 QDockWidget* dw = *dit;
4131 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4132 if ( po != desktop() )
4135 if ( dwMap->contains( dw->objectName() ) )
4136 dw->setVisible( (*dwMap)[dw->objectName()] );
4144 Saves windows geometry
4146 void LightApp_Application::saveDockWindowsState()
4151 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4152 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4154 if( !storeWin && !storeTb )
4158 if ( activeModule() )
4159 modName = activeModule()->name();
4160 else if ( activeStudy() )
4161 modName = "nomodule";
4163 QString versionId = GUI_VERSION_STR;
4164 #if GUI_DEVELOPMENT > 0
4168 QByteArray arr = desktop()->saveState();
4169 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4170 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4173 if ( myWinVis.contains( modName ) )
4174 visArr = myWinVis[modName];
4176 QMap<QString, bool> tbMap, dwMap;
4177 dockWindowsState( visArr, tbMap, dwMap );
4179 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4180 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4183 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4186 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4187 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4189 QDockWidget* wid = *it;
4190 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4193 visArr = dockWindowsState( tbMap, dwMap );
4195 myWinVis.insert( modName, visArr );
4198 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4201 QDataStream stream( &visArr, QIODevice::WriteOnly );
4203 stream << (uchar)ToolBarMarker;
4204 stream << tb.size();
4205 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4207 stream << tit.key();
4208 stream << (uchar)( tit.value() ? 1 : 0 );
4211 stream << (uchar)DockWidgetMarker;
4212 stream << dw.size();
4213 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4215 stream << wit.key();
4216 stream << (uchar)( wit.value() ? 1 : 0 );
4222 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4227 QByteArray visArr = arr;
4228 QDataStream stream( &visArr, QIODevice::ReadOnly );
4232 if ( marker != ToolBarMarker )
4237 for ( int i = 0; i < lines; ++i )
4240 stream >> objectName;
4243 tb.insert( objectName, shown );
4247 if ( marker != DockWidgetMarker )
4251 for ( int j = 0; j < lines; ++j )
4254 stream >> objectName;
4257 dw.insert( objectName, shown );
4262 Adds icon names for modules
4264 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4268 SUIT_ResourceMgr* resMgr = resourceMgr();
4272 QStringList modList;
4273 modules( modList, false );
4275 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4277 QString modName = *it;
4278 QString modIntr = moduleName( modName );
4279 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4281 if ( modIcon.isEmpty() )
4284 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4285 modIcon += QString( ".png" );
4287 iconMap.insert( modName, modIcon );
4292 Inserts items in popup, which necessary for current application
4294 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4297 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4298 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4299 selMgr->setSelectionCacheEnabled( true );
4301 SUIT_DataBrowser* ob = objectBrowser();
4303 CAM_Application::contextMenuPopup( type, thePopup, title );
4305 if ( ob && type == ob->popupClientType() ) {
4306 thePopup->addSeparator();
4307 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4308 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4309 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4312 #ifndef DISABLE_SALOMEOBJECT
4313 if ( selMgr && ob ) {
4314 SALOME_ListIO selected;
4315 selMgr->selectedObjects( selected );
4316 if(selected.Extent() == 1){
4317 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4318 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4319 if(obj && obj->renameAllowed()) {
4320 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4321 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4322 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4323 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4325 QList<QAction*> acts = thePopup->actions();
4326 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4327 thePopup->insertAction(firstAction,a);
4333 selMgr->setSelectionCacheEnabled( cacheIsOn );
4339 void LightApp_Application::createEmptyStudy()
4341 CAM_Application::createEmptyStudy();
4343 if ( objectBrowser() )
4344 objectBrowser()->updateTree();
4346 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4347 if ( aResMgr && activeStudy() ) {
4348 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4349 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4354 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4356 CAM_Application::setDesktop( desk );
4359 connect( desk, SIGNAL( message( const QString& ) ),
4360 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4361 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4362 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4363 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4364 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4370 \param mod - module to be activated
4372 bool LightApp_Application::activateModule( CAM_Module* mod )
4374 bool res = CAM_Application::activateModule( mod );
4376 if ( objectBrowser() )
4377 objectBrowser()->updateTree();
4383 \return keyborad accelerators manager object
4385 SUIT_Accel* LightApp_Application::accel() const
4391 Removes dead widget container from map
4393 void LightApp_Application::onWCDestroyed( QObject* ob )
4395 // remove destroyed widget container from windows map
4396 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4398 if ( itr.value() != ob )
4401 int key = itr.key();
4402 myWin.remove( key );
4407 void LightApp_Application::onMRUActivated( const QString& name )
4409 SUIT_Session* s = SUIT_Session::session();
4410 if ( s && s->activeApplication() == this )
4414 void LightApp_Application::onStylePreferences()
4416 #ifdef USE_SALOME_STYLE
4417 Style_PrefDlg dlg( desktop() );
4420 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4421 #endif // USE_SALOME_STYLE
4424 void LightApp_Application::onFullScreen(){
4425 if(myScreenHelper) {
4426 if(desktop()->isFullScreen())
4427 myScreenHelper->switchToNormalScreen();
4429 myScreenHelper->switchToFullScreen();
4434 Connects just added view manager
4436 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4438 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4439 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4440 CAM_Application::addViewManager( vm );
4444 Remove view manager from memory
4446 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4448 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4449 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4450 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4452 aStudy->removeObjectProperties( vm->getGlobalId() );
4454 CAM_Application::removeViewManager( vm );
4456 LightApp_SelectionMgr* selMgr = selectionMgr();
4457 QList<SUIT_Selector*> selectors;
4458 selMgr->selectors( selectors );
4459 foreach( SUIT_Selector* selector, selectors ) {
4460 if ( selector->owner() == vm->getViewModel() ) {
4465 // IPAL22894: Crash on closing OCC view
4471 Renames active window of desktop
4473 void LightApp_Application::onRenameWindow()
4478 QWidget* w = desktop()->activeWindow();
4483 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4484 if( ok && !name.isEmpty() )
4485 w->setWindowTitle( name );
4489 Closes active window of desktop
4491 void LightApp_Application::onCloseWindow()
4496 QWidget* w = desktop()->activeWindow();
4504 Closes all windows of desktop
4506 void LightApp_Application::onCloseAllWindow()
4508 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4512 QList<SUIT_ViewWindow*> wndList = desk->windows();
4513 SUIT_ViewWindow* wnd;
4514 foreach( wnd, wndList )
4522 Groups all windows of desktop
4524 void LightApp_Application::onGroupAllWindow()
4526 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4530 QtxWorkstack* wgStack = desk->workstack();
4536 \return default name for an active study
4538 void LightApp_Application::setDefaultStudyName( const QString& theName )
4540 QStringList anInfoList;
4541 modules( anInfoList, false );
4543 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4544 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4545 !aStudy->isSaved() )
4547 aStudy->setStudyName( theName );
4548 updateDesktopTitle();
4553 Custom event handler
4555 bool LightApp_Application::event( QEvent* e )
4557 if( e && e->type()==2000 )
4559 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4560 QString* d = ( QString* )ce->data();
4561 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4563 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4564 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4565 showPreferences( tr( "PREF_APP" ) );
4570 return CAM_Application::event( e );
4573 /*! Check data object */
4574 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4578 bool isSuitable = !theObj->entry().isEmpty() &&
4579 !theObj->componentDataType().isEmpty() &&
4580 !theObj->name().isEmpty();
4587 int LightApp_Application::openChoice( const QString& aName )
4589 int choice = CAM_Application::openChoice( aName );
4591 if ( choice == OpenExist ) // The document is already open.
4593 // Do you want to reload it?
4594 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4595 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4596 choice = OpenReload;
4602 bool LightApp_Application::openAction( const int choice, const QString& aName )
4609 STD_Application* app = 0;
4610 SUIT_Session* session = SUIT_Session::session();
4611 QList<SUIT_Application*> appList = session->applications();
4612 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4614 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4615 app = ::qobject_cast<STD_Application*>( *it );
4620 app->onCloseDoc( false );
4621 appList = session->applications();
4622 STD_Application* other = 0;
4623 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4624 other = ::qobject_cast<STD_Application*>( *it );
4627 res = other->onOpenDoc( aName );
4632 res = CAM_Application::openAction( choice, aName );
4639 QStringList LightApp_Application::viewManagersTypes() const
4641 QStringList aTypesList;
4642 aTypesList += myUserWmTypes;
4643 #ifndef DISABLE_GLVIEWER
4644 aTypesList<<GLViewer_Viewer::Type();
4646 #ifndef DISABLE_PLOT2DVIEWER
4647 aTypesList<<Plot2d_Viewer::Type();
4649 #ifndef DISABLE_QXGRAPHVIEWER
4650 aTypesList<<QxScene_Viewer::Type();
4652 #ifndef DISABLE_PVVIEWER
4653 aTypesList<<PVViewer_Viewer::Type();
4655 #ifndef DISABLE_PYVIEWER
4656 aTypesList<<PyViewer_Viewer::Type();
4658 #ifndef DISABLE_OCCVIEWER
4659 aTypesList<<OCCViewer_Viewer::Type();
4661 #ifndef DISABLE_VTKVIEWER
4662 #ifndef DISABLE_SALOMEOBJECT
4663 aTypesList<<SVTK_Viewer::Type();
4665 aTypesList<<VTKViewer_Viewer::Type();
4671 * Removes all view managers of known types
4672 * Other view managers are ignored
4674 void LightApp_Application::clearKnownViewManagers()
4676 QStringList aTypesList = viewManagersTypes();
4677 QList<SUIT_ViewManager*> aMgrList;
4678 viewManagers( aMgrList );
4679 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4680 if (aTypesList.contains(aMgr->getType()))
4681 removeViewManager(aMgr);
4686 Copy of current selection
4688 void LightApp_Application::onCopy()
4690 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4696 Paste of current data in clipboard
4698 void LightApp_Application::onPaste()
4700 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4706 Browse (i.e. set focus on) the published objects
4707 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4708 has been accepted by Ok (or Apply & Close) button
4709 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4710 (to select the first published object only)
4711 \return entry of the selected object
4713 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4714 const bool theIsApplyAndClose,
4715 const bool theIsOptimizedBrowsing )
4718 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4720 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4721 switch( aBrowsePolicy )
4725 case BP_ApplyAndClose:
4726 if( !theIsApplyAndClose )
4734 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4738 SUIT_DataBrowser* anOB = objectBrowser();
4742 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4746 QStringListIterator anIter( theEntryList );
4747 if( theIsOptimizedBrowsing )
4749 // go to the last entry
4751 if( anIter.hasPrevious() )
4755 // scroll to each entry in the list
4756 // (in optimized mode - to the last entry only)
4758 LightApp_DataObject* anObject = 0;
4759 while( anIter.hasNext() )
4761 anEntry = anIter.next();
4762 if( !anEntry.isEmpty() )
4764 anObject = aStudy->findObjectByEntry( anEntry );
4767 QModelIndex anIndex = aModel->index( anObject );
4768 anOB->treeView()->scrollTo( anIndex );
4773 // always select the last object
4774 if( anObject && !anEntry.isEmpty() )
4776 QList<SUIT_Selector*> aSelectorList;
4777 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4778 if( !aSelectorList.isEmpty() )
4780 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4782 bool anIsAutoBlock = aSelector->autoBlock();
4784 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4785 aSelector->setAutoBlock( false );
4787 SUIT_DataOwnerPtrList aList;
4788 #ifndef DISABLE_SALOMEOBJECT
4789 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4790 ( anObject->entry().toLatin1().constData(),
4791 anObject->componentDataType().toLatin1().constData(),
4792 anObject->name().toLatin1().constData() );
4793 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4795 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4798 aList.append( owner );
4799 selectionMgr()->setSelected( aList );
4802 // restore auto block flag
4803 aSelector->setAutoBlock( anIsAutoBlock );
4811 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4813 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4814 return study ? study->findObjectByEntry( id ) : 0;
4818 Checks that an object can be renamed.
4819 \param entry entry of the object
4820 \brief Return \c true if object can be renamed
4822 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4827 Rename object by entry.
4828 \param entry entry of the object
4829 \param name new name of the object
4830 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4832 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4836 /*! Process standard messages from desktop */
4837 void LightApp_Application::onDesktopMessage( const QString& message )
4839 const QString sectionSeparator = "/";
4841 if ( message.toLower() == "updateobjectbrowser" ||
4842 message.toLower() == "updateobjbrowser" ) {
4843 // update object browser
4844 updateObjectBrowser();
4846 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4847 QString vtype = message.split( sectionSeparator ).last();
4848 if ( !vtype.isEmpty() )
4849 getViewManager( vtype, true );
4852 QStringList data = message.split( sectionSeparator );
4853 if ( data.count() > 1 ) {
4854 QString msgType = data[0].trimmed();
4855 LightApp_Module* sMod = 0;
4856 CAM_Module* mod = module( msgType );
4858 mod = module( moduleTitle( msgType ) );
4859 if ( mod && mod->inherits( "LightApp_Module" ) )
4860 sMod = (LightApp_Module*)mod;
4862 if ( msgType.toLower() == "preferences" ) {
4863 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4864 // for example "preferences/Study/multi_file_dump/true"
4865 if ( data.count() > 3 ) {
4866 QString section = data[1].trimmed();
4867 QString param = data[2].trimmed();
4868 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4869 resourceMgr()->setValue( section, param, value );
4873 // received message for the module
4874 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4875 sMod->message( msg );
4883 Returns all top level toolbars.
4884 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4886 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4888 QList<QToolBar*> aResult;
4889 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4890 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4891 QToolBar* tb = *tit;
4892 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4893 if ( po != desktop() )
4895 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4902 Internal method to parse toolbars and dockable windows state.
4904 QByteArray LightApp_Application::processState(QByteArray& input,
4905 const bool processWin,
4906 const bool processTb,
4907 const bool isRestoring,
4908 QByteArray defaultState) {
4911 bool hasDefaultState = !defaultState.isEmpty();
4912 bool isDockWinWriten = false;
4914 //Write date from users settings
4916 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4917 int marker, version;
4919 tmpInputData >> marker;
4920 tmpInputData >> version;
4921 tmpInputData >> dockmarker;
4922 tmpInputData >> nbDocWin;
4924 if(processWin && processTb && !isRestoring) {
4926 } else if(!processWin && !processTb ) {
4928 aRes = defaultState;
4930 QDataStream aData(&aRes, QIODevice::WriteOnly);
4931 QList<QToolBar*> aToolBars = findToolBars();
4934 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4935 QToolBar* tb = *tit;
4936 aNames.append(tb->objectName());
4939 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4940 if(toolBarMarkerIndex < 0)
4942 QDataStream anInputData(&input, QIODevice::ReadOnly);
4944 int toolBarMarkerIndexDef;
4945 if(hasDefaultState) {
4946 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4947 if(toolBarMarkerIndexDef < 0)
4950 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4952 QDataStream* aTargetData = 0;
4953 int aTargetIndex = -1;
4955 QByteArray currentArr = desktop()->saveState();
4956 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4957 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4958 if(processWin && useInputData) {
4959 aTargetData = &anInputData;
4960 aTargetIndex = toolBarMarkerIndex;
4962 //Write date from default settings
4963 if(hasDefaultState) {
4964 aTargetData = &anInputDataDef;
4965 aTargetIndex = toolBarMarkerIndexDef;
4967 //If no default state, write current snapshot of the dockable windows
4969 aTargetData = &anInputDataCur;
4970 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4971 aTargetIndex = toolBarMarkerIndexCur;
4976 if(aTargetData && aTargetIndex >= 0 ) {
4977 aTargetData->device()->seek(0);
4978 while( aTargetData->device()->pos() < aTargetIndex ) {
4983 isDockWinWriten = true;
4990 aTargetData = &anInputData;
4991 aTargetIndex = toolBarMarkerIndex;
4993 if(hasDefaultState) {
4994 aTargetData = &anInputDataDef;
4995 aTargetIndex = toolBarMarkerIndexDef;
4999 if(aTargetData && aTargetIndex >= 0) {
5001 if(!isDockWinWriten ) {
5002 //Write version marker
5003 int marker, version;
5004 aTargetData->device()->seek(0);
5005 *aTargetData >> marker;
5006 *aTargetData >> version;
5009 aData << (uchar) QDockWidgetMarker;
5011 int shift = 4*sizeof(int) + sizeof(QSize);
5012 index = aTargetIndex - shift;
5014 index = aTargetIndex;
5017 aTargetData->device()->seek(index);
5018 while(!aTargetData->atEnd()) {
5023 } else { // Not treat toolbars
5024 aData << (uchar) QToolBarMarker;
5025 aData << (int) 0; //Nb toolbars = 0
5032 \brief Emits operationFinished signal.
5033 \param theModuleName the name of the module which perfomed the operation
5034 \param theOperationName the operation name
5035 \param theEntryList the list of the created objects entries
5037 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5038 const QString& theOperationName,
5039 const QStringList& theEntryList )
5041 emit operationFinished( theModuleName, theOperationName, theEntryList );
5045 Update visibility state of given objects
5047 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5048 SUIT_ViewModel* theViewModel )
5050 if ( !theViewModel || theList.isEmpty() ) return;
5052 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5053 if ( !aStudy ) return;
5055 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5057 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5058 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5060 if ( !obj || aStudy->isComponent( obj->entry() ) )
5063 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5064 if ( anObjModule ) {
5065 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5067 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5068 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5069 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5070 anObjState = Qtx::ShownState;
5072 anObjState = Qtx::HiddenState;
5074 aStudy->setVisibilityState( obj->entry(), anObjState );
5081 * Called when window activated
5083 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5085 SUIT_DataBrowser* anOB = objectBrowser();
5088 SUIT_DataObject* rootObj = anOB->root();
5092 DataObjectList listObj = rootObj->children( true );
5094 SUIT_ViewModel* vmod = 0;
5095 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5096 vmod = vman->getViewModel();
5097 updateVisibilityState( listObj, vmod );
5101 Called then view manager removed
5103 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5105 ViewManagerList lst;
5106 viewManagers( lst );
5107 if ( lst.count() == 1) { // in case if closed last view window
5108 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5110 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5115 Check existing document.
5117 bool LightApp_Application::checkExistingDoc()
5120 if( activeStudy() ) {
5121 int answer = SUIT_MessageBox::question( desktop(),
5122 tr( "APPCLOSE_CAPTION" ),
5123 tr( "STUDYCLOSE_DESCRIPTION" ),
5124 tr( "APPCLOSE_SAVE" ),
5125 tr( "APPCLOSE_CLOSE" ),
5126 tr( "APPCLOSE_CANCEL" ), 0 );
5128 if ( activeStudy()->isSaved() ) {
5131 } else if ( onSaveAsDoc() ) {
5132 if( !closeDoc( false ) ) {
5139 else if( answer == 1 ) {
5141 } else if( answer == 2 ) {
5148 #ifndef DISABLE_PYCONSOLE
5150 PyConsole_Interp* LightApp_Application::getPyInterp()
5152 static PyConsole_Interp* myInterp = 0;
5154 myInterp = createPyInterp();
5155 myInterp->initialize();
5160 PyConsole_Interp* LightApp_Application::createPyInterp()
5162 return new PyConsole_Interp();
5165 #endif // DISABLE_PYCONSOLE