1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyEditor.h"
39 #include "PyConsole_Interp.h"
40 #include "PyConsole_Console.h"
43 #include "LightApp_Application.h"
44 #include "LightApp_Module.h"
45 #include "LightApp_DataModel.h"
46 #include "LightApp_DataOwner.h"
47 #include "LightApp_Displayer.h"
48 #include "LightApp_Study.h"
49 #include "LightApp_Preferences.h"
50 #include "LightApp_PreferencesDlg.h"
51 #include "LightApp_ModuleDlg.h"
52 #include "LightApp_AboutDlg.h"
53 #include "LightApp_ModuleAction.h"
54 // temporary commented
55 #include "LightApp_EventFilter.h"
56 #include "LightApp_OBSelector.h"
57 #include "LightApp_SelectionMgr.h"
58 #include "LightApp_DataObject.h"
59 #include "LightApp_WgViewModel.h"
60 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
64 #include <SALOME_Event.h>
66 #ifdef USE_SALOME_STYLE
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
69 #endif // USE_SALOME_STYLE
71 #include <CAM_Module.h>
72 #include <CAM_DataModel.h>
73 #include <CAM_Study.h>
74 #include <STD_TabDesktop.h>
76 #include <SUIT_DataBrowser.h>
77 #include <SUIT_Session.h>
78 #include <SUIT_Study.h>
79 #include <SUIT_FileDlg.h>
80 #include <SUIT_ResourceMgr.h>
81 #include <SUIT_ShortcutMgr.h>
82 #include <SUIT_Tools.h>
83 #include <SUIT_Accel.h>
84 #include <SUIT_MessageBox.h>
85 #include <SUIT_ViewWindow.h>
88 #include <QtxFontEdit.h>
89 #include <QtxToolBar.h>
90 #include <QtxTreeView.h>
91 #include <QtxMRUAction.h>
92 #include <QtxDockAction.h>
93 #include <QtxDockWidget.h>
94 #include <QtxActionToolMgr.h>
95 #include <QtxSearchTool.h>
96 #include <QtxWorkstack.h>
99 #include <LogWindow.h>
101 #ifndef DISABLE_GLVIEWER
102 #include <GLViewer_Viewer.h>
103 #include <GLViewer_ViewManager.h>
104 #include "LightApp_GLSelector.h"
107 #ifndef DISABLE_PLOT2DVIEWER
108 #include <Plot2d_ViewManager.h>
109 #include <Plot2d_ViewModel.h>
110 #include <Plot2d_ViewWindow.h>
111 #include <Plot2d_ViewFrame.h>
112 #include "LightApp_Plot2dSelector.h"
113 #ifndef DISABLE_SALOMEOBJECT
114 #include <SPlot2d_ViewModel.h>
116 #include <Plot2d_ViewModel.h>
120 #ifndef DISABLE_OCCVIEWER
121 #include <OCCViewer_ViewManager.h>
122 #include <OCCViewer_ViewFrame.h>
123 #include <OCCViewer_ViewPort3d.h>
124 #ifndef DISABLE_SALOMEOBJECT
125 #include <SOCC_ViewModel.h>
127 #include <OCCViewer_ViewModel.h>
129 #include "LightApp_OCCSelector.h"
132 #ifndef DISABLE_VTKVIEWER
133 #ifndef DISABLE_SALOMEOBJECT
134 #include <SVTK_ViewModel.h>
135 #include <SVTK_ViewManager.h>
136 #include "LightApp_VTKSelector.h"
138 #include <VTKViewer_ViewModel.h>
139 #include <VTKViewer_ViewManager.h>
141 #include <VTKViewer_ViewModel.h>
144 #ifndef DISABLE_QXGRAPHVIEWER
145 #include <QxScene_ViewManager.h>
146 #include <QxScene_ViewModel.h>
147 #include <QxScene_ViewWindow.h>
150 #ifndef DISABLE_GRAPHICSVIEW
151 #include "GraphicsView_Viewer.h"
152 #include "GraphicsView_ViewManager.h"
153 #include "LightApp_GVSelector.h"
156 #ifndef DISABLE_PVVIEWER
157 #include "PVViewer_ViewManager.h"
158 #include "PVViewer_ViewWindow.h"
159 #include "PVViewer_ViewModel.h"
162 #ifndef DISABLE_PYVIEWER
163 #include <PyViewer_ViewManager.h>
164 #include <PyViewer_ViewModel.h>
165 #include <PyViewer_ViewWindow.h>
169 #define VISIBILITY_COLUMN_WIDTH 25
175 #include <QStringList>
177 #include <QApplication>
179 #include <QStatusBar>
181 #include <QObjectList>
183 #include <QInputDialog>
184 #include <QFontDatabase>
186 #include <QByteArray>
190 #include <QHeaderView>
195 #include <utilities.h>
197 #define FIRST_HELP_ID 1000000
199 #ifndef DISABLE_SALOMEOBJECT
200 #include <SALOME_InteractiveObject.hxx>
201 #include <SALOME_ListIO.hxx>
204 #include <Standard_Version.hxx>
206 #define ToolBarMarker 0
207 #define DockWidgetMarker 1
209 static const char* imageEmptyIcon[] = {
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "....................",
231 "...................."};
233 int LightApp_Application::lastStudyId = 0;
235 // Markers used to parse array with dockable windows and toolbars state.
236 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
237 // in the Qt source code.
239 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
240 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
242 // Format of the Byte array with the windows and toolbar state is:
243 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
245 //Find toolbar marker position in the array in the following way:
246 //since the 'toolbar marker' is not unique, find index of first occurrence of the
247 //'toolbar marker' in the array and check that next string is name of the toolbar
251 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
252 int aResult = -1,tmp = 0;
253 int inputLen = input.length();
254 QDataStream anInputData( &input, QIODevice::ReadOnly );
255 while ( tmp < inputLen ) {
256 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
259 anInputData.device()->seek( tmp );
263 anInputData >> lines;
265 if ( lines == 0 && anInputData.atEnd() ) {
266 //Case then array doesn't contain information about toolbars,
277 if ( aFlags.contains( str ) ) {
285 QString langToName( const QString& lang )
287 // special processing for English language to avoid such result as "American English"
288 // as Qt cannot just say "English"
293 result = QLocale( lang ).nativeLanguageName();
299 \return last global id of study
301 int LightApp_Application::studyId()
303 return LightApp_Application::lastStudyId;
306 /*!Create new instance of LightApp_Application.*/
307 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
309 return new LightApp_Application();
312 /*! \var global preferences of LightApp */
313 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
317 \class LightApp_Application
318 Application containing LightApp module
322 LightApp_Application::LightApp_Application()
323 : CAM_Application( false ),
325 myScreenHelper(new LightApp_FullScreenHelper())
327 Q_INIT_RESOURCE( LightApp );
329 STD_TabDesktop* desk = new STD_TabDesktop();
330 desk->setFullScreenAllowed(false);
331 desk->setMinimizeAllowed(false);
335 // initialize auto save timer
336 myAutoSaveTimer = new QTimer( this );
337 myAutoSaveTimer->setSingleShot( true );
338 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
340 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
342 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
343 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
345 desktop()->setWindowIcon( aLogo );
346 desktop()->setDockableMenuBar( false );
347 desktop()->setDockableStatusBar( false );
349 // base logo (salome itself)
350 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
351 // extra logo (salome-based application)
352 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
356 mySelMgr = new LightApp_SelectionMgr( this );
358 myAccel = SUIT_Accel::getAccel();
360 #ifndef DISABLE_OCCVIEWER
361 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
374 #ifndef DISABLE_VTKVIEWER
375 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
386 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
388 #ifndef DISABLE_PLOT2DVIEWER
389 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
395 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
396 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
399 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
400 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
401 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
402 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
403 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
406 // Set existing font for the python console in resources
407 if( !aResMgr->hasValue( "PyConsole", "font" ) )
410 QFont f = aResMgr->fontValue( "PyConsole", "font" );
412 QStringList famdb = fdb.families();
414 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
417 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
419 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
422 if ( famdb.contains(aFamily) )
424 f.setFamily( aFamily );
425 aResMgr->setValue( "PyConsole", "font", f );
432 *\li Save window geometry.
433 *\li Save desktop geometry.
434 *\li Save resource maneger.
435 *\li Delete selection manager.
437 LightApp_Application::~LightApp_Application()
441 delete myScreenHelper;
444 /*!Start application.*/
445 void LightApp_Application::start()
447 CAM_Application::start();
450 updateViewManagers();
451 updateCommandsStatus();
454 desktop()->statusBar()->showMessage( "" );
456 LightApp_EventFilter::Init();
459 /*!Closeapplication.*/
460 void LightApp_Application::closeApplication()
462 #ifndef DISABLE_QTXWEBBROWSER
463 QProcess::startDetached( "HelpBrowser",
464 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
466 CAM_Application::closeApplication();
469 /*!Gets application name.*/
470 QString LightApp_Application::applicationName() const
472 static QString _app_name;
473 if ( _app_name.isEmpty() )
474 _app_name = tr( "APP_NAME" );
478 /*!Gets application version.*/
479 QString LightApp_Application::applicationVersion() const
481 static QString _app_version;
483 if ( _app_version.isEmpty() )
485 QString resVersion = tr( "APP_VERSION" );
486 if ( resVersion != "APP_VERSION" )
488 _app_version = resVersion;
492 _app_version = GUI_VERSION_STR;
498 /*!Load module by \a name.*/
499 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
501 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
504 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
505 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
506 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
511 /*!Activate module by \a modName*/
512 bool LightApp_Application::activateModule( const QString& modName )
515 CAM_Module* prevMod = activeModule();
518 actName = prevMod->moduleName();
520 if ( actName == modName )
523 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
525 saveDockWindowsState();
527 bool status = CAM_Application::activateModule( modName );
529 updateModuleActions();
537 updateViewManagers();
539 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
540 if ( objectBrowser()->root() != activeStudy()->root() )
541 objectBrowser()->setRoot( activeStudy()->root() );
542 updateObjectBrowser( true );
545 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
550 /*!Gets selection manager.*/
551 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
556 /*!Creat action "New window" for certain type of viewer:*/
557 void LightApp_Application::createActionForViewer( const int id,
559 const QString& suffix,
562 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
563 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
564 QAction* a = createAction( id, // menu action id
571 false, // toggle flag
573 SLOT( onNewWindow() ) ); // slot
574 createMenu( a, parentId, -1 );
579 void LightApp_Application::createActions()
581 CAM_Application::createActions();
583 SUIT_Desktop* desk = desktop();
584 SUIT_ResourceMgr* resMgr = resourceMgr();
587 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
588 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
589 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
593 // - Help for modules
595 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
596 createMenu( separator(), helpMenu, -1, 10 );
597 QStringList aModuleList;
598 modules( aModuleList, false );
599 aModuleList.prepend( "GUI" );
600 aModuleList.prepend( "KERNEL" );
602 int id = LightApp_Application::UserID + FIRST_HELP_ID;
605 foreach( aModule, aModuleList ) {
606 if ( aModule.isEmpty() ) // module title (user name)
608 IMap <QString, QString> helpData; // list of help files for the module
609 QString helpSubMenu; // help submenu name (empty if not needed)
610 QString modName = moduleName( aModule ); // module name
611 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
612 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
613 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
615 if (resMgr->hasValue( modName, "documentation" ) )
616 docSection = resMgr->stringValue(modName, "documentation");
617 else if ( resMgr->hasSection( modName + "_documentation" ) )
618 docSection = modName + "_documentation";
619 if ( !docSection.isEmpty() ) {
620 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
621 QStringList listOfParam = resMgr->parameters( docSection );
622 foreach( QString paramName, listOfParam ) {
623 QString valueStr = resMgr->stringValue( docSection, paramName );
624 if ( !valueStr.isEmpty() ) {
625 QFileInfo fi( valueStr );
626 if ( fi.isRelative() && !modDir.isEmpty() )
627 valueStr = Qtx::addSlash( modDir ) + valueStr;
628 if ( QFile::exists( valueStr ) )
629 helpData.insert( paramName.arg( aModule ), valueStr );
634 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
635 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
636 QString indexFile = idxLst.join( QDir::separator() ); // index file
637 if ( QFile::exists( indexFile ) )
638 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
641 IMapConstIterator<QString, QString > fileIt;
642 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
643 QString helpFileName = fileIt.key();
644 // remove all '//' occurances
645 while ( helpFileName.contains( "//" ) )
646 helpFileName.replace( "//", "" );
647 // obtain submenus hierarchy if given
648 QStringList smenus = helpFileName.split( "/" );
649 helpFileName = smenus.last();
651 QAction* a = createAction( id, helpFileName,
652 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
653 helpFileName, helpFileName,
654 0, desk, false, this, SLOT( onHelpContentsModule() ) );
655 a->setData( fileIt.value() );
656 if ( !helpSubMenu.isEmpty() ) {
657 smenus.prepend( helpSubMenu );
659 // create sub-menus hierarchy
660 int menuId = helpMenu;
661 foreach ( QString subMenu, smenus ) {
662 menuId = createMenu( subMenu, menuId, -1, 0 );
664 createMenu( a, menuId, -1, 0 );
669 // - Additional help items
671 createMenu( separator(), helpMenu, -1, 5 );
673 QStringList addHelpItems = resMgr->parameters( "add_help" );
674 foreach ( QString addHelpItem, addHelpItems ) {
675 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
676 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
677 QAction* a = createAction( id, addHelpItem,
678 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
679 addHelpItem, addHelpItem,
680 0, desk, false, this, SLOT( onHelpContentsModule() ) );
681 a->setData( valueStr );
682 createMenu( a, helpMenu, -1, 5 );
688 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
689 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
690 registerAction( MRUId, mru );
692 // default icon for neutral point ('SALOME' module)
693 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
694 if ( defIcon.isNull() )
695 defIcon = QPixmap( imageEmptyIcon );
697 //! default icon for any module
698 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
699 if ( modIcon.isNull() )
700 modIcon = QPixmap( imageEmptyIcon );
703 modules( modList, false );
705 if ( modList.count() > 1 )
707 LightApp_ModuleAction* moduleAction =
708 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
710 QMap<QString, QString> iconMap;
711 moduleIconNames( iconMap );
713 const int iconSize = 20;
715 QStringList::Iterator it;
716 for ( it = modList.begin(); it != modList.end(); ++it )
718 if ( !isLibExists( *it ) )
721 QString modName = moduleName( *it );
723 if ( !isModuleAccessible( *it ) )
727 if ( iconMap.contains( *it ) )
728 iconName = iconMap[*it];
730 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
734 INFOS ( "\n****************************************************************" << std::endl
735 << "* Icon for " << (*it).toLatin1().constData()
736 << " not found. Using the default one." << std::endl
737 << "****************************************************************" << std::endl );
740 icon = Qtx::scaleIcon( icon, iconSize );
742 moduleAction->insertModule( *it, icon );
745 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
746 this, SLOT( onModuleActivation( const QString& ) ) );
747 registerAction( ModulesListId, moduleAction );
751 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
752 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
754 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
755 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
756 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
757 0, desk, false, this, SLOT( onCloseAllWindow() ) );
758 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
759 0, desk, false, this, SLOT( onGroupAllWindow() ) );
761 createMenu( CloseId, windowMenu, 0, -1 );
762 createMenu( CloseAllId, windowMenu, 0, -1 );
763 createMenu( GroupAllId, windowMenu, 0, -1 );
764 createMenu( separator(), windowMenu, -1, 0 );
766 #ifndef DISABLE_GLVIEWER
767 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
769 #ifndef DISABLE_PLOT2DVIEWER
770 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
772 #ifndef DISABLE_OCCVIEWER
773 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
775 #ifndef DISABLE_VTKVIEWER
776 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
778 #ifndef DISABLE_QXGRAPHVIEWER
779 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
781 #ifndef DISABLE_GRAPHICSVIEW
782 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
784 #ifndef DISABLE_PVVIEWER
785 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
787 #ifndef DISABLE_PYVIEWER
788 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
791 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
792 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
793 createMenu( RenameId, windowMenu, -1 );
795 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
796 createMenu( PreferencesId, fileMenu, 50, -1 );
797 createMenu( separator(), fileMenu, -1, 50, -1 );
799 createMenu( separator(), fileMenu, -1, 100, -1 );
800 createMenu( MRUId, fileMenu, 100, -1 );
801 createMenu( separator(), fileMenu, -1, 100, -1 );
803 #ifdef USE_SALOME_STYLE
804 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
805 0, desk, false, this, SLOT( onStylePreferences() ) );
806 #endif // USE_SALOME_STYLE
808 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
809 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
812 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
813 createMenu( separator(), viewMenu, -1, 20, -1 );
814 #ifdef USE_SALOME_STYLE
815 createMenu( StyleId, viewMenu, 20, -1 );
816 #endif // USE_SALOME_STYLE
817 createMenu( FullScreenId, viewMenu, 20, -1 );
819 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
820 QString( "SalomeModules" ) ); // name (language-independant)
821 createTool( ModulesListId, modTBar );
824 /*!On module activation action.*/
825 void LightApp_Application::onModuleActivation( const QString& modName )
827 // Force user to create/open a study before module activation
828 QMap<QString, QString> iconMap;
829 moduleIconNames( iconMap );
830 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
832 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
834 bool cancelled = false;
836 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
837 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
838 QMap<int, QString> opmap = activateModuleActions();
839 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
840 aDlg.addButton( it.value(), it.key() );
842 int res = aDlg.exec();
844 // some operation is selected
845 moduleActionSelected( res );
849 putInfo( tr("INF_CANCELLED") );
851 LightApp_ModuleAction* moduleAction =
852 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
854 moduleAction->setActiveModule( QString() );
860 activateModule( modName );
863 /*!Default module activation.*/
864 QString LightApp_Application::defaultModule() const
866 QStringList aModuleNames;
867 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
868 //! If there's the one and only module --> activate it automatically
869 //! TODO: Possible improvement - default module can be taken from preferences
870 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
873 /*!On new window slot.*/
874 void LightApp_Application::onNewWindow()
876 const QObject* obj = sender();
877 if ( !obj || !obj->inherits( "QAction" ) )
881 int id = actionId( (QAction*)obj );
884 #ifndef DISABLE_GLVIEWER
886 type = GLViewer_Viewer::Type();
889 #ifndef DISABLE_PLOT2DVIEWER
891 type = Plot2d_Viewer::Type();
894 #ifndef DISABLE_OCCVIEWER
896 type = OCCViewer_Viewer::Type();
899 #ifndef DISABLE_VTKVIEWER
901 type = VTKViewer_Viewer::Type();
904 #ifndef DISABLE_QXGRAPHVIEWER
905 case NewQxSceneViewId:
906 type = QxScene_Viewer::Type();
909 #ifndef DISABLE_GRAPHICSVIEW
910 case NewGraphicsViewId:
911 type = GraphicsView_Viewer::Type();
914 #ifndef DISABLE_PVVIEWER
916 type = PVViewer_Viewer::Type();
919 #ifndef DISABLE_PYVIEWER
921 type = PyViewer_Viewer::Type();
926 if ( !type.isEmpty() )
927 createViewManager( type );
931 SLOT: Creates new document
933 void LightApp_Application::onNewDoc()
935 #ifdef SINGLE_DESKTOP
936 if ( !checkExistingDoc() )
940 //asl: fix for 0020515
941 saveDockWindowsState();
943 CAM_Application::onNewDoc();
947 SLOT: Opens new document
949 void LightApp_Application::onOpenDoc()
951 SUIT_Study* study = activeStudy();
953 #ifdef SINGLE_DESKTOP
954 if ( !checkExistingDoc() )
958 CAM_Application::onOpenDoc();
960 if ( !study ) // new study will be create in THIS application
963 updateViewManagers();
968 SLOT: Opens new document.
969 \param aName - name of file
971 bool LightApp_Application::onOpenDoc( const QString& aName )
973 #ifdef SINGLE_DESKTOP
974 if ( !checkExistingDoc() )
978 saveDockWindowsState();
980 // We should take mru action first because this application instance can be deleted later.
981 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
983 bool res = CAM_Application::onOpenDoc( aName );
988 mru->insert( aName );
990 mru->remove( aName );
996 SLOT: Displays "About" message box
998 void LightApp_Application::onHelpAbout()
1000 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1005 Private SLOT: Called on selection is changed
1006 Dispatchs active module that selection is changed
1008 void LightApp_Application::onSelection()
1010 onSelectionChanged();
1012 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1013 ((LightApp_Module*)activeModule())->selectionChanged();
1018 \param study - SUIT_Study.
1020 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1022 CAM_Application::setActiveStudy( study );
1026 Enables/Disables menu items and toolbar buttons. Rebuild menu
1028 void LightApp_Application::updateCommandsStatus()
1030 CAM_Application::updateCommandsStatus();
1033 #ifndef DISABLE_GLVIEWER
1034 a = action( NewGLViewId );
1036 a->setEnabled( activeStudy() );
1039 #ifndef DISABLE_PLOT2DVIEWER
1040 a = action( NewPlot2dId );
1042 a->setEnabled( activeStudy() );
1045 #ifndef DISABLE_OCCVIEWER
1046 a = action( NewOCCViewId );
1048 a->setEnabled( activeStudy() );
1051 #ifndef DISABLE_VTKVIEWER
1052 a = action( NewVTKViewId );
1054 a->setEnabled( activeStudy() );
1057 #ifndef DISABLE_QXGRAPHVIEWER
1058 a = action( NewQxSceneViewId );
1060 a->setEnabled( activeStudy() );
1063 #ifndef DISABLE_GRAPHICSVIEW
1064 a = action( NewGraphicsViewId );
1066 a->setEnabled( activeStudy() );
1069 #ifndef DISABLE_PVVIEWER
1070 a = action( NewPVViewId );
1072 a->setEnabled( activeStudy() );
1075 #ifndef DISABLE_PYVIEWER
1076 a = action( NewPyViewerId );
1078 a->setEnabled( activeStudy() );
1084 Runs system command in separate thread
1086 class RunBrowser: public QThread
1089 RunBrowser( LightApp_Application* app,
1090 const QString& theApp,
1091 const QString& theParams,
1092 const QString& theHelpFile,
1093 const QString& theContext = QString() )
1095 myParams( theParams ),
1096 myContext( theContext ),
1100 //For the external browser always specify 'file://' protocol,
1101 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1102 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1107 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1108 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1110 QProcess* proc = new QProcess();
1112 proc->start( aCommand );
1113 if ( !proc->waitForStarted() ) {
1114 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1115 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1116 ce2000->setData( msg );
1117 QApplication::postEvent( myLApp, ce2000 );
1128 LightApp_Application* myLApp;
1132 SLOT: Displays help contents for choosen module
1134 void LightApp_Application::onHelpContentsModule()
1136 const QAction* a = (QAction*) sender();
1137 QString helpFile = a->data().toString();
1138 if ( helpFile.isEmpty() ) return;
1140 SUIT_ResourceMgr* resMgr = resourceMgr();
1143 platform = "winapplication";
1145 platform = "application";
1147 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1149 QString quote("\"");
1150 anApp.prepend( quote );
1151 anApp.append( quote );
1153 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1154 #if DISABLE_QTXWEBBROWSER
1155 bool useExtBrowser = true;
1157 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1160 if( useExtBrowser ) {
1161 if ( !anApp.isEmpty() ) {
1162 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1166 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1167 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1168 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1170 showPreferences( tr( "PREF_APP" ) );
1174 QStringList parameters;
1175 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1176 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1177 parameters << helpFile;
1178 QProcess::startDetached( "HelpBrowser", parameters );
1183 SLOT: Displays help contents for choosen dialog
1185 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1186 const QString& theFileName,
1187 const QString& theContext )
1189 QString fileName = theFileName;
1190 QString context = theContext;
1191 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1192 // context might be passed within theFileName argument
1193 QStringList comps = fileName.split("#");
1194 if ( comps.count() > 1 ) {
1195 context = comps.last();
1197 fileName = comps.join("#");
1201 QString homeDir = "";
1202 if ( !theComponentName.isEmpty() ) {
1203 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1204 if ( !dir.isEmpty() )
1205 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1206 Qtx::addSlash( "share" ) +
1207 Qtx::addSlash( "doc" ) +
1208 Qtx::addSlash( "salome" ) +
1209 Qtx::addSlash( "gui" ) +
1210 Qtx::addSlash( theComponentName ) );
1213 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1214 SUIT_ResourceMgr* resMgr = resourceMgr();
1217 platform = "winapplication";
1219 platform = "application";
1221 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1223 QString quote("\"");
1224 anApp.prepend( quote );
1225 anApp.append( quote );
1228 #if DISABLE_QTXWEBBROWSER
1229 bool useExtBrowser = true;
1231 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1235 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1237 if ( !anApp.isEmpty() ) {
1238 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1242 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1243 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1244 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1245 showPreferences( tr( "PREF_APP" ) );
1249 QStringList parameters;
1250 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1251 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1252 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1253 QProcess::startDetached( "HelpBrowser", parameters );
1258 Sets enable or disable some actions on selection changed.
1260 void LightApp_Application::onSelectionChanged()
1262 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1263 bool canCopy = m ? m->canCopy() : false;
1264 bool canPaste = m ? m->canPaste() : false;
1266 action( EditCopyId )->setEnabled(canCopy);
1267 action( EditPasteId )->setEnabled(canPaste);
1271 SLOT: Performs some actions when dockable windows are triggered
1273 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1277 QWidget* LightApp_Application::dockWindow( const int id ) const
1280 if ( myWin.contains( id ) )
1285 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1290 QDockWidget* dock = 0;
1291 QWidget* w = wid->parentWidget();
1292 while ( w && !dock )
1294 dock = ::qobject_cast<QDockWidget*>( w );
1295 w = w->parentWidget();
1300 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1305 if ( wid != dockWindow( id ) )
1306 removeDockWindow( id );
1308 myWin.insert( id, wid );
1310 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1311 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1313 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1314 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1315 QString( "%1Dock" ).arg( wid->objectName() ) );
1316 dock->setWidget( wid );
1317 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1318 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1319 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1321 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1322 if ( !accel.isEmpty() )
1323 dock->toggleViewAction()->setShortcut( accel );
1328 void LightApp_Application::removeDockWindow( const int id )
1330 QWidget* wid = dockWindow( id );
1336 QDockWidget* dock = windowDock( wid );
1340 dock->setWidget( 0 );
1341 wid->setParent( 0 );
1342 wid->setVisible( false );
1346 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1348 QDockWidget* dock = windowDock( dockWindow( id ) );
1349 if ( dock && desktop() ) {
1350 desktop()->addDockWidget( place, dock );
1351 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1352 if ( a ) a->update();
1358 \param flag - key for window
1359 \param studyId - study id
1360 Flag used how identificator of window in windows list.
1362 QWidget* LightApp_Application::getWindow( const int flag, const int )
1364 QWidget* wid = dockWindow( flag );
1366 insertDockWindow( flag, wid = createWindow( flag ) );
1368 QMap<int, int> winMap;
1369 currentWindows( winMap );
1370 if ( winMap.contains( flag ) )
1371 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1377 \return Object Browser
1379 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1381 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1387 LogWindow* LightApp_Application::logWindow()
1389 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1392 #ifndef DISABLE_PYCONSOLE
1394 This returns the python console integrated to the GUI. Depending
1395 when you request the python console, this function could return
1396 null. Then the optional parameter force (default to false) can be
1397 set to force the creation of the python console if it is not done
1399 \param force - if true, the pythonConsole is created if it does not exist yet
1400 \return Python Console
1402 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1404 QWidget* wid = dockWindow( WT_PyConsole );
1405 if ( !wid && force==true) {
1406 wid = getWindow(WT_PyConsole);
1408 return qobject_cast<PyConsole_Console*>( wid );
1413 Updates object browser and maybe data models
1414 \param updateModels - if it is true, then data models are updated
1416 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1418 // update existing data models
1421 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1422 if ( objectBrowser() )
1423 objectBrowser()->setAutoUpdate( false );
1425 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1427 CAM_Study::ModelList dm_list;
1428 study->dataModels( dm_list );
1429 QListIterator<CAM_DataModel*> it( dm_list );
1430 while ( it.hasNext() ) {
1431 CAM_DataModel* camDM = it.next();
1432 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1433 ((LightApp_DataModel*)camDM)->update();
1437 if( objectBrowser() )
1438 objectBrowser()->setAutoUpdate( isAutoUpdate );
1441 if ( objectBrowser() ) {
1442 objectBrowser()->updateGeometry();
1443 objectBrowser()->updateTree( 0, false );
1450 LightApp_Preferences* LightApp_Application::preferences() const
1452 return preferences( false );
1456 \return first view manager of some type
1457 \param vmType - type of view manager
1458 \param create - is it necessary to create view manager in case, when there is no manager of such type
1460 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1462 SUIT_ViewManager* aVM = viewManager( vmType );
1463 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1465 if ( anActiveVM && anActiveVM->getType() == vmType )
1468 if ( aVM && create )
1470 if ( !aVM->getActiveView() )
1473 desktop()->setActiveWindow( aVM->getActiveView() );
1476 aVM = createViewManager( vmType );
1482 Creates view manager of some type
1483 \param vmType - type of view manager
1485 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1487 SUIT_ResourceMgr* resMgr = resourceMgr();
1489 SUIT_ViewManager* viewMgr = 0;
1490 #ifndef DISABLE_GLVIEWER
1491 if( vmType == GLViewer_Viewer::Type() )
1493 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1494 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1497 #ifndef DISABLE_PLOT2DVIEWER
1498 if( vmType == Plot2d_Viewer::Type() )
1500 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1502 #ifndef DISABLE_SALOMEOBJECT
1503 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1505 new LightApp_Plot2dSelector( v, mySelMgr );
1507 vm = new Plot2d_Viewer();
1509 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1510 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1513 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1514 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1518 #ifndef DISABLE_QXGRAPHVIEWER
1519 if( vmType == QxScene_Viewer::Type() )
1521 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1522 QxScene_Viewer* vm = new QxScene_Viewer();
1523 viewMgr->setViewModel( vm );
1524 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1527 #ifndef DISABLE_GRAPHICSVIEW
1528 if( vmType == GraphicsView_Viewer::Type() )
1530 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1531 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1534 #ifndef DISABLE_PVVIEWER
1535 if( vmType == PVViewer_Viewer::Type() )
1537 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1538 viewMgr->getActiveView()->setFocus();
1541 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1545 #ifndef DISABLE_PYVIEWER
1546 if( vmType == PyViewer_Viewer::Type() )
1548 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1551 #ifndef DISABLE_OCCVIEWER
1552 if( vmType == OCCViewer_Viewer::Type() )
1554 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1555 OCCViewer_Viewer* vm;
1556 #ifndef DISABLE_SALOMEOBJECT
1557 vm = new SOCC_Viewer();
1559 vm = new OCCViewer_Viewer( true );
1561 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1562 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1563 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1564 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1565 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1566 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1567 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1568 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1570 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1571 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1572 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1573 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1574 #if OCC_VERSION_LARGE > 0x06090000
1575 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1576 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1577 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1578 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1579 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1580 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1582 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1583 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1584 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1586 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1587 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1588 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1589 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1590 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1591 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1592 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1593 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1596 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1597 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1600 #ifndef DISABLE_VTKVIEWER
1601 #ifndef DISABLE_SALOMEOBJECT
1602 if ( vmType == SVTK_Viewer::Type() )
1604 if ( vmType == VTKViewer_Viewer::Type() )
1607 #ifndef DISABLE_SALOMEOBJECT
1608 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1609 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1612 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1613 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1614 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1615 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1616 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1617 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1618 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1619 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1620 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1621 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1622 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1623 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1624 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1625 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1626 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1627 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1628 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1629 new LightApp_VTKSelector( vm, mySelMgr );
1632 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1633 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1635 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1643 addViewManager( viewMgr );
1644 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1646 if ( viewWin && desktop() ) {
1647 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1648 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1654 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1656 SUIT_ResourceMgr* resMgr = resourceMgr();
1658 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1660 new LightApp_WgViewModel( vmType, w ) );
1661 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1663 addViewManager( vm );
1664 SUIT_ViewWindow* vw = vm->createViewWindow();
1665 if ( vw && desktop() ) {
1666 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1667 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1670 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1671 myUserWmTypes << vmType;
1676 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1678 SUIT_ResourceMgr* resMgr = resourceMgr();
1680 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1684 QString vmType = vm->getType();
1686 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1688 addViewManager( vm );
1689 SUIT_ViewWindow* vw = vm->createViewWindow();
1690 if ( vw && desktop() ) {
1691 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1692 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1695 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1696 myUserWmTypes << vmType;
1702 SLOT: Removes view manager from application
1704 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1706 removeViewManager( theVM );
1710 Protected SLOT: On study created.
1711 \param theStudy - just created study
1713 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1715 SUIT_DataObject* aRoot = 0;
1716 if ( theStudy && theStudy->root() )
1718 aRoot = theStudy->root();
1719 //aRoot->setName( tr( "DATA_MODELS" ) );
1722 getWindow( WT_ObjectBrowser );
1724 loadDockWindowsState();
1726 if ( objectBrowser() )
1727 objectBrowser()->setRoot( aRoot );
1729 activateModule( defaultModule() );
1731 if ( objectBrowser() )
1732 objectBrowser()->openLevels();
1734 #ifndef DISABLE_PYCONSOLE
1735 if( pythonConsole() )
1736 getPyInterp()->initStudy();
1741 Protected SLOT: On study opened.
1742 \param theStudy - just opened study
1744 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1746 SUIT_DataObject* aRoot = 0;
1747 if ( theStudy && theStudy->root() )
1749 aRoot = theStudy->root();
1753 getWindow( WT_ObjectBrowser );
1755 loadDockWindowsState();
1757 if ( objectBrowser() )
1758 objectBrowser()->setRoot( aRoot );
1760 activateModule( defaultModule() );
1762 if ( objectBrowser() )
1763 objectBrowser()->openLevels();
1765 #ifndef DISABLE_PYCONSOLE
1766 if( pythonConsole() )
1767 getPyInterp()->initStudy();
1773 /*!Protected SLOT. On study saved.*/
1774 void LightApp_Application::onStudySaved( SUIT_Study* s )
1776 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1778 mru->insert( s->studyName() );
1783 /*!Protected SLOT. On study closed.*/
1784 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1787 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1788 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1791 // stop auto-save timer
1792 myAutoSaveTimer->stop();
1794 // Bug 10396: clear selection
1795 mySelMgr->clearSelected();
1797 // Bug 12944: emit signal only after clear selection
1800 activateModule( "" );
1803 /*!Protected SLOT.On desktop activated.*/
1804 void LightApp_Application::onDesktopActivated()
1806 CAM_Application::onDesktopActivated();
1807 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1809 aModule->studyActivated();
1812 void LightApp_Application::studyOpened( SUIT_Study* s )
1814 CAM_Application::studyOpened( s );
1817 updateViewManagers();
1820 void LightApp_Application::studySaved( SUIT_Study* s )
1822 CAM_Application::studyOpened( s );
1823 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1824 if ( aResMgr && activeStudy() ) {
1825 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1826 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1830 void LightApp_Application::studyCreated( SUIT_Study* s )
1832 CAM_Application::studyCreated( s );
1835 updateViewManagers();
1838 /*!Gets file filter.
1839 *\retval QString "(*.bin)"
1841 QString LightApp_Application::getFileFilter() const
1849 Shows file dialog and return user selected file name
1851 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1852 const QString& caption, QWidget* parent )
1856 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1857 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1860 /*! Gets directory*/
1861 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1865 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1868 /*! Get open file names*/
1869 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1870 const QString& caption, QWidget* parent )
1874 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1875 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1878 /*!Private SLOT. Update object browser.*/
1879 void LightApp_Application::onRefresh()
1881 updateObjectBrowser( true );
1884 /*!Private SLOT. Update actions after rename object.*/
1885 void LightApp_Application::onRenamed()
1887 activeStudy()->Modified();
1891 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1892 // To prevent reversion the window should be either aligned during movement and resize.
1893 /*!Private SLOT. Update actions after rename object.*/
1894 /*void LightApp_Application::onMoved()
1896 OCCViewer_ViewManager* viewMgr = 0;
1897 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1899 OCCViewer_ViewWindow* view = 0;
1900 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1902 view->getViewPort()->repaintViewAfterMove();
1907 /*!Private SLOT. Support drag-and-drop operation.*/
1908 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1910 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1914 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1916 aModule->dropObjects( objects, parentObj, row, action );
1919 /*!Private SLOT. On preferences.*/
1920 void LightApp_Application::onPreferences()
1922 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1925 /*!Private SLOT. On preferences.*/
1926 void LightApp_Application::showPreferences( const QString& itemText )
1928 QApplication::setOverrideCursor( Qt::WaitCursor );
1930 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1932 QApplication::restoreOverrideCursor();
1937 preferences()->activateItem( itemText );
1939 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1942 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1943 resourceMgr()->save();
1946 shortcutMgr()->updateShortcuts();
1952 /*!Protected SLOT. On preferences changed.*/
1953 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1955 LightApp_Module* sMod = 0;
1956 CAM_Module* mod = module( modName );
1957 if ( mod && mod->inherits( "LightApp_Module" ) )
1958 sMod = (LightApp_Module*)mod;
1961 sMod->preferencesChanged( section, param );
1963 preferencesChanged( section, param );
1964 // emit signal to allow additional preferences changing processing
1965 emit preferenceChanged( modName, section, param );
1968 /*!Remove all windows from study.*/
1969 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1971 saveDockWindowsState();
1973 if ( SUIT_DataBrowser* ob = objectBrowser() )
1976 CAM_Application::beforeCloseDoc( s );
1979 /*!Update actions.*/
1980 void LightApp_Application::updateActions()
1982 updateCommandsStatus();
1988 SUIT_Study* LightApp_Application::createNewStudy()
1990 LightApp_Application::lastStudyId++;
1992 LightApp_Study* aStudy = new LightApp_Study( this );
1994 // Set up processing of major study-related events
1995 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1996 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1997 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1998 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2004 Creates window by flag.
2005 \param flag - identificator of window type
2007 QWidget* LightApp_Application::createWindow( const int flag )
2011 SUIT_ResourceMgr* resMgr = resourceMgr();
2013 if ( flag == WT_ObjectBrowser )
2015 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2016 ob->setObjectName( "objectBrowser" );
2017 ob->setSortMenuEnabled( true );
2018 ob->setAutoUpdate( true );
2019 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2020 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2022 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2023 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2024 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2026 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2027 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2028 treeModel->setSearcher( this );
2029 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2030 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2032 // Mantis issue 0020136: Drag&Drop in OB
2033 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2035 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2036 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2037 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2038 this, SLOT( onRenamed( ) ) );
2042 // temporary commented
2044 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2046 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2049 // Create OBSelector
2050 new LightApp_OBSelector( ob, mySelMgr );
2051 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2052 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2054 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2056 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2057 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2058 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2060 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2062 #ifndef DISABLE_PYCONSOLE
2063 else if ( flag == WT_PyConsole )
2065 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2066 pyCons->setObjectName( "pythonConsole" );
2067 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2068 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2069 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2070 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2071 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2075 else if ( flag == WT_LogWindow )
2077 LogWindow* logWin = new LogWindow( desktop() );
2078 logWin->setObjectName( "logWindow" );
2079 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2080 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2082 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2088 \return default windows( Object Browser, Python Console )
2089 Adds to map \a aMap.
2091 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2093 #ifndef DISABLE_PYCONSOLE
2094 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2096 if ( activeStudy() ) {
2097 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2098 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2102 /*!Default view managers*/
2103 void LightApp_Application::defaultViewManagers( QStringList& ) const
2109 \return preferences.
2110 Create preferences, if \a crt = true.
2112 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2117 LightApp_Application* that = (LightApp_Application*)this;
2119 bool toCreate = !_prefs_ && crt;
2122 _prefs_ = new LightApp_Preferences( resourceMgr() );
2123 that->createPreferences( _prefs_ );
2126 that->myPrefs = _prefs_;
2128 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2129 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2130 connect( myPrefs, SIGNAL( resetToDefaults() ),
2131 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2136 SUIT_ResourceMgr* resMgr = resourceMgr();
2138 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2139 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2141 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2145 QStringList modNameList;
2146 app->modules( modNameList, false );
2148 QMap<QString, QString> iconMap;
2149 app->moduleIconNames( iconMap );
2151 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2153 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2156 int modId = _prefs_->addPreference( *it );
2157 if ( iconMap.contains( *it ) )
2158 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2162 app->modules( modList );
2163 QListIterator<CAM_Module*> itr( modList );
2164 while ( itr.hasNext() )
2166 LightApp_Module* mod = 0;
2168 CAM_Module* anItem = itr.next();
2169 if ( anItem->inherits( "LightApp_Module" ) )
2170 mod = (LightApp_Module*)anItem;
2172 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2174 _prefs_->addPreference( mod->moduleName() );
2175 mod->createPreferences();
2176 that->emptyPreferences( mod->moduleName() );
2180 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2186 Adds new module to application
2188 void LightApp_Application::moduleAdded( CAM_Module* mod )
2190 CAM_Application::moduleAdded( mod );
2192 LightApp_Module* lightMod = 0;
2193 if ( mod && mod->inherits( "LightApp_Module" ) )
2194 lightMod = (LightApp_Module*)mod;
2196 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2198 myPrefs->addPreference( mod->moduleName() );
2199 lightMod->createPreferences();
2200 emptyPreferences( mod->moduleName() );
2204 void LightApp_Application::emptyPreferences( const QString& modName )
2206 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2207 if ( !item || !item->isEmpty() )
2210 // printf( "---------------------> Modify for empty module.\n" );
2212 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2213 frm->setIcon( item->icon() );
2214 frm->setStretch( false );
2215 item->parentItem()->insertItem( frm, item );
2216 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2223 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2228 QStringList aValuesList;
2229 QList<QVariant> anIndicesList;
2233 // . Top-level "SALOME" preferences group <<start>>
2234 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2235 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2237 // .. "General" preferences tab <<start>>
2238 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2240 // ... "Language" group <<start>>
2241 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2242 pref->setItemProperty( "columns", 2, langGroup );
2243 // .... -> application language
2244 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2245 LightApp_Preferences::Selector, "language", "language" );
2246 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2247 QList<QVariant> aIcons;
2248 QList<QVariant> aNumbers;
2249 QStringList aTitles;
2250 foreach ( QString aLang, aLangs ) {
2251 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2253 aTitles << langToName( aLang );
2255 pref->setItemProperty( "strings", aTitles, curLang );
2256 pref->setItemProperty( "ids", aNumbers, curLang );
2257 pref->setItemProperty( "icons", aIcons, curLang );
2258 pref->setItemProperty( "restart", true, curLang );
2260 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2261 LightApp_Preferences::Bool, "language", "locale" );
2262 pref->setItemProperty( "restart", true, curLocale );
2263 // ... "Language" group <<end>>
2265 // ... "Look and feel" group <<start>>
2266 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2267 pref->setItemProperty( "columns", 2, lookGroup );
2268 // .... -> show splash-screen
2269 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2270 // .... -> opaque resize
2271 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2272 // .... -> drop-down buttons
2273 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2274 // ... "Look and feel" group <<end>>
2276 // ... "Study properties" group <<start>>
2277 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2278 pref->setItemProperty( "columns", 2, studyGroup );
2279 // .... -> multi-file save
2280 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2281 // .... -> ascii save mode
2282 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2283 // .... -> store windows geometry
2284 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2285 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2286 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2287 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2288 // .... -> auto-save
2289 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2290 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2291 pref->setItemProperty( "min", 0, autoSaveInterval );
2292 pref->setItemProperty( "max", 1440, autoSaveInterval );
2293 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2294 // ... "Study properties" group <<end>>
2296 // ... "Help browser" group <<start>>
2297 #ifndef DISABLE_QTXWEBBROWSER
2298 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2300 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2304 QString platform = "winapplication";
2306 QString platform = "application";
2308 // .... -> browser application
2309 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2310 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2311 // .... -> browser parameters
2312 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2313 // ... "Help browser" group <<end>>
2315 // ... "Python console properties" group <<start>>
2316 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2317 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2319 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2320 // .... -> show banner
2321 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2322 // .... -> auto-completion
2323 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2324 // ... "Python console properties" group <<end>>
2326 // ... "MRU" preferences group <<start>>
2327 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2328 pref->setItemProperty( "columns", 4, mruGroup );
2329 // number of MRU items
2330 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2331 "MRU", "visible_count" );
2332 pref->setItemProperty( "min", 0, mruVisCount );
2333 pref->setItemProperty( "max", 100, mruVisCount );
2335 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2336 "MRU", "link_type" );
2337 aValuesList.clear();
2338 anIndicesList.clear();
2339 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2340 anIndicesList << 0 << 1 << 2 ;
2341 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2342 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2343 // ... "MRU" preferences group <<end>>
2345 // ... "Full-screen" group <<start>>
2346 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2347 pref->setItemProperty( "columns", 2, fullScreenGroup );
2348 // .... -> automatic hiding toolbars
2349 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2350 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2351 // ... "Full-screen" group <<end>>
2353 // .. "General" preferences tab <<end>>
2355 // .. "3D viewer" group <<start>>
2356 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2357 // ... -> navigation mode
2358 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2359 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2360 aValuesList.clear();
2361 anIndicesList.clear();
2362 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2363 anIndicesList << 0 << 1;
2364 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2365 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2366 // ... -> zooming mode
2367 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2368 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2369 aValuesList.clear();
2370 anIndicesList.clear();
2371 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2372 anIndicesList << 0 << 1;
2373 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2374 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2375 // ... "Trihedron" group <<start>>
2376 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2377 pref->setItemProperty( "columns", 2, occTriGroup );
2378 // .... -> trihedron size
2379 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2380 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2381 pref->setItemProperty( "min", 1.0E-06, occTS );
2382 pref->setItemProperty( "max", 1000, occTS );
2383 // .... -> relative size of trihedron
2384 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2385 // .... -> show static trihedron
2386 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2387 // ... "Trihedron" group <<end>>
2388 // .. "3D viewer" group <<end>>
2392 #ifndef DISABLE_OCCVIEWER
2393 // .. "OCC viewer" group <<start>>
2394 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2396 // .... -> Projection mode
2397 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2398 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2399 aValuesList.clear();
2400 anIndicesList.clear();
2401 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2402 anIndicesList << 0 << 1;
2403 pref->setItemProperty( "strings", aValuesList, occProjMode );
2404 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2405 #if OCC_VERSION_LARGE > 0x06090000
2406 // .... -> Stereo group
2407 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2408 pref->setItemProperty( "columns", 2, stereoGroup );
2409 // .... -> Stereo type
2410 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2411 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2412 aValuesList.clear();
2413 anIndicesList.clear();
2415 OCCViewer_Viewer::stereoData( aValuesList, idList);
2416 foreach( int gid, idList ) anIndicesList << gid;
2417 pref->setItemProperty( "strings", aValuesList, stereoType );
2418 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2420 // .... -> Anaglyph filter
2421 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2422 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2423 aValuesList.clear();
2424 anIndicesList.clear();
2425 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2426 anIndicesList << 0 << 1 << 2;
2428 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2429 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2431 // .... -> Convergence distance type
2432 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2433 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2434 aValuesList.clear();
2435 anIndicesList.clear();
2436 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2437 anIndicesList << 0 << 1;
2438 pref->setItemProperty( "strings", aValuesList, occFocusType );
2439 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2441 // .... -> Stereographic focus value
2442 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2443 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2444 pref->setItemProperty( "precision", 3, focusValue );
2445 pref->setItemProperty( "min", 1.0E-03, focusValue );
2446 pref->setItemProperty( "max", 1.0E03, focusValue );
2447 pref->setItemProperty( "step", 0.05, focusValue );
2450 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2451 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2452 aValuesList.clear();
2453 anIndicesList.clear();
2454 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2455 anIndicesList << 0 << 1;
2456 pref->setItemProperty( "strings", aValuesList, occIODType );
2457 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2459 // .... -> Interocular distance (IOD) value
2460 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2461 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2462 pref->setItemProperty( "precision", 3, IODValue );
2463 pref->setItemProperty( "min", 1.0E-03, IODValue );
2464 pref->setItemProperty( "max", 1.0E03, IODValue );
2465 pref->setItemProperty( "step", 0.05, IODValue );
2467 // .... -> Reverse stereo
2468 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2469 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2470 // .... -> Enable V-Sync
2471 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2472 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2473 // .... -> Enable quad-buffer support
2474 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2475 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2477 // ... "Background" group <<start>>
2478 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2479 // pref->setItemProperty( "columns", 2, bgGroup );
2480 aValuesList.clear();
2481 anIndicesList.clear();
2484 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2485 foreach( int gid, idList ) anIndicesList << gid;
2486 // .... -> 3D viewer background
2487 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2488 LightApp_Preferences::Background, "OCCViewer", "background" );
2489 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2490 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2491 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2492 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2493 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2494 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2495 pref->setItemProperty( "custom_enabled", false, bgId );
2496 pref->setItemProperty( "image_formats", formats, bgId );
2497 // .... -> XZ viewer background
2498 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2499 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2500 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2501 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2502 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2503 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2504 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2505 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2506 pref->setItemProperty( "custom_enabled", false, bgId );
2507 pref->setItemProperty( "image_formats", formats, bgId );
2508 // .... -> YZ viewer background
2509 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2510 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2511 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2512 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2513 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2514 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2515 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2516 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2517 pref->setItemProperty( "custom_enabled", false, bgId );
2518 pref->setItemProperty( "image_formats", formats, bgId );
2519 // .... -> XY viewer background
2520 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2521 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2522 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2523 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2524 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2525 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2526 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2527 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2528 pref->setItemProperty( "custom_enabled", false, bgId );
2529 pref->setItemProperty( "image_formats", formats, bgId );
2530 // ... "Background" group <<end>>
2533 // ... "Selection" group <<start>>
2534 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2535 pref->setItemProperty( "columns", 2, occSelectionGroup );
2536 // .... -> enable preselection
2537 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2538 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2539 // .... -> enable selection
2540 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2541 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2542 // ... "Selection" group <<end>>
2544 // ... "Clipping" group <<start>>
2545 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2546 // .... -> clipping color
2547 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2548 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2549 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2550 pref->setItemProperty( "columns", 2, texturePref );
2551 // .... -> use default texture
2552 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2553 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2554 // .... -> clipping texture
2555 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2556 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2557 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2559 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2560 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2561 // .... -> scale factor
2562 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2563 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2564 pref->setItemProperty( "precision", 3, scaleFactor );
2565 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2566 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2567 pref->setItemProperty( "step", 0.1, scaleFactor );
2568 // ... "Clipping" group <<end>>
2570 // ... "Ray tracing" group <<start>>
2571 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2572 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2573 pref->setItemProperty( "columns", 2, rtPref );
2575 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2576 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2577 pref->setItemProperty( "min", 1, rt_depth );
2578 pref->setItemProperty( "max", 10, rt_depth );
2579 pref->setItemProperty( "step", 1, rt_depth );
2580 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2581 // .... -> specular reflections
2582 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2583 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2584 // .... -> adaptive anti-aliasing
2585 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2586 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2587 // .... -> shadows rendering
2588 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2589 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2590 // .... -> transparent shadow
2591 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2592 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2593 // ... "Ray tracing" group <<end>>
2595 // ... "Light source" group <<start>>
2596 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2597 // .... -> light color
2598 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2599 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2600 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2601 pref->setItemProperty( "columns", 3, directionPref );
2602 // .... -> light direction (dx component)
2603 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2604 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2605 pref->setItemProperty( "precision", 2, light_dx );
2606 pref->setItemProperty( "min", -1.0E03, light_dx );
2607 pref->setItemProperty( "max", 1.0E03, light_dx );
2608 pref->setItemProperty( "step", 0.1, light_dx );
2609 // .... -> light direction (dy component)
2610 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2611 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2612 pref->setItemProperty( "precision", 2, light_dy );
2613 pref->setItemProperty( "min", -1.0E03, light_dy );
2614 pref->setItemProperty( "max", 1.0E03, light_dy );
2615 pref->setItemProperty( "step", 0.1, light_dy );
2616 // .... -> light direction (dz component)
2617 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2618 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2619 pref->setItemProperty( "precision", 2, light_dz );
2620 pref->setItemProperty( "min", -1.0E03, light_dz );
2621 pref->setItemProperty( "max", 1.0E03, light_dz );
2622 pref->setItemProperty( "step", 0.1, light_dz );
2623 // ... "Light source" group <<end>>
2625 // ... -> empty frame (for layout) <<start>>
2626 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2627 pref->setItemProperty( "margin", 0, occGen );
2628 pref->setItemProperty( "columns", 2, occGen );
2629 // ... -> empty frame (for layout) <<end>>
2631 // .. "OCC viewer" group <<end>>
2634 #ifndef DISABLE_VTKVIEWER
2635 // .. "VTK viewer" group <<start>>
2636 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2638 // ... -> empty frame (for layout) <<start>>
2639 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2640 //pref->setItemProperty( "columns", 2, vtkGen );
2641 // .... -> projection mode
2642 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2643 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2644 aValuesList.clear();
2645 anIndicesList.clear();
2646 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2647 anIndicesList << 0 << 1;
2648 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2649 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2651 // .... -> Stereo group
2652 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2653 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2654 // .... -> Stereo type
2655 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2656 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2657 aValuesList.clear();
2658 anIndicesList.clear();
2660 SVTK_Viewer::stereoData( aValuesList, idList);
2661 foreach( int gid, idList ) anIndicesList << gid;
2662 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2663 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2664 // .... -> Anaglyph filter
2665 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2666 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2667 aValuesList.clear();
2668 anIndicesList.clear();
2669 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2670 anIndicesList << 0 << 1 << 2;
2672 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2673 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2675 // .... -> Enable quad-buffer support
2676 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2677 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2679 // .... -> background
2680 aValuesList.clear();
2681 anIndicesList.clear();
2684 #ifndef DISABLE_SALOMEOBJECT
2685 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2687 foreach( int gid, idList ) anIndicesList << gid;
2688 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2689 LightApp_Preferences::Background, "VTKViewer", "background" );
2690 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2691 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2692 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2693 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2694 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2695 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2696 pref->setItemProperty( "custom_enabled", false, bgId );
2697 #ifndef DISABLE_SALOMEOBJECT
2698 pref->setItemProperty( "image_formats", formats, bgId );
2700 // .... -> speed increment
2701 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2702 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2703 pref->setItemProperty( "min", 1, vtkSpeed );
2704 pref->setItemProperty( "max", 1000, vtkSpeed );
2705 // .... -> speed mode
2706 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2707 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2708 aValuesList.clear();
2709 anIndicesList.clear();
2710 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2711 anIndicesList << 0 << 1;
2712 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2713 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2715 // ... "Selection" group <<start>>
2716 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2717 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2718 // .... -> preselection
2719 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2720 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2721 aValuesList.clear();
2722 anIndicesList.clear();
2723 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2724 anIndicesList << 0 << 1 << 2;
2725 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2726 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2727 // .... -> enable selection
2728 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2729 // ... "Selection" group <<end>>
2731 // ... -> empty frame (for layout) <<end>>
2733 // ... space mouse sub-group <<start>>
2734 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2735 //pref->setItemProperty( "columns", 2, vtkSM );
2736 // .... -> decrease speed increment
2737 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2738 LightApp_Preferences::Selector, "VTKViewer",
2739 "spacemouse_func1_btn" );
2740 // .... -> increase speed increment
2741 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2742 LightApp_Preferences::Selector, "VTKViewer",
2743 "spacemouse_func2_btn" );
2744 // .... -> dominant / combined switch
2745 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2746 LightApp_Preferences::Selector, "VTKViewer",
2747 "spacemouse_func5_btn" ); //
2748 aValuesList.clear();
2749 anIndicesList.clear();
2750 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2751 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2752 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2753 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2754 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2755 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2756 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2757 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2758 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2759 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2760 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2761 // ... space mouse sub-group <<end>>
2763 // ... avi recording sub-group <<start>>
2764 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2765 pref->setItemProperty( "columns", 2, vtkRec );
2766 // .... -> recording mode
2767 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2768 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2769 aValuesList.clear();
2770 anIndicesList.clear();
2771 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2772 anIndicesList << 0 << 1;
2773 pref->setItemProperty( "strings", aValuesList, modePref );
2774 pref->setItemProperty( "indexes", anIndicesList, modePref );
2776 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2777 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2778 pref->setItemProperty( "min", 0.1, fpsPref );
2779 pref->setItemProperty( "max", 100, fpsPref );
2781 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2782 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2783 pref->setItemProperty( "min", 1, qualityPref );
2784 pref->setItemProperty( "max", 100, qualityPref );
2785 // .... -> progressive mode
2786 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2787 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2788 // ... avi recording sub-group <<end>>
2790 // ... group names sub-group <<start>>
2791 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2792 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2793 pref->setItemProperty( "columns", 2, vtkGN );
2794 // .... -> text color
2795 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2796 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2797 // .... -> transparency
2798 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2799 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2800 pref->setItemProperty( "min", 0.0, transPref );
2801 pref->setItemProperty( "max", 1.0, transPref );
2802 pref->setItemProperty( "step", 0.1, transPref );
2803 // ... -> group names sub-group <<end>>
2804 // .. "VTK viewer" group <<end>>
2807 // .. "Plot2d viewer" group <<start>>
2808 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2809 //pref->setItemProperty( "columns", 2, plot2dGroup );
2811 // ... -> background
2812 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2813 LightApp_Preferences::Color, "Plot2d", "Background" );
2814 // ... -> selection color
2815 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2816 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2818 // ... "Viewer" group <<start>>
2819 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2821 // .... -> curve type
2822 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2823 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2824 aValuesList.clear();
2825 anIndicesList.clear();
2826 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2827 anIndicesList << 0 << 1 << 2 ;
2828 pref->setItemProperty( "strings", aValuesList, curveType );
2829 pref->setItemProperty( "indexes", anIndicesList, curveType );
2830 // .... -> marker size
2831 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2832 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2833 pref->setItemProperty( "min", 0, markerSize );
2834 pref->setItemProperty( "max", 100, markerSize );
2835 // .... -> horizontal scaling mode
2836 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2837 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2838 aValuesList.clear();
2839 anIndicesList.clear();
2840 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2841 anIndicesList << 0 << 1 ;
2842 pref->setItemProperty( "strings", aValuesList, horScale );
2843 pref->setItemProperty( "indexes", anIndicesList, horScale );
2844 // .... -> vertical scaling mode
2845 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2846 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2847 pref->setItemProperty( "strings", aValuesList, verScale );
2848 pref->setItemProperty( "indexes", anIndicesList, verScale );
2850 // .... -> errors/deviation colot
2851 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2852 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2853 // .... -> deviation markers line size
2854 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2855 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2856 pref->setItemProperty( "min", 1, deviationMarkerLw );
2857 pref->setItemProperty( "max", 5, deviationMarkerLw );
2858 // .... -> deviation markers tick mark size
2859 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2860 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2861 pref->setItemProperty( "min", 1, deviationMarkerTs );
2862 pref->setItemProperty( "max", 5, deviationMarkerTs );
2863 // .... "Viewer" group <<end>>
2865 // ... "Legend" group <<start>>
2866 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2868 // .... -> show legend
2869 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2870 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2871 // .... -> legend position
2872 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2873 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2874 aValuesList.clear();
2875 anIndicesList.clear();
2876 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2877 anIndicesList << 0 << 1 << 2 << 3 ;
2878 pref->setItemProperty( "strings", aValuesList, legendPosition );
2879 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2880 // .... -> Symbol type
2881 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2882 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2883 aValuesList.clear();
2884 anIndicesList.clear();
2885 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2886 anIndicesList << 0 << 1 ;
2887 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2888 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2889 // .... -> legend font
2890 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2891 // ... -> font color
2892 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2893 // ... -> selection font color
2894 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2895 // ... "Legend" group <<end>>
2897 // .. "Plot2d viewer" group <<end>>
2899 // .. "PyViewer" preferences tab <<start>>
2900 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2901 // ... "Font settings" group <<start>>
2902 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2903 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2904 LightApp_Preferences::Font, "PyEditor", "Font" );
2905 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2906 // ... "Font settings" group <<end>>
2907 // ... "Display settings" group <<start>>
2908 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2909 pref->setItemProperty( "columns", 2, pyDispGroup );
2910 // ... -> current line highlight
2911 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2912 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2913 // ... -> text wrapping
2914 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2915 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2916 // ... -> center cursor on scroll
2917 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2918 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2919 // ... -> line numbers area
2920 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2921 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2922 // ... "Display settings" group <<end>>
2923 // ... "Tab settings" group <<start>>
2924 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2925 pref->setItemProperty( "columns", 2, pyTabGroup );
2926 // ... -> tab whitespaces
2927 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2928 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2930 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2931 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2932 // ... "Tab settings" group <<end>>
2933 // ... "Vertical edge settings" group <<start>>
2934 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2935 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2936 // ... -> vertical edge
2937 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2938 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2939 // ... -> number of columns
2940 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2941 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2942 // ... "Vertical edge settings" group <<end>>
2943 // .. "PyEditor" preferences tab <<end>>
2945 // .. "Directories" preferences tab <<start>>
2946 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2947 // ... --> quick directories list
2948 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2949 pref->addPreference( tr( "" ), dirGroup,
2950 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2951 // .. "Directories" preferences tab <<end>>
2953 // .. "Object browser" preferences tab <<start>>
2954 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2956 // ... "Search tool" group <<start>>
2957 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2958 // .... --> auto-hide
2959 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2960 "ObjectBrowser", "auto_hide_search_tool" );
2961 // ... "Search tool" group <<end>>
2963 // ... "Object browser settings" group <<start>>
2964 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2965 pref->setItemProperty( "columns", 2, objSetGroup );
2966 // .... -> auto size first column
2967 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2968 "ObjectBrowser", "auto_size_first" );
2969 // .... -> auto size other columns
2970 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2971 "ObjectBrowser", "auto_size" );
2972 // .... -> resize columns on expand item
2973 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2974 "ObjectBrowser", "resize_on_expand_item" );
2975 // .... -> browse to published object
2976 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2977 "ObjectBrowser", "browse_published_object" );
2978 aValuesList.clear();
2979 anIndicesList.clear();
2980 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2981 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2982 pref->setItemProperty( "strings", aValuesList, browsePublished );
2983 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2984 // ... "Object browser settings" group <<end>>
2985 // .. "Object browser" preferences tab <<end>>
2987 // .. "Shortcuts" preferences tab <<start>>
2988 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2989 // ... "Shortcuts settings" group <<start>>
2990 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2991 pref->addPreference( tr( "" ), shortcutGroup,
2992 LightApp_Preferences::ShortcutTree, "shortcuts" );
2993 // ... "Shortcuts settings" group <<end>>
2994 // .. "Shortcuts" preferences tab <<end>>
2995 // . Top-level "SALOME" preferences group <<end>>
3001 Changes appearance of application according to changed preferences
3002 \param sec - section
3003 \param param - name of changed parameter
3005 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3007 SUIT_ResourceMgr* resMgr = resourceMgr();
3011 if ( sec == "viewers" && param == "drop_down_buttons" )
3013 ViewManagerList vmlist = viewManagers();
3014 foreach( SUIT_ViewManager* vm, vmlist )
3016 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3017 foreach( SUIT_ViewWindow* vw, vwlist )
3018 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3022 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3024 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3025 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3026 QList<SUIT_ViewManager*> lst;
3027 #ifndef DISABLE_OCCVIEWER
3028 viewManagers( OCCViewer_Viewer::Type(), lst );
3029 QListIterator<SUIT_ViewManager*> itOCC( lst );
3030 while ( itOCC.hasNext() && sz >= 0 )
3032 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3033 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3036 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3037 occVM->setTrihedronSize( sz, relative );
3038 occVM->getAISContext()->UpdateCurrentViewer();
3041 #ifndef DISABLE_VTKVIEWER
3042 #ifndef DISABLE_SALOMEOBJECT
3043 viewManagers( SVTK_Viewer::Type(), lst );
3044 QListIterator<SUIT_ViewManager*> itVTK( lst );
3045 while ( itVTK.hasNext() && sz >= 0 )
3047 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3048 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3051 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3054 vtkVM->setTrihedronSize( sz, relative );
3062 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3064 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3065 QList<SUIT_ViewManager*> lst;
3066 #ifndef DISABLE_OCCVIEWER
3067 viewManagers( OCCViewer_Viewer::Type(), lst );
3068 QListIterator<SUIT_ViewManager*> itOCC( lst );
3069 while ( itOCC.hasNext() )
3071 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3072 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3075 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3078 occVM->setStaticTrihedronDisplayed( isVisible );
3082 #ifndef DISABLE_VTKVIEWER
3083 #ifndef DISABLE_SALOMEOBJECT
3084 viewManagers( SVTK_Viewer::Type(), lst );
3085 QListIterator<SUIT_ViewManager*> itVTK( lst );
3086 while ( itVTK.hasNext() )
3088 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3089 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3092 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3095 vtkVM->setStaticTrihedronVisible( isVisible );
3103 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3105 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3106 QList<SUIT_ViewManager*> lst;
3107 #ifndef DISABLE_OCCVIEWER
3108 viewManagers( OCCViewer_Viewer::Type(), lst );
3109 QListIterator<SUIT_ViewManager*> itOCC( lst );
3110 while ( itOCC.hasNext() )
3112 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3113 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3116 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3117 occVM->setInteractionStyle( mode );
3120 #ifndef DISABLE_VTKVIEWER
3121 #ifndef DISABLE_SALOMEOBJECT
3122 viewManagers( SVTK_Viewer::Type(), lst );
3123 QListIterator<SUIT_ViewManager*> itVTK( lst );
3124 while ( itVTK.hasNext() )
3126 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3127 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3130 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3131 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3137 #ifndef DISABLE_OCCVIEWER
3138 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3140 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3141 QList<SUIT_ViewManager*> lst;
3142 viewManagers( OCCViewer_Viewer::Type(), lst );
3143 QListIterator<SUIT_ViewManager*> it( lst );
3144 while ( it.hasNext() )
3146 SUIT_ViewModel* vm = it.next()->getViewModel();
3147 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3150 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3151 occVM->enablePreselection( isToEnablePreselection );
3156 #ifndef DISABLE_OCCVIEWER
3157 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3159 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3160 QList<SUIT_ViewManager*> lst;
3161 viewManagers( OCCViewer_Viewer::Type(), lst );
3162 QListIterator<SUIT_ViewManager*> it( lst );
3163 while ( it.hasNext() )
3165 SUIT_ViewModel* vm = it.next()->getViewModel();
3166 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3169 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3170 occVM->enableSelection( isToEnableSelection );
3175 #ifndef DISABLE_OCCVIEWER
3176 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3178 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3179 QList<SUIT_ViewManager*> lst;
3180 viewManagers( OCCViewer_Viewer::Type(), lst );
3181 QListIterator<SUIT_ViewManager*> it( lst );
3182 while ( it.hasNext() )
3184 SUIT_ViewModel* vm = it.next()->getViewModel();
3185 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3188 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3189 occVM->setClippingColor( aColor );
3194 #ifndef DISABLE_OCCVIEWER
3195 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3196 param == QString( "clipping_texture" ) ||
3197 param == QString( "clipping_modulate" ) ||
3198 param == QString( "clipping_scale" ) ) )
3200 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3201 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3202 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3203 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3204 QList<SUIT_ViewManager*> lst;
3205 viewManagers( OCCViewer_Viewer::Type(), lst );
3206 QListIterator<SUIT_ViewManager*> it( lst );
3207 while ( it.hasNext() )
3209 SUIT_ViewModel* vm = it.next()->getViewModel();
3210 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3213 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3214 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3219 #ifndef DISABLE_OCCVIEWER
3220 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3222 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3223 QList<SUIT_ViewManager*> lst;
3224 viewManagers( OCCViewer_Viewer::Type(), lst );
3225 QListIterator<SUIT_ViewManager*> it( lst );
3226 while ( it.hasNext() )
3228 SUIT_ViewModel* vm = it.next()->getViewModel();
3229 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3232 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3233 occVM->setProjectionType( mode );
3237 #if OCC_VERSION_LARGE > 0x06090000
3238 #ifndef DISABLE_OCCVIEWER
3239 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3241 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3242 QList<SUIT_ViewManager*> lst;
3243 viewManagers( OCCViewer_Viewer::Type(), lst );
3244 QListIterator<SUIT_ViewManager*> it( lst );
3245 while ( it.hasNext() )
3247 SUIT_ViewModel* vm = it.next()->getViewModel();
3248 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3251 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3252 occVM->setStereoType( mode );
3257 #ifndef DISABLE_OCCVIEWER
3258 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3260 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3261 QList<SUIT_ViewManager*> lst;
3262 viewManagers( OCCViewer_Viewer::Type(), lst );
3263 QListIterator<SUIT_ViewManager*> it( lst );
3264 while ( it.hasNext() )
3266 SUIT_ViewModel* vm = it.next()->getViewModel();
3267 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3270 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3271 occVM->setAnaglyphFilter( mode );
3276 #ifndef DISABLE_OCCVIEWER
3277 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3278 param == QString( "focus_value" ) ) )
3280 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3281 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
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->setStereographicFocus( aType, aValue );
3297 #ifndef DISABLE_OCCVIEWER
3298 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3299 param == QString( "iod_value" ) ) )
3301 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3302 double aValue = resMgr->doubleValue( "OCCViewer", "iod_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->setInterocularDistance( aType, aValue );
3318 #ifndef DISABLE_OCCVIEWER
3319 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3321 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3322 QList<SUIT_ViewManager*> lst;
3323 viewManagers( OCCViewer_Viewer::Type(), lst );
3324 QListIterator<SUIT_ViewManager*> it( lst );
3325 while ( it.hasNext() )
3327 SUIT_ViewModel* vm = it.next()->getViewModel();
3328 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3331 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3332 occVM->setReverseStereo( reverse );
3337 #ifndef DISABLE_OCCVIEWER
3338 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3340 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3341 QList<SUIT_ViewManager*> lst;
3342 viewManagers( OCCViewer_Viewer::Type(), lst );
3343 QListIterator<SUIT_ViewManager*> it( lst );
3344 while ( it.hasNext() )
3346 SUIT_ViewModel* vm = it.next()->getViewModel();
3347 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3350 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3351 occVM->setVSync( enable );
3356 #ifndef DISABLE_OCCVIEWER
3357 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3359 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3360 QList<SUIT_ViewManager*> lst;
3361 viewManagers( OCCViewer_Viewer::Type(), lst );
3362 QListIterator<SUIT_ViewManager*> it( lst );
3363 while ( it.hasNext() )
3365 SUIT_ViewModel* vm = it.next()->getViewModel();
3366 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3369 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3370 occVM->setQuadBufferSupport( enable );
3375 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3377 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3378 QList<SUIT_ViewManager*> lst;
3379 #ifndef DISABLE_OCCVIEWER
3380 viewManagers( OCCViewer_Viewer::Type(), lst );
3381 QListIterator<SUIT_ViewManager*> itOCC( lst );
3382 while ( itOCC.hasNext() )
3384 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3385 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3388 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3389 occVM->setZoomingStyle( mode );
3392 #ifndef DISABLE_VTKVIEWER
3393 #ifndef DISABLE_SALOMEOBJECT
3394 viewManagers( SVTK_Viewer::Type(), lst );
3395 QListIterator<SUIT_ViewManager*> itVTK( lst );
3396 while ( itVTK.hasNext() )
3398 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3399 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3402 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3403 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3409 #ifndef DISABLE_VTKVIEWER
3410 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3412 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3413 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3414 QList<SUIT_ViewManager*> lst;
3415 #ifndef DISABLE_SALOMEOBJECT
3416 viewManagers( SVTK_Viewer::Type(), lst );
3417 QListIterator<SUIT_ViewManager*> it( lst );
3418 while ( it.hasNext() )
3420 SUIT_ViewModel* vm = it.next()->getViewModel();
3421 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3424 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3425 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3431 #ifndef DISABLE_VTKVIEWER
3432 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3434 int mode = resMgr->integerValue( "VTKViewer", "projection_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->setProjectionMode( mode );
3452 #ifndef DISABLE_VTKVIEWER
3453 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3455 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 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->setStereoType( mode );
3473 #ifndef DISABLE_VTKVIEWER
3474 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3476 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 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->setAnaglyphFilter( mode );
3494 #ifndef DISABLE_VTKVIEWER
3495 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3497 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
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->setQuadBufferSupport( enable );
3515 #ifndef DISABLE_VTKVIEWER
3516 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3518 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
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->setPreSelectionMode( mode );
3536 #ifndef DISABLE_VTKVIEWER
3537 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3539 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
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->enableSelection( isToEnableSelection );
3557 #ifndef DISABLE_VTKVIEWER
3558 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3559 param == QString( "spacemouse_func2_btn" ) ||
3560 param == QString( "spacemouse_func5_btn" ) ) )
3562 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3563 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3564 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3565 QList<SUIT_ViewManager*> lst;
3566 #ifndef DISABLE_SALOMEOBJECT
3567 viewManagers( SVTK_Viewer::Type(), lst );
3568 QListIterator<SUIT_ViewManager*> it( lst );
3569 while ( it.hasNext() )
3571 SUIT_ViewModel* vm = it.next()->getViewModel();
3572 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3575 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3576 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3581 if( sec=="ObjectBrowser" )
3583 SUIT_DataBrowser* ob = objectBrowser();
3587 if ( param=="auto_size_first" )
3589 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3590 ob->setAutoSizeFirstColumn( autoSizeFirst );
3591 if ( autoSizeFirst )
3592 ob->adjustFirstColumnWidth();
3594 else if ( param=="auto_size" ) {
3595 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3596 ob->setAutoSizeColumns(autoSize);
3598 ob->adjustColumnsWidth();
3600 else if ( param=="resize_on_expand_item" ) {
3601 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3602 ob->setResizeOnExpandItem(resizeOnExpandItem);
3604 else if ( param == "auto_hide_search_tool" ) {
3605 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3611 if( param=="auto_save_interval" ) {
3612 myAutoSaveTimer->stop();
3613 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3614 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3618 #ifndef DISABLE_PYCONSOLE
3619 if( sec=="PyConsole" && pythonConsole() )
3621 if ( param=="font" ) {
3622 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3624 else if ( param=="show_banner" ) {
3625 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3627 else if ( param=="auto_completion" ) {
3628 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3635 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3637 if ( param == "visible_count" )
3638 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3639 else if ( param == "max_count" )
3640 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3641 else if ( param == "insert_mode" )
3642 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3643 else if ( param == "link_type" )
3644 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3645 else if ( param == "show_clear" )
3646 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3647 else if ( param == "show_mru" )
3648 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3651 if ( sec == "language" && param == "language" )
3653 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3654 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3656 if ( sec == "language" && param == "locale")
3658 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3659 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3661 if ( sec == "desktop" && param == "opaque_resize" ) {
3662 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3663 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3664 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3665 else dopts &= ~QMainWindow::AnimatedDocks;
3666 desktop()->setDockOptions( dopts );
3667 desktop()->setOpaqueResize( opaqueResize );
3668 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3669 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3672 #ifndef DISABLE_PLOT2DVIEWER
3673 QList<SUIT_ViewManager*> lst;
3674 viewManagers( Plot2d_Viewer::Type(), lst );
3675 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3676 while ( itPlot2d.hasNext() ) {
3677 SUIT_ViewManager* viewMgr = itPlot2d.next();
3678 SUIT_ViewModel* vm = viewMgr->getViewModel();
3679 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3682 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3684 viewMgr->setViewModel( vm );
3685 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3687 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3688 frame->SetPreference();
3697 void LightApp_Application::loadPreferences()
3699 CAM_Application::loadPreferences();
3701 SUIT_ResourceMgr* aResMgr = resourceMgr();
3706 static bool mru_load = true;
3709 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3711 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3712 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3713 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3714 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3715 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3716 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3717 mru->loadLinks( aResMgr, "MRU" );
3723 QStringList mods = aResMgr->parameters( "windows_visibility" );
3724 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3727 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3728 myWinVis.insert( *itr, arr );
3732 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3733 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3734 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3735 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3736 else dopts &= ~QMainWindow::AnimatedDocks;
3737 desktop()->setDockOptions( dopts );
3738 desktop()->setOpaqueResize( opaqueResize );
3739 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3740 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3747 void LightApp_Application::savePreferences()
3749 CAM_Application::savePreferences();
3751 saveDockWindowsState();
3753 SUIT_ResourceMgr* aResMgr = resourceMgr();
3758 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3760 mru->saveLinks( aResMgr, "MRU" );
3762 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3763 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3766 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3768 #if GUI_DEVELOPMENT > 0
3769 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3771 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3778 Updates desktop title
3780 void LightApp_Application::updateDesktopTitle()
3782 QString aTitle = applicationName();
3783 QString aVer = applicationVersion();
3784 if ( !aVer.isEmpty() )
3785 aTitle += QString( " " ) + aVer;
3787 if ( activeStudy() ) {
3788 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3789 aTitle += QString( " - [%1]" ).arg( sName );
3792 desktop()->setWindowTitle( aTitle );
3796 \brief Get map of the operations which can be performed
3797 on the module activation.
3799 The method should return the map of the kind \c {<id>:<name>}
3800 where \c <id> is an integer identifier of the operation and
3801 \c <name> is a title for the button to be added to the
3802 dialog box. After user selects the required operation by the
3803 clicking the corresponding button in the dialog box, its identifier
3804 is passed to the moduleActionSelected() method to process
3807 \return map of the operations
3808 \sa moduleActionSelected()
3810 QMap<int, QString> LightApp_Application::activateModuleActions() const
3812 QMap<int, QString> opmap;
3813 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3814 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3819 \brief Called when the used selectes required operation chosen
3820 from "Activate module" dialog box.
3822 Performs the required operation according to the user choice.
3824 \param id operation identifier
3825 \sa activateModuleActions()
3827 void LightApp_Application::moduleActionSelected( const int id )
3842 Updates windows after close document
3844 void LightApp_Application::afterCloseDoc()
3848 CAM_Application::afterCloseDoc();
3852 Updates actions of active module
3854 void LightApp_Application::updateModuleActions()
3857 if ( activeModule() ) {
3858 modName = activeModule()->moduleName();
3859 if ( !isModuleAccessible( modName ) ) {
3860 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3861 foreach( SUIT_Application* app, apps ) {
3862 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3863 if ( lapp && lapp != this )
3864 lapp->removeModuleAction( modName );
3869 LightApp_ModuleAction* moduleAction =
3870 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3872 moduleAction->setActiveModule( modName );
3875 void LightApp_Application::removeModuleAction( const QString& modName )
3877 LightApp_ModuleAction* moduleAction =
3878 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3880 moduleAction->removeModule( modName );
3884 Gets current windows.
3885 \param winMap - output current windows map.
3887 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3890 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3891 ((LightApp_Module*)activeModule())->windows( winMap );
3893 defaultWindows( winMap );
3897 Gets current view managers.
3898 \param lst - output current view managers list.
3900 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3903 if ( !activeStudy() )
3906 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3907 ((LightApp_Module*)activeModule())->viewManagers( lst );
3909 defaultViewManagers( lst );
3915 void LightApp_Application::updateWindows()
3917 QMap<int, int> winMap;
3918 currentWindows( winMap );
3920 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3922 if ( !dockWindow( it.key() ) )
3923 getWindow( it.key() );
3926 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3928 QWidget* wid = it.value();
3929 if ( winMap.contains( it.key() ) )
3930 wid->setVisible( true );
3935 loadDockWindowsState();
3939 Updates view managers
3941 void LightApp_Application::updateViewManagers()
3944 currentViewManagers( lst );
3946 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3947 getViewManager( *it, true );
3951 Loads windows geometry
3953 void LightApp_Application::loadDockWindowsState()
3957 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3958 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3959 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3962 if ( activeModule() )
3963 modName = activeModule()->name();
3964 else if ( activeStudy() )
3965 modName = "nomodule";
3967 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3968 QByteArray aDefaultState;
3969 aResMgr->value( "windows_geometry", modName, aDefaultState );
3970 QByteArray aDefaultVisibility;
3971 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3972 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3973 aResMgr->setWorkingMode( prevMode );
3975 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3978 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3979 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3981 if ( version > Qtx::versionToId( "7.4.1" ) )
3982 aResMgr->value( "windows_geometry", modName , arr );
3984 arr = aDefaultState;
3985 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3986 desktop()->restoreState( aTargetArray );
3989 QStringList mainToolbarsNames;
3990 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3991 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3992 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3994 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3997 QMap<QString, bool> *tbMap = 0;
3998 QMap<QString, bool> *dwMap = 0;
4000 QMap<QString, bool> userTbMap, userDwMap;
4001 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4003 QMap<QString, bool> defaultTbMap, defaultDwMap;
4004 if(hasDefaultVisibility) {
4005 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4011 if(hasDefaultVisibility){
4012 tbMap = &defaultTbMap;
4019 if(hasDefaultVisibility){
4020 dwMap = &defaultDwMap;
4025 QList<QToolBar*> tbList = findToolBars();
4026 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4028 QToolBar* tb = *tit;
4029 if ( tbMap->contains( tb->objectName() ) ) {
4030 tb->setVisible( (*tbMap)[tb->objectName()] );
4036 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4037 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4039 QDockWidget* dw = *dit;
4041 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4042 if ( po != desktop() )
4045 if ( dwMap->contains( dw->objectName() ) )
4046 dw->setVisible( (*dwMap)[dw->objectName()] );
4054 Saves windows geometry
4056 void LightApp_Application::saveDockWindowsState()
4061 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4062 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4064 if( !storeWin && !storeTb )
4068 if ( activeModule() )
4069 modName = activeModule()->name();
4070 else if ( activeStudy() )
4071 modName = "nomodule";
4073 QString versionId = GUI_VERSION_STR;
4074 #if GUI_DEVELOPMENT > 0
4078 QByteArray arr = desktop()->saveState();
4079 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4080 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4083 if ( myWinVis.contains( modName ) )
4084 visArr = myWinVis[modName];
4086 QMap<QString, bool> tbMap, dwMap;
4087 dockWindowsState( visArr, tbMap, dwMap );
4089 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4090 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4093 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4096 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4097 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4099 QDockWidget* wid = *it;
4100 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4103 visArr = dockWindowsState( tbMap, dwMap );
4105 myWinVis.insert( modName, visArr );
4108 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4111 QDataStream stream( &visArr, QIODevice::WriteOnly );
4113 stream << (uchar)ToolBarMarker;
4114 stream << tb.size();
4115 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4117 stream << tit.key();
4118 stream << (uchar)( tit.value() ? 1 : 0 );
4121 stream << (uchar)DockWidgetMarker;
4122 stream << dw.size();
4123 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4125 stream << wit.key();
4126 stream << (uchar)( wit.value() ? 1 : 0 );
4132 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4137 QByteArray visArr = arr;
4138 QDataStream stream( &visArr, QIODevice::ReadOnly );
4142 if ( marker != ToolBarMarker )
4147 for ( int i = 0; i < lines; ++i )
4150 stream >> objectName;
4153 tb.insert( objectName, shown );
4157 if ( marker != DockWidgetMarker )
4161 for ( int j = 0; j < lines; ++j )
4164 stream >> objectName;
4167 dw.insert( objectName, shown );
4172 Adds icon names for modules
4174 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4178 SUIT_ResourceMgr* resMgr = resourceMgr();
4182 QStringList modList;
4183 modules( modList, false );
4185 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4187 QString modName = *it;
4188 QString modIntr = moduleName( modName );
4189 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4191 if ( modIcon.isEmpty() )
4194 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4195 modIcon += QString( ".png" );
4197 iconMap.insert( modName, modIcon );
4202 Inserts items in popup, which necessary for current application
4204 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4207 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4208 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4209 selMgr->setSelectionCacheEnabled( true );
4211 SUIT_DataBrowser* ob = objectBrowser();
4213 CAM_Application::contextMenuPopup( type, thePopup, title );
4215 if ( ob && type == ob->popupClientType() ) {
4216 thePopup->addSeparator();
4217 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4218 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4219 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4222 #ifndef DISABLE_SALOMEOBJECT
4223 if ( selMgr && ob ) {
4224 SALOME_ListIO selected;
4225 selMgr->selectedObjects( selected );
4226 if(selected.Extent() == 1){
4227 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4228 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4229 if(obj && obj->renameAllowed()) {
4230 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4231 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4232 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4233 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4235 QList<QAction*> acts = thePopup->actions();
4236 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4237 thePopup->insertAction(firstAction,a);
4243 selMgr->setSelectionCacheEnabled( cacheIsOn );
4249 void LightApp_Application::createEmptyStudy()
4251 CAM_Application::createEmptyStudy();
4253 if ( objectBrowser() )
4254 objectBrowser()->updateTree();
4256 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4257 if ( aResMgr && activeStudy() ) {
4258 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4259 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4264 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4266 CAM_Application::setDesktop( desk );
4269 connect( desk, SIGNAL( message( const QString& ) ),
4270 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4271 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4272 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4273 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4274 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4280 \param mod - module to be activated
4282 bool LightApp_Application::activateModule( CAM_Module* mod )
4284 bool res = CAM_Application::activateModule( mod );
4286 if ( objectBrowser() )
4287 objectBrowser()->updateTree();
4293 \return keyborad accelerators manager object
4295 SUIT_Accel* LightApp_Application::accel() const
4301 Removes dead widget container from map
4303 void LightApp_Application::onWCDestroyed( QObject* ob )
4305 // remove destroyed widget container from windows map
4306 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4308 if ( itr.value() != ob )
4311 int key = itr.key();
4312 myWin.remove( key );
4317 void LightApp_Application::onMRUActivated( const QString& name )
4319 SUIT_Session* s = SUIT_Session::session();
4320 if ( s && s->activeApplication() == this )
4324 void LightApp_Application::onStylePreferences()
4326 #ifdef USE_SALOME_STYLE
4327 Style_PrefDlg dlg( desktop() );
4330 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4331 #endif // USE_SALOME_STYLE
4334 void LightApp_Application::onFullScreen(){
4335 if(myScreenHelper) {
4336 if(desktop()->isFullScreen())
4337 myScreenHelper->switchToNormalScreen();
4339 myScreenHelper->switchToFullScreen();
4344 Connects just added view manager
4346 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4348 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4349 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4350 CAM_Application::addViewManager( vm );
4354 Remove view manager from memory
4356 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4358 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4359 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4360 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4362 aStudy->removeObjectProperties( vm->getGlobalId() );
4364 CAM_Application::removeViewManager( vm );
4366 LightApp_SelectionMgr* selMgr = selectionMgr();
4367 QList<SUIT_Selector*> selectors;
4368 selMgr->selectors( selectors );
4369 foreach( SUIT_Selector* selector, selectors ) {
4370 if ( selector->owner() == vm->getViewModel() ) {
4375 // IPAL22894: Crash on closing OCC view
4381 Renames active window of desktop
4383 void LightApp_Application::onRenameWindow()
4388 QWidget* w = desktop()->activeWindow();
4393 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4394 if( ok && !name.isEmpty() )
4395 w->setWindowTitle( name );
4399 Closes active window of desktop
4401 void LightApp_Application::onCloseWindow()
4406 QWidget* w = desktop()->activeWindow();
4414 Closes all windows of desktop
4416 void LightApp_Application::onCloseAllWindow()
4418 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4422 QList<SUIT_ViewWindow*> wndList = desk->windows();
4423 SUIT_ViewWindow* wnd;
4424 foreach( wnd, wndList )
4432 Groups all windows of desktop
4434 void LightApp_Application::onGroupAllWindow()
4436 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4440 QtxWorkstack* wgStack = desk->workstack();
4446 \return if the library of module exists
4447 \param moduleTitle - title of module
4449 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4451 if( moduleTitle.isEmpty() )
4454 QString lib = moduleLibrary( moduleTitle );
4456 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4457 bool isPythonModule = lib.contains("SalomePyQtGUI");
4458 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4462 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4464 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4467 bool isLibFound = false;
4468 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4469 for( ; anIt!=aLast; anIt++ )
4471 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4482 INFOS( "\n****************************************************************" << std::endl
4483 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4484 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4485 << "****************************************************************" << std::endl );
4487 else if ( !isPythonModule && !isPythonLightModule)
4490 if ( isPythonModule || isPythonLightModule)
4492 QString pylib = moduleName( moduleTitle ) + QString(".py");
4493 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4495 // Check the python library
4497 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4499 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4501 bool isPyLib = false, isPyGuiLib = false;
4502 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4503 for( ; anIt!=aLast; anIt++ )
4505 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4506 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4508 if(!isPythonLightModule)
4509 if( !isPyLib && inf.exists() )
4512 if( !isPyGuiLib && infgui.exists() )
4515 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4519 printf( "\n****************************************************************\n" );
4520 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4522 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4524 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4525 printf( "****************************************************************\n" );
4532 \return default name for an active study
4534 void LightApp_Application::setDefaultStudyName( const QString& theName )
4536 QStringList anInfoList;
4537 modules( anInfoList, false );
4539 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4540 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4541 !aStudy->isSaved() )
4543 aStudy->setStudyName( theName );
4544 updateDesktopTitle();
4549 Custom event handler
4551 bool LightApp_Application::event( QEvent* e )
4553 if( e && e->type()==2000 )
4555 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4556 QString* d = ( QString* )ce->data();
4557 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4559 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4560 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4561 showPreferences( tr( "PREF_APP" ) );
4566 return CAM_Application::event( e );
4569 /*! Check data object */
4570 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4574 bool isSuitable = !theObj->entry().isEmpty() &&
4575 !theObj->componentDataType().isEmpty() &&
4576 !theObj->name().isEmpty();
4583 int LightApp_Application::openChoice( const QString& aName )
4585 int choice = CAM_Application::openChoice( aName );
4587 if ( choice == OpenExist ) // The document is already open.
4589 // Do you want to reload it?
4590 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4591 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4592 choice = OpenReload;
4598 bool LightApp_Application::openAction( const int choice, const QString& aName )
4605 STD_Application* app = 0;
4606 SUIT_Session* session = SUIT_Session::session();
4607 QList<SUIT_Application*> appList = session->applications();
4608 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4610 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4611 app = ::qobject_cast<STD_Application*>( *it );
4616 app->onCloseDoc( false );
4617 appList = session->applications();
4618 STD_Application* other = 0;
4619 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4620 other = ::qobject_cast<STD_Application*>( *it );
4623 res = other->onOpenDoc( aName );
4628 res = CAM_Application::openAction( choice, aName );
4635 QStringList LightApp_Application::viewManagersTypes() const
4637 QStringList aTypesList;
4638 aTypesList += myUserWmTypes;
4639 #ifndef DISABLE_GLVIEWER
4640 aTypesList<<GLViewer_Viewer::Type();
4642 #ifndef DISABLE_PLOT2DVIEWER
4643 aTypesList<<Plot2d_Viewer::Type();
4645 #ifndef DISABLE_QXGRAPHVIEWER
4646 aTypesList<<QxScene_Viewer::Type();
4648 #ifndef DISABLE_PVVIEWER
4649 aTypesList<<PVViewer_Viewer::Type();
4651 #ifndef DISABLE_PYVIEWER
4652 aTypesList<<PyViewer_Viewer::Type();
4654 #ifndef DISABLE_OCCVIEWER
4655 aTypesList<<OCCViewer_Viewer::Type();
4657 #ifndef DISABLE_VTKVIEWER
4658 #ifndef DISABLE_SALOMEOBJECT
4659 aTypesList<<SVTK_Viewer::Type();
4661 aTypesList<<VTKViewer_Viewer::Type();
4667 * Removes all view managers of known types
4668 * Other view managers are ignored
4670 void LightApp_Application::clearKnownViewManagers()
4672 QStringList aTypesList = viewManagersTypes();
4673 QList<SUIT_ViewManager*> aMgrList;
4674 viewManagers( aMgrList );
4675 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4676 if (aTypesList.contains(aMgr->getType()))
4677 removeViewManager(aMgr);
4682 Copy of current selection
4684 void LightApp_Application::onCopy()
4686 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4692 Paste of current data in clipboard
4694 void LightApp_Application::onPaste()
4696 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4702 Browse (i.e. set focus on) the published objects
4703 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4704 has been accepted by Ok (or Apply & Close) button
4705 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4706 (to select the first published object only)
4707 \return entry of the selected object
4709 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4710 const bool theIsApplyAndClose,
4711 const bool theIsOptimizedBrowsing )
4714 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4716 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4717 switch( aBrowsePolicy )
4721 case BP_ApplyAndClose:
4722 if( !theIsApplyAndClose )
4730 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4734 SUIT_DataBrowser* anOB = objectBrowser();
4738 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4742 QStringListIterator anIter( theEntryList );
4743 if( theIsOptimizedBrowsing )
4745 // go to the last entry
4747 if( anIter.hasPrevious() )
4751 // scroll to each entry in the list
4752 // (in optimized mode - to the last entry only)
4754 LightApp_DataObject* anObject = 0;
4755 while( anIter.hasNext() )
4757 anEntry = anIter.next();
4758 if( !anEntry.isEmpty() )
4760 anObject = aStudy->findObjectByEntry( anEntry );
4763 QModelIndex anIndex = aModel->index( anObject );
4764 anOB->treeView()->scrollTo( anIndex );
4769 // always select the last object
4770 if( anObject && !anEntry.isEmpty() )
4772 QList<SUIT_Selector*> aSelectorList;
4773 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4774 if( !aSelectorList.isEmpty() )
4776 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4778 bool anIsAutoBlock = aSelector->autoBlock();
4780 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4781 aSelector->setAutoBlock( false );
4783 SUIT_DataOwnerPtrList aList;
4784 #ifndef DISABLE_SALOMEOBJECT
4785 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4786 ( anObject->entry().toLatin1().constData(),
4787 anObject->componentDataType().toLatin1().constData(),
4788 anObject->name().toLatin1().constData() );
4789 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4791 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4794 aList.append( owner );
4795 selectionMgr()->setSelected( aList );
4798 // restore auto block flag
4799 aSelector->setAutoBlock( anIsAutoBlock );
4807 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4809 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4810 return study ? study->findObjectByEntry( id ) : 0;
4814 Checks that an object can be renamed.
4815 \param entry entry of the object
4816 \brief Return \c true if object can be renamed
4818 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4823 Rename object by entry.
4824 \param entry entry of the object
4825 \param name new name of the object
4826 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4828 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4832 /*! Process standard messages from desktop */
4833 void LightApp_Application::onDesktopMessage( const QString& message )
4835 const QString sectionSeparator = "/";
4837 if ( message.toLower() == "updateobjectbrowser" ||
4838 message.toLower() == "updateobjbrowser" ) {
4839 // update object browser
4840 updateObjectBrowser();
4842 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4843 QString vtype = message.split( sectionSeparator ).last();
4844 if ( !vtype.isEmpty() )
4845 getViewManager( vtype, true );
4848 QStringList data = message.split( sectionSeparator );
4849 if ( data.count() > 1 ) {
4850 QString msgType = data[0].trimmed();
4851 LightApp_Module* sMod = 0;
4852 CAM_Module* mod = module( msgType );
4854 mod = module( moduleTitle( msgType ) );
4855 if ( mod && mod->inherits( "LightApp_Module" ) )
4856 sMod = (LightApp_Module*)mod;
4858 if ( msgType.toLower() == "preferences" ) {
4859 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4860 // for example "preferences/Study/multi_file_dump/true"
4861 if ( data.count() > 3 ) {
4862 QString section = data[1].trimmed();
4863 QString param = data[2].trimmed();
4864 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4865 resourceMgr()->setValue( section, param, value );
4869 // received message for the module
4870 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4871 sMod->message( msg );
4879 Returns all top level toolbars.
4880 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4882 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4884 QList<QToolBar*> aResult;
4885 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4886 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4887 QToolBar* tb = *tit;
4888 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4889 if ( po != desktop() )
4891 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4898 Internal method to parse toolbars and dockable windows state.
4900 QByteArray LightApp_Application::processState(QByteArray& input,
4901 const bool processWin,
4902 const bool processTb,
4903 const bool isRestoring,
4904 QByteArray defaultState) {
4907 bool hasDefaultState = !defaultState.isEmpty();
4908 bool isDockWinWriten = false;
4910 //Write date from users settings
4912 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4913 int marker, version;
4915 tmpInputData >> marker;
4916 tmpInputData >> version;
4917 tmpInputData >> dockmarker;
4918 tmpInputData >> nbDocWin;
4920 if(processWin && processTb && !isRestoring) {
4922 } else if(!processWin && !processTb ) {
4924 aRes = defaultState;
4926 QDataStream aData(&aRes, QIODevice::WriteOnly);
4927 QList<QToolBar*> aToolBars = findToolBars();
4930 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4931 QToolBar* tb = *tit;
4932 aNames.append(tb->objectName());
4935 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4936 if(toolBarMarkerIndex < 0)
4938 QDataStream anInputData(&input, QIODevice::ReadOnly);
4940 int toolBarMarkerIndexDef;
4941 if(hasDefaultState) {
4942 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4943 if(toolBarMarkerIndexDef < 0)
4946 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4948 QDataStream* aTargetData = 0;
4949 int aTargetIndex = -1;
4951 QByteArray currentArr = desktop()->saveState();
4952 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4953 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4954 if(processWin && useInputData) {
4955 aTargetData = &anInputData;
4956 aTargetIndex = toolBarMarkerIndex;
4958 //Write date from default settings
4959 if(hasDefaultState) {
4960 aTargetData = &anInputDataDef;
4961 aTargetIndex = toolBarMarkerIndexDef;
4963 //If no default state, write current snapshot of the dockable windows
4965 aTargetData = &anInputDataCur;
4966 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4967 aTargetIndex = toolBarMarkerIndexCur;
4972 if(aTargetData && aTargetIndex >= 0 ) {
4973 aTargetData->device()->seek(0);
4974 while( aTargetData->device()->pos() < aTargetIndex ) {
4979 isDockWinWriten = true;
4986 aTargetData = &anInputData;
4987 aTargetIndex = toolBarMarkerIndex;
4989 if(hasDefaultState) {
4990 aTargetData = &anInputDataDef;
4991 aTargetIndex = toolBarMarkerIndexDef;
4995 if(aTargetData && aTargetIndex >= 0) {
4997 if(!isDockWinWriten ) {
4998 //Write version marker
4999 int marker, version;
5000 aTargetData->device()->seek(0);
5001 *aTargetData >> marker;
5002 *aTargetData >> version;
5005 aData << (uchar) QDockWidgetMarker;
5007 int shift = 4*sizeof(int) + sizeof(QSize);
5008 index = aTargetIndex - shift;
5010 index = aTargetIndex;
5013 aTargetData->device()->seek(index);
5014 while(!aTargetData->atEnd()) {
5019 } else { // Not treat toolbars
5020 aData << (uchar) QToolBarMarker;
5021 aData << (int) 0; //Nb toolbars = 0
5028 \brief Emits operationFinished signal.
5029 \param theModuleName the name of the module which perfomed the operation
5030 \param theOperationName the operation name
5031 \param theEntryList the list of the created objects entries
5033 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5034 const QString& theOperationName,
5035 const QStringList& theEntryList )
5037 emit operationFinished( theModuleName, theOperationName, theEntryList );
5041 Update visibility state of given objects
5043 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5044 SUIT_ViewModel* theViewModel )
5046 if ( !theViewModel || theList.isEmpty() ) return;
5048 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5049 if ( !aStudy ) return;
5051 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5053 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5054 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5056 if ( !obj || aStudy->isComponent( obj->entry() ) )
5059 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5060 if ( anObjModule ) {
5061 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5063 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5064 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5065 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5066 anObjState = Qtx::ShownState;
5068 anObjState = Qtx::HiddenState;
5070 aStudy->setVisibilityState( obj->entry(), anObjState );
5077 * Called when window activated
5079 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5081 SUIT_DataBrowser* anOB = objectBrowser();
5084 SUIT_DataObject* rootObj = anOB->root();
5088 DataObjectList listObj = rootObj->children( true );
5090 SUIT_ViewModel* vmod = 0;
5091 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5092 vmod = vman->getViewModel();
5093 updateVisibilityState( listObj, vmod );
5097 Called then view manager removed
5099 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5101 ViewManagerList lst;
5102 viewManagers( lst );
5103 if ( lst.count() == 1) { // in case if closed last view window
5104 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5106 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5111 Check existing document.
5113 bool LightApp_Application::checkExistingDoc()
5116 if( activeStudy() ) {
5117 int answer = SUIT_MessageBox::question( desktop(),
5118 tr( "APPCLOSE_CAPTION" ),
5119 tr( "STUDYCLOSE_DESCRIPTION" ),
5120 tr( "APPCLOSE_SAVE" ),
5121 tr( "APPCLOSE_CLOSE" ),
5122 tr( "APPCLOSE_CANCEL" ), 0 );
5124 if ( activeStudy()->isSaved() ) {
5127 } else if ( onSaveAsDoc() ) {
5128 if( !closeDoc( false ) ) {
5135 else if( answer == 1 ) {
5137 } else if( answer == 2 ) {
5144 #ifndef DISABLE_PYCONSOLE
5146 PyConsole_Interp* LightApp_Application::getPyInterp()
5148 static PyConsole_Interp* myInterp = 0;
5150 myInterp = createPyInterp();
5151 myInterp->initialize();
5156 PyConsole_Interp* LightApp_Application::createPyInterp()
5158 return new PyConsole_Interp();
5161 #endif // DISABLE_PYCONSOLE