1 // Copyright (C) 2007-2015 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_ResourceMgr.h>
30 #include <SUIT_ViewManager.h>
31 #include <SUIT_ViewWindow.h>
32 #include <QtxWorkstack.h>
34 #include <STD_TabDesktop.h>
37 #include <QApplication>
40 #include <SALOMEDSClient_ClientFactory.hxx>//?
41 #include <SALOMEDSClient_IParameters.hxx>//?
50 SalomeApp_VisualState::SalomeApp_VisualState( SalomeApp_Application* app )
59 SalomeApp_VisualState::~SalomeApp_VisualState()
64 Sets names of all view windows in given list. This is used
65 in order to apply the same naming algorithm when saving and restoring
66 view windows. Names of view windows must be the same before saving
67 workstack (splitters) information, and before its restoring!
68 Naming rule: ViewerType_IndexOfViewerOfThisType_IndexOfViewInThisViewer
70 OCCViewer_0_0 OCCViewer_0_1 OCCViewer_0_2
73 void nameViewWindows( const ViewManagerList& lst )
75 QMap<QString, int> viewersCounter;
76 for ( QList<SUIT_ViewManager*>::const_iterator it = lst.begin(); it != lst.end(); ++it )
78 SUIT_ViewManager* aVM = *it;
82 int view_count = aVM->getViewsCount();
83 QString vType = aVM->getType();
85 continue; //No views is opened in the viewer
87 if ( !viewersCounter.contains( vType ) )
88 viewersCounter.insert( vType, 0 );
90 int& viewerID = viewersCounter[vType];
92 QVector<SUIT_ViewWindow*> views = aVM->getViews();
93 for ( int i = 0; i < view_count; i++ )
95 QString vName = QString( "%1_%2_%3" ).arg( vType ).arg( viewerID ).arg( i );
96 views[i]->setObjectName( vName );
103 Stores the visual parameters of the viewers
105 int SalomeApp_VisualState::storeState()
107 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
111 // unlock study if it is locked
112 bool aLocked = study->studyDS()->GetProperties()->IsLocked();
113 if (aLocked) study->studyDS()->GetProperties()->SetLocked(false);
116 std::vector<int> savePoints = study->getSavePoints();
117 //Calculate a new savePoint number = the last save point number + 1
118 if ( savePoints.size() > 0)
119 savePoint = savePoints[savePoints.size()-1] + 1;
121 _PTR(AttributeParameter) ap = study->studyDS()->GetCommonParameters( study->getVisualComponentName().toLatin1().constData(),
123 _PTR(IParameters) ip = ClientFactory::getIParameters( ap );
126 myApp->viewManagers( lst );
128 // setting unique names for view windows in order to save this view inside
129 // workstack's structure (see below). On restore the views with the same names will
130 // be placed to the same place inside the workstack's splitters.
131 nameViewWindows( lst );
133 // store active window's name
134 SUIT_ViewWindow* win = myApp->desktop()->activeWindow();
136 ip->setProperty("AP_ACTIVE_VIEW", win->objectName().toStdString() );
139 SUIT_ViewManager* vm = 0;
140 QListIterator<SUIT_ViewManager*> it( lst );
141 while ( it.hasNext() ) {
145 int view_count = vm->getViewsCount();
147 continue; //No views is opened in the viewer
149 std::string viewerEntry = QString( "%1_%2" ).arg( vm->getType() ).arg( ++viewerID ).toStdString();
150 ip->append("AP_VIEWERS_LIST", viewerEntry);
152 QVector<SUIT_ViewWindow*> views = vm->getViews();
153 for(int i = 0; i<view_count; i++) {
154 ip->append( viewerEntry, views[i]->windowTitle().toStdString() );
155 ip->append( viewerEntry, views[i]->getVisualParameters().toStdString() );
159 //Save information about split areas
160 if ( myApp->desktop()->inherits( "STD_TabDesktop" ) )
162 QString workstackInfo;
163 QtxWorkstack* workstack = ((STD_TabDesktop*)myApp->desktop())->workstack();
164 QByteArray geomState = workstack->saveState( 0 );
165 ip->setProperty( "AP_WORKSTACK_INFO", QString( geomState.toHex() ).toStdString() );
168 //Save a name of the active module
169 if ( CAM_Module* activeModule = myApp->activeModule() )
170 ip->setProperty( "AP_ACTIVE_MODULE", activeModule->moduleName().toStdString() );
172 //Store visual parameters of the modules
173 QList<CAM_Module*> mlist;
174 myApp->modules( mlist );
175 QListIterator<CAM_Module*> itM( mlist );
176 CAM_Module* module = 0;
177 while ( itM.hasNext() ) {
179 if ( !module ) continue;
182 if ( LightApp_Module* lModule = dynamic_cast<LightApp_Module*>( module ) ) {
183 ip->append( "AP_MODULES_LIST", lModule->moduleName().toStdString() );
184 if ( SalomeApp_Module* sModule = dynamic_cast<SalomeApp_Module*>( module ) )
185 sModule->storeVisualParameters( savePoint );
189 // set default name of new savePoint
190 study->setNameOfSavePoint( savePoint, QObject::tr( "SAVE_POINT_DEF_NAME" ) + QString::number( savePoint ) );
192 if (aLocked) study->studyDS()->GetProperties()->SetLocked(true);
198 Restores the visual parameters of the viewers
200 void SalomeApp_VisualState::restoreState(int savePoint)
202 SalomeApp_Study* study = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
206 _PTR(AttributeParameter) ap = study->studyDS()->GetCommonParameters( study->getVisualComponentName().toLatin1().constData(),
208 _PTR(IParameters) ip = ClientFactory::getIParameters(ap);
210 qApp->installEventFilter( this );
212 //Remove all already existent veiwers and their views
213 //myApp->clearViewManagers();
214 myApp->clearKnownViewManagers();
216 //Restore the viewers and view windows
217 int nbViewers = ip->nbValues( "AP_VIEWERS_LIST" );
218 SUIT_ViewWindow* viewWin = 0;
220 // parameters of view windows are stored in a map for restoring after restoring of the workstack
221 QMap<SUIT_ViewWindow*, QString> viewersParameters;
223 for ( int i = 0; i < nbViewers; i++ )
225 std::string viewerEntry = ip->getValue( "AP_VIEWERS_LIST", i );
226 std::vector<std::string> veiewerParams = ip->parseValue(viewerEntry,'_');
227 std::string type = veiewerParams[0];
228 std::string viewerID = veiewerParams[1];
229 SUIT_ViewManager* vm = myApp->newViewManager( type.c_str() );
231 continue; //Unknown viewer
233 int nbViews = (ip->nbValues(viewerEntry))/2;
235 //Create nbViews-1 view (-1 because 1 view is created by createViewManager)
236 for ( int i = 1; i< nbViews; i++ )
238 SUIT_ViewWindow* aView = vm->createViewWindow();
242 int viewCount = vm->getViewsCount();
243 if ( viewCount != nbViews )
245 printf( "\nRestore visual state: Unknow error, Can't create a view!\n" );
249 //Resize the views, set their captions and apply visual parameters.
250 QVector<SUIT_ViewWindow*> views = vm->getViews();
251 for ( int i = 0, j = 0; i<viewCount; i++, j+=2 )
257 // wait untill the window is really shown. This step fixes MANY bugs..
258 // while ( !vm->isVisible() )
259 // qApp->processEvents();
261 viewWin->setWindowTitle( ip->getValue( viewerEntry, j ).c_str() );
263 // printf ( "VP for viewWin \"%s\": %s\n", viewerEntry.c_str(), ip->getValue(viewerEntry, j+1).c_str() );
264 viewersParameters[ viewWin ] = ip->getValue( viewerEntry, j + 1 ).c_str();
265 //viewWin->setVisualParameters(ip->getValue(viewerEntry, j+1).c_str());
269 qApp->processEvents( QEventLoop::ExcludeUserInputEvents, 5000 );
271 // restore modules' visual parameters
272 std::vector<std::string> v = ip->getValues( "AP_MODULES_LIST" );
273 for ( int i = 0; i < v.size(); i++ )
275 myApp->activateModule( v[i].c_str() );
276 if ( SalomeApp_Module* module = dynamic_cast<SalomeApp_Module*>( myApp->activeModule() ) )
277 module->restoreVisualParameters( savePoint );
280 // new view windows may have been created in module->restoreVisualParameters() [GAUSS]
281 // so here we store their visual parameters for later restoring..
282 QList<SUIT_ViewManager*> lst;
283 myApp->viewManagers( lst );
284 for ( QList<SUIT_ViewManager*>::iterator itVM = lst.begin(); itVM != lst.end(); ++itVM )
286 SUIT_ViewManager* aVM = *itVM;
290 int view_count = aVM->getViewsCount();
291 QVector<SUIT_ViewWindow*> views = aVM->getViews();
292 for ( int i = 0; i < view_count; i++ )
294 if ( !viewersParameters.contains( views[i] ) )
296 viewersParameters[ views[i] ] = views[i]->getVisualParameters();
297 // printf ( "store VP for viewWin \"%s\": %s\n", views[i]->name(), views[i]->getVisualParameters().toLatin1().constData() );
302 // activate module that was active on save
303 QString activeModuleName( ip->getProperty("AP_ACTIVE_MODULE" ).c_str() );
304 if ( !activeModuleName.isEmpty() )
305 myApp->activateModule( activeModuleName );
307 // setting unique names for view windows in order to restore positions of view windows inside
308 // workstack's structure (see below). During save the same naming algorithm was used,
309 // so the same views will get the same names.
310 nameViewWindows( lst );
312 qApp->processEvents( QEventLoop::ExcludeUserInputEvents, 5000 );
314 // restore workstack parameters. should be done after module's restoreVisualParameters(), because
315 // some modules can create their own viewers (like VISU creates GaussViewers)
316 if ( myApp->desktop()->inherits( "STD_TabDesktop" ) )
318 QtxWorkstack* workstack = ((STD_TabDesktop*)myApp->desktop())->workstack();
319 workstack->restoreState( QByteArray::fromHex( QByteArray( ip->getProperty( "AP_WORKSTACK_INFO" ).c_str() ) ), 0 );
322 // restore visual parameters of view windows. it must be done AFTER restoring workstack.
323 // also set active view
324 std::string activeViewName = ip->getProperty("AP_ACTIVE_VIEW");
325 QMap<SUIT_ViewWindow*, QString>::Iterator mapIt;
326 for ( mapIt = viewersParameters.begin(); mapIt != viewersParameters.end(); ++mapIt ) {
327 mapIt.key()->setVisualParameters( mapIt.value() );
328 if ( activeViewName == mapIt.key()->objectName().toStdString() )
329 mapIt.key()->setFocus();
332 qApp->removeEventFilter( this );
334 // for ( it.toFirst(); it.current(); ++it ) {
335 // int view_count = it.current()->getViewsCount();
336 // QPtrVector<SUIT_ViewWindow> views = it.current()->getViews();
337 // for ( int i = 0; i < view_count; i++ )
338 // views[i]->setVisualParameters( viewersParameters[ views[i]->name() ] );
341 // set focus to previously saved active view window
342 // std::string activeViewName = ip->getProperty("AP_ACTIVE_VIEW");
343 // for ( it.toFirst(); it.current(); ++it ) {
344 // int view_count = it.current()->getViewsCount();
345 // QPtrVector<SUIT_ViewWindow> views = it.current()->getViews();
346 // for ( int i = 0; i < view_count; i++ ) {
347 // if ( activeViewName == views[i]->name() )
348 // views[i]->setFocus();
356 bool SalomeApp_VisualState::eventFilter( QObject* o, QEvent* e )
358 // eat keyboard and mouse events
359 QEvent::Type aType = e->type();
360 if ( aType == QEvent::MouseButtonDblClick ||
361 aType == QEvent::MouseButtonPress ||
362 aType == QEvent::MouseButtonRelease ||
363 aType == QEvent::MouseMove ||
364 aType == QEvent::KeyPress ||
365 aType == QEvent::KeyRelease )
368 return QObject::eventFilter( o, e );