1 // Copyright (C) 2007-2019 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( onHelpContentsModule() ) );
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( onHelpContentsModule() ) );
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( onHelpContentsModule() ) );
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 = Qtx::getenv( rootDir.toUtf8().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", "" );
670 if ( helpSubMenu.contains( "%1" ) )
671 helpSubMenu = helpSubMenu.arg( aModule );
672 QStringList listOfParam = resMgr->parameters( docSection );
673 foreach( QString paramName, listOfParam ) {
674 QString valueStr = resMgr->stringValue( docSection, paramName );
675 if ( !valueStr.isEmpty() ) {
676 QStringList valueItems = valueStr.split( ";;", QString::SkipEmptyParts );
677 foreach( QString item, valueItems ) {
678 if ( item.startsWith( "http", Qt::CaseInsensitive ) ) {
679 QString key = paramName.contains( "%1" ) ? paramName.arg( aModule ) : paramName;
680 helpData.insert( key, item );
684 QFileInfo fi( item );
685 if ( fi.isRelative() && !modDir.isEmpty() )
686 item = Qtx::addSlash( modDir ) + item;
687 if ( QFile::exists( item ) ) {
688 QString key = paramName.contains( "%1" ) ? paramName.arg( aModule ) : paramName;
689 helpData.insert( key, item );
698 if ( helpData.isEmpty() && !modDir.isEmpty() ) {
699 QStringList idxLst = QStringList() << modDir << "share" << "doc" << "salome" << "gui" << modName << "index.html";
700 QString indexFile = idxLst.join( QDir::separator() ); // index file
701 if ( QFile::exists( indexFile ) )
702 helpData.insert( tr( "%1 module Users's Guide" ).arg( aModule ), indexFile );
705 IMapConstIterator<QString, QString > fileIt;
706 for ( fileIt = helpData.begin(); fileIt != helpData.end(); fileIt++ ) {
707 QString helpItemPath = fileIt.key();
708 // remove all '//' occurances
709 while ( helpItemPath.contains( "//" ) )
710 helpItemPath.replace( "//", "" );
711 // obtain submenus hierarchy if given
712 QStringList smenus = helpItemPath.split( "/" );
713 helpItemPath = smenus.takeLast();
714 // workaround for User's Guide and Developer's Guide to avoid having single item in module's submenu.
715 if ( helpItemPath == userGuide || helpItemPath == devGuide ) {
716 QString menuPath = smenus.join( "/" );
717 QStringList allKeys = helpData.keys();
718 QStringList total = allKeys.filter( QRegExp( QString( "^%1" ).arg( menuPath ) ) );
719 if ( total.count() == 1 && smenus.count() > 0 )
720 helpItemPath = smenus.takeLast();
722 QPixmap helpIcon = fileIt.value().startsWith( "http", Qt::CaseInsensitive ) ?
723 resMgr->loadPixmap( "STD", tr( "ICON_WWW" ), false ) : resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false );
724 QAction* a = createAction( id, helpItemPath, helpIcon, helpItemPath, helpItemPath,
725 0, desk, false, this, SLOT( onHelpContentsModule() ) );
726 a->setData( fileIt.value() );
727 if ( !helpSubMenu.isEmpty() ) {
728 smenus.prepend( helpSubMenu );
730 // create sub-menus hierarchy
731 int menuId = helpMenu;
732 foreach ( QString subMenu, smenus )
733 menuId = createMenu( subMenu, menuId, -1, 5 );
734 createMenu( a, menuId, -1, ( menuId != helpMenu && (helpItemPath == userGuide || helpItemPath == devGuide) ) ? 0 : 5 );
739 // - Additional help items
741 createMenu( separator(), helpMenu, -1, 10 );
743 QStringList addHelpItems = resMgr->parameters( "add_help" );
744 foreach ( QString paramName, addHelpItems ) {
745 QString valueStr = resMgr->stringValue( "add_help", paramName );
746 if ( !valueStr.isEmpty() ) {
747 QStringList valueItems = valueStr.split( ";;", QString::SkipEmptyParts );
748 foreach( QString item, valueItems ) {
749 if ( item.startsWith( "http", Qt::CaseInsensitive ) || QFile::exists( item ) ) {
750 QPixmap helpIcon = item.startsWith( "http", Qt::CaseInsensitive ) ?
751 resMgr->loadPixmap( "STD", tr( "ICON_WWW" ), false ) : resMgr->loadPixmap( "STD", tr( "ICON_HELP" ), false );
752 QAction* a = createAction( id++, paramName, helpIcon, paramName, paramName,
753 0, desk, false, this, SLOT( onHelpContentsModule() ) );
755 createMenu( a, helpMenu, -1, 10 );
763 static QtxMRUAction* mru = new QtxMRUAction( tr( "TOT_DESK_MRU" ), tr( "MEN_DESK_MRU" ), 0 );
764 connect( mru, SIGNAL( activated( const QString& ) ), this, SLOT( onMRUActivated( const QString& ) ) );
765 registerAction( MRUId, mru );
767 // default icon for neutral point ('SALOME' module)
768 QPixmap defIcon = resMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false );
769 if ( defIcon.isNull() )
770 defIcon = QPixmap( imageEmptyIcon );
772 //! default icon for any module
773 QPixmap modIcon = resMgr->loadPixmap( "LightApp", tr( "APP_MODULE_ICO" ), false );
774 if ( modIcon.isNull() )
775 modIcon = QPixmap( imageEmptyIcon );
778 modules( modList, false );
780 if ( modList.count() > 1 )
782 LightApp_ModuleAction* moduleAction =
783 new LightApp_ModuleAction( tr( "APP_NAME" ), defIcon, desk );
785 QMap<QString, QString> iconMap;
786 moduleIconNames( iconMap );
788 const int iconSize = 20;
790 QStringList::Iterator it;
791 for ( it = modList.begin(); it != modList.end(); ++it )
793 QString modName = moduleName( *it );
796 if ( iconMap.contains( *it ) )
797 iconName = iconMap[*it];
799 QPixmap icon = resMgr->loadPixmap( modName, iconName, false );
804 "****************************************************************" << std::endl <<
805 " Warning: icon for " << qPrintable(*it) << " is not found!" << std::endl <<
806 " Using the default icon." << std::endl <<
807 "****************************************************************" << std::endl);
809 icon = Qtx::scaleIcon( icon, iconSize );
811 moduleAction->insertModule( *it, icon );
814 connect( moduleAction, SIGNAL( moduleActivated( const QString& ) ),
815 this, SLOT( onModuleActivation( const QString& ) ) );
816 registerAction( ModulesListId, moduleAction );
820 int windowMenu = createMenu( tr( "MEN_DESK_WINDOW" ), -1, MenuWindowId, 100 );
821 int newWinMenu = createMenu( tr( "MEN_DESK_NEWWINDOW" ), windowMenu, -1, 0 );
823 createAction( CloseId, tr( "TOT_CLOSE" ), QIcon(), tr( "MEN_DESK_CLOSE" ), tr( "PRP_CLOSE" ),
824 Qt::CTRL+Qt::Key_F4, desk, false, this, SLOT( onCloseWindow() ) );
825 createAction( CloseAllId, tr( "TOT_CLOSE_ALL" ), QIcon(), tr( "MEN_DESK_CLOSE_ALL" ), tr( "PRP_CLOSE_ALL" ),
826 0, desk, false, this, SLOT( onCloseAllWindow() ) );
827 createAction( GroupAllId, tr( "TOT_GROUP_ALL" ), QIcon(), tr( "MEN_DESK_GROUP_ALL" ), tr( "PRP_GROUP_ALL" ),
828 0, desk, false, this, SLOT( onGroupAllWindow() ) );
830 createMenu( CloseId, windowMenu, 0, -1 );
831 createMenu( CloseAllId, windowMenu, 0, -1 );
832 createMenu( GroupAllId, windowMenu, 0, -1 );
833 createMenu( separator(), windowMenu, -1, 0 );
835 #ifndef DISABLE_GLVIEWER
836 createActionForViewer( NewGLViewId, newWinMenu, QString::number( 0 ), Qt::ALT+Qt::Key_G );
838 #ifndef DISABLE_PLOT2DVIEWER
839 createActionForViewer( NewPlot2dId, newWinMenu, QString::number( 1 ), Qt::ALT+Qt::Key_P );
841 #ifndef DISABLE_OCCVIEWER
842 createActionForViewer( NewOCCViewId, newWinMenu, QString::number( 2 ), Qt::ALT+Qt::Key_O );
844 #ifndef DISABLE_VTKVIEWER
845 createActionForViewer( NewVTKViewId, newWinMenu, QString::number( 3 ), Qt::ALT+Qt::Key_K );
847 #ifndef DISABLE_QXGRAPHVIEWER
848 createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S );
850 #ifndef DISABLE_GRAPHICSVIEW
851 createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_C );
853 #ifndef DISABLE_PVVIEWER
854 createActionForViewer( NewPVViewId, newWinMenu, QString::number( 6 ), Qt::ALT+Qt::Key_A );
856 #ifndef DISABLE_PYVIEWER
857 createActionForViewer( NewPyViewerId, newWinMenu, QString::number( 7 ), Qt::ALT+Qt::Key_Y );
860 createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
861 Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
862 createMenu( RenameId, windowMenu, -1 );
864 int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 );
865 createMenu( PreferencesId, fileMenu, 50, -1 );
866 createMenu( separator(), fileMenu, -1, 50, -1 );
868 createMenu( separator(), fileMenu, -1, 100, -1 );
869 createMenu( MRUId, fileMenu, 100, -1 );
870 createMenu( separator(), fileMenu, -1, 100, -1 );
872 #ifdef USE_SALOME_STYLE
873 createAction( StyleId, tr( "TOT_THEME" ), QIcon(), tr( "MEN_DESK_THEME" ), tr( "PRP_THEME" ),
874 0, desk, false, this, SLOT( onStylePreferences() ) );
875 #endif // USE_SALOME_STYLE
877 createAction( FullScreenId, tr( "TOT_FULLSCREEN" ), QIcon(), tr( "MEN_DESK_FULLSCREEN" ), tr( "PRP_FULLSCREEN" ),
878 Qt::Key_F11, desk, false, this, SLOT( onFullScreen() ) );
881 int viewMenu = createMenu( tr( "MEN_DESK_VIEW" ), -1 );
882 createMenu( separator(), viewMenu, -1, 20, -1 );
883 #ifdef USE_SALOME_STYLE
884 createMenu( StyleId, viewMenu, 20, -1 );
885 #endif // USE_SALOME_STYLE
886 createMenu( FullScreenId, viewMenu, 20, -1 );
888 int modTBar = createTool( tr( "INF_TOOLBAR_MODULES" ), // title (language-dependant)
889 QString( "SalomeModules" ) ); // name (language-independant)
890 createTool( ModulesListId, modTBar );
893 /*!On module activation action.*/
894 void LightApp_Application::onModuleActivation( const QString& modName )
896 // Force user to create/open a study before module activation
897 QMap<QString, QString> iconMap;
898 moduleIconNames( iconMap );
899 QPixmap icon = resourceMgr()->loadPixmap( moduleName( modName ), iconMap[ modName ], false );
901 icon = resourceMgr()->loadPixmap( "LightApp", tr( "APP_MODULE_BIG_ICO" ), false ); // default icon for any module
903 bool cancelled = false;
905 while ( !modName.isEmpty() && !activeStudy() && !cancelled ){
906 LightApp_ModuleDlg aDlg( desktop(), modName, icon );
907 QMap<int, QString> opmap = activateModuleActions();
908 for ( QMap<int, QString>::ConstIterator it = opmap.begin(); it != opmap.end(); ++it )
909 aDlg.addButton( it.value(), it.key() );
911 int res = aDlg.exec();
913 // some operation is selected
914 moduleActionSelected( res );
918 putInfo( tr("INF_CANCELLED") );
920 LightApp_ModuleAction* moduleAction =
921 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
923 moduleAction->setActiveModule( QString() );
929 activateModule( modName );
932 /*!Default module activation.*/
933 QString LightApp_Application::defaultModule() const
935 QStringList aModuleNames;
936 modules( aModuleNames, false ); // obtain a complete list of module names for the current configuration
937 //! If there's the one and only module --> activate it automatically
938 //! TODO: Possible improvement - default module can be taken from preferences
939 return aModuleNames.count() > 1 ? "" : ( aModuleNames.count() ? aModuleNames.first() : "" );
942 /*!On new window slot.*/
943 void LightApp_Application::onNewWindow()
945 const QObject* obj = sender();
946 if ( !obj || !obj->inherits( "QAction" ) )
950 int id = actionId( (QAction*)obj );
953 #ifndef DISABLE_GLVIEWER
955 type = GLViewer_Viewer::Type();
958 #ifndef DISABLE_PLOT2DVIEWER
960 type = Plot2d_Viewer::Type();
963 #ifndef DISABLE_OCCVIEWER
965 type = OCCViewer_Viewer::Type();
968 #ifndef DISABLE_VTKVIEWER
970 type = VTKViewer_Viewer::Type();
973 #ifndef DISABLE_QXGRAPHVIEWER
974 case NewQxSceneViewId:
975 type = QxScene_Viewer::Type();
978 #ifndef DISABLE_GRAPHICSVIEW
979 case NewGraphicsViewId:
980 type = GraphicsView_Viewer::Type();
983 #ifndef DISABLE_PVVIEWER
985 type = PVViewer_Viewer::Type();
988 #ifndef DISABLE_PYVIEWER
990 type = PyViewer_Viewer::Type();
995 if ( !type.isEmpty() )
996 createViewManager( type );
1000 SLOT: Creates new document
1002 void LightApp_Application::onNewDoc()
1004 if ( !checkExistingDoc() )
1007 //asl: fix for 0020515
1008 saveDockWindowsState();
1010 CAM_Application::onNewDoc();
1014 SLOT: Opens new document
1016 void LightApp_Application::onOpenDoc()
1018 SUIT_Study* study = activeStudy();
1020 if ( !checkExistingDoc( false ) )
1023 QString aName = getFileName( true, QString(), getFileFilter( true ), QString(), 0 );
1024 if ( aName.isNull() ) //Cancel
1030 if ( !study ) // new study will be create in THIS application
1033 updateViewManagers();
1038 SLOT: Opens new document.
1039 \param aName - name of file
1041 bool LightApp_Application::onOpenDoc( const QString& aName )
1043 if ( !checkExistingDoc() )
1046 saveDockWindowsState();
1048 // We should take mru action first because this application instance can be deleted later.
1049 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1051 bool res = CAM_Application::onOpenDoc( aName );
1056 mru->insert( aName );
1058 mru->remove( aName );
1064 SLOT: Displays "About" message box
1066 void LightApp_Application::onHelpAbout()
1068 LightApp_AboutDlg dlg( applicationName(), applicationVersion(), desktop() );
1073 Private SLOT: Called on selection is changed
1074 Dispatchs active module that selection is changed
1076 void LightApp_Application::onSelection()
1078 //MESSAGE("onSelection")
1079 onSelectionChanged();
1081 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
1082 ((LightApp_Module*)activeModule())->selectionChanged();
1087 \param study - SUIT_Study.
1089 void LightApp_Application::setActiveStudy( SUIT_Study* study )
1091 CAM_Application::setActiveStudy( study );
1095 Enables/Disables menu items and toolbar buttons. Rebuild menu
1097 void LightApp_Application::updateCommandsStatus()
1099 CAM_Application::updateCommandsStatus();
1102 #ifndef DISABLE_GLVIEWER
1103 a = action( NewGLViewId );
1105 a->setEnabled( activeStudy() );
1108 #ifndef DISABLE_PLOT2DVIEWER
1109 a = action( NewPlot2dId );
1111 a->setEnabled( activeStudy() );
1114 #ifndef DISABLE_OCCVIEWER
1115 a = action( NewOCCViewId );
1117 a->setEnabled( activeStudy() );
1120 #ifndef DISABLE_VTKVIEWER
1121 a = action( NewVTKViewId );
1123 a->setEnabled( activeStudy() );
1126 #ifndef DISABLE_QXGRAPHVIEWER
1127 a = action( NewQxSceneViewId );
1129 a->setEnabled( activeStudy() );
1132 #ifndef DISABLE_GRAPHICSVIEW
1133 a = action( NewGraphicsViewId );
1135 a->setEnabled( activeStudy() );
1138 #ifndef DISABLE_PVVIEWER
1139 a = action( NewPVViewId );
1141 a->setEnabled( activeStudy() );
1144 #ifndef DISABLE_PYVIEWER
1145 a = action( NewPyViewerId );
1147 a->setEnabled( activeStudy() );
1153 Runs system command in separate thread
1155 class RunBrowser: public QThread
1158 static void execute( LightApp_Application* application,
1159 const QString& browser,
1160 const QString& parameters,
1161 const QString& url )
1163 (new RunBrowser( application, browser, parameters, url ))->start();
1167 RunBrowser( LightApp_Application* application,
1168 const QString& browser,
1169 const QString& parameters,
1171 : myApplication( application ),
1172 myBrowser( browser ),
1173 myParameters( parameters ),
1176 if ( !myUrl.startsWith( "http", Qt::CaseInsensitive ) )
1179 if ( myUrl.startsWith( "file://", Qt::CaseInsensitive ) )
1180 myUrl = myUrl.remove( 0, QString( "file://" ).count() );
1181 // For the external browser we always specify 'file://' protocol,
1182 // because some web browsers (e.g. Mozilla Firefox) can't open local file without protocol.
1183 myUrl = myUrl.prepend( "file://" );
1185 connect(this, SIGNAL(finished()), SLOT(deleteLater()));
1190 if ( !myBrowser.isEmpty() && !myUrl.isEmpty() )
1193 QString cmdLine = QString( "\"%1\" %2 \"%3\"" ).arg( myBrowser, myParameters, myUrl );
1195 QString cmdLine = QString( "%1 %2 \"%3\"" ).arg( myBrowser, myParameters, myUrl );
1197 QProcess* proc = new QProcess();
1198 proc->start( cmdLine );
1199 if ( !proc->waitForStarted() )
1201 SALOME_CustomEvent* ce2000 = new SALOME_CustomEvent( 2000 );
1202 QString* msg = new QString( QObject::tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).arg( myBrowser, myUrl ) );
1203 ce2000->setData( msg );
1204 QApplication::postEvent( myApplication, ce2000 );
1210 LightApp_Application* myApplication;
1212 QString myParameters;
1216 void LightApp_Application::showHelp( const QString& path )
1218 SUIT_ResourceMgr* resMgr = resourceMgr();
1220 #if DISABLE_QTXWEBBROWSER
1221 bool useExternalBrowser = true;
1223 bool useExternalBrowser = resMgr->booleanValue("ExternalBrowser", "use_external_browser", false );
1226 if ( useExternalBrowser )
1229 QString browser = resMgr->stringValue( "ExternalBrowser", "winapplication" ) ;
1231 QString browser = resMgr->stringValue( "ExternalBrowser", "application" );
1233 QString parameters = resMgr->stringValue("ExternalBrowser", "parameters");
1235 if ( !browser.isEmpty() )
1237 RunBrowser::execute( this, browser, parameters, path );
1241 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "DEFINE_EXTERNAL_BROWSER" ),
1242 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
1243 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
1246 path << tr( "PREF_CATEGORY_SALOME" ) << tr( "PREF_TAB_GENERAL" )
1247 << tr( "PREF_GROUP_EXT_BROWSER" ) << tr( "PREF_APP" );
1248 showPreferences( path );
1254 QStringList cmdLine;
1255 cmdLine << QString( "--language=%1" ).arg( resMgr->stringValue( "language", "language" ) );
1256 cmdLine << QString( "--add=%1" ).arg( QApplication::instance()->applicationPid() );
1258 QProcess::startDetached( "HelpBrowser", cmdLine );
1263 SLOT: Displays help contents for choosen module
1265 void LightApp_Application::onHelpContentsModule()
1267 const QAction* a = (QAction*) sender();
1268 QString helpFile = a->data().toString();
1269 if ( !helpFile.isEmpty() )
1270 showHelp( helpFile );
1274 SLOT: Displays contextual help (e.g. for choosen dialog)
1276 void LightApp_Application::onHelpContextModule( const QString& component,
1278 const QString& context )
1281 if ( !url.startsWith( "http", Qt::CaseInsensitive ) )
1284 QFileInfo fi( url );
1285 if ( fi.isRelative() && !component.isEmpty() )
1287 QString rootDir = Qtx::getenv( (component + "_ROOT_DIR").toLatin1().constData() );
1288 if ( !rootDir.isEmpty() )
1290 path = (QStringList() << rootDir << "share" << "doc" << "salome" << "gui" << component << url).join( QDir::separator() );
1294 if ( !context.isEmpty() )
1296 path += QString( "#%1" ).arg( context );
1302 Sets enable or disable some actions on selection changed.
1304 void LightApp_Application::onSelectionChanged()
1306 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
1307 bool canCopy = m ? m->canCopy() : false;
1308 bool canPaste = m ? m->canPaste() : false;
1310 action( EditCopyId )->setEnabled(canCopy);
1311 action( EditPasteId )->setEnabled(canPaste);
1315 SLOT: Performs some actions when dockable windows are triggered
1317 void LightApp_Application::onDockWindowVisibilityChanged( bool )
1321 QWidget* LightApp_Application::dockWindow( const int id ) const
1324 if ( myWin.contains( id ) )
1329 QDockWidget* LightApp_Application::windowDock( QWidget* wid ) const
1334 QDockWidget* dock = 0;
1335 QWidget* w = wid->parentWidget();
1336 while ( w && !dock )
1338 dock = ::qobject_cast<QDockWidget*>( w );
1339 w = w->parentWidget();
1344 void LightApp_Application::insertDockWindow( const int id, QWidget* wid )
1349 if ( wid != dockWindow( id ) )
1350 removeDockWindow( id );
1352 myWin.insert( id, wid );
1354 QtxDockWidget* dock = new QtxDockWidget( true, desktop() );
1355 connect( dock, SIGNAL( destroyed( QObject* ) ), this, SLOT( onWCDestroyed( QObject* ) ) );
1357 dock->setFeatures( QDockWidget::AllDockWidgetFeatures );
1358 dock->setObjectName( wid->objectName().isEmpty() ? QString( "window_%1" ).arg( id ) :
1359 QString( "%1Dock" ).arg( wid->objectName() ) );
1360 dock->setWidget( wid );
1361 dock->toggleViewAction()->setData( QVariant( wid->objectName() ) );
1362 connect( dock->toggleViewAction(), SIGNAL( triggered( bool ) ),
1363 this, SLOT( onDockWindowVisibilityChanged( bool ) ) );
1365 QKeySequence accel = wid->property( "shortcut" ).value<QKeySequence>();
1366 if ( !accel.isEmpty() )
1367 dock->toggleViewAction()->setShortcut( accel );
1372 void LightApp_Application::removeDockWindow( const int id )
1374 QWidget* wid = dockWindow( id );
1380 QDockWidget* dock = windowDock( wid );
1384 dock->setWidget( 0 );
1385 wid->setParent( 0 );
1386 wid->setVisible( false );
1390 void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea place )
1392 QDockWidget* dock = windowDock( dockWindow( id ) );
1393 if ( dock && desktop() ) {
1394 desktop()->addDockWidget( place, dock );
1395 QtxDockAction* a = qobject_cast<QtxDockAction*>( action( ViewWindowsId ) );
1396 if ( a ) a->update();
1402 \param flag - key for window
1403 Flag used how identificator of window in windows list.
1405 QWidget* LightApp_Application::getWindow( const int flag)
1407 QWidget* wid = dockWindow( flag );
1409 insertDockWindow( flag, wid = createWindow( flag ) );
1411 QMap<int, int> winMap;
1412 currentWindows( winMap );
1413 if ( winMap.contains( flag ) )
1414 placeDockWindow( flag, (Qt::DockWidgetArea)winMap[flag] );
1420 \return Object Browser
1422 SUIT_DataBrowser* LightApp_Application::objectBrowser()
1424 return qobject_cast<SUIT_DataBrowser*>( dockWindow( WT_ObjectBrowser ) );
1430 LogWindow* LightApp_Application::logWindow()
1432 return qobject_cast<LogWindow*>( dockWindow( WT_LogWindow ) );
1435 #ifndef DISABLE_PYCONSOLE
1437 This returns the python console integrated to the GUI. Depending
1438 when you request the python console, this function could return
1439 null. Then the optional parameter force (default to false) can be
1440 set to force the creation of the python console if it is not done
1442 \param force - if true, the pythonConsole is created if it does not exist yet
1443 \return Python Console
1445 PyConsole_Console* LightApp_Application::pythonConsole(const bool force)
1447 QWidget* wid = dockWindow( WT_PyConsole );
1448 if ( !wid && force==true) {
1449 wid = getWindow(WT_PyConsole);
1451 return qobject_cast<PyConsole_Console*>( wid );
1456 Updates object browser and maybe data models
1457 \param updateModels - if it is true, then data models are updated
1459 void LightApp_Application::updateObjectBrowser( const bool updateModels )
1461 // update existing data models
1464 const bool isAutoUpdate = objectBrowser() ? objectBrowser()->autoUpdate() : true;
1465 if ( objectBrowser() )
1466 objectBrowser()->setAutoUpdate( false );
1468 LightApp_Study* study = dynamic_cast<LightApp_Study*>(activeStudy());
1470 CAM_Study::ModelList dm_list;
1471 study->dataModels( dm_list );
1472 QListIterator<CAM_DataModel*> it( dm_list );
1473 while ( it.hasNext() ) {
1474 CAM_DataModel* camDM = it.next();
1475 if ( camDM && camDM->inherits( "LightApp_DataModel" ) )
1476 ((LightApp_DataModel*)camDM)->update();
1480 if( objectBrowser() )
1481 objectBrowser()->setAutoUpdate( isAutoUpdate );
1484 if ( objectBrowser() ) {
1485 objectBrowser()->updateGeometry();
1486 objectBrowser()->updateTree( 0, false );
1493 LightApp_Preferences* LightApp_Application::preferences() const
1495 return preferences( false );
1499 \return first view manager of some type
1500 \param vmType - type of view manager
1501 \param create - is it necessary to create view manager in case, when there is no manager of such type
1503 SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, const bool create )
1505 SUIT_ViewManager* aVM = viewManager( vmType );
1506 SUIT_ViewManager* anActiveVM = CAM_Application::activeViewManager();
1507 MESSAGE("vmType: " << vmType.toStdString() << " aVM: " << aVM << " anActiveVM: " << anActiveVM );
1508 if ( anActiveVM && anActiveVM->getType() == vmType )
1510 MESSAGE("aVM = anActiveVM");
1514 bool keepDetached = property("keep_detached").toBool();
1515 if ( aVM && (!aVM->getDetached() || keepDetached) && create )
1517 if ( !aVM->getActiveView() )
1519 MESSAGE("aVM->createView()");
1524 MESSAGE("desktop()->setActiveWindow: " << aVM->getActiveView());
1525 desktop()->setActiveWindow( aVM->getActiveView() );
1530 MESSAGE("aVM = createViewManager( vmType )");
1531 aVM = createViewManager( vmType );
1538 Creates view manager of some type
1539 \param vmType - type of view manager
1541 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, bool detached )
1543 SUIT_ResourceMgr* resMgr = resourceMgr();
1545 SUIT_ViewManager* viewMgr = 0;
1546 #ifndef DISABLE_GLVIEWER
1547 if( vmType == GLViewer_Viewer::Type() )
1549 viewMgr = new GLViewer_ViewManager( activeStudy(), desktop() );
1550 new LightApp_GLSelector( (GLViewer_Viewer2d*)viewMgr->getViewModel(), mySelMgr );
1553 #ifndef DISABLE_PLOT2DVIEWER
1554 if( vmType == Plot2d_Viewer::Type() )
1556 viewMgr = new Plot2d_ViewManager( activeStudy(), desktop() );
1558 #ifndef DISABLE_SALOMEOBJECT
1559 SPlot2d_Viewer* v = new SPlot2d_Viewer();
1561 new LightApp_Plot2dSelector( v, mySelMgr );
1563 vm = new Plot2d_Viewer();
1565 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1566 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
1569 Plot2d_ViewFrame* frame = wnd->getViewFrame();
1570 frame->setBackgroundColor( resMgr->colorValue( "Plot2d", "Background", frame->backgroundColor() ) );
1574 #ifndef DISABLE_QXGRAPHVIEWER
1575 if( vmType == QxScene_Viewer::Type() )
1577 viewMgr = new QxScene_ViewManager( activeStudy(), desktop() );
1578 QxScene_Viewer* vm = new QxScene_Viewer();
1579 viewMgr->setViewModel( vm );
1580 //QxScene_ViewWindow* wnd = dynamic_cast<QxScene_ViewWindow*>( viewMgr->getActiveView() );
1583 #ifndef DISABLE_GRAPHICSVIEW
1584 if( vmType == GraphicsView_Viewer::Type() )
1586 viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() );
1587 new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
1590 #ifndef DISABLE_PVVIEWER
1591 if( vmType == PVViewer_Viewer::Type() )
1593 if (( viewMgr = dynamic_cast<PVViewer_ViewManager*>( getViewManager( vmType, false )))) {
1594 viewMgr->getActiveView()->setFocus();
1597 viewMgr = new PVViewer_ViewManager( activeStudy(), desktop() );
1601 #ifndef DISABLE_PYVIEWER
1602 if( vmType == PyViewer_Viewer::Type() )
1604 viewMgr = new PyViewer_ViewManager( activeStudy(), desktop() );
1607 #ifndef DISABLE_OCCVIEWER
1608 if( vmType == OCCViewer_Viewer::Type() )
1610 viewMgr = new OCCViewer_ViewManager( activeStudy(), desktop() );
1611 OCCViewer_Viewer* vm;
1612 #ifndef DISABLE_SALOMEOBJECT
1613 vm = new SOCC_Viewer();
1615 vm = new OCCViewer_Viewer( true );
1617 vm->setBackground( OCCViewer_ViewFrame::TOP_LEFT,
1618 resMgr->backgroundValue( "OCCViewer", "xz_background", vm->background(OCCViewer_ViewFrame::TOP_LEFT) ) );
1619 vm->setBackground( OCCViewer_ViewFrame::TOP_RIGHT,
1620 resMgr->backgroundValue( "OCCViewer", "yz_background", vm->background(OCCViewer_ViewFrame::TOP_RIGHT) ) );
1621 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_LEFT,
1622 resMgr->backgroundValue( "OCCViewer", "xy_background", vm->background(OCCViewer_ViewFrame::BOTTOM_LEFT) ) );
1623 vm->setBackground( OCCViewer_ViewFrame::BOTTOM_RIGHT,
1624 resMgr->backgroundValue( "OCCViewer", "background", vm->background(OCCViewer_ViewFrame::MAIN_VIEW) ) );
1626 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1627 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ));
1628 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1629 vm->setProjectionType( resMgr->integerValue( "OCCViewer", "projection_mode", vm->projectionType() ) );
1630 vm->setStereoType( resMgr->integerValue( "OCCViewer", "stereo_type", vm->stereoType() ) );
1631 vm->setAnaglyphFilter( resMgr->integerValue( "OCCViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1632 vm->setStereographicFocus( resMgr->integerValue( "OCCViewer", "focus_type", vm->stereographicFocusType() ),
1633 resMgr->doubleValue( "OCCViewer", "focus_value", vm->stereographicFocusValue() ));
1634 vm->setInterocularDistance( resMgr->integerValue( "OCCViewer", "iod_type", vm->interocularDistanceType() ),
1635 resMgr->doubleValue( "OCCViewer", "iod_value", vm->interocularDistanceValue() ));
1637 vm->setReverseStereo( resMgr->booleanValue( "OCCViewer", "reverse_stereo", vm->isReverseStereo() ) );
1638 vm->setVSync( resMgr->booleanValue( "OCCViewer", "enable_vsync", vm->isVSync() ) );
1639 vm->setQuadBufferSupport( resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1640 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1641 vm->enablePreselection( resMgr->booleanValue( "OCCViewer", "enable_preselection", vm->isPreselectionEnabled() ) );
1642 vm->enableSelection( resMgr->booleanValue( "OCCViewer", "enable_selection", vm->isSelectionEnabled() ) );
1643 vm->setClippingColor( resMgr->colorValue( "OCCViewer", "clipping_color", vm->clippingColor() ) );
1644 vm->setClippingTextureParams( resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture", vm->isDefaultTextureUsed() ),
1645 resMgr->stringValue( "OCCViewer", "clipping_texture", vm->clippingTexture() ),
1646 resMgr->booleanValue( "OCCViewer", "clipping_modulate", vm->isTextureModulated() ),
1647 resMgr->doubleValue( "OCCViewer", "clipping_scale", vm->clippingTextureScale() ) );
1650 viewMgr->setViewModel( vm );// custom view model, which extends SALOME_View interface
1651 new LightApp_OCCSelector( (OCCViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
1654 #ifndef DISABLE_VTKVIEWER
1655 #ifndef DISABLE_SALOMEOBJECT
1656 if ( vmType == SVTK_Viewer::Type() )
1658 if ( vmType == VTKViewer_Viewer::Type() )
1661 #ifndef DISABLE_SALOMEOBJECT
1662 viewMgr = new SVTK_ViewManager( activeStudy(), desktop() );
1663 SVTK_Viewer* vm = dynamic_cast<SVTK_Viewer*>( viewMgr->getViewModel() );
1666 vm->setProjectionMode( resMgr->integerValue( "VTKViewer", "projection_mode", vm->projectionMode() ) );
1667 vm->setStereoType( resMgr->integerValue( "VTKViewer", "stereo_type", vm->stereoType() ) );
1668 vm->setAnaglyphFilter( resMgr->integerValue( "VTKViewer", "anaglyph_filter", vm->anaglyphFilter() ) );
1669 vm->setQuadBufferSupport( resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", vm->isQuadBufferSupport() ) );
1670 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1671 vm->setTrihedronSize( resMgr->doubleValue( "3DViewer", "trihedron_size", vm->trihedronSize() ),
1672 resMgr->booleanValue( "3DViewer", "relative_size", vm->trihedronRelative() ) );
1673 vm->setStaticTrihedronVisible( resMgr->booleanValue( "3DViewer", "show_static_trihedron", vm->isStaticTrihedronVisible() ) );
1674 vm->setInteractionStyle( resMgr->integerValue( "3DViewer", "navigation_mode", vm->interactionStyle() ) );
1675 vm->setZoomingStyle( resMgr->integerValue( "3DViewer", "zooming_mode", vm->zoomingStyle() ) );
1676 vm->setPreSelectionMode(resMgr->integerValue( "VTKViewer", "preselection", vm->preSelectionMode() ) );
1677 vm->enableSelection( resMgr->booleanValue( "VTKViewer", "enable_selection", vm->isSelectionEnabled() ) );
1678 vm->setIncrementalSpeed( resMgr->integerValue( "VTKViewer", "speed_value", vm->incrementalSpeed() ),
1679 resMgr->integerValue( "VTKViewer", "speed_mode", vm->incrementalSpeedMode() ) );
1680 vm->setSpacemouseButtons( resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", vm->spacemouseBtn(1) ),
1681 resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", vm->spacemouseBtn(2) ),
1682 resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", vm->spacemouseBtn(3) ) );
1683 new LightApp_VTKSelector( vm, mySelMgr );
1686 viewMgr = new VTKViewer_ViewManager( activeStudy(), desktop() );
1687 VTKViewer_Viewer* vm = dynamic_cast<VTKViewer_Viewer*>( viewMgr->getViewModel() );
1689 vm->setBackground( resMgr->backgroundValue( "VTKViewer", "background", vm->background() ) );
1697 viewMgr->setDetached(detached);
1698 addViewManager( viewMgr );
1699 SUIT_ViewWindow* viewWin = viewMgr->createViewWindow();
1701 if ( viewWin && desktop() ) {
1702 viewWin->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1703 viewWin->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1709 SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType, QWidget* w )
1711 SUIT_ResourceMgr* resMgr = resourceMgr();
1713 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1715 new LightApp_WgViewModel( vmType, w ) );
1716 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1718 addViewManager( vm );
1719 SUIT_ViewWindow* vw = vm->createViewWindow();
1720 if ( vw && desktop() ) {
1721 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1722 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1725 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1726 myUserWmTypes << vmType;
1731 SUIT_ViewManager* LightApp_Application::createViewManager( SUIT_ViewModel* theModel )
1733 SUIT_ResourceMgr* resMgr = resourceMgr();
1735 SUIT_ViewManager* vm = new SUIT_ViewManager( activeStudy(),
1739 QString vmType = vm->getType();
1741 vm->setTitle( QString( "%1: %M - viewer %V" ).arg( vmType ) );
1743 addViewManager( vm );
1744 SUIT_ViewWindow* vw = vm->createViewWindow();
1745 if ( vw && desktop() ) {
1746 vw->resize( (int)( desktop()->width() * 0.6 ), (int)( desktop()->height() * 0.6 ) );
1747 vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
1750 if ( !vmType.isEmpty() && !myUserWmTypes.contains( vmType ) )
1751 myUserWmTypes << vmType;
1757 SLOT: Removes view manager from application
1759 void LightApp_Application::onCloseView( SUIT_ViewManager* theVM )
1761 removeViewManager( theVM );
1765 Protected SLOT: On study created.
1766 \param theStudy - just created study
1768 void LightApp_Application::onStudyCreated( SUIT_Study* theStudy )
1770 SUIT_DataObject* aRoot = 0;
1771 if ( theStudy && theStudy->root() )
1773 aRoot = theStudy->root();
1774 //aRoot->setName( tr( "DATA_MODELS" ) );
1777 getWindow( WT_ObjectBrowser );
1779 loadDockWindowsState();
1781 if ( objectBrowser() )
1782 objectBrowser()->setRoot( aRoot );
1784 activateModule( defaultModule() );
1786 if ( objectBrowser() )
1787 objectBrowser()->openLevels();
1789 #ifndef DISABLE_PYCONSOLE
1790 if( pythonConsole() )
1791 getPyInterp()->initStudy();
1796 Protected SLOT: On study opened.
1797 \param theStudy - just opened study
1799 void LightApp_Application::onStudyOpened( SUIT_Study* theStudy )
1801 SUIT_DataObject* aRoot = 0;
1802 if ( theStudy && theStudy->root() )
1804 aRoot = theStudy->root();
1808 getWindow( WT_ObjectBrowser );
1810 loadDockWindowsState();
1812 if ( objectBrowser() )
1813 objectBrowser()->setRoot( aRoot );
1815 activateModule( defaultModule() );
1817 if ( objectBrowser() )
1818 objectBrowser()->openLevels();
1820 #ifndef DISABLE_PYCONSOLE
1821 if( pythonConsole() )
1822 getPyInterp()->initStudy();
1828 /*!Protected SLOT. On study saved.*/
1829 void LightApp_Application::onStudySaved( SUIT_Study* s )
1831 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
1833 mru->insert( s->studyName() );
1838 /*!Protected SLOT. On study closed.*/
1839 void LightApp_Application::onStudyClosed( SUIT_Study* s )
1842 disconnect( this, SIGNAL( viewManagerRemoved( SUIT_ViewManager* ) ),
1843 this, SLOT( onViewManagerRemoved( SUIT_ViewManager* ) ) );
1846 // stop auto-save timer
1847 myAutoSaveTimer->stop();
1849 // Bug 10396: clear selection
1850 mySelMgr->clearSelected();
1852 // Bug 12944: emit signal only after clear selection
1855 activateModule( "" );
1858 /*!Protected SLOT.On desktop activated.*/
1859 void LightApp_Application::onDesktopActivated()
1861 CAM_Application::onDesktopActivated();
1862 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>(activeModule());
1864 aModule->studyActivated();
1867 void LightApp_Application::studyOpened( SUIT_Study* s )
1869 CAM_Application::studyOpened( s );
1872 updateViewManagers();
1875 void LightApp_Application::studySaved( SUIT_Study* s )
1877 CAM_Application::studyOpened( s );
1878 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
1879 if ( aResMgr && activeStudy() ) {
1880 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
1881 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
1885 void LightApp_Application::studyCreated( SUIT_Study* s )
1887 CAM_Application::studyCreated( s );
1890 updateViewManagers();
1893 /*!Gets file filter.
1894 *\retval QString "(*.hdf)"
1896 QString LightApp_Application::getFileFilter( bool /*open*/) const
1902 Shows file dialog and return user selected file name
1904 QString LightApp_Application::getFileName( bool open, const QString& initial, const QString& filters,
1905 const QString& caption, QWidget* parent )
1909 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1910 return SUIT_FileDlg::getFileName( parent, initial, fls, caption, open, true );
1913 /*! Gets directory*/
1914 QString LightApp_Application::getDirectory( const QString& initial, const QString& caption, QWidget* parent )
1918 return SUIT_FileDlg::getExistingDirectory( parent, initial, caption, true );
1921 /*! Get open file names*/
1922 QStringList LightApp_Application::getOpenFileNames( const QString& initial, const QString& filters,
1923 const QString& caption, QWidget* parent )
1927 QStringList fls = filters.split( ";;", QString::SkipEmptyParts );
1928 return SUIT_FileDlg::getOpenFileNames( parent, initial, fls, caption, true );
1931 /*!Private SLOT. Update object browser.*/
1932 void LightApp_Application::onRefresh()
1934 updateObjectBrowser( true );
1937 /*!Private SLOT. Update actions after rename object.*/
1938 void LightApp_Application::onRenamed()
1940 activeStudy()->Modified();
1944 // IMN 08.07.2015 : issue 002556: Some stereo outputs are affected by window position.
1945 // To prevent reversion the window should be either aligned during movement and resize.
1946 /*!Private SLOT. Update actions after rename object.*/
1947 /*void LightApp_Application::onMoved()
1949 OCCViewer_ViewManager* viewMgr = 0;
1950 viewMgr = dynamic_cast<OCCViewer_ViewManager*>( getViewManager( OCCViewer_Viewer::Type(), false ) );
1952 OCCViewer_ViewWindow* view = 0;
1953 view = dynamic_cast<OCCViewer_ViewWindow*>( viewMgr->getActiveView() );
1955 view->getViewPort()->repaintViewAfterMove();
1960 /*!Private SLOT. Support drag-and-drop operation.*/
1961 void LightApp_Application::onDropped( const QList<SUIT_DataObject*>& objects, SUIT_DataObject* parent, int row, Qt::DropAction action )
1963 LightApp_DataObject* parentObj = dynamic_cast<LightApp_DataObject*>( parent );
1967 LightApp_Module* aModule = dynamic_cast<LightApp_Module*>( parentObj->module() );
1969 aModule->dropObjects( objects, parentObj, row, action );
1972 /*!Private SLOT. On preferences.*/
1973 void LightApp_Application::onPreferences()
1975 showPreferences( activeModule() ? activeModule()->moduleName() : tr( "PREF_CATEGORY_SALOME" ) );
1978 /*!Private SLOT. On preferences.*/
1979 void LightApp_Application::showPreferences( const QString& path )
1981 showPreferences( QStringList() << path );
1984 void LightApp_Application::showPreferences( const QStringList& path )
1986 QApplication::setOverrideCursor( Qt::WaitCursor );
1988 LightApp_PreferencesDlg* prefDlg = new LightApp_PreferencesDlg( preferences( true ), desktop());
1990 QApplication::restoreOverrideCursor();
1995 preferences()->activateItem( path );
1997 if ( ( prefDlg->exec() == QDialog::Accepted || prefDlg->isSaved() ) && resourceMgr() )
2000 resourceMgr()->setValue( "desktop", "geometry", desktop()->storeGeometry() );
2001 resourceMgr()->save();
2004 shortcutMgr()->updateShortcuts();
2010 /*!Protected SLOT. On preferences changed.*/
2011 void LightApp_Application::onPreferenceChanged( QString& modName, QString& section, QString& param )
2013 LightApp_Module* sMod = 0;
2014 CAM_Module* mod = module( modName );
2015 if ( mod && mod->inherits( "LightApp_Module" ) )
2016 sMod = (LightApp_Module*)mod;
2019 sMod->preferencesChanged( section, param );
2021 preferencesChanged( section, param );
2022 // emit signal to allow additional preferences changing processing
2023 emit preferenceChanged( modName, section, param );
2026 /*!Remove all windows from study.*/
2027 void LightApp_Application::beforeCloseDoc( SUIT_Study* s )
2029 saveDockWindowsState();
2031 if ( SUIT_DataBrowser* ob = objectBrowser() )
2034 CAM_Application::beforeCloseDoc( s );
2037 /*!Update actions.*/
2038 void LightApp_Application::updateActions()
2040 updateCommandsStatus();
2046 SUIT_Study* LightApp_Application::createNewStudy()
2048 LightApp_Study* aStudy = new LightApp_Study( this );
2050 // Set up processing of major study-related events
2051 connect( aStudy, SIGNAL( created( SUIT_Study* ) ), this, SLOT( onStudyCreated( SUIT_Study* ) ) );
2052 connect( aStudy, SIGNAL( opened ( SUIT_Study* ) ), this, SLOT( onStudyOpened ( SUIT_Study* ) ) );
2053 connect( aStudy, SIGNAL( saved ( SUIT_Study* ) ), this, SLOT( onStudySaved ( SUIT_Study* ) ) );
2054 connect( aStudy, SIGNAL( closed ( SUIT_Study* ) ), this, SLOT( onStudyClosed ( SUIT_Study* ) ) );
2060 Creates window by flag.
2061 \param flag - identificator of window type
2063 QWidget* LightApp_Application::createWindow( const int flag )
2067 SUIT_ResourceMgr* resMgr = resourceMgr();
2069 if ( flag == WT_ObjectBrowser )
2071 SUIT_DataBrowser* ob = new SUIT_DataBrowser( new LightApp_DataObject(), desktop() );
2072 ob->setObjectName( "objectBrowser" );
2073 ob->setSortMenuEnabled( true );
2074 ob->setAutoUpdate( true );
2075 if ( resMgr->hasValue( "ObjectBrowser", "auto_hide_search_tool" ) )
2076 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
2078 //ob->setAutoOpenLevel( 1 ); // commented by ASV as a fix to bug IPAL10107
2079 ob->setWindowTitle( tr( "OBJECT_BROWSER" ) );
2080 connect( ob, SIGNAL( requestUpdate() ), this, SLOT( onRefresh() ) );
2082 QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
2083 SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
2084 treeModel->setSearcher( this );
2085 treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
2086 treeModel->setAppropriate( EntryCol, Qtx::Toggled );
2088 // Mantis issue 0020136: Drag&Drop in OB
2089 SUIT_ProxyModel* proxyModel = dynamic_cast<SUIT_ProxyModel*>(treeModel);
2091 connect( proxyModel, SIGNAL( dropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ),
2092 this, SLOT( onDropped( const QList<SUIT_DataObject*>&, SUIT_DataObject*, int, Qt::DropAction ) ) );
2093 connect( proxyModel, SIGNAL( renamed( SUIT_DataObject* ) ),
2094 this, SLOT( onRenamed( ) ) );
2098 // temporary commented
2100 OB_ListView* ob_list = dynamic_cast<OB_ListView*>( const_cast<QListView*>( ob->listView() ) );
2102 ob_list->setColumnMaxWidth( 0, desktop()->width()/4 );
2105 // Create OBSelector
2106 new LightApp_OBSelector( ob, mySelMgr );
2107 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
2108 ob->treeView()->header()->setResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2110 ob->treeView()->header()->setSectionResizeMode(SUIT_DataObject::VisibilityId, QHeaderView::Fixed);
2112 ob->treeView()->header()->moveSection(SUIT_DataObject::NameId,SUIT_DataObject::VisibilityId);
2113 ob->treeView()->setColumnWidth(SUIT_DataObject::VisibilityId, VISIBILITY_COLUMN_WIDTH);
2114 ob->setProperty( "shortcut", QKeySequence( "Alt+Shift+O" ) );
2116 ob->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2118 #ifndef DISABLE_PYCONSOLE
2119 else if ( flag == WT_PyConsole )
2121 PyConsole_Console* pyCons = new PyConsole_Console( desktop(), new LightApp_PyEditor( getPyInterp() ) );
2122 pyCons->setObjectName( "pythonConsole" );
2123 pyCons->setWindowTitle( tr( "PYTHON_CONSOLE" ) );
2124 pyCons->setFont( resMgr->fontValue( "PyConsole", "font" ) );
2125 pyCons->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
2126 pyCons->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
2127 pyCons->setProperty( "shortcut", QKeySequence( "Alt+Shift+P" ) );
2131 else if ( flag == WT_LogWindow )
2133 LogWindow* logWin = new LogWindow( desktop() );
2134 logWin->handleQtMessages( true );
2135 logWin->setObjectName( "logWindow" );
2136 logWin->setWindowTitle( tr( "LOG_WINDOW" ) );
2137 logWin->setProperty( "shortcut", QKeySequence( "Alt+Shift+L" ) );
2139 logWin->connectPopupRequest( this, SLOT( onConnectPopupRequest( SUIT_PopupClient*, QContextMenuEvent* ) ) );
2145 \return default windows( Object Browser, Python Console )
2146 Adds to map \a aMap.
2148 void LightApp_Application::defaultWindows( QMap<int, int>& aMap ) const
2150 #ifndef DISABLE_PYCONSOLE
2151 aMap.insert( WT_PyConsole, Qt::BottomDockWidgetArea );
2153 if ( activeStudy() ) {
2154 aMap.insert( WT_ObjectBrowser, Qt::LeftDockWidgetArea );
2155 // aMap.insert( WT_LogWindow, Qt::DockBottom );
2159 /*!Default view managers*/
2160 void LightApp_Application::defaultViewManagers( QStringList& ) const
2166 \return preferences.
2167 Create preferences, if \a crt = true.
2169 LightApp_Preferences* LightApp_Application::preferences( const bool crt ) const
2174 LightApp_Application* that = (LightApp_Application*)this;
2176 bool toCreate = !_prefs_ && crt;
2179 _prefs_ = new LightApp_Preferences( resourceMgr() );
2180 that->createPreferences( _prefs_ );
2181 qAddPostRoutine( LightAppCleanUpAppResources );
2184 that->myPrefs = _prefs_;
2186 connect( myPrefs, SIGNAL( preferenceChanged( QString&, QString&, QString& ) ),
2187 this, SLOT( onPreferenceChanged( QString&, QString&, QString& ) ), Qt::UniqueConnection );
2188 connect( myPrefs, SIGNAL( resetToDefaults() ),
2189 this, SIGNAL( preferenceResetToDefaults() ), Qt::UniqueConnection );
2194 SUIT_ResourceMgr* resMgr = resourceMgr();
2196 QList<SUIT_Application*> appList = SUIT_Session::session()->applications();
2197 for ( QList<SUIT_Application*>::iterator appIt = appList.begin(); appIt != appList.end(); ++appIt )
2199 LightApp_Application* app = ::qobject_cast<LightApp_Application*>( *appIt );
2203 // all modules available in current session
2205 app->modules( names, false );
2208 QMap<QString, QString> icons;
2209 app->moduleIconNames( icons );
2211 // step 1: iterate through list of all available modules
2212 // and add empty preferences page
2213 for ( QStringList::const_iterator it = names.begin(); it != names.end(); ++it )
2215 if ( !_prefs_->hasModule( *it ) ) // prevent possible duplications
2217 int modId = _prefs_->addPreference( *it ); // add empty page
2218 if ( icons.contains( *it ) ) // set icon
2219 _prefs_->setItemIcon( modId, Qtx::scaleIcon( resMgr->loadPixmap( moduleName( *it ),
2220 icons[*it], false ), 20 ) );
2224 // step 2: iterate through list of all loaded modules
2225 // and initialize their preferences
2226 ModuleList loadedModules;
2227 app->modules( loadedModules );
2228 QListIterator<CAM_Module*> itr( loadedModules );
2229 while ( itr.hasNext() )
2231 LightApp_Module* module = 0;
2232 CAM_Module* m = itr.next();
2233 if ( m->inherits( "LightApp_Module" ) )
2234 module = (LightApp_Module*)m;
2236 if ( module && !_prefs_->hasModule( module->moduleName() ) )
2238 _prefs_->addPreference( module->moduleName() ); // add page (for sure, had to be done at step 1)
2239 module->createPreferences(); // initialize preferences
2240 that->emptyPreferences( module->moduleName() ); // show dummy page if module does not export any preferences
2244 _prefs_->setItemProperty( "info", tr( "PREFERENCES_NOT_LOADED" ) ); // dummy page for modules which are not loaded yet
2250 Adds new module to application
2252 void LightApp_Application::moduleAdded( CAM_Module* mod )
2254 CAM_Application::moduleAdded( mod );
2256 LightApp_Module* lightMod = 0;
2257 if ( mod && mod->inherits( "LightApp_Module" ) )
2258 lightMod = (LightApp_Module*)mod;
2260 if ( myPrefs && lightMod && !myPrefs->hasModule( lightMod->moduleName() ))
2262 myPrefs->addPreference( mod->moduleName() );
2263 lightMod->createPreferences();
2264 emptyPreferences( mod->moduleName() );
2268 void LightApp_Application::emptyPreferences( const QString& modName )
2270 QtxPreferenceItem* item = myPrefs->findItem( modName, true );
2271 if ( !item || !item->isEmpty() )
2274 QtxPagePrefFrameItem* frm = new QtxPagePrefFrameItem( item->title(), item->parentItem() );
2275 frm->setIcon( item->icon() );
2276 frm->setStretch( false );
2277 item->parentItem()->insertItem( frm, item );
2278 new QtxPagePrefLabelItem( Qt::AlignCenter, tr( "PREFERENCES_NOT_SUPPORTED" ).arg( modName ), frm );
2285 void LightApp_Application::createPreferences( LightApp_Preferences* pref )
2290 QStringList aValuesList;
2291 QList<QVariant> anIndicesList;
2295 // . Top-level "SALOME" preferences group <<start>>
2296 int salomeCat = pref->addPreference( tr( "PREF_CATEGORY_SALOME" ) );
2297 pref->setItemIcon( salomeCat, Qtx::scaleIcon( resourceMgr()->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ), 20 ) );
2299 // .. "General" preferences tab <<start>>
2300 int genTab = pref->addPreference( tr( "PREF_TAB_GENERAL" ), salomeCat );
2302 // ... "Language" group <<start>>
2303 int langGroup = pref->addPreference( tr( "PREF_GROUP_LANGUAGE" ), genTab );
2304 pref->setItemProperty( "columns", 2, langGroup );
2305 // .... -> application language
2306 int curLang = pref->addPreference( tr( "PREF_CURRENT_LANGUAGE" ), langGroup,
2307 LightApp_Preferences::Selector, "language", "language" );
2308 QStringList aLangs = SUIT_Session::session()->resourceMgr()->stringValue( "language", "languages", "en" ).split( "," );
2309 QList<QVariant> aIcons;
2310 QList<QVariant> aNumbers;
2311 QStringList aTitles;
2312 foreach ( QString aLang, aLangs ) {
2313 aIcons << QPixmap( QString( ":/images/%1" ).arg( aLang ) );
2315 aTitles << langToName( aLang );
2317 pref->setItemProperty( "strings", aTitles, curLang );
2318 pref->setItemProperty( "ids", aNumbers, curLang );
2319 pref->setItemProperty( "icons", aIcons, curLang );
2320 pref->setItemProperty( "restart", true, curLang );
2322 int curLocale = pref->addPreference( tr( "PREF_CURRENT_LOCALE" ), langGroup,
2323 LightApp_Preferences::Bool, "language", "locale" );
2324 pref->setItemProperty( "restart", true, curLocale );
2325 // ... "Language" group <<end>>
2327 // ... "Look and feel" group <<start>>
2328 int lookGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), genTab );
2329 pref->setItemProperty( "columns", 2, lookGroup );
2330 // .... -> show splash-screen
2331 pref->addPreference( tr( "PREF_SHOW_SPLASH" ), lookGroup, LightApp_Preferences::Bool, "launch", "splash" );
2332 // .... -> opaque resize
2333 pref->addPreference( tr( "PREF_OPAQUE_RESIZE" ), lookGroup, LightApp_Preferences::Bool, "desktop", "opaque_resize" );
2334 // .... -> drop-down buttons
2335 pref->addPreference( tr( "PREF_DROP_DOWN_BUTTONS" ), lookGroup, LightApp_Preferences::Bool, "viewers", "drop_down_buttons" );
2336 // .... -> Notification timeout
2337 int delay = pref->addPreference( tr( "PREF_NOTIFY_TIMEOUT" ), lookGroup, LightApp_Preferences::IntSpin, "notification", "timeout" );
2338 pref->setItemProperty( "special", tr("PREF_NOTIFY_TIMEOUT_NONE"), delay );
2339 pref->setItemProperty( "min", 0, delay );
2340 pref->setItemProperty( "max", 100, delay );
2341 pref->setItemProperty( "suffix", " sec", delay );
2342 // ... "Look and feel" group <<end>>
2344 // ... "Study properties" group <<start>>
2345 int studyGroup = pref->addPreference( tr( "PREF_GROUP_STUDY" ), genTab );
2346 pref->setItemProperty( "columns", 2, studyGroup );
2347 // .... -> multi-file save
2348 pref->addPreference( tr( "PREF_MULTI_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "multi_file" );
2349 // .... -> ascii save mode
2350 pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" );
2351 // .... -> store windows geometry
2352 pref->addPreference( tr( "PREF_LOAD_LIGHT" ), studyGroup, LightApp_Preferences::Bool, "Study", "autoload_light_modules" );
2353 pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" );
2354 pref->addPreference( "", studyGroup, LightApp_Preferences::Space );
2355 pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" );
2356 // .... -> auto-save
2357 int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup,
2358 LightApp_Preferences::IntSpin, "Study", "auto_save_interval" );
2359 pref->setItemProperty( "min", 0, autoSaveInterval );
2360 pref->setItemProperty( "max", 1440, autoSaveInterval );
2361 pref->setItemProperty( "special", tr( "PREF_AUTO_SAVE_DISABLED" ), autoSaveInterval );
2362 // ... "Study properties" group <<end>>
2364 // ... "Help browser" group <<start>>
2365 #ifndef DISABLE_QTXWEBBROWSER
2366 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab, LightApp_Preferences::Auto, "ExternalBrowser", "use_external_browser");
2368 int extgroup = pref->addPreference( tr( "PREF_GROUP_EXT_BROWSER" ), genTab );
2372 QString platform = "winapplication";
2374 QString platform = "application";
2376 // .... -> browser application
2377 int apppref = pref->addPreference( tr( "PREF_APP" ), extgroup, LightApp_Preferences::File, "ExternalBrowser", platform );
2378 pref->setItemProperty( "mode", Qtx::PT_OpenFile, apppref );
2379 // .... -> browser parameters
2380 pref->addPreference( tr( "PREF_PARAM" ), extgroup, LightApp_Preferences::String, "ExternalBrowser", "parameters" );
2381 // ... "Help browser" group <<end>>
2383 // ... "Python console properties" group <<start>>
2384 int pythonConsoleGroup = pref->addPreference( tr( "PREF_GROUP_PY_CONSOLE" ), genTab );
2385 pref->setItemProperty( "columns", 2, pythonConsoleGroup );
2387 pref->addPreference( tr( "PREF_FONT" ), pythonConsoleGroup, LightApp_Preferences::Font, "PyConsole", "font" );
2388 // .... -> show banner
2389 pref->addPreference( tr( "PREF_SHOW_BANNER" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "show_banner" );
2390 // .... -> auto-completion
2391 pref->addPreference( tr( "PREF_AUTO_COMPLETION" ), pythonConsoleGroup, LightApp_Preferences::Bool, "PyConsole", "auto_completion" );
2392 // ... "Python console properties" group <<end>>
2394 // ... "MRU" preferences group <<start>>
2395 int mruGroup = pref->addPreference( tr( "PREF_GROUP_MRU" ), genTab, LightApp_Preferences::Auto, "MRU", "show_mru" );
2396 pref->setItemProperty( "columns", 4, mruGroup );
2397 // number of MRU items
2398 int mruVisCount = pref->addPreference( tr( "PREF_MRU_VISIBLE_COUNT" ), mruGroup, LightApp_Preferences::IntSpin,
2399 "MRU", "visible_count" );
2400 pref->setItemProperty( "min", 0, mruVisCount );
2401 pref->setItemProperty( "max", 100, mruVisCount );
2403 int mruLinkType = pref->addPreference( tr( "PREF_MRU_LINK_TYPE" ), mruGroup, LightApp_Preferences::Selector,
2404 "MRU", "link_type" );
2405 aValuesList.clear();
2406 anIndicesList.clear();
2407 aValuesList << tr("PREF_MRU_LINK_AUTO") << tr("PREF_MRU_LINK_SHORT") << tr("PREF_MRU_LINK_FULL");
2408 anIndicesList << 0 << 1 << 2 ;
2409 pref->setItemProperty( "strings", aValuesList, mruLinkType );
2410 pref->setItemProperty( "indexes", anIndicesList, mruLinkType );
2411 // ... "MRU" preferences group <<end>>
2413 // ... "Full-screen" group <<start>>
2414 int fullScreenGroup = pref->addPreference( tr( "PREF_GROUP_FULL_SCREEN" ), genTab );
2415 pref->setItemProperty( "columns", 2, fullScreenGroup );
2416 // .... -> automatic hiding toolbars
2417 pref->addPreference( tr( "PREF_FULL_SCREEN_AUTO" ), fullScreenGroup,
2418 LightApp_Preferences::Bool, "OCCViewer", "automatic_hiding" );
2419 // ... "Full-screen" group <<end>>
2421 // .. "General" preferences tab <<end>>
2423 // .. "3D viewer" group <<start>>
2424 int Viewer3DGroup = pref->addPreference( tr( "PREF_GROUP_3DVIEWER" ), salomeCat );
2425 // ... -> navigation mode
2426 int vtkStyleMode = pref->addPreference( tr( "PREF_NAVIGATION" ), Viewer3DGroup,
2427 LightApp_Preferences::Selector, "3DViewer", "navigation_mode" );
2428 aValuesList.clear();
2429 anIndicesList.clear();
2430 aValuesList << tr("PREF_STANDARD_STYLE") << tr("PREF_KEYFREE_STYLE");
2431 anIndicesList << 0 << 1;
2432 pref->setItemProperty( "strings", aValuesList, vtkStyleMode );
2433 pref->setItemProperty( "indexes", anIndicesList, vtkStyleMode );
2434 // ... -> zooming mode
2435 int occZoomingStyleMode = pref->addPreference( tr( "PREF_ZOOMING" ), Viewer3DGroup,
2436 LightApp_Preferences::Selector, "3DViewer", "zooming_mode" );
2437 aValuesList.clear();
2438 anIndicesList.clear();
2439 aValuesList << tr("PREF_ZOOMING_AT_CENTER") << tr("PREF_ZOOMING_AT_CURSOR");
2440 anIndicesList << 0 << 1;
2441 pref->setItemProperty( "strings", aValuesList, occZoomingStyleMode );
2442 pref->setItemProperty( "indexes", anIndicesList, occZoomingStyleMode );
2443 // ... "Trihedron" group <<start>>
2444 int occTriGroup = pref->addPreference( tr( "PREF_TRIHEDRON" ), Viewer3DGroup );
2445 pref->setItemProperty( "columns", 2, occTriGroup );
2446 // .... -> trihedron size
2447 int occTS = pref->addPreference( tr( "PREF_TRIHEDRON_SIZE" ), occTriGroup,
2448 LightApp_Preferences::DblSpin, "3DViewer", "trihedron_size" );
2449 pref->setItemProperty( "min", 1.0E-06, occTS );
2450 pref->setItemProperty( "max", 1000, occTS );
2451 // .... -> relative size of trihedron
2452 pref->addPreference( tr( "PREF_RELATIVE_SIZE" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "relative_size" );
2453 // .... -> show static trihedron
2454 pref->addPreference( tr( "PREF_SHOW_STATIC_TRIHEDRON" ), occTriGroup, LightApp_Preferences::Bool, "3DViewer", "show_static_trihedron" );
2455 // ... "Trihedron" group <<end>>
2456 // .. "3D viewer" group <<end>>
2460 #ifndef DISABLE_OCCVIEWER
2461 // .. "OCC viewer" group <<start>>
2462 int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat );
2464 // .... -> Projection mode
2465 int occProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), occGroup,
2466 LightApp_Preferences::Selector, "OCCViewer", "projection_mode" );
2467 aValuesList.clear();
2468 anIndicesList.clear();
2469 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2470 anIndicesList << 0 << 1;
2471 pref->setItemProperty( "strings", aValuesList, occProjMode );
2472 pref->setItemProperty( "indexes", anIndicesList, occProjMode );
2474 // .... -> Stereo group
2475 int stereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), occGroup);
2476 pref->setItemProperty( "columns", 2, stereoGroup );
2477 // .... -> Stereo type
2478 int stereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), stereoGroup,
2479 LightApp_Preferences::Selector, "OCCViewer", "stereo_type" );
2480 aValuesList.clear();
2481 anIndicesList.clear();
2483 OCCViewer_Viewer::stereoData( aValuesList, idList);
2484 foreach( int gid, idList ) anIndicesList << gid;
2485 pref->setItemProperty( "strings", aValuesList, stereoType );
2486 pref->setItemProperty( "indexes", anIndicesList, stereoType );
2488 // .... -> Anaglyph filter
2489 int anaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), stereoGroup,
2490 LightApp_Preferences::Selector, "OCCViewer", "anaglyph_filter" );
2491 aValuesList.clear();
2492 anIndicesList.clear();
2493 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2494 anIndicesList << 0 << 1 << 2;
2496 pref->setItemProperty( "strings", aValuesList, anaglyphFilter );
2497 pref->setItemProperty( "indexes", anIndicesList, anaglyphFilter );
2499 // .... -> Convergence distance type
2500 int occFocusType = pref->addPreference( tr( "PREF_FOCUS_TYPE" ), stereoGroup,
2501 LightApp_Preferences::Selector, "OCCViewer", "focus_type" );
2502 aValuesList.clear();
2503 anIndicesList.clear();
2504 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2505 anIndicesList << 0 << 1;
2506 pref->setItemProperty( "strings", aValuesList, occFocusType );
2507 pref->setItemProperty( "indexes", anIndicesList, occFocusType );
2509 // .... -> Stereographic focus value
2510 int focusValue = pref->addPreference( tr( "PREF_FOCUS_VALUE" ), stereoGroup,
2511 LightApp_Preferences::DblSpin, "OCCViewer", "focus_value" );
2512 pref->setItemProperty( "precision", 3, focusValue );
2513 pref->setItemProperty( "min", 1.0E-03, focusValue );
2514 pref->setItemProperty( "max", 1.0E03, focusValue );
2515 pref->setItemProperty( "step", 0.05, focusValue );
2518 int occIODType = pref->addPreference( tr( "PREF_IOD_TYPE" ), stereoGroup,
2519 LightApp_Preferences::Selector, "OCCViewer", "iod_type" );
2520 aValuesList.clear();
2521 anIndicesList.clear();
2522 aValuesList << tr("PREF_ABSOLUTE") << tr("PREF_RELATIVE");
2523 anIndicesList << 0 << 1;
2524 pref->setItemProperty( "strings", aValuesList, occIODType );
2525 pref->setItemProperty( "indexes", anIndicesList, occIODType );
2527 // .... -> Interocular distance (IOD) value
2528 int IODValue = pref->addPreference( tr( "PREF_IOD_VALUE" ), stereoGroup,
2529 LightApp_Preferences::DblSpin, "OCCViewer", "iod_value" );
2530 pref->setItemProperty( "precision", 3, IODValue );
2531 pref->setItemProperty( "min", 1.0E-03, IODValue );
2532 pref->setItemProperty( "max", 1.0E03, IODValue );
2533 pref->setItemProperty( "step", 0.05, IODValue );
2535 // .... -> Reverse stereo
2536 pref->addPreference( tr( "PREF_REVERSE_STEREO" ), stereoGroup,
2537 LightApp_Preferences::Bool, "OCCViewer", "reverse_stereo" );
2538 // .... -> Enable V-Sync
2539 pref->addPreference( tr( "PREF_ENABLE_VSYNC" ), stereoGroup,
2540 LightApp_Preferences::Bool, "OCCViewer", "enable_vsync" );
2541 // .... -> Enable quad-buffer support
2542 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), stereoGroup,
2543 LightApp_Preferences::Bool, "OCCViewer", "enable_quad_buffer_support" );
2545 // ... "Background" group <<start>>
2546 int bgGroup = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), occGroup );
2547 // pref->setItemProperty( "columns", 2, bgGroup );
2548 aValuesList.clear();
2549 anIndicesList.clear();
2552 formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList );
2553 foreach( int gid, idList ) anIndicesList << gid;
2554 // .... -> 3D viewer background
2555 bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup,
2556 LightApp_Preferences::Background, "OCCViewer", "background" );
2557 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2558 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2559 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2560 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2561 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2562 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2563 pref->setItemProperty( "custom_enabled", false, bgId );
2564 pref->setItemProperty( "image_formats", formats, bgId );
2565 // .... -> XZ viewer background
2566 bgId = pref->addPreference( tr( "PREF_XZVIEWER_BACKGROUND" ), bgGroup,
2567 LightApp_Preferences::Background, "OCCViewer", "xz_background" );
2568 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2569 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2570 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2571 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2572 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2573 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2574 pref->setItemProperty( "custom_enabled", false, bgId );
2575 pref->setItemProperty( "image_formats", formats, bgId );
2576 // .... -> YZ viewer background
2577 bgId = pref->addPreference( tr( "PREF_YZVIEWER_BACKGROUND" ), bgGroup,
2578 LightApp_Preferences::Background, "OCCViewer", "yz_background" );
2579 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2580 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2581 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2582 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2583 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2584 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2585 pref->setItemProperty( "custom_enabled", false, bgId );
2586 pref->setItemProperty( "image_formats", formats, bgId );
2587 // .... -> XY viewer background
2588 bgId = pref->addPreference( tr( "PREF_XYVIEWER_BACKGROUND" ), bgGroup,
2589 LightApp_Preferences::Background, "OCCViewer", "xy_background" );
2590 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2591 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2592 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2593 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2594 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2595 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2596 pref->setItemProperty( "custom_enabled", false, bgId );
2597 pref->setItemProperty( "image_formats", formats, bgId );
2598 // ... "Background" group <<end>>
2601 // ... "Selection" group <<start>>
2602 int occSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), occGroup );
2603 pref->setItemProperty( "columns", 2, occSelectionGroup );
2604 // .... -> enable preselection
2605 pref->addPreference( tr( "PREF_ENABLE_PRESELECTION" ), occSelectionGroup,
2606 LightApp_Preferences::Bool, "OCCViewer", "enable_preselection" );
2607 // .... -> enable selection
2608 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), occSelectionGroup,
2609 LightApp_Preferences::Bool, "OCCViewer", "enable_selection" );
2610 // ... "Selection" group <<end>>
2612 // ... "Clipping" group <<start>>
2613 int occClippingGroup = pref->addPreference( tr( "PREF_GROUP_CLIPPING" ), occGroup );
2614 // .... -> clipping color
2615 pref->addPreference( tr( "PREF_CLIPPING_COLOR" ), occClippingGroup,
2616 LightApp_Preferences::Color, "OCCViewer", "clipping_color" );
2617 int texturePref = pref->addPreference( "", occClippingGroup, LightApp_Preferences::Frame );
2618 pref->setItemProperty( "columns", 2, texturePref );
2619 // .... -> use default texture
2620 pref->addPreference( tr( "PREF_CLIPPING_DEFAULT_TEXTURE" ), texturePref,
2621 LightApp_Preferences::Bool, "OCCViewer", "clipping_use_default_texture" );
2622 // .... -> clipping texture
2623 int filePref = pref->addPreference( tr( "PREF_CLIPPING_TEXTURE" ), texturePref,
2624 LightApp_Preferences::File, "OCCViewer", "clipping_texture" );
2625 pref->setItemProperty( "path_filter", tr( "OCC_TEXTURE_FILES" ), filePref );
2627 pref->addPreference( tr( "PREF_CLIPPING_MODULATE" ), texturePref,
2628 LightApp_Preferences::Bool, "OCCViewer", "clipping_modulate" );
2629 // .... -> scale factor
2630 int scaleFactor = pref->addPreference( tr( "PREF_CLIPPING_SCALE" ), texturePref,
2631 LightApp_Preferences::DblSpin, "OCCViewer", "clipping_scale" );
2632 pref->setItemProperty( "precision", 3, scaleFactor );
2633 pref->setItemProperty( "min", 1.0E-03, scaleFactor );
2634 pref->setItemProperty( "max", 1.0E03, scaleFactor );
2635 pref->setItemProperty( "step", 0.1, scaleFactor );
2636 // ... "Clipping" group <<end>>
2638 // ... "Ray tracing" group <<start>>
2639 int occRayTracingGroup = pref->addPreference( tr( "PREF_GROUP_RAY_TRACING" ), occGroup );
2640 int rtPref = pref->addPreference( "", occRayTracingGroup, LightApp_Preferences::Frame );
2641 pref->setItemProperty( "columns", 2, rtPref );
2643 int rt_depth = pref->addPreference( tr( "PREF_RAY_TRACING_DEPTH" ), rtPref,
2644 LightApp_Preferences::IntSpin, "OCCViewer", "rt_depth" );
2645 pref->setItemProperty( "min", 1, rt_depth );
2646 pref->setItemProperty( "max", 10, rt_depth );
2647 pref->setItemProperty( "step", 1, rt_depth );
2648 pref->addPreference( "", rtPref, LightApp_Preferences::Frame );
2649 // .... -> specular reflections
2650 pref->addPreference( tr( "PREF_RAY_TRACING_REFLECTION" ), rtPref,
2651 LightApp_Preferences::Bool, "OCCViewer", "rt_reflection" );
2652 // .... -> adaptive anti-aliasing
2653 pref->addPreference( tr( "PREF_RAY_TRACING_ANTIALIASING" ), rtPref,
2654 LightApp_Preferences::Bool, "OCCViewer", "rt_antialiasing" );
2655 // .... -> shadows rendering
2656 pref->addPreference( tr( "PREF_RAY_TRACING_SHADOW" ), rtPref,
2657 LightApp_Preferences::Bool, "OCCViewer", "rt_shadow" );
2658 // .... -> transparent shadow
2659 pref->addPreference( tr( "PREF_RAY_TRACING_TRANS_SHADOW" ), rtPref,
2660 LightApp_Preferences::Bool, "OCCViewer", "rt_trans_shadow" );
2661 // ... "Ray tracing" group <<end>>
2663 // ... "Light source" group <<start>>
2664 int occLightGroup = pref->addPreference( tr( "PREF_GROUP_LIGHT" ), occGroup );
2665 // .... -> light color
2666 pref->addPreference( tr( "PREF_LIGHT_COLOR" ), occLightGroup,
2667 LightApp_Preferences::Color, "OCCViewer", "light_color" );
2668 int directionPref = pref->addPreference( "", occLightGroup, LightApp_Preferences::Frame );
2669 pref->setItemProperty( "columns", 3, directionPref );
2670 // .... -> light direction (dx component)
2671 int light_dx = pref->addPreference( tr( "Dx" ), directionPref,
2672 LightApp_Preferences::DblSpin, "OCCViewer", "light_dx" );
2673 pref->setItemProperty( "precision", 2, light_dx );
2674 pref->setItemProperty( "min", -1.0E03, light_dx );
2675 pref->setItemProperty( "max", 1.0E03, light_dx );
2676 pref->setItemProperty( "step", 0.1, light_dx );
2677 // .... -> light direction (dy component)
2678 int light_dy = pref->addPreference( tr( "Dy" ), directionPref,
2679 LightApp_Preferences::DblSpin, "OCCViewer", "light_dy" );
2680 pref->setItemProperty( "precision", 2, light_dy );
2681 pref->setItemProperty( "min", -1.0E03, light_dy );
2682 pref->setItemProperty( "max", 1.0E03, light_dy );
2683 pref->setItemProperty( "step", 0.1, light_dy );
2684 // .... -> light direction (dz component)
2685 int light_dz = pref->addPreference( tr( "Dz" ), directionPref,
2686 LightApp_Preferences::DblSpin, "OCCViewer", "light_dz" );
2687 pref->setItemProperty( "precision", 2, light_dz );
2688 pref->setItemProperty( "min", -1.0E03, light_dz );
2689 pref->setItemProperty( "max", 1.0E03, light_dz );
2690 pref->setItemProperty( "step", 0.1, light_dz );
2691 // ... "Light source" group <<end>>
2693 // ... -> empty frame (for layout) <<start>>
2694 int occGen = pref->addPreference( "", occGroup, LightApp_Preferences::Frame );
2695 pref->setItemProperty( "margin", 0, occGen );
2696 pref->setItemProperty( "columns", 2, occGen );
2697 // ... -> empty frame (for layout) <<end>>
2699 // .. "OCC viewer" group <<end>>
2702 #ifndef DISABLE_VTKVIEWER
2703 // .. "VTK viewer" group <<start>>
2704 int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab
2706 // ... -> empty frame (for layout) <<start>>
2707 int vtkGen = pref->addPreference( "", vtkGroup, LightApp_Preferences::Frame );
2708 //pref->setItemProperty( "columns", 2, vtkGen );
2709 // .... -> projection mode
2710 int vtkProjMode = pref->addPreference( tr( "PREF_PROJECTION_MODE" ), vtkGen,
2711 LightApp_Preferences::Selector, "VTKViewer", "projection_mode" );
2712 aValuesList.clear();
2713 anIndicesList.clear();
2714 aValuesList << tr("PREF_ORTHOGRAPHIC") << tr("PREF_PERSPECTIVE");
2715 anIndicesList << 0 << 1;
2716 pref->setItemProperty( "strings", aValuesList, vtkProjMode );
2717 pref->setItemProperty( "indexes", anIndicesList, vtkProjMode );
2719 // .... -> Stereo group
2720 int vtkStereoGroup = pref->addPreference( tr( "PREF_GROUP_STEREO" ), vtkGroup);
2721 pref->setItemProperty( "columns", 2, vtkStereoGroup );
2722 // .... -> Stereo type
2723 int vtkStereoType = pref->addPreference( tr( "PREF_STEREO_TYPE" ), vtkStereoGroup,
2724 LightApp_Preferences::Selector, "VTKViewer", "stereo_type" );
2725 aValuesList.clear();
2726 anIndicesList.clear();
2728 SVTK_Viewer::stereoData( aValuesList, idList);
2729 foreach( int gid, idList ) anIndicesList << gid;
2730 pref->setItemProperty( "strings", aValuesList, vtkStereoType );
2731 pref->setItemProperty( "indexes", anIndicesList, vtkStereoType );
2732 // .... -> Anaglyph filter
2733 int vtkAnaglyphFilter = pref->addPreference( tr( "PREF_ANAGLYPH_FILTER" ), vtkStereoGroup,
2734 LightApp_Preferences::Selector, "VTKViewer", "anaglyph_filter" );
2735 aValuesList.clear();
2736 anIndicesList.clear();
2737 aValuesList << tr("PREF_ANAGLYPH_RED_CYAN") << tr("PREF_ANAGLYPH_YELLOW_BLUE") << tr("PREF_ANAGLYPH_GREEN_MAGENTA");
2738 anIndicesList << 0 << 1 << 2;
2740 pref->setItemProperty( "strings", aValuesList, vtkAnaglyphFilter );
2741 pref->setItemProperty( "indexes", anIndicesList, vtkAnaglyphFilter );
2743 // .... -> Enable quad-buffer support
2744 pref->addPreference( tr( "PREF_ENABLE_QUAD_BUFFER_SUPPORT" ), vtkStereoGroup,
2745 LightApp_Preferences::Bool, "VTKViewer", "enable_quad_buffer_support" );
2747 // .... -> background
2748 aValuesList.clear();
2749 anIndicesList.clear();
2752 #ifndef DISABLE_SALOMEOBJECT
2753 formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList );
2755 foreach( int gid, idList ) anIndicesList << gid;
2756 bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen,
2757 LightApp_Preferences::Background, "VTKViewer", "background" );
2758 pref->setItemProperty( "gradient_names", aValuesList, bgId );
2759 pref->setItemProperty( "gradient_ids", anIndicesList, bgId );
2760 pref->setItemProperty( "texture_enabled", !txtList.isEmpty(), bgId );
2761 pref->setItemProperty( "texture_center_enabled", (bool)txtList.contains( Qtx::CenterTexture ), bgId );
2762 pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId );
2763 pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId );
2764 pref->setItemProperty( "custom_enabled", false, bgId );
2765 #ifndef DISABLE_SALOMEOBJECT
2766 pref->setItemProperty( "image_formats", formats, bgId );
2768 // .... -> speed increment
2769 int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen,
2770 LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" );
2771 pref->setItemProperty( "min", 1, vtkSpeed );
2772 pref->setItemProperty( "max", 1000, vtkSpeed );
2773 // .... -> speed mode
2774 int vtkSpeedMode = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED_MODE" ), vtkGen,
2775 LightApp_Preferences::Selector, "VTKViewer", "speed_mode" );
2776 aValuesList.clear();
2777 anIndicesList.clear();
2778 aValuesList << tr("PREF_ARITHMETIC") << tr("PREF_GEOMETRICAL");
2779 anIndicesList << 0 << 1;
2780 pref->setItemProperty( "strings", aValuesList, vtkSpeedMode );
2781 pref->setItemProperty( "indexes", anIndicesList, vtkSpeedMode );
2783 // ... "Selection" group <<start>>
2784 int vtkSelectionGroup = pref->addPreference( tr( "PREF_GROUP_SELECTION" ), vtkGroup );
2785 pref->setItemProperty( "columns", 2, vtkSelectionGroup );
2786 // .... -> preselection
2787 int vtkPreselection = pref->addPreference( tr( "PREF_PRESELECTION" ), vtkSelectionGroup,
2788 LightApp_Preferences::Selector, "VTKViewer", "preselection" );
2789 aValuesList.clear();
2790 anIndicesList.clear();
2791 aValuesList << tr("PREF_PRESELECTION_STANDARD") << tr("PREF_PRESELECTION_DYNAMIC") << tr("PREF_PRESELECTION_DISABLED");
2792 anIndicesList << 0 << 1 << 2;
2793 pref->setItemProperty( "strings", aValuesList, vtkPreselection );
2794 pref->setItemProperty( "indexes", anIndicesList, vtkPreselection );
2795 // .... -> enable selection
2796 pref->addPreference( tr( "PREF_ENABLE_SELECTION" ), vtkSelectionGroup, LightApp_Preferences::Bool, "VTKViewer", "enable_selection" );
2797 // ... "Selection" group <<end>>
2799 // ... -> empty frame (for layout) <<end>>
2801 // ... space mouse sub-group <<start>>
2802 int vtkSM = pref->addPreference( tr( "PREF_FRAME_SPACEMOUSE" ), vtkGroup, LightApp_Preferences::GroupBox );
2803 //pref->setItemProperty( "columns", 2, vtkSM );
2804 // .... -> decrease speed increment
2805 int spacemousePref1 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_1" ), vtkSM,
2806 LightApp_Preferences::Selector, "VTKViewer",
2807 "spacemouse_func1_btn" );
2808 // .... -> increase speed increment
2809 int spacemousePref2 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_2" ), vtkSM,
2810 LightApp_Preferences::Selector, "VTKViewer",
2811 "spacemouse_func2_btn" );
2812 // .... -> dominant / combined switch
2813 int spacemousePref3 = pref->addPreference( tr( "PREF_SPACEMOUSE_FUNC_3" ), vtkSM,
2814 LightApp_Preferences::Selector, "VTKViewer",
2815 "spacemouse_func5_btn" ); //
2816 aValuesList.clear();
2817 anIndicesList.clear();
2818 aValuesList << tr( "PREF_SPACEMOUSE_BTN_1" ) << tr( "PREF_SPACEMOUSE_BTN_2" ) << tr( "PREF_SPACEMOUSE_BTN_3" );
2819 aValuesList << tr( "PREF_SPACEMOUSE_BTN_4" ) << tr( "PREF_SPACEMOUSE_BTN_5" ) << tr( "PREF_SPACEMOUSE_BTN_6" );
2820 aValuesList << tr( "PREF_SPACEMOUSE_BTN_7" ) << tr( "PREF_SPACEMOUSE_BTN_8" ) << tr( "PREF_SPACEMOUSE_BTN_*" );
2821 aValuesList << tr( "PREF_SPACEMOUSE_BTN_10" ) << tr( "PREF_SPACEMOUSE_BTN_11" );
2822 anIndicesList << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9 << 10 << 11;
2823 pref->setItemProperty( "strings", aValuesList, spacemousePref1 );
2824 pref->setItemProperty( "indexes", anIndicesList, spacemousePref1 );
2825 pref->setItemProperty( "strings", aValuesList, spacemousePref2 );
2826 pref->setItemProperty( "indexes", anIndicesList, spacemousePref2 );
2827 pref->setItemProperty( "strings", aValuesList, spacemousePref3 );
2828 pref->setItemProperty( "indexes", anIndicesList, spacemousePref3 );
2829 // ... space mouse sub-group <<end>>
2831 // ... avi recording sub-group <<start>>
2832 int vtkRec = pref->addPreference( tr( "PREF_FRAME_RECORDING" ), vtkGroup, LightApp_Preferences::GroupBox );
2833 pref->setItemProperty( "columns", 2, vtkRec );
2834 // .... -> recording mode
2835 int modePref = pref->addPreference( tr( "PREF_RECORDING_MODE" ), vtkRec,
2836 LightApp_Preferences::Selector, "VTKViewer", "recorder_mode" );
2837 aValuesList.clear();
2838 anIndicesList.clear();
2839 aValuesList << tr( "PREF_SKIPPED_FRAMES" ) << tr( "PREF_ALL_DISLPAYED_FRAMES" );
2840 anIndicesList << 0 << 1;
2841 pref->setItemProperty( "strings", aValuesList, modePref );
2842 pref->setItemProperty( "indexes", anIndicesList, modePref );
2844 int fpsPref = pref->addPreference( tr( "PREF_FPS" ), vtkRec,
2845 LightApp_Preferences::DblSpin, "VTKViewer", "recorder_fps" );
2846 pref->setItemProperty( "min", 0.1, fpsPref );
2847 pref->setItemProperty( "max", 100, fpsPref );
2849 int qualityPref = pref->addPreference( tr( "PREF_QUALITY" ), vtkRec,
2850 LightApp_Preferences::IntSpin, "VTKViewer", "recorder_quality" );
2851 pref->setItemProperty( "min", 1, qualityPref );
2852 pref->setItemProperty( "max", 100, qualityPref );
2853 // .... -> progressive mode
2854 pref->addPreference( tr( "PREF_PROGRESSIVE" ), vtkRec,
2855 LightApp_Preferences::Bool, "VTKViewer", "recorder_progressive" );
2856 // ... avi recording sub-group <<end>>
2858 // ... group names sub-group <<start>>
2859 int vtkGN = pref->addPreference( tr( "PREF_FRAME_GROUP_NAMES" ), vtkGroup,
2860 LightApp_Preferences::GroupBox, "VTKViewer", "show_group_names" );
2861 pref->setItemProperty( "columns", 2, vtkGN );
2862 // .... -> text color
2863 pref->addPreference( tr( "PREF_GROUP_NAMES_TEXT_COLOR" ), vtkGN,
2864 LightApp_Preferences::Color, "VTKViewer", "group_names_text_color" );
2865 // .... -> transparency
2866 int transPref = pref->addPreference( tr( "PREF_GROUP_NAMES_TRANSPARENCY" ), vtkGN,
2867 LightApp_Preferences::DblSpin, "VTKViewer", "group_names_transparency" );
2868 pref->setItemProperty( "min", 0.0, transPref );
2869 pref->setItemProperty( "max", 1.0, transPref );
2870 pref->setItemProperty( "step", 0.1, transPref );
2871 // ... -> group names sub-group <<end>>
2872 // .. "VTK viewer" group <<end>>
2875 // .. "Plot2d viewer" group <<start>>
2876 int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab
2877 //pref->setItemProperty( "columns", 2, plot2dGroup );
2879 // ... -> background
2880 pref->addPreference( tr( "PREF_VIEWER_BACKGROUND_COLOR" ), plot2dGroup,
2881 LightApp_Preferences::Color, "Plot2d", "Background" );
2882 // ... -> selection color
2883 pref->addPreference( tr( "PREF_VIEWER_SELECTION" ), plot2dGroup,
2884 LightApp_Preferences::Color, "Plot2d", "SelectionColor" );
2886 // ... "Viewer" group <<start>>
2887 int plot2dViewerGroup = pref->addPreference( tr( "PREF_GROUP_VIEWER" ), plot2dGroup );
2889 // .... -> curve type
2890 int curveType = pref->addPreference( tr( "PREF_CURVE_TYPE" ), plot2dViewerGroup,
2891 LightApp_Preferences::Selector, "Plot2d", "CurveType" );
2892 aValuesList.clear();
2893 anIndicesList.clear();
2894 aValuesList << tr("PREF_POINTS") << tr("PREF_LINES") << tr("PREF_SPLINE");
2895 anIndicesList << 0 << 1 << 2 ;
2896 pref->setItemProperty( "strings", aValuesList, curveType );
2897 pref->setItemProperty( "indexes", anIndicesList, curveType );
2898 // .... -> marker size
2899 int markerSize = pref->addPreference( tr( "PREF_MARKER_SIZE" ), plot2dViewerGroup,
2900 LightApp_Preferences::IntSpin, "Plot2d", "MarkerSize" );
2901 pref->setItemProperty( "min", 0, markerSize );
2902 pref->setItemProperty( "max", 100, markerSize );
2903 // .... -> horizontal scaling mode
2904 int horScale = pref->addPreference( tr( "PREF_HOR_AXIS_SCALE" ), plot2dViewerGroup,
2905 LightApp_Preferences::Selector, "Plot2d", "HorScaleMode" );
2906 aValuesList.clear();
2907 anIndicesList.clear();
2908 aValuesList << tr("PREF_LINEAR") << tr("PREF_LOGARITHMIC");
2909 anIndicesList << 0 << 1 ;
2910 pref->setItemProperty( "strings", aValuesList, horScale );
2911 pref->setItemProperty( "indexes", anIndicesList, horScale );
2912 // .... -> vertical scaling mode
2913 int verScale = pref->addPreference( tr( "PREF_VERT_AXIS_SCALE" ), plot2dViewerGroup,
2914 LightApp_Preferences::Selector, "Plot2d", "VerScaleMode" );
2915 pref->setItemProperty( "strings", aValuesList, verScale );
2916 pref->setItemProperty( "indexes", anIndicesList, verScale );
2918 // .... -> errors/deviation colot
2919 pref->addPreference( tr( "PREF_DEVIATION_COLOR" ), plot2dViewerGroup,
2920 LightApp_Preferences::Color, "Plot2d", "DeviationMarkerColor" );
2921 // .... -> deviation markers line size
2922 int deviationMarkerLw = pref->addPreference( tr( "PREF_DEVIATION_MARKER_LW" ), plot2dViewerGroup,
2923 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerLineWidth" );
2924 pref->setItemProperty( "min", 1, deviationMarkerLw );
2925 pref->setItemProperty( "max", 5, deviationMarkerLw );
2926 // .... -> deviation markers tick mark size
2927 int deviationMarkerTs = pref->addPreference( tr( "PREF_DEVIATION_MARKER_TS" ), plot2dViewerGroup,
2928 LightApp_Preferences::IntSpin, "Plot2d", "DeviationMarkerTickSize" );
2929 pref->setItemProperty( "min", 1, deviationMarkerTs );
2930 pref->setItemProperty( "max", 5, deviationMarkerTs );
2931 // .... "Viewer" group <<end>>
2933 // ... "Legend" group <<start>>
2934 int plot2dLegendGroup = pref->addPreference( tr( "PREF_GROUP_LEGEND" ), plot2dGroup );
2936 // .... -> show legend
2937 pref->addPreference( tr( "PREF_SHOW_LEGEND" ), plot2dLegendGroup,
2938 LightApp_Preferences::Bool, "Plot2d", "ShowLegend" );
2939 // .... -> legend position
2940 int legendPosition = pref->addPreference( tr( "PREF_LEGEND_POSITION" ), plot2dLegendGroup,
2941 LightApp_Preferences::Selector, "Plot2d", "LegendPos" );
2942 aValuesList.clear();
2943 anIndicesList.clear();
2944 aValuesList << tr("PREF_LEFT") << tr("PREF_RIGHT") << tr("PREF_TOP") << tr("PREF_BOTTOM");
2945 anIndicesList << 0 << 1 << 2 << 3 ;
2946 pref->setItemProperty( "strings", aValuesList, legendPosition );
2947 pref->setItemProperty( "indexes", anIndicesList, legendPosition );
2948 // .... -> Symbol type
2949 int legendSymbolType = pref->addPreference( tr( "PREF_LEGEND_SYMBOL_TYPE" ), plot2dLegendGroup,
2950 LightApp_Preferences::Selector, "Plot2d", "LegendSymbolType" );
2951 aValuesList.clear();
2952 anIndicesList.clear();
2953 aValuesList << tr("PREF_MARKER_ON_LINE") << tr("PREF_MARKER_ABOVE_LINE");
2954 anIndicesList << 0 << 1 ;
2955 pref->setItemProperty( "strings", aValuesList, legendSymbolType );
2956 pref->setItemProperty( "indexes", anIndicesList, legendSymbolType );
2957 // .... -> legend font
2958 pref->addPreference( tr( "PREF_LEGEND_FONT" ), plot2dLegendGroup, LightApp_Preferences::Font, "Plot2d", "LegendFont" );
2959 // ... -> font color
2960 pref->addPreference( tr( "PREF_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "LegendFontColor" );
2961 // ... -> selection font color
2962 pref->addPreference( tr( "PREF_SELECTED_FONT_COLOR" ), plot2dLegendGroup, LightApp_Preferences::Color, "Plot2d", "SelectedLegendFontColor" );
2963 // ... "Legend" group <<end>>
2965 // .. "Plot2d viewer" group <<end>>
2967 // .. "PyViewer" preferences tab <<start>>
2968 int pyeditTab = pref->addPreference( tr( "PREF_TAB_PYEDITOR" ), salomeCat );
2969 // ... "Font settings" group <<start>>
2970 int pyFontGroup = pref->addPreference( tr( "PREF_GROUP_PY_FONT" ), pyeditTab );
2971 int pyFont = pref->addPreference( tr( "PREF_PY_FONT" ), pyFontGroup,
2972 LightApp_Preferences::Font, "PyEditor", "Font" );
2973 pref->setItemProperty( "features", QtxFontEdit::Family | QtxFontEdit::Size | QtxFontEdit::UserSize, pyFont );
2974 // ... "Font settings" group <<end>>
2975 // ... "Display settings" group <<start>>
2976 int pyDispGroup = pref->addPreference( tr( "PREF_GROUP_PY_DISPLAY" ), pyeditTab );
2977 pref->setItemProperty( "columns", 2, pyDispGroup );
2978 // ... -> current line highlight
2979 pref->addPreference( tr( "PREF_PY_CURRLINE_HIGHLIGHT" ), pyDispGroup,
2980 LightApp_Preferences::Bool, "PyEditor", "HighlightCurrentLine" );
2981 // ... -> text wrapping
2982 pref->addPreference( tr( "PREF_PY_TEXT_WRAP" ), pyDispGroup,
2983 LightApp_Preferences::Bool, "PyEditor", "TextWrapping" );
2984 // ... -> center cursor on scroll
2985 pref->addPreference( tr( "PREF_PY_CURSON_ON_SCROLL" ), pyDispGroup,
2986 LightApp_Preferences::Bool, "PyEditor", "CenterCursorOnScroll" );
2987 // ... -> line numbers area
2988 pref->addPreference( tr( "PREF_PY_LINE_NUMBS_AREA" ), pyDispGroup,
2989 LightApp_Preferences::Bool, "PyEditor", "LineNumberArea" );
2990 // ... "Display settings" group <<end>>
2992 // ... "Editor settings" group <<start>>
2993 int pyEditGroup = pref->addPreference( tr( "PREF_GROUP_PY_EDITOR" ), pyeditTab );
2994 // ... -> navigation mode
2995 int pyCompletion = pref->addPreference( tr( "PREF_PY_COMPLETION_MODE" ), pyEditGroup,
2996 LightApp_Preferences::Selector, "PyEditor", "CompletionPolicy" );
2997 aValuesList.clear();
2998 anIndicesList.clear();
2999 aValuesList << tr("PREF_PY_NONE") << tr("PREF_PY_AUTO") << tr("PREF_PY_MANUAL") << tr("PREF_PY_ALWAYS");
3000 anIndicesList << 0 << 1 << 2 << 3 ;
3001 pref->setItemProperty( "strings", aValuesList, pyCompletion );
3002 pref->setItemProperty( "indexes", anIndicesList, pyCompletion );
3003 // ... "Editor settings" group <<end>>
3005 // ... "Tab settings" group <<start>>
3006 int pyTabGroup = pref->addPreference( tr( "PREF_GROUP_PY_TAB" ), pyeditTab );
3007 pref->setItemProperty( "columns", 2, pyTabGroup );
3008 // ... -> tab whitespaces
3009 pref->addPreference( tr( "PREF_PY_TAB_WHITESPACES" ), pyTabGroup,
3010 LightApp_Preferences::Bool, "PyEditor", "TabSpaceVisible" );
3012 pref->addPreference( tr( "PREF_PY_TAB_SIZE" ), pyTabGroup,
3013 LightApp_Preferences::IntSpin, "PyEditor", "TabSize" );
3014 // ... "Tab settings" group <<end>>
3015 // ... "Vertical edge settings" group <<start>>
3016 int pyVertEdgeGroup = pref->addPreference( tr( "PREF_GROUP_VERT_EDGE" ), pyeditTab );
3017 pref->setItemProperty( "columns", 2, pyVertEdgeGroup );
3018 // ... -> vertical edge
3019 pref->addPreference( tr( "PREF_PY_VERT_EDGE" ), pyVertEdgeGroup,
3020 LightApp_Preferences::Bool, "PyEditor", "VerticalEdge" );
3021 // ... -> number of columns
3022 pref->addPreference( tr( "PREF_PY_NUM_COLUMNS" ), pyVertEdgeGroup,
3023 LightApp_Preferences::IntSpin, "PyEditor", "NumberColumns" );
3024 // ... "Vertical edge settings" group <<end>>
3025 // .. "PyEditor" preferences tab <<end>>
3027 // .. "Directories" preferences tab <<start>>
3028 int dirTab = pref->addPreference( tr( "PREF_TAB_DIRECTORIES" ), salomeCat );
3029 // ... --> quick directories list
3030 int dirGroup = pref->addPreference( tr( "PREF_GROUP_DIRECTORIES" ), dirTab );
3031 pref->addPreference( tr( "" ), dirGroup,
3032 LightApp_Preferences::DirList, "FileDlg", "QuickDirList" );
3033 // .. "Directories" preferences tab <<end>>
3035 // .. "Object browser" preferences tab <<start>>
3036 int obTab = pref->addPreference( tr( "PREF_TAB_OBJBROWSER" ), salomeCat );
3038 // ... "Search tool" group <<start>>
3039 int stGroup = pref->addPreference( tr( "PREF_OBJ_BROWSER_SEARCH_TOOL" ), obTab );
3040 // .... --> auto-hide
3041 pref->addPreference( tr( "PREF_AUTO_HIDE_SEARCH_TOOL" ), stGroup, LightApp_Preferences::Bool,
3042 "ObjectBrowser", "auto_hide_search_tool" );
3043 // ... "Search tool" group <<end>>
3045 // ... "Object browser settings" group <<start>>
3046 int objSetGroup = pref->addPreference( tr( "PREF_GROUP_LOOK_AND_FEEL" ), obTab );
3047 pref->setItemProperty( "columns", 2, objSetGroup );
3048 // .... -> auto size first column
3049 pref->addPreference( tr( "PREF_AUTO_SIZE_FIRST" ), objSetGroup, LightApp_Preferences::Bool,
3050 "ObjectBrowser", "auto_size_first" );
3051 // .... -> auto size other columns
3052 pref->addPreference( tr( "PREF_AUTO_SIZE" ), objSetGroup, LightApp_Preferences::Bool,
3053 "ObjectBrowser", "auto_size" );
3054 // .... -> resize columns on expand item
3055 pref->addPreference( tr( "PREF_RESIZE_ON_EXPAND_ITEM" ), objSetGroup, LightApp_Preferences::Bool,
3056 "ObjectBrowser", "resize_on_expand_item" );
3057 // .... -> browse to published object
3058 int browsePublished = pref->addPreference( tr( "PREF_BROWSE_TO_THE_PUBLISHED_OBJECT" ), objSetGroup, LightApp_Preferences::Selector,
3059 "ObjectBrowser", "browse_published_object" );
3060 aValuesList.clear();
3061 anIndicesList.clear();
3062 aValuesList << tr( "PREF_BROWSE_NEVER" ) << tr( "PREF_BROWSE_AFTER_APPLY_AND_CLOSE_ONLY" ) << tr( "PREF_BROWSE_ALWAYS" );
3063 anIndicesList << BP_Never << BP_ApplyAndClose << BP_Always;
3064 pref->setItemProperty( "strings", aValuesList, browsePublished );
3065 pref->setItemProperty( "indexes", anIndicesList, browsePublished );
3066 // ... "Object browser settings" group <<end>>
3067 // .. "Object browser" preferences tab <<end>>
3069 // .. "Shortcuts" preferences tab <<start>>
3070 int shortcutTab = pref->addPreference( tr( "PREF_TAB_SHORTCUTS" ), salomeCat );
3071 // ... "Shortcuts settings" group <<start>>
3072 int shortcutGroup = pref->addPreference( tr( "PREF_GROUP_SHORTCUTS" ), shortcutTab );
3073 pref->addPreference( tr( "" ), shortcutGroup,
3074 LightApp_Preferences::ShortcutTree, "shortcuts" );
3075 // ... "Shortcuts settings" group <<end>>
3076 // .. "Shortcuts" preferences tab <<end>>
3077 // . Top-level "SALOME" preferences group <<end>>
3083 Changes appearance of application according to changed preferences
3084 \param sec - section
3085 \param param - name of changed parameter
3087 void LightApp_Application::preferencesChanged( const QString& sec, const QString& param )
3089 SUIT_ResourceMgr* resMgr = resourceMgr();
3093 if ( sec == "viewers" && param == "drop_down_buttons" )
3095 ViewManagerList vmlist = viewManagers();
3096 foreach( SUIT_ViewManager* vm, vmlist )
3098 QVector<SUIT_ViewWindow*> vwlist = vm->getViews();
3099 foreach( SUIT_ViewWindow* vw, vwlist )
3100 if ( vw ) vw->setDropDownButtons( resMgr->booleanValue( "viewers", "drop_down_buttons", true ) );
3104 if ( sec == QString( "3DViewer" ) && (param == QString( "trihedron_size" ) || param == QString( "relative_size" )))
3106 double sz = resMgr->doubleValue( sec, "trihedron_size", -1 );
3107 bool relative = resMgr->booleanValue( sec, "relative_size", true );
3108 QList<SUIT_ViewManager*> lst;
3109 #ifndef DISABLE_OCCVIEWER
3110 viewManagers( OCCViewer_Viewer::Type(), lst );
3111 QListIterator<SUIT_ViewManager*> itOCC( lst );
3112 while ( itOCC.hasNext() && sz >= 0 )
3114 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3115 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3118 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3119 occVM->setTrihedronSize( sz, relative );
3120 occVM->getAISContext()->UpdateCurrentViewer();
3123 #ifndef DISABLE_VTKVIEWER
3124 #ifndef DISABLE_SALOMEOBJECT
3125 viewManagers( SVTK_Viewer::Type(), lst );
3126 QListIterator<SUIT_ViewManager*> itVTK( lst );
3127 while ( itVTK.hasNext() && sz >= 0 )
3129 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3130 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3133 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3136 vtkVM->setTrihedronSize( sz, relative );
3144 if ( sec == QString( "3DViewer" ) && param == QString( "show_static_trihedron" ) )
3146 bool isVisible = resMgr->booleanValue( "3DViewer", "show_static_trihedron", true );
3147 QList<SUIT_ViewManager*> lst;
3148 #ifndef DISABLE_OCCVIEWER
3149 viewManagers( OCCViewer_Viewer::Type(), lst );
3150 QListIterator<SUIT_ViewManager*> itOCC( lst );
3151 while ( itOCC.hasNext() )
3153 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3154 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3157 OCCViewer_Viewer* occVM = dynamic_cast<OCCViewer_Viewer*>( vm );
3160 occVM->setStaticTrihedronDisplayed( isVisible );
3164 #ifndef DISABLE_VTKVIEWER
3165 #ifndef DISABLE_SALOMEOBJECT
3166 viewManagers( SVTK_Viewer::Type(), lst );
3167 QListIterator<SUIT_ViewManager*> itVTK( lst );
3168 while ( itVTK.hasNext() )
3170 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3171 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3174 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3177 vtkVM->setStaticTrihedronVisible( isVisible );
3185 if ( sec == QString( "3DViewer" ) && param == QString( "navigation_mode" ) )
3187 int mode = resMgr->integerValue( "3DViewer", "navigation_mode", 0 );
3188 QList<SUIT_ViewManager*> lst;
3189 #ifndef DISABLE_OCCVIEWER
3190 viewManagers( OCCViewer_Viewer::Type(), lst );
3191 QListIterator<SUIT_ViewManager*> itOCC( lst );
3192 while ( itOCC.hasNext() )
3194 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3195 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3198 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3199 occVM->setInteractionStyle( mode );
3202 #ifndef DISABLE_VTKVIEWER
3203 #ifndef DISABLE_SALOMEOBJECT
3204 viewManagers( SVTK_Viewer::Type(), lst );
3205 QListIterator<SUIT_ViewManager*> itVTK( lst );
3206 while ( itVTK.hasNext() )
3208 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3209 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3212 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3213 if( vtkVM ) vtkVM->setInteractionStyle( mode );
3219 #ifndef DISABLE_OCCVIEWER
3220 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_preselection" ) )
3222 bool isToEnablePreselection = resMgr->booleanValue( "OCCViewer", "enable_preselection", true );
3223 QList<SUIT_ViewManager*> lst;
3224 viewManagers( OCCViewer_Viewer::Type(), lst );
3225 QListIterator<SUIT_ViewManager*> it( lst );
3226 while ( it.hasNext() )
3228 SUIT_ViewModel* vm = it.next()->getViewModel();
3229 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3232 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3233 occVM->enablePreselection( isToEnablePreselection );
3238 #ifndef DISABLE_OCCVIEWER
3239 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_selection" ) )
3241 bool isToEnableSelection = resMgr->booleanValue( "OCCViewer", "enable_selection", true );
3242 QList<SUIT_ViewManager*> lst;
3243 viewManagers( OCCViewer_Viewer::Type(), lst );
3244 QListIterator<SUIT_ViewManager*> it( lst );
3245 while ( it.hasNext() )
3247 SUIT_ViewModel* vm = it.next()->getViewModel();
3248 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3251 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3252 occVM->enableSelection( isToEnableSelection );
3257 #ifndef DISABLE_OCCVIEWER
3258 if ( sec == QString( "OCCViewer" ) && param == QString( "clipping_color" ) )
3260 QColor aColor = resMgr->colorValue( "OCCViewer", "clipping_color", QColor( 50, 50, 50 ) );
3261 QList<SUIT_ViewManager*> lst;
3262 viewManagers( OCCViewer_Viewer::Type(), lst );
3263 QListIterator<SUIT_ViewManager*> it( lst );
3264 while ( it.hasNext() )
3266 SUIT_ViewModel* vm = it.next()->getViewModel();
3267 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3270 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3271 occVM->setClippingColor( aColor );
3276 #ifndef DISABLE_OCCVIEWER
3277 if ( sec == QString( "OCCViewer" ) && ( param == QString( "clipping_use_default_texture" ) ||
3278 param == QString( "clipping_texture" ) ||
3279 param == QString( "clipping_modulate" ) ||
3280 param == QString( "clipping_scale" ) ) )
3282 bool isDefaultTextureUsed = resMgr->booleanValue( "OCCViewer", "clipping_use_default_texture" );
3283 QString aTexture = resMgr->stringValue( "OCCViewer", "clipping_texture" );
3284 bool isModulated = resMgr->booleanValue( "OCCViewer", "clipping_modulate" );
3285 double aScale = resMgr->doubleValue( "OCCViewer", "clipping_scale" );
3286 QList<SUIT_ViewManager*> lst;
3287 viewManagers( OCCViewer_Viewer::Type(), lst );
3288 QListIterator<SUIT_ViewManager*> it( lst );
3289 while ( it.hasNext() )
3291 SUIT_ViewModel* vm = it.next()->getViewModel();
3292 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3295 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3296 occVM->setClippingTextureParams( isDefaultTextureUsed, aTexture, isModulated, aScale );
3301 #ifndef DISABLE_OCCVIEWER
3302 if ( sec == QString( "OCCViewer" ) && param == QString( "projection_mode" ) )
3304 int mode = resMgr->integerValue( "OCCViewer", "projection_mode", 0 );
3305 QList<SUIT_ViewManager*> lst;
3306 viewManagers( OCCViewer_Viewer::Type(), lst );
3307 QListIterator<SUIT_ViewManager*> it( lst );
3308 while ( it.hasNext() )
3310 SUIT_ViewModel* vm = it.next()->getViewModel();
3311 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3314 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3315 occVM->setProjectionType( mode );
3320 #ifndef DISABLE_OCCVIEWER
3321 if ( sec == QString( "OCCViewer" ) && param == QString( "stereo_type" ) )
3323 int mode = resMgr->integerValue( "OCCViewer", "stereo_type", 0 );
3324 QList<SUIT_ViewManager*> lst;
3325 viewManagers( OCCViewer_Viewer::Type(), lst );
3326 QListIterator<SUIT_ViewManager*> it( lst );
3327 while ( it.hasNext() )
3329 SUIT_ViewModel* vm = it.next()->getViewModel();
3330 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3333 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3334 occVM->setStereoType( mode );
3339 #ifndef DISABLE_OCCVIEWER
3340 if ( sec == QString( "OCCViewer" ) && param == QString( "anaglyph_filter" ) )
3342 int mode = resMgr->integerValue( "OCCViewer", "anaglyph_filter", 0 );
3343 QList<SUIT_ViewManager*> lst;
3344 viewManagers( OCCViewer_Viewer::Type(), lst );
3345 QListIterator<SUIT_ViewManager*> it( lst );
3346 while ( it.hasNext() )
3348 SUIT_ViewModel* vm = it.next()->getViewModel();
3349 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3352 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3353 occVM->setAnaglyphFilter( mode );
3358 #ifndef DISABLE_OCCVIEWER
3359 if ( sec == QString( "OCCViewer" ) && ( param == QString( "focus_type" ) ||
3360 param == QString( "focus_value" ) ) )
3362 int aType = resMgr->integerValue( "OCCViewer", "focus_type" );
3363 double aValue = resMgr->doubleValue( "OCCViewer", "focus_value" );
3364 QList<SUIT_ViewManager*> lst;
3365 viewManagers( OCCViewer_Viewer::Type(), lst );
3366 QListIterator<SUIT_ViewManager*> it( lst );
3367 while ( it.hasNext() )
3369 SUIT_ViewModel* vm = it.next()->getViewModel();
3370 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3373 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3374 occVM->setStereographicFocus( aType, aValue );
3379 #ifndef DISABLE_OCCVIEWER
3380 if ( sec == QString( "OCCViewer" ) && ( param == QString( "iod_type" ) ||
3381 param == QString( "iod_value" ) ) )
3383 int aType = resMgr->integerValue( "OCCViewer", "iod_type" );
3384 double aValue = resMgr->doubleValue( "OCCViewer", "iod_value" );
3385 QList<SUIT_ViewManager*> lst;
3386 viewManagers( OCCViewer_Viewer::Type(), lst );
3387 QListIterator<SUIT_ViewManager*> it( lst );
3388 while ( it.hasNext() )
3390 SUIT_ViewModel* vm = it.next()->getViewModel();
3391 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3394 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3395 occVM->setInterocularDistance( aType, aValue );
3400 #ifndef DISABLE_OCCVIEWER
3401 if ( sec == QString( "OCCViewer" ) && param == QString( "reverse_stereo" ) )
3403 bool reverse = resMgr->booleanValue( "OCCViewer", "reverse_stereo", false );
3404 QList<SUIT_ViewManager*> lst;
3405 viewManagers( OCCViewer_Viewer::Type(), lst );
3406 QListIterator<SUIT_ViewManager*> it( lst );
3407 while ( it.hasNext() )
3409 SUIT_ViewModel* vm = it.next()->getViewModel();
3410 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3413 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3414 occVM->setReverseStereo( reverse );
3419 #ifndef DISABLE_OCCVIEWER
3420 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_vsync" ) )
3422 bool enable = resMgr->booleanValue( "OCCViewer", "enable_vsync", true );
3423 QList<SUIT_ViewManager*> lst;
3424 viewManagers( OCCViewer_Viewer::Type(), lst );
3425 QListIterator<SUIT_ViewManager*> it( lst );
3426 while ( it.hasNext() )
3428 SUIT_ViewModel* vm = it.next()->getViewModel();
3429 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3432 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3433 occVM->setVSync( enable );
3438 #ifndef DISABLE_OCCVIEWER
3439 if ( sec == QString( "OCCViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3441 bool enable = resMgr->booleanValue( "OCCViewer", "enable_quad_buffer_support", false );
3442 QList<SUIT_ViewManager*> lst;
3443 viewManagers( OCCViewer_Viewer::Type(), lst );
3444 QListIterator<SUIT_ViewManager*> it( lst );
3445 while ( it.hasNext() )
3447 SUIT_ViewModel* vm = it.next()->getViewModel();
3448 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3451 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3452 occVM->setQuadBufferSupport( enable );
3457 if ( sec == QString( "3DViewer" ) && param == QString( "zooming_mode" ) )
3459 int mode = resMgr->integerValue( "3DViewer", "zooming_mode", 0 );
3460 QList<SUIT_ViewManager*> lst;
3461 #ifndef DISABLE_OCCVIEWER
3462 viewManagers( OCCViewer_Viewer::Type(), lst );
3463 QListIterator<SUIT_ViewManager*> itOCC( lst );
3464 while ( itOCC.hasNext() )
3466 SUIT_ViewModel* vm = itOCC.next()->getViewModel();
3467 if ( !vm || !vm->inherits( "OCCViewer_Viewer" ) )
3470 OCCViewer_Viewer* occVM = (OCCViewer_Viewer*)vm;
3471 occVM->setZoomingStyle( mode );
3474 #ifndef DISABLE_VTKVIEWER
3475 #ifndef DISABLE_SALOMEOBJECT
3476 viewManagers( SVTK_Viewer::Type(), lst );
3477 QListIterator<SUIT_ViewManager*> itVTK( lst );
3478 while ( itVTK.hasNext() )
3480 SUIT_ViewModel* vm = itVTK.next()->getViewModel();
3481 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3484 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3485 if( vtkVM ) vtkVM->setZoomingStyle( mode );
3491 #ifndef DISABLE_VTKVIEWER
3492 if ( sec == QString( "VTKViewer" ) && (param == QString( "speed_value" ) || param == QString( "speed_mode" )) )
3494 int speed = resMgr->integerValue( "VTKViewer", "speed_value", 10 );
3495 int mode = resMgr->integerValue( "VTKViewer", "speed_mode", 0 );
3496 QList<SUIT_ViewManager*> lst;
3497 #ifndef DISABLE_SALOMEOBJECT
3498 viewManagers( SVTK_Viewer::Type(), lst );
3499 QListIterator<SUIT_ViewManager*> it( lst );
3500 while ( it.hasNext() )
3502 SUIT_ViewModel* vm = it.next()->getViewModel();
3503 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3506 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3507 if( vtkVM ) vtkVM->setIncrementalSpeed( speed, mode );
3513 #ifndef DISABLE_VTKVIEWER
3514 if ( sec == QString( "VTKViewer" ) && param == QString( "projection_mode" ) )
3516 int mode = resMgr->integerValue( "VTKViewer", "projection_mode", 0 );
3517 QList<SUIT_ViewManager*> lst;
3518 #ifndef DISABLE_SALOMEOBJECT
3519 viewManagers( SVTK_Viewer::Type(), lst );
3520 QListIterator<SUIT_ViewManager*> it( lst );
3521 while ( it.hasNext() )
3523 SUIT_ViewModel* vm = it.next()->getViewModel();
3524 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3527 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3528 if( vtkVM ) vtkVM->setProjectionMode( mode );
3534 #ifndef DISABLE_VTKVIEWER
3535 if ( sec == QString( "VTKViewer" ) && param == QString( "stereo_type" ) )
3537 int mode = resMgr->integerValue( "VTKViewer", "stereo_type", 0 );
3538 QList<SUIT_ViewManager*> lst;
3539 #ifndef DISABLE_SALOMEOBJECT
3540 viewManagers( SVTK_Viewer::Type(), lst );
3541 QListIterator<SUIT_ViewManager*> it( lst );
3542 while ( it.hasNext() )
3544 SUIT_ViewModel* vm = it.next()->getViewModel();
3545 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3548 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3549 if( vtkVM ) vtkVM->setStereoType( mode );
3555 #ifndef DISABLE_VTKVIEWER
3556 if ( sec == QString( "VTKViewer" ) && param == QString( "anaglyph_filter" ) )
3558 int mode = resMgr->integerValue( "VTKViewer", "anaglyph_filter", 0 );
3559 QList<SUIT_ViewManager*> lst;
3560 #ifndef DISABLE_SALOMEOBJECT
3561 viewManagers( SVTK_Viewer::Type(), lst );
3562 QListIterator<SUIT_ViewManager*> it( lst );
3563 while ( it.hasNext() )
3565 SUIT_ViewModel* vm = it.next()->getViewModel();
3566 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3569 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3570 if( vtkVM ) vtkVM->setAnaglyphFilter( mode );
3576 #ifndef DISABLE_VTKVIEWER
3577 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_quad_buffer_support" ) )
3579 int enable = resMgr->booleanValue( "VTKViewer", "enable_quad_buffer_support", false );
3580 QList<SUIT_ViewManager*> lst;
3581 #ifndef DISABLE_SALOMEOBJECT
3582 viewManagers( SVTK_Viewer::Type(), lst );
3583 QListIterator<SUIT_ViewManager*> it( lst );
3584 while ( it.hasNext() )
3586 SUIT_ViewModel* vm = it.next()->getViewModel();
3587 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3590 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3591 if( vtkVM ) vtkVM->setQuadBufferSupport( enable );
3597 #ifndef DISABLE_VTKVIEWER
3598 if ( sec == QString( "VTKViewer" ) && param == QString( "preselection" ) )
3600 int mode = resMgr->integerValue( "VTKViewer", "preselection", 0 );
3601 QList<SUIT_ViewManager*> lst;
3602 #ifndef DISABLE_SALOMEOBJECT
3603 viewManagers( SVTK_Viewer::Type(), lst );
3604 QListIterator<SUIT_ViewManager*> it( lst );
3605 while ( it.hasNext() )
3607 SUIT_ViewModel* vm = it.next()->getViewModel();
3608 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3611 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3612 if( vtkVM ) vtkVM->setPreSelectionMode( mode );
3618 #ifndef DISABLE_VTKVIEWER
3619 if ( sec == QString( "VTKViewer" ) && param == QString( "enable_selection" ) )
3621 bool isToEnableSelection = resMgr->booleanValue( "VTKViewer", "enable_selection", true );
3622 QList<SUIT_ViewManager*> lst;
3623 #ifndef DISABLE_SALOMEOBJECT
3624 viewManagers( SVTK_Viewer::Type(), lst );
3625 QListIterator<SUIT_ViewManager*> it( lst );
3626 while ( it.hasNext() )
3628 SUIT_ViewModel* vm = it.next()->getViewModel();
3629 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3632 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3633 if( vtkVM ) vtkVM->enableSelection( isToEnableSelection );
3639 #ifndef DISABLE_VTKVIEWER
3640 if ( sec == QString( "VTKViewer" ) && (param == QString( "spacemouse_func1_btn" ) ||
3641 param == QString( "spacemouse_func2_btn" ) ||
3642 param == QString( "spacemouse_func5_btn" ) ) )
3644 int btn1 = resMgr->integerValue( "VTKViewer", "spacemouse_func1_btn", 1 );
3645 int btn2 = resMgr->integerValue( "VTKViewer", "spacemouse_func2_btn", 2 );
3646 int btn3 = resMgr->integerValue( "VTKViewer", "spacemouse_func5_btn", 9 );
3647 QList<SUIT_ViewManager*> lst;
3648 #ifndef DISABLE_SALOMEOBJECT
3649 viewManagers( SVTK_Viewer::Type(), lst );
3650 QListIterator<SUIT_ViewManager*> it( lst );
3651 while ( it.hasNext() )
3653 SUIT_ViewModel* vm = it.next()->getViewModel();
3654 if ( !vm || !vm->inherits( "SVTK_Viewer" ) )
3657 SVTK_Viewer* vtkVM = dynamic_cast<SVTK_Viewer*>( vm );
3658 if( vtkVM ) vtkVM->setSpacemouseButtons( btn1, btn2, btn3 );
3663 if( sec=="ObjectBrowser" )
3665 SUIT_DataBrowser* ob = objectBrowser();
3669 if ( param=="auto_size_first" )
3671 bool autoSizeFirst = resMgr->booleanValue( "ObjectBrowser", "auto_size_first", true );
3672 ob->setAutoSizeFirstColumn( autoSizeFirst );
3673 if ( autoSizeFirst )
3674 ob->adjustFirstColumnWidth();
3676 else if ( param=="auto_size" ) {
3677 bool autoSize = resMgr->booleanValue( "ObjectBrowser", "auto_size", false );
3678 ob->setAutoSizeColumns(autoSize);
3680 ob->adjustColumnsWidth();
3682 else if ( param=="resize_on_expand_item" ) {
3683 bool resizeOnExpandItem = resMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false );
3684 ob->setResizeOnExpandItem(resizeOnExpandItem);
3686 else if ( param == "auto_hide_search_tool" ) {
3687 ob->searchTool()->enableAutoHide( resMgr->booleanValue( "ObjectBrowser", "auto_hide_search_tool" ) );
3693 if( param=="auto_save_interval" ) {
3694 myAutoSaveTimer->stop();
3695 int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 );
3696 if ( activeStudy() && autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
3700 #ifndef DISABLE_PYCONSOLE
3701 if( sec=="PyConsole" && pythonConsole() )
3703 if ( param=="font" ) {
3704 pythonConsole()->setFont( resMgr->fontValue( "PyConsole", "font" ) );
3706 else if ( param=="show_banner" ) {
3707 pythonConsole()->setIsShowBanner( resMgr->booleanValue( "PyConsole", "show_banner", true ) );
3709 else if ( param=="auto_completion" ) {
3710 pythonConsole()->setAutoCompletion( resMgr->booleanValue( "PyConsole", "auto_completion", true ) );
3717 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3719 if ( param == "visible_count" )
3720 mru->setVisibleCount( resMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3721 else if ( param == "max_count" )
3722 mru->setHistoryCount( resMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3723 else if ( param == "insert_mode" )
3724 mru->setInsertMode( resMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3725 else if ( param == "link_type" )
3726 mru->setLinkType( resMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3727 else if ( param == "show_clear" )
3728 mru->setClearPossible( resMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3729 else if ( param == "show_mru" )
3730 mru->setVisible( resMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3733 if ( sec == "language" && param == "language" )
3735 // VSR 18.06.2015 : commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3736 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LANG_CHANGED" ) );
3738 if ( sec == "language" && param == "locale")
3740 // VSR 18.06.2015: commented out : single warning dialog box is now shown by the LightApp_PreferencesDlg
3741 //SUIT_MessageBox::information( desktop(), tr( "WRN_WARNING" ), tr( "LOCALE_CHANGED" ) );
3743 if ( sec == "desktop" && param == "opaque_resize" ) {
3744 bool opaqueResize = resMgr->booleanValue( "desktop", "opaque_resize", false );
3745 // RNV: This code has been commented, because clearing of the QMainWindow::AnimatedDocks option
3746 // leads to strange behaviour of the dockable windows (at least at qt-5.6.1):
3747 // any dockable window can't be docked to the another area, except initial area.
3748 // It is possible to move window to another area, but it always returns to the initial area.
3750 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3751 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3752 // else dopts &= ~QMainWindow::AnimatedDocks;
3753 // desktop()->setDockOptions( dopts );
3754 desktop()->setOpaqueResize( opaqueResize );
3755 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3756 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3759 #ifndef DISABLE_PLOT2DVIEWER
3760 QList<SUIT_ViewManager*> lst;
3761 viewManagers( Plot2d_Viewer::Type(), lst );
3762 QListIterator<SUIT_ViewManager*> itPlot2d( lst );
3763 while ( itPlot2d.hasNext() ) {
3764 SUIT_ViewManager* viewMgr = itPlot2d.next();
3765 SUIT_ViewModel* vm = viewMgr->getViewModel();
3766 if ( !vm || !vm->inherits( "Plot2d_Viewer" ) )
3769 //Plot2d_Viewer* Plot2dVM = dynamic_cast<Plot2d_Viewer*>( vm );
3771 viewMgr->setViewModel( vm );
3772 Plot2d_ViewWindow* wnd = dynamic_cast<Plot2d_ViewWindow*>( viewMgr->getActiveView() );
3774 Plot2d_ViewFrame* frame = wnd->getViewFrame();
3775 frame->SetPreference();
3784 void LightApp_Application::loadPreferences()
3786 CAM_Application::loadPreferences();
3788 SUIT_ResourceMgr* aResMgr = resourceMgr();
3793 static bool mru_load = true;
3796 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3798 mru->setVisible( aResMgr->booleanValue( "MRU", "show_mru", false ) ); // do not show MRU menu item by default
3799 mru->setVisibleCount( aResMgr->integerValue( "MRU", "visible_count", 5 ) ); // 5 MRU items by default
3800 mru->setHistoryCount( aResMgr->integerValue( "MRU", "max_count", -1 ) ); // unlimited history by default
3801 mru->setInsertMode( aResMgr->integerValue( "MRU", "insert_mode", 0 ) ); // QtxMRUAction::MoveFirst by default
3802 mru->setLinkType( aResMgr->integerValue( "MRU", "link_type", 0 ) ); // QtxMRUAction::LinkAuto by default
3803 mru->setClearPossible( aResMgr->booleanValue( "MRU", "show_clear", false ) ); // do not show "Clear" item by default
3804 mru->loadLinks( aResMgr, "MRU" );
3810 QStringList mods = aResMgr->parameters( "windows_visibility" );
3811 for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr )
3814 if ( aResMgr->value( "windows_visibility", *itr, arr ) )
3815 myWinVis.insert( *itr, arr );
3819 desktop()->retrieveGeometry( aResMgr->stringValue( "desktop", "geometry" ) );
3820 bool opaqueResize = aResMgr->booleanValue( "desktop", "opaque_resize", false );
3821 // QMainWindow::DockOptions dopts = desktop()->dockOptions();
3822 // if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
3823 // else dopts &= ~QMainWindow::AnimatedDocks;
3824 // desktop()->setDockOptions( dopts );
3825 desktop()->setOpaqueResize( opaqueResize );
3826 if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
3827 dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
3834 void LightApp_Application::savePreferences()
3836 CAM_Application::savePreferences();
3838 saveDockWindowsState();
3840 SUIT_ResourceMgr* aResMgr = resourceMgr();
3845 QtxMRUAction* mru = ::qobject_cast<QtxMRUAction*>( action( MRUId ) );
3847 mru->saveLinks( aResMgr, "MRU" );
3849 for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr )
3850 aResMgr->setValue( "windows_visibility", itr.key(), itr.value() );
3853 aResMgr->setValue( "desktop", "geometry", desktop()->storeGeometry() );
3855 #if GUI_DEVELOPMENT > 0
3856 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR)+"dev" );
3858 aResMgr->setValue( "salome", "version", QString(GUI_VERSION_STR) );
3865 Updates desktop title
3867 void LightApp_Application::updateDesktopTitle()
3869 QString aTitle = applicationName();
3870 QString aVer = applicationVersion();
3871 if ( !aVer.isEmpty() )
3872 aTitle += QString( " " ) + aVer;
3874 if ( activeStudy() ) {
3875 QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false );
3876 aTitle += QString( " - [%1]" ).arg( sName );
3879 desktop()->setWindowTitle( aTitle );
3883 \brief Get map of the operations which can be performed
3884 on the module activation.
3886 The method should return the map of the kind \c {<id>:<name>}
3887 where \c <id> is an integer identifier of the operation and
3888 \c <name> is a title for the button to be added to the
3889 dialog box. After user selects the required operation by the
3890 clicking the corresponding button in the dialog box, its identifier
3891 is passed to the moduleActionSelected() method to process
3894 \return map of the operations
3895 \sa moduleActionSelected()
3897 QMap<int, QString> LightApp_Application::activateModuleActions() const
3899 QMap<int, QString> opmap;
3900 opmap.insert( NewStudyId, tr( "ACTIVATE_MODULE_OP_NEW" ) );
3901 opmap.insert( OpenStudyId, tr( "ACTIVATE_MODULE_OP_OPEN" ) );
3906 \brief Called when the used selectes required operation chosen
3907 from "Activate module" dialog box.
3909 Performs the required operation according to the user choice.
3911 \param id operation identifier
3912 \sa activateModuleActions()
3914 void LightApp_Application::moduleActionSelected( const int id )
3929 Updates windows after close document
3931 void LightApp_Application::afterCloseDoc()
3935 CAM_Application::afterCloseDoc();
3939 Updates actions of active module
3941 void LightApp_Application::updateModuleActions()
3944 if ( activeModule() )
3945 modName = activeModule()->moduleName();
3947 LightApp_ModuleAction* moduleAction =
3948 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3950 moduleAction->setActiveModule( modName );
3953 void LightApp_Application::removeModuleAction( const QString& modName )
3955 LightApp_ModuleAction* moduleAction =
3956 qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
3958 moduleAction->removeModule( modName );
3961 bool LightApp_Application::checkModule( const QString& title )
3963 if ( title.isEmpty() )
3966 QString library = moduleLibrary( title, true );
3967 if ( library.isEmpty() )
3970 QString name = moduleName( title );
3972 bool isPyModule = library.contains( "SalomePyQtGUI" ) || library.contains( "SalomePyQtGUILight" );
3976 paths = QString( Qtx::getenv( "PATH" ) ).split( ";", QString::SkipEmptyParts );
3977 #elif defined(__APPLE__)
3978 paths = QString( Qtx::getenv( "DYLD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3980 paths = QString( Qtx::getenv( "LD_LIBRARY_PATH" ) ).split( ":", QString::SkipEmptyParts );
3983 bool isFound = false;
3984 QStringList::const_iterator it;
3985 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
3987 isFound = QFileInfo( Qtx::addSlash( *it ) + library ).exists();
3993 "****************************************************************" << std::endl <<
3994 " Warning: library " << qPrintable( library ) << " is not found!" << std::endl <<
3995 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
3996 "****************************************************************" << std::endl);
4002 QString pyModule = QString( "%1GUI.py" ).arg( name );
4004 paths = QString( Qtx::getenv( "PYTHONPATH" ) ).split( ";", QString::SkipEmptyParts );
4006 paths = QString( Qtx::getenv( "PYTHONPATH" ) ).split( ":", QString::SkipEmptyParts );
4009 for ( it = paths.begin(); it != paths.end() && !isFound; ++it )
4011 isFound = QFileInfo( Qtx::addSlash( *it ) + pyModule ).exists();
4017 "****************************************************************" << std::endl <<
4018 " Warning: Python module " << qPrintable( pyModule ) << " is not found!" << std::endl <<
4019 " Module " << qPrintable( title ) << " will not be available in GUI mode!" << std::endl <<
4020 "****************************************************************" << std::endl);
4029 Gets current windows.
4030 \param winMap - output current windows map.
4032 void LightApp_Application::currentWindows( QMap<int, int>& winMap ) const
4035 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
4036 ((LightApp_Module*)activeModule())->windows( winMap );
4038 defaultWindows( winMap );
4042 Gets current view managers.
4043 \param lst - output current view managers list.
4045 void LightApp_Application::currentViewManagers( QStringList& lst ) const
4048 if ( !activeStudy() )
4051 if ( activeModule() && activeModule()->inherits( "LightApp_Module" ) )
4052 ((LightApp_Module*)activeModule())->viewManagers( lst );
4054 defaultViewManagers( lst );
4060 void LightApp_Application::updateWindows()
4062 QMap<int, int> winMap;
4063 currentWindows( winMap );
4065 for ( QMap<int, int>::ConstIterator it = winMap.begin(); it != winMap.end(); ++it )
4067 if ( !dockWindow( it.key() ) )
4068 getWindow( it.key() );
4071 for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
4073 QWidget* wid = it.value();
4074 if ( winMap.contains( it.key() ) )
4075 wid->setVisible( true );
4080 loadDockWindowsState();
4084 Updates view managers
4086 void LightApp_Application::updateViewManagers()
4089 currentViewManagers( lst );
4091 for ( QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it )
4092 getViewManager( *it, true );
4096 Loads windows geometry
4098 void LightApp_Application::loadDockWindowsState()
4102 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4103 bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true );
4104 bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true );
4107 if ( activeModule() )
4108 modName = activeModule()->name();
4109 else if ( activeStudy() )
4110 modName = "nomodule";
4112 QtxResourceMgr::WorkingMode prevMode = aResMgr->setWorkingMode( QtxResourceMgr::IgnoreUserValues );
4113 QByteArray aDefaultState;
4114 aResMgr->value( "windows_geometry", modName, aDefaultState );
4115 QByteArray aDefaultVisibility;
4116 aResMgr->value( "windows_visibility", modName, aDefaultVisibility );
4117 bool hasDefaultVisibility = !aDefaultVisibility.isEmpty();
4118 aResMgr->setWorkingMode( prevMode );
4120 if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility)
4123 if ( aResMgr->hasValue("windows_geometry" ,modName ) ) {
4124 long version = Qtx::versionToId( aResMgr->stringValue( "windows_geometry_version", modName, "" ) );
4126 if ( version > Qtx::versionToId( "7.4.1" ) )
4127 aResMgr->value( "windows_geometry", modName , arr );
4129 arr = aDefaultState;
4130 QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState);
4131 desktop()->restoreState( aTargetArray );
4134 QStringList mainToolbarsNames;
4135 mainToolbarsNames << "SalomeStandard" << "SalomeModules";
4136 QList<QToolBar*> mainToolbars = findToolBars( mainToolbarsNames );
4137 foreach( QToolBar* tb, mainToolbars ) tb->setVisible( true );
4139 if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty())
4142 QMap<QString, bool> *tbMap = 0;
4143 QMap<QString, bool> *dwMap = 0;
4145 QMap<QString, bool> userTbMap, userDwMap;
4146 dockWindowsState( myWinVis[modName], userTbMap, userDwMap );
4148 QMap<QString, bool> defaultTbMap, defaultDwMap;
4149 if(hasDefaultVisibility) {
4150 dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap);
4156 if(hasDefaultVisibility){
4157 tbMap = &defaultTbMap;
4164 if(hasDefaultVisibility){
4165 dwMap = &defaultDwMap;
4170 QList<QToolBar*> tbList = findToolBars();
4171 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
4173 QToolBar* tb = *tit;
4174 if ( tbMap->contains( tb->objectName() ) ) {
4175 tb->setVisible( (*tbMap)[tb->objectName()] );
4181 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4182 for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
4184 QDockWidget* dw = *dit;
4186 QObject* po = Qtx::findParent( dw, "QMainWindow" );
4187 if ( po != desktop() )
4190 if ( dwMap->contains( dw->objectName() ) )
4191 dw->setVisible( (*dwMap)[dw->objectName()] );
4199 Saves windows geometry
4201 void LightApp_Application::saveDockWindowsState()
4206 bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true );
4207 bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true );
4209 if( !storeWin && !storeTb )
4213 if ( activeModule() )
4214 modName = activeModule()->name();
4215 else if ( activeStudy() )
4216 modName = "nomodule";
4218 QString versionId = GUI_VERSION_STR;
4219 #if GUI_DEVELOPMENT > 0
4223 QByteArray arr = desktop()->saveState();
4224 resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) );
4225 resourceMgr()->setValue( "windows_geometry_version", modName, versionId );
4228 if ( myWinVis.contains( modName ) )
4229 visArr = myWinVis[modName];
4231 QMap<QString, bool> tbMap, dwMap;
4232 dockWindowsState( visArr, tbMap, dwMap );
4234 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4235 for ( QList<QToolBar*>::iterator it = tbList.begin(); it != tbList.end(); ++it )
4238 tbMap.insert( tb->objectName(), tb->toggleViewAction()->isChecked() );
4241 QList<QDockWidget*> dwList = desktop()->findChildren<QDockWidget*>();
4242 for ( QList<QDockWidget*>::iterator it = dwList.begin(); it != dwList.end(); ++it )
4244 QDockWidget* wid = *it;
4245 dwMap.insert( wid->objectName(), wid->toggleViewAction()->isChecked() );
4248 visArr = dockWindowsState( tbMap, dwMap );
4250 myWinVis.insert( modName, visArr );
4253 QByteArray LightApp_Application::dockWindowsState( const QMap<QString, bool>& tb, const QMap<QString, bool>& dw ) const
4256 QDataStream stream( &visArr, QIODevice::WriteOnly );
4258 stream << (uchar)ToolBarMarker;
4259 stream << tb.size();
4260 for ( QMap<QString, bool>::const_iterator tit = tb.begin(); tit != tb.end(); ++tit )
4262 stream << tit.key();
4263 stream << (uchar)( tit.value() ? 1 : 0 );
4266 stream << (uchar)DockWidgetMarker;
4267 stream << dw.size();
4268 for ( QMap<QString, bool>::const_iterator wit = dw.begin(); wit != dw.end(); ++wit )
4270 stream << wit.key();
4271 stream << (uchar)( wit.value() ? 1 : 0 );
4277 void LightApp_Application::dockWindowsState( const QByteArray& arr, QMap<QString, bool>& tb, QMap<QString, bool>& dw ) const
4282 QByteArray visArr = arr;
4283 QDataStream stream( &visArr, QIODevice::ReadOnly );
4287 if ( marker != ToolBarMarker )
4292 for ( int i = 0; i < lines; ++i )
4295 stream >> objectName;
4298 tb.insert( objectName, shown );
4302 if ( marker != DockWidgetMarker )
4306 for ( int j = 0; j < lines; ++j )
4309 stream >> objectName;
4312 dw.insert( objectName, shown );
4317 Adds icon names for modules
4319 void LightApp_Application::moduleIconNames( QMap<QString, QString>& iconMap ) const
4323 SUIT_ResourceMgr* resMgr = resourceMgr();
4327 QStringList modList;
4328 modules( modList, false );
4330 for ( QStringList::const_iterator it = modList.begin(); it != modList.end(); ++it )
4332 QString modName = *it;
4333 QString modIntr = moduleName( modName );
4334 QString modIcon = resMgr->stringValue( modIntr, "icon", QString() );
4336 if ( modIcon.isEmpty() )
4339 if ( SUIT_Tools::extension( modIcon ).isEmpty() )
4340 modIcon += QString( ".png" );
4342 iconMap.insert( modName, modIcon );
4347 Inserts items in popup, which necessary for current application
4349 void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopup, QString& title )
4352 LightApp_SelectionMgr* selMgr = LightApp_Application::selectionMgr();
4353 bool cacheIsOn = selMgr->isSelectionCacheEnabled();
4354 selMgr->setSelectionCacheEnabled( true );
4356 SUIT_DataBrowser* ob = objectBrowser();
4358 CAM_Application::contextMenuPopup( type, thePopup, title );
4360 if ( ob && type == ob->popupClientType() ) {
4361 thePopup->addSeparator();
4362 QAction* a = thePopup->addAction( tr( "MEN_REFRESH" ), this, SLOT( onRefresh() ) );
4363 if ( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) )
4364 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) );
4367 #ifndef DISABLE_SALOMEOBJECT
4368 if ( selMgr && ob ) {
4369 SALOME_ListIO selected;
4370 selMgr->selectedObjects( selected );
4371 if(selected.Extent() == 1){
4372 Handle(SALOME_InteractiveObject) anIObject = selected.First();
4373 SUIT_DataObject* obj = findObject(anIObject->getEntry());
4374 if(obj && obj->renameAllowed()) {
4375 QAction* a = new QAction(tr("MEN_RENAME_OBJ"), thePopup);
4376 connect( a, SIGNAL( triggered(bool) ), ob, SLOT( onStartEditing() ) );
4377 if ( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) )
4378 a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::RenameShortcut) );
4380 QList<QAction*> acts = thePopup->actions();
4381 QAction* firstAction = acts.count() > 0 ? acts.first() : 0;
4382 thePopup->insertAction(firstAction,a);
4388 selMgr->setSelectionCacheEnabled( cacheIsOn );
4394 void LightApp_Application::createEmptyStudy()
4396 CAM_Application::createEmptyStudy();
4398 if ( objectBrowser() )
4399 objectBrowser()->updateTree();
4401 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
4402 if ( aResMgr && activeStudy() ) {
4403 int autoSaveInterval = aResMgr->integerValue( "Study", "auto_save_interval", 0 );
4404 if ( autoSaveInterval > 0 ) myAutoSaveTimer->start( autoSaveInterval*60000 );
4409 void LightApp_Application::setDesktop( SUIT_Desktop* desk )
4411 CAM_Application::setDesktop( desk );
4414 connect( desk, SIGNAL( message( const QString& ) ),
4415 this, SLOT( onDesktopMessage( const QString& ) ), Qt::UniqueConnection );
4416 connect( desk, SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
4417 this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
4418 /* connect( desk, SIGNAL( windowMoved( SUIT_ViewWindow* ) ),
4419 this, SLOT( onWindowMoved( SUIT_ViewWindow* ) ), Qt::UniqueConnection ); */
4425 \param mod - module to be activated
4427 bool LightApp_Application::activateModule( CAM_Module* mod )
4429 bool res = CAM_Application::activateModule( mod );
4431 if ( objectBrowser() )
4432 objectBrowser()->updateTree();
4438 \return keyborad accelerators manager object
4440 SUIT_Accel* LightApp_Application::accel() const
4446 Removes dead widget container from map
4448 void LightApp_Application::onWCDestroyed( QObject* ob )
4450 // remove destroyed widget container from windows map
4451 for ( WinMap::ConstIterator itr = myWin.begin(); itr != myWin.end(); ++itr )
4453 if ( itr.value() != ob )
4456 int key = itr.key();
4457 myWin.remove( key );
4462 void LightApp_Application::onMRUActivated( const QString& name )
4464 SUIT_Session* s = SUIT_Session::session();
4465 if ( s && s->activeApplication() == this )
4469 void LightApp_Application::onStylePreferences()
4471 #ifdef USE_SALOME_STYLE
4472 Style_PrefDlg dlg( desktop() );
4475 resourceMgr()->setValue( "Style", "use_salome_style", Style_Salome::isActive() );
4476 #endif // USE_SALOME_STYLE
4479 void LightApp_Application::onFullScreen(){
4480 if(myScreenHelper) {
4481 if(desktop()->isFullScreen())
4482 myScreenHelper->switchToNormalScreen();
4484 myScreenHelper->switchToFullScreen();
4489 Connects just added view manager
4491 void LightApp_Application::addViewManager( SUIT_ViewManager* vm )
4493 connect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4494 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4495 CAM_Application::addViewManager( vm );
4499 Remove view manager from memory
4501 void LightApp_Application::removeViewManager( SUIT_ViewManager* vm )
4503 disconnect( vm, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
4504 this, SLOT( onCloseView( SUIT_ViewManager* ) ) );
4505 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
4507 aStudy->removeObjectProperties( vm->getGlobalId() );
4509 CAM_Application::removeViewManager( vm );
4511 LightApp_SelectionMgr* selMgr = selectionMgr();
4512 QList<SUIT_Selector*> selectors;
4513 selMgr->selectors( selectors );
4514 foreach( SUIT_Selector* selector, selectors ) {
4515 if ( selector->owner() == vm->getViewModel() ) {
4520 // IPAL22894: Crash on closing OCC view
4526 Renames active window of desktop
4528 void LightApp_Application::onRenameWindow()
4533 QWidget* w = desktop()->activeWindow();
4538 QString name = QInputDialog::getText( w, tr( "TOT_RENAME" ), tr( "PRP_RENAME" ), QLineEdit::Normal, w->windowTitle(), &ok );
4539 if( ok && !name.isEmpty() )
4540 w->setWindowTitle( name );
4544 Closes active window of desktop
4546 void LightApp_Application::onCloseWindow()
4551 QWidget* w = desktop()->activeWindow();
4559 Closes all windows of desktop
4561 void LightApp_Application::onCloseAllWindow()
4563 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4567 QList<SUIT_ViewWindow*> wndList = desk->windows();
4568 SUIT_ViewWindow* wnd;
4569 foreach( wnd, wndList )
4577 Groups all windows of desktop
4579 void LightApp_Application::onGroupAllWindow()
4581 STD_TabDesktop* desk = dynamic_cast<STD_TabDesktop*>( desktop() );
4585 QtxWorkstack* wgStack = desk->workstack();
4591 \return default name for an active study
4593 void LightApp_Application::setDefaultStudyName( const QString& theName )
4595 QStringList anInfoList;
4596 modules( anInfoList, false );
4598 LightApp_Study* aStudy = (LightApp_Study*)activeStudy();
4599 if( anInfoList.count() == 1 && // to avoid a conflict between different modules
4600 !aStudy->isSaved() )
4602 aStudy->setStudyName( theName );
4603 updateDesktopTitle();
4608 Custom event handler
4610 bool LightApp_Application::event( QEvent* e )
4612 if( e && e->type()==2000 )
4614 SALOME_CustomEvent* ce = ( SALOME_CustomEvent* )e;
4615 QString* d = ( QString* )ce->data();
4616 if( SUIT_MessageBox::question(0, tr("WRN_WARNING"),
4618 SUIT_MessageBox::Yes | SUIT_MessageBox::No,
4619 SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes )
4622 path << tr( "PREF_CATEGORY_SALOME" ) << tr( "PREF_TAB_GENERAL" )
4623 << tr( "PREF_GROUP_EXT_BROWSER" ) << tr( "PREF_APP" );
4624 showPreferences( path );
4630 return CAM_Application::event( e );
4633 /*! Check data object */
4634 bool LightApp_Application::checkDataObject(LightApp_DataObject* theObj)
4638 bool isSuitable = !theObj->entry().isEmpty() &&
4639 !theObj->componentDataType().isEmpty() &&
4640 !theObj->name().isEmpty();
4647 int LightApp_Application::openChoice( const QString& aName )
4649 int choice = CAM_Application::openChoice( aName );
4651 if ( choice == OpenExist ) // The document is already open.
4653 // Do you want to reload it?
4654 if ( SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYOPEN" ).arg( aName ),
4655 SUIT_MessageBox::Yes | SUIT_MessageBox::No, SUIT_MessageBox::No ) == SUIT_MessageBox::Yes )
4656 choice = OpenReload;
4662 bool LightApp_Application::openAction( const int choice, const QString& aName )
4669 STD_Application* app = 0;
4670 SUIT_Session* session = SUIT_Session::session();
4671 QList<SUIT_Application*> appList = session->applications();
4672 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !app; ++it )
4674 if ( (*it)->activeStudy() && (*it)->activeStudy()->studyName() == aName )
4675 app = ::qobject_cast<STD_Application*>( *it );
4680 app->onCloseDoc( false );
4681 appList = session->applications();
4682 STD_Application* other = 0;
4683 for ( QList<SUIT_Application*>::iterator it = appList.begin(); it != appList.end() && !other; ++it )
4684 other = ::qobject_cast<STD_Application*>( *it );
4687 res = other->onOpenDoc( aName );
4692 res = CAM_Application::openAction( choice, aName );
4699 QStringList LightApp_Application::viewManagersTypes() const
4701 QStringList aTypesList;
4702 aTypesList += myUserWmTypes;
4703 #ifndef DISABLE_GLVIEWER
4704 aTypesList<<GLViewer_Viewer::Type();
4706 #ifndef DISABLE_PLOT2DVIEWER
4707 aTypesList<<Plot2d_Viewer::Type();
4709 #ifndef DISABLE_QXGRAPHVIEWER
4710 aTypesList<<QxScene_Viewer::Type();
4712 #ifndef DISABLE_PVVIEWER
4713 aTypesList<<PVViewer_Viewer::Type();
4715 #ifndef DISABLE_PYVIEWER
4716 aTypesList<<PyViewer_Viewer::Type();
4718 #ifndef DISABLE_OCCVIEWER
4719 aTypesList<<OCCViewer_Viewer::Type();
4721 #ifndef DISABLE_VTKVIEWER
4722 #ifndef DISABLE_SALOMEOBJECT
4723 aTypesList<<SVTK_Viewer::Type();
4725 aTypesList<<VTKViewer_Viewer::Type();
4731 * Removes all view managers of known types
4732 * Other view managers are ignored
4734 void LightApp_Application::clearKnownViewManagers()
4736 QStringList aTypesList = viewManagersTypes();
4737 QList<SUIT_ViewManager*> aMgrList;
4738 viewManagers( aMgrList );
4739 foreach (SUIT_ViewManager* aMgr, aMgrList) {
4740 if (aTypesList.contains(aMgr->getType()))
4741 removeViewManager(aMgr);
4746 Copy of current selection
4748 void LightApp_Application::onCopy()
4750 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4756 Paste of current data in clipboard
4758 void LightApp_Application::onPaste()
4760 LightApp_Module* m = dynamic_cast<LightApp_Module*>( activeModule() );
4766 Browse (i.e. set focus on) the published objects
4767 \param theIsApplyAndClose - flag indicating that the dialog for creating objects
4768 has been accepted by Ok (or Apply & Close) button
4769 \param theIsOptimizedBrowsing - flag switching to optimized browsing mode
4770 (to select the first published object only)
4771 \return entry of the selected object
4773 QString LightApp_Application::browseObjects( const QStringList& theEntryList,
4774 const bool theIsApplyAndClose,
4775 const bool theIsOptimizedBrowsing )
4778 if( SUIT_ResourceMgr* aResourceMgr = resourceMgr() )
4780 int aBrowsePolicy = aResourceMgr->integerValue( "ObjectBrowser", "browse_published_object", (int)BP_Never );
4781 switch( aBrowsePolicy )
4785 case BP_ApplyAndClose:
4786 if( !theIsApplyAndClose )
4794 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
4798 SUIT_DataBrowser* anOB = objectBrowser();
4802 SUIT_AbstractModel* aModel = dynamic_cast<SUIT_AbstractModel*>( anOB->model() );
4806 QStringListIterator anIter( theEntryList );
4807 if( theIsOptimizedBrowsing )
4809 // go to the last entry
4811 if( anIter.hasPrevious() )
4815 // scroll to each entry in the list
4816 // (in optimized mode - to the last entry only)
4818 LightApp_DataObject* anObject = 0;
4819 while( anIter.hasNext() )
4821 anEntry = anIter.next();
4822 if( !anEntry.isEmpty() )
4824 anObject = aStudy->findObjectByEntry( anEntry );
4827 QModelIndex anIndex = aModel->index( anObject );
4828 anOB->treeView()->scrollTo( anIndex );
4833 // always select the last object
4834 if( anObject && !anEntry.isEmpty() )
4836 QList<SUIT_Selector*> aSelectorList;
4837 selectionMgr()->selectors( "ObjectBrowser", aSelectorList );
4838 if( !aSelectorList.isEmpty() )
4840 if( LightApp_OBSelector* aSelector = dynamic_cast<LightApp_OBSelector*>( aSelectorList.first() ) )
4842 bool anIsAutoBlock = aSelector->autoBlock();
4844 // temporarily disable auto block, to emit LightApp_SelectionMgr::currentSelectionChanged() signal
4845 aSelector->setAutoBlock( false );
4847 SUIT_DataOwnerPtrList aList;
4848 #ifndef DISABLE_SALOMEOBJECT
4849 Handle(SALOME_InteractiveObject) aSObj = new SALOME_InteractiveObject
4850 ( anObject->entry().toUtf8().constData(),
4851 anObject->componentDataType().toLatin1().constData(),
4852 anObject->name().toUtf8().constData() );
4853 LightApp_DataOwner* owner = new LightApp_DataOwner( aSObj );
4855 LightApp_DataOwner* owner = new LightApp_DataOwner( anEntry );
4858 aList.append( owner );
4859 selectionMgr()->setSelected( aList );
4862 // restore auto block flag
4863 aSelector->setAutoBlock( anIsAutoBlock );
4871 SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
4873 LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
4874 return study ? study->findObjectByEntry( id ) : 0;
4878 Checks that an object can be renamed.
4879 \param entry entry of the object
4880 \brief Return \c true if object can be renamed
4882 bool LightApp_Application::renameAllowed( const QString& /*entry*/) const {
4887 Rename object by entry.
4888 \param entry entry of the object
4889 \param name new name of the object
4890 \brief Return \c true if rename operation finished successfully, \c false otherwise.
4892 bool LightApp_Application::renameObject( const QString& entry, const QString& ) {
4896 /*! Process standard messages from desktop */
4897 void LightApp_Application::onDesktopMessage( const QString& message )
4899 const QString sectionSeparator = "/";
4901 if ( message.toLower() == "updateobjectbrowser" ||
4902 message.toLower() == "updateobjbrowser" ) {
4903 // update object browser
4904 updateObjectBrowser();
4906 else if ( message.toLower().startsWith( "activate_viewer" ) ) {
4907 QString vtype = message.split( sectionSeparator ).last();
4908 if ( !vtype.isEmpty() )
4909 getViewManager( vtype, true );
4912 QStringList data = message.split( sectionSeparator );
4913 if ( data.count() > 1 ) {
4914 QString msgType = data[0].trimmed();
4915 LightApp_Module* sMod = 0;
4916 CAM_Module* mod = module( msgType );
4918 mod = module( moduleTitle( msgType ) );
4919 if ( mod && mod->inherits( "LightApp_Module" ) )
4920 sMod = (LightApp_Module*)mod;
4922 if ( msgType.toLower() == "preferences" ) {
4923 // requested preferences change: should be given as "preferences/<section>/<name>/<value>"
4924 // for example "preferences/Study/multi_file_dump/true"
4925 if ( data.count() > 3 ) {
4926 QString section = data[1].trimmed();
4927 QString param = data[2].trimmed();
4928 QString value = QStringList( data.mid(3) ).join( sectionSeparator );
4929 resourceMgr()->setValue( section, param, value );
4933 // received message for the module
4934 QString msg = QStringList( data.mid(1) ).join( sectionSeparator );
4935 sMod->message( msg );
4943 Returns all top level toolbars.
4944 Note : Result list contains only main window toolbars, not including toolbars from viewers.
4946 QList<QToolBar*> LightApp_Application::findToolBars( const QStringList& names )
4948 QList<QToolBar*> aResult;
4949 QList<QToolBar*> tbList = desktop()->findChildren<QToolBar*>();
4950 for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) {
4951 QToolBar* tb = *tit;
4952 QObject* po = Qtx::findParent( tb, "QMainWindow" );
4953 if ( po != desktop() )
4955 if ( names.isEmpty() || names.contains( tb->objectName() ) )
4962 Internal method to parse toolbars and dockable windows state.
4964 QByteArray LightApp_Application::processState(QByteArray& input,
4965 const bool processWin,
4966 const bool processTb,
4967 const bool isRestoring,
4968 QByteArray defaultState) {
4971 bool hasDefaultState = !defaultState.isEmpty();
4972 bool isDockWinWriten = false;
4974 //Write date from users settings
4976 QDataStream tmpInputData(&input, QIODevice::ReadOnly);
4977 int marker, version;
4979 tmpInputData >> marker;
4980 tmpInputData >> version;
4981 tmpInputData >> dockmarker;
4982 tmpInputData >> nbDocWin;
4984 if(processWin && processTb && !isRestoring) {
4986 } else if(!processWin && !processTb ) {
4988 aRes = defaultState;
4990 QDataStream aData(&aRes, QIODevice::WriteOnly);
4991 QList<QToolBar*> aToolBars = findToolBars();
4994 for ( QList<QToolBar*>::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) {
4995 QToolBar* tb = *tit;
4996 aNames.append(tb->objectName());
4999 int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames);
5000 if(toolBarMarkerIndex < 0)
5002 QDataStream anInputData(&input, QIODevice::ReadOnly);
5004 int toolBarMarkerIndexDef;
5005 if(hasDefaultState) {
5006 toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames);
5007 if(toolBarMarkerIndexDef < 0)
5010 QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly);
5012 QDataStream* aTargetData = 0;
5013 int aTargetIndex = -1;
5015 QByteArray currentArr = desktop()->saveState();
5016 QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly);
5017 bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0);
5018 if(processWin && useInputData) {
5019 aTargetData = &anInputData;
5020 aTargetIndex = toolBarMarkerIndex;
5022 //Write date from default settings
5023 if(hasDefaultState) {
5024 aTargetData = &anInputDataDef;
5025 aTargetIndex = toolBarMarkerIndexDef;
5027 //If no default state, write current snapshot of the dockable windows
5029 aTargetData = &anInputDataCur;
5030 int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames);
5031 aTargetIndex = toolBarMarkerIndexCur;
5036 if(aTargetData && aTargetIndex >= 0 ) {
5037 aTargetData->device()->seek(0);
5038 while( aTargetData->device()->pos() < aTargetIndex ) {
5043 isDockWinWriten = true;
5050 aTargetData = &anInputData;
5051 aTargetIndex = toolBarMarkerIndex;
5053 if(hasDefaultState) {
5054 aTargetData = &anInputDataDef;
5055 aTargetIndex = toolBarMarkerIndexDef;
5059 if(aTargetData && aTargetIndex >= 0) {
5061 if(!isDockWinWriten ) {
5062 //Write version marker
5063 int marker, version;
5064 aTargetData->device()->seek(0);
5065 *aTargetData >> marker;
5066 *aTargetData >> version;
5069 aData << (uchar) QDockWidgetMarker;
5071 int shift = 4*sizeof(int) + sizeof(QSize);
5072 index = aTargetIndex - shift;
5074 index = aTargetIndex;
5077 aTargetData->device()->seek(index);
5078 while(!aTargetData->atEnd()) {
5083 } else { // Not treat toolbars
5084 aData << (uchar) QToolBarMarker;
5085 aData << (int) 0; //Nb toolbars = 0
5092 \brief Emits operationFinished signal.
5093 \param theModuleName the name of the module which perfomed the operation
5094 \param theOperationName the operation name
5095 \param theEntryList the list of the created objects entries
5097 void LightApp_Application::emitOperationFinished( const QString& theModuleName,
5098 const QString& theOperationName,
5099 const QStringList& theEntryList )
5101 emit operationFinished( theModuleName, theOperationName, theEntryList );
5105 Update visibility state of given objects
5107 void LightApp_Application::updateVisibilityState( DataObjectList& theList,
5108 SUIT_ViewModel* theViewModel )
5110 if ( !theViewModel || theList.isEmpty() ) return;
5112 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>(activeStudy());
5113 if ( !aStudy ) return;
5115 SALOME_View* aView = dynamic_cast<SALOME_View*>( theViewModel );
5117 for ( DataObjectList::iterator itr = theList.begin(); itr != theList.end(); ++itr ) {
5118 LightApp_DataObject* obj = dynamic_cast<LightApp_DataObject*>(*itr);
5120 if ( !obj || aStudy->isComponent( obj->entry() ) )
5123 LightApp_Module* anObjModule = dynamic_cast<LightApp_Module*>(obj->module());
5124 if ( anObjModule ) {
5125 LightApp_Displayer* aDisplayer = anObjModule->displayer();
5127 Qtx::VisibilityState anObjState = Qtx::UnpresentableState;
5128 if ( aDisplayer->canBeDisplayed( obj->entry(), theViewModel->getType() ) ) {
5129 if ( aView && aDisplayer->IsDisplayed( obj->entry(), aView ) )
5130 anObjState = Qtx::ShownState;
5132 anObjState = Qtx::HiddenState;
5134 aStudy->setVisibilityState( obj->entry(), anObjState );
5141 * Called when window activated
5143 void LightApp_Application::onWindowActivated( SUIT_ViewWindow* theViewWindow )
5145 SUIT_DataBrowser* anOB = objectBrowser();
5148 SUIT_DataObject* rootObj = anOB->root();
5152 DataObjectList listObj = rootObj->children( true );
5154 SUIT_ViewModel* vmod = 0;
5155 if ( SUIT_ViewManager* vman = theViewWindow->getViewManager() )
5156 vmod = vman->getViewModel();
5157 updateVisibilityState( listObj, vmod );
5161 Called then view manager removed
5163 void LightApp_Application::onViewManagerRemoved( SUIT_ViewManager* )
5165 ViewManagerList lst;
5166 viewManagers( lst );
5167 if ( lst.count() == 1) { // in case if closed last view window
5168 LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( activeStudy() );
5170 aStudy->setVisibilityStateForAll( Qtx::UnpresentableState );
5175 Check existing document.
5177 bool LightApp_Application::checkExistingDoc( bool closeExistingDoc )
5180 if( activeStudy() ) {
5181 int answer = !activeStudy()->isModified() ? 1 :
5182 SUIT_MessageBox::question( desktop(),
5183 tr( "APPCLOSE_CAPTION" ),
5184 tr( "STUDYCLOSE_DESCRIPTION" ),
5185 tr( "APPCLOSE_SAVE" ),
5186 tr( "APPCLOSE_CLOSE" ),
5187 tr( "APPCLOSE_CANCEL" ), 0 );
5189 if ( activeStudy()->isSaved() ) {
5191 if (closeExistingDoc) {
5194 } else if ( onSaveAsDoc() ) {
5195 if (closeExistingDoc) {
5196 if( !closeDoc( false ) ) {
5204 else if( answer == 1 ) {
5205 if (closeExistingDoc) {
5208 } else if( answer == 2 ) {
5215 #ifndef DISABLE_PYCONSOLE
5217 PyConsole_Interp* LightApp_Application::getPyInterp()
5219 static PyConsole_Interp* myInterp = 0;
5221 myInterp = createPyInterp();
5222 myInterp->initialize();
5227 PyConsole_Interp* LightApp_Application::createPyInterp()
5229 return new PyConsole_Interp();
5232 #endif // DISABLE_PYCONSOLE