1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File: LightApp_Application.cxx
24 // Created: 6/20/2005 18:39:45 PM
25 // Author: Natalia Donis
28 // E.A. : On windows with python 2.6, there is a conflict
29 // E.A. : between pymath.h and Standard_math.h which define
30 // E.A. : some same symbols : acosh, asinh, ...
31 #include <Standard_math.hxx>
32 #ifndef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "LightApp_PyEditor.h"
39 #include "PyConsole_Interp.h"
40 #include "PyConsole_Console.h"
43 #include "LightApp_Application.h"
44 #include "LightApp_Module.h"
45 #include "LightApp_DataModel.h"
46 #include "LightApp_DataOwner.h"
47 #include "LightApp_Displayer.h"
48 #include "LightApp_Study.h"
49 #include "LightApp_Preferences.h"
50 #include "LightApp_PreferencesDlg.h"
51 #include "LightApp_ModuleDlg.h"
52 #include "LightApp_AboutDlg.h"
53 #include "LightApp_ModuleAction.h"
54 // temporary commented
55 #include "LightApp_EventFilter.h"
56 #include "LightApp_OBSelector.h"
57 #include "LightApp_SelectionMgr.h"
58 #include "LightApp_DataObject.h"
59 #include "LightApp_WgViewModel.h"
60 #include "LightApp_FullScreenHelper.h"
62 #include <GUI_version.h>
64 #include <SALOME_Event.h>
66 #ifdef USE_SALOME_STYLE
67 #include <Style_Salome.h>
68 #include <Style_PrefDlg.h>
69 #endif // USE_SALOME_STYLE
71 #include <CAM_Module.h>
72 #include <CAM_DataModel.h>
73 #include <CAM_Study.h>
74 #include <STD_TabDesktop.h>
76 #include <SUIT_DataBrowser.h>
77 #include <SUIT_Session.h>
78 #include <SUIT_Study.h>
79 #include <SUIT_FileDlg.h>
80 #include <SUIT_ResourceMgr.h>
81 #include <SUIT_ShortcutMgr.h>
82 #include <SUIT_Tools.h>
83 #include <SUIT_Accel.h>
84 #include <SUIT_MessageBox.h>
85 #include <SUIT_ViewWindow.h>
88 #include <QtxFontEdit.h>
89 #include <QtxToolBar.h>
90 #include <QtxTreeView.h>
91 #include <QtxMRUAction.h>
92 #include <QtxDockAction.h>
93 #include <QtxDockWidget.h>
94 #include <QtxActionToolMgr.h>
95 #include <QtxSearchTool.h>
96 #include <QtxWorkstack.h>
99 #include <LogWindow.h>
101 #ifndef DISABLE_GLVIEWER
102 #include <GLViewer_Viewer.h>
103 #include <GLViewer_ViewManager.h>
104 #include "LightApp_GLSelector.h"
107 #ifndef DISABLE_PLOT2DVIEWER
108 #include <Plot2d_ViewManager.h>
109 #include <Plot2d_ViewModel.h>
110 #include <Plot2d_ViewWindow.h>
111 #include <Plot2d_ViewFrame.h>
112 #include "LightApp_Plot2dSelector.h"
113 #ifndef DISABLE_SALOMEOBJECT
114 #include <SPlot2d_ViewModel.h>
116 #include <Plot2d_ViewModel.h>
120 #ifndef DISABLE_OCCVIEWER
121 #include <OCCViewer_ViewManager.h>
122 #include <OCCViewer_ViewFrame.h>
123 #include <OCCViewer_ViewPort3d.h>
124 #ifndef DISABLE_SALOMEOBJECT
125 #include <SOCC_ViewModel.h>
127 #include <OCCViewer_ViewModel.h>
129 #include "LightApp_OCCSelector.h"
132 #ifndef DISABLE_VTKVIEWER
133 #ifndef DISABLE_SALOMEOBJECT
134 #include <SVTK_ViewModel.h>
135 #include <SVTK_ViewManager.h>
136 #include "LightApp_VTKSelector.h"
138 #include <VTKViewer_ViewModel.h>
139 #include <VTKViewer_ViewManager.h>
141 #include <VTKViewer_ViewModel.h>
144 #ifndef DISABLE_QXGRAPHVIEWER
145 #include <QxScene_ViewManager.h>
146 #include <QxScene_ViewModel.h>
147 #include <QxScene_ViewWindow.h>
150 #ifndef DISABLE_GRAPHICSVIEW
151 #include "GraphicsView_Viewer.h"
152 #include "GraphicsView_ViewManager.h"
153 #include "LightApp_GVSelector.h"
156 #ifndef DISABLE_PVVIEWER
157 #include "PVViewer_ViewManager.h"
158 #include "PVViewer_ViewWindow.h"
159 #include "PVViewer_ViewModel.h"
162 #ifndef DISABLE_PYVIEWER
163 #include <PyViewer_ViewManager.h>
164 #include <PyViewer_ViewModel.h>
165 #include <PyViewer_ViewWindow.h>
169 #define VISIBILITY_COLUMN_WIDTH 25
175 #include <QStringList>
177 #include <QApplication>
179 #include <QStatusBar>
181 #include <QObjectList>
183 #include <QInputDialog>
184 #include <QFontDatabase>
186 #include <QByteArray>
190 #include <QHeaderView>
195 #include <utilities.h>
197 #define FIRST_HELP_ID 1000000
199 #ifndef DISABLE_SALOMEOBJECT
200 #include <SALOME_InteractiveObject.hxx>
201 #include <SALOME_ListIO.hxx>
204 #include <Standard_Version.hxx>
206 #define ToolBarMarker 0
207 #define DockWidgetMarker 1
209 static const char* imageEmptyIcon[] = {
212 "....................",
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "....................",
231 "...................."};
233 int LightApp_Application::lastStudyId = 0;
235 // Markers used to parse array with dockable windows and toolbars state.
236 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
237 // in the Qt source code.
239 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
240 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
242 // Format of the Byte array with the windows and toolbar state is:
243 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
245 //Find toolbar marker position in the array in the following way:
246 //since the 'toolbar marker' is not unique, find index of first occurrence of the
247 //'toolbar marker' in the array and check that next string is name of the toolbar
251 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
252 int aResult = -1,tmp = 0;
253 int inputLen = input.length();
254 QDataStream anInputData( &input, QIODevice::ReadOnly );
255 while ( tmp < inputLen ) {
256 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
259 anInputData.device()->seek( tmp );
263 anInputData >> lines;
265 if ( lines == 0 && anInputData.atEnd() ) {
266 //Case then array doesn't contain information about toolbars,
277 if ( aFlags.contains( str ) ) {
285 QString langToName( const QString& lang )
287 // special processing for English language to avoid such result as "American English"
288 // as Qt cannot just say "English"
293 result = QLocale( lang ).nativeLanguageName();
299 \return last global id of study
301 int LightApp_Application::studyId()
303 return LightApp_Application::lastStudyId;
306 /*!Create new instance of LightApp_Application.*/
307 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
309 return new LightApp_Application();
312 /*! \var global preferences of LightApp */
313 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
317 \class LightApp_Application
318 Application containing LightApp module
322 LightApp_Application::LightApp_Application()
323 : CAM_Application( false ),
325 myScreenHelper(new LightApp_FullScreenHelper())
327 Q_INIT_RESOURCE( LightApp );
329 STD_TabDesktop* desk = new STD_TabDesktop();
330 desk->setFullScreenAllowed(false);
331 desk->setMinimizeAllowed(false);
335 // initialize auto save timer
336 myAutoSaveTimer = new QTimer( this );
337 myAutoSaveTimer->setSingleShot( true );
338 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
340 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
342 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
343 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
345 desktop()->setWindowIcon( aLogo );
346 desktop()->setDockableMenuBar( false );
347 desktop()->setDockableStatusBar( false );
349 // base logo (salome itself)
350 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
351 // extra logo (salome-based application)
352 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
356 mySelMgr = new LightApp_SelectionMgr( this );
358 myAccel = SUIT_Accel::getAccel();
360 #ifndef DISABLE_OCCVIEWER
361 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
372 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
374 #ifndef DISABLE_VTKVIEWER
375 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
386 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
388 #ifndef DISABLE_PLOT2DVIEWER
389 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
395 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
396 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
399 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
400 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
401 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
402 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
403 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
406 // Set existing font for the python console in resources
407 if( !aResMgr->hasValue( "PyConsole", "font" ) )
410 QFont f = aResMgr->fontValue( "PyConsole", "font" );
412 QStringList famdb = fdb.families();
414 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
417 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
419 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
422 if ( famdb.contains(aFamily) )
424 f.setFamily( aFamily );
425 aResMgr->setValue( "PyConsole", "font", f );
432 *\li Save window geometry.
433 *\li Save desktop geometry.
434 *\li Save resource maneger.
435 *\li Delete selection manager.
437 LightApp_Application::~LightApp_Application()
441 delete myScreenHelper;
444 /*!Start application.*/
445 void LightApp_Application::start()
447 CAM_Application::start();
450 updateViewManagers();
451 updateCommandsStatus();
454 desktop()->statusBar()->showMessage( "" );
456 LightApp_EventFilter::Init();
459 /*!Closeapplication.*/
460 void LightApp_Application::closeApplication()
462 #ifndef DISABLE_QTXWEBBROWSER
463 QProcess::startDetached( "HelpBrowser",
464 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
466 CAM_Application::closeApplication();
469 /*!Gets application name.*/
470 QString LightApp_Application::applicationName() const
472 static QString _app_name;
473 if ( _app_name.isEmpty() )
474 _app_name = tr( "APP_NAME" );
478 /*!Gets application version.*/
479 QString LightApp_Application::applicationVersion() const
481 static QString _app_version;
483 if ( _app_version.isEmpty() )
485 QString resVersion = tr( "APP_VERSION" );
486 if ( resVersion != "APP_VERSION" )
488 _app_version = resVersion;
492 _app_version = GUI_VERSION_STR;
498 /*!Load module by \a name.*/
499 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
501 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
504 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
505 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
506 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
511 /*!Activate module by \a modName*/
512 bool LightApp_Application::activateModule( const QString& modName )
515 CAM_Module* prevMod = activeModule();
518 actName = prevMod->moduleName();
520 if ( actName == modName )
523 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
525 saveDockWindowsState();
527 bool status = CAM_Application::activateModule( modName );
529 updateModuleActions();
537 updateViewManagers();
539 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
540 if ( objectBrowser()->root() != activeStudy()->root() )
541 objectBrowser()->setRoot( activeStudy()->root() );
542 updateObjectBrowser( true );
545 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
550 /*!Gets selection manager.*/
551 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
556 /*!Creat action "New window" for certain type of viewer:*/
557 void LightApp_Application::createActionForViewer( const int id,
559 const QString& suffix,
562 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
563 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
564 QAction* a = createAction( id, // menu action id
571 false, // toggle flag
573 SLOT( onNewWindow() ) ); // slot
574 createMenu( a, parentId, -1 );
579 void LightApp_Application::createActions()
581 CAM_Application::createActions();
583 SUIT_Desktop* desk = desktop();
584 SUIT_ResourceMgr* resMgr = resourceMgr();
587 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
588 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
589 Qt::CTRL+Qt::Key_P, desk, false, this, SLOT( onPreferences() ) );
593 // - Help for modules
595 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
596 createMenu( separator(), helpMenu, -1, 10 );
597 QStringList aModuleList;
598 modules( aModuleList, false );
599 aModuleList.prepend( "GUI" );
600 aModuleList.prepend( "KERNEL" );
602 int id = LightApp_Application::UserID + FIRST_HELP_ID;
605 foreach( aModule, aModuleList ) {
606 if ( aModule.isEmpty() ) // module title (user name)
608 IMap <QString, QString> helpData; // list of help files for the module
609 QString helpSubMenu; // help submenu name (empty if not needed)
610 QString modName = moduleName( aModule ); // module name
611 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
612 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir variable
613 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir
615 if (resMgr->hasValue( modName, "documentation" ) )
616 docSection = resMgr->stringValue(modName, "documentation");
617 else if ( resMgr->hasSection( modName + "_documentation" ) )
618 docSection = modName + "_documentation";
619 if ( !docSection.isEmpty() ) {
620 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
621 QStringList listOfParam = resMgr->parameters( docSection );
622 foreach( QString paramName, listOfParam ) {
623 QString valueStr = resMgr->stringValue( docSection, paramName );
624 if ( !valueStr.isEmpty() ) {
625 QFileInfo fi( valueStr );
626 if ( fi.isRelative() && !modDir.isEmpty() )
627 valueStr = Qtx::addSlash( modDir ) + valueStr;
628 if ( QFile::exists( valueStr ) )
629 helpData.insert( paramName.arg( aModule ), valueStr );
634 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
635 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
636 QString indexFile = idxLst.join( QDir::separator() ); // index file
637 if ( QFile::exists( indexFile ) )
638 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
641 IMapConstIterator<QString, QString > fileIt;
642 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
643 QString helpFileName = fileIt.key();
644 // remove all '//' occurances
645 while ( helpFileName.contains( "//" ) )
646 helpFileName.replace( "//", "" );
647 // obtain submenus hierarchy if given
648 QStringList smenus = helpFileName.split( "/" );
649 helpFileName = smenus.last();
651 QAction* a = createAction( id, helpFileName,
652 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
653 helpFileName, helpFileName,
654 0, desk, false, this, SLOT( onHelpContentsModule() ) );
655 a->setData( fileIt.value() );
656 if ( !helpSubMenu.isEmpty() ) {
657 smenus.prepend( helpSubMenu );
659 // create sub-menus hierarchy
660 int menuId = helpMenu;
661 foreach ( QString subMenu, smenus ) {
662 menuId = createMenu( subMenu, menuId, -1, 0 );
664 createMenu( a, menuId, -1, 0 );
669 // - Additional help items
671 createMenu( separator(), helpMenu, -1, 5 );
673 QStringList addHelpItems = resMgr->parameters( "add_help" );
674 foreach ( QString addHelpItem, addHelpItems ) {
675 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
676 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
677 QAction* a = createAction( id, addHelpItem,
678 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
679 addHelpItem, addHelpItem,
680 0, desk, false, this, SLOT( onHelpContentsModule() ) );
681 a->setData( valueStr );
682 createMenu( a, helpMenu, -1, 5 );
688 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
689 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
690 registerAction( MRUId, mru );
692 // default icon for neutral point ('SALOME' module)
693 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
694 if ( defIcon.isNull() )
695 defIcon = QPixmap( imageEmptyIcon );
697 //! default icon for any module
698 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
699 if ( modIcon.isNull() )
700 modIcon = QPixmap( imageEmptyIcon );
703 modules( modList, false );
705 if ( modList.count() > 1 )
707 LightApp_ModuleAction* moduleAction =
708 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
710 QMap<QString, QString> iconMap;
711 moduleIconNames( iconMap );
713 const int iconSize = 20;
715 QStringList::Iterator it;
716 for ( it = modList.begin(); it != modList.end(); ++it )
718 if ( !isModuleAccessible( *it ) )
721 QString modName = moduleName( *it );
724 if ( iconMap.contains( *it ) )
725 iconName = iconMap[*it];
727 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
732 "****************************************************************" << std::endl <<
733 " Warning: icon for " << qPrintable(*it) << " is not found!" << std::endl <<
734 " Using the default icon." << std::endl <<
735 "****************************************************************" << std::endl);
737 icon = Qtx::scaleIcon( icon, iconSize );
739 moduleAction->insertModule( *it, icon );
742 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
743 this, SLOT( onModuleActivation( const QString& ) ) );
744 registerAction( ModulesListId, moduleAction );
748 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
749 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
751 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
752 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
753 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
754 0, desk, false, this, SLOT( onCloseAllWindow() ) );
755 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
756 0, desk, false, this, SLOT( onGroupAllWindow() ) );
758 createMenu( CloseId, windowMenu, 0, -1 );
759 createMenu( CloseAllId, windowMenu, 0, -1 );
760 createMenu( GroupAllId, windowMenu, 0, -1 );
761 createMenu( separator(), windowMenu, -1, 0 );
763 #ifndef DISABLE_GLVIEWER
764 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
766 #ifndef DISABLE_PLOT2DVIEWER
767 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
769 #ifndef DISABLE_OCCVIEWER
770 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
772 #ifndef DISABLE_VTKVIEWER
773 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
775 #ifndef DISABLE_QXGRAPHVIEWER
776 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
778 #ifndef DISABLE_GRAPHICSVIEW
779 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
781 #ifndef DISABLE_PVVIEWER
782 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
784 #ifndef DISABLE_PYVIEWER
785 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
788 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
789 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
790 createMenu( RenameId, windowMenu, -1 );
792 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
793 createMenu( PreferencesId, fileMenu, 50, -1 );
794 createMenu( separator(), fileMenu, -1, 50, -1 );
796 createMenu( separator(), fileMenu, -1, 100, -1 );
797 createMenu( MRUId, fileMenu, 100, -1 );
798 createMenu( separator(), fileMenu, -1, 100, -1 );
800 #ifdef USE_SALOME_STYLE
801 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
802 0, desk, false, this, SLOT( onStylePreferences() ) );
803 #endif // USE_SALOME_STYLE
805 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
806 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
809 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
810 createMenu( separator(), viewMenu, -1, 20, -1 );
811 #ifdef USE_SALOME_STYLE
812 createMenu( StyleId, viewMenu, 20, -1 );
813 #endif // USE_SALOME_STYLE
814 createMenu( FullScreenId, viewMenu, 20, -1 );
816 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
817 QString( "SalomeModules" ) ); // name (language-independant)
818 createTool( ModulesListId, modTBar );
821 /*!On module activation action.*/
822 void LightApp_Application::onModuleActivation( const QString& modName )
824 // Force user to create/open a study before module activation
825 QMap<QString, QString> iconMap;
826 moduleIconNames( iconMap );
827 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
829 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
831 bool cancelled = false;
833 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
834 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
835 QMap<int, QString> opmap = activateModuleActions();
836 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
837 aDlg.addButton( it.value(), it.key() );
839 int res = aDlg.exec();
841 // some operation is selected
842 moduleActionSelected( res );
846 putInfo( tr("INF_CANCELLED") );
848 LightApp_ModuleAction* moduleAction =
849 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
851 moduleAction->setActiveModule( QString() );
857 activateModule( modName );
860 /*!Default module activation.*/
861 QString LightApp_Application::defaultModule() const
863 QStringList aModuleNames;
864 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
865 //! If there's the one and only module --> activate it automatically
866 //! TODO: Possible improvement - default module can be taken from preferences
867 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
870 /*!On new window slot.*/
871 void LightApp_Application::onNewWindow()
873 const QObject* obj = sender();
874 if ( !obj || !obj->inherits( "QAction" ) )
878 int id = actionId( (QAction*)obj );
881 #ifndef DISABLE_GLVIEWER
883 type = GLViewer_Viewer::Type();
886 #ifndef DISABLE_PLOT2DVIEWER
888 type = Plot2d_Viewer::Type();
891 #ifndef DISABLE_OCCVIEWER
893 type = OCCViewer_Viewer::Type();
896 #ifndef DISABLE_VTKVIEWER
898 type = VTKViewer_Viewer::Type();
901 #ifndef DISABLE_QXGRAPHVIEWER
902 case NewQxSceneViewId:
903 type = QxScene_Viewer::Type();
906 #ifndef DISABLE_GRAPHICSVIEW
907 case NewGraphicsViewId:
908 type = GraphicsView_Viewer::Type();
911 #ifndef DISABLE_PVVIEWER
913 type = PVViewer_Viewer::Type();
916 #ifndef DISABLE_PYVIEWER
918 type = PyViewer_Viewer::Type();
923 if ( !type.isEmpty() )
924 createViewManager( type );
928 SLOT: Creates new document
930 void LightApp_Application::onNewDoc()
932 #ifdef SINGLE_DESKTOP
933 if ( !checkExistingDoc() )
937 //asl: fix for 0020515
938 saveDockWindowsState();
940 CAM_Application::onNewDoc();
944 SLOT: Opens new document
946 void LightApp_Application::onOpenDoc()
948 SUIT_Study* study = activeStudy();
950 #ifdef SINGLE_DESKTOP
951 if ( !checkExistingDoc() )
955 CAM_Application::onOpenDoc();
957 if ( !study ) // new study will be create in THIS application
960 updateViewManagers();
965 SLOT: Opens new document.
966 \param aName - name of file
968 bool LightApp_Application::onOpenDoc( const QString& aName )
970 #ifdef SINGLE_DESKTOP
971 if ( !checkExistingDoc() )
975 saveDockWindowsState();
977 // We should take mru action first because this application instance can be deleted later.
978 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
980 bool res = CAM_Application::onOpenDoc( aName );
985 mru->insert( aName );
987 mru->remove( aName );
993 SLOT: Displays "About" message box
995 void LightApp_Application::onHelpAbout()
997 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1002 Private SLOT: Called on selection is changed
1003 Dispatchs active module that selection is changed
1005 void LightApp_Application::onSelection()
1007 //MESSAGE("onSelection")
1008 onSelectionChanged();
1010 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1011 ((LightApp_Module*)activeModule())->selectionChanged();
1016 \param study - SUIT_Study.
1018 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1020 CAM_Application::setActiveStudy( study );
1024 Enables/Disables menu items and toolbar buttons. Rebuild menu
1026 void LightApp_Application::updateCommandsStatus()
1028 CAM_Application::updateCommandsStatus();
1031 #ifndef DISABLE_GLVIEWER
1032 a = action( NewGLViewId );
1034 a->setEnabled( activeStudy() );
1037 #ifndef DISABLE_PLOT2DVIEWER
1038 a = action( NewPlot2dId );
1040 a->setEnabled( activeStudy() );
1043 #ifndef DISABLE_OCCVIEWER
1044 a = action( NewOCCViewId );
1046 a->setEnabled( activeStudy() );
1049 #ifndef DISABLE_VTKVIEWER
1050 a = action( NewVTKViewId );
1052 a->setEnabled( activeStudy() );
1055 #ifndef DISABLE_QXGRAPHVIEWER
1056 a = action( NewQxSceneViewId );
1058 a->setEnabled( activeStudy() );
1061 #ifndef DISABLE_GRAPHICSVIEW
1062 a = action( NewGraphicsViewId );
1064 a->setEnabled( activeStudy() );
1067 #ifndef DISABLE_PVVIEWER
1068 a = action( NewPVViewId );
1070 a->setEnabled( activeStudy() );
1073 #ifndef DISABLE_PYVIEWER
1074 a = action( NewPyViewerId );
1076 a->setEnabled( activeStudy() );
1082 Runs system command in separate thread
1084 class RunBrowser: public QThread
1087 RunBrowser( LightApp_Application* app,
1088 const QString& theApp,
1089 const QString& theParams,
1090 const QString& theHelpFile,
1091 const QString& theContext = QString() )
1093 myParams( theParams ),
1094 myContext( theContext ),
1098 //For the external browser always specify 'file://' protocol,
1099 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1100 myHelpFile = QString("file://%1").arg( QFileInfo( theHelpFile ).canonicalFilePath() );
1105 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1106 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1108 QProcess* proc = new QProcess();
1110 proc->start( aCommand );
1111 if ( !proc->waitForStarted() ) {
1112 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1113 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1114 ce2000->setData( msg );
1115 QApplication::postEvent( myLApp, ce2000 );
1126 LightApp_Application* myLApp;
1130 SLOT: Displays help contents for choosen module
1132 void LightApp_Application::onHelpContentsModule()
1134 const QAction* a = (QAction*) sender();
1135 QString helpFile = a->data().toString();
1136 if ( helpFile.isEmpty() ) return;
1138 SUIT_ResourceMgr* resMgr = resourceMgr();
1141 platform = "winapplication";
1143 platform = "application";
1145 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1147 QString quote("\"");
1148 anApp.prepend( quote );
1149 anApp.append( quote );
1151 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1152 #if DISABLE_QTXWEBBROWSER
1153 bool useExtBrowser = true;
1155 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1158 if( useExtBrowser ) {
1159 if ( !anApp.isEmpty() ) {
1160 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1164 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1165 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1166 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1168 showPreferences( tr( "PREF_APP" ) );
1172 QStringList parameters;
1173 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1174 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1175 parameters << helpFile;
1176 QProcess::startDetached( "HelpBrowser", parameters );
1181 SLOT: Displays help contents for choosen dialog
1183 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1184 const QString& theFileName,
1185 const QString& theContext )
1187 QString fileName = theFileName;
1188 QString context = theContext;
1189 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1190 // context might be passed within theFileName argument
1191 QStringList comps = fileName.split("#");
1192 if ( comps.count() > 1 ) {
1193 context = comps.last();
1195 fileName = comps.join("#");
1199 QString homeDir = "";
1200 if ( !theComponentName.isEmpty() ) {
1201 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1202 if ( !dir.isEmpty() )
1203 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1204 Qtx::addSlash( "share" ) +
1205 Qtx::addSlash( "doc" ) +
1206 Qtx::addSlash( "salome" ) +
1207 Qtx::addSlash( "gui" ) +
1208 Qtx::addSlash( theComponentName ) );
1211 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1212 SUIT_ResourceMgr* resMgr = resourceMgr();
1215 platform = "winapplication";
1217 platform = "application";
1219 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1221 QString quote("\"");
1222 anApp.prepend( quote );
1223 anApp.append( quote );
1226 #if DISABLE_QTXWEBBROWSER
1227 bool useExtBrowser = true;
1229 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1233 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1235 if ( !anApp.isEmpty() ) {
1236 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1240 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1241 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1242 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1243 showPreferences( tr( "PREF_APP" ) );
1247 QStringList parameters;
1248 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1249 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1250 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1251 QProcess::startDetached( "HelpBrowser", parameters );
1256 Sets enable or disable some actions on selection changed.
1258 void LightApp_Application::onSelectionChanged()
1260 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1261 bool canCopy = m ? m->canCopy() : false;
1262 bool canPaste = m ? m->canPaste() : false;
1264 action( EditCopyId )->setEnabled(canCopy);
1265 action( EditPasteId )->setEnabled(canPaste);
1269 SLOT: Performs some actions when dockable windows are triggered
1271 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1275 QWidget* LightApp_Application::dockWindow( const int id ) const
1278 if ( myWin.contains( id ) )
1283 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1288 QDockWidget* dock = 0;
1289 QWidget* w = wid->parentWidget();
1290 while ( w && !dock )
1292 dock = ::qobject_cast<QDockWidget*>( w );
1293 w = w->parentWidget();
1298 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1303 if ( wid != dockWindow( id ) )
1304 removeDockWindow( id );
1306 myWin.insert( id, wid );
1308 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1309 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1311 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1312 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1313 QString( "%1Dock" ).arg( wid->objectName() ) );
1314 dock->setWidget( wid );
1315 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1316 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1317 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1319 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1320 if ( !accel.isEmpty() )
1321 dock->toggleViewAction()->setShortcut( accel );
1326 void LightApp_Application::removeDockWindow( const int id )
1328 QWidget* wid = dockWindow( id );
1334 QDockWidget* dock = windowDock( wid );
1338 dock->setWidget( 0 );
1339 wid->setParent( 0 );
1340 wid->setVisible( false );
1344 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1346 QDockWidget* dock = windowDock( dockWindow( id ) );
1347 if ( dock && desktop() ) {
1348 desktop()->addDockWidget( place, dock );
1349 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1350 if ( a ) a->update();
1356 \param flag - key for window
1357 \param studyId - study id
1358 Flag used how identificator of window in windows list.
1360 QWidget* LightApp_Application::getWindow( const int flag, const int )
1362 QWidget* wid = dockWindow( flag );
1364 insertDockWindow( flag, wid = createWindow( flag ) );
1366 QMap<int, int> winMap;
1367 currentWindows( winMap );
1368 if ( winMap.contains( flag ) )
1369 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1375 \return Object Browser
1377 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1379 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1385 LogWindow* LightApp_Application::logWindow()
1387 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1390 #ifndef DISABLE_PYCONSOLE
1392 This returns the python console integrated to the GUI. Depending
1393 when you request the python console, this function could return
1394 null. Then the optional parameter force (default to false) can be
1395 set to force the creation of the python console if it is not done
1397 \param force - if true, the pythonConsole is created if it does not exist yet
1398 \return Python Console
1400 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1402 QWidget* wid = dockWindow( WT_PyConsole );
1403 if ( !wid && force==true) {
1404 wid = getWindow(WT_PyConsole);
1406 return qobject_cast<PyConsole_Console*>( wid );
1411 Updates object browser and maybe data models
1412 \param updateModels - if it is true, then data models are updated
1414 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1416 // update existing data models
1419 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1420 if ( objectBrowser() )
1421 objectBrowser()->setAutoUpdate( false );
1423 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1425 CAM_Study::ModelList dm_list;
1426 study->dataModels( dm_list );
1427 QListIterator<CAM_DataModel*> it( dm_list );
1428 while ( it.hasNext() ) {
1429 CAM_DataModel* camDM = it.next();
1430 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1431 ((LightApp_DataModel*)camDM)->update();
1435 if( objectBrowser() )
1436 objectBrowser()->setAutoUpdate( isAutoUpdate );
1439 if ( objectBrowser() ) {
1440 objectBrowser()->updateGeometry();
1441 objectBrowser()->updateTree( 0, false );
1448 LightApp_Preferences* LightApp_Application::preferences() const
1450 return preferences( false );
1454 \return first view manager of some type
1455 \param vmType - type of view manager
1456 \param create - is it necessary to create view manager in case, when there is no manager of such type
1458 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1460 SUIT_ViewManager* aVM = viewManager( vmType );
1461 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1462 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1463 if ( anActiveVM && anActiveVM->getType() == vmType )
1465 MESSAGE("aVM = anActiveVM");
1469 if ( aVM && !aVM->getDetached() && create )
1471 if ( !aVM->getActiveView() )
1473 MESSAGE("aVM->createView()");
1478 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1479 desktop()->setActiveWindow( aVM->getActiveView() );
1484 MESSAGE("aVM = createViewManager( vmType )");
1485 aVM = createViewManager( vmType );
1492 Creates view manager of some type
1493 \param vmType - type of view manager
1495 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
1497 SUIT_ResourceMgr* resMgr = resourceMgr();
1499 SUIT_ViewManager* viewMgr = 0;
1500 #ifndef DISABLE_GLVIEWER
1501 if( vmType == GLViewer_Viewer::Type() )
1503 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1504 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1507 #ifndef DISABLE_PLOT2DVIEWER
1508 if( vmType == Plot2d_Viewer::Type() )
1510 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1512 #ifndef DISABLE_SALOMEOBJECT
1513 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1515 new LightApp_Plot2dSelector( v, mySelMgr );
1517 vm = new Plot2d_Viewer();
1519 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1520 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1523 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1524 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1528 #ifndef DISABLE_QXGRAPHVIEWER
1529 if( vmType == QxScene_Viewer::Type() )
1531 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1532 QxScene_Viewer* vm = new QxScene_Viewer();
1533 viewMgr->setViewModel( vm );
1534 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1537 #ifndef DISABLE_GRAPHICSVIEW
1538 if( vmType == GraphicsView_Viewer::Type() )
1540 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1541 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1544 #ifndef DISABLE_PVVIEWER
1545 if( vmType == PVViewer_Viewer::Type() )
1547 if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
1548 viewMgr->getActiveView()->setFocus();
1551 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1555 #ifndef DISABLE_PYVIEWER
1556 if( vmType == PyViewer_Viewer::Type() )
1558 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1561 #ifndef DISABLE_OCCVIEWER
1562 if( vmType == OCCViewer_Viewer::Type() )
1564 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1565 OCCViewer_Viewer* vm;
1566 #ifndef DISABLE_SALOMEOBJECT
1567 vm = new SOCC_Viewer();
1569 vm = new OCCViewer_Viewer( true );
1571 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1572 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1573 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1574 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1575 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1576 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1577 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1578 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1580 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1581 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1582 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1583 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1584 #if OCC_VERSION_LARGE > 0x06090000
1585 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1586 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1587 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1588 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1589 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1590 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1592 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1593 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1594 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1596 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1597 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1598 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1599 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1600 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1601 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1602 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1603 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1606 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1607 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1610 #ifndef DISABLE_VTKVIEWER
1611 #ifndef DISABLE_SALOMEOBJECT
1612 if ( vmType == SVTK_Viewer::Type() )
1614 if ( vmType == VTKViewer_Viewer::Type() )
1617 #ifndef DISABLE_SALOMEOBJECT
1618 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1619 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1622 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1623 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1624 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1625 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1626 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1627 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1628 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1629 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1630 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1631 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1632 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1633 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1634 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1635 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1636 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1637 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1638 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1639 new LightApp_VTKSelector( vm, mySelMgr );
1642 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1643 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1645 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1653 viewMgr->setDetached(detached);
1654 addViewManager( viewMgr );
1655 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1657 if ( viewWin && desktop() ) {
1658 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1659 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1665 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1667 SUIT_ResourceMgr* resMgr = resourceMgr();
1669 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1671 new LightApp_WgViewModel( vmType, w ) );
1672 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1674 addViewManager( vm );
1675 SUIT_ViewWindow* vw = vm->createViewWindow();
1676 if ( vw && desktop() ) {
1677 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1678 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1681 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1682 myUserWmTypes << vmType;
1687 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1689 SUIT_ResourceMgr* resMgr = resourceMgr();
1691 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1695 QString vmType = vm->getType();
1697 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1699 addViewManager( vm );
1700 SUIT_ViewWindow* vw = vm->createViewWindow();
1701 if ( vw && desktop() ) {
1702 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1703 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1706 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1707 myUserWmTypes << vmType;
1713 SLOT: Removes view manager from application
1715 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1717 removeViewManager( theVM );
1721 Protected SLOT: On study created.
1722 \param theStudy - just created study
1724 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1726 SUIT_DataObject* aRoot = 0;
1727 if ( theStudy && theStudy->root() )
1729 aRoot = theStudy->root();
1730 //aRoot->setName( tr( "DATA_MODELS" ) );
1733 getWindow( WT_ObjectBrowser );
1735 loadDockWindowsState();
1737 if ( objectBrowser() )
1738 objectBrowser()->setRoot( aRoot );
1740 activateModule( defaultModule() );
1742 if ( objectBrowser() )
1743 objectBrowser()->openLevels();
1745 #ifndef DISABLE_PYCONSOLE
1746 if( pythonConsole() )
1747 getPyInterp()->initStudy();
1752 Protected SLOT: On study opened.
1753 \param theStudy - just opened study
1755 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1757 SUIT_DataObject* aRoot = 0;
1758 if ( theStudy && theStudy->root() )
1760 aRoot = theStudy->root();
1764 getWindow( WT_ObjectBrowser );
1766 loadDockWindowsState();
1768 if ( objectBrowser() )
1769 objectBrowser()->setRoot( aRoot );
1771 activateModule( defaultModule() );
1773 if ( objectBrowser() )
1774 objectBrowser()->openLevels();
1776 #ifndef DISABLE_PYCONSOLE
1777 if( pythonConsole() )
1778 getPyInterp()->initStudy();
1784 /*!Protected SLOT. On study saved.*/
1785 void LightApp_Application::onStudySaved( SUIT_Study* s )
1787 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1789 mru->insert( s->studyName() );
1794 /*!Protected SLOT. On study closed.*/
1795 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1798 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1799 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1802 // stop auto-save timer
1803 myAutoSaveTimer->stop();
1805 // Bug 10396: clear selection
1806 mySelMgr->clearSelected();
1808 // Bug 12944: emit signal only after clear selection
1811 activateModule( "" );
1814 /*!Protected SLOT.On desktop activated.*/
1815 void LightApp_Application::onDesktopActivated()
1817 CAM_Application::onDesktopActivated();
1818 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1820 aModule->studyActivated();
1823 void LightApp_Application::studyOpened( SUIT_Study* s )
1825 CAM_Application::studyOpened( s );
1828 updateViewManagers();
1831 void LightApp_Application::studySaved( SUIT_Study* s )
1833 CAM_Application::studyOpened( s );
1834 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1835 if ( aResMgr && activeStudy() ) {
1836 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1837 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1841 void LightApp_Application::studyCreated( SUIT_Study* s )
1843 CAM_Application::studyCreated( s );
1846 updateViewManagers();
1849 /*!Gets file filter.
1850 *\retval QString "(*.hdf)"
1852 QString LightApp_Application::getFileFilter( bool /*open*/) const
1858 Shows file dialog and return user selected file name
1860 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1861 const QString& caption, QWidget* parent )
1865 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1866 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1869 /*! Gets directory*/
1870 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1874 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1877 /*! Get open file names*/
1878 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1879 const QString& caption, QWidget* parent )
1883 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1884 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1887 /*!Private SLOT. Update object browser.*/
1888 void LightApp_Application::onRefresh()
1890 updateObjectBrowser( true );
1893 /*!Private SLOT. Update actions after rename object.*/
1894 void LightApp_Application::onRenamed()
1896 activeStudy()->Modified();
1900 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1901 // To prevent reversion the window should be either aligned during movement and resize.
1902 /*!Private SLOT. Update actions after rename object.*/
1903 /*void LightApp_Application::onMoved()
1905 OCCViewer_ViewManager* viewMgr = 0;
1906 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1908 OCCViewer_ViewWindow* view = 0;
1909 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1911 view->getViewPort()->repaintViewAfterMove();
1916 /*!Private SLOT. Support drag-and-drop operation.*/
1917 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1919 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1923 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1925 aModule->dropObjects( objects, parentObj, row, action );
1928 /*!Private SLOT. On preferences.*/
1929 void LightApp_Application::onPreferences()
1931 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1934 /*!Private SLOT. On preferences.*/
1935 void LightApp_Application::showPreferences( const QString& itemText )
1937 QApplication::setOverrideCursor( Qt::WaitCursor );
1939 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1941 QApplication::restoreOverrideCursor();
1946 preferences()->activateItem( itemText );
1948 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
1951 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
1952 resourceMgr()->save();
1955 shortcutMgr()->updateShortcuts();
1961 /*!Protected SLOT. On preferences changed.*/
1962 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
1964 LightApp_Module* sMod = 0;
1965 CAM_Module* mod = module( modName );
1966 if ( mod && mod->inherits( "LightApp_Module" ) )
1967 sMod = (LightApp_Module*)mod;
1970 sMod->preferencesChanged( section, param );
1972 preferencesChanged( section, param );
1973 // emit signal to allow additional preferences changing processing
1974 emit preferenceChanged( modName, section, param );
1977 /*!Remove all windows from study.*/
1978 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
1980 saveDockWindowsState();
1982 if ( SUIT_DataBrowser* ob = objectBrowser() )
1985 CAM_Application::beforeCloseDoc( s );
1988 /*!Update actions.*/
1989 void LightApp_Application::updateActions()
1991 updateCommandsStatus();
1997 SUIT_Study* LightApp_Application::createNewStudy()
1999 LightApp_Application::lastStudyId++;
2001 LightApp_Study* aStudy = new LightApp_Study( this );
2003 // Set up processing of major study-related events
2004 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
2005 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
2006 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
2007 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2013 Creates window by flag.
2014 \param flag - identificator of window type
2016 QWidget* LightApp_Application::createWindow( const int flag )
2020 SUIT_ResourceMgr* resMgr = resourceMgr();
2022 if ( flag == WT_ObjectBrowser )
2024 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2025 ob->setObjectName( "objectBrowser" );
2026 ob->setSortMenuEnabled( true );
2027 ob->setAutoUpdate( true );
2028 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2029 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2031 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2032 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2033 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2035 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2036 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2037 treeModel->setSearcher( this );
2038 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2039 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2041 // Mantis issue 0020136: Drag&Drop in OB
2042 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2044 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2045 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2046 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2047 this, SLOT( onRenamed( ) ) );
2051 // temporary commented
2053 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2055 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2058 // Create OBSelector
2059 new LightApp_OBSelector( ob, mySelMgr );
2060 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2061 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2063 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2065 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2066 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2067 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2069 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2071 #ifndef DISABLE_PYCONSOLE
2072 else if ( flag == WT_PyConsole )
2074 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2075 pyCons->setObjectName( "pythonConsole" );
2076 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2077 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2078 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2079 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2080 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2084 else if ( flag == WT_LogWindow )
2086 LogWindow* logWin = new LogWindow( desktop() );
2087 logWin->setObjectName( "logWindow" );
2088 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2089 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2091 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2097 \return default windows( Object Browser, Python Console )
2098 Adds to map \a aMap.
2100 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2102 #ifndef DISABLE_PYCONSOLE
2103 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2105 if ( activeStudy() ) {
2106 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2107 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2111 /*!Default view managers*/
2112 void LightApp_Application::defaultViewManagers( QStringList& ) const
2118 \return preferences.
2119 Create preferences, if \a crt = true.
2121 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2126 LightApp_Application* that = (LightApp_Application*)this;
2128 bool toCreate = !_prefs_ && crt;
2131 _prefs_ = new LightApp_Preferences( resourceMgr() );
2132 that->createPreferences( _prefs_ );
2135 that->myPrefs = _prefs_;
2137 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2138 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2139 connect( myPrefs, SIGNAL( resetToDefaults() ),
2140 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2145 SUIT_ResourceMgr* resMgr = resourceMgr();
2147 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2148 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2150 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2154 QStringList modNameList;
2155 app->modules( modNameList, false );
2157 QMap<QString, QString> iconMap;
2158 app->moduleIconNames( iconMap );
2160 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2162 if ( !app->isModuleAccessible( *it ) || _prefs_->hasModule( *it ) )
2165 int modId = _prefs_->addPreference( *it );
2166 if ( iconMap.contains( *it ) )
2167 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2171 app->modules( modList );
2172 QListIterator<CAM_Module*> itr( modList );
2173 while ( itr.hasNext() )
2175 LightApp_Module* mod = 0;
2177 CAM_Module* anItem = itr.next();
2178 if ( anItem->inherits( "LightApp_Module" ) )
2179 mod = (LightApp_Module*)anItem;
2181 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2183 _prefs_->addPreference( mod->moduleName() );
2184 mod->createPreferences();
2185 that->emptyPreferences( mod->moduleName() );
2189 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2195 Adds new module to application
2197 void LightApp_Application::moduleAdded( CAM_Module* mod )
2199 CAM_Application::moduleAdded( mod );
2201 LightApp_Module* lightMod = 0;
2202 if ( mod && mod->inherits( "LightApp_Module" ) )
2203 lightMod = (LightApp_Module*)mod;
2205 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2207 myPrefs->addPreference( mod->moduleName() );
2208 lightMod->createPreferences();
2209 emptyPreferences( mod->moduleName() );
2213 void LightApp_Application::emptyPreferences( const QString& modName )
2215 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2216 if ( !item || !item->isEmpty() )
2219 // printf( "---------------------> Modify for empty module.\n" );
2221 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2222 frm->setIcon( item->icon() );
2223 frm->setStretch( false );
2224 item->parentItem()->insertItem( frm, item );
2225 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2232 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2237 QStringList aValuesList;
2238 QList<QVariant> anIndicesList;
2242 // . Top-level "SALOME" preferences group <<start>>
2243 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2244 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2246 // .. "General" preferences tab <<start>>
2247 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2249 // ... "Language" group <<start>>
2250 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2251 pref->setItemProperty( "columns", 2, langGroup );
2252 // .... -> application language
2253 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2254 LightApp_Preferences::Selector, "language", "language" );
2255 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2256 QList<QVariant> aIcons;
2257 QList<QVariant> aNumbers;
2258 QStringList aTitles;
2259 foreach ( QString aLang, aLangs ) {
2260 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2262 aTitles << langToName( aLang );
2264 pref->setItemProperty( "strings", aTitles, curLang );
2265 pref->setItemProperty( "ids", aNumbers, curLang );
2266 pref->setItemProperty( "icons", aIcons, curLang );
2267 pref->setItemProperty( "restart", true, curLang );
2269 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2270 LightApp_Preferences::Bool, "language", "locale" );
2271 pref->setItemProperty( "restart", true, curLocale );
2272 // ... "Language" group <<end>>
2274 // ... "Look and feel" group <<start>>
2275 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2276 pref->setItemProperty( "columns", 2, lookGroup );
2277 // .... -> show splash-screen
2278 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2279 // .... -> opaque resize
2280 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2281 // .... -> drop-down buttons
2282 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2283 // ... "Look and feel" group <<end>>
2285 // ... "Study properties" group <<start>>
2286 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2287 pref->setItemProperty( "columns", 2, studyGroup );
2288 // .... -> multi-file save
2289 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2290 // .... -> ascii save mode
2291 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2292 // .... -> store windows geometry
2293 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2294 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2295 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2296 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2297 // .... -> auto-save
2298 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2299 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2300 pref->setItemProperty( "min", 0, autoSaveInterval );
2301 pref->setItemProperty( "max", 1440, autoSaveInterval );
2302 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2303 // ... "Study properties" group <<end>>
2305 // ... "Help browser" group <<start>>
2306 #ifndef DISABLE_QTXWEBBROWSER
2307 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2309 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2313 QString platform = "winapplication";
2315 QString platform = "application";
2317 // .... -> browser application
2318 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2319 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2320 // .... -> browser parameters
2321 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2322 // ... "Help browser" group <<end>>
2324 // ... "Python console properties" group <<start>>
2325 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2326 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2328 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2329 // .... -> show banner
2330 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2331 // .... -> auto-completion
2332 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2333 // ... "Python console properties" group <<end>>
2335 // ... "MRU" preferences group <<start>>
2336 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2337 pref->setItemProperty( "columns", 4, mruGroup );
2338 // number of MRU items
2339 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2340 "MRU", "visible_count" );
2341 pref->setItemProperty( "min", 0, mruVisCount );
2342 pref->setItemProperty( "max", 100, mruVisCount );
2344 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2345 "MRU", "link_type" );
2346 aValuesList.clear();
2347 anIndicesList.clear();
2348 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2349 anIndicesList << 0 << 1 << 2 ;
2350 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2351 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2352 // ... "MRU" preferences group <<end>>
2354 // ... "Full-screen" group <<start>>
2355 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2356 pref->setItemProperty( "columns", 2, fullScreenGroup );
2357 // .... -> automatic hiding toolbars
2358 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2359 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2360 // ... "Full-screen" group <<end>>
2362 // .. "General" preferences tab <<end>>
2364 // .. "3D viewer" group <<start>>
2365 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2366 // ... -> navigation mode
2367 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2368 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2369 aValuesList.clear();
2370 anIndicesList.clear();
2371 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2372 anIndicesList << 0 << 1;
2373 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2374 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2375 // ... -> zooming mode
2376 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2377 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2378 aValuesList.clear();
2379 anIndicesList.clear();
2380 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2381 anIndicesList << 0 << 1;
2382 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2383 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2384 // ... "Trihedron" group <<start>>
2385 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2386 pref->setItemProperty( "columns", 2, occTriGroup );
2387 // .... -> trihedron size
2388 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2389 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2390 pref->setItemProperty( "min", 1.0E-06, occTS );
2391 pref->setItemProperty( "max", 1000, occTS );
2392 // .... -> relative size of trihedron
2393 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2394 // .... -> show static trihedron
2395 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2396 // ... "Trihedron" group <<end>>
2397 // .. "3D viewer" group <<end>>
2401 #ifndef DISABLE_OCCVIEWER
2402 // .. "OCC viewer" group <<start>>
2403 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2405 // .... -> Projection mode
2406 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2407 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2408 aValuesList.clear();
2409 anIndicesList.clear();
2410 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2411 anIndicesList << 0 << 1;
2412 pref->setItemProperty( "strings", aValuesList, occProjMode );
2413 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2414 #if OCC_VERSION_LARGE > 0x06090000
2415 // .... -> Stereo group
2416 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2417 pref->setItemProperty( "columns", 2, stereoGroup );
2418 // .... -> Stereo type
2419 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2420 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2421 aValuesList.clear();
2422 anIndicesList.clear();
2424 OCCViewer_Viewer::stereoData( aValuesList, idList);
2425 foreach( int gid, idList ) anIndicesList << gid;
2426 pref->setItemProperty( "strings", aValuesList, stereoType );
2427 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2429 // .... -> Anaglyph filter
2430 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2431 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2432 aValuesList.clear();
2433 anIndicesList.clear();
2434 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2435 anIndicesList << 0 << 1 << 2;
2437 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2438 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2440 // .... -> Convergence distance type
2441 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2442 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2443 aValuesList.clear();
2444 anIndicesList.clear();
2445 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2446 anIndicesList << 0 << 1;
2447 pref->setItemProperty( "strings", aValuesList, occFocusType );
2448 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2450 // .... -> Stereographic focus value
2451 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2452 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2453 pref->setItemProperty( "precision", 3, focusValue );
2454 pref->setItemProperty( "min", 1.0E-03, focusValue );
2455 pref->setItemProperty( "max", 1.0E03, focusValue );
2456 pref->setItemProperty( "step", 0.05, focusValue );
2459 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2460 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2461 aValuesList.clear();
2462 anIndicesList.clear();
2463 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2464 anIndicesList << 0 << 1;
2465 pref->setItemProperty( "strings", aValuesList, occIODType );
2466 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2468 // .... -> Interocular distance (IOD) value
2469 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2470 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2471 pref->setItemProperty( "precision", 3, IODValue );
2472 pref->setItemProperty( "min", 1.0E-03, IODValue );
2473 pref->setItemProperty( "max", 1.0E03, IODValue );
2474 pref->setItemProperty( "step", 0.05, IODValue );
2476 // .... -> Reverse stereo
2477 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2478 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2479 // .... -> Enable V-Sync
2480 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2481 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2482 // .... -> Enable quad-buffer support
2483 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2484 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2486 // ... "Background" group <<start>>
2487 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2488 // pref->setItemProperty( "columns", 2, bgGroup );
2489 aValuesList.clear();
2490 anIndicesList.clear();
2493 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2494 foreach( int gid, idList ) anIndicesList << gid;
2495 // .... -> 3D viewer background
2496 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2497 LightApp_Preferences::Background, "OCCViewer", "background" );
2498 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2499 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2500 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2501 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2502 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2503 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2504 pref->setItemProperty( "custom_enabled", false, bgId );
2505 pref->setItemProperty( "image_formats", formats, bgId );
2506 // .... -> XZ viewer background
2507 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2508 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2509 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2510 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2511 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2512 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2513 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2514 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2515 pref->setItemProperty( "custom_enabled", false, bgId );
2516 pref->setItemProperty( "image_formats", formats, bgId );
2517 // .... -> YZ viewer background
2518 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2519 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2520 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2521 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2522 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2523 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2524 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2525 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2526 pref->setItemProperty( "custom_enabled", false, bgId );
2527 pref->setItemProperty( "image_formats", formats, bgId );
2528 // .... -> XY viewer background
2529 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2530 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2531 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2532 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2533 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2534 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2535 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2536 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2537 pref->setItemProperty( "custom_enabled", false, bgId );
2538 pref->setItemProperty( "image_formats", formats, bgId );
2539 // ... "Background" group <<end>>
2542 // ... "Selection" group <<start>>
2543 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2544 pref->setItemProperty( "columns", 2, occSelectionGroup );
2545 // .... -> enable preselection
2546 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2547 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2548 // .... -> enable selection
2549 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2550 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2551 // ... "Selection" group <<end>>
2553 // ... "Clipping" group <<start>>
2554 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2555 // .... -> clipping color
2556 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2557 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2558 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2559 pref->setItemProperty( "columns", 2, texturePref );
2560 // .... -> use default texture
2561 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2562 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2563 // .... -> clipping texture
2564 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2565 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2566 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2568 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2569 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2570 // .... -> scale factor
2571 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2572 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2573 pref->setItemProperty( "precision", 3, scaleFactor );
2574 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2575 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2576 pref->setItemProperty( "step", 0.1, scaleFactor );
2577 // ... "Clipping" group <<end>>
2579 // ... "Ray tracing" group <<start>>
2580 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2581 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2582 pref->setItemProperty( "columns", 2, rtPref );
2584 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2585 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2586 pref->setItemProperty( "min", 1, rt_depth );
2587 pref->setItemProperty( "max", 10, rt_depth );
2588 pref->setItemProperty( "step", 1, rt_depth );
2589 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2590 // .... -> specular reflections
2591 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2592 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2593 // .... -> adaptive anti-aliasing
2594 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2595 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2596 // .... -> shadows rendering
2597 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2598 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2599 // .... -> transparent shadow
2600 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2601 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2602 // ... "Ray tracing" group <<end>>
2604 // ... "Light source" group <<start>>
2605 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2606 // .... -> light color
2607 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2608 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2609 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2610 pref->setItemProperty( "columns", 3, directionPref );
2611 // .... -> light direction (dx component)
2612 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2613 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2614 pref->setItemProperty( "precision", 2, light_dx );
2615 pref->setItemProperty( "min", -1.0E03, light_dx );
2616 pref->setItemProperty( "max", 1.0E03, light_dx );
2617 pref->setItemProperty( "step", 0.1, light_dx );
2618 // .... -> light direction (dy component)
2619 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2620 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2621 pref->setItemProperty( "precision", 2, light_dy );
2622 pref->setItemProperty( "min", -1.0E03, light_dy );
2623 pref->setItemProperty( "max", 1.0E03, light_dy );
2624 pref->setItemProperty( "step", 0.1, light_dy );
2625 // .... -> light direction (dz component)
2626 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2627 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2628 pref->setItemProperty( "precision", 2, light_dz );
2629 pref->setItemProperty( "min", -1.0E03, light_dz );
2630 pref->setItemProperty( "max", 1.0E03, light_dz );
2631 pref->setItemProperty( "step", 0.1, light_dz );
2632 // ... "Light source" group <<end>>
2634 // ... -> empty frame (for layout) <<start>>
2635 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2636 pref->setItemProperty( "margin", 0, occGen );
2637 pref->setItemProperty( "columns", 2, occGen );
2638 // ... -> empty frame (for layout) <<end>>
2640 // .. "OCC viewer" group <<end>>
2643 #ifndef DISABLE_VTKVIEWER
2644 // .. "VTK viewer" group <<start>>
2645 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2647 // ... -> empty frame (for layout) <<start>>
2648 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2649 //pref->setItemProperty( "columns", 2, vtkGen );
2650 // .... -> projection mode
2651 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2652 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2653 aValuesList.clear();
2654 anIndicesList.clear();
2655 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2656 anIndicesList << 0 << 1;
2657 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2658 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2660 // .... -> Stereo group
2661 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2662 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2663 // .... -> Stereo type
2664 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2665 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2666 aValuesList.clear();
2667 anIndicesList.clear();
2669 SVTK_Viewer::stereoData( aValuesList, idList);
2670 foreach( int gid, idList ) anIndicesList << gid;
2671 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2672 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2673 // .... -> Anaglyph filter
2674 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2675 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2676 aValuesList.clear();
2677 anIndicesList.clear();
2678 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2679 anIndicesList << 0 << 1 << 2;
2681 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2682 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2684 // .... -> Enable quad-buffer support
2685 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2686 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2688 // .... -> background
2689 aValuesList.clear();
2690 anIndicesList.clear();
2693 #ifndef DISABLE_SALOMEOBJECT
2694 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2696 foreach( int gid, idList ) anIndicesList << gid;
2697 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2698 LightApp_Preferences::Background, "VTKViewer", "background" );
2699 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2700 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2701 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2702 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2703 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2704 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2705 pref->setItemProperty( "custom_enabled", false, bgId );
2706 #ifndef DISABLE_SALOMEOBJECT
2707 pref->setItemProperty( "image_formats", formats, bgId );
2709 // .... -> speed increment
2710 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2711 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2712 pref->setItemProperty( "min", 1, vtkSpeed );
2713 pref->setItemProperty( "max", 1000, vtkSpeed );
2714 // .... -> speed mode
2715 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2716 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2717 aValuesList.clear();
2718 anIndicesList.clear();
2719 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2720 anIndicesList << 0 << 1;
2721 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2722 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2724 // ... "Selection" group <<start>>
2725 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2726 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2727 // .... -> preselection
2728 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2729 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2730 aValuesList.clear();
2731 anIndicesList.clear();
2732 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2733 anIndicesList << 0 << 1 << 2;
2734 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2735 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2736 // .... -> enable selection
2737 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2738 // ... "Selection" group <<end>>
2740 // ... -> empty frame (for layout) <<end>>
2742 // ... space mouse sub-group <<start>>
2743 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2744 //pref->setItemProperty( "columns", 2, vtkSM );
2745 // .... -> decrease speed increment
2746 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2747 LightApp_Preferences::Selector, "VTKViewer",
2748 "spacemouse_func1_btn" );
2749 // .... -> increase speed increment
2750 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2751 LightApp_Preferences::Selector, "VTKViewer",
2752 "spacemouse_func2_btn" );
2753 // .... -> dominant / combined switch
2754 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2755 LightApp_Preferences::Selector, "VTKViewer",
2756 "spacemouse_func5_btn" ); //
2757 aValuesList.clear();
2758 anIndicesList.clear();
2759 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2760 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2761 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2762 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2763 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2764 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2765 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2766 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2767 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2768 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2769 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2770 // ... space mouse sub-group <<end>>
2772 // ... avi recording sub-group <<start>>
2773 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2774 pref->setItemProperty( "columns", 2, vtkRec );
2775 // .... -> recording mode
2776 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2777 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2778 aValuesList.clear();
2779 anIndicesList.clear();
2780 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2781 anIndicesList << 0 << 1;
2782 pref->setItemProperty( "strings", aValuesList, modePref );
2783 pref->setItemProperty( "indexes", anIndicesList, modePref );
2785 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2786 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2787 pref->setItemProperty( "min", 0.1, fpsPref );
2788 pref->setItemProperty( "max", 100, fpsPref );
2790 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2791 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2792 pref->setItemProperty( "min", 1, qualityPref );
2793 pref->setItemProperty( "max", 100, qualityPref );
2794 // .... -> progressive mode
2795 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2796 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2797 // ... avi recording sub-group <<end>>
2799 // ... group names sub-group <<start>>
2800 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2801 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2802 pref->setItemProperty( "columns", 2, vtkGN );
2803 // .... -> text color
2804 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2805 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2806 // .... -> transparency
2807 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2808 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2809 pref->setItemProperty( "min", 0.0, transPref );
2810 pref->setItemProperty( "max", 1.0, transPref );
2811 pref->setItemProperty( "step", 0.1, transPref );
2812 // ... -> group names sub-group <<end>>
2813 // .. "VTK viewer" group <<end>>
2816 // .. "Plot2d viewer" group <<start>>
2817 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2818 //pref->setItemProperty( "columns", 2, plot2dGroup );
2820 // ... -> background
2821 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2822 LightApp_Preferences::Color, "Plot2d", "Background" );
2823 // ... -> selection color
2824 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2825 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2827 // ... "Viewer" group <<start>>
2828 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2830 // .... -> curve type
2831 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2832 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2833 aValuesList.clear();
2834 anIndicesList.clear();
2835 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2836 anIndicesList << 0 << 1 << 2 ;
2837 pref->setItemProperty( "strings", aValuesList, curveType );
2838 pref->setItemProperty( "indexes", anIndicesList, curveType );
2839 // .... -> marker size
2840 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2841 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2842 pref->setItemProperty( "min", 0, markerSize );
2843 pref->setItemProperty( "max", 100, markerSize );
2844 // .... -> horizontal scaling mode
2845 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2846 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2847 aValuesList.clear();
2848 anIndicesList.clear();
2849 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2850 anIndicesList << 0 << 1 ;
2851 pref->setItemProperty( "strings", aValuesList, horScale );
2852 pref->setItemProperty( "indexes", anIndicesList, horScale );
2853 // .... -> vertical scaling mode
2854 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2855 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2856 pref->setItemProperty( "strings", aValuesList, verScale );
2857 pref->setItemProperty( "indexes", anIndicesList, verScale );
2859 // .... -> errors/deviation colot
2860 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2861 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2862 // .... -> deviation markers line size
2863 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2864 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2865 pref->setItemProperty( "min", 1, deviationMarkerLw );
2866 pref->setItemProperty( "max", 5, deviationMarkerLw );
2867 // .... -> deviation markers tick mark size
2868 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2869 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2870 pref->setItemProperty( "min", 1, deviationMarkerTs );
2871 pref->setItemProperty( "max", 5, deviationMarkerTs );
2872 // .... "Viewer" group <<end>>
2874 // ... "Legend" group <<start>>
2875 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2877 // .... -> show legend
2878 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2879 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2880 // .... -> legend position
2881 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2882 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2883 aValuesList.clear();
2884 anIndicesList.clear();
2885 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2886 anIndicesList << 0 << 1 << 2 << 3 ;
2887 pref->setItemProperty( "strings", aValuesList, legendPosition );
2888 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2889 // .... -> Symbol type
2890 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2891 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2892 aValuesList.clear();
2893 anIndicesList.clear();
2894 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2895 anIndicesList << 0 << 1 ;
2896 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2897 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2898 // .... -> legend font
2899 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2900 // ... -> font color
2901 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2902 // ... -> selection font color
2903 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2904 // ... "Legend" group <<end>>
2906 // .. "Plot2d viewer" group <<end>>
2908 // .. "PyViewer" preferences tab <<start>>
2909 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2910 // ... "Font settings" group <<start>>
2911 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2912 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2913 LightApp_Preferences::Font, "PyEditor", "Font" );
2914 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2915 // ... "Font settings" group <<end>>
2916 // ... "Display settings" group <<start>>
2917 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2918 pref->setItemProperty( "columns", 2, pyDispGroup );
2919 // ... -> current line highlight
2920 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2921 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2922 // ... -> text wrapping
2923 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2924 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2925 // ... -> center cursor on scroll
2926 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2927 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2928 // ... -> line numbers area
2929 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2930 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2931 // ... "Display settings" group <<end>>
2933 // ... "Editor settings" group <<start>>
2934 int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
2935 // ... -> navigation mode
2936 int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
2937 LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
2938 aValuesList.clear();
2939 anIndicesList.clear();
2940 aValuesList << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
2941 anIndicesList << 0 << 1 << 2 << 3 ;
2942 pref->setItemProperty( "strings", aValuesList, pyCompletion );
2943 pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
2944 // ... "Editor settings" group <<end>>
2946 // ... "Tab settings" group <<start>>
2947 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
2948 pref->setItemProperty( "columns", 2, pyTabGroup );
2949 // ... -> tab whitespaces
2950 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
2951 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
2953 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
2954 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
2955 // ... "Tab settings" group <<end>>
2956 // ... "Vertical edge settings" group <<start>>
2957 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
2958 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
2959 // ... -> vertical edge
2960 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
2961 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
2962 // ... -> number of columns
2963 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
2964 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
2965 // ... "Vertical edge settings" group <<end>>
2966 // .. "PyEditor" preferences tab <<end>>
2968 // .. "Directories" preferences tab <<start>>
2969 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
2970 // ... --> quick directories list
2971 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
2972 pref->addPreference( tr( "" ), dirGroup,
2973 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
2974 // .. "Directories" preferences tab <<end>>
2976 // .. "Object browser" preferences tab <<start>>
2977 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
2979 // ... "Search tool" group <<start>>
2980 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
2981 // .... --> auto-hide
2982 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
2983 "ObjectBrowser", "auto_hide_search_tool" );
2984 // ... "Search tool" group <<end>>
2986 // ... "Object browser settings" group <<start>>
2987 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
2988 pref->setItemProperty( "columns", 2, objSetGroup );
2989 // .... -> auto size first column
2990 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
2991 "ObjectBrowser", "auto_size_first" );
2992 // .... -> auto size other columns
2993 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
2994 "ObjectBrowser", "auto_size" );
2995 // .... -> resize columns on expand item
2996 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
2997 "ObjectBrowser", "resize_on_expand_item" );
2998 // .... -> browse to published object
2999 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
3000 "ObjectBrowser", "browse_published_object" );
3001 aValuesList.clear();
3002 anIndicesList.clear();
3003 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
3004 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
3005 pref->setItemProperty( "strings", aValuesList, browsePublished );
3006 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
3007 // ... "Object browser settings" group <<end>>
3008 // .. "Object browser" preferences tab <<end>>
3010 // .. "Shortcuts" preferences tab <<start>>
3011 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3012 // ... "Shortcuts settings" group <<start>>
3013 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3014 pref->addPreference( tr( "" ), shortcutGroup,
3015 LightApp_Preferences::ShortcutTree, "shortcuts" );
3016 // ... "Shortcuts settings" group <<end>>
3017 // .. "Shortcuts" preferences tab <<end>>
3018 // . Top-level "SALOME" preferences group <<end>>
3024 Changes appearance of application according to changed preferences
3025 \param sec - section
3026 \param param - name of changed parameter
3028 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3030 SUIT_ResourceMgr* resMgr = resourceMgr();
3034 if ( sec == "viewers" && param == "drop_down_buttons" )
3036 ViewManagerList vmlist = viewManagers();
3037 foreach( SUIT_ViewManager* vm, vmlist )
3039 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3040 foreach( SUIT_ViewWindow* vw, vwlist )
3041 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3045 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3047 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3048 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3049 QList<SUIT_ViewManager*> lst;
3050 #ifndef DISABLE_OCCVIEWER
3051 viewManagers( OCCViewer_Viewer::Type(), lst );
3052 QListIterator<SUIT_ViewManager*> itOCC( lst );
3053 while ( itOCC.hasNext() && sz >= 0 )
3055 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3056 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3059 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3060 occVM->setTrihedronSize( sz, relative );
3061 occVM->getAISContext()->UpdateCurrentViewer();
3064 #ifndef DISABLE_VTKVIEWER
3065 #ifndef DISABLE_SALOMEOBJECT
3066 viewManagers( SVTK_Viewer::Type(), lst );
3067 QListIterator<SUIT_ViewManager*> itVTK( lst );
3068 while ( itVTK.hasNext() && sz >= 0 )
3070 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3071 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3074 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3077 vtkVM->setTrihedronSize( sz, relative );
3085 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3087 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3088 QList<SUIT_ViewManager*> lst;
3089 #ifndef DISABLE_OCCVIEWER
3090 viewManagers( OCCViewer_Viewer::Type(), lst );
3091 QListIterator<SUIT_ViewManager*> itOCC( lst );
3092 while ( itOCC.hasNext() )
3094 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3095 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3098 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3101 occVM->setStaticTrihedronDisplayed( isVisible );
3105 #ifndef DISABLE_VTKVIEWER
3106 #ifndef DISABLE_SALOMEOBJECT
3107 viewManagers( SVTK_Viewer::Type(), lst );
3108 QListIterator<SUIT_ViewManager*> itVTK( lst );
3109 while ( itVTK.hasNext() )
3111 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3112 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3115 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3118 vtkVM->setStaticTrihedronVisible( isVisible );
3126 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3128 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3129 QList<SUIT_ViewManager*> lst;
3130 #ifndef DISABLE_OCCVIEWER
3131 viewManagers( OCCViewer_Viewer::Type(), lst );
3132 QListIterator<SUIT_ViewManager*> itOCC( lst );
3133 while ( itOCC.hasNext() )
3135 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3136 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3139 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3140 occVM->setInteractionStyle( mode );
3143 #ifndef DISABLE_VTKVIEWER
3144 #ifndef DISABLE_SALOMEOBJECT
3145 viewManagers( SVTK_Viewer::Type(), lst );
3146 QListIterator<SUIT_ViewManager*> itVTK( lst );
3147 while ( itVTK.hasNext() )
3149 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3150 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3153 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3154 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3160 #ifndef DISABLE_OCCVIEWER
3161 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3163 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3164 QList<SUIT_ViewManager*> lst;
3165 viewManagers( OCCViewer_Viewer::Type(), lst );
3166 QListIterator<SUIT_ViewManager*> it( lst );
3167 while ( it.hasNext() )
3169 SUIT_ViewModel* vm = it.next()->getViewModel();
3170 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3173 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3174 occVM->enablePreselection( isToEnablePreselection );
3179 #ifndef DISABLE_OCCVIEWER
3180 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3182 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3183 QList<SUIT_ViewManager*> lst;
3184 viewManagers( OCCViewer_Viewer::Type(), lst );
3185 QListIterator<SUIT_ViewManager*> it( lst );
3186 while ( it.hasNext() )
3188 SUIT_ViewModel* vm = it.next()->getViewModel();
3189 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3192 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3193 occVM->enableSelection( isToEnableSelection );
3198 #ifndef DISABLE_OCCVIEWER
3199 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3201 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3202 QList<SUIT_ViewManager*> lst;
3203 viewManagers( OCCViewer_Viewer::Type(), lst );
3204 QListIterator<SUIT_ViewManager*> it( lst );
3205 while ( it.hasNext() )
3207 SUIT_ViewModel* vm = it.next()->getViewModel();
3208 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3211 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3212 occVM->setClippingColor( aColor );
3217 #ifndef DISABLE_OCCVIEWER
3218 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3219 param == QString( "clipping_texture" ) ||
3220 param == QString( "clipping_modulate" ) ||
3221 param == QString( "clipping_scale" ) ) )
3223 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3224 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3225 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3226 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3227 QList<SUIT_ViewManager*> lst;
3228 viewManagers( OCCViewer_Viewer::Type(), lst );
3229 QListIterator<SUIT_ViewManager*> it( lst );
3230 while ( it.hasNext() )
3232 SUIT_ViewModel* vm = it.next()->getViewModel();
3233 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3236 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3237 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3242 #ifndef DISABLE_OCCVIEWER
3243 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3245 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3246 QList<SUIT_ViewManager*> lst;
3247 viewManagers( OCCViewer_Viewer::Type(), lst );
3248 QListIterator<SUIT_ViewManager*> it( lst );
3249 while ( it.hasNext() )
3251 SUIT_ViewModel* vm = it.next()->getViewModel();
3252 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3255 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3256 occVM->setProjectionType( mode );
3260 #if OCC_VERSION_LARGE > 0x06090000
3261 #ifndef DISABLE_OCCVIEWER
3262 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3264 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3265 QList<SUIT_ViewManager*> lst;
3266 viewManagers( OCCViewer_Viewer::Type(), lst );
3267 QListIterator<SUIT_ViewManager*> it( lst );
3268 while ( it.hasNext() )
3270 SUIT_ViewModel* vm = it.next()->getViewModel();
3271 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3274 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3275 occVM->setStereoType( mode );
3280 #ifndef DISABLE_OCCVIEWER
3281 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3283 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3284 QList<SUIT_ViewManager*> lst;
3285 viewManagers( OCCViewer_Viewer::Type(), lst );
3286 QListIterator<SUIT_ViewManager*> it( lst );
3287 while ( it.hasNext() )
3289 SUIT_ViewModel* vm = it.next()->getViewModel();
3290 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3293 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3294 occVM->setAnaglyphFilter( mode );
3299 #ifndef DISABLE_OCCVIEWER
3300 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3301 param == QString( "focus_value" ) ) )
3303 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3304 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3305 QList<SUIT_ViewManager*> lst;
3306 viewManagers( OCCViewer_Viewer::Type(), lst );
3307 QListIterator<SUIT_ViewManager*> it( lst );
3308 while ( it.hasNext() )
3310 SUIT_ViewModel* vm = it.next()->getViewModel();
3311 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3314 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3315 occVM->setStereographicFocus( aType, aValue );
3320 #ifndef DISABLE_OCCVIEWER
3321 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3322 param == QString( "iod_value" ) ) )
3324 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3325 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3326 QList<SUIT_ViewManager*> lst;
3327 viewManagers( OCCViewer_Viewer::Type(), lst );
3328 QListIterator<SUIT_ViewManager*> it( lst );
3329 while ( it.hasNext() )
3331 SUIT_ViewModel* vm = it.next()->getViewModel();
3332 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3335 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3336 occVM->setInterocularDistance( aType, aValue );
3341 #ifndef DISABLE_OCCVIEWER
3342 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3344 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3345 QList<SUIT_ViewManager*> lst;
3346 viewManagers( OCCViewer_Viewer::Type(), lst );
3347 QListIterator<SUIT_ViewManager*> it( lst );
3348 while ( it.hasNext() )
3350 SUIT_ViewModel* vm = it.next()->getViewModel();
3351 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3354 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3355 occVM->setReverseStereo( reverse );
3360 #ifndef DISABLE_OCCVIEWER
3361 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3363 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3364 QList<SUIT_ViewManager*> lst;
3365 viewManagers( OCCViewer_Viewer::Type(), lst );
3366 QListIterator<SUIT_ViewManager*> it( lst );
3367 while ( it.hasNext() )
3369 SUIT_ViewModel* vm = it.next()->getViewModel();
3370 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3373 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3374 occVM->setVSync( enable );
3379 #ifndef DISABLE_OCCVIEWER
3380 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3382 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3383 QList<SUIT_ViewManager*> lst;
3384 viewManagers( OCCViewer_Viewer::Type(), lst );
3385 QListIterator<SUIT_ViewManager*> it( lst );
3386 while ( it.hasNext() )
3388 SUIT_ViewModel* vm = it.next()->getViewModel();
3389 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3392 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3393 occVM->setQuadBufferSupport( enable );
3398 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3400 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3401 QList<SUIT_ViewManager*> lst;
3402 #ifndef DISABLE_OCCVIEWER
3403 viewManagers( OCCViewer_Viewer::Type(), lst );
3404 QListIterator<SUIT_ViewManager*> itOCC( lst );
3405 while ( itOCC.hasNext() )
3407 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3408 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3411 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3412 occVM->setZoomingStyle( mode );
3415 #ifndef DISABLE_VTKVIEWER
3416 #ifndef DISABLE_SALOMEOBJECT
3417 viewManagers( SVTK_Viewer::Type(), lst );
3418 QListIterator<SUIT_ViewManager*> itVTK( lst );
3419 while ( itVTK.hasNext() )
3421 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3422 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3425 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3426 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3432 #ifndef DISABLE_VTKVIEWER
3433 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3435 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3436 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3437 QList<SUIT_ViewManager*> lst;
3438 #ifndef DISABLE_SALOMEOBJECT
3439 viewManagers( SVTK_Viewer::Type(), lst );
3440 QListIterator<SUIT_ViewManager*> it( lst );
3441 while ( it.hasNext() )
3443 SUIT_ViewModel* vm = it.next()->getViewModel();
3444 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3447 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3448 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3454 #ifndef DISABLE_VTKVIEWER
3455 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3457 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3458 QList<SUIT_ViewManager*> lst;
3459 #ifndef DISABLE_SALOMEOBJECT
3460 viewManagers( SVTK_Viewer::Type(), lst );
3461 QListIterator<SUIT_ViewManager*> it( lst );
3462 while ( it.hasNext() )
3464 SUIT_ViewModel* vm = it.next()->getViewModel();
3465 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3468 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3469 if( vtkVM ) vtkVM->setProjectionMode( mode );
3475 #ifndef DISABLE_VTKVIEWER
3476 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3478 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3479 QList<SUIT_ViewManager*> lst;
3480 #ifndef DISABLE_SALOMEOBJECT
3481 viewManagers( SVTK_Viewer::Type(), lst );
3482 QListIterator<SUIT_ViewManager*> it( lst );
3483 while ( it.hasNext() )
3485 SUIT_ViewModel* vm = it.next()->getViewModel();
3486 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3489 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3490 if( vtkVM ) vtkVM->setStereoType( mode );
3496 #ifndef DISABLE_VTKVIEWER
3497 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3499 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3500 QList<SUIT_ViewManager*> lst;
3501 #ifndef DISABLE_SALOMEOBJECT
3502 viewManagers( SVTK_Viewer::Type(), lst );
3503 QListIterator<SUIT_ViewManager*> it( lst );
3504 while ( it.hasNext() )
3506 SUIT_ViewModel* vm = it.next()->getViewModel();
3507 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3510 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3511 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3517 #ifndef DISABLE_VTKVIEWER
3518 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3520 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3521 QList<SUIT_ViewManager*> lst;
3522 #ifndef DISABLE_SALOMEOBJECT
3523 viewManagers( SVTK_Viewer::Type(), lst );
3524 QListIterator<SUIT_ViewManager*> it( lst );
3525 while ( it.hasNext() )
3527 SUIT_ViewModel* vm = it.next()->getViewModel();
3528 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3531 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3532 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3538 #ifndef DISABLE_VTKVIEWER
3539 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3541 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3542 QList<SUIT_ViewManager*> lst;
3543 #ifndef DISABLE_SALOMEOBJECT
3544 viewManagers( SVTK_Viewer::Type(), lst );
3545 QListIterator<SUIT_ViewManager*> it( lst );
3546 while ( it.hasNext() )
3548 SUIT_ViewModel* vm = it.next()->getViewModel();
3549 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3552 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3553 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3559 #ifndef DISABLE_VTKVIEWER
3560 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3562 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3563 QList<SUIT_ViewManager*> lst;
3564 #ifndef DISABLE_SALOMEOBJECT
3565 viewManagers( SVTK_Viewer::Type(), lst );
3566 QListIterator<SUIT_ViewManager*> it( lst );
3567 while ( it.hasNext() )
3569 SUIT_ViewModel* vm = it.next()->getViewModel();
3570 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3573 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3574 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3580 #ifndef DISABLE_VTKVIEWER
3581 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3582 param == QString( "spacemouse_func2_btn" ) ||
3583 param == QString( "spacemouse_func5_btn" ) ) )
3585 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3586 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3587 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3588 QList<SUIT_ViewManager*> lst;
3589 #ifndef DISABLE_SALOMEOBJECT
3590 viewManagers( SVTK_Viewer::Type(), lst );
3591 QListIterator<SUIT_ViewManager*> it( lst );
3592 while ( it.hasNext() )
3594 SUIT_ViewModel* vm = it.next()->getViewModel();
3595 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3598 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3599 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3604 if( sec=="ObjectBrowser" )
3606 SUIT_DataBrowser* ob = objectBrowser();
3610 if ( param=="auto_size_first" )
3612 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3613 ob->setAutoSizeFirstColumn( autoSizeFirst );
3614 if ( autoSizeFirst )
3615 ob->adjustFirstColumnWidth();
3617 else if ( param=="auto_size" ) {
3618 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3619 ob->setAutoSizeColumns(autoSize);
3621 ob->adjustColumnsWidth();
3623 else if ( param=="resize_on_expand_item" ) {
3624 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3625 ob->setResizeOnExpandItem(resizeOnExpandItem);
3627 else if ( param == "auto_hide_search_tool" ) {
3628 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3634 if( param=="auto_save_interval" ) {
3635 myAutoSaveTimer->stop();
3636 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3637 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3641 #ifndef DISABLE_PYCONSOLE
3642 if( sec=="PyConsole" && pythonConsole() )
3644 if ( param=="font" ) {
3645 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3647 else if ( param=="show_banner" ) {
3648 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3650 else if ( param=="auto_completion" ) {
3651 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3658 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3660 if ( param == "visible_count" )
3661 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3662 else if ( param == "max_count" )
3663 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3664 else if ( param == "insert_mode" )
3665 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3666 else if ( param == "link_type" )
3667 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3668 else if ( param == "show_clear" )
3669 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3670 else if ( param == "show_mru" )
3671 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3674 if ( sec == "language" && param == "language" )
3676 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3677 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3679 if ( sec == "language" && param == "locale")
3681 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3682 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3684 if ( sec == "desktop" && param == "opaque_resize" ) {
3685 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3686 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3687 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3688 // any dockable window can't be docked to the another area, except initial area.
3689 // It is possible to move window to another area, but it always returns to the initial area.
3691 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3692 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3693 // else dopts &= ~QMainWindow::AnimatedDocks;
3694 // desktop()->setDockOptions( dopts );
3695 desktop()->setOpaqueResize( opaqueResize );
3696 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3697 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3700 #ifndef DISABLE_PLOT2DVIEWER
3701 QList<SUIT_ViewManager*> lst;
3702 viewManagers( Plot2d_Viewer::Type(), lst );
3703 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3704 while ( itPlot2d.hasNext() ) {
3705 SUIT_ViewManager* viewMgr = itPlot2d.next();
3706 SUIT_ViewModel* vm = viewMgr->getViewModel();
3707 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3710 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3712 viewMgr->setViewModel( vm );
3713 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3715 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3716 frame->SetPreference();
3725 void LightApp_Application::loadPreferences()
3727 CAM_Application::loadPreferences();
3729 SUIT_ResourceMgr* aResMgr = resourceMgr();
3734 static bool mru_load = true;
3737 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3739 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3740 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3741 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3742 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3743 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3744 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3745 mru->loadLinks( aResMgr, "MRU" );
3751 QStringList mods = aResMgr->parameters( "windows_visibility" );
3752 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3755 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3756 myWinVis.insert( *itr, arr );
3760 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3761 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3762 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3763 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3764 // else dopts &= ~QMainWindow::AnimatedDocks;
3765 // desktop()->setDockOptions( dopts );
3766 desktop()->setOpaqueResize( opaqueResize );
3767 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3768 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3775 void LightApp_Application::savePreferences()
3777 CAM_Application::savePreferences();
3779 saveDockWindowsState();
3781 SUIT_ResourceMgr* aResMgr = resourceMgr();
3786 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3788 mru->saveLinks( aResMgr, "MRU" );
3790 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3791 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3794 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3796 #if GUI_DEVELOPMENT > 0
3797 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3799 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3806 Updates desktop title
3808 void LightApp_Application::updateDesktopTitle()
3810 QString aTitle = applicationName();
3811 QString aVer = applicationVersion();
3812 if ( !aVer.isEmpty() )
3813 aTitle += QString( " " ) + aVer;
3815 if ( activeStudy() ) {
3816 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3817 aTitle += QString( " - [%1]" ).arg( sName );
3820 desktop()->setWindowTitle( aTitle );
3824 \brief Get map of the operations which can be performed
3825 on the module activation.
3827 The method should return the map of the kind \c {<id>:<name>}
3828 where \c <id> is an integer identifier of the operation and
3829 \c <name> is a title for the button to be added to the
3830 dialog box. After user selects the required operation by the
3831 clicking the corresponding button in the dialog box, its identifier
3832 is passed to the moduleActionSelected() method to process
3835 \return map of the operations
3836 \sa moduleActionSelected()
3838 QMap<int, QString> LightApp_Application::activateModuleActions() const
3840 QMap<int, QString> opmap;
3841 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3842 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3847 \brief Called when the used selectes required operation chosen
3848 from "Activate module" dialog box.
3850 Performs the required operation according to the user choice.
3852 \param id operation identifier
3853 \sa activateModuleActions()
3855 void LightApp_Application::moduleActionSelected( const int id )
3870 Updates windows after close document
3872 void LightApp_Application::afterCloseDoc()
3876 CAM_Application::afterCloseDoc();
3880 Updates actions of active module
3882 void LightApp_Application::updateModuleActions()
3885 if ( activeModule() ) {
3886 modName = activeModule()->moduleName();
3887 if ( !isModuleAccessible( modName ) ) {
3888 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3889 foreach( SUIT_Application* app, apps ) {
3890 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
3891 if ( lapp && lapp != this )
3892 lapp->removeModuleAction( modName );
3897 LightApp_ModuleAction* moduleAction =
3898 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3900 moduleAction->setActiveModule( modName );
3903 void LightApp_Application::removeModuleAction( const QString& modName )
3905 LightApp_ModuleAction* moduleAction =
3906 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3908 moduleAction->removeModule( modName );
3911 bool LightApp_Application::checkModule( const QString& title )
3913 if ( title.isEmpty() )
3916 QString library = moduleLibrary( title, true );
3917 if ( library.isEmpty() )
3920 QString name = moduleName( title );
3922 bool isPyModule = library.contains( "SalomePyQtGUI" ) || library.contains( "SalomePyQtGUILight" );
3926 paths = QString( ::getenv( "PATH" ) ).split( ";", QString::SkipEmptyParts );
3927 #elif defined(__APPLE__)
3928 paths = QString( ::getenv( "DYLD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3930 paths = QString( ::getenv( "LD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3933 bool isFound = false;
3934 QStringList::const_iterator it;
3935 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3937 isFound = QFileInfo( Qtx::addSlash( *it ) + library ).exists();
3943 "****************************************************************" << std::endl <<
3944 " Warning: library " << qPrintable( library ) << " is not found!" << std::endl <<
3945 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3946 "****************************************************************" << std::endl);
3952 QString pyModule = QString( "%1GUI.py" ).arg( name );
3953 paths = QString( ::getenv( "PYTHONPATH" ) ).split( ":", QString::SkipEmptyParts );
3956 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3958 isFound = QFileInfo( Qtx::addSlash( *it ) + pyModule ).exists();
3964 "****************************************************************" << std::endl <<
3965 " Warning: Python module " << qPrintable( pyModule ) << " is not found!" << std::endl <<
3966 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3967 "****************************************************************" << std::endl);
3976 Gets current windows.
3977 \param winMap - output current windows map.
3979 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
3982 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3983 ((LightApp_Module*)activeModule())->windows( winMap );
3985 defaultWindows( winMap );
3989 Gets current view managers.
3990 \param lst - output current view managers list.
3992 void LightApp_Application::currentViewManagers( QStringList& lst ) const
3995 if ( !activeStudy() )
3998 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
3999 ((LightApp_Module*)activeModule())->viewManagers( lst );
4001 defaultViewManagers( lst );
4007 void LightApp_Application::updateWindows()
4009 QMap<int, int> winMap;
4010 currentWindows( winMap );
4012 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
4014 if ( !dockWindow( it.key() ) )
4015 getWindow( it.key() );
4018 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
4020 QWidget* wid = it.value();
4021 if ( winMap.contains( it.key() ) )
4022 wid->setVisible( true );
4027 loadDockWindowsState();
4031 Updates view managers
4033 void LightApp_Application::updateViewManagers()
4036 currentViewManagers( lst );
4038 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
4039 getViewManager( *it, true );
4043 Loads windows geometry
4045 void LightApp_Application::loadDockWindowsState()
4049 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4050 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
4051 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
4054 if ( activeModule() )
4055 modName = activeModule()->name();
4056 else if ( activeStudy() )
4057 modName = "nomodule";
4059 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
4060 QByteArray aDefaultState;
4061 aResMgr->value( "windows_geometry", modName, aDefaultState );
4062 QByteArray aDefaultVisibility;
4063 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
4064 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
4065 aResMgr->setWorkingMode( prevMode );
4067 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
4070 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
4071 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
4073 if ( version > Qtx::versionToId( "7.4.1" ) )
4074 aResMgr->value( "windows_geometry", modName , arr );
4076 arr = aDefaultState;
4077 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4078 desktop()->restoreState( aTargetArray );
4081 QStringList mainToolbarsNames;
4082 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4083 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4084 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4086 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4089 QMap<QString, bool> *tbMap = 0;
4090 QMap<QString, bool> *dwMap = 0;
4092 QMap<QString, bool> userTbMap, userDwMap;
4093 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4095 QMap<QString, bool> defaultTbMap, defaultDwMap;
4096 if(hasDefaultVisibility) {
4097 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4103 if(hasDefaultVisibility){
4104 tbMap = &defaultTbMap;
4111 if(hasDefaultVisibility){
4112 dwMap = &defaultDwMap;
4117 QList<QToolBar*> tbList = findToolBars();
4118 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4120 QToolBar* tb = *tit;
4121 if ( tbMap->contains( tb->objectName() ) ) {
4122 tb->setVisible( (*tbMap)[tb->objectName()] );
4128 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4129 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4131 QDockWidget* dw = *dit;
4133 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4134 if ( po != desktop() )
4137 if ( dwMap->contains( dw->objectName() ) )
4138 dw->setVisible( (*dwMap)[dw->objectName()] );
4146 Saves windows geometry
4148 void LightApp_Application::saveDockWindowsState()
4153 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4154 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4156 if( !storeWin && !storeTb )
4160 if ( activeModule() )
4161 modName = activeModule()->name();
4162 else if ( activeStudy() )
4163 modName = "nomodule";
4165 QString versionId = GUI_VERSION_STR;
4166 #if GUI_DEVELOPMENT > 0
4170 QByteArray arr = desktop()->saveState();
4171 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4172 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4175 if ( myWinVis.contains( modName ) )
4176 visArr = myWinVis[modName];
4178 QMap<QString, bool> tbMap, dwMap;
4179 dockWindowsState( visArr, tbMap, dwMap );
4181 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4182 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4185 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4188 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4189 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4191 QDockWidget* wid = *it;
4192 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4195 visArr = dockWindowsState( tbMap, dwMap );
4197 myWinVis.insert( modName, visArr );
4200 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4203 QDataStream stream( &visArr, QIODevice::WriteOnly );
4205 stream << (uchar)ToolBarMarker;
4206 stream << tb.size();
4207 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4209 stream << tit.key();
4210 stream << (uchar)( tit.value() ? 1 : 0 );
4213 stream << (uchar)DockWidgetMarker;
4214 stream << dw.size();
4215 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4217 stream << wit.key();
4218 stream << (uchar)( wit.value() ? 1 : 0 );
4224 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4229 QByteArray visArr = arr;
4230 QDataStream stream( &visArr, QIODevice::ReadOnly );
4234 if ( marker != ToolBarMarker )
4239 for ( int i = 0; i < lines; ++i )
4242 stream >> objectName;
4245 tb.insert( objectName, shown );
4249 if ( marker != DockWidgetMarker )
4253 for ( int j = 0; j < lines; ++j )
4256 stream >> objectName;
4259 dw.insert( objectName, shown );
4264 Adds icon names for modules
4266 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4270 SUIT_ResourceMgr* resMgr = resourceMgr();
4274 QStringList modList;
4275 modules( modList, false );
4277 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4279 QString modName = *it;
4280 QString modIntr = moduleName( modName );
4281 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4283 if ( modIcon.isEmpty() )
4286 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4287 modIcon += QString( ".png" );
4289 iconMap.insert( modName, modIcon );
4294 Inserts items in popup, which necessary for current application
4296 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4299 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4300 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4301 selMgr->setSelectionCacheEnabled( true );
4303 SUIT_DataBrowser* ob = objectBrowser();
4305 CAM_Application::contextMenuPopup( type, thePopup, title );
4307 if ( ob && type == ob->popupClientType() ) {
4308 thePopup->addSeparator();
4309 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4310 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4311 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4314 #ifndef DISABLE_SALOMEOBJECT
4315 if ( selMgr && ob ) {
4316 SALOME_ListIO selected;
4317 selMgr->selectedObjects( selected );
4318 if(selected.Extent() == 1){
4319 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4320 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4321 if(obj && obj->renameAllowed()) {
4322 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4323 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4324 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4325 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4327 QList<QAction*> acts = thePopup->actions();
4328 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4329 thePopup->insertAction(firstAction,a);
4335 selMgr->setSelectionCacheEnabled( cacheIsOn );
4341 void LightApp_Application::createEmptyStudy()
4343 CAM_Application::createEmptyStudy();
4345 if ( objectBrowser() )
4346 objectBrowser()->updateTree();
4348 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4349 if ( aResMgr && activeStudy() ) {
4350 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4351 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4356 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4358 CAM_Application::setDesktop( desk );
4361 connect( desk, SIGNAL( message( const QString& ) ),
4362 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4363 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4364 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4365 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4366 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4372 \param mod - module to be activated
4374 bool LightApp_Application::activateModule( CAM_Module* mod )
4376 bool res = CAM_Application::activateModule( mod );
4378 if ( objectBrowser() )
4379 objectBrowser()->updateTree();
4385 \return keyborad accelerators manager object
4387 SUIT_Accel* LightApp_Application::accel() const
4393 Removes dead widget container from map
4395 void LightApp_Application::onWCDestroyed( QObject* ob )
4397 // remove destroyed widget container from windows map
4398 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4400 if ( itr.value() != ob )
4403 int key = itr.key();
4404 myWin.remove( key );
4409 void LightApp_Application::onMRUActivated( const QString& name )
4411 SUIT_Session* s = SUIT_Session::session();
4412 if ( s && s->activeApplication() == this )
4416 void LightApp_Application::onStylePreferences()
4418 #ifdef USE_SALOME_STYLE
4419 Style_PrefDlg dlg( desktop() );
4422 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4423 #endif // USE_SALOME_STYLE
4426 void LightApp_Application::onFullScreen(){
4427 if(myScreenHelper) {
4428 if(desktop()->isFullScreen())
4429 myScreenHelper->switchToNormalScreen();
4431 myScreenHelper->switchToFullScreen();
4436 Connects just added view manager
4438 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4440 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4441 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4442 CAM_Application::addViewManager( vm );
4446 Remove view manager from memory
4448 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4450 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4451 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4452 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4454 aStudy->removeObjectProperties( vm->getGlobalId() );
4456 CAM_Application::removeViewManager( vm );
4458 LightApp_SelectionMgr* selMgr = selectionMgr();
4459 QList<SUIT_Selector*> selectors;
4460 selMgr->selectors( selectors );
4461 foreach( SUIT_Selector* selector, selectors ) {
4462 if ( selector->owner() == vm->getViewModel() ) {
4467 // IPAL22894: Crash on closing OCC view
4473 Renames active window of desktop
4475 void LightApp_Application::onRenameWindow()
4480 QWidget* w = desktop()->activeWindow();
4485 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4486 if( ok && !name.isEmpty() )
4487 w->setWindowTitle( name );
4491 Closes active window of desktop
4493 void LightApp_Application::onCloseWindow()
4498 QWidget* w = desktop()->activeWindow();
4506 Closes all windows of desktop
4508 void LightApp_Application::onCloseAllWindow()
4510 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4514 QList<SUIT_ViewWindow*> wndList = desk->windows();
4515 SUIT_ViewWindow* wnd;
4516 foreach( wnd, wndList )
4524 Groups all windows of desktop
4526 void LightApp_Application::onGroupAllWindow()
4528 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4532 QtxWorkstack* wgStack = desk->workstack();
4538 \return default name for an active study
4540 void LightApp_Application::setDefaultStudyName( const QString& theName )
4542 QStringList anInfoList;
4543 modules( anInfoList, false );
4545 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4546 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4547 !aStudy->isSaved() )
4549 aStudy->setStudyName( theName );
4550 updateDesktopTitle();
4555 Custom event handler
4557 bool LightApp_Application::event( QEvent* e )
4559 if( e && e->type()==2000 )
4561 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4562 QString* d = ( QString* )ce->data();
4563 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4565 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4566 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4567 showPreferences( tr( "PREF_APP" ) );
4572 return CAM_Application::event( e );
4575 /*! Check data object */
4576 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4580 bool isSuitable = !theObj->entry().isEmpty() &&
4581 !theObj->componentDataType().isEmpty() &&
4582 !theObj->name().isEmpty();
4589 int LightApp_Application::openChoice( const QString& aName )
4591 int choice = CAM_Application::openChoice( aName );
4593 if ( choice == OpenExist ) // The document is already open.
4595 // Do you want to reload it?
4596 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4597 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4598 choice = OpenReload;
4604 bool LightApp_Application::openAction( const int choice, const QString& aName )
4611 STD_Application* app = 0;
4612 SUIT_Session* session = SUIT_Session::session();
4613 QList<SUIT_Application*> appList = session->applications();
4614 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4616 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4617 app = ::qobject_cast<STD_Application*>( *it );
4622 app->onCloseDoc( false );
4623 appList = session->applications();
4624 STD_Application* other = 0;
4625 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4626 other = ::qobject_cast<STD_Application*>( *it );
4629 res = other->onOpenDoc( aName );
4634 res = CAM_Application::openAction( choice, aName );
4641 QStringList LightApp_Application::viewManagersTypes() const
4643 QStringList aTypesList;
4644 aTypesList += myUserWmTypes;
4645 #ifndef DISABLE_GLVIEWER
4646 aTypesList<<GLViewer_Viewer::Type();
4648 #ifndef DISABLE_PLOT2DVIEWER
4649 aTypesList<<Plot2d_Viewer::Type();
4651 #ifndef DISABLE_QXGRAPHVIEWER
4652 aTypesList<<QxScene_Viewer::Type();
4654 #ifndef DISABLE_PVVIEWER
4655 aTypesList<<PVViewer_Viewer::Type();
4657 #ifndef DISABLE_PYVIEWER
4658 aTypesList<<PyViewer_Viewer::Type();
4660 #ifndef DISABLE_OCCVIEWER
4661 aTypesList<<OCCViewer_Viewer::Type();
4663 #ifndef DISABLE_VTKVIEWER
4664 #ifndef DISABLE_SALOMEOBJECT
4665 aTypesList<<SVTK_Viewer::Type();
4667 aTypesList<<VTKViewer_Viewer::Type();
4673 * Removes all view managers of known types
4674 * Other view managers are ignored
4676 void LightApp_Application::clearKnownViewManagers()
4678 QStringList aTypesList = viewManagersTypes();
4679 QList<SUIT_ViewManager*> aMgrList;
4680 viewManagers( aMgrList );
4681 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4682 if (aTypesList.contains(aMgr->getType()))
4683 removeViewManager(aMgr);
4688 Copy of current selection
4690 void LightApp_Application::onCopy()
4692 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4698 Paste of current data in clipboard
4700 void LightApp_Application::onPaste()
4702 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4708 Browse (i.e. set focus on) the published objects
4709 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4710 has been accepted by Ok (or Apply & Close) button
4711 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4712 (to select the first published object only)
4713 \return entry of the selected object
4715 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4716 const bool theIsApplyAndClose,
4717 const bool theIsOptimizedBrowsing )
4720 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4722 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4723 switch( aBrowsePolicy )
4727 case BP_ApplyAndClose:
4728 if( !theIsApplyAndClose )
4736 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4740 SUIT_DataBrowser* anOB = objectBrowser();
4744 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4748 QStringListIterator anIter( theEntryList );
4749 if( theIsOptimizedBrowsing )
4751 // go to the last entry
4753 if( anIter.hasPrevious() )
4757 // scroll to each entry in the list
4758 // (in optimized mode - to the last entry only)
4760 LightApp_DataObject* anObject = 0;
4761 while( anIter.hasNext() )
4763 anEntry = anIter.next();
4764 if( !anEntry.isEmpty() )
4766 anObject = aStudy->findObjectByEntry( anEntry );
4769 QModelIndex anIndex = aModel->index( anObject );
4770 anOB->treeView()->scrollTo( anIndex );
4775 // always select the last object
4776 if( anObject && !anEntry.isEmpty() )
4778 QList<SUIT_Selector*> aSelectorList;
4779 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4780 if( !aSelectorList.isEmpty() )
4782 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4784 bool anIsAutoBlock = aSelector->autoBlock();
4786 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4787 aSelector->setAutoBlock( false );
4789 SUIT_DataOwnerPtrList aList;
4790 #ifndef DISABLE_SALOMEOBJECT
4791 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4792 ( anObject->entry().toLatin1().constData(),
4793 anObject->componentDataType().toLatin1().constData(),
4794 anObject->name().toLatin1().constData() );
4795 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4797 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4800 aList.append( owner );
4801 selectionMgr()->setSelected( aList );
4804 // restore auto block flag
4805 aSelector->setAutoBlock( anIsAutoBlock );
4813 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4815 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4816 return study ? study->findObjectByEntry( id ) : 0;
4820 Checks that an object can be renamed.
4821 \param entry entry of the object
4822 \brief Return \c true if object can be renamed
4824 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4829 Rename object by entry.
4830 \param entry entry of the object
4831 \param name new name of the object
4832 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4834 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4838 /*! Process standard messages from desktop */
4839 void LightApp_Application::onDesktopMessage( const QString& message )
4841 const QString sectionSeparator = "/";
4843 if ( message.toLower() == "updateobjectbrowser" ||
4844 message.toLower() == "updateobjbrowser" ) {
4845 // update object browser
4846 updateObjectBrowser();
4848 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4849 QString vtype = message.split( sectionSeparator ).last();
4850 if ( !vtype.isEmpty() )
4851 getViewManager( vtype, true );
4854 QStringList data = message.split( sectionSeparator );
4855 if ( data.count() > 1 ) {
4856 QString msgType = data[0].trimmed();
4857 LightApp_Module* sMod = 0;
4858 CAM_Module* mod = module( msgType );
4860 mod = module( moduleTitle( msgType ) );
4861 if ( mod && mod->inherits( "LightApp_Module" ) )
4862 sMod = (LightApp_Module*)mod;
4864 if ( msgType.toLower() == "preferences" ) {
4865 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4866 // for example "preferences/Study/multi_file_dump/true"
4867 if ( data.count() > 3 ) {
4868 QString section = data[1].trimmed();
4869 QString param = data[2].trimmed();
4870 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4871 resourceMgr()->setValue( section, param, value );
4875 // received message for the module
4876 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4877 sMod->message( msg );
4885 Returns all top level toolbars.
4886 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4888 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4890 QList<QToolBar*> aResult;
4891 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4892 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4893 QToolBar* tb = *tit;
4894 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4895 if ( po != desktop() )
4897 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4904 Internal method to parse toolbars and dockable windows state.
4906 QByteArray LightApp_Application::processState(QByteArray& input,
4907 const bool processWin,
4908 const bool processTb,
4909 const bool isRestoring,
4910 QByteArray defaultState) {
4913 bool hasDefaultState = !defaultState.isEmpty();
4914 bool isDockWinWriten = false;
4916 //Write date from users settings
4918 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4919 int marker, version;
4921 tmpInputData >> marker;
4922 tmpInputData >> version;
4923 tmpInputData >> dockmarker;
4924 tmpInputData >> nbDocWin;
4926 if(processWin && processTb && !isRestoring) {
4928 } else if(!processWin && !processTb ) {
4930 aRes = defaultState;
4932 QDataStream aData(&aRes, QIODevice::WriteOnly);
4933 QList<QToolBar*> aToolBars = findToolBars();
4936 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4937 QToolBar* tb = *tit;
4938 aNames.append(tb->objectName());
4941 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
4942 if(toolBarMarkerIndex < 0)
4944 QDataStream anInputData(&input, QIODevice::ReadOnly);
4946 int toolBarMarkerIndexDef;
4947 if(hasDefaultState) {
4948 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
4949 if(toolBarMarkerIndexDef < 0)
4952 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
4954 QDataStream* aTargetData = 0;
4955 int aTargetIndex = -1;
4957 QByteArray currentArr = desktop()->saveState();
4958 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
4959 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
4960 if(processWin && useInputData) {
4961 aTargetData = &anInputData;
4962 aTargetIndex = toolBarMarkerIndex;
4964 //Write date from default settings
4965 if(hasDefaultState) {
4966 aTargetData = &anInputDataDef;
4967 aTargetIndex = toolBarMarkerIndexDef;
4969 //If no default state, write current snapshot of the dockable windows
4971 aTargetData = &anInputDataCur;
4972 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
4973 aTargetIndex = toolBarMarkerIndexCur;
4978 if(aTargetData && aTargetIndex >= 0 ) {
4979 aTargetData->device()->seek(0);
4980 while( aTargetData->device()->pos() < aTargetIndex ) {
4985 isDockWinWriten = true;
4992 aTargetData = &anInputData;
4993 aTargetIndex = toolBarMarkerIndex;
4995 if(hasDefaultState) {
4996 aTargetData = &anInputDataDef;
4997 aTargetIndex = toolBarMarkerIndexDef;
5001 if(aTargetData && aTargetIndex >= 0) {
5003 if(!isDockWinWriten ) {
5004 //Write version marker
5005 int marker, version;
5006 aTargetData->device()->seek(0);
5007 *aTargetData >> marker;
5008 *aTargetData >> version;
5011 aData << (uchar) QDockWidgetMarker;
5013 int shift = 4*sizeof(int) + sizeof(QSize);
5014 index = aTargetIndex - shift;
5016 index = aTargetIndex;
5019 aTargetData->device()->seek(index);
5020 while(!aTargetData->atEnd()) {
5025 } else { // Not treat toolbars
5026 aData << (uchar) QToolBarMarker;
5027 aData << (int) 0; //Nb toolbars = 0
5034 \brief Emits operationFinished signal.
5035 \param theModuleName the name of the module which perfomed the operation
5036 \param theOperationName the operation name
5037 \param theEntryList the list of the created objects entries
5039 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5040 const QString& theOperationName,
5041 const QStringList& theEntryList )
5043 emit operationFinished( theModuleName, theOperationName, theEntryList );
5047 Update visibility state of given objects
5049 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5050 SUIT_ViewModel* theViewModel )
5052 if ( !theViewModel || theList.isEmpty() ) return;
5054 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5055 if ( !aStudy ) return;
5057 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5059 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5060 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5062 if ( !obj || aStudy->isComponent( obj->entry() ) )
5065 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5066 if ( anObjModule ) {
5067 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5069 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5070 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5071 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5072 anObjState = Qtx::ShownState;
5074 anObjState = Qtx::HiddenState;
5076 aStudy->setVisibilityState( obj->entry(), anObjState );
5083 * Called when window activated
5085 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5087 SUIT_DataBrowser* anOB = objectBrowser();
5090 SUIT_DataObject* rootObj = anOB->root();
5094 DataObjectList listObj = rootObj->children( true );
5096 SUIT_ViewModel* vmod = 0;
5097 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5098 vmod = vman->getViewModel();
5099 updateVisibilityState( listObj, vmod );
5103 Called then view manager removed
5105 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5107 ViewManagerList lst;
5108 viewManagers( lst );
5109 if ( lst.count() == 1) { // in case if closed last view window
5110 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5112 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5117 Check existing document.
5119 bool LightApp_Application::checkExistingDoc()
5122 if( activeStudy() ) {
5123 int answer = SUIT_MessageBox::question( desktop(),
5124 tr( "APPCLOSE_CAPTION" ),
5125 tr( "STUDYCLOSE_DESCRIPTION" ),
5126 tr( "APPCLOSE_SAVE" ),
5127 tr( "APPCLOSE_CLOSE" ),
5128 tr( "APPCLOSE_CANCEL" ), 0 );
5130 if ( activeStudy()->isSaved() ) {
5133 } else if ( onSaveAsDoc() ) {
5134 if( !closeDoc( false ) ) {
5141 else if( answer == 1 ) {
5143 } else if( answer == 2 ) {
5150 #ifndef DISABLE_PYCONSOLE
5152 PyConsole_Interp* LightApp_Application::getPyInterp()
5154 static PyConsole_Interp* myInterp = 0;
5156 myInterp = createPyInterp();
5157 myInterp->initialize();
5162 PyConsole_Interp* LightApp_Application::createPyInterp()
5164 return new PyConsole_Interp();
5167 #endif // DISABLE_PYCONSOLE