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