1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "SalomeApp_VisualState.h"
25 #include "SalomeApp_Module.h"
26 #include "SalomeApp_Study.h"
27 #include "SalomeApp_Application.h"
29 #include <SUIT_Session.h>
30 #include <SUIT_ResourceMgr.h>
31 #include <SUIT_ViewManager.h>
32 #include <SUIT_ViewWindow.h>
33 #include <QtxWorkstack.h>
35 #include <STD_TabDesktop.h>
38 #include <QApplication>
41 #include <SALOMEDSClient_ClientFactory.hxx>//?
42 #include <SALOMEDSClient_IParameters.hxx>//?
51 SalomeApp_VisualState::SalomeApp_VisualState( SalomeApp_Application* app )
60 SalomeApp_VisualState::~SalomeApp_VisualState()
65 Sets names of all view windows in given list. This is used
66 in order to apply the same naming algorithm when saving and restoring
67 view windows. Names of view windows must be the same before saving
68 workstack (splitters) information, and before its restoring!
69 Naming rule: ViewerType_IndexOfViewerOfThisType_IndexOfViewInThisViewer
71 OCCViewer_0_0 OCCViewer_0_1 OCCViewer_0_2
74 void nameViewWindows( const ViewManagerList& lst )
76 QMap<QString, int> viewersCounter;
77 for ( QList<SUIT_ViewManager*>::const_iterator it = lst.begin(); it != lst.end(); ++it )
79 SUIT_ViewManager* aVM = *it;
83 int view_count = aVM->getViewsCount();
84 QString vType = aVM->getType();
86 continue; //No views is opened in the viewer
88 if ( !viewersCounter.contains( vType ) )
89 viewersCounter.insert( vType, 0 );
91 int& viewerID = viewersCounter[vType];
93 QVector<SUIT_ViewWindow*> views = aVM->getViews();
94 for ( int i = 0; i < view_count; i++ )
96 QString vName = QString( "%1_%2_%3" ).arg( vType ).arg( viewerID ).arg( i );
97 views[i]->setObjectName( vName );
104 Stores the visual parameters of the viewers
106 int SalomeApp_VisualState::storeState()
108 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
112 // unlock study if it is locked
113 bool aLocked = study->studyDS()->GetProperties()->IsLocked();
114 if (aLocked) study->studyDS()->GetProperties()->SetLocked(false);
117 std::vector<int> savePoints = study->getSavePoints();
118 //Calculate a new savePoint number = the last save point number + 1
119 if ( savePoints.size() > 0)
120 savePoint = savePoints[savePoints.size()-1] + 1;
122 _PTR(AttributeParameter) ap = study->studyDS()->GetCommonParameters( study->getVisualComponentName().toLatin1().constData(),
124 _PTR(IParameters) ip = ClientFactory::getIParameters( ap );
127 myApp->viewManagers( lst );
129 // setting unique names for view windows in order to save this view inside
130 // workstack's structure (see below). On restore the views with the same names will
131 // be placed to the same place inside the workstack's splitters.
132 nameViewWindows( lst );
134 // store active window's name
135 SUIT_ViewWindow* win = myApp->desktop()->activeWindow();
137 ip->setProperty("AP_ACTIVE_VIEW", win->objectName().toStdString() );
140 SUIT_ViewManager* vm = 0;
141 QListIterator<SUIT_ViewManager*> it( lst );
142 while ( it.hasNext() ) {
146 int view_count = vm->getViewsCount();
148 continue; //No views is opened in the viewer
150 std::string viewerEntry = QString( "%1_%2" ).arg( vm->getType() ).arg( ++viewerID ).toStdString();
151 ip->append("AP_VIEWERS_LIST", viewerEntry);
153 QVector<SUIT_ViewWindow*> views = vm->getViews();
154 for(int i = 0; i<view_count; i++) {
155 ip->append( viewerEntry, views[i]->windowTitle().toStdString() );
156 ip->append( viewerEntry, views[i]->getVisualParameters().toStdString() );
160 //Save information about split areas
161 if ( myApp->desktop()->inherits( "STD_TabDesktop" ) )
163 QString workstackInfo;
164 QtxWorkstack* workstack = ((STD_TabDesktop*)myApp->desktop())->workstack();
165 QByteArray geomState = workstack->saveState( 0 );
166 ip->setProperty( "AP_WORKSTACK_INFO", QString( geomState.toHex() ).toStdString() );
169 //Save a name of the active module
170 if ( CAM_Module* activeModule = myApp->activeModule() )
171 ip->setProperty( "AP_ACTIVE_MODULE", activeModule->moduleName().toStdString() );
173 //Store visual parameters of the modules
174 QList<CAM_Module*> mlist;
175 myApp->modules( mlist );
176 QListIterator<CAM_Module*> itM( mlist );
177 CAM_Module* module = 0;
178 SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
179 bool loadLight = aResMgr->booleanValue( "Study", "autoload_light_modules", true );
181 while ( itM.hasNext() ) {
183 if ( !module ) continue;
186 if ( LightApp_Module* lModule = dynamic_cast<LightApp_Module*>( module ) ) {
188 ip->append( "AP_MODULES_LIST", lModule->moduleName().toStdString() );
189 if ( SalomeApp_Module* sModule = dynamic_cast<SalomeApp_Module*>( module ) )
190 sModule->storeVisualParameters( savePoint );
194 // set default name of new savePoint
195 study->setNameOfSavePoint( savePoint, QObject::tr( "SAVE_POINT_DEF_NAME" ) + QString::number( savePoint ) );
197 if (aLocked) study->studyDS()->GetProperties()->SetLocked(true);
203 Restores the visual parameters of the viewers
205 void SalomeApp_VisualState::restoreState(int savePoint)
207 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
211 _PTR(AttributeParameter) ap = study->studyDS()->GetCommonParameters( study->getVisualComponentName().toLatin1().constData(),
213 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
215 qApp->installEventFilter( this );
217 //Remove all already existent veiwers and their views
218 //myApp->clearViewManagers();
219 myApp->clearKnownViewManagers();
221 //Restore the viewers and view windows
222 int nbViewers = ip->nbValues( "AP_VIEWERS_LIST" );
223 SUIT_ViewWindow* viewWin = 0;
225 // parameters of view windows are stored in a map for restoring after restoring of the workstack
226 QMap<SUIT_ViewWindow*, QString> viewersParameters;
228 for ( int i = 0; i < nbViewers; i++ )
230 std::string viewerEntry = ip->getValue( "AP_VIEWERS_LIST", i );
231 std::vector<std::string> veiewerParams = ip->parseValue(viewerEntry,'_');
232 std::string type = veiewerParams[0];
233 std::string viewerID = veiewerParams[1];
234 SUIT_ViewManager* vm = myApp->newViewManager( type.c_str() );
236 continue; //Unknown viewer
238 int nbViews = (ip->nbValues(viewerEntry))/2;
240 //Create nbViews-1 view (-1 because 1 view is created by createViewManager)
241 for ( int i = 1; i< nbViews; i++ )
243 SUIT_ViewWindow* aView = vm->createViewWindow();
247 int viewCount = vm->getViewsCount();
248 if ( viewCount != nbViews )
250 printf( "\nRestore visual state: Unknow error, Can't create a view!\n" );
254 //Resize the views, set their captions and apply visual parameters.
255 QVector<SUIT_ViewWindow*> views = vm->getViews();
256 for ( int i = 0, j = 0; i<viewCount; i++, j+=2 )
262 // wait untill the window is really shown. This step fixes MANY bugs..
263 // while ( !vm->isVisible() )
264 // qApp->processEvents();
266 viewWin->setWindowTitle( ip->getValue( viewerEntry, j ).c_str() );
268 // printf ( "VP for viewWin \"%s\": %s\n", viewerEntry.c_str(), ip->getValue(viewerEntry, j+1).c_str() );
269 viewersParameters[ viewWin ] = ip->getValue( viewerEntry, j + 1 ).c_str();
270 //viewWin->setVisualParameters(ip->getValue(viewerEntry, j+1).c_str());
274 qApp->processEvents( QEventLoop::ExcludeUserInputEvents, 5000 );
276 // restore modules' visual parameters
277 std::vector<std::string> v = ip->getValues( "AP_MODULES_LIST" );
278 for ( int i = 0; i < v.size(); i++ )
280 myApp->activateModule( v[i].c_str() );
281 if ( SalomeApp_Module* module = dynamic_cast<SalomeApp_Module*>( myApp->activeModule() ) )
282 module->restoreVisualParameters( savePoint );
285 // new view windows may have been created in module->restoreVisualParameters() [GAUSS]
286 // so here we store their visual parameters for later restoring..
287 QList<SUIT_ViewManager*> lst;
288 myApp->viewManagers( lst );
289 for ( QList<SUIT_ViewManager*>::iterator itVM = lst.begin(); itVM != lst.end(); ++itVM )
291 SUIT_ViewManager* aVM = *itVM;
295 int view_count = aVM->getViewsCount();
296 QVector<SUIT_ViewWindow*> views = aVM->getViews();
297 for ( int i = 0; i < view_count; i++ )
299 if ( !viewersParameters.contains( views[i] ) )
301 viewersParameters[ views[i] ] = views[i]->getVisualParameters();
302 // printf ( "store VP for viewWin \"%s\": %s\n", views[i]->name(), views[i]->getVisualParameters().toLatin1().constData() );
307 // activate module that was active on save
308 QString activeModuleName( ip->getProperty("AP_ACTIVE_MODULE" ).c_str() );
309 if ( !activeModuleName.isEmpty() )
310 myApp->activateModule( activeModuleName );
312 // setting unique names for view windows in order to restore positions of view windows inside
313 // workstack's structure (see below). During save the same naming algorithm was used,
314 // so the same views will get the same names.
315 nameViewWindows( lst );
317 qApp->processEvents( QEventLoop::ExcludeUserInputEvents, 5000 );
319 // restore workstack parameters. should be done after module's restoreVisualParameters(), because
320 // some modules can create their own viewers (like VISU creates GaussViewers)
321 if ( myApp->desktop()->inherits( "STD_TabDesktop" ) )
323 QtxWorkstack* workstack = ((STD_TabDesktop*)myApp->desktop())->workstack();
324 workstack->restoreState( QByteArray::fromHex( QByteArray( ip->getProperty( "AP_WORKSTACK_INFO" ).c_str() ) ), 0 );
327 // restore visual parameters of view windows. it must be done AFTER restoring workstack.
328 // also set active view
329 std::string activeViewName = ip->getProperty("AP_ACTIVE_VIEW");
330 QMap<SUIT_ViewWindow*, QString>::Iterator mapIt;
331 for ( mapIt = viewersParameters.begin(); mapIt != viewersParameters.end(); ++mapIt ) {
332 mapIt.key()->setVisualParameters( mapIt.value() );
333 if ( activeViewName == mapIt.key()->objectName().toStdString() )
334 mapIt.key()->setFocus();
337 qApp->removeEventFilter( this );
339 // for ( it.toFirst(); it.current(); ++it ) {
340 // int view_count = it.current()->getViewsCount();
341 // QPtrVector<SUIT_ViewWindow> views = it.current()->getViews();
342 // for ( int i = 0; i < view_count; i++ )
343 // views[i]->setVisualParameters( viewersParameters[ views[i]->name() ] );
346 // set focus to previously saved active view window
347 // std::string activeViewName = ip->getProperty("AP_ACTIVE_VIEW");
348 // for ( it.toFirst(); it.current(); ++it ) {
349 // int view_count = it.current()->getViewsCount();
350 // QPtrVector<SUIT_ViewWindow> views = it.current()->getViews();
351 // for ( int i = 0; i < view_count; i++ ) {
352 // if ( activeViewName == views[i]->name() )
353 // views[i]->setFocus();
361 bool SalomeApp_VisualState::eventFilter( QObject* o, QEvent* e )
363 // eat keyboard and mouse events
364 QEvent::Type aType = e->type();
365 if ( aType == QEvent::MouseButtonDblClick ||
366 aType == QEvent::MouseButtonPress ||
367 aType == QEvent::MouseButtonRelease ||
368 aType == QEvent::MouseMove ||
369 aType == QEvent::KeyPress ||
370 aType == QEvent::KeyRelease )
373 return QObject::eventFilter( o, e );