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 "PyConsole_Interp.h"
39 #include "LightApp_PyEditor.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>
196 #include <utilities.h>
198 #define FIRST_HELP_ID 1000000
200 #ifndef DISABLE_SALOMEOBJECT
201 #include <SALOME_InteractiveObject.hxx>
202 #include <SALOME_ListIO.hxx>
205 #include <Standard_Version.hxx>
207 #define ToolBarMarker 0
208 #define DockWidgetMarker 1
210 static const char* imageEmptyIcon[] = {
213 "....................",
214 "....................",
215 "....................",
216 "....................",
217 "....................",
218 "....................",
219 "....................",
220 "....................",
221 "....................",
222 "....................",
223 "....................",
224 "....................",
225 "....................",
226 "....................",
227 "....................",
228 "....................",
229 "....................",
230 "....................",
231 "....................",
232 "...................."};
234 // Markers used to parse array with dockable windows and toolbars state.
235 // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp
236 // in the Qt source code.
238 #define QDockWidgetMarker 0xfd // = DockWidgetStateMarker
239 #define QToolBarMarker 0xfc // = ToolBarStateMarkerEx
241 // Format of the Byte array with the windows and toolbar state is:
242 // VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData...
244 //Find toolbar marker position in the array in the following way:
245 //since the 'toolbar marker' is not unique, find index of first occurrence of the
246 //'toolbar marker' in the array and check that next string is name of the toolbar
248 void LightAppCleanUpAppResources()
250 if ( LightApp_Application::_prefs_ ) {
251 delete LightApp_Application::_prefs_;
252 LightApp_Application::_prefs_ = 0;
258 int getToolbarMarkerIndex( QByteArray input, const QStringList& aFlags ) {
259 int aResult = -1,tmp = 0;
260 int inputLen = input.length();
261 QDataStream anInputData( &input, QIODevice::ReadOnly );
262 while ( tmp < inputLen ) {
263 tmp = input.indexOf( QToolBarMarker, tmp + 1 );
266 anInputData.device()->seek( tmp );
270 anInputData >> lines;
272 if ( lines == 0 && anInputData.atEnd() ) {
273 //Case then array doesn't contain information about toolbars,
284 if ( aFlags.contains( str ) ) {
292 QString langToName( const QString& lang )
294 // special processing for English language to avoid such result as "American English"
295 // as Qt cannot just say "English"
300 result = QLocale( lang ).nativeLanguageName();
305 /*!Create new instance of LightApp_Application.*/
306 extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication()
308 return new LightApp_Application();
311 /*! \var global preferences of LightApp */
312 LightApp_Preferences* LightApp_Application::_prefs_ = 0;
316 \class LightApp_Application
317 Application containing LightApp module
321 LightApp_Application::LightApp_Application()
322 : CAM_Application( false ),
324 myScreenHelper(new LightApp_FullScreenHelper())
326 Q_INIT_RESOURCE( LightApp );
328 STD_TabDesktop* desk = new STD_TabDesktop();
329 desk->setFullScreenAllowed(false);
330 desk->setMinimizeAllowed(false);
334 // initialize auto save timer
335 myAutoSaveTimer = new QTimer( this );
336 myAutoSaveTimer->setSingleShot( true );
337 connect( myAutoSaveTimer, SIGNAL( timeout() ), this, SLOT( onSaveDoc() ) );
339 //connect( this, SIGNAL( moving() ), this, SLOT( onMoved() ) );
341 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
342 QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
344 desktop()->setWindowIcon( aLogo );
345 desktop()->setDockableMenuBar( false );
346 desktop()->setDockableStatusBar( false );
348 // base logo (salome itself)
349 desktop()->logoInsert( "_app_base", aResMgr->loadPixmap( "LightApp", tr( "APP_BASE_LOGO" ), false ) );
350 // extra logo (salome-based application)
351 desktop()->logoInsert( "_app_extra", aResMgr->loadPixmap( "LightApp", tr( "APP_EXTRA_LOGO" ), false ) );
355 mySelMgr = new LightApp_SelectionMgr( this );
357 myAccel = SUIT_Accel::getAccel();
359 #ifndef DISABLE_OCCVIEWER
360 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, OCCViewer_Viewer::Type() );
361 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, OCCViewer_Viewer::Type() );
362 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, OCCViewer_Viewer::Type() );
363 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, OCCViewer_Viewer::Type() );
364 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() );
365 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() );
366 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() );
367 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() );
368 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() );
369 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() );
370 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() );
371 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, OCCViewer_Viewer::Type() );
373 #ifndef DISABLE_VTKVIEWER
374 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, VTKViewer_Viewer::Type() );
375 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, VTKViewer_Viewer::Type() );
376 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, VTKViewer_Viewer::Type() );
377 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, VTKViewer_Viewer::Type() );
378 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() );
379 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() );
380 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() );
381 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() );
382 myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() );
383 myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() );
384 myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() );
385 myAccel->setActionKey( SUIT_Accel::RotateDown, Qt::ALT+Qt::Key_Down, VTKViewer_Viewer::Type() );
387 #ifndef DISABLE_PLOT2DVIEWER
388 myAccel->setActionKey( SUIT_Accel::PanLeft, Qt::CTRL+Qt::Key_Left, Plot2d_Viewer::Type() );
389 myAccel->setActionKey( SUIT_Accel::PanRight, Qt::CTRL+Qt::Key_Right, Plot2d_Viewer::Type() );
390 myAccel->setActionKey( SUIT_Accel::PanUp, Qt::CTRL+Qt::Key_Up, Plot2d_Viewer::Type() );
391 myAccel->setActionKey( SUIT_Accel::PanDown, Qt::CTRL+Qt::Key_Down, Plot2d_Viewer::Type() );
392 myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() );
393 myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() );
394 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() );
395 myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() );
398 connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) );
399 connect( desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
400 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
401 connect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
402 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ), Qt::UniqueConnection );
405 // Set existing font for the python console in resources
406 if( !aResMgr->hasValue( "PyConsole", "font" ) )
409 QFont f = aResMgr->fontValue( "PyConsole", "font" );
411 QStringList famdb = fdb.families();
413 if ( famdb.contains(f.family()) || !aResMgr->hasValue( "PyConsole", "additional_families" ) )
416 QStringList anAddFamilies = aResMgr->stringValue( "PyConsole", "additional_families" ).split( ";", QString::SkipEmptyParts );
418 for ( QStringList::Iterator it = anAddFamilies.begin(); it != anAddFamilies.end(); ++it )
421 if ( famdb.contains(aFamily) )
423 f.setFamily( aFamily );
424 aResMgr->setValue( "PyConsole", "font", f );
431 *\li Save window geometry.
432 *\li Save desktop geometry.
433 *\li Save resource maneger.
434 *\li Delete selection manager.
436 LightApp_Application::~LightApp_Application()
440 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();
461 /*!Closeapplication.*/
462 void LightApp_Application::closeApplication()
464 #ifndef DISABLE_QTXWEBBROWSER
465 QProcess::startDetached( "HelpBrowser",
466 QStringList() << QString( "--remove=%1" ).arg( QApplication::instance()->applicationPid() ) );
468 CAM_Application::closeApplication();
471 /*!Gets application name.*/
472 QString LightApp_Application::applicationName() const
474 static QString _app_name;
475 if ( _app_name.isEmpty() )
476 _app_name = tr( "APP_NAME" );
480 /*!Gets application version.*/
481 QString LightApp_Application::applicationVersion() const
483 static QString _app_version;
485 if ( _app_version.isEmpty() )
487 QString resVersion = tr( "APP_VERSION" );
488 if ( resVersion != "APP_VERSION" )
490 _app_version = resVersion;
494 _app_version = GUI_VERSION_STR;
500 /*!Load module by \a name.*/
501 CAM_Module* LightApp_Application::loadModule( const QString& name, const bool showMsg )
503 CAM_Module* mod = CAM_Application::loadModule( name, showMsg );
506 connect( this, SIGNAL( studyOpened() ), mod, SLOT( onModelOpened() ) );
507 connect( this, SIGNAL( studySaved() ), mod, SLOT( onModelSaved() ) );
508 connect( this, SIGNAL( studyClosed() ), mod, SLOT( onModelClosed() ) );
513 /*!Activate module by \a modName*/
514 bool LightApp_Application::activateModule( const QString& modName )
517 CAM_Module* prevMod = activeModule();
520 actName = prevMod->moduleName();
522 if ( actName == modName )
525 putInfo( tr( "ACTIVATING_MODULE" ).arg( modName ) );
527 saveDockWindowsState();
529 bool status = CAM_Application::activateModule( modName );
531 updateModuleActions();
539 updateViewManagers();
541 if ( activeStudy() && activeStudy()->root() && objectBrowser() ) {
542 if ( objectBrowser()->root() != activeStudy()->root() )
543 objectBrowser()->setRoot( activeStudy()->root() );
544 updateObjectBrowser( true );
547 if ( activeModule() ) activeModule()->updateModuleVisibilityState();
553 /*!Gets selection manager.*/
554 LightApp_SelectionMgr* LightApp_Application::selectionMgr() const
559 /*!Creat action "New window" for certain type of viewer:*/
560 void LightApp_Application::createActionForViewer( const int id,
562 const QString& suffix,
565 QString vtlt = tr( QString( "NEW_WINDOW_%1" ).arg( suffix ).toLatin1().constData() );
566 QString tip = tr( "CREATING_NEW_WINDOW" ).arg( vtlt.remove( "&" ) );
567 QAction* a = createAction( id, // menu action id
574 false, // toggle flag
576 SLOT( onNewWindow() ) ); // slot
577 createMenu( a, parentId, -1 );
582 void LightApp_Application::createActions()
584 CAM_Application::createActions();
586 SUIT_Desktop* desk = desktop();
587 SUIT_ResourceMgr* resMgr = resourceMgr();
590 createAction( PreferencesId, tr( "TOT_DESK_PREFERENCES" ), QIcon(),
591 tr( "MEN_DESK_PREFERENCES" ), tr( "PRP_DESK_PREFERENCES" ),
592 Qt::CTRL+Qt::Key_P, desk, false, this, SLOT( onPreferences() ) );
596 int helpMenu = createMenu( tr( "MEN_DESK_HELP" ), -1, -1, 1000 );
598 int id = LightApp_Application::UserID + FIRST_HELP_ID;
600 // a) Link to web site
601 QString url = resMgr->stringValue("GUI", "site_url");
602 if ( !url.isEmpty() ) {
603 QString title = tr ( "SALOME_SITE" );
604 QAction* as = createAction( id, title,
605 resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
607 0, desk, false, this, SLOT( onHelpOnline() ) );
609 createMenu( as, helpMenu, -1, 0 );
614 url = resMgr->stringValue("GUI", "forum_url");
615 if ( !url.isEmpty() ) {
616 QString title = tr ( "SALOME_FORUM" );
617 QAction* af = createAction( helpMenu, title,
618 resMgr->loadPixmap( "LightApp", tr( "ICON_WWW" ), false ),
620 0, desk, false, this, SLOT( onHelpOnline() ) );
622 createMenu( af, helpMenu, -1, 0 );
626 // c) Link to YouTube channel
627 url = resMgr->stringValue("GUI", "channel_url");
628 if ( !url.isEmpty() ) {
629 createMenu( separator(), helpMenu, -1, 0 );
630 QString title = tr ( "SALOME_VIDEO_TUTORIALS" );
631 QAction* av = createAction( helpMenu, title,
632 resMgr->loadPixmap( "LightApp", tr( "ICON_LIFE_RIGN" ), false ),
634 0, desk, false, this, SLOT( onHelpOnline() ) );
636 createMenu( av, helpMenu, -1, 0 );
640 // d) Help for modules
642 // - First create top-level menus to preserve correct order
643 QString userGuide = "User's Guide";
644 QString devGuide = "Developer's Guide";
645 createMenu( userGuide, helpMenu, -1, 5 );
646 createMenu( devGuide, helpMenu, -1, 5 );
648 QStringList aModuleList;
649 modules( aModuleList, false );
650 aModuleList.prepend( "GUI" );
651 aModuleList.prepend( "KERNEL" );
654 foreach( aModule, aModuleList ) {
655 if ( aModule.isEmpty() ) // module title (user name)
657 IMap <QString, QString> helpData; // list of help files for the module
658 QString helpSubMenu; // help submenu name (empty if not needed)
659 QString modName = moduleName( aModule ); // module name
660 if ( modName.isEmpty() ) modName = aModule; // for KERNEL and GUI
661 QString rootDir = QString( "%1_ROOT_DIR" ).arg( modName ); // module root dir env variable
662 QString modDir = getenv( rootDir.toLatin1().constData() ); // module root dir path
664 if (resMgr->hasValue( modName, "documentation" ) )
665 docSection = resMgr->stringValue(modName, "documentation");
666 else if ( resMgr->hasSection( modName + "_documentation" ) )
667 docSection = modName + "_documentation";
668 if ( !docSection.isEmpty() ) {
669 helpSubMenu = resMgr->stringValue( docSection, "sub_menu", "" ).arg( aModule );
670 QStringList listOfParam = resMgr->parameters( docSection );
671 foreach( QString paramName, listOfParam ) {
672 QString valueStr = resMgr->stringValue( docSection, paramName );
673 if ( !valueStr.isEmpty() ) {
674 QFileInfo fi( valueStr );
675 if ( fi.isRelative() && !modDir.isEmpty() )
676 valueStr = Qtx::addSlash( modDir ) + valueStr;
677 if ( QFile::exists( valueStr ) )
678 helpData.insert( paramName.arg( aModule ), valueStr );
683 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
684 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
685 QString indexFile = idxLst.join( QDir::separator() ); // index file
686 if ( QFile::exists( indexFile ) )
687 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
690 IMapConstIterator<QString, QString > fileIt;
691 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
692 QString helpFileName = fileIt.key();
693 // remove all '//' occurances
694 while ( helpFileName.contains( "//" ) )
695 helpFileName.replace( "//", "" );
696 // obtain submenus hierarchy if given
697 QStringList smenus = helpFileName.split( "/" );
698 helpFileName = smenus.takeLast();
699 // workaround for User's Guide and Developer's Guide to avoid having single item in module's submenu.
700 if ( helpFileName == userGuide || helpFileName == devGuide ) {
701 QString menuPath = smenus.join( "/" );
702 QStringList allKeys = helpData.keys();
703 QStringList total = allKeys.filter( QRegExp( QString( "^%1" ).arg( menuPath ) ) );
704 if ( total.count() == 1 && smenus.count() > 0 )
705 helpFileName = smenus.takeLast();
707 QAction* a = createAction( id, helpFileName,
708 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
709 helpFileName, helpFileName,
710 0, desk, false, this, SLOT( onHelpContentsModule() ) );
711 a->setData( fileIt.value() );
712 if ( !helpSubMenu.isEmpty() ) {
713 smenus.prepend( helpSubMenu );
715 // create sub-menus hierarchy
716 int menuId = helpMenu;
717 foreach ( QString subMenu, smenus )
718 menuId = createMenu( subMenu, menuId, -1, 5 );
719 createMenu( a, menuId, -1, ( menuId != helpMenu && (helpFileName == userGuide || helpFileName == devGuide) ) ? 0 : 5 );
724 // - Additional help items
726 createMenu( separator(), helpMenu, -1, 10 );
728 QStringList addHelpItems = resMgr->parameters( "add_help" );
729 foreach ( QString addHelpItem, addHelpItems ) {
730 QString valueStr = resMgr->stringValue( "add_help", addHelpItem );
731 if ( !valueStr.isEmpty() && QFile::exists( valueStr ) ) {
732 QAction* a = createAction( id, addHelpItem,
733 resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false ),
734 addHelpItem, addHelpItem,
735 0, desk, false, this, SLOT( onHelpContentsModule() ) );
736 a->setData( valueStr );
737 createMenu( a, helpMenu, -1, 10 );
743 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
744 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
745 registerAction( MRUId, mru );
747 // default icon for neutral point ('SALOME' module)
748 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
749 if ( defIcon.isNull() )
750 defIcon = QPixmap( imageEmptyIcon );
752 //! default icon for any module
753 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
754 if ( modIcon.isNull() )
755 modIcon = QPixmap( imageEmptyIcon );
758 modules( modList, false );
760 if ( modList.count() > 1 )
762 LightApp_ModuleAction* moduleAction =
763 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
765 QMap<QString, QString> iconMap;
766 moduleIconNames( iconMap );
768 const int iconSize = 20;
770 QStringList::Iterator it;
771 for ( it = modList.begin(); it != modList.end(); ++it )
773 if ( !isModuleAccessible( *it ) )
776 QString modName = moduleName( *it );
779 if ( iconMap.contains( *it ) )
780 iconName = iconMap[*it];
782 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
787 "****************************************************************" << std::endl <<
788 " Warning: icon for " << qPrintable(*it) << " is not found!" << std::endl <<
789 " Using the default icon." << std::endl <<
790 "****************************************************************" << std::endl);
792 icon = Qtx::scaleIcon( icon, iconSize );
794 moduleAction->insertModule( *it, icon );
797 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
798 this, SLOT( onModuleActivation( const QString& ) ) );
799 registerAction( ModulesListId, moduleAction );
803 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
804 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
806 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
807 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
808 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
809 0, desk, false, this, SLOT( onCloseAllWindow() ) );
810 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
811 0, desk, false, this, SLOT( onGroupAllWindow() ) );
813 createMenu( CloseId, windowMenu, 0, -1 );
814 createMenu( CloseAllId, windowMenu, 0, -1 );
815 createMenu( GroupAllId, windowMenu, 0, -1 );
816 createMenu( separator(), windowMenu, -1, 0 );
818 #ifndef DISABLE_GLVIEWER
819 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
821 #ifndef DISABLE_PLOT2DVIEWER
822 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
824 #ifndef DISABLE_OCCVIEWER
825 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
827 #ifndef DISABLE_VTKVIEWER
828 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
830 #ifndef DISABLE_QXGRAPHVIEWER
831 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
833 #ifndef DISABLE_GRAPHICSVIEW
834 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
836 #ifndef DISABLE_PVVIEWER
837 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
839 #ifndef DISABLE_PYVIEWER
840 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
843 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
844 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
845 createMenu( RenameId, windowMenu, -1 );
847 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
848 createMenu( PreferencesId, fileMenu, 50, -1 );
849 createMenu( separator(), fileMenu, -1, 50, -1 );
851 createMenu( separator(), fileMenu, -1, 100, -1 );
852 createMenu( MRUId, fileMenu, 100, -1 );
853 createMenu( separator(), fileMenu, -1, 100, -1 );
855 #ifdef USE_SALOME_STYLE
856 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
857 0, desk, false, this, SLOT( onStylePreferences() ) );
858 #endif // USE_SALOME_STYLE
860 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
861 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
864 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
865 createMenu( separator(), viewMenu, -1, 20, -1 );
866 #ifdef USE_SALOME_STYLE
867 createMenu( StyleId, viewMenu, 20, -1 );
868 #endif // USE_SALOME_STYLE
869 createMenu( FullScreenId, viewMenu, 20, -1 );
871 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
872 QString( "SalomeModules" ) ); // name (language-independant)
873 createTool( ModulesListId, modTBar );
876 /*!On module activation action.*/
877 void LightApp_Application::onModuleActivation( const QString& modName )
879 // Force user to create/open a study before module activation
880 QMap<QString, QString> iconMap;
881 moduleIconNames( iconMap );
882 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
884 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
886 bool cancelled = false;
888 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
889 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
890 QMap<int, QString> opmap = activateModuleActions();
891 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
892 aDlg.addButton( it.value(), it.key() );
894 int res = aDlg.exec();
896 // some operation is selected
897 moduleActionSelected( res );
901 putInfo( tr("INF_CANCELLED") );
903 LightApp_ModuleAction* moduleAction =
904 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
906 moduleAction->setActiveModule( QString() );
912 activateModule( modName );
915 /*!Default module activation.*/
916 QString LightApp_Application::defaultModule() const
918 QStringList aModuleNames;
919 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
920 //! If there's the one and only module --> activate it automatically
921 //! TODO: Possible improvement - default module can be taken from preferences
922 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
925 /*!On new window slot.*/
926 void LightApp_Application::onNewWindow()
928 const QObject* obj = sender();
929 if ( !obj || !obj->inherits( "QAction" ) )
933 int id = actionId( (QAction*)obj );
936 #ifndef DISABLE_GLVIEWER
938 type = GLViewer_Viewer::Type();
941 #ifndef DISABLE_PLOT2DVIEWER
943 type = Plot2d_Viewer::Type();
946 #ifndef DISABLE_OCCVIEWER
948 type = OCCViewer_Viewer::Type();
951 #ifndef DISABLE_VTKVIEWER
953 type = VTKViewer_Viewer::Type();
956 #ifndef DISABLE_QXGRAPHVIEWER
957 case NewQxSceneViewId:
958 type = QxScene_Viewer::Type();
961 #ifndef DISABLE_GRAPHICSVIEW
962 case NewGraphicsViewId:
963 type = GraphicsView_Viewer::Type();
966 #ifndef DISABLE_PVVIEWER
968 type = PVViewer_Viewer::Type();
971 #ifndef DISABLE_PYVIEWER
973 type = PyViewer_Viewer::Type();
978 if ( !type.isEmpty() )
979 createViewManager( type );
983 SLOT: Creates new document
985 void LightApp_Application::onNewDoc()
987 if ( !checkExistingDoc() )
990 //asl: fix for 0020515
991 saveDockWindowsState();
993 CAM_Application::onNewDoc();
997 SLOT: Opens new document
999 void LightApp_Application::onOpenDoc()
1001 SUIT_Study* study = activeStudy();
1003 if ( !checkExistingDoc() )
1006 CAM_Application::onOpenDoc();
1008 if ( !study ) // new study will be create in THIS application
1011 updateViewManagers();
1016 SLOT: Opens new document.
1017 \param aName - name of file
1019 bool LightApp_Application::onOpenDoc( const QString& aName )
1021 if ( !checkExistingDoc() )
1024 saveDockWindowsState();
1026 // We should take mru action first because this application instance can be deleted later.
1027 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1029 bool res = CAM_Application::onOpenDoc( aName );
1034 mru->insert( aName );
1036 mru->remove( aName );
1042 SLOT: Displays "About" message box
1044 void LightApp_Application::onHelpAbout()
1046 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1051 Private SLOT: Called on selection is changed
1052 Dispatchs active module that selection is changed
1054 void LightApp_Application::onSelection()
1056 //MESSAGE("onSelection")
1057 onSelectionChanged();
1059 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1060 ((LightApp_Module*)activeModule())->selectionChanged();
1065 \param study - SUIT_Study.
1067 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1069 CAM_Application::setActiveStudy( study );
1073 Enables/Disables menu items and toolbar buttons. Rebuild menu
1075 void LightApp_Application::updateCommandsStatus()
1077 CAM_Application::updateCommandsStatus();
1080 #ifndef DISABLE_GLVIEWER
1081 a = action( NewGLViewId );
1083 a->setEnabled( activeStudy() );
1086 #ifndef DISABLE_PLOT2DVIEWER
1087 a = action( NewPlot2dId );
1089 a->setEnabled( activeStudy() );
1092 #ifndef DISABLE_OCCVIEWER
1093 a = action( NewOCCViewId );
1095 a->setEnabled( activeStudy() );
1098 #ifndef DISABLE_VTKVIEWER
1099 a = action( NewVTKViewId );
1101 a->setEnabled( activeStudy() );
1104 #ifndef DISABLE_QXGRAPHVIEWER
1105 a = action( NewQxSceneViewId );
1107 a->setEnabled( activeStudy() );
1110 #ifndef DISABLE_GRAPHICSVIEW
1111 a = action( NewGraphicsViewId );
1113 a->setEnabled( activeStudy() );
1116 #ifndef DISABLE_PVVIEWER
1117 a = action( NewPVViewId );
1119 a->setEnabled( activeStudy() );
1122 #ifndef DISABLE_PYVIEWER
1123 a = action( NewPyViewerId );
1125 a->setEnabled( activeStudy() );
1131 Runs system command in separate thread
1133 class RunBrowser: public QThread
1136 RunBrowser( LightApp_Application* app,
1137 const QString& theApp,
1138 const QString& theParams,
1139 const QString& theHelpFile,
1140 const QString& theContext = QString(),
1141 //For the external browser always specify 'file://' protocol,
1142 //because some WEB browsers (for example Mozilla Firefox) can't open local file without protocol.
1143 const QString& theProtocol = QString("file://"),
1144 const bool isFile = true)
1146 myParams( theParams ),
1147 myContext( theContext ),
1151 QString path_begin = theProtocol+"%1";
1152 QString path_end = theHelpFile;
1154 path_end = QFileInfo( theHelpFile ).canonicalFilePath();
1156 myHelpFile = path_begin.arg( path_end );
1161 if ( !myApp.isEmpty() && !myHelpFile.isEmpty()) {
1162 QString aCommand = QString( "%1 %2 \"%3%4\"" ).arg( myApp, myParams, myHelpFile, myContext.isEmpty() ? QString("") : QString( "#%1" ).arg( myContext ) );
1164 QProcess* proc = new QProcess();
1166 proc->start( aCommand );
1167 if ( !proc->waitForStarted() ) {
1168 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1169 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myApp, myHelpFile ) );
1170 ce2000->setData( msg );
1171 QApplication::postEvent( myLApp, ce2000 );
1182 LightApp_Application* myLApp;
1186 SLOT: Displays help contents for choosen module
1188 void LightApp_Application::onHelpContentsModule()
1190 const QAction* a = (QAction*) sender();
1191 QString helpFile = a->data().toString();
1192 if ( helpFile.isEmpty() ) return;
1194 SUIT_ResourceMgr* resMgr = resourceMgr();
1197 platform = "winapplication";
1199 platform = "application";
1201 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1203 QString quote("\"");
1204 anApp.prepend( quote );
1205 anApp.append( quote );
1207 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1208 #if DISABLE_QTXWEBBROWSER
1209 bool useExtBrowser = true;
1211 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1214 if( useExtBrowser ) {
1215 if ( !anApp.isEmpty() ) {
1216 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile );
1220 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1221 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1222 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1224 showPreferences( tr( "PREF_APP" ) );
1228 QStringList parameters;
1229 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1230 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1231 parameters << helpFile;
1232 QProcess::startDetached( "HelpBrowser", parameters );
1237 SLOT: Displays help contents for choosen dialog
1239 void LightApp_Application::onHelpContextModule( const QString& theComponentName,
1240 const QString& theFileName,
1241 const QString& theContext )
1243 QString fileName = theFileName;
1244 QString context = theContext;
1245 if ( !QFile::exists( fileName ) && theContext.isEmpty() ) {
1246 // context might be passed within theFileName argument
1247 QStringList comps = fileName.split("#");
1248 if ( comps.count() > 1 ) {
1249 context = comps.last();
1251 fileName = comps.join("#");
1255 QString homeDir = "";
1256 if ( !theComponentName.isEmpty() ) {
1257 QString dir = getenv( ( theComponentName + "_ROOT_DIR" ).toLatin1().constData() );
1258 if ( !dir.isEmpty() )
1259 homeDir = Qtx::addSlash( Qtx::addSlash( dir ) +
1260 Qtx::addSlash( "share" ) +
1261 Qtx::addSlash( "doc" ) +
1262 Qtx::addSlash( "salome" ) +
1263 Qtx::addSlash( "gui" ) +
1264 Qtx::addSlash( theComponentName ) );
1267 QString helpFile = QFileInfo( homeDir + fileName ).absoluteFilePath();
1268 SUIT_ResourceMgr* resMgr = resourceMgr();
1271 platform = "winapplication";
1273 platform = "application";
1275 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1277 QString quote("\"");
1278 anApp.prepend( quote );
1279 anApp.append( quote );
1282 #if DISABLE_QTXWEBBROWSER
1283 bool useExtBrowser = true;
1285 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1289 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1291 if ( !anApp.isEmpty() ) {
1292 RunBrowser* rs = new RunBrowser( this, anApp, aParams, helpFile, context );
1296 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1297 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1298 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1299 showPreferences( tr( "PREF_APP" ) );
1303 QStringList parameters;
1304 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1305 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1306 parameters << QString( "%1#%2" ).arg( helpFile ).arg( context );
1307 QProcess::startDetached( "HelpBrowser", parameters );
1312 SLOT: Displays help contents for choosen module
1314 void LightApp_Application::onHelpOnline()
1316 const QAction* a = (QAction*) sender();
1317 QString url = a->data().toString();
1318 if ( url.isEmpty() ) return;
1320 SUIT_ResourceMgr* resMgr = resourceMgr();
1323 platform = "winapplication";
1325 platform = "application";
1327 QString anApp = resMgr->stringValue("ExternalBrowser", platform);
1329 QString quote("\"");
1330 anApp.prepend( quote );
1331 anApp.append( quote );
1333 QString aParams = resMgr->stringValue("ExternalBrowser", "parameters");
1334 #if DISABLE_QTXWEBBROWSER
1335 bool useExtBrowser = true;
1337 bool useExtBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1340 if( useExtBrowser ) {
1341 if ( !anApp.isEmpty() ) {
1342 RunBrowser* rs = new RunBrowser( this, anApp, aParams, url, "", "http://", false );
1346 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1347 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1348 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1350 showPreferences( tr( "PREF_APP" ) );
1354 QStringList parameters;
1355 parameters << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1356 parameters << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1357 parameters << "http://" + url;
1358 QProcess::startDetached( "HelpBrowser", parameters );
1363 Sets enable or disable some actions on selection changed.
1365 void LightApp_Application::onSelectionChanged()
1367 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1368 bool canCopy = m ? m->canCopy() : false;
1369 bool canPaste = m ? m->canPaste() : false;
1371 action( EditCopyId )->setEnabled(canCopy);
1372 action( EditPasteId )->setEnabled(canPaste);
1376 SLOT: Performs some actions when dockable windows are triggered
1378 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1382 QWidget* LightApp_Application::dockWindow( const int id ) const
1385 if ( myWin.contains( id ) )
1390 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1395 QDockWidget* dock = 0;
1396 QWidget* w = wid->parentWidget();
1397 while ( w && !dock )
1399 dock = ::qobject_cast<QDockWidget*>( w );
1400 w = w->parentWidget();
1405 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1410 if ( wid != dockWindow( id ) )
1411 removeDockWindow( id );
1413 myWin.insert( id, wid );
1415 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1416 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1418 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1419 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1420 QString( "%1Dock" ).arg( wid->objectName() ) );
1421 dock->setWidget( wid );
1422 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1423 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1424 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1426 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1427 if ( !accel.isEmpty() )
1428 dock->toggleViewAction()->setShortcut( accel );
1433 void LightApp_Application::removeDockWindow( const int id )
1435 QWidget* wid = dockWindow( id );
1441 QDockWidget* dock = windowDock( wid );
1445 dock->setWidget( 0 );
1446 wid->setParent( 0 );
1447 wid->setVisible( false );
1451 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1453 QDockWidget* dock = windowDock( dockWindow( id ) );
1454 if ( dock && desktop() ) {
1455 desktop()->addDockWidget( place, dock );
1456 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1457 if ( a ) a->update();
1463 \param flag - key for window
1464 Flag used how identificator of window in windows list.
1466 QWidget* LightApp_Application::getWindow( const int flag)
1468 QWidget* wid = dockWindow( flag );
1470 insertDockWindow( flag, wid = createWindow( flag ) );
1472 QMap<int, int> winMap;
1473 currentWindows( winMap );
1474 if ( winMap.contains( flag ) )
1475 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1481 \return Object Browser
1483 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1485 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1491 LogWindow* LightApp_Application::logWindow()
1493 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1496 #ifndef DISABLE_PYCONSOLE
1498 This returns the python console integrated to the GUI. Depending
1499 when you request the python console, this function could return
1500 null. Then the optional parameter force (default to false) can be
1501 set to force the creation of the python console if it is not done
1503 \param force - if true, the pythonConsole is created if it does not exist yet
1504 \return Python Console
1506 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1508 QWidget* wid = dockWindow( WT_PyConsole );
1509 if ( !wid && force==true) {
1510 wid = getWindow(WT_PyConsole);
1512 return qobject_cast<PyConsole_Console*>( wid );
1517 Updates object browser and maybe data models
1518 \param updateModels - if it is true, then data models are updated
1520 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1522 // update existing data models
1525 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1526 if ( objectBrowser() )
1527 objectBrowser()->setAutoUpdate( false );
1529 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1531 CAM_Study::ModelList dm_list;
1532 study->dataModels( dm_list );
1533 QListIterator<CAM_DataModel*> it( dm_list );
1534 while ( it.hasNext() ) {
1535 CAM_DataModel* camDM = it.next();
1536 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1537 ((LightApp_DataModel*)camDM)->update();
1541 if( objectBrowser() )
1542 objectBrowser()->setAutoUpdate( isAutoUpdate );
1545 if ( objectBrowser() ) {
1546 objectBrowser()->updateGeometry();
1547 objectBrowser()->updateTree( 0, false );
1554 LightApp_Preferences* LightApp_Application::preferences() const
1556 return preferences( false );
1560 \return first view manager of some type
1561 \param vmType - type of view manager
1562 \param create - is it necessary to create view manager in case, when there is no manager of such type
1564 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1566 SUIT_ViewManager* aVM = viewManager( vmType );
1567 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1568 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1569 if ( anActiveVM && anActiveVM->getType() == vmType )
1571 MESSAGE("aVM = anActiveVM");
1575 if ( aVM && !aVM->getDetached() && create )
1577 if ( !aVM->getActiveView() )
1579 MESSAGE("aVM->createView()");
1584 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1585 desktop()->setActiveWindow( aVM->getActiveView() );
1590 MESSAGE("aVM = createViewManager( vmType )");
1591 aVM = createViewManager( vmType );
1598 Creates view manager of some type
1599 \param vmType - type of view manager
1601 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
1603 SUIT_ResourceMgr* resMgr = resourceMgr();
1605 SUIT_ViewManager* viewMgr = 0;
1606 #ifndef DISABLE_GLVIEWER
1607 if( vmType == GLViewer_Viewer::Type() )
1609 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1610 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1613 #ifndef DISABLE_PLOT2DVIEWER
1614 if( vmType == Plot2d_Viewer::Type() )
1616 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1618 #ifndef DISABLE_SALOMEOBJECT
1619 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1621 new LightApp_Plot2dSelector( v, mySelMgr );
1623 vm = new Plot2d_Viewer();
1625 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1626 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1629 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1630 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1634 #ifndef DISABLE_QXGRAPHVIEWER
1635 if( vmType == QxScene_Viewer::Type() )
1637 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1638 QxScene_Viewer* vm = new QxScene_Viewer();
1639 viewMgr->setViewModel( vm );
1640 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1643 #ifndef DISABLE_GRAPHICSVIEW
1644 if( vmType == GraphicsView_Viewer::Type() )
1646 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1647 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1650 #ifndef DISABLE_PVVIEWER
1651 if( vmType == PVViewer_Viewer::Type() )
1653 if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
1654 viewMgr->getActiveView()->setFocus();
1657 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop(), logWindow() );
1661 #ifndef DISABLE_PYVIEWER
1662 if( vmType == PyViewer_Viewer::Type() )
1664 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1667 #ifndef DISABLE_OCCVIEWER
1668 if( vmType == OCCViewer_Viewer::Type() )
1670 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1671 OCCViewer_Viewer* vm;
1672 #ifndef DISABLE_SALOMEOBJECT
1673 vm = new SOCC_Viewer();
1675 vm = new OCCViewer_Viewer( true );
1677 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1678 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1679 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1680 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1681 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1682 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1683 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1684 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1686 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1687 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1688 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1689 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1690 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1691 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1692 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1693 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1694 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1695 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1697 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1698 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1699 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1700 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1701 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1702 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1703 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1704 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1705 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1706 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1707 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1710 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1711 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1714 #ifndef DISABLE_VTKVIEWER
1715 #ifndef DISABLE_SALOMEOBJECT
1716 if ( vmType == SVTK_Viewer::Type() )
1718 if ( vmType == VTKViewer_Viewer::Type() )
1721 #ifndef DISABLE_SALOMEOBJECT
1722 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1723 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1726 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1727 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1728 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1729 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1730 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1731 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1732 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1733 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1734 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1735 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1736 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1737 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1738 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1739 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1740 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1741 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1742 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1743 new LightApp_VTKSelector( vm, mySelMgr );
1746 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1747 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1749 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1757 viewMgr->setDetached(detached);
1758 addViewManager( viewMgr );
1759 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1761 if ( viewWin && desktop() ) {
1762 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1763 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1769 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1771 SUIT_ResourceMgr* resMgr = resourceMgr();
1773 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1775 new LightApp_WgViewModel( vmType, w ) );
1776 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1778 addViewManager( vm );
1779 SUIT_ViewWindow* vw = vm->createViewWindow();
1780 if ( vw && desktop() ) {
1781 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1782 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1785 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1786 myUserWmTypes << vmType;
1791 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1793 SUIT_ResourceMgr* resMgr = resourceMgr();
1795 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1799 QString vmType = vm->getType();
1801 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1803 addViewManager( vm );
1804 SUIT_ViewWindow* vw = vm->createViewWindow();
1805 if ( vw && desktop() ) {
1806 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1807 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1810 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1811 myUserWmTypes << vmType;
1817 SLOT: Removes view manager from application
1819 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1821 removeViewManager( theVM );
1825 Protected SLOT: On study created.
1826 \param theStudy - just created study
1828 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1830 SUIT_DataObject* aRoot = 0;
1831 if ( theStudy && theStudy->root() )
1833 aRoot = theStudy->root();
1834 //aRoot->setName( tr( "DATA_MODELS" ) );
1837 getWindow( WT_ObjectBrowser );
1839 loadDockWindowsState();
1841 if ( objectBrowser() )
1842 objectBrowser()->setRoot( aRoot );
1844 activateModule( defaultModule() );
1846 if ( objectBrowser() )
1847 objectBrowser()->openLevels();
1849 #ifndef DISABLE_PYCONSOLE
1850 if( pythonConsole() )
1851 getPyInterp()->initStudy();
1856 Protected SLOT: On study opened.
1857 \param theStudy - just opened study
1859 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1861 SUIT_DataObject* aRoot = 0;
1862 if ( theStudy && theStudy->root() )
1864 aRoot = theStudy->root();
1868 getWindow( WT_ObjectBrowser );
1870 loadDockWindowsState();
1872 if ( objectBrowser() )
1873 objectBrowser()->setRoot( aRoot );
1875 activateModule( defaultModule() );
1877 if ( objectBrowser() )
1878 objectBrowser()->openLevels();
1880 #ifndef DISABLE_PYCONSOLE
1881 if( pythonConsole() )
1882 getPyInterp()->initStudy();
1888 /*!Protected SLOT. On study saved.*/
1889 void LightApp_Application::onStudySaved( SUIT_Study* s )
1891 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1893 mru->insert( s->studyName() );
1898 /*!Protected SLOT. On study closed.*/
1899 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1902 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1903 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1906 // stop auto-save timer
1907 myAutoSaveTimer->stop();
1909 // Bug 10396: clear selection
1910 mySelMgr->clearSelected();
1912 // Bug 12944: emit signal only after clear selection
1915 activateModule( "" );
1918 /*!Protected SLOT.On desktop activated.*/
1919 void LightApp_Application::onDesktopActivated()
1921 CAM_Application::onDesktopActivated();
1922 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1924 aModule->studyActivated();
1927 void LightApp_Application::studyOpened( SUIT_Study* s )
1929 CAM_Application::studyOpened( s );
1932 updateViewManagers();
1935 void LightApp_Application::studySaved( SUIT_Study* s )
1937 CAM_Application::studyOpened( s );
1938 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1939 if ( aResMgr && activeStudy() ) {
1940 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1941 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1945 void LightApp_Application::studyCreated( SUIT_Study* s )
1947 CAM_Application::studyCreated( s );
1950 updateViewManagers();
1953 /*!Gets file filter.
1954 *\retval QString "(*.hdf)"
1956 QString LightApp_Application::getFileFilter( bool /*open*/) const
1962 Shows file dialog and return user selected file name
1964 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1965 const QString& caption, QWidget* parent )
1969 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1970 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1973 /*! Gets directory*/
1974 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1978 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1981 /*! Get open file names*/
1982 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1983 const QString& caption, QWidget* parent )
1987 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1988 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1991 /*!Private SLOT. Update object browser.*/
1992 void LightApp_Application::onRefresh()
1994 updateObjectBrowser( true );
1997 /*!Private SLOT. Update actions after rename object.*/
1998 void LightApp_Application::onRenamed()
2000 activeStudy()->Modified();
2004 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
2005 // To prevent reversion the window should be either aligned during movement and resize.
2006 /*!Private SLOT. Update actions after rename object.*/
2007 /*void LightApp_Application::onMoved()
2009 OCCViewer_ViewManager* viewMgr = 0;
2010 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
2012 OCCViewer_ViewWindow* view = 0;
2013 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
2015 view->getViewPort()->repaintViewAfterMove();
2020 /*!Private SLOT. Support drag-and-drop operation.*/
2021 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
2023 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
2027 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
2029 aModule->dropObjects( objects, parentObj, row, action );
2032 /*!Private SLOT. On preferences.*/
2033 void LightApp_Application::onPreferences()
2035 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
2038 /*!Private SLOT. On preferences.*/
2039 void LightApp_Application::showPreferences( const QString& itemText )
2041 QApplication::setOverrideCursor( Qt::WaitCursor );
2043 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
2045 QApplication::restoreOverrideCursor();
2050 preferences()->activateItem( itemText );
2052 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
2055 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
2056 resourceMgr()->save();
2059 shortcutMgr()->updateShortcuts();
2065 /*!Protected SLOT. On preferences changed.*/
2066 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
2068 LightApp_Module* sMod = 0;
2069 CAM_Module* mod = module( modName );
2070 if ( mod && mod->inherits( "LightApp_Module" ) )
2071 sMod = (LightApp_Module*)mod;
2074 sMod->preferencesChanged( section, param );
2076 preferencesChanged( section, param );
2077 // emit signal to allow additional preferences changing processing
2078 emit preferenceChanged( modName, section, param );
2081 /*!Remove all windows from study.*/
2082 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
2084 saveDockWindowsState();
2086 if ( SUIT_DataBrowser* ob = objectBrowser() )
2089 CAM_Application::beforeCloseDoc( s );
2092 /*!Update actions.*/
2093 void LightApp_Application::updateActions()
2095 updateCommandsStatus();
2101 SUIT_Study* LightApp_Application::createNewStudy()
2103 LightApp_Study* aStudy = new LightApp_Study( this );
2105 // Set up processing of major study-related events
2106 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
2107 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
2108 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
2109 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2115 Creates window by flag.
2116 \param flag - identificator of window type
2118 QWidget* LightApp_Application::createWindow( const int flag )
2122 SUIT_ResourceMgr* resMgr = resourceMgr();
2124 if ( flag == WT_ObjectBrowser )
2126 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2127 ob->setObjectName( "objectBrowser" );
2128 ob->setSortMenuEnabled( true );
2129 ob->setAutoUpdate( true );
2130 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2131 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2133 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2134 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2135 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2137 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2138 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2139 treeModel->setSearcher( this );
2140 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2141 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2143 // Mantis issue 0020136: Drag&Drop in OB
2144 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2146 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2147 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2148 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2149 this, SLOT( onRenamed( ) ) );
2153 // temporary commented
2155 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2157 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2160 // Create OBSelector
2161 new LightApp_OBSelector( ob, mySelMgr );
2162 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2163 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2165 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2167 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2168 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2169 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2171 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2173 #ifndef DISABLE_PYCONSOLE
2174 else if ( flag == WT_PyConsole )
2176 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2177 pyCons->setObjectName( "pythonConsole" );
2178 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2179 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2180 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2181 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2182 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2186 else if ( flag == WT_LogWindow )
2188 LogWindow* logWin = new LogWindow( desktop() );
2189 logWin->setObjectName( "logWindow" );
2190 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2191 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2193 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2199 \return default windows( Object Browser, Python Console )
2200 Adds to map \a aMap.
2202 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2204 #ifndef DISABLE_PYCONSOLE
2205 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2207 if ( activeStudy() ) {
2208 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2209 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2213 /*!Default view managers*/
2214 void LightApp_Application::defaultViewManagers( QStringList& ) const
2220 \return preferences.
2221 Create preferences, if \a crt = true.
2223 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2228 LightApp_Application* that = (LightApp_Application*)this;
2230 bool toCreate = !_prefs_ && crt;
2233 _prefs_ = new LightApp_Preferences( resourceMgr() );
2234 that->createPreferences( _prefs_ );
2235 qAddPostRoutine( LightAppCleanUpAppResources );
2238 that->myPrefs = _prefs_;
2240 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2241 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2242 connect( myPrefs, SIGNAL( resetToDefaults() ),
2243 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2248 SUIT_ResourceMgr* resMgr = resourceMgr();
2250 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2251 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2253 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2257 QStringList modNameList;
2258 app->modules( modNameList, false );
2260 QMap<QString, QString> iconMap;
2261 app->moduleIconNames( iconMap );
2263 for ( QStringList::const_iterator it = modNameList.begin(); it != modNameList.end(); ++it )
2265 if ( !app->isModuleAccessible( *it ) || _prefs_->hasModule( *it ) )
2268 int modId = _prefs_->addPreference( *it );
2269 if ( iconMap.contains( *it ) )
2270 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ), iconMap[*it], false ), 20 ) );
2274 app->modules( modList );
2275 QListIterator<CAM_Module*> itr( modList );
2276 while ( itr.hasNext() )
2278 LightApp_Module* mod = 0;
2280 CAM_Module* anItem = itr.next();
2281 if ( anItem->inherits( "LightApp_Module" ) )
2282 mod = (LightApp_Module*)anItem;
2284 if ( mod && !_prefs_->hasModule( mod->moduleName() ) )
2286 _prefs_->addPreference( mod->moduleName() );
2287 mod->createPreferences();
2288 that->emptyPreferences( mod->moduleName() );
2292 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) );
2298 Adds new module to application
2300 void LightApp_Application::moduleAdded( CAM_Module* mod )
2302 CAM_Application::moduleAdded( mod );
2304 LightApp_Module* lightMod = 0;
2305 if ( mod && mod->inherits( "LightApp_Module" ) )
2306 lightMod = (LightApp_Module*)mod;
2308 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2310 myPrefs->addPreference( mod->moduleName() );
2311 lightMod->createPreferences();
2312 emptyPreferences( mod->moduleName() );
2316 void LightApp_Application::emptyPreferences( const QString& modName )
2318 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2319 if ( !item || !item->isEmpty() )
2322 // printf( "---------------------> Modify for empty module.\n" );
2324 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2325 frm->setIcon( item->icon() );
2326 frm->setStretch( false );
2327 item->parentItem()->insertItem( frm, item );
2328 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2335 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2340 QStringList aValuesList;
2341 QList<QVariant> anIndicesList;
2345 // . Top-level "SALOME" preferences group <<start>>
2346 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2347 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2349 // .. "General" preferences tab <<start>>
2350 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2352 // ... "Language" group <<start>>
2353 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2354 pref->setItemProperty( "columns", 2, langGroup );
2355 // .... -> application language
2356 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2357 LightApp_Preferences::Selector, "language", "language" );
2358 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2359 QList<QVariant> aIcons;
2360 QList<QVariant> aNumbers;
2361 QStringList aTitles;
2362 foreach ( QString aLang, aLangs ) {
2363 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2365 aTitles << langToName( aLang );
2367 pref->setItemProperty( "strings", aTitles, curLang );
2368 pref->setItemProperty( "ids", aNumbers, curLang );
2369 pref->setItemProperty( "icons", aIcons, curLang );
2370 pref->setItemProperty( "restart", true, curLang );
2372 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2373 LightApp_Preferences::Bool, "language", "locale" );
2374 pref->setItemProperty( "restart", true, curLocale );
2375 // ... "Language" group <<end>>
2377 // ... "Look and feel" group <<start>>
2378 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2379 pref->setItemProperty( "columns", 2, lookGroup );
2380 // .... -> show splash-screen
2381 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2382 // .... -> opaque resize
2383 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2384 // .... -> drop-down buttons
2385 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2386 // .... -> Notification timeout
2387 int delay = pref->addPreference( tr( "PREF_NOTIFY_TIMEOUT" ), lookGroup, LightApp_Preferences::IntSpin, "notification", "timeout" );
2388 pref->setItemProperty( "special", tr("PREF_NOTIFY_TIMEOUT_NONE"), delay );
2389 pref->setItemProperty( "min", 0, delay );
2390 pref->setItemProperty( "max", 100, delay );
2391 pref->setItemProperty( "suffix", " sec", delay );
2392 // ... "Look and feel" group <<end>>
2394 // ... "Study properties" group <<start>>
2395 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2396 pref->setItemProperty( "columns", 2, studyGroup );
2397 // .... -> multi-file save
2398 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2399 // .... -> ascii save mode
2400 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2401 // .... -> store windows geometry
2402 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2403 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2404 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2405 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2406 // .... -> auto-save
2407 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2408 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2409 pref->setItemProperty( "min", 0, autoSaveInterval );
2410 pref->setItemProperty( "max", 1440, autoSaveInterval );
2411 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2412 // ... "Study properties" group <<end>>
2414 // ... "Help browser" group <<start>>
2415 #ifndef DISABLE_QTXWEBBROWSER
2416 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2418 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2422 QString platform = "winapplication";
2424 QString platform = "application";
2426 // .... -> browser application
2427 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2428 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2429 // .... -> browser parameters
2430 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2431 // ... "Help browser" group <<end>>
2433 // ... "Python console properties" group <<start>>
2434 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2435 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2437 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2438 // .... -> show banner
2439 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2440 // .... -> auto-completion
2441 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2442 // ... "Python console properties" group <<end>>
2444 // ... "MRU" preferences group <<start>>
2445 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2446 pref->setItemProperty( "columns", 4, mruGroup );
2447 // number of MRU items
2448 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2449 "MRU", "visible_count" );
2450 pref->setItemProperty( "min", 0, mruVisCount );
2451 pref->setItemProperty( "max", 100, mruVisCount );
2453 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2454 "MRU", "link_type" );
2455 aValuesList.clear();
2456 anIndicesList.clear();
2457 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2458 anIndicesList << 0 << 1 << 2 ;
2459 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2460 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2461 // ... "MRU" preferences group <<end>>
2463 // ... "Full-screen" group <<start>>
2464 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2465 pref->setItemProperty( "columns", 2, fullScreenGroup );
2466 // .... -> automatic hiding toolbars
2467 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2468 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2469 // ... "Full-screen" group <<end>>
2471 // .. "General" preferences tab <<end>>
2473 // .. "3D viewer" group <<start>>
2474 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2475 // ... -> navigation mode
2476 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2477 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2478 aValuesList.clear();
2479 anIndicesList.clear();
2480 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2481 anIndicesList << 0 << 1;
2482 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2483 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2484 // ... -> zooming mode
2485 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2486 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2487 aValuesList.clear();
2488 anIndicesList.clear();
2489 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2490 anIndicesList << 0 << 1;
2491 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2492 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2493 // ... "Trihedron" group <<start>>
2494 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2495 pref->setItemProperty( "columns", 2, occTriGroup );
2496 // .... -> trihedron size
2497 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2498 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2499 pref->setItemProperty( "min", 1.0E-06, occTS );
2500 pref->setItemProperty( "max", 1000, occTS );
2501 // .... -> relative size of trihedron
2502 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2503 // .... -> show static trihedron
2504 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2505 // ... "Trihedron" group <<end>>
2506 // .. "3D viewer" group <<end>>
2510 #ifndef DISABLE_OCCVIEWER
2511 // .. "OCC viewer" group <<start>>
2512 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2514 // .... -> Projection mode
2515 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2516 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2517 aValuesList.clear();
2518 anIndicesList.clear();
2519 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2520 anIndicesList << 0 << 1;
2521 pref->setItemProperty( "strings", aValuesList, occProjMode );
2522 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2524 // .... -> Stereo group
2525 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2526 pref->setItemProperty( "columns", 2, stereoGroup );
2527 // .... -> Stereo type
2528 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2529 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2530 aValuesList.clear();
2531 anIndicesList.clear();
2533 OCCViewer_Viewer::stereoData( aValuesList, idList);
2534 foreach( int gid, idList ) anIndicesList << gid;
2535 pref->setItemProperty( "strings", aValuesList, stereoType );
2536 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2538 // .... -> Anaglyph filter
2539 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2540 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2541 aValuesList.clear();
2542 anIndicesList.clear();
2543 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2544 anIndicesList << 0 << 1 << 2;
2546 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2547 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2549 // .... -> Convergence distance type
2550 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2551 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2552 aValuesList.clear();
2553 anIndicesList.clear();
2554 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2555 anIndicesList << 0 << 1;
2556 pref->setItemProperty( "strings", aValuesList, occFocusType );
2557 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2559 // .... -> Stereographic focus value
2560 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2561 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2562 pref->setItemProperty( "precision", 3, focusValue );
2563 pref->setItemProperty( "min", 1.0E-03, focusValue );
2564 pref->setItemProperty( "max", 1.0E03, focusValue );
2565 pref->setItemProperty( "step", 0.05, focusValue );
2568 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2569 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2570 aValuesList.clear();
2571 anIndicesList.clear();
2572 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2573 anIndicesList << 0 << 1;
2574 pref->setItemProperty( "strings", aValuesList, occIODType );
2575 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2577 // .... -> Interocular distance (IOD) value
2578 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2579 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2580 pref->setItemProperty( "precision", 3, IODValue );
2581 pref->setItemProperty( "min", 1.0E-03, IODValue );
2582 pref->setItemProperty( "max", 1.0E03, IODValue );
2583 pref->setItemProperty( "step", 0.05, IODValue );
2585 // .... -> Reverse stereo
2586 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2587 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2588 // .... -> Enable V-Sync
2589 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2590 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2591 // .... -> Enable quad-buffer support
2592 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2593 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2595 // ... "Background" group <<start>>
2596 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2597 // pref->setItemProperty( "columns", 2, bgGroup );
2598 aValuesList.clear();
2599 anIndicesList.clear();
2602 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2603 foreach( int gid, idList ) anIndicesList << gid;
2604 // .... -> 3D viewer background
2605 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2606 LightApp_Preferences::Background, "OCCViewer", "background" );
2607 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2608 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2609 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2610 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2611 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2612 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2613 pref->setItemProperty( "custom_enabled", false, bgId );
2614 pref->setItemProperty( "image_formats", formats, bgId );
2615 // .... -> XZ viewer background
2616 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2617 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2618 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2619 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2620 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2621 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2622 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2623 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2624 pref->setItemProperty( "custom_enabled", false, bgId );
2625 pref->setItemProperty( "image_formats", formats, bgId );
2626 // .... -> YZ viewer background
2627 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2628 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2629 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2630 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2631 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2632 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2633 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2634 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2635 pref->setItemProperty( "custom_enabled", false, bgId );
2636 pref->setItemProperty( "image_formats", formats, bgId );
2637 // .... -> XY viewer background
2638 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2639 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2640 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2641 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2642 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2643 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2644 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2645 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2646 pref->setItemProperty( "custom_enabled", false, bgId );
2647 pref->setItemProperty( "image_formats", formats, bgId );
2648 // ... "Background" group <<end>>
2651 // ... "Selection" group <<start>>
2652 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2653 pref->setItemProperty( "columns", 2, occSelectionGroup );
2654 // .... -> enable preselection
2655 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2656 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2657 // .... -> enable selection
2658 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2659 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2660 // ... "Selection" group <<end>>
2662 // ... "Clipping" group <<start>>
2663 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2664 // .... -> clipping color
2665 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2666 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2667 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2668 pref->setItemProperty( "columns", 2, texturePref );
2669 // .... -> use default texture
2670 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2671 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2672 // .... -> clipping texture
2673 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2674 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2675 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2677 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2678 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2679 // .... -> scale factor
2680 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2681 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2682 pref->setItemProperty( "precision", 3, scaleFactor );
2683 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2684 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2685 pref->setItemProperty( "step", 0.1, scaleFactor );
2686 // ... "Clipping" group <<end>>
2688 // ... "Ray tracing" group <<start>>
2689 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2690 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2691 pref->setItemProperty( "columns", 2, rtPref );
2693 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2694 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2695 pref->setItemProperty( "min", 1, rt_depth );
2696 pref->setItemProperty( "max", 10, rt_depth );
2697 pref->setItemProperty( "step", 1, rt_depth );
2698 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2699 // .... -> specular reflections
2700 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2701 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2702 // .... -> adaptive anti-aliasing
2703 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2704 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2705 // .... -> shadows rendering
2706 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2707 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2708 // .... -> transparent shadow
2709 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2710 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2711 // ... "Ray tracing" group <<end>>
2713 // ... "Light source" group <<start>>
2714 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2715 // .... -> light color
2716 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2717 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2718 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2719 pref->setItemProperty( "columns", 3, directionPref );
2720 // .... -> light direction (dx component)
2721 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2722 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2723 pref->setItemProperty( "precision", 2, light_dx );
2724 pref->setItemProperty( "min", -1.0E03, light_dx );
2725 pref->setItemProperty( "max", 1.0E03, light_dx );
2726 pref->setItemProperty( "step", 0.1, light_dx );
2727 // .... -> light direction (dy component)
2728 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2729 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2730 pref->setItemProperty( "precision", 2, light_dy );
2731 pref->setItemProperty( "min", -1.0E03, light_dy );
2732 pref->setItemProperty( "max", 1.0E03, light_dy );
2733 pref->setItemProperty( "step", 0.1, light_dy );
2734 // .... -> light direction (dz component)
2735 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2736 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2737 pref->setItemProperty( "precision", 2, light_dz );
2738 pref->setItemProperty( "min", -1.0E03, light_dz );
2739 pref->setItemProperty( "max", 1.0E03, light_dz );
2740 pref->setItemProperty( "step", 0.1, light_dz );
2741 // ... "Light source" group <<end>>
2743 // ... -> empty frame (for layout) <<start>>
2744 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2745 pref->setItemProperty( "margin", 0, occGen );
2746 pref->setItemProperty( "columns", 2, occGen );
2747 // ... -> empty frame (for layout) <<end>>
2749 // .. "OCC viewer" group <<end>>
2752 #ifndef DISABLE_VTKVIEWER
2753 // .. "VTK viewer" group <<start>>
2754 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2756 // ... -> empty frame (for layout) <<start>>
2757 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2758 //pref->setItemProperty( "columns", 2, vtkGen );
2759 // .... -> projection mode
2760 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2761 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2762 aValuesList.clear();
2763 anIndicesList.clear();
2764 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2765 anIndicesList << 0 << 1;
2766 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2767 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2769 // .... -> Stereo group
2770 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2771 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2772 // .... -> Stereo type
2773 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2774 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2775 aValuesList.clear();
2776 anIndicesList.clear();
2778 SVTK_Viewer::stereoData( aValuesList, idList);
2779 foreach( int gid, idList ) anIndicesList << gid;
2780 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2781 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2782 // .... -> Anaglyph filter
2783 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2784 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2785 aValuesList.clear();
2786 anIndicesList.clear();
2787 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2788 anIndicesList << 0 << 1 << 2;
2790 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2791 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2793 // .... -> Enable quad-buffer support
2794 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2795 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2797 // .... -> background
2798 aValuesList.clear();
2799 anIndicesList.clear();
2802 #ifndef DISABLE_SALOMEOBJECT
2803 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2805 foreach( int gid, idList ) anIndicesList << gid;
2806 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2807 LightApp_Preferences::Background, "VTKViewer", "background" );
2808 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2809 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2810 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2811 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2812 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2813 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2814 pref->setItemProperty( "custom_enabled", false, bgId );
2815 #ifndef DISABLE_SALOMEOBJECT
2816 pref->setItemProperty( "image_formats", formats, bgId );
2818 // .... -> speed increment
2819 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2820 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2821 pref->setItemProperty( "min", 1, vtkSpeed );
2822 pref->setItemProperty( "max", 1000, vtkSpeed );
2823 // .... -> speed mode
2824 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2825 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2826 aValuesList.clear();
2827 anIndicesList.clear();
2828 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2829 anIndicesList << 0 << 1;
2830 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2831 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2833 // ... "Selection" group <<start>>
2834 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2835 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2836 // .... -> preselection
2837 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2838 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2839 aValuesList.clear();
2840 anIndicesList.clear();
2841 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2842 anIndicesList << 0 << 1 << 2;
2843 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2844 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2845 // .... -> enable selection
2846 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2847 // ... "Selection" group <<end>>
2849 // ... -> empty frame (for layout) <<end>>
2851 // ... space mouse sub-group <<start>>
2852 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2853 //pref->setItemProperty( "columns", 2, vtkSM );
2854 // .... -> decrease speed increment
2855 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2856 LightApp_Preferences::Selector, "VTKViewer",
2857 "spacemouse_func1_btn" );
2858 // .... -> increase speed increment
2859 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2860 LightApp_Preferences::Selector, "VTKViewer",
2861 "spacemouse_func2_btn" );
2862 // .... -> dominant / combined switch
2863 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2864 LightApp_Preferences::Selector, "VTKViewer",
2865 "spacemouse_func5_btn" ); //
2866 aValuesList.clear();
2867 anIndicesList.clear();
2868 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2869 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2870 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2871 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2872 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2873 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2874 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2875 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2876 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2877 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2878 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2879 // ... space mouse sub-group <<end>>
2881 // ... avi recording sub-group <<start>>
2882 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2883 pref->setItemProperty( "columns", 2, vtkRec );
2884 // .... -> recording mode
2885 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2886 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2887 aValuesList.clear();
2888 anIndicesList.clear();
2889 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2890 anIndicesList << 0 << 1;
2891 pref->setItemProperty( "strings", aValuesList, modePref );
2892 pref->setItemProperty( "indexes", anIndicesList, modePref );
2894 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2895 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2896 pref->setItemProperty( "min", 0.1, fpsPref );
2897 pref->setItemProperty( "max", 100, fpsPref );
2899 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2900 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2901 pref->setItemProperty( "min", 1, qualityPref );
2902 pref->setItemProperty( "max", 100, qualityPref );
2903 // .... -> progressive mode
2904 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2905 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2906 // ... avi recording sub-group <<end>>
2908 // ... group names sub-group <<start>>
2909 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2910 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2911 pref->setItemProperty( "columns", 2, vtkGN );
2912 // .... -> text color
2913 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2914 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2915 // .... -> transparency
2916 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2917 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2918 pref->setItemProperty( "min", 0.0, transPref );
2919 pref->setItemProperty( "max", 1.0, transPref );
2920 pref->setItemProperty( "step", 0.1, transPref );
2921 // ... -> group names sub-group <<end>>
2922 // .. "VTK viewer" group <<end>>
2925 // .. "Plot2d viewer" group <<start>>
2926 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2927 //pref->setItemProperty( "columns", 2, plot2dGroup );
2929 // ... -> background
2930 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2931 LightApp_Preferences::Color, "Plot2d", "Background" );
2932 // ... -> selection color
2933 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2934 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2936 // ... "Viewer" group <<start>>
2937 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2939 // .... -> curve type
2940 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2941 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2942 aValuesList.clear();
2943 anIndicesList.clear();
2944 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2945 anIndicesList << 0 << 1 << 2 ;
2946 pref->setItemProperty( "strings", aValuesList, curveType );
2947 pref->setItemProperty( "indexes", anIndicesList, curveType );
2948 // .... -> marker size
2949 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2950 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2951 pref->setItemProperty( "min", 0, markerSize );
2952 pref->setItemProperty( "max", 100, markerSize );
2953 // .... -> horizontal scaling mode
2954 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2955 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2956 aValuesList.clear();
2957 anIndicesList.clear();
2958 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2959 anIndicesList << 0 << 1 ;
2960 pref->setItemProperty( "strings", aValuesList, horScale );
2961 pref->setItemProperty( "indexes", anIndicesList, horScale );
2962 // .... -> vertical scaling mode
2963 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2964 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2965 pref->setItemProperty( "strings", aValuesList, verScale );
2966 pref->setItemProperty( "indexes", anIndicesList, verScale );
2968 // .... -> errors/deviation colot
2969 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2970 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2971 // .... -> deviation markers line size
2972 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2973 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2974 pref->setItemProperty( "min", 1, deviationMarkerLw );
2975 pref->setItemProperty( "max", 5, deviationMarkerLw );
2976 // .... -> deviation markers tick mark size
2977 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2978 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2979 pref->setItemProperty( "min", 1, deviationMarkerTs );
2980 pref->setItemProperty( "max", 5, deviationMarkerTs );
2981 // .... "Viewer" group <<end>>
2983 // ... "Legend" group <<start>>
2984 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2986 // .... -> show legend
2987 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2988 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2989 // .... -> legend position
2990 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2991 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2992 aValuesList.clear();
2993 anIndicesList.clear();
2994 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2995 anIndicesList << 0 << 1 << 2 << 3 ;
2996 pref->setItemProperty( "strings", aValuesList, legendPosition );
2997 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2998 // .... -> Symbol type
2999 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
3000 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
3001 aValuesList.clear();
3002 anIndicesList.clear();
3003 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
3004 anIndicesList << 0 << 1 ;
3005 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
3006 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
3007 // .... -> legend font
3008 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
3009 // ... -> font color
3010 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
3011 // ... -> selection font color
3012 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
3013 // ... "Legend" group <<end>>
3015 // .. "Plot2d viewer" group <<end>>
3017 // .. "PyViewer" preferences tab <<start>>
3018 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
3019 // ... "Font settings" group <<start>>
3020 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
3021 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
3022 LightApp_Preferences::Font, "PyEditor", "Font" );
3023 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
3024 // ... "Font settings" group <<end>>
3025 // ... "Display settings" group <<start>>
3026 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
3027 pref->setItemProperty( "columns", 2, pyDispGroup );
3028 // ... -> current line highlight
3029 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
3030 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
3031 // ... -> text wrapping
3032 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
3033 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
3034 // ... -> center cursor on scroll
3035 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
3036 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
3037 // ... -> line numbers area
3038 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
3039 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
3040 // ... "Display settings" group <<end>>
3042 // ... "Editor settings" group <<start>>
3043 int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
3044 // ... -> navigation mode
3045 int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
3046 LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
3047 aValuesList.clear();
3048 anIndicesList.clear();
3049 aValuesList << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
3050 anIndicesList << 0 << 1 << 2 << 3 ;
3051 pref->setItemProperty( "strings", aValuesList, pyCompletion );
3052 pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
3053 // ... "Editor settings" group <<end>>
3055 // ... "Tab settings" group <<start>>
3056 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
3057 pref->setItemProperty( "columns", 2, pyTabGroup );
3058 // ... -> tab whitespaces
3059 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
3060 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
3062 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
3063 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
3064 // ... "Tab settings" group <<end>>
3065 // ... "Vertical edge settings" group <<start>>
3066 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
3067 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
3068 // ... -> vertical edge
3069 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
3070 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
3071 // ... -> number of columns
3072 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
3073 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
3074 // ... "Vertical edge settings" group <<end>>
3075 // .. "PyEditor" preferences tab <<end>>
3077 // .. "Directories" preferences tab <<start>>
3078 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
3079 // ... --> quick directories list
3080 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
3081 pref->addPreference( tr( "" ), dirGroup,
3082 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
3083 // .. "Directories" preferences tab <<end>>
3085 // .. "Object browser" preferences tab <<start>>
3086 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
3088 // ... "Search tool" group <<start>>
3089 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
3090 // .... --> auto-hide
3091 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
3092 "ObjectBrowser", "auto_hide_search_tool" );
3093 // ... "Search tool" group <<end>>
3095 // ... "Object browser settings" group <<start>>
3096 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
3097 pref->setItemProperty( "columns", 2, objSetGroup );
3098 // .... -> auto size first column
3099 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
3100 "ObjectBrowser", "auto_size_first" );
3101 // .... -> auto size other columns
3102 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
3103 "ObjectBrowser", "auto_size" );
3104 // .... -> resize columns on expand item
3105 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
3106 "ObjectBrowser", "resize_on_expand_item" );
3107 // .... -> browse to published object
3108 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
3109 "ObjectBrowser", "browse_published_object" );
3110 aValuesList.clear();
3111 anIndicesList.clear();
3112 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
3113 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
3114 pref->setItemProperty( "strings", aValuesList, browsePublished );
3115 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
3116 // ... "Object browser settings" group <<end>>
3117 // .. "Object browser" preferences tab <<end>>
3119 // .. "Shortcuts" preferences tab <<start>>
3120 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3121 // ... "Shortcuts settings" group <<start>>
3122 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3123 pref->addPreference( tr( "" ), shortcutGroup,
3124 LightApp_Preferences::ShortcutTree, "shortcuts" );
3125 // ... "Shortcuts settings" group <<end>>
3126 // .. "Shortcuts" preferences tab <<end>>
3127 // . Top-level "SALOME" preferences group <<end>>
3133 Changes appearance of application according to changed preferences
3134 \param sec - section
3135 \param param - name of changed parameter
3137 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3139 SUIT_ResourceMgr* resMgr = resourceMgr();
3143 if ( sec == "viewers" && param == "drop_down_buttons" )
3145 ViewManagerList vmlist = viewManagers();
3146 foreach( SUIT_ViewManager* vm, vmlist )
3148 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3149 foreach( SUIT_ViewWindow* vw, vwlist )
3150 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3154 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3156 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3157 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3158 QList<SUIT_ViewManager*> lst;
3159 #ifndef DISABLE_OCCVIEWER
3160 viewManagers( OCCViewer_Viewer::Type(), lst );
3161 QListIterator<SUIT_ViewManager*> itOCC( lst );
3162 while ( itOCC.hasNext() && sz >= 0 )
3164 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3165 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3168 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3169 occVM->setTrihedronSize( sz, relative );
3170 occVM->getAISContext()->UpdateCurrentViewer();
3173 #ifndef DISABLE_VTKVIEWER
3174 #ifndef DISABLE_SALOMEOBJECT
3175 viewManagers( SVTK_Viewer::Type(), lst );
3176 QListIterator<SUIT_ViewManager*> itVTK( lst );
3177 while ( itVTK.hasNext() && sz >= 0 )
3179 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3180 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3183 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3186 vtkVM->setTrihedronSize( sz, relative );
3194 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3196 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3197 QList<SUIT_ViewManager*> lst;
3198 #ifndef DISABLE_OCCVIEWER
3199 viewManagers( OCCViewer_Viewer::Type(), lst );
3200 QListIterator<SUIT_ViewManager*> itOCC( lst );
3201 while ( itOCC.hasNext() )
3203 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3204 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3207 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3210 occVM->setStaticTrihedronDisplayed( isVisible );
3214 #ifndef DISABLE_VTKVIEWER
3215 #ifndef DISABLE_SALOMEOBJECT
3216 viewManagers( SVTK_Viewer::Type(), lst );
3217 QListIterator<SUIT_ViewManager*> itVTK( lst );
3218 while ( itVTK.hasNext() )
3220 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3221 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3224 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3227 vtkVM->setStaticTrihedronVisible( isVisible );
3235 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3237 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3238 QList<SUIT_ViewManager*> lst;
3239 #ifndef DISABLE_OCCVIEWER
3240 viewManagers( OCCViewer_Viewer::Type(), lst );
3241 QListIterator<SUIT_ViewManager*> itOCC( lst );
3242 while ( itOCC.hasNext() )
3244 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3245 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3248 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3249 occVM->setInteractionStyle( mode );
3252 #ifndef DISABLE_VTKVIEWER
3253 #ifndef DISABLE_SALOMEOBJECT
3254 viewManagers( SVTK_Viewer::Type(), lst );
3255 QListIterator<SUIT_ViewManager*> itVTK( lst );
3256 while ( itVTK.hasNext() )
3258 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3259 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3262 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3263 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3269 #ifndef DISABLE_OCCVIEWER
3270 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3272 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3273 QList<SUIT_ViewManager*> lst;
3274 viewManagers( OCCViewer_Viewer::Type(), lst );
3275 QListIterator<SUIT_ViewManager*> it( lst );
3276 while ( it.hasNext() )
3278 SUIT_ViewModel* vm = it.next()->getViewModel();
3279 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3282 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3283 occVM->enablePreselection( isToEnablePreselection );
3288 #ifndef DISABLE_OCCVIEWER
3289 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3291 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3292 QList<SUIT_ViewManager*> lst;
3293 viewManagers( OCCViewer_Viewer::Type(), lst );
3294 QListIterator<SUIT_ViewManager*> it( lst );
3295 while ( it.hasNext() )
3297 SUIT_ViewModel* vm = it.next()->getViewModel();
3298 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3301 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3302 occVM->enableSelection( isToEnableSelection );
3307 #ifndef DISABLE_OCCVIEWER
3308 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3310 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3311 QList<SUIT_ViewManager*> lst;
3312 viewManagers( OCCViewer_Viewer::Type(), lst );
3313 QListIterator<SUIT_ViewManager*> it( lst );
3314 while ( it.hasNext() )
3316 SUIT_ViewModel* vm = it.next()->getViewModel();
3317 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3320 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3321 occVM->setClippingColor( aColor );
3326 #ifndef DISABLE_OCCVIEWER
3327 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3328 param == QString( "clipping_texture" ) ||
3329 param == QString( "clipping_modulate" ) ||
3330 param == QString( "clipping_scale" ) ) )
3332 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3333 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3334 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3335 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3336 QList<SUIT_ViewManager*> lst;
3337 viewManagers( OCCViewer_Viewer::Type(), lst );
3338 QListIterator<SUIT_ViewManager*> it( lst );
3339 while ( it.hasNext() )
3341 SUIT_ViewModel* vm = it.next()->getViewModel();
3342 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3345 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3346 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3351 #ifndef DISABLE_OCCVIEWER
3352 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3354 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3355 QList<SUIT_ViewManager*> lst;
3356 viewManagers( OCCViewer_Viewer::Type(), lst );
3357 QListIterator<SUIT_ViewManager*> it( lst );
3358 while ( it.hasNext() )
3360 SUIT_ViewModel* vm = it.next()->getViewModel();
3361 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3364 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3365 occVM->setProjectionType( mode );
3370 #ifndef DISABLE_OCCVIEWER
3371 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3373 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3374 QList<SUIT_ViewManager*> lst;
3375 viewManagers( OCCViewer_Viewer::Type(), lst );
3376 QListIterator<SUIT_ViewManager*> it( lst );
3377 while ( it.hasNext() )
3379 SUIT_ViewModel* vm = it.next()->getViewModel();
3380 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3383 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3384 occVM->setStereoType( mode );
3389 #ifndef DISABLE_OCCVIEWER
3390 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3392 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3393 QList<SUIT_ViewManager*> lst;
3394 viewManagers( OCCViewer_Viewer::Type(), lst );
3395 QListIterator<SUIT_ViewManager*> it( lst );
3396 while ( it.hasNext() )
3398 SUIT_ViewModel* vm = it.next()->getViewModel();
3399 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3402 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3403 occVM->setAnaglyphFilter( mode );
3408 #ifndef DISABLE_OCCVIEWER
3409 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3410 param == QString( "focus_value" ) ) )
3412 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3413 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3414 QList<SUIT_ViewManager*> lst;
3415 viewManagers( OCCViewer_Viewer::Type(), lst );
3416 QListIterator<SUIT_ViewManager*> it( lst );
3417 while ( it.hasNext() )
3419 SUIT_ViewModel* vm = it.next()->getViewModel();
3420 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3423 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3424 occVM->setStereographicFocus( aType, aValue );
3429 #ifndef DISABLE_OCCVIEWER
3430 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3431 param == QString( "iod_value" ) ) )
3433 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3434 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3435 QList<SUIT_ViewManager*> lst;
3436 viewManagers( OCCViewer_Viewer::Type(), lst );
3437 QListIterator<SUIT_ViewManager*> it( lst );
3438 while ( it.hasNext() )
3440 SUIT_ViewModel* vm = it.next()->getViewModel();
3441 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3444 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3445 occVM->setInterocularDistance( aType, aValue );
3450 #ifndef DISABLE_OCCVIEWER
3451 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3453 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3454 QList<SUIT_ViewManager*> lst;
3455 viewManagers( OCCViewer_Viewer::Type(), lst );
3456 QListIterator<SUIT_ViewManager*> it( lst );
3457 while ( it.hasNext() )
3459 SUIT_ViewModel* vm = it.next()->getViewModel();
3460 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3463 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3464 occVM->setReverseStereo( reverse );
3469 #ifndef DISABLE_OCCVIEWER
3470 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3472 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3473 QList<SUIT_ViewManager*> lst;
3474 viewManagers( OCCViewer_Viewer::Type(), lst );
3475 QListIterator<SUIT_ViewManager*> it( lst );
3476 while ( it.hasNext() )
3478 SUIT_ViewModel* vm = it.next()->getViewModel();
3479 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3482 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3483 occVM->setVSync( enable );
3488 #ifndef DISABLE_OCCVIEWER
3489 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3491 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3492 QList<SUIT_ViewManager*> lst;
3493 viewManagers( OCCViewer_Viewer::Type(), lst );
3494 QListIterator<SUIT_ViewManager*> it( lst );
3495 while ( it.hasNext() )
3497 SUIT_ViewModel* vm = it.next()->getViewModel();
3498 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3501 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3502 occVM->setQuadBufferSupport( enable );
3507 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3509 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3510 QList<SUIT_ViewManager*> lst;
3511 #ifndef DISABLE_OCCVIEWER
3512 viewManagers( OCCViewer_Viewer::Type(), lst );
3513 QListIterator<SUIT_ViewManager*> itOCC( lst );
3514 while ( itOCC.hasNext() )
3516 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3517 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3520 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3521 occVM->setZoomingStyle( mode );
3524 #ifndef DISABLE_VTKVIEWER
3525 #ifndef DISABLE_SALOMEOBJECT
3526 viewManagers( SVTK_Viewer::Type(), lst );
3527 QListIterator<SUIT_ViewManager*> itVTK( lst );
3528 while ( itVTK.hasNext() )
3530 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3531 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3534 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3535 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3541 #ifndef DISABLE_VTKVIEWER
3542 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3544 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3545 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3546 QList<SUIT_ViewManager*> lst;
3547 #ifndef DISABLE_SALOMEOBJECT
3548 viewManagers( SVTK_Viewer::Type(), lst );
3549 QListIterator<SUIT_ViewManager*> it( lst );
3550 while ( it.hasNext() )
3552 SUIT_ViewModel* vm = it.next()->getViewModel();
3553 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3556 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3557 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3563 #ifndef DISABLE_VTKVIEWER
3564 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3566 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3567 QList<SUIT_ViewManager*> lst;
3568 #ifndef DISABLE_SALOMEOBJECT
3569 viewManagers( SVTK_Viewer::Type(), lst );
3570 QListIterator<SUIT_ViewManager*> it( lst );
3571 while ( it.hasNext() )
3573 SUIT_ViewModel* vm = it.next()->getViewModel();
3574 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3577 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3578 if( vtkVM ) vtkVM->setProjectionMode( mode );
3584 #ifndef DISABLE_VTKVIEWER
3585 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3587 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
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->setStereoType( mode );
3605 #ifndef DISABLE_VTKVIEWER
3606 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3608 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3609 QList<SUIT_ViewManager*> lst;
3610 #ifndef DISABLE_SALOMEOBJECT
3611 viewManagers( SVTK_Viewer::Type(), lst );
3612 QListIterator<SUIT_ViewManager*> it( lst );
3613 while ( it.hasNext() )
3615 SUIT_ViewModel* vm = it.next()->getViewModel();
3616 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3619 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3620 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3626 #ifndef DISABLE_VTKVIEWER
3627 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3629 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3630 QList<SUIT_ViewManager*> lst;
3631 #ifndef DISABLE_SALOMEOBJECT
3632 viewManagers( SVTK_Viewer::Type(), lst );
3633 QListIterator<SUIT_ViewManager*> it( lst );
3634 while ( it.hasNext() )
3636 SUIT_ViewModel* vm = it.next()->getViewModel();
3637 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3640 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3641 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3647 #ifndef DISABLE_VTKVIEWER
3648 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3650 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3651 QList<SUIT_ViewManager*> lst;
3652 #ifndef DISABLE_SALOMEOBJECT
3653 viewManagers( SVTK_Viewer::Type(), lst );
3654 QListIterator<SUIT_ViewManager*> it( lst );
3655 while ( it.hasNext() )
3657 SUIT_ViewModel* vm = it.next()->getViewModel();
3658 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3661 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3662 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3668 #ifndef DISABLE_VTKVIEWER
3669 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3671 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3672 QList<SUIT_ViewManager*> lst;
3673 #ifndef DISABLE_SALOMEOBJECT
3674 viewManagers( SVTK_Viewer::Type(), lst );
3675 QListIterator<SUIT_ViewManager*> it( lst );
3676 while ( it.hasNext() )
3678 SUIT_ViewModel* vm = it.next()->getViewModel();
3679 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3682 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3683 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3689 #ifndef DISABLE_VTKVIEWER
3690 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3691 param == QString( "spacemouse_func2_btn" ) ||
3692 param == QString( "spacemouse_func5_btn" ) ) )
3694 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3695 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3696 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3697 QList<SUIT_ViewManager*> lst;
3698 #ifndef DISABLE_SALOMEOBJECT
3699 viewManagers( SVTK_Viewer::Type(), lst );
3700 QListIterator<SUIT_ViewManager*> it( lst );
3701 while ( it.hasNext() )
3703 SUIT_ViewModel* vm = it.next()->getViewModel();
3704 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3707 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3708 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3713 if( sec=="ObjectBrowser" )
3715 SUIT_DataBrowser* ob = objectBrowser();
3719 if ( param=="auto_size_first" )
3721 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3722 ob->setAutoSizeFirstColumn( autoSizeFirst );
3723 if ( autoSizeFirst )
3724 ob->adjustFirstColumnWidth();
3726 else if ( param=="auto_size" ) {
3727 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3728 ob->setAutoSizeColumns(autoSize);
3730 ob->adjustColumnsWidth();
3732 else if ( param=="resize_on_expand_item" ) {
3733 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3734 ob->setResizeOnExpandItem(resizeOnExpandItem);
3736 else if ( param == "auto_hide_search_tool" ) {
3737 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3743 if( param=="auto_save_interval" ) {
3744 myAutoSaveTimer->stop();
3745 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3746 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3750 #ifndef DISABLE_PYCONSOLE
3751 if( sec=="PyConsole" && pythonConsole() )
3753 if ( param=="font" ) {
3754 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3756 else if ( param=="show_banner" ) {
3757 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3759 else if ( param=="auto_completion" ) {
3760 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3767 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3769 if ( param == "visible_count" )
3770 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3771 else if ( param == "max_count" )
3772 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3773 else if ( param == "insert_mode" )
3774 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3775 else if ( param == "link_type" )
3776 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3777 else if ( param == "show_clear" )
3778 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3779 else if ( param == "show_mru" )
3780 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3783 if ( sec == "language" && param == "language" )
3785 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3786 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3788 if ( sec == "language" && param == "locale")
3790 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3791 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3793 if ( sec == "desktop" && param == "opaque_resize" ) {
3794 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3795 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3796 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3797 // any dockable window can't be docked to the another area, except initial area.
3798 // It is possible to move window to another area, but it always returns to the initial area.
3800 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3801 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3802 // else dopts &= ~QMainWindow::AnimatedDocks;
3803 // desktop()->setDockOptions( dopts );
3804 desktop()->setOpaqueResize( opaqueResize );
3805 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3806 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3809 #ifndef DISABLE_PLOT2DVIEWER
3810 QList<SUIT_ViewManager*> lst;
3811 viewManagers( Plot2d_Viewer::Type(), lst );
3812 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3813 while ( itPlot2d.hasNext() ) {
3814 SUIT_ViewManager* viewMgr = itPlot2d.next();
3815 SUIT_ViewModel* vm = viewMgr->getViewModel();
3816 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3819 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3821 viewMgr->setViewModel( vm );
3822 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3824 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3825 frame->SetPreference();
3834 void LightApp_Application::loadPreferences()
3836 CAM_Application::loadPreferences();
3838 SUIT_ResourceMgr* aResMgr = resourceMgr();
3843 static bool mru_load = true;
3846 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3848 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3849 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3850 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3851 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3852 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3853 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3854 mru->loadLinks( aResMgr, "MRU" );
3860 QStringList mods = aResMgr->parameters( "windows_visibility" );
3861 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3864 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3865 myWinVis.insert( *itr, arr );
3869 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3870 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3871 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3872 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3873 // else dopts &= ~QMainWindow::AnimatedDocks;
3874 // desktop()->setDockOptions( dopts );
3875 desktop()->setOpaqueResize( opaqueResize );
3876 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3877 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3884 void LightApp_Application::savePreferences()
3886 CAM_Application::savePreferences();
3888 saveDockWindowsState();
3890 SUIT_ResourceMgr* aResMgr = resourceMgr();
3895 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3897 mru->saveLinks( aResMgr, "MRU" );
3899 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3900 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3903 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3905 #if GUI_DEVELOPMENT > 0
3906 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3908 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3915 Updates desktop title
3917 void LightApp_Application::updateDesktopTitle()
3919 QString aTitle = applicationName();
3920 QString aVer = applicationVersion();
3921 if ( !aVer.isEmpty() )
3922 aTitle += QString( " " ) + aVer;
3924 if ( activeStudy() ) {
3925 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3926 aTitle += QString( " - [%1]" ).arg( sName );
3929 desktop()->setWindowTitle( aTitle );
3933 \brief Get map of the operations which can be performed
3934 on the module activation.
3936 The method should return the map of the kind \c {<id>:<name>}
3937 where \c <id> is an integer identifier of the operation and
3938 \c <name> is a title for the button to be added to the
3939 dialog box. After user selects the required operation by the
3940 clicking the corresponding button in the dialog box, its identifier
3941 is passed to the moduleActionSelected() method to process
3944 \return map of the operations
3945 \sa moduleActionSelected()
3947 QMap<int, QString> LightApp_Application::activateModuleActions() const
3949 QMap<int, QString> opmap;
3950 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3951 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3956 \brief Called when the used selectes required operation chosen
3957 from "Activate module" dialog box.
3959 Performs the required operation according to the user choice.
3961 \param id operation identifier
3962 \sa activateModuleActions()
3964 void LightApp_Application::moduleActionSelected( const int id )
3979 Updates windows after close document
3981 void LightApp_Application::afterCloseDoc()
3985 CAM_Application::afterCloseDoc();
3989 Updates actions of active module
3991 void LightApp_Application::updateModuleActions()
3994 if ( activeModule() ) {
3995 modName = activeModule()->moduleName();
3996 if ( !isModuleAccessible( modName ) ) {
3997 QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
3998 foreach( SUIT_Application* app, apps ) {
3999 LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
4000 if ( lapp && lapp != this )
4001 lapp->removeModuleAction( modName );
4006 LightApp_ModuleAction* moduleAction =
4007 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
4009 moduleAction->setActiveModule( modName );
4012 void LightApp_Application::removeModuleAction( const QString& modName )
4014 LightApp_ModuleAction* moduleAction =
4015 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
4017 moduleAction->removeModule( modName );
4020 bool LightApp_Application::checkModule( const QString& title )
4022 if ( title.isEmpty() )
4025 QString library = moduleLibrary( title, true );
4026 if ( library.isEmpty() )
4029 QString name = moduleName( title );
4031 bool isPyModule = library.contains( "SalomePyQtGUI" ) || library.contains( "SalomePyQtGUILight" );
4035 paths = QString( ::getenv( "PATH" ) ).split( ";", QString::SkipEmptyParts );
4036 #elif defined(__APPLE__)
4037 paths = QString( ::getenv( "DYLD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
4039 paths = QString( ::getenv( "LD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
4042 bool isFound = false;
4043 QStringList::const_iterator it;
4044 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
4046 isFound = QFileInfo( Qtx::addSlash( *it ) + library ).exists();
4052 "****************************************************************" << std::endl <<
4053 " Warning: library " << qPrintable( library ) << " is not found!" << std::endl <<
4054 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
4055 "****************************************************************" << std::endl);
4061 QString pyModule = QString( "%1GUI.py" ).arg( name );
4062 paths = QString( ::getenv( "PYTHONPATH" ) ).split( ":", QString::SkipEmptyParts );
4065 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
4067 isFound = QFileInfo( Qtx::addSlash( *it ) + pyModule ).exists();
4073 "****************************************************************" << std::endl <<
4074 " Warning: Python module " << qPrintable( pyModule ) << " is not found!" << std::endl <<
4075 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
4076 "****************************************************************" << std::endl);
4085 Gets current windows.
4086 \param winMap - output current windows map.
4088 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
4091 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
4092 ((LightApp_Module*)activeModule())->windows( winMap );
4094 defaultWindows( winMap );
4098 Gets current view managers.
4099 \param lst - output current view managers list.
4101 void LightApp_Application::currentViewManagers( QStringList& lst ) const
4104 if ( !activeStudy() )
4107 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
4108 ((LightApp_Module*)activeModule())->viewManagers( lst );
4110 defaultViewManagers( lst );
4116 void LightApp_Application::updateWindows()
4118 QMap<int, int> winMap;
4119 currentWindows( winMap );
4121 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
4123 if ( !dockWindow( it.key() ) )
4124 getWindow( it.key() );
4127 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
4129 QWidget* wid = it.value();
4130 if ( winMap.contains( it.key() ) )
4131 wid->setVisible( true );
4136 loadDockWindowsState();
4140 Updates view managers
4142 void LightApp_Application::updateViewManagers()
4145 currentViewManagers( lst );
4147 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
4148 getViewManager( *it, true );
4152 Loads windows geometry
4154 void LightApp_Application::loadDockWindowsState()
4158 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4159 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
4160 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
4163 if ( activeModule() )
4164 modName = activeModule()->name();
4165 else if ( activeStudy() )
4166 modName = "nomodule";
4168 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
4169 QByteArray aDefaultState;
4170 aResMgr->value( "windows_geometry", modName, aDefaultState );
4171 QByteArray aDefaultVisibility;
4172 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
4173 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
4174 aResMgr->setWorkingMode( prevMode );
4176 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
4179 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
4180 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
4182 if ( version > Qtx::versionToId( "7.4.1" ) )
4183 aResMgr->value( "windows_geometry", modName , arr );
4185 arr = aDefaultState;
4186 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4187 desktop()->restoreState( aTargetArray );
4190 QStringList mainToolbarsNames;
4191 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4192 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4193 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4195 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4198 QMap<QString, bool> *tbMap = 0;
4199 QMap<QString, bool> *dwMap = 0;
4201 QMap<QString, bool> userTbMap, userDwMap;
4202 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4204 QMap<QString, bool> defaultTbMap, defaultDwMap;
4205 if(hasDefaultVisibility) {
4206 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4212 if(hasDefaultVisibility){
4213 tbMap = &defaultTbMap;
4220 if(hasDefaultVisibility){
4221 dwMap = &defaultDwMap;
4226 QList<QToolBar*> tbList = findToolBars();
4227 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4229 QToolBar* tb = *tit;
4230 if ( tbMap->contains( tb->objectName() ) ) {
4231 tb->setVisible( (*tbMap)[tb->objectName()] );
4237 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4238 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4240 QDockWidget* dw = *dit;
4242 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4243 if ( po != desktop() )
4246 if ( dwMap->contains( dw->objectName() ) )
4247 dw->setVisible( (*dwMap)[dw->objectName()] );
4255 Saves windows geometry
4257 void LightApp_Application::saveDockWindowsState()
4262 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4263 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4265 if( !storeWin && !storeTb )
4269 if ( activeModule() )
4270 modName = activeModule()->name();
4271 else if ( activeStudy() )
4272 modName = "nomodule";
4274 QString versionId = GUI_VERSION_STR;
4275 #if GUI_DEVELOPMENT > 0
4279 QByteArray arr = desktop()->saveState();
4280 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4281 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4284 if ( myWinVis.contains( modName ) )
4285 visArr = myWinVis[modName];
4287 QMap<QString, bool> tbMap, dwMap;
4288 dockWindowsState( visArr, tbMap, dwMap );
4290 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4291 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4294 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4297 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4298 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4300 QDockWidget* wid = *it;
4301 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4304 visArr = dockWindowsState( tbMap, dwMap );
4306 myWinVis.insert( modName, visArr );
4309 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4312 QDataStream stream( &visArr, QIODevice::WriteOnly );
4314 stream << (uchar)ToolBarMarker;
4315 stream << tb.size();
4316 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4318 stream << tit.key();
4319 stream << (uchar)( tit.value() ? 1 : 0 );
4322 stream << (uchar)DockWidgetMarker;
4323 stream << dw.size();
4324 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4326 stream << wit.key();
4327 stream << (uchar)( wit.value() ? 1 : 0 );
4333 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4338 QByteArray visArr = arr;
4339 QDataStream stream( &visArr, QIODevice::ReadOnly );
4343 if ( marker != ToolBarMarker )
4348 for ( int i = 0; i < lines; ++i )
4351 stream >> objectName;
4354 tb.insert( objectName, shown );
4358 if ( marker != DockWidgetMarker )
4362 for ( int j = 0; j < lines; ++j )
4365 stream >> objectName;
4368 dw.insert( objectName, shown );
4373 Adds icon names for modules
4375 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4379 SUIT_ResourceMgr* resMgr = resourceMgr();
4383 QStringList modList;
4384 modules( modList, false );
4386 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4388 QString modName = *it;
4389 QString modIntr = moduleName( modName );
4390 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4392 if ( modIcon.isEmpty() )
4395 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4396 modIcon += QString( ".png" );
4398 iconMap.insert( modName, modIcon );
4403 Inserts items in popup, which necessary for current application
4405 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4408 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4409 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4410 selMgr->setSelectionCacheEnabled( true );
4412 SUIT_DataBrowser* ob = objectBrowser();
4414 CAM_Application::contextMenuPopup( type, thePopup, title );
4416 if ( ob && type == ob->popupClientType() ) {
4417 thePopup->addSeparator();
4418 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4419 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4420 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4423 #ifndef DISABLE_SALOMEOBJECT
4424 if ( selMgr && ob ) {
4425 SALOME_ListIO selected;
4426 selMgr->selectedObjects( selected );
4427 if(selected.Extent() == 1){
4428 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4429 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4430 if(obj && obj->renameAllowed()) {
4431 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4432 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4433 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4434 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4436 QList<QAction*> acts = thePopup->actions();
4437 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4438 thePopup->insertAction(firstAction,a);
4444 selMgr->setSelectionCacheEnabled( cacheIsOn );
4450 void LightApp_Application::createEmptyStudy()
4452 CAM_Application::createEmptyStudy();
4454 if ( objectBrowser() )
4455 objectBrowser()->updateTree();
4457 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4458 if ( aResMgr && activeStudy() ) {
4459 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4460 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4465 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4467 CAM_Application::setDesktop( desk );
4470 connect( desk, SIGNAL( message( const QString& ) ),
4471 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4472 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4473 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4474 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4475 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4481 \param mod - module to be activated
4483 bool LightApp_Application::activateModule( CAM_Module* mod )
4485 bool res = CAM_Application::activateModule( mod );
4487 if ( objectBrowser() )
4488 objectBrowser()->updateTree();
4494 \return keyborad accelerators manager object
4496 SUIT_Accel* LightApp_Application::accel() const
4502 Removes dead widget container from map
4504 void LightApp_Application::onWCDestroyed( QObject* ob )
4506 // remove destroyed widget container from windows map
4507 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4509 if ( itr.value() != ob )
4512 int key = itr.key();
4513 myWin.remove( key );
4518 void LightApp_Application::onMRUActivated( const QString& name )
4520 SUIT_Session* s = SUIT_Session::session();
4521 if ( s && s->activeApplication() == this )
4525 void LightApp_Application::onStylePreferences()
4527 #ifdef USE_SALOME_STYLE
4528 Style_PrefDlg dlg( desktop() );
4531 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4532 #endif // USE_SALOME_STYLE
4535 void LightApp_Application::onFullScreen(){
4536 if(myScreenHelper) {
4537 if(desktop()->isFullScreen())
4538 myScreenHelper->switchToNormalScreen();
4540 myScreenHelper->switchToFullScreen();
4545 Connects just added view manager
4547 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4549 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4550 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4551 CAM_Application::addViewManager( vm );
4555 Remove view manager from memory
4557 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4559 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4560 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4561 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4563 aStudy->removeObjectProperties( vm->getGlobalId() );
4565 CAM_Application::removeViewManager( vm );
4567 LightApp_SelectionMgr* selMgr = selectionMgr();
4568 QList<SUIT_Selector*> selectors;
4569 selMgr->selectors( selectors );
4570 foreach( SUIT_Selector* selector, selectors ) {
4571 if ( selector->owner() == vm->getViewModel() ) {
4576 // IPAL22894: Crash on closing OCC view
4582 Renames active window of desktop
4584 void LightApp_Application::onRenameWindow()
4589 QWidget* w = desktop()->activeWindow();
4594 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4595 if( ok && !name.isEmpty() )
4596 w->setWindowTitle( name );
4600 Closes active window of desktop
4602 void LightApp_Application::onCloseWindow()
4607 QWidget* w = desktop()->activeWindow();
4615 Closes all windows of desktop
4617 void LightApp_Application::onCloseAllWindow()
4619 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4623 QList<SUIT_ViewWindow*> wndList = desk->windows();
4624 SUIT_ViewWindow* wnd;
4625 foreach( wnd, wndList )
4633 Groups all windows of desktop
4635 void LightApp_Application::onGroupAllWindow()
4637 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4641 QtxWorkstack* wgStack = desk->workstack();
4647 \return default name for an active study
4649 void LightApp_Application::setDefaultStudyName( const QString& theName )
4651 QStringList anInfoList;
4652 modules( anInfoList, false );
4654 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4655 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4656 !aStudy->isSaved() )
4658 aStudy->setStudyName( theName );
4659 updateDesktopTitle();
4664 Custom event handler
4666 bool LightApp_Application::event( QEvent* e )
4668 if( e && e->type()==2000 )
4670 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4671 QString* d = ( QString* )ce->data();
4672 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4674 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4675 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4676 showPreferences( tr( "PREF_APP" ) );
4681 return CAM_Application::event( e );
4684 /*! Check data object */
4685 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4689 bool isSuitable = !theObj->entry().isEmpty() &&
4690 !theObj->componentDataType().isEmpty() &&
4691 !theObj->name().isEmpty();
4698 int LightApp_Application::openChoice( const QString& aName )
4700 int choice = CAM_Application::openChoice( aName );
4702 if ( choice == OpenExist ) // The document is already open.
4704 // Do you want to reload it?
4705 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4706 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4707 choice = OpenReload;
4713 bool LightApp_Application::openAction( const int choice, const QString& aName )
4720 STD_Application* app = 0;
4721 SUIT_Session* session = SUIT_Session::session();
4722 QList<SUIT_Application*> appList = session->applications();
4723 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4725 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4726 app = ::qobject_cast<STD_Application*>( *it );
4731 app->onCloseDoc( false );
4732 appList = session->applications();
4733 STD_Application* other = 0;
4734 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4735 other = ::qobject_cast<STD_Application*>( *it );
4738 res = other->onOpenDoc( aName );
4743 res = CAM_Application::openAction( choice, aName );
4750 QStringList LightApp_Application::viewManagersTypes() const
4752 QStringList aTypesList;
4753 aTypesList += myUserWmTypes;
4754 #ifndef DISABLE_GLVIEWER
4755 aTypesList<<GLViewer_Viewer::Type();
4757 #ifndef DISABLE_PLOT2DVIEWER
4758 aTypesList<<Plot2d_Viewer::Type();
4760 #ifndef DISABLE_QXGRAPHVIEWER
4761 aTypesList<<QxScene_Viewer::Type();
4763 #ifndef DISABLE_PVVIEWER
4764 aTypesList<<PVViewer_Viewer::Type();
4766 #ifndef DISABLE_PYVIEWER
4767 aTypesList<<PyViewer_Viewer::Type();
4769 #ifndef DISABLE_OCCVIEWER
4770 aTypesList<<OCCViewer_Viewer::Type();
4772 #ifndef DISABLE_VTKVIEWER
4773 #ifndef DISABLE_SALOMEOBJECT
4774 aTypesList<<SVTK_Viewer::Type();
4776 aTypesList<<VTKViewer_Viewer::Type();
4782 * Removes all view managers of known types
4783 * Other view managers are ignored
4785 void LightApp_Application::clearKnownViewManagers()
4787 QStringList aTypesList = viewManagersTypes();
4788 QList<SUIT_ViewManager*> aMgrList;
4789 viewManagers( aMgrList );
4790 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4791 if (aTypesList.contains(aMgr->getType()))
4792 removeViewManager(aMgr);
4797 Copy of current selection
4799 void LightApp_Application::onCopy()
4801 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4807 Paste of current data in clipboard
4809 void LightApp_Application::onPaste()
4811 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4817 Browse (i.e. set focus on) the published objects
4818 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4819 has been accepted by Ok (or Apply & Close) button
4820 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4821 (to select the first published object only)
4822 \return entry of the selected object
4824 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4825 const bool theIsApplyAndClose,
4826 const bool theIsOptimizedBrowsing )
4829 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4831 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4832 switch( aBrowsePolicy )
4836 case BP_ApplyAndClose:
4837 if( !theIsApplyAndClose )
4845 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4849 SUIT_DataBrowser* anOB = objectBrowser();
4853 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4857 QStringListIterator anIter( theEntryList );
4858 if( theIsOptimizedBrowsing )
4860 // go to the last entry
4862 if( anIter.hasPrevious() )
4866 // scroll to each entry in the list
4867 // (in optimized mode - to the last entry only)
4869 LightApp_DataObject* anObject = 0;
4870 while( anIter.hasNext() )
4872 anEntry = anIter.next();
4873 if( !anEntry.isEmpty() )
4875 anObject = aStudy->findObjectByEntry( anEntry );
4878 QModelIndex anIndex = aModel->index( anObject );
4879 anOB->treeView()->scrollTo( anIndex );
4884 // always select the last object
4885 if( anObject && !anEntry.isEmpty() )
4887 QList<SUIT_Selector*> aSelectorList;
4888 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4889 if( !aSelectorList.isEmpty() )
4891 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4893 bool anIsAutoBlock = aSelector->autoBlock();
4895 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4896 aSelector->setAutoBlock( false );
4898 SUIT_DataOwnerPtrList aList;
4899 #ifndef DISABLE_SALOMEOBJECT
4900 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4901 ( anObject->entry().toLatin1().constData(),
4902 anObject->componentDataType().toLatin1().constData(),
4903 anObject->name().toLatin1().constData() );
4904 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4906 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4909 aList.append( owner );
4910 selectionMgr()->setSelected( aList );
4913 // restore auto block flag
4914 aSelector->setAutoBlock( anIsAutoBlock );
4922 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4924 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4925 return study ? study->findObjectByEntry( id ) : 0;
4929 Checks that an object can be renamed.
4930 \param entry entry of the object
4931 \brief Return \c true if object can be renamed
4933 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4938 Rename object by entry.
4939 \param entry entry of the object
4940 \param name new name of the object
4941 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4943 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4947 /*! Process standard messages from desktop */
4948 void LightApp_Application::onDesktopMessage( const QString& message )
4950 const QString sectionSeparator = "/";
4952 if ( message.toLower() == "updateobjectbrowser" ||
4953 message.toLower() == "updateobjbrowser" ) {
4954 // update object browser
4955 updateObjectBrowser();
4957 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4958 QString vtype = message.split( sectionSeparator ).last();
4959 if ( !vtype.isEmpty() )
4960 getViewManager( vtype, true );
4963 QStringList data = message.split( sectionSeparator );
4964 if ( data.count() > 1 ) {
4965 QString msgType = data[0].trimmed();
4966 LightApp_Module* sMod = 0;
4967 CAM_Module* mod = module( msgType );
4969 mod = module( moduleTitle( msgType ) );
4970 if ( mod && mod->inherits( "LightApp_Module" ) )
4971 sMod = (LightApp_Module*)mod;
4973 if ( msgType.toLower() == "preferences" ) {
4974 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4975 // for example "preferences/Study/multi_file_dump/true"
4976 if ( data.count() > 3 ) {
4977 QString section = data[1].trimmed();
4978 QString param = data[2].trimmed();
4979 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4980 resourceMgr()->setValue( section, param, value );
4984 // received message for the module
4985 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4986 sMod->message( msg );
4994 Returns all top level toolbars.
4995 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4997 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4999 QList<QToolBar*> aResult;
5000 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
5001 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
5002 QToolBar* tb = *tit;
5003 QObject* po = Qtx::findParent( tb, "QMainWindow" );
5004 if ( po != desktop() )
5006 if ( names.isEmpty() || names.contains( tb->objectName() ) )
5013 Internal method to parse toolbars and dockable windows state.
5015 QByteArray LightApp_Application::processState(QByteArray& input,
5016 const bool processWin,
5017 const bool processTb,
5018 const bool isRestoring,
5019 QByteArray defaultState) {
5022 bool hasDefaultState = !defaultState.isEmpty();
5023 bool isDockWinWriten = false;
5025 //Write date from users settings
5027 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
5028 int marker, version;
5030 tmpInputData >> marker;
5031 tmpInputData >> version;
5032 tmpInputData >> dockmarker;
5033 tmpInputData >> nbDocWin;
5035 if(processWin && processTb && !isRestoring) {
5037 } else if(!processWin && !processTb ) {
5039 aRes = defaultState;
5041 QDataStream aData(&aRes, QIODevice::WriteOnly);
5042 QList<QToolBar*> aToolBars = findToolBars();
5045 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
5046 QToolBar* tb = *tit;
5047 aNames.append(tb->objectName());
5050 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
5051 if(toolBarMarkerIndex < 0)
5053 QDataStream anInputData(&input, QIODevice::ReadOnly);
5055 int toolBarMarkerIndexDef;
5056 if(hasDefaultState) {
5057 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
5058 if(toolBarMarkerIndexDef < 0)
5061 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
5063 QDataStream* aTargetData = 0;
5064 int aTargetIndex = -1;
5066 QByteArray currentArr = desktop()->saveState();
5067 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
5068 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
5069 if(processWin && useInputData) {
5070 aTargetData = &anInputData;
5071 aTargetIndex = toolBarMarkerIndex;
5073 //Write date from default settings
5074 if(hasDefaultState) {
5075 aTargetData = &anInputDataDef;
5076 aTargetIndex = toolBarMarkerIndexDef;
5078 //If no default state, write current snapshot of the dockable windows
5080 aTargetData = &anInputDataCur;
5081 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
5082 aTargetIndex = toolBarMarkerIndexCur;
5087 if(aTargetData && aTargetIndex >= 0 ) {
5088 aTargetData->device()->seek(0);
5089 while( aTargetData->device()->pos() < aTargetIndex ) {
5094 isDockWinWriten = true;
5101 aTargetData = &anInputData;
5102 aTargetIndex = toolBarMarkerIndex;
5104 if(hasDefaultState) {
5105 aTargetData = &anInputDataDef;
5106 aTargetIndex = toolBarMarkerIndexDef;
5110 if(aTargetData && aTargetIndex >= 0) {
5112 if(!isDockWinWriten ) {
5113 //Write version marker
5114 int marker, version;
5115 aTargetData->device()->seek(0);
5116 *aTargetData >> marker;
5117 *aTargetData >> version;
5120 aData << (uchar) QDockWidgetMarker;
5122 int shift = 4*sizeof(int) + sizeof(QSize);
5123 index = aTargetIndex - shift;
5125 index = aTargetIndex;
5128 aTargetData->device()->seek(index);
5129 while(!aTargetData->atEnd()) {
5134 } else { // Not treat toolbars
5135 aData << (uchar) QToolBarMarker;
5136 aData << (int) 0; //Nb toolbars = 0
5143 \brief Emits operationFinished signal.
5144 \param theModuleName the name of the module which perfomed the operation
5145 \param theOperationName the operation name
5146 \param theEntryList the list of the created objects entries
5148 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5149 const QString& theOperationName,
5150 const QStringList& theEntryList )
5152 emit operationFinished( theModuleName, theOperationName, theEntryList );
5156 Update visibility state of given objects
5158 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5159 SUIT_ViewModel* theViewModel )
5161 if ( !theViewModel || theList.isEmpty() ) return;
5163 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5164 if ( !aStudy ) return;
5166 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5168 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5169 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5171 if ( !obj || aStudy->isComponent( obj->entry() ) )
5174 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5175 if ( anObjModule ) {
5176 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5178 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5179 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5180 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5181 anObjState = Qtx::ShownState;
5183 anObjState = Qtx::HiddenState;
5185 aStudy->setVisibilityState( obj->entry(), anObjState );
5192 * Called when window activated
5194 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5196 SUIT_DataBrowser* anOB = objectBrowser();
5199 SUIT_DataObject* rootObj = anOB->root();
5203 DataObjectList listObj = rootObj->children( true );
5205 SUIT_ViewModel* vmod = 0;
5206 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5207 vmod = vman->getViewModel();
5208 updateVisibilityState( listObj, vmod );
5212 Called then view manager removed
5214 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5216 ViewManagerList lst;
5217 viewManagers( lst );
5218 if ( lst.count() == 1) { // in case if closed last view window
5219 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5221 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5226 Check existing document.
5228 bool LightApp_Application::checkExistingDoc()
5231 if( activeStudy() ) {
5232 int answer = !activeStudy()->isModified() ? 1 :
5233 SUIT_MessageBox::question( desktop(),
5234 tr( "APPCLOSE_CAPTION" ),
5235 tr( "STUDYCLOSE_DESCRIPTION" ),
5236 tr( "APPCLOSE_SAVE" ),
5237 tr( "APPCLOSE_CLOSE" ),
5238 tr( "APPCLOSE_CANCEL" ), 0 );
5240 if ( activeStudy()->isSaved() ) {
5243 } else if ( onSaveAsDoc() ) {
5244 if( !closeDoc( false ) ) {
5251 else if( answer == 1 ) {
5253 } else if( answer == 2 ) {
5260 #ifndef DISABLE_PYCONSOLE
5262 PyConsole_Interp* LightApp_Application::getPyInterp()
5264 static PyConsole_Interp* myInterp = 0;
5266 myInterp = createPyInterp();
5267 myInterp->initialize();
5272 PyConsole_Interp* LightApp_Application::createPyInterp()
5274 return new PyConsole_Interp();
5277 #endif // DISABLE_PYCONSOLE