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()
440 delete myScreenHelper;
443 /*!Start application.*/
444 void LightApp_Application::start()
446 CAM_Application::start();
449 updateViewManagers();
450 updateCommandsStatus();
453 desktop()->statusBar()->showMessage( "" );
455 LightApp_EventFilter::Init();
458 /*!Closeapplication.*/
459 void LightApp_Application::closeApplication()
461 #ifndef DISABLE_QTXWEBBROWSER
462 QProcess::startDetached( "HelpBrowser",
463 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
465 CAM_Application::closeApplication();
468 /*!Gets application name.*/
469 QString LightApp_Application::applicationName() const
471 static QString _app_name;
472 if ( _app_name.isEmpty() )
473 _app_name = tr( "APP_NAME" );
477 /*!Gets application version.*/
478 QString LightApp_Application::applicationVersion() const
480 static QString _app_version;
482 if ( _app_version.isEmpty() )
484 QString resVersion = tr( "APP_VERSION" );
485 if ( resVersion != "APP_VERSION" )
487 _app_version = resVersion;
491 _app_version = GUI_VERSION_STR;
497 /*!Load module by \a name.*/
498 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
500 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
503 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
504 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
505 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
510 /*!Activate module by \a modName*/
511 bool LightApp_Application::activateModule( const QString& modName )
514 CAM_Module* prevMod = activeModule();
517 actName = prevMod->moduleName();
519 if ( actName == modName )
522 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
524 saveDockWindowsState();
526 bool status = CAM_Application::activateModule( modName );
528 updateModuleActions();
536 updateViewManagers();
538 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
539 if ( objectBrowser()->root() != activeStudy()->root() )
540 objectBrowser()->setRoot( activeStudy()->root() );
541 updateObjectBrowser( true );
544 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
549 /*!Gets selection manager.*/
550 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
555 /*!Creat action "New window" for certain type of viewer:*/
556 void LightApp_Application::createActionForViewer( const int id,
558 const QString& suffix,
561 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
562 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
563 QAction* a = createAction( id, // menu action id
570 false, // toggle flag
572 SLOT( onNewWindow() ) ); // slot
573 createMenu( a, parentId, -1 );
578 void LightApp_Application::createActions()
580 CAM_Application::createActions();
582 SUIT_Desktop* desk = desktop();
583 SUIT_ResourceMgr* resMgr = resourceMgr();
586 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
587 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
588 Qt::CTRL+Qt::Key_R, desk, false, this, SLOT( onPreferences() ) );
592 // - Help for modules
594 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
595 createMenu( separator(), helpMenu, -1, 10 );
596 QStringList aModuleList;
597 modules( aModuleList, false );
598 aModuleList.prepend( "GUI" );
599 aModuleList.prepend( "KERNEL" );
601 int id = LightApp_Application::UserID + FIRST_HELP_ID;
604 foreach( aModule, aModuleList ) {
605 if ( aModule.isEmpty() ) // module title (user name)
607 IMap <QString, QString> helpData; // list of help files for the module
608 QString helpSubMenu; // help submenu name (empty if not needed)
609 QString modName = moduleName( aModule ); // module name
610 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
611 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
612 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
614 if (resMgr->hasValue( modName, "documentation" ) )
615 docSection = resMgr->stringValue(modName, "documentation");
616 else if ( resMgr->hasSection( modName + "_documentation" ) )
617 docSection = modName + "_documentation";
618 if ( !docSection.isEmpty() ) {
619 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
620 QStringList listOfParam = resMgr->parameters( docSection );
621 foreach( QString paramName, listOfParam ) {
622 QString valueStr = resMgr->stringValue( docSection, paramName );
623 if ( !valueStr.isEmpty() ) {
624 QFileInfo fi( valueStr );
625 if ( fi.isRelative() && !modDir.isEmpty() )
626 valueStr = Qtx::addSlash( modDir ) + valueStr;
627 if ( QFile::exists( valueStr ) )
628 helpData.insert( paramName.arg( aModule ), valueStr );
633 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
634 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
635 QString indexFile = idxLst.join( QDir::separator() ); // index file
636 if ( QFile::exists( indexFile ) )
637 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
640 IMapConstIterator<QString, QString > fileIt;
641 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
642 QString helpFileName = fileIt.key();
643 // remove all '//' occurances
644 while ( helpFileName.contains( "//" ) )
645 helpFileName.replace( "//", "" );
646 // obtain submenus hierarchy if given
647 QStringList smenus = helpFileName.split( "/" );
648 helpFileName = smenus.last();
650 QAction* a = createAction( id, helpFileName,
651 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
652 helpFileName, helpFileName,
653 0, desk, false, this, SLOT( onHelpContentsModule() ) );
654 a->setData( fileIt.value() );
655 if ( !helpSubMenu.isEmpty() ) {
656 smenus.prepend( helpSubMenu );
658 // create sub-menus hierarchy
659 int menuId = helpMenu;
660 foreach ( QString subMenu, smenus ) {
661 menuId = createMenu( subMenu, menuId, -1, 0 );
663 createMenu( a, menuId, -1, 0 );
668 // - Additional help items
670 createMenu( separator(), helpMenu, -1, 5 );
672 QStringList addHelpItems = resMgr->parameters( "add_help" );
673 foreach ( QString addHelpItem, addHelpItems ) {
674 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
675 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
676 QAction* a = createAction( id, addHelpItem,
677 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
678 addHelpItem, addHelpItem,
679 0, desk, false, this, SLOT( onHelpContentsModule() ) );
680 a->setData( valueStr );
681 createMenu( a, helpMenu, -1, 5 );
687 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
688 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
689 registerAction( MRUId, mru );
691 // default icon for neutral point ('SALOME' module)
692 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
693 if ( defIcon.isNull() )
694 defIcon = QPixmap( imageEmptyIcon );
696 //! default icon for any module
697 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
698 if ( modIcon.isNull() )
699 modIcon = QPixmap( imageEmptyIcon );
702 modules( modList, false );
704 if ( modList.count() > 1 )
706 LightApp_ModuleAction* moduleAction =
707 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
709 QMap<QString, QString> iconMap;
710 moduleIconNames( iconMap );
712 const int iconSize = 20;
714 QStringList::Iterator it;
715 for ( it = modList.begin(); it != modList.end(); ++it )
717 if ( !isLibExists( *it ) )
720 QString modName = moduleName( *it );
722 if ( !isModuleAccessible( *it ) )
726 if ( iconMap.contains( *it ) )
727 iconName = iconMap[*it];
729 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
733 INFOS ( "\n****************************************************************" << std::endl
734 << "* Icon for " << (*it).toLatin1().constData()
735 << " not found. Using the default one." << std::endl
736 << "****************************************************************" << std::endl );
739 icon = Qtx::scaleIcon( icon, iconSize );
741 moduleAction->insertModule( *it, icon );
744 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
745 this, SLOT( onModuleActivation( const QString& ) ) );
746 registerAction( ModulesListId, moduleAction );
750 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
751 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
753 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
754 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
755 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
756 0, desk, false, this, SLOT( onCloseAllWindow() ) );
757 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
758 0, desk, false, this, SLOT( onGroupAllWindow() ) );
760 createMenu( CloseId, windowMenu, 0, -1 );
761 createMenu( CloseAllId, windowMenu, 0, -1 );
762 createMenu( GroupAllId, windowMenu, 0, -1 );
763 createMenu( separator(), windowMenu, -1, 0 );
765 #ifndef DISABLE_GLVIEWER
766 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
768 #ifndef DISABLE_PLOT2DVIEWER
769 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
771 #ifndef DISABLE_OCCVIEWER
772 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
774 #ifndef DISABLE_VTKVIEWER
775 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
777 #ifndef DISABLE_QXGRAPHVIEWER
778 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
780 #ifndef DISABLE_GRAPHICSVIEW
781 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
783 #ifndef DISABLE_PVVIEWER
784 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
786 #ifndef DISABLE_PYVIEWER
787 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
790 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
791 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
792 createMenu( RenameId, windowMenu, -1 );
794 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
795 createMenu( PreferencesId, fileMenu, 50, -1 );
796 createMenu( separator(), fileMenu, -1, 50, -1 );
798 createMenu( separator(), fileMenu, -1, 100, -1 );
799 createMenu( MRUId, fileMenu, 100, -1 );
800 createMenu( separator(), fileMenu, -1, 100, -1 );
802 #ifdef USE_SALOME_STYLE
803 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
804 0, desk, false, this, SLOT( onStylePreferences() ) );
805 #endif // USE_SALOME_STYLE
807 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
808 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
811 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
812 createMenu( separator(), viewMenu, -1, 20, -1 );
813 #ifdef USE_SALOME_STYLE
814 createMenu( StyleId, viewMenu, 20, -1 );
815 #endif // USE_SALOME_STYLE
816 createMenu( FullScreenId, viewMenu, 20, -1 );
818 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
819 QString( "SalomeModules" ) ); // name (language-independant)
820 createTool( ModulesListId, modTBar );
823 /*!On module activation action.*/
824 void LightApp_Application::onModuleActivation( const QString& modName )
826 // Force user to create/open a study before module activation
827 QMap<QString, QString> iconMap;
828 moduleIconNames( iconMap );
829 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
831 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
833 bool cancelled = false;
835 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
836 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
837 QMap<int, QString> opmap = activateModuleActions();
838 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
839 aDlg.addButton( it.value(), it.key() );
841 int res = aDlg.exec();
843 // some operation is selected
844 moduleActionSelected( res );
848 putInfo( tr("INF_CANCELLED") );
850 LightApp_ModuleAction* moduleAction =
851 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
853 moduleAction->setActiveModule( QString() );
859 activateModule( modName );
862 /*!Default module activation.*/
863 QString LightApp_Application::defaultModule() const
865 QStringList aModuleNames;
866 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
867 //! If there's the one and only module --> activate it automatically
868 //! TODO: Possible improvement - default module can be taken from preferences
869 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
872 /*!On new window slot.*/
873 void LightApp_Application::onNewWindow()
875 const QObject* obj = sender();
876 if ( !obj || !obj->inherits( "QAction" ) )
880 int id = actionId( (QAction*)obj );
883 #ifndef DISABLE_GLVIEWER
885 type = GLViewer_Viewer::Type();
888 #ifndef DISABLE_PLOT2DVIEWER
890 type = Plot2d_Viewer::Type();
893 #ifndef DISABLE_OCCVIEWER
895 type = OCCViewer_Viewer::Type();
898 #ifndef DISABLE_VTKVIEWER
900 type = VTKViewer_Viewer::Type();
903 #ifndef DISABLE_QXGRAPHVIEWER
904 case NewQxSceneViewId:
905 type = QxScene_Viewer::Type();
908 #ifndef DISABLE_GRAPHICSVIEW
909 case NewGraphicsViewId:
910 type = GraphicsView_Viewer::Type();
913 #ifndef DISABLE_PVVIEWER
915 type = PVViewer_Viewer::Type();
918 #ifndef DISABLE_PYVIEWER
920 type = PyViewer_Viewer::Type();
925 if ( !type.isEmpty() )
926 createViewManager( type );
930 SLOT: Creates new document
932 void LightApp_Application::onNewDoc()
934 #ifdef SINGLE_DESKTOP
935 if ( !checkExistingDoc() )
939 //asl: fix for 0020515
940 saveDockWindowsState();
942 CAM_Application::onNewDoc();
946 SLOT: Opens new document
948 void LightApp_Application::onOpenDoc()
950 SUIT_Study* study = activeStudy();
952 #ifdef SINGLE_DESKTOP
953 if ( !checkExistingDoc() )
957 CAM_Application::onOpenDoc();
959 if ( !study ) // new study will be create in THIS application
962 updateViewManagers();
967 SLOT: Opens new document.
968 \param aName - name of file
970 bool LightApp_Application::onOpenDoc( const QString& aName )
972 #ifdef SINGLE_DESKTOP
973 if ( !checkExistingDoc() )
977 saveDockWindowsState();
979 // We should take mru action first because this application instance can be deleted later.
980 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
982 bool res = CAM_Application::onOpenDoc( aName );
987 mru->insert( aName );
989 mru->remove( aName );
995 SLOT: Displays "About" message box
997 void LightApp_Application::onHelpAbout()
999 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1004 Private SLOT: Called on selection is changed
1005 Dispatchs active module that selection is changed
1007 void LightApp_Application::onSelection()
1009 onSelectionChanged();
1011 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1012 ((LightApp_Module*)activeModule())->selectionChanged();
1017 \param study - SUIT_Study.
1019 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1021 CAM_Application::setActiveStudy( study );
1025 Enables/Disables menu items and toolbar buttons. Rebuild menu
1027 void LightApp_Application::updateCommandsStatus()
1029 CAM_Application::updateCommandsStatus();
1032 #ifndef DISABLE_GLVIEWER
1033 a = action( NewGLViewId );
1035 a->setEnabled( activeStudy() );
1038 #ifndef DISABLE_PLOT2DVIEWER
1039 a = action( NewPlot2dId );
1041 a->setEnabled( activeStudy() );
1044 #ifndef DISABLE_OCCVIEWER
1045 a = action( NewOCCViewId );
1047 a->setEnabled( activeStudy() );
1050 #ifndef DISABLE_VTKVIEWER
1051 a = action( NewVTKViewId );
1053 a->setEnabled( activeStudy() );
1056 #ifndef DISABLE_QXGRAPHVIEWER
1057 a = action( NewQxSceneViewId );
1059 a->setEnabled( activeStudy() );
1062 #ifndef DISABLE_GRAPHICSVIEW
1063 a = action( NewGraphicsViewId );
1065 a->setEnabled( activeStudy() );
1068 #ifndef DISABLE_PVVIEWER
1069 a = action( NewPVViewId );
1071 a->setEnabled( activeStudy() );
1074 #ifndef DISABLE_PYVIEWER
1075 a = action( NewPyViewerId );
1077 a->setEnabled( activeStudy() );
1083 Runs system command in separate thread
1085 class RunBrowser: public QThread
1088 RunBrowser( LightApp_Application* app,
1089 const QString& theApp,
1090 const QString& theParams,
1091 const QString& theHelpFile,
1092 const QString& theContext = QString() )
1094 myParams( theParams ),
1095 myContext( theContext ),
1099 //For the external browser always specify 'file://' protocol,
1100 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1101 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1106 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1107 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1109 QProcess* proc = new QProcess();
1111 proc->start( aCommand );
1112 if ( !proc->waitForStarted() ) {
1113 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1114 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1115 ce2000->setData( msg );
1116 QApplication::postEvent( myLApp, ce2000 );
1127 LightApp_Application* myLApp;
1131 SLOT: Displays help contents for choosen module
1133 void LightApp_Application::onHelpContentsModule()
1135 const QAction* a = (QAction*) sender();
1136 QString helpFile = a->data().toString();
1137 if ( helpFile.isEmpty() ) return;
1139 SUIT_ResourceMgr* resMgr = resourceMgr();
1142 platform = "winapplication";
1144 platform = "application";
1146 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1148 QString quote("\"");
1149 anApp.prepend( quote );
1150 anApp.append( quote );
1152 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1153 #if DISABLE_QTXWEBBROWSER
1154 bool useExtBrowser = true;
1156 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1159 if( useExtBrowser ) {
1160 if ( !anApp.isEmpty() ) {
1161 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1165 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1166 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1167 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1169 showPreferences( tr( "PREF_APP" ) );
1173 QStringList parameters;
1174 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1175 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1176 parameters << helpFile;
1177 QProcess::startDetached( "HelpBrowser", parameters );
1182 SLOT: Displays help contents for choosen dialog
1184 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1185 const QString& theFileName,
1186 const QString& theContext )
1188 QString fileName = theFileName;
1189 QString context = theContext;
1190 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1191 // context might be passed within theFileName argument
1192 QStringList comps = fileName.split("#");
1193 if ( comps.count() > 1 ) {
1194 context = comps.last();
1196 fileName = comps.join("#");
1200 QString homeDir = "";
1201 if ( !theComponentName.isEmpty() ) {
1202 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1203 if ( !dir.isEmpty() )
1204 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1205 Qtx::addSlash( "share" ) +
1206 Qtx::addSlash( "doc" ) +
1207 Qtx::addSlash( "salome" ) +
1208 Qtx::addSlash( "gui" ) +
1209 Qtx::addSlash( theComponentName ) );
1212 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1213 SUIT_ResourceMgr* resMgr = resourceMgr();
1216 platform = "winapplication";
1218 platform = "application";
1220 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1222 QString quote("\"");
1223 anApp.prepend( quote );
1224 anApp.append( quote );
1227 #if DISABLE_QTXWEBBROWSER
1228 bool useExtBrowser = true;
1230 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1234 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1236 if ( !anApp.isEmpty() ) {
1237 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1241 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1242 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1243 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1244 showPreferences( tr( "PREF_APP" ) );
1248 QStringList parameters;
1249 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1250 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1251 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1252 QProcess::startDetached( "HelpBrowser", parameters );
1257 Sets enable or disable some actions on selection changed.
1259 void LightApp_Application::onSelectionChanged()
1261 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1262 bool canCopy = m ? m->canCopy() : false;
1263 bool canPaste = m ? m->canPaste() : false;
1265 action( EditCopyId )->setEnabled(canCopy);
1266 action( EditPasteId )->setEnabled(canPaste);
1270 SLOT: Performs some actions when dockable windows are triggered
1272 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1276 QWidget* LightApp_Application::dockWindow( const int id ) const
1279 if ( myWin.contains( id ) )
1284 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1289 QDockWidget* dock = 0;
1290 QWidget* w = wid->parentWidget();
1291 while ( w && !dock )
1293 dock = ::qobject_cast<QDockWidget*>( w );
1294 w = w->parentWidget();
1299 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1304 if ( wid != dockWindow( id ) )
1305 removeDockWindow( id );
1307 myWin.insert( id, wid );
1309 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1310 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1312 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1313 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1314 QString( "%1Dock" ).arg( wid->objectName() ) );
1315 dock->setWidget( wid );
1316 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1317 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1318 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1320 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1321 if ( !accel.isEmpty() )
1322 dock->toggleViewAction()->setShortcut( accel );
1327 void LightApp_Application::removeDockWindow( const int id )
1329 QWidget* wid = dockWindow( id );
1335 QDockWidget* dock = windowDock( wid );
1339 dock->setWidget( 0 );
1340 wid->setParent( 0 );
1341 wid->setVisible( false );
1345 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1347 QDockWidget* dock = windowDock( dockWindow( id ) );
1348 if ( dock && desktop() ) {
1349 desktop()->addDockWidget( place, dock );
1350 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1351 if ( a ) a->update();
1357 \param flag - key for window
1358 \param studyId - study id
1359 Flag used how identificator of window in windows list.
1361 QWidget* LightApp_Application::getWindow( const int flag, const int )
1363 QWidget* wid = dockWindow( flag );
1365 insertDockWindow( flag, wid = createWindow( flag ) );
1367 QMap<int, int> winMap;
1368 currentWindows( winMap );
1369 if ( winMap.contains( flag ) )
1370 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1376 \return Object Browser
1378 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1380 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1386 LogWindow* LightApp_Application::logWindow()
1388 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1391 #ifndef DISABLE_PYCONSOLE
1393 This returns the python console integrated to the GUI. Depending
1394 when you request the python console, this function could return
1395 null. Then the optional parameter force (default to false) can be
1396 set to force the creation of the python console if it is not done
1398 \param force - if true, the pythonConsole is created if it does not exist yet
1399 \return Python Console
1401 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1403 QWidget* wid = dockWindow( WT_PyConsole );
1404 if ( !wid && force==true) {
1405 wid = getWindow(WT_PyConsole);
1407 return qobject_cast<PyConsole_Console*>( wid );
1412 Updates object browser and maybe data models
1413 \param updateModels - if it is true, then data models are updated
1415 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1417 // update existing data models
1420 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1421 if ( objectBrowser() )
1422 objectBrowser()->setAutoUpdate( false );
1424 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1426 CAM_Study::ModelList dm_list;
1427 study->dataModels( dm_list );
1428 QListIterator<CAM_DataModel*> it( dm_list );
1429 while ( it.hasNext() ) {
1430 CAM_DataModel* camDM = it.next();
1431 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1432 ((LightApp_DataModel*)camDM)->update();
1436 if( objectBrowser() )
1437 objectBrowser()->setAutoUpdate( isAutoUpdate );
1440 if ( objectBrowser() ) {
1441 objectBrowser()->updateGeometry();
1442 objectBrowser()->updateTree( 0, false );
1449 LightApp_Preferences* LightApp_Application::preferences() const
1451 return preferences( false );
1455 \return first view manager of some type
1456 \param vmType - type of view manager
1457 \param create - is it necessary to create view manager in case, when there is no manager of such type
1459 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1461 SUIT_ViewManager* aVM = viewManager( vmType );
1462 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1464 if ( anActiveVM && anActiveVM->getType() == vmType )
1467 if ( aVM && create )
1469 if ( !aVM->getActiveView() )
1472 desktop()->setActiveWindow( aVM->getActiveView() );
1475 aVM = createViewManager( vmType );
1481 Creates view manager of some type
1482 \param vmType - type of view manager
1484 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType )
1486 SUIT_ResourceMgr* resMgr = resourceMgr();
1488 SUIT_ViewManager* viewMgr = 0;
1489 #ifndef DISABLE_GLVIEWER
1490 if( vmType == GLViewer_Viewer::Type() )
1492 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1493 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1496 #ifndef DISABLE_PLOT2DVIEWER
1497 if( vmType == Plot2d_Viewer::Type() )
1499 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1501 #ifndef DISABLE_SALOMEOBJECT
1502 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1504 new LightApp_Plot2dSelector( v, mySelMgr );
1506 vm = new Plot2d_Viewer();
1508 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1509 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1512 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1513 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1517 #ifndef DISABLE_QXGRAPHVIEWER
1518 if( vmType == QxScene_Viewer::Type() )
1520 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1521 QxScene_Viewer* vm = new QxScene_Viewer();
1522 viewMgr->setViewModel( vm );
1523 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1526 #ifndef DISABLE_GRAPHICSVIEW
1527 if( vmType == GraphicsView_Viewer::Type() )
1529 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1530 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1533 #ifndef DISABLE_PVVIEWER
1534 if( vmType == PVViewer_Viewer::Type() )
1536 if ( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false ) ) ) {
1537 viewMgr->getActiveView()->setFocus();
1540 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1544 #ifndef DISABLE_PYVIEWER
1545 if( vmType == PyViewer_Viewer::Type() )
1547 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1550 #ifndef DISABLE_OCCVIEWER
1551 if( vmType == OCCViewer_Viewer::Type() )
1553 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1554 OCCViewer_Viewer* vm;
1555 #ifndef DISABLE_SALOMEOBJECT
1556 vm = new SOCC_Viewer();
1558 vm = new OCCViewer_Viewer( true );
1560 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1561 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1562 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1563 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1564 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1565 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1566 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1567 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1569 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1570 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1571 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1572 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1573 #if OCC_VERSION_LARGE > 0x06090000
1574 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1575 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1576 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1577 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1578 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1579 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1581 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1582 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1583 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1585 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1586 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1587 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1588 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1589 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1590 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1591 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1592 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1595 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1596 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1599 #ifndef DISABLE_VTKVIEWER
1600 #ifndef DISABLE_SALOMEOBJECT
1601 if ( vmType == SVTK_Viewer::Type() )
1603 if ( vmType == VTKViewer_Viewer::Type() )
1606 #ifndef DISABLE_SALOMEOBJECT
1607 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1608 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1611 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1612 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1613 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1614 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1615 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1616 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1617 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1618 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1619 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1620 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1621 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1622 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1623 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1624 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1625 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1626 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1627 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1628 new LightApp_VTKSelector( vm, mySelMgr );
1631 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1632 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1634 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1642 addViewManager( viewMgr );
1643 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1645 if ( viewWin && desktop() ) {
1646 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1647 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1653 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1655 SUIT_ResourceMgr* resMgr = resourceMgr();
1657 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1659 new LightApp_WgViewModel( vmType, w ) );
1660 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1662 addViewManager( vm );
1663 SUIT_ViewWindow* vw = vm->createViewWindow();
1664 if ( vw && desktop() ) {
1665 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1666 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1669 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1670 myUserWmTypes << vmType;
1675 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1677 SUIT_ResourceMgr* resMgr = resourceMgr();
1679 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1683 QString vmType = vm->getType();
1685 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1687 addViewManager( vm );
1688 SUIT_ViewWindow* vw = vm->createViewWindow();
1689 if ( vw && desktop() ) {
1690 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1691 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1694 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1695 myUserWmTypes << vmType;
1701 SLOT: Removes view manager from application
1703 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1705 removeViewManager( theVM );
1709 Protected SLOT: On study created.
1710 \param theStudy - just created study
1712 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1714 SUIT_DataObject* aRoot = 0;
1715 if ( theStudy && theStudy->root() )
1717 aRoot = theStudy->root();
1718 //aRoot->setName( tr( "DATA_MODELS" ) );
1721 getWindow( WT_ObjectBrowser );
1723 loadDockWindowsState();
1725 if ( objectBrowser() )
1726 objectBrowser()->setRoot( aRoot );
1728 activateModule( defaultModule() );
1730 if ( objectBrowser() )
1731 objectBrowser()->openLevels();
1733 #ifndef DISABLE_PYCONSOLE
1734 if( pythonConsole() )
1735 getPyInterp()->initStudy();
1740 Protected SLOT: On study opened.
1741 \param theStudy - just opened study
1743 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1745 SUIT_DataObject* aRoot = 0;
1746 if ( theStudy && theStudy->root() )
1748 aRoot = theStudy->root();
1752 getWindow( WT_ObjectBrowser );
1754 loadDockWindowsState();
1756 if ( objectBrowser() )
1757 objectBrowser()->setRoot( aRoot );
1759 activateModule( defaultModule() );
1761 if ( objectBrowser() )
1762 objectBrowser()->openLevels();
1764 #ifndef DISABLE_PYCONSOLE
1765 if( pythonConsole() )
1766 getPyInterp()->initStudy();
1772 /*!Protected SLOT. On study saved.*/
1773 void LightApp_Application::onStudySaved( SUIT_Study* s )
1775 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1777 mru->insert( s->studyName() );
1782 /*!Protected SLOT. On study closed.*/
1783 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1786 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1787 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1790 // stop auto-save timer
1791 myAutoSaveTimer->stop();
1793 // Bug 10396: clear selection
1794 mySelMgr->clearSelected();
1796 // Bug 12944: emit signal only after clear selection
1799 activateModule( "" );
1802 /*!Protected SLOT.On desktop activated.*/
1803 void LightApp_Application::onDesktopActivated()
1805 CAM_Application::onDesktopActivated();
1806 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1808 aModule->studyActivated();
1811 void LightApp_Application::studyOpened( SUIT_Study* s )
1813 CAM_Application::studyOpened( s );
1816 updateViewManagers();
1819 void LightApp_Application::studySaved( SUIT_Study* s )
1821 CAM_Application::studyOpened( s );
1822 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1823 if ( aResMgr && activeStudy() ) {
1824 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1825 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1829 void LightApp_Application::studyCreated( SUIT_Study* s )
1831 CAM_Application::studyCreated( s );
1834 updateViewManagers();
1837 /*!Gets file filter.
1838 *\retval QString "(*.bin)"
1840 QString LightApp_Application::getFileFilter() const
1848 Shows file dialog and return user selected file name
1850 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1851 const QString& caption, QWidget* parent )
1855 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1856 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1859 /*! Gets directory*/
1860 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1864 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1867 /*! Get open file names*/
1868 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1869 const QString& caption, QWidget* parent )
1873 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1874 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1877 /*!Private SLOT. Update object browser.*/
1878 void LightApp_Application::onRefresh()
1880 updateObjectBrowser( true );
1883 /*!Private SLOT. Update actions after rename object.*/
1884 void LightApp_Application::onRenamed()
1886 activeStudy()->Modified();
1890 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1891 // To prevent reversion the window should be either aligned during movement and resize.
1892 /*!Private SLOT. Update actions after rename object.*/
1893 /*void LightApp_Application::onMoved()
1895 OCCViewer_ViewManager* viewMgr = 0;
1896 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1898 OCCViewer_ViewWindow* view = 0;
1899 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1901 view->getViewPort()->repaintViewAfterMove();
1906 /*!Private SLOT. Support drag-and-drop operation.*/
1907 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1909 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1913 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1915 aModule->dropObjects( objects, parentObj, row, action );
1918 /*!Private SLOT. On preferences.*/
1919 void LightApp_Application::onPreferences()
1921 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1924 /*!Private SLOT. On preferences.*/
1925 void LightApp_Application::showPreferences( const QString& itemText )
1927 QApplication::setOverrideCursor( Qt::WaitCursor );
1929 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1931 QApplication::restoreOverrideCursor();
1936 preferences()->activateItem( itemText );
1938 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1941 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1942 resourceMgr()->save();
1945 shortcutMgr()->updateShortcuts();
1951 /*!Protected SLOT. On preferences changed.*/
1952 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1954 LightApp_Module* sMod = 0;
1955 CAM_Module* mod = module( modName );
1956 if ( mod && mod->inherits( "LightApp_Module" ) )
1957 sMod = (LightApp_Module*)mod;
1960 sMod->preferencesChanged( section, param );
1962 preferencesChanged( section, param );
1963 // emit signal to allow additional preferences changing processing
1964 emit preferenceChanged( modName, section, param );
1967 /*!Remove all windows from study.*/
1968 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1970 saveDockWindowsState();
1972 if ( SUIT_DataBrowser* ob = objectBrowser() )
1975 CAM_Application::beforeCloseDoc( s );
1978 /*!Update actions.*/
1979 void LightApp_Application::updateActions()
1981 updateCommandsStatus();
1987 SUIT_Study* LightApp_Application::createNewStudy()
1989 LightApp_Application::lastStudyId++;
1991 LightApp_Study* aStudy = new LightApp_Study( this );
1993 // Set up processing of major study-related events
1994 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
1995 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
1996 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
1997 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2003 Creates window by flag.
2004 \param flag - identificator of window type
2006 QWidget* LightApp_Application::createWindow( const int flag )
2010 SUIT_ResourceMgr* resMgr = resourceMgr();
2012 if ( flag == WT_ObjectBrowser )
2014 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2015 ob->setObjectName( "objectBrowser" );
2016 ob->setSortMenuEnabled( true );
2017 ob->setAutoUpdate( true );
2018 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2019 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2021 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2022 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2023 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2025 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2026 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2027 treeModel->setSearcher( this );
2028 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2029 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2031 // Mantis issue 0020136: Drag&Drop in OB
2032 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2034 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2035 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2036 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2037 this, SLOT( onRenamed( ) ) );
2041 // temporary commented
2043 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2045 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2048 // Create OBSelector
2049 new LightApp_OBSelector( ob, mySelMgr );
2050 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2051 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2053 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2055 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2056 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2057 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2059 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2061 #ifndef DISABLE_PYCONSOLE
2062 else if ( flag == WT_PyConsole )
2064 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2065 pyCons->setObjectName( "pythonConsole" );
2066 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2067 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2068 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2069 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2070 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2074 else if ( flag == WT_LogWindow )
2076 LogWindow* logWin = new LogWindow( desktop() );
2077 logWin->setObjectName( "logWindow" );
2078 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2079 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2081 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2087 \return default windows( Object Browser, Python Console )
2088 Adds to map \a aMap.
2090 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2092 #ifndef DISABLE_PYCONSOLE
2093 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2095 if ( activeStudy() ) {
2096 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2097 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2101 /*!Default view managers*/
2102 void LightApp_Application::defaultViewManagers( QStringList& ) const
2108 \return preferences.
2109 Create preferences, if \a crt = true.
2111 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2116 LightApp_Application* that = (LightApp_Application*)this;
2118 bool toCreate = !_prefs_ && crt;
2121 _prefs_ = new LightApp_Preferences( resourceMgr() );
2122 that->createPreferences( _prefs_ );
2125 that->myPrefs = _prefs_;
2127 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2128 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2129 connect( myPrefs, SIGNAL( resetToDefaults() ),
2130 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2135 SUIT_ResourceMgr* resMgr = resourceMgr();
2137 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2138 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2140 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2144 QStringList modNameList;
2145 app->modules( modNameList, false );
2147 QMap<QString, QString> iconMap;
2148 app->moduleIconNames( iconMap );
2150 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2152 if ( !app->isLibExists( *it ) || _prefs_->hasModule( *it ) )
2155 int modId = _prefs_->addPreference( *it );
2156 if ( iconMap.contains( *it ) )
2157 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2161 app->modules( modList );
2162 QListIterator<CAM_Module*> itr( modList );
2163 while ( itr.hasNext() )
2165 LightApp_Module* mod = 0;
2167 CAM_Module* anItem = itr.next();
2168 if ( anItem->inherits( "LightApp_Module" ) )
2169 mod = (LightApp_Module*)anItem;
2171 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2173 _prefs_->addPreference( mod->moduleName() );
2174 mod->createPreferences();
2175 that->emptyPreferences( mod->moduleName() );
2179 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2185 Adds new module to application
2187 void LightApp_Application::moduleAdded( CAM_Module* mod )
2189 CAM_Application::moduleAdded( mod );
2191 LightApp_Module* lightMod = 0;
2192 if ( mod && mod->inherits( "LightApp_Module" ) )
2193 lightMod = (LightApp_Module*)mod;
2195 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2197 myPrefs->addPreference( mod->moduleName() );
2198 lightMod->createPreferences();
2199 emptyPreferences( mod->moduleName() );
2203 void LightApp_Application::emptyPreferences( const QString& modName )
2205 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2206 if ( !item || !item->isEmpty() )
2209 // printf( "---------------------> Modify for empty module.\n" );
2211 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2212 frm->setIcon( item->icon() );
2213 frm->setStretch( false );
2214 item->parentItem()->insertItem( frm, item );
2215 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2222 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2227 QStringList aValuesList;
2228 QList<QVariant> anIndicesList;
2232 // . Top-level "SALOME" preferences group <<start>>
2233 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2234 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2236 // .. "General" preferences tab <<start>>
2237 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2239 // ... "Language" group <<start>>
2240 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2241 pref->setItemProperty( "columns", 2, langGroup );
2242 // .... -> application language
2243 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2244 LightApp_Preferences::Selector, "language", "language" );
2245 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2246 QList<QVariant> aIcons;
2247 QList<QVariant> aNumbers;
2248 QStringList aTitles;
2249 foreach ( QString aLang, aLangs ) {
2250 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2252 aTitles << langToName( aLang );
2254 pref->setItemProperty( "strings", aTitles, curLang );
2255 pref->setItemProperty( "ids", aNumbers, curLang );
2256 pref->setItemProperty( "icons", aIcons, curLang );
2257 pref->setItemProperty( "restart", true, curLang );
2259 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2260 LightApp_Preferences::Bool, "language", "locale" );
2261 pref->setItemProperty( "restart", true, curLocale );
2262 // ... "Language" group <<end>>
2264 // ... "Look and feel" group <<start>>
2265 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2266 pref->setItemProperty( "columns", 2, lookGroup );
2267 // .... -> show splash-screen
2268 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2269 // .... -> opaque resize
2270 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2271 // .... -> drop-down buttons
2272 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2273 // ... "Look and feel" group <<end>>
2275 // ... "Study properties" group <<start>>
2276 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2277 pref->setItemProperty( "columns", 2, studyGroup );
2278 // .... -> multi-file save
2279 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2280 // .... -> ascii save mode
2281 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2282 // .... -> store windows geometry
2283 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2284 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2285 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2286 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2287 // .... -> auto-save
2288 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2289 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2290 pref->setItemProperty( "min", 0, autoSaveInterval );
2291 pref->setItemProperty( "max", 1440, autoSaveInterval );
2292 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2293 // ... "Study properties" group <<end>>
2295 // ... "Help browser" group <<start>>
2296 #ifndef DISABLE_QTXWEBBROWSER
2297 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2299 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2303 QString platform = "winapplication";
2305 QString platform = "application";
2307 // .... -> browser application
2308 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2309 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2310 // .... -> browser parameters
2311 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2312 // ... "Help browser" group <<end>>
2314 // ... "Python console properties" group <<start>>
2315 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2316 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2318 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2319 // .... -> show banner
2320 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2321 // .... -> auto-completion
2322 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2323 // ... "Python console properties" group <<end>>
2325 // ... "MRU" preferences group <<start>>
2326 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2327 pref->setItemProperty( "columns", 4, mruGroup );
2328 // number of MRU items
2329 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2330 "MRU", "visible_count" );
2331 pref->setItemProperty( "min", 0, mruVisCount );
2332 pref->setItemProperty( "max", 100, mruVisCount );
2334 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2335 "MRU", "link_type" );
2336 aValuesList.clear();
2337 anIndicesList.clear();
2338 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2339 anIndicesList << 0 << 1 << 2 ;
2340 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2341 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2342 // ... "MRU" preferences group <<end>>
2344 // ... "Full-screen" group <<start>>
2345 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2346 pref->setItemProperty( "columns", 2, fullScreenGroup );
2347 // .... -> automatic hiding toolbars
2348 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2349 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2350 // ... "Full-screen" group <<end>>
2352 // .. "General" preferences tab <<end>>
2354 // .. "3D viewer" group <<start>>
2355 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2356 // ... -> navigation mode
2357 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2358 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2359 aValuesList.clear();
2360 anIndicesList.clear();
2361 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2362 anIndicesList << 0 << 1;
2363 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2364 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2365 // ... -> zooming mode
2366 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2367 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2368 aValuesList.clear();
2369 anIndicesList.clear();
2370 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2371 anIndicesList << 0 << 1;
2372 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2373 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2374 // ... "Trihedron" group <<start>>
2375 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2376 pref->setItemProperty( "columns", 2, occTriGroup );
2377 // .... -> trihedron size
2378 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2379 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2380 pref->setItemProperty( "min", 1.0E-06, occTS );
2381 pref->setItemProperty( "max", 1000, occTS );
2382 // .... -> relative size of trihedron
2383 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2384 // .... -> show static trihedron
2385 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2386 // ... "Trihedron" group <<end>>
2387 // .. "3D viewer" group <<end>>
2391 #ifndef DISABLE_OCCVIEWER
2392 // .. "OCC viewer" group <<start>>
2393 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2395 // .... -> Projection mode
2396 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2397 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2398 aValuesList.clear();
2399 anIndicesList.clear();
2400 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2401 anIndicesList << 0 << 1;
2402 pref->setItemProperty( "strings", aValuesList, occProjMode );
2403 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2404 #if OCC_VERSION_LARGE > 0x06090000
2405 // .... -> Stereo group
2406 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2407 pref->setItemProperty( "columns", 2, stereoGroup );
2408 // .... -> Stereo type
2409 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2410 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2411 aValuesList.clear();
2412 anIndicesList.clear();
2414 OCCViewer_Viewer::stereoData( aValuesList, idList);
2415 foreach( int gid, idList ) anIndicesList << gid;
2416 pref->setItemProperty( "strings", aValuesList, stereoType );
2417 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2419 // .... -> Anaglyph filter
2420 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2421 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2422 aValuesList.clear();
2423 anIndicesList.clear();
2424 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2425 anIndicesList << 0 << 1 << 2;
2427 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2428 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2430 // .... -> Convergence distance type
2431 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2432 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2433 aValuesList.clear();
2434 anIndicesList.clear();
2435 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2436 anIndicesList << 0 << 1;
2437 pref->setItemProperty( "strings", aValuesList, occFocusType );
2438 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2440 // .... -> Stereographic focus value
2441 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2442 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2443 pref->setItemProperty( "precision", 3, focusValue );
2444 pref->setItemProperty( "min", 1.0E-03, focusValue );
2445 pref->setItemProperty( "max", 1.0E03, focusValue );
2446 pref->setItemProperty( "step", 0.05, focusValue );
2449 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2450 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2451 aValuesList.clear();
2452 anIndicesList.clear();
2453 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2454 anIndicesList << 0 << 1;
2455 pref->setItemProperty( "strings", aValuesList, occIODType );
2456 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2458 // .... -> Interocular distance (IOD) value
2459 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2460 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2461 pref->setItemProperty( "precision", 3, IODValue );
2462 pref->setItemProperty( "min", 1.0E-03, IODValue );
2463 pref->setItemProperty( "max", 1.0E03, IODValue );
2464 pref->setItemProperty( "step", 0.05, IODValue );
2466 // .... -> Reverse stereo
2467 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2468 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2469 // .... -> Enable V-Sync
2470 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2471 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2472 // .... -> Enable quad-buffer support
2473 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2474 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2476 // ... "Background" group <<start>>
2477 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2478 // pref->setItemProperty( "columns", 2, bgGroup );
2479 aValuesList.clear();
2480 anIndicesList.clear();
2483 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2484 foreach( int gid, idList ) anIndicesList << gid;
2485 // .... -> 3D viewer background
2486 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2487 LightApp_Preferences::Background, "OCCViewer", "background" );
2488 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2489 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2490 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2491 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2492 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2493 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2494 pref->setItemProperty( "custom_enabled", false, bgId );
2495 pref->setItemProperty( "image_formats", formats, bgId );
2496 // .... -> XZ viewer background
2497 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2498 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2499 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2500 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2501 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2502 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2503 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2504 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2505 pref->setItemProperty( "custom_enabled", false, bgId );
2506 pref->setItemProperty( "image_formats", formats, bgId );
2507 // .... -> YZ viewer background
2508 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2509 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2510 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2511 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2512 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2513 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2514 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2515 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2516 pref->setItemProperty( "custom_enabled", false, bgId );
2517 pref->setItemProperty( "image_formats", formats, bgId );
2518 // .... -> XY viewer background
2519 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2520 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2521 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2522 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2523 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2524 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2525 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2526 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2527 pref->setItemProperty( "custom_enabled", false, bgId );
2528 pref->setItemProperty( "image_formats", formats, bgId );
2529 // ... "Background" group <<end>>
2532 // ... "Selection" group <<start>>
2533 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2534 pref->setItemProperty( "columns", 2, occSelectionGroup );
2535 // .... -> enable preselection
2536 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2537 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2538 // .... -> enable selection
2539 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2540 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2541 // ... "Selection" group <<end>>
2543 // ... "Clipping" group <<start>>
2544 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2545 // .... -> clipping color
2546 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2547 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2548 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2549 pref->setItemProperty( "columns", 2, texturePref );
2550 // .... -> use default texture
2551 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2552 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2553 // .... -> clipping texture
2554 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2555 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2556 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2558 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2559 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2560 // .... -> scale factor
2561 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2562 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2563 pref->setItemProperty( "precision", 3, scaleFactor );
2564 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2565 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2566 pref->setItemProperty( "step", 0.1, scaleFactor );
2567 // ... "Clipping" group <<end>>
2569 // ... "Ray tracing" group <<start>>
2570 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2571 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2572 pref->setItemProperty( "columns", 2, rtPref );
2574 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2575 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2576 pref->setItemProperty( "min", 1, rt_depth );
2577 pref->setItemProperty( "max", 10, rt_depth );
2578 pref->setItemProperty( "step", 1, rt_depth );
2579 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2580 // .... -> specular reflections
2581 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2582 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2583 // .... -> adaptive anti-aliasing
2584 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2585 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2586 // .... -> shadows rendering
2587 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2588 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2589 // .... -> transparent shadow
2590 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2591 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2592 // ... "Ray tracing" group <<end>>
2594 // ... "Light source" group <<start>>
2595 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2596 // .... -> light color
2597 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2598 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2599 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2600 pref->setItemProperty( "columns", 3, directionPref );
2601 // .... -> light direction (dx component)
2602 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2603 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2604 pref->setItemProperty( "precision", 2, light_dx );
2605 pref->setItemProperty( "min", -1.0E03, light_dx );
2606 pref->setItemProperty( "max", 1.0E03, light_dx );
2607 pref->setItemProperty( "step", 0.1, light_dx );
2608 // .... -> light direction (dy component)
2609 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2610 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2611 pref->setItemProperty( "precision", 2, light_dy );
2612 pref->setItemProperty( "min", -1.0E03, light_dy );
2613 pref->setItemProperty( "max", 1.0E03, light_dy );
2614 pref->setItemProperty( "step", 0.1, light_dy );
2615 // .... -> light direction (dz component)
2616 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2617 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2618 pref->setItemProperty( "precision", 2, light_dz );
2619 pref->setItemProperty( "min", -1.0E03, light_dz );
2620 pref->setItemProperty( "max", 1.0E03, light_dz );
2621 pref->setItemProperty( "step", 0.1, light_dz );
2622 // ... "Light source" group <<end>>
2624 // ... -> empty frame (for layout) <<start>>
2625 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2626 pref->setItemProperty( "margin", 0, occGen );
2627 pref->setItemProperty( "columns", 2, occGen );
2628 // ... -> empty frame (for layout) <<end>>
2630 // .. "OCC viewer" group <<end>>
2633 #ifndef DISABLE_VTKVIEWER
2634 // .. "VTK viewer" group <<start>>
2635 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2637 // ... -> empty frame (for layout) <<start>>
2638 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2639 //pref->setItemProperty( "columns", 2, vtkGen );
2640 // .... -> projection mode
2641 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2642 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2643 aValuesList.clear();
2644 anIndicesList.clear();
2645 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2646 anIndicesList << 0 << 1;
2647 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2648 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2650 // .... -> Stereo group
2651 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2652 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2653 // .... -> Stereo type
2654 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2655 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2656 aValuesList.clear();
2657 anIndicesList.clear();
2659 SVTK_Viewer::stereoData( aValuesList, idList);
2660 foreach( int gid, idList ) anIndicesList << gid;
2661 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2662 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2663 // .... -> Anaglyph filter
2664 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2665 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2666 aValuesList.clear();
2667 anIndicesList.clear();
2668 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2669 anIndicesList << 0 << 1 << 2;
2671 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2672 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2674 // .... -> Enable quad-buffer support
2675 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2676 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2678 // .... -> background
2679 aValuesList.clear();
2680 anIndicesList.clear();
2683 #ifndef DISABLE_SALOMEOBJECT
2684 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2686 foreach( int gid, idList ) anIndicesList << gid;
2687 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2688 LightApp_Preferences::Background, "VTKViewer", "background" );
2689 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2690 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2691 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2692 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2693 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2694 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2695 pref->setItemProperty( "custom_enabled", false, bgId );
2696 #ifndef DISABLE_SALOMEOBJECT
2697 pref->setItemProperty( "image_formats", formats, bgId );
2699 // .... -> speed increment
2700 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2701 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2702 pref->setItemProperty( "min", 1, vtkSpeed );
2703 pref->setItemProperty( "max", 1000, vtkSpeed );
2704 // .... -> speed mode
2705 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2706 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2707 aValuesList.clear();
2708 anIndicesList.clear();
2709 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2710 anIndicesList << 0 << 1;
2711 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2712 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2714 // ... "Selection" group <<start>>
2715 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2716 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2717 // .... -> preselection
2718 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2719 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2720 aValuesList.clear();
2721 anIndicesList.clear();
2722 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2723 anIndicesList << 0 << 1 << 2;
2724 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2725 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2726 // .... -> enable selection
2727 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2728 // ... "Selection" group <<end>>
2730 // ... -> empty frame (for layout) <<end>>
2732 // ... space mouse sub-group <<start>>
2733 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2734 //pref->setItemProperty( "columns", 2, vtkSM );
2735 // .... -> decrease speed increment
2736 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2737 LightApp_Preferences::Selector, "VTKViewer",
2738 "spacemouse_func1_btn" );
2739 // .... -> increase speed increment
2740 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2741 LightApp_Preferences::Selector, "VTKViewer",
2742 "spacemouse_func2_btn" );
2743 // .... -> dominant / combined switch
2744 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2745 LightApp_Preferences::Selector, "VTKViewer",
2746 "spacemouse_func5_btn" ); //
2747 aValuesList.clear();
2748 anIndicesList.clear();
2749 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2750 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2751 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2752 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2753 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2754 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2755 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2756 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2757 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2758 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2759 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2760 // ... space mouse sub-group <<end>>
2762 // ... avi recording sub-group <<start>>
2763 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2764 pref->setItemProperty( "columns", 2, vtkRec );
2765 // .... -> recording mode
2766 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2767 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2768 aValuesList.clear();
2769 anIndicesList.clear();
2770 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2771 anIndicesList << 0 << 1;
2772 pref->setItemProperty( "strings", aValuesList, modePref );
2773 pref->setItemProperty( "indexes", anIndicesList, modePref );
2775 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2776 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2777 pref->setItemProperty( "min", 0.1, fpsPref );
2778 pref->setItemProperty( "max", 100, fpsPref );
2780 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2781 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2782 pref->setItemProperty( "min", 1, qualityPref );
2783 pref->setItemProperty( "max", 100, qualityPref );
2784 // .... -> progressive mode
2785 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2786 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2787 // ... avi recording sub-group <<end>>
2789 // ... group names sub-group <<start>>
2790 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2791 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2792 pref->setItemProperty( "columns", 2, vtkGN );
2793 // .... -> text color
2794 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2795 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2796 // .... -> transparency
2797 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2798 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2799 pref->setItemProperty( "min", 0.0, transPref );
2800 pref->setItemProperty( "max", 1.0, transPref );
2801 pref->setItemProperty( "step", 0.1, transPref );
2802 // ... -> group names sub-group <<end>>
2803 // .. "VTK viewer" group <<end>>
2806 // .. "Plot2d viewer" group <<start>>
2807 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2808 //pref->setItemProperty( "columns", 2, plot2dGroup );
2810 // ... -> background
2811 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2812 LightApp_Preferences::Color, "Plot2d", "Background" );
2813 // ... -> selection color
2814 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2815 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2817 // ... "Viewer" group <<start>>
2818 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2820 // .... -> curve type
2821 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2822 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2823 aValuesList.clear();
2824 anIndicesList.clear();
2825 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2826 anIndicesList << 0 << 1 << 2 ;
2827 pref->setItemProperty( "strings", aValuesList, curveType );
2828 pref->setItemProperty( "indexes", anIndicesList, curveType );
2829 // .... -> marker size
2830 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2831 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2832 pref->setItemProperty( "min", 0, markerSize );
2833 pref->setItemProperty( "max", 100, markerSize );
2834 // .... -> horizontal scaling mode
2835 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2836 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2837 aValuesList.clear();
2838 anIndicesList.clear();
2839 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2840 anIndicesList << 0 << 1 ;
2841 pref->setItemProperty( "strings", aValuesList, horScale );
2842 pref->setItemProperty( "indexes", anIndicesList, horScale );
2843 // .... -> vertical scaling mode
2844 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2845 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2846 pref->setItemProperty( "strings", aValuesList, verScale );
2847 pref->setItemProperty( "indexes", anIndicesList, verScale );
2849 // .... -> errors/deviation colot
2850 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2851 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2852 // .... -> deviation markers line size
2853 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2854 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2855 pref->setItemProperty( "min", 1, deviationMarkerLw );
2856 pref->setItemProperty( "max", 5, deviationMarkerLw );
2857 // .... -> deviation markers tick mark size
2858 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2859 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2860 pref->setItemProperty( "min", 1, deviationMarkerTs );
2861 pref->setItemProperty( "max", 5, deviationMarkerTs );
2862 // .... "Viewer" group <<end>>
2864 // ... "Legend" group <<start>>
2865 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2867 // .... -> show legend
2868 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2869 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2870 // .... -> legend position
2871 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2872 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2873 aValuesList.clear();
2874 anIndicesList.clear();
2875 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2876 anIndicesList << 0 << 1 << 2 << 3 ;
2877 pref->setItemProperty( "strings", aValuesList, legendPosition );
2878 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2879 // .... -> Symbol type
2880 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2881 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2882 aValuesList.clear();
2883 anIndicesList.clear();
2884 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2885 anIndicesList << 0 << 1 ;
2886 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2887 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2888 // .... -> legend font
2889 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2890 // ... -> font color
2891 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2892 // ... -> selection font color
2893 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2894 // ... "Legend" group <<end>>
2896 // .. "Plot2d viewer" group <<end>>
2898 // .. "PyViewer" preferences tab <<start>>
2899 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2900 // ... "Font settings" group <<start>>
2901 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2902 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2903 LightApp_Preferences::Font, "PyEditor", "Font" );
2904 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2905 // ... "Font settings" group <<end>>
2906 // ... "Display settings" group <<start>>
2907 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2908 pref->setItemProperty( "columns", 2, pyDispGroup );
2909 // ... -> current line highlight
2910 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2911 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2912 // ... -> text wrapping
2913 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2914 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2915 // ... -> center cursor on scroll
2916 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2917 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2918 // ... -> line numbers area
2919 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2920 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2921 // ... "Display settings" group <<end>>
2922 // ... "Tab settings" group <<start>>
2923 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2924 pref->setItemProperty( "columns", 2, pyTabGroup );
2925 // ... -> tab whitespaces
2926 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2927 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2929 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2930 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2931 // ... "Tab settings" group <<end>>
2932 // ... "Vertical edge settings" group <<start>>
2933 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2934 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2935 // ... -> vertical edge
2936 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2937 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2938 // ... -> number of columns
2939 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2940 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2941 // ... "Vertical edge settings" group <<end>>
2942 // .. "PyEditor" preferences tab <<end>>
2944 // .. "Directories" preferences tab <<start>>
2945 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2946 // ... --> quick directories list
2947 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2948 pref->addPreference( tr( "" ), dirGroup,
2949 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2950 // .. "Directories" preferences tab <<end>>
2952 // .. "Object browser" preferences tab <<start>>
2953 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2955 // ... "Search tool" group <<start>>
2956 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2957 // .... --> auto-hide
2958 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2959 "ObjectBrowser", "auto_hide_search_tool" );
2960 // ... "Search tool" group <<end>>
2962 // ... "Object browser settings" group <<start>>
2963 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2964 pref->setItemProperty( "columns", 2, objSetGroup );
2965 // .... -> auto size first column
2966 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2967 "ObjectBrowser", "auto_size_first" );
2968 // .... -> auto size other columns
2969 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2970 "ObjectBrowser", "auto_size" );
2971 // .... -> resize columns on expand item
2972 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2973 "ObjectBrowser", "resize_on_expand_item" );
2974 // .... -> browse to published object
2975 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
2976 "ObjectBrowser", "browse_published_object" );
2977 aValuesList.clear();
2978 anIndicesList.clear();
2979 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
2980 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
2981 pref->setItemProperty( "strings", aValuesList, browsePublished );
2982 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
2983 // ... "Object browser settings" group <<end>>
2984 // .. "Object browser" preferences tab <<end>>
2986 // .. "Shortcuts" preferences tab <<start>>
2987 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
2988 // ... "Shortcuts settings" group <<start>>
2989 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
2990 pref->addPreference( tr( "" ), shortcutGroup,
2991 LightApp_Preferences::ShortcutTree, "shortcuts" );
2992 // ... "Shortcuts settings" group <<end>>
2993 // .. "Shortcuts" preferences tab <<end>>
2994 // . Top-level "SALOME" preferences group <<end>>
3000 Changes appearance of application according to changed preferences
3001 \param sec - section
3002 \param param - name of changed parameter
3004 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3006 SUIT_ResourceMgr* resMgr = resourceMgr();
3010 if ( sec == "viewers" && param == "drop_down_buttons" )
3012 ViewManagerList vmlist = viewManagers();
3013 foreach( SUIT_ViewManager* vm, vmlist )
3015 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3016 foreach( SUIT_ViewWindow* vw, vwlist )
3017 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3021 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3023 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3024 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3025 QList<SUIT_ViewManager*> lst;
3026 #ifndef DISABLE_OCCVIEWER
3027 viewManagers( OCCViewer_Viewer::Type(), lst );
3028 QListIterator<SUIT_ViewManager*> itOCC( lst );
3029 while ( itOCC.hasNext() && sz >= 0 )
3031 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3032 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3035 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3036 occVM->setTrihedronSize( sz, relative );
3037 occVM->getAISContext()->UpdateCurrentViewer();
3040 #ifndef DISABLE_VTKVIEWER
3041 #ifndef DISABLE_SALOMEOBJECT
3042 viewManagers( SVTK_Viewer::Type(), lst );
3043 QListIterator<SUIT_ViewManager*> itVTK( lst );
3044 while ( itVTK.hasNext() && sz >= 0 )
3046 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3047 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3050 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3053 vtkVM->setTrihedronSize( sz, relative );
3061 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3063 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3064 QList<SUIT_ViewManager*> lst;
3065 #ifndef DISABLE_OCCVIEWER
3066 viewManagers( OCCViewer_Viewer::Type(), lst );
3067 QListIterator<SUIT_ViewManager*> itOCC( lst );
3068 while ( itOCC.hasNext() )
3070 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3071 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3074 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3077 occVM->setStaticTrihedronDisplayed( isVisible );
3081 #ifndef DISABLE_VTKVIEWER
3082 #ifndef DISABLE_SALOMEOBJECT
3083 viewManagers( SVTK_Viewer::Type(), lst );
3084 QListIterator<SUIT_ViewManager*> itVTK( lst );
3085 while ( itVTK.hasNext() )
3087 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3088 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3091 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3094 vtkVM->setStaticTrihedronVisible( isVisible );
3102 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3104 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3105 QList<SUIT_ViewManager*> lst;
3106 #ifndef DISABLE_OCCVIEWER
3107 viewManagers( OCCViewer_Viewer::Type(), lst );
3108 QListIterator<SUIT_ViewManager*> itOCC( lst );
3109 while ( itOCC.hasNext() )
3111 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3112 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3115 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3116 occVM->setInteractionStyle( mode );
3119 #ifndef DISABLE_VTKVIEWER
3120 #ifndef DISABLE_SALOMEOBJECT
3121 viewManagers( SVTK_Viewer::Type(), lst );
3122 QListIterator<SUIT_ViewManager*> itVTK( lst );
3123 while ( itVTK.hasNext() )
3125 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3126 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3129 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3130 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3136 #ifndef DISABLE_OCCVIEWER
3137 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3139 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3140 QList<SUIT_ViewManager*> lst;
3141 viewManagers( OCCViewer_Viewer::Type(), lst );
3142 QListIterator<SUIT_ViewManager*> it( lst );
3143 while ( it.hasNext() )
3145 SUIT_ViewModel* vm = it.next()->getViewModel();
3146 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3149 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3150 occVM->enablePreselection( isToEnablePreselection );
3155 #ifndef DISABLE_OCCVIEWER
3156 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3158 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3159 QList<SUIT_ViewManager*> lst;
3160 viewManagers( OCCViewer_Viewer::Type(), lst );
3161 QListIterator<SUIT_ViewManager*> it( lst );
3162 while ( it.hasNext() )
3164 SUIT_ViewModel* vm = it.next()->getViewModel();
3165 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3168 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3169 occVM->enableSelection( isToEnableSelection );
3174 #ifndef DISABLE_OCCVIEWER
3175 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3177 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3178 QList<SUIT_ViewManager*> lst;
3179 viewManagers( OCCViewer_Viewer::Type(), lst );
3180 QListIterator<SUIT_ViewManager*> it( lst );
3181 while ( it.hasNext() )
3183 SUIT_ViewModel* vm = it.next()->getViewModel();
3184 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3187 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3188 occVM->setClippingColor( aColor );
3193 #ifndef DISABLE_OCCVIEWER
3194 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3195 param == QString( "clipping_texture" ) ||
3196 param == QString( "clipping_modulate" ) ||
3197 param == QString( "clipping_scale" ) ) )
3199 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3200 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3201 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3202 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3203 QList<SUIT_ViewManager*> lst;
3204 viewManagers( OCCViewer_Viewer::Type(), lst );
3205 QListIterator<SUIT_ViewManager*> it( lst );
3206 while ( it.hasNext() )
3208 SUIT_ViewModel* vm = it.next()->getViewModel();
3209 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3212 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3213 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3218 #ifndef DISABLE_OCCVIEWER
3219 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3221 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3222 QList<SUIT_ViewManager*> lst;
3223 viewManagers( OCCViewer_Viewer::Type(), lst );
3224 QListIterator<SUIT_ViewManager*> it( lst );
3225 while ( it.hasNext() )
3227 SUIT_ViewModel* vm = it.next()->getViewModel();
3228 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3231 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3232 occVM->setProjectionType( mode );
3236 #if OCC_VERSION_LARGE > 0x06090000
3237 #ifndef DISABLE_OCCVIEWER
3238 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3240 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3241 QList<SUIT_ViewManager*> lst;
3242 viewManagers( OCCViewer_Viewer::Type(), lst );
3243 QListIterator<SUIT_ViewManager*> it( lst );
3244 while ( it.hasNext() )
3246 SUIT_ViewModel* vm = it.next()->getViewModel();
3247 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3250 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3251 occVM->setStereoType( mode );
3256 #ifndef DISABLE_OCCVIEWER
3257 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3259 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3260 QList<SUIT_ViewManager*> lst;
3261 viewManagers( OCCViewer_Viewer::Type(), lst );
3262 QListIterator<SUIT_ViewManager*> it( lst );
3263 while ( it.hasNext() )
3265 SUIT_ViewModel* vm = it.next()->getViewModel();
3266 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3269 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3270 occVM->setAnaglyphFilter( mode );
3275 #ifndef DISABLE_OCCVIEWER
3276 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3277 param == QString( "focus_value" ) ) )
3279 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3280 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3281 QList<SUIT_ViewManager*> lst;
3282 viewManagers( OCCViewer_Viewer::Type(), lst );
3283 QListIterator<SUIT_ViewManager*> it( lst );
3284 while ( it.hasNext() )
3286 SUIT_ViewModel* vm = it.next()->getViewModel();
3287 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3290 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3291 occVM->setStereographicFocus( aType, aValue );
3296 #ifndef DISABLE_OCCVIEWER
3297 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3298 param == QString( "iod_value" ) ) )
3300 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3301 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3302 QList<SUIT_ViewManager*> lst;
3303 viewManagers( OCCViewer_Viewer::Type(), lst );
3304 QListIterator<SUIT_ViewManager*> it( lst );
3305 while ( it.hasNext() )
3307 SUIT_ViewModel* vm = it.next()->getViewModel();
3308 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3311 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3312 occVM->setInterocularDistance( aType, aValue );
3317 #ifndef DISABLE_OCCVIEWER
3318 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3320 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3321 QList<SUIT_ViewManager*> lst;
3322 viewManagers( OCCViewer_Viewer::Type(), lst );
3323 QListIterator<SUIT_ViewManager*> it( lst );
3324 while ( it.hasNext() )
3326 SUIT_ViewModel* vm = it.next()->getViewModel();
3327 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3330 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3331 occVM->setReverseStereo( reverse );
3336 #ifndef DISABLE_OCCVIEWER
3337 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3339 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3340 QList<SUIT_ViewManager*> lst;
3341 viewManagers( OCCViewer_Viewer::Type(), lst );
3342 QListIterator<SUIT_ViewManager*> it( lst );
3343 while ( it.hasNext() )
3345 SUIT_ViewModel* vm = it.next()->getViewModel();
3346 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3349 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3350 occVM->setVSync( enable );
3355 #ifndef DISABLE_OCCVIEWER
3356 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3358 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3359 QList<SUIT_ViewManager*> lst;
3360 viewManagers( OCCViewer_Viewer::Type(), lst );
3361 QListIterator<SUIT_ViewManager*> it( lst );
3362 while ( it.hasNext() )
3364 SUIT_ViewModel* vm = it.next()->getViewModel();
3365 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3368 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3369 occVM->setQuadBufferSupport( enable );
3374 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3376 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3377 QList<SUIT_ViewManager*> lst;
3378 #ifndef DISABLE_OCCVIEWER
3379 viewManagers( OCCViewer_Viewer::Type(), lst );
3380 QListIterator<SUIT_ViewManager*> itOCC( lst );
3381 while ( itOCC.hasNext() )
3383 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3384 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3387 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3388 occVM->setZoomingStyle( mode );
3391 #ifndef DISABLE_VTKVIEWER
3392 #ifndef DISABLE_SALOMEOBJECT
3393 viewManagers( SVTK_Viewer::Type(), lst );
3394 QListIterator<SUIT_ViewManager*> itVTK( lst );
3395 while ( itVTK.hasNext() )
3397 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3398 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3401 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3402 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3408 #ifndef DISABLE_VTKVIEWER
3409 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3411 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3412 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3413 QList<SUIT_ViewManager*> lst;
3414 #ifndef DISABLE_SALOMEOBJECT
3415 viewManagers( SVTK_Viewer::Type(), lst );
3416 QListIterator<SUIT_ViewManager*> it( lst );
3417 while ( it.hasNext() )
3419 SUIT_ViewModel* vm = it.next()->getViewModel();
3420 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3423 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3424 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3430 #ifndef DISABLE_VTKVIEWER
3431 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3433 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3434 QList<SUIT_ViewManager*> lst;
3435 #ifndef DISABLE_SALOMEOBJECT
3436 viewManagers( SVTK_Viewer::Type(), lst );
3437 QListIterator<SUIT_ViewManager*> it( lst );
3438 while ( it.hasNext() )
3440 SUIT_ViewModel* vm = it.next()->getViewModel();
3441 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3444 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3445 if( vtkVM ) vtkVM->setProjectionMode( mode );
3451 #ifndef DISABLE_VTKVIEWER
3452 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3454 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3455 QList<SUIT_ViewManager*> lst;
3456 #ifndef DISABLE_SALOMEOBJECT
3457 viewManagers( SVTK_Viewer::Type(), lst );
3458 QListIterator<SUIT_ViewManager*> it( lst );
3459 while ( it.hasNext() )
3461 SUIT_ViewModel* vm = it.next()->getViewModel();
3462 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3465 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3466 if( vtkVM ) vtkVM->setStereoType( mode );
3472 #ifndef DISABLE_VTKVIEWER
3473 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3475 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3476 QList<SUIT_ViewManager*> lst;
3477 #ifndef DISABLE_SALOMEOBJECT
3478 viewManagers( SVTK_Viewer::Type(), lst );
3479 QListIterator<SUIT_ViewManager*> it( lst );
3480 while ( it.hasNext() )
3482 SUIT_ViewModel* vm = it.next()->getViewModel();
3483 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3486 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3487 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3493 #ifndef DISABLE_VTKVIEWER
3494 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3496 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3497 QList<SUIT_ViewManager*> lst;
3498 #ifndef DISABLE_SALOMEOBJECT
3499 viewManagers( SVTK_Viewer::Type(), lst );
3500 QListIterator<SUIT_ViewManager*> it( lst );
3501 while ( it.hasNext() )
3503 SUIT_ViewModel* vm = it.next()->getViewModel();
3504 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3507 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3508 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3514 #ifndef DISABLE_VTKVIEWER
3515 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3517 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3518 QList<SUIT_ViewManager*> lst;
3519 #ifndef DISABLE_SALOMEOBJECT
3520 viewManagers( SVTK_Viewer::Type(), lst );
3521 QListIterator<SUIT_ViewManager*> it( lst );
3522 while ( it.hasNext() )
3524 SUIT_ViewModel* vm = it.next()->getViewModel();
3525 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3528 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3529 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3535 #ifndef DISABLE_VTKVIEWER
3536 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3538 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3539 QList<SUIT_ViewManager*> lst;
3540 #ifndef DISABLE_SALOMEOBJECT
3541 viewManagers( SVTK_Viewer::Type(), lst );
3542 QListIterator<SUIT_ViewManager*> it( lst );
3543 while ( it.hasNext() )
3545 SUIT_ViewModel* vm = it.next()->getViewModel();
3546 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3549 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3550 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3556 #ifndef DISABLE_VTKVIEWER
3557 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3558 param == QString( "spacemouse_func2_btn" ) ||
3559 param == QString( "spacemouse_func5_btn" ) ) )
3561 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3562 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3563 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3564 QList<SUIT_ViewManager*> lst;
3565 #ifndef DISABLE_SALOMEOBJECT
3566 viewManagers( SVTK_Viewer::Type(), lst );
3567 QListIterator<SUIT_ViewManager*> it( lst );
3568 while ( it.hasNext() )
3570 SUIT_ViewModel* vm = it.next()->getViewModel();
3571 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3574 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3575 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3580 if( sec=="ObjectBrowser" )
3582 SUIT_DataBrowser* ob = objectBrowser();
3586 if ( param=="auto_size_first" )
3588 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3589 ob->setAutoSizeFirstColumn( autoSizeFirst );
3590 if ( autoSizeFirst )
3591 ob->adjustFirstColumnWidth();
3593 else if ( param=="auto_size" ) {
3594 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3595 ob->setAutoSizeColumns(autoSize);
3597 ob->adjustColumnsWidth();
3599 else if ( param=="resize_on_expand_item" ) {
3600 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3601 ob->setResizeOnExpandItem(resizeOnExpandItem);
3603 else if ( param == "auto_hide_search_tool" ) {
3604 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3610 if( param=="auto_save_interval" ) {
3611 myAutoSaveTimer->stop();
3612 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3613 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3617 #ifndef DISABLE_PYCONSOLE
3618 if( sec=="PyConsole" && pythonConsole() )
3620 if ( param=="font" ) {
3621 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3623 else if ( param=="show_banner" ) {
3624 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3626 else if ( param=="auto_completion" ) {
3627 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3634 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3636 if ( param == "visible_count" )
3637 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3638 else if ( param == "max_count" )
3639 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3640 else if ( param == "insert_mode" )
3641 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3642 else if ( param == "link_type" )
3643 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3644 else if ( param == "show_clear" )
3645 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3646 else if ( param == "show_mru" )
3647 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3650 if ( sec == "language" && param == "language" )
3652 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3653 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3655 if ( sec == "language" && param == "locale")
3657 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3658 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3660 if ( sec == "desktop" && param == "opaque_resize" ) {
3661 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3662 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3663 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3664 else dopts &= ~QMainWindow::AnimatedDocks;
3665 desktop()->setDockOptions( dopts );
3666 desktop()->setOpaqueResize( opaqueResize );
3667 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3668 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3671 #ifndef DISABLE_PLOT2DVIEWER
3672 QList<SUIT_ViewManager*> lst;
3673 viewManagers( Plot2d_Viewer::Type(), lst );
3674 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3675 while ( itPlot2d.hasNext() ) {
3676 SUIT_ViewManager* viewMgr = itPlot2d.next();
3677 SUIT_ViewModel* vm = viewMgr->getViewModel();
3678 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3681 Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3683 viewMgr->setViewModel( vm );
3684 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3686 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3687 frame->SetPreference();
3696 void LightApp_Application::loadPreferences()
3698 CAM_Application::loadPreferences();
3700 SUIT_ResourceMgr* aResMgr = resourceMgr();
3705 static bool mru_load = true;
3708 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3710 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3711 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3712 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3713 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3714 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3715 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3716 mru->loadLinks( aResMgr, "MRU" );
3722 QStringList mods = aResMgr->parameters( "windows_visibility" );
3723 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3726 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3727 myWinVis.insert( *itr, arr );
3731 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3732 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3733 QMainWindow::DockOptions dopts = desktop()->dockOptions();
3734 if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3735 else dopts &= ~QMainWindow::AnimatedDocks;
3736 desktop()->setDockOptions( dopts );
3737 desktop()->setOpaqueResize( opaqueResize );
3738 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3739 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3746 void LightApp_Application::savePreferences()
3748 CAM_Application::savePreferences();
3750 saveDockWindowsState();
3752 SUIT_ResourceMgr* aResMgr = resourceMgr();
3757 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3759 mru->saveLinks( aResMgr, "MRU" );
3761 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3762 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3765 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3767 #if GUI_DEVELOPMENT > 0
3768 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3770 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3777 Updates desktop title
3779 void LightApp_Application::updateDesktopTitle()
3781 QString aTitle = applicationName();
3782 QString aVer = applicationVersion();
3783 if ( !aVer.isEmpty() )
3784 aTitle += QString( " " ) + aVer;
3786 if ( activeStudy() ) {
3787 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3788 aTitle += QString( " - [%1]" ).arg( sName );
3791 desktop()->setWindowTitle( aTitle );
3795 \brief Get map of the operations which can be performed
3796 on the module activation.
3798 The method should return the map of the kind \c {<id>:<name>}
3799 where \c <id> is an integer identifier of the operation and
3800 \c <name> is a title for the button to be added to the
3801 dialog box. After user selects the required operation by the
3802 clicking the corresponding button in the dialog box, its identifier
3803 is passed to the moduleActionSelected() method to process
3806 \return map of the operations
3807 \sa moduleActionSelected()
3809 QMap<int, QString> LightApp_Application::activateModuleActions() const
3811 QMap<int, QString> opmap;
3812 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3813 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3818 \brief Called when the used selectes required operation chosen
3819 from "Activate module" dialog box.
3821 Performs the required operation according to the user choice.
3823 \param id operation identifier
3824 \sa activateModuleActions()
3826 void LightApp_Application::moduleActionSelected( const int id )
3841 Updates windows after close document
3843 void LightApp_Application::afterCloseDoc()
3847 CAM_Application::afterCloseDoc();
3851 Updates actions of active module
3853 void LightApp_Application::updateModuleActions()
3856 if ( activeModule() ) {
3857 modName = activeModule()->moduleName();
3858 if ( !isModuleAccessible( modName ) ) {
3859 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3860 foreach( SUIT_Application* app, apps ) {
3861 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3862 if ( lapp && lapp != this )
3863 lapp->removeModuleAction( modName );
3868 LightApp_ModuleAction* moduleAction =
3869 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3871 moduleAction->setActiveModule( modName );
3874 void LightApp_Application::removeModuleAction( const QString& modName )
3876 LightApp_ModuleAction* moduleAction =
3877 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3879 moduleAction->removeModule( modName );
3883 Gets current windows.
3884 \param winMap - output current windows map.
3886 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3889 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3890 ((LightApp_Module*)activeModule())->windows( winMap );
3892 defaultWindows( winMap );
3896 Gets current view managers.
3897 \param lst - output current view managers list.
3899 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3902 if ( !activeStudy() )
3905 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3906 ((LightApp_Module*)activeModule())->viewManagers( lst );
3908 defaultViewManagers( lst );
3914 void LightApp_Application::updateWindows()
3916 QMap<int, int> winMap;
3917 currentWindows( winMap );
3919 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
3921 if ( !dockWindow( it.key() ) )
3922 getWindow( it.key() );
3925 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
3927 QWidget* wid = it.value();
3928 if ( winMap.contains( it.key() ) )
3929 wid->setVisible( true );
3934 loadDockWindowsState();
3938 Updates view managers
3940 void LightApp_Application::updateViewManagers()
3943 currentViewManagers( lst );
3945 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
3946 getViewManager( *it, true );
3950 Loads windows geometry
3952 void LightApp_Application::loadDockWindowsState()
3956 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
3957 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
3958 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
3961 if ( activeModule() )
3962 modName = activeModule()->name();
3963 else if ( activeStudy() )
3964 modName = "nomodule";
3966 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
3967 QByteArray aDefaultState;
3968 aResMgr->value( "windows_geometry", modName, aDefaultState );
3969 QByteArray aDefaultVisibility;
3970 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
3971 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
3972 aResMgr->setWorkingMode( prevMode );
3974 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
3977 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
3978 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
3980 if ( version > Qtx::versionToId( "7.4.1" ) )
3981 aResMgr->value( "windows_geometry", modName , arr );
3983 arr = aDefaultState;
3984 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
3985 desktop()->restoreState( aTargetArray );
3988 QStringList mainToolbarsNames;
3989 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
3990 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
3991 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
3993 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
3996 QMap<QString, bool> *tbMap = 0;
3997 QMap<QString, bool> *dwMap = 0;
3999 QMap<QString, bool> userTbMap, userDwMap;
4000 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4002 QMap<QString, bool> defaultTbMap, defaultDwMap;
4003 if(hasDefaultVisibility) {
4004 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4010 if(hasDefaultVisibility){
4011 tbMap = &defaultTbMap;
4018 if(hasDefaultVisibility){
4019 dwMap = &defaultDwMap;
4024 QList<QToolBar*> tbList = findToolBars();
4025 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4027 QToolBar* tb = *tit;
4028 if ( tbMap->contains( tb->objectName() ) ) {
4029 tb->setVisible( (*tbMap)[tb->objectName()] );
4035 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4036 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4038 QDockWidget* dw = *dit;
4040 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4041 if ( po != desktop() )
4044 if ( dwMap->contains( dw->objectName() ) )
4045 dw->setVisible( (*dwMap)[dw->objectName()] );
4053 Saves windows geometry
4055 void LightApp_Application::saveDockWindowsState()
4060 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4061 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4063 if( !storeWin && !storeTb )
4067 if ( activeModule() )
4068 modName = activeModule()->name();
4069 else if ( activeStudy() )
4070 modName = "nomodule";
4072 QString versionId = GUI_VERSION_STR;
4073 #if GUI_DEVELOPMENT > 0
4077 QByteArray arr = desktop()->saveState();
4078 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4079 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4082 if ( myWinVis.contains( modName ) )
4083 visArr = myWinVis[modName];
4085 QMap<QString, bool> tbMap, dwMap;
4086 dockWindowsState( visArr, tbMap, dwMap );
4088 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4089 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4092 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4095 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4096 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4098 QDockWidget* wid = *it;
4099 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4102 visArr = dockWindowsState( tbMap, dwMap );
4104 myWinVis.insert( modName, visArr );
4107 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4110 QDataStream stream( &visArr, QIODevice::WriteOnly );
4112 stream << (uchar)ToolBarMarker;
4113 stream << tb.size();
4114 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4116 stream << tit.key();
4117 stream << (uchar)( tit.value() ? 1 : 0 );
4120 stream << (uchar)DockWidgetMarker;
4121 stream << dw.size();
4122 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4124 stream << wit.key();
4125 stream << (uchar)( wit.value() ? 1 : 0 );
4131 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4136 QByteArray visArr = arr;
4137 QDataStream stream( &visArr, QIODevice::ReadOnly );
4141 if ( marker != ToolBarMarker )
4146 for ( int i = 0; i < lines; ++i )
4149 stream >> objectName;
4152 tb.insert( objectName, shown );
4156 if ( marker != DockWidgetMarker )
4160 for ( int j = 0; j < lines; ++j )
4163 stream >> objectName;
4166 dw.insert( objectName, shown );
4171 Adds icon names for modules
4173 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4177 SUIT_ResourceMgr* resMgr = resourceMgr();
4181 QStringList modList;
4182 modules( modList, false );
4184 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4186 QString modName = *it;
4187 QString modIntr = moduleName( modName );
4188 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4190 if ( modIcon.isEmpty() )
4193 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4194 modIcon += QString( ".png" );
4196 iconMap.insert( modName, modIcon );
4201 Inserts items in popup, which necessary for current application
4203 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4206 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4207 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4208 selMgr->setSelectionCacheEnabled( true );
4210 SUIT_DataBrowser* ob = objectBrowser();
4212 CAM_Application::contextMenuPopup( type, thePopup, title );
4214 if ( ob && type == ob->popupClientType() ) {
4215 thePopup->addSeparator();
4216 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4217 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4218 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4221 #ifndef DISABLE_SALOMEOBJECT
4222 if ( selMgr && ob ) {
4223 SALOME_ListIO selected;
4224 selMgr->selectedObjects( selected );
4225 if(selected.Extent() == 1){
4226 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4227 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4228 if(obj && obj->renameAllowed()) {
4229 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4230 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4231 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4232 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4234 QList<QAction*> acts = thePopup->actions();
4235 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4236 thePopup->insertAction(firstAction,a);
4242 selMgr->setSelectionCacheEnabled( cacheIsOn );
4248 void LightApp_Application::createEmptyStudy()
4250 CAM_Application::createEmptyStudy();
4252 if ( objectBrowser() )
4253 objectBrowser()->updateTree();
4255 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4256 if ( aResMgr && activeStudy() ) {
4257 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4258 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4263 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4265 CAM_Application::setDesktop( desk );
4268 connect( desk, SIGNAL( message( const QString& ) ),
4269 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4270 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4271 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4272 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4273 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4279 \param mod - module to be activated
4281 bool LightApp_Application::activateModule( CAM_Module* mod )
4283 bool res = CAM_Application::activateModule( mod );
4285 if ( objectBrowser() )
4286 objectBrowser()->updateTree();
4292 \return keyborad accelerators manager object
4294 SUIT_Accel* LightApp_Application::accel() const
4300 Removes dead widget container from map
4302 void LightApp_Application::onWCDestroyed( QObject* ob )
4304 // remove destroyed widget container from windows map
4305 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4307 if ( itr.value() != ob )
4310 int key = itr.key();
4311 myWin.remove( key );
4316 void LightApp_Application::onMRUActivated( const QString& name )
4318 SUIT_Session* s = SUIT_Session::session();
4319 if ( s && s->activeApplication() == this )
4323 void LightApp_Application::onStylePreferences()
4325 #ifdef USE_SALOME_STYLE
4326 Style_PrefDlg dlg( desktop() );
4329 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4330 #endif // USE_SALOME_STYLE
4333 void LightApp_Application::onFullScreen(){
4334 if(myScreenHelper) {
4335 if(desktop()->isFullScreen())
4336 myScreenHelper->switchToNormalScreen();
4338 myScreenHelper->switchToFullScreen();
4343 Connects just added view manager
4345 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4347 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4348 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4349 CAM_Application::addViewManager( vm );
4353 Remove view manager from memory
4355 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4357 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4358 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4359 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4361 aStudy->removeObjectProperties( vm->getGlobalId() );
4363 CAM_Application::removeViewManager( vm );
4365 LightApp_SelectionMgr* selMgr = selectionMgr();
4366 QList<SUIT_Selector*> selectors;
4367 selMgr->selectors( selectors );
4368 foreach( SUIT_Selector* selector, selectors ) {
4369 if ( selector->owner() == vm->getViewModel() ) {
4374 // IPAL22894: Crash on closing OCC view
4380 Renames active window of desktop
4382 void LightApp_Application::onRenameWindow()
4387 QWidget* w = desktop()->activeWindow();
4392 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4393 if( ok && !name.isEmpty() )
4394 w->setWindowTitle( name );
4398 Closes active window of desktop
4400 void LightApp_Application::onCloseWindow()
4405 QWidget* w = desktop()->activeWindow();
4413 Closes all windows of desktop
4415 void LightApp_Application::onCloseAllWindow()
4417 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4421 QList<SUIT_ViewWindow*> wndList = desk->windows();
4422 SUIT_ViewWindow* wnd;
4423 foreach( wnd, wndList )
4431 Groups all windows of desktop
4433 void LightApp_Application::onGroupAllWindow()
4435 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4439 QtxWorkstack* wgStack = desk->workstack();
4445 \return if the library of module exists
4446 \param moduleTitle - title of module
4448 bool LightApp_Application::isLibExists( const QString& moduleTitle ) const
4450 if( moduleTitle.isEmpty() )
4453 QString lib = moduleLibrary( moduleTitle );
4455 //abd: changed libSalomePyQtGUI to SalomePyQtGUI for WIN32
4456 bool isPythonModule = lib.contains("SalomePyQtGUI");
4457 bool isPythonLightModule = lib.contains("SalomePyQtGUILight");
4461 paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4463 paths = QString(::getenv( "LD_LIBRARY_PATH" )).split( ":", QString::SkipEmptyParts );
4466 bool isLibFound = false;
4467 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4468 for( ; anIt!=aLast; anIt++ )
4470 QFileInfo inf( Qtx::addSlash( *anIt ) + lib );
4481 INFOS( "\n****************************************************************" << std::endl
4482 << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl
4483 << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl
4484 << "****************************************************************" << std::endl );
4486 else if ( !isPythonModule && !isPythonLightModule)
4489 if ( isPythonModule || isPythonLightModule)
4491 QString pylib = moduleName( moduleTitle ) + QString(".py");
4492 QString pylibgui = moduleName( moduleTitle ) + QString("GUI.py");
4494 // Check the python library
4496 // paths = QString(::getenv( "PATH" )).split( ";", QString::SkipEmptyParts );
4498 paths = QString(::getenv( "PYTHONPATH" )).split( ":", QString::SkipEmptyParts );
4500 bool isPyLib = false, isPyGuiLib = false;
4501 QStringList::const_iterator anIt = paths.begin(), aLast = paths.end();
4502 for( ; anIt!=aLast; anIt++ )
4504 QFileInfo inf( Qtx::addSlash( *anIt ) + pylib );
4505 QFileInfo infgui( Qtx::addSlash( *anIt ) + pylibgui );
4507 if(!isPythonLightModule)
4508 if( !isPyLib && inf.exists() )
4511 if( !isPyGuiLib && infgui.exists() )
4514 if ((isPyLib || isPythonLightModule ) && isPyGuiLib && isLibFound)
4518 printf( "\n****************************************************************\n" );
4519 printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() );
4521 printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() );
4523 printf( "* No module named %s\n", (moduleName( moduleTitle ) + QString("GUI")).toLatin1().constData() );
4524 printf( "****************************************************************\n" );
4531 \return default name for an active study
4533 void LightApp_Application::setDefaultStudyName( const QString& theName )
4535 QStringList anInfoList;
4536 modules( anInfoList, false );
4538 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4539 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4540 !aStudy->isSaved() )
4542 aStudy->setStudyName( theName );
4543 updateDesktopTitle();
4548 Custom event handler
4550 bool LightApp_Application::event( QEvent* e )
4552 if( e && e->type()==2000 )
4554 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4555 QString* d = ( QString* )ce->data();
4556 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4558 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4559 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4560 showPreferences( tr( "PREF_APP" ) );
4565 return CAM_Application::event( e );
4568 /*! Check data object */
4569 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4573 bool isSuitable = !theObj->entry().isEmpty() &&
4574 !theObj->componentDataType().isEmpty() &&
4575 !theObj->name().isEmpty();
4582 int LightApp_Application::openChoice( const QString& aName )
4584 int choice = CAM_Application::openChoice( aName );
4586 if ( choice == OpenExist ) // The document is already open.
4588 // Do you want to reload it?
4589 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4590 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4591 choice = OpenReload;
4597 bool LightApp_Application::openAction( const int choice, const QString& aName )
4604 STD_Application* app = 0;
4605 SUIT_Session* session = SUIT_Session::session();
4606 QList<SUIT_Application*> appList = session->applications();
4607 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4609 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4610 app = ::qobject_cast<STD_Application*>( *it );
4615 app->onCloseDoc( false );
4616 appList = session->applications();
4617 STD_Application* other = 0;
4618 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4619 other = ::qobject_cast<STD_Application*>( *it );
4622 res = other->onOpenDoc( aName );
4627 res = CAM_Application::openAction( choice, aName );
4634 QStringList LightApp_Application::viewManagersTypes() const
4636 QStringList aTypesList;
4637 aTypesList += myUserWmTypes;
4638 #ifndef DISABLE_GLVIEWER
4639 aTypesList<<GLViewer_Viewer::Type();
4641 #ifndef DISABLE_PLOT2DVIEWER
4642 aTypesList<<Plot2d_Viewer::Type();
4644 #ifndef DISABLE_QXGRAPHVIEWER
4645 aTypesList<<QxScene_Viewer::Type();
4647 #ifndef DISABLE_PVVIEWER
4648 aTypesList<<PVViewer_Viewer::Type();
4650 #ifndef DISABLE_PYVIEWER
4651 aTypesList<<PyViewer_Viewer::Type();
4653 #ifndef DISABLE_OCCVIEWER
4654 aTypesList<<OCCViewer_Viewer::Type();
4656 #ifndef DISABLE_VTKVIEWER
4657 #ifndef DISABLE_SALOMEOBJECT
4658 aTypesList<<SVTK_Viewer::Type();
4660 aTypesList<<VTKViewer_Viewer::Type();
4666 * Removes all view managers of known types
4667 * Other view managers are ignored
4669 void LightApp_Application::clearKnownViewManagers()
4671 QStringList aTypesList = viewManagersTypes();
4672 QList<SUIT_ViewManager*> aMgrList;
4673 viewManagers( aMgrList );
4674 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4675 if (aTypesList.contains(aMgr->getType()))
4676 removeViewManager(aMgr);
4681 Copy of current selection
4683 void LightApp_Application::onCopy()
4685 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4691 Paste of current data in clipboard
4693 void LightApp_Application::onPaste()
4695 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4701 Browse (i.e. set focus on) the published objects
4702 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4703 has been accepted by Ok (or Apply & Close) button
4704 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4705 (to select the first published object only)
4706 \return entry of the selected object
4708 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4709 const bool theIsApplyAndClose,
4710 const bool theIsOptimizedBrowsing )
4713 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4715 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4716 switch( aBrowsePolicy )
4720 case BP_ApplyAndClose:
4721 if( !theIsApplyAndClose )
4729 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4733 SUIT_DataBrowser* anOB = objectBrowser();
4737 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4741 QStringListIterator anIter( theEntryList );
4742 if( theIsOptimizedBrowsing )
4744 // go to the last entry
4746 if( anIter.hasPrevious() )
4750 // scroll to each entry in the list
4751 // (in optimized mode - to the last entry only)
4753 LightApp_DataObject* anObject = 0;
4754 while( anIter.hasNext() )
4756 anEntry = anIter.next();
4757 if( !anEntry.isEmpty() )
4759 anObject = aStudy->findObjectByEntry( anEntry );
4762 QModelIndex anIndex = aModel->index( anObject );
4763 anOB->treeView()->scrollTo( anIndex );
4768 // always select the last object
4769 if( anObject && !anEntry.isEmpty() )
4771 QList<SUIT_Selector*> aSelectorList;
4772 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4773 if( !aSelectorList.isEmpty() )
4775 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4777 bool anIsAutoBlock = aSelector->autoBlock();
4779 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4780 aSelector->setAutoBlock( false );
4782 SUIT_DataOwnerPtrList aList;
4783 #ifndef DISABLE_SALOMEOBJECT
4784 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4785 ( anObject->entry().toLatin1().constData(),
4786 anObject->componentDataType().toLatin1().constData(),
4787 anObject->name().toLatin1().constData() );
4788 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4790 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4793 aList.append( owner );
4794 selectionMgr()->setSelected( aList );
4797 // restore auto block flag
4798 aSelector->setAutoBlock( anIsAutoBlock );
4806 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4808 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4809 return study ? study->findObjectByEntry( id ) : 0;
4813 Checks that an object can be renamed.
4814 \param entry entry of the object
4815 \brief Return \c true if object can be renamed
4817 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4822 Rename object by entry.
4823 \param entry entry of the object
4824 \param name new name of the object
4825 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4827 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4831 /*! Process standard messages from desktop */
4832 void LightApp_Application::onDesktopMessage( const QString& message )
4834 const QString sectionSeparator = "/";
4836 if ( message.toLower() == "updateobjectbrowser" ||
4837 message.toLower() == "updateobjbrowser" ) {
4838 // update object browser
4839 updateObjectBrowser();
4841 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4842 QString vtype = message.split( sectionSeparator ).last();
4843 if ( !vtype.isEmpty() )
4844 getViewManager( vtype, true );
4847 QStringList data = message.split( sectionSeparator );
4848 if ( data.count() > 1 ) {
4849 QString msgType = data[0].trimmed();
4850 LightApp_Module* sMod = 0;
4851 CAM_Module* mod = module( msgType );
4853 mod = module( moduleTitle( msgType ) );
4854 if ( mod && mod->inherits( "LightApp_Module" ) )
4855 sMod = (LightApp_Module*)mod;
4857 if ( msgType.toLower() == "preferences" ) {
4858 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4859 // for example "preferences/Study/multi_file_dump/true"
4860 if ( data.count() > 3 ) {
4861 QString section = data[1].trimmed();
4862 QString param = data[2].trimmed();
4863 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4864 resourceMgr()->setValue( section, param, value );
4868 // received message for the module
4869 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4870 sMod->message( msg );
4878 Returns all top level toolbars.
4879 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4881 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4883 QList<QToolBar*> aResult;
4884 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4885 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4886 QToolBar* tb = *tit;
4887 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4888 if ( po != desktop() )
4890 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4897 Internal method to parse toolbars and dockable windows state.
4899 QByteArray LightApp_Application::processState(QByteArray& input,
4900 const bool processWin,
4901 const bool processTb,
4902 const bool isRestoring,
4903 QByteArray defaultState) {
4906 bool hasDefaultState = !defaultState.isEmpty();
4907 bool isDockWinWriten = false;
4909 //Write date from users settings
4911 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4912 int marker, version;
4914 tmpInputData >> marker;
4915 tmpInputData >> version;
4916 tmpInputData >> dockmarker;
4917 tmpInputData >> nbDocWin;
4919 if(processWin && processTb && !isRestoring) {
4921 } else if(!processWin && !processTb ) {
4923 aRes = defaultState;
4925 QDataStream aData(&aRes, QIODevice::WriteOnly);
4926 QList<QToolBar*> aToolBars = findToolBars();
4929 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4930 QToolBar* tb = *tit;
4931 aNames.append(tb->objectName());
4934 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4935 if(toolBarMarkerIndex < 0)
4937 QDataStream anInputData(&input, QIODevice::ReadOnly);
4939 int toolBarMarkerIndexDef;
4940 if(hasDefaultState) {
4941 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4942 if(toolBarMarkerIndexDef < 0)
4945 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4947 QDataStream* aTargetData = 0;
4948 int aTargetIndex = -1;
4950 QByteArray currentArr = desktop()->saveState();
4951 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4952 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4953 if(processWin && useInputData) {
4954 aTargetData = &anInputData;
4955 aTargetIndex = toolBarMarkerIndex;
4957 //Write date from default settings
4958 if(hasDefaultState) {
4959 aTargetData = &anInputDataDef;
4960 aTargetIndex = toolBarMarkerIndexDef;
4962 //If no default state, write current snapshot of the dockable windows
4964 aTargetData = &anInputDataCur;
4965 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4966 aTargetIndex = toolBarMarkerIndexCur;
4971 if(aTargetData && aTargetIndex >= 0 ) {
4972 aTargetData->device()->seek(0);
4973 while( aTargetData->device()->pos() < aTargetIndex ) {
4978 isDockWinWriten = true;
4985 aTargetData = &anInputData;
4986 aTargetIndex = toolBarMarkerIndex;
4988 if(hasDefaultState) {
4989 aTargetData = &anInputDataDef;
4990 aTargetIndex = toolBarMarkerIndexDef;
4994 if(aTargetData && aTargetIndex >= 0) {
4996 if(!isDockWinWriten ) {
4997 //Write version marker
4998 int marker, version;
4999 aTargetData->device()->seek(0);
5000 *aTargetData >> marker;
5001 *aTargetData >> version;
5004 aData << (uchar) QDockWidgetMarker;
5006 int shift = 4*sizeof(int) + sizeof(QSize);
5007 index = aTargetIndex - shift;
5009 index = aTargetIndex;
5012 aTargetData->device()->seek(index);
5013 while(!aTargetData->atEnd()) {
5018 } else { // Not treat toolbars
5019 aData << (uchar) QToolBarMarker;
5020 aData << (int) 0; //Nb toolbars = 0
5027 \brief Emits operationFinished signal.
5028 \param theModuleName the name of the module which perfomed the operation
5029 \param theOperationName the operation name
5030 \param theEntryList the list of the created objects entries
5032 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5033 const QString& theOperationName,
5034 const QStringList& theEntryList )
5036 emit operationFinished( theModuleName, theOperationName, theEntryList );
5040 Update visibility state of given objects
5042 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5043 SUIT_ViewModel* theViewModel )
5045 if ( !theViewModel || theList.isEmpty() ) return;
5047 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5048 if ( !aStudy ) return;
5050 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5052 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5053 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5055 if ( !obj || aStudy->isComponent( obj->entry() ) )
5058 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5059 if ( anObjModule ) {
5060 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5062 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5063 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5064 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5065 anObjState = Qtx::ShownState;
5067 anObjState = Qtx::HiddenState;
5069 aStudy->setVisibilityState( obj->entry(), anObjState );
5076 * Called when window activated
5078 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5080 SUIT_DataBrowser* anOB = objectBrowser();
5083 SUIT_DataObject* rootObj = anOB->root();
5087 DataObjectList listObj = rootObj->children( true );
5089 SUIT_ViewModel* vmod = 0;
5090 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5091 vmod = vman->getViewModel();
5092 updateVisibilityState( listObj, vmod );
5096 Called then view manager removed
5098 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5100 ViewManagerList lst;
5101 viewManagers( lst );
5102 if ( lst.count() == 1) { // in case if closed last view window
5103 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5105 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5110 Check existing document.
5112 bool LightApp_Application::checkExistingDoc()
5115 if( activeStudy() ) {
5116 int answer = SUIT_MessageBox::question( desktop(),
5117 tr( "APPCLOSE_CAPTION" ),
5118 tr( "STUDYCLOSE_DESCRIPTION" ),
5119 tr( "APPCLOSE_SAVE" ),
5120 tr( "APPCLOSE_CLOSE" ),
5121 tr( "APPCLOSE_CANCEL" ), 0 );
5123 if ( activeStudy()->isSaved() ) {
5126 } else if ( onSaveAsDoc() ) {
5127 if( !closeDoc( false ) ) {
5134 else if( answer == 1 ) {
5136 } else if( answer == 2 ) {
5143 #ifndef DISABLE_PYCONSOLE
5145 PyConsole_Interp* LightApp_Application::getPyInterp()
5147 static PyConsole_Interp* myInterp = 0;
5149 myInterp = createPyInterp();
5150 myInterp->initialize();
5155 PyConsole_Interp* LightApp_Application::createPyInterp()
5157 return new PyConsole_Interp();
5160 #endif // DISABLE_PYCONSOLE