X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FLightApp%2FLightApp_Application.cxx;h=e6970b23f1ab05c57bb867e79a67664ae00294f8;hb=8d54f199bd9ead3c2f0c704322975198e65264d6;hp=5c8c36c8c04c5419797302f4bdf17458f92ed1b3;hpb=6f75b0c075ffb1dc9b36df5d9b000b3b9f18ac36;p=modules%2Fgui.git diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index 5c8c36c8c..e6970b23f 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -24,7 +24,7 @@ // Created: 6/20/2005 18:39:45 PM // Author: Natalia Donis -#ifdef WNT +#ifdef WIN32 // E.A. : On windows with python 2.6, there is a conflict // E.A. : between pymath.h and Standard_math.h which define // E.A. : some same symbols : acosh, asinh, ... @@ -42,6 +42,7 @@ #include "LightApp_Application.h" #include "LightApp_Module.h" #include "LightApp_DataModel.h" +#include "LightApp_DataOwner.h" #include "LightApp_Study.h" #include "LightApp_Preferences.h" #include "LightApp_PreferencesDlg.h" @@ -143,6 +144,11 @@ #include #endif +#ifndef DISABLE_GRAPHICSVIEW + #include "GraphicsView_Viewer.h" + #include "GraphicsView_ViewManager.h" + #include "LightApp_GVSelector.h" +#endif #define VISIBILITY_COLUMN_WIDTH 25 @@ -210,6 +216,55 @@ static const char* imageEmptyIcon[] = { int LightApp_Application::lastStudyId = 0; + +// Markers used to parse array with dockable windows and toolbars state. +// For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp +// in the Qt source code. + +#define QDockWidgetMarker 0xfd // = DockWidgetStateMarker +#define QToolBarMarker 0xfc // = ToolBarStateMarkerEx + +// Format of the Byte array with the windows and toolbar state is: +// VersionMarker|version|DockWidgetStateMarker|nbDockWidgetLines|...DocWidgetData...|ToolBarStateMarkerEx|nbToolBarLines|...ToolBarData... + +//Find toolbar marker position in the array in the following way: +//since the 'toolbar marker' is not unique, find index of first occurrence of the +//'toolbar marker' in the array and check that next string is name of the toolbar + +int getToolbarMarkerIndex(QByteArray input, const QStringList& aFlags) { + int aResult = -1,tmp = 0; + int inputLen = input.length(); + QDataStream anInputData(&input, QIODevice::ReadOnly); + while(tmp < inputLen) { + tmp = input.indexOf(QToolBarMarker, tmp + 1); + if(tmp < 0 ) + break; + anInputData.device()->seek(tmp); + uchar mark; + anInputData>>mark; + int lines; + anInputData >> lines; + + if(lines == 0 && anInputData.atEnd()){ + //Case then array doesn't contain information about toolbars, + aResult = tmp; + break; + } + + int pos; + anInputData >> pos; + int cnt; + anInputData >> cnt; + QString str; + anInputData>>str; + if(aFlags.contains(str)) { + aResult = tmp; + break; + } + } + return aResult; +} + /*! \return last global id of study */ @@ -255,6 +310,7 @@ LightApp_Application::LightApp_Application() SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QPixmap aLogo = aResMgr->loadPixmap( "LightApp", tr( "APP_DEFAULT_ICO" ), false ); + QtxWebBrowser::setResourceManager( aResMgr ); QtxWebBrowser::setData("browser:icon", aResMgr->loadPixmap( "LightApp", tr( "BROWSER_ICON" ) ) ); QtxWebBrowser::setData("browser:title", tr( "BROWSER_TITLE" ) ); QtxWebBrowser::setData("toolbar:title", tr( "BROWSER_TOOLBAR_TITLE" ) ); @@ -290,6 +346,7 @@ LightApp_Application::LightApp_Application() myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, OCCViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, OCCViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, OCCViewer_Viewer::Type() ); + myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, OCCViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, OCCViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, OCCViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, OCCViewer_Viewer::Type() ); @@ -303,6 +360,7 @@ LightApp_Application::LightApp_Application() myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, VTKViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, VTKViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, VTKViewer_Viewer::Type() ); + myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, VTKViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::RotateLeft, Qt::ALT+Qt::Key_Left, VTKViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::RotateRight, Qt::ALT+Qt::Key_Right, VTKViewer_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::RotateUp, Qt::ALT+Qt::Key_Up, VTKViewer_Viewer::Type() ); @@ -316,6 +374,7 @@ LightApp_Application::LightApp_Application() myAccel->setActionKey( SUIT_Accel::ZoomIn, Qt::CTRL+Qt::Key_Plus, Plot2d_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::ZoomOut, Qt::CTRL+Qt::Key_Minus, Plot2d_Viewer::Type() ); myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::CTRL+Qt::Key_Asterisk, Plot2d_Viewer::Type() ); + myAccel->setActionKey( SUIT_Accel::ZoomFit, Qt::Key_Space, Plot2d_Viewer::Type() ); #endif connect( mySelMgr, SIGNAL( selectionChanged() ), this, SLOT( onSelection() ) ); @@ -628,7 +687,7 @@ void LightApp_Application::createActions() if ( icon.isNull() ) { icon = modIcon; - INFOS ( "****************************************************************" << std::endl + INFOS ( "\n****************************************************************" << std::endl << "* Icon for " << (*it).toLatin1().constData() << " not found. Using the default one." << std::endl << "****************************************************************" << std::endl ); @@ -675,6 +734,9 @@ void LightApp_Application::createActions() #ifndef DISABLE_QXGRAPHVIEWER createActionForViewer( NewQxSceneViewId, newWinMenu, QString::number( 4 ), Qt::ALT+Qt::Key_S ); #endif +#ifndef DISABLE_GRAPHICSVIEW + createActionForViewer( NewGraphicsViewId, newWinMenu, QString::number( 5 ), Qt::ALT+Qt::Key_R ); +#endif createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ), Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) ); @@ -788,6 +850,11 @@ void LightApp_Application::onNewWindow() case NewQxSceneViewId: type = QxScene_Viewer::Type(); break; +#endif +#ifndef DISABLE_GRAPHICSVIEW + case NewGraphicsViewId: + type = GraphicsView_Viewer::Type(); + break; #endif } @@ -912,6 +979,12 @@ void LightApp_Application::updateCommandsStatus() if( a ) a->setEnabled( activeStudy() ); #endif + +#ifndef DISABLE_GRAPHICSVIEW + a = action( NewGraphicsViewId ); + if( a ) + a->setEnabled( activeStudy() ); +#endif } /*! @@ -1007,7 +1080,7 @@ void LightApp_Application::onHelpContentsModule() // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol. QtxWebBrowser::loadUrl(helpFile); #else - QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile)); + QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile)); #endif } } @@ -1078,9 +1151,9 @@ void LightApp_Application::onHelpContextModule( const QString& theComponentName, #ifdef WIN32 // On Win32 platform QWebKit of the Qt 4.6.3 hang up in case 'file://' protocol // is defined. On Linux platform QWebKit doesn't work correctly without 'file://' protocol. - QtxWebBrowser::loadUrl(helpFile, context); + QtxWebBrowser::loadUrl(helpFile, context); #else - QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile),context); + QtxWebBrowser::loadUrl(QString("file://%1").arg(helpFile), context); #endif } @@ -1413,6 +1486,13 @@ SUIT_ViewManager* LightApp_Application::createViewManager( const QString& vmType //QxScene_ViewWindow* wnd = dynamic_cast( viewMgr->getActiveView() ); } #endif +#ifndef DISABLE_GRAPHICSVIEW + if( vmType == GraphicsView_Viewer::Type() ) + { + viewMgr = new GraphicsView_ViewManager( activeStudy(), desktop() ); + new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr ); + } +#endif #ifndef DISABLE_OCCVIEWER if( vmType == OCCViewer_Viewer::Type() ) { @@ -1748,6 +1828,9 @@ void LightApp_Application::onPreferenceChanged( QString& modName, QString& secti /*!Remove all windows from study.*/ void LightApp_Application::beforeCloseDoc( SUIT_Study* s ) { + if ( SUIT_DataBrowser* ob = objectBrowser() ) + ob->setModel(0); + CAM_Application::beforeCloseDoc( s ); } @@ -2035,6 +2118,8 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->addPreference( tr( "PREF_ASCII_FILE" ), studyGroup, LightApp_Preferences::Bool, "Study", "ascii_file" ); // .... -> store windows geometry pref->addPreference( tr( "PREF_STORE_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_positions" ); + pref->addPreference( "", studyGroup, LightApp_Preferences::Space ); + pref->addPreference( tr( "PREF_STORE_TOOL_POS" ), studyGroup, LightApp_Preferences::Bool, "Study", "store_tool_positions" ); // .... -> auto-save int autoSaveInterval = pref->addPreference( tr( "PREF_AUTO_SAVE" ), studyGroup, LightApp_Preferences::IntSpin, "Study", "auto_save_interval" ); @@ -2122,6 +2207,9 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) // ... "Trihedron" group <> // .. "3D viewer" group <> + QString formats; + int bgId; +#ifndef DISABLE_OCCVIEWER // .. "OCC viewer" group <> int occGroup = pref->addPreference( tr( "PREF_GROUP_OCCVIEWER" ), salomeCat ); @@ -2131,10 +2219,10 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) aValuesList.clear(); anIndicesList.clear(); txtList.clear(); - QString formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList ); + formats = OCCViewer_Viewer::backgroundData( aValuesList, idList, txtList ); foreach( int gid, idList ) anIndicesList << gid; // .... -> 3D viewer background - int bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup, + bgId = pref->addPreference( tr( "PREF_3DVIEWER_BACKGROUND" ), bgGroup, LightApp_Preferences::Background, "OCCViewer", "background" ); pref->setItemProperty( "gradient_names", aValuesList, bgId ); pref->setItemProperty( "gradient_ids", anIndicesList, bgId ); @@ -2197,7 +2285,9 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "columns", 2, occGen ); // ... -> empty frame (for layout) <> // .. "OCC viewer" group <> +#endif +#ifndef DISABLE_VTKVIEWER // .. "VTK viewer" group <> int vtkGroup = pref->addPreference( tr( "PREF_GROUP_VTKVIEWER" ), salomeCat ); //viewTab @@ -2217,7 +2307,9 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) aValuesList.clear(); anIndicesList.clear(); txtList.clear(); +#ifndef DISABLE_SALOMEOBJECT formats = SVTK_Viewer::backgroundData( aValuesList, idList, txtList ); +#endif foreach( int gid, idList ) anIndicesList << gid; bgId = pref->addPreference( tr( "PREF_VIEWER_BACKGROUND" ), vtkGen, LightApp_Preferences::Background, "VTKViewer", "background" ); @@ -2228,7 +2320,9 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "texture_tile_enabled", (bool)txtList.contains( Qtx::TileTexture ), bgId ); pref->setItemProperty( "texture_stretch_enabled", (bool)txtList.contains( Qtx::StretchTexture ), bgId ); pref->setItemProperty( "custom_enabled", false, bgId ); +#ifndef DISABLE_SALOMEOBJECT pref->setItemProperty( "image_formats", formats, bgId ); +#endif // .... -> speed increment int vtkSpeed = pref->addPreference( tr( "PREF_INCREMENTAL_SPEED" ), vtkGen, LightApp_Preferences::IntSpin, "VTKViewer", "speed_value" ); @@ -2334,6 +2428,7 @@ void LightApp_Application::createPreferences( LightApp_Preferences* pref ) pref->setItemProperty( "step", 0.1, transPref ); // ... -> group names sub-group <> // .. "VTK viewer" group <> +#endif // .. "Plot2d viewer" group <> int plot2dGroup = pref->addPreference( tr( "PREF_GROUP_PLOT2DVIEWER" ), salomeCat ); //viewTab @@ -2809,8 +2904,6 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString if( sec=="Study" ) { - if( param=="store_positions" ) - updateWindows(); if( param=="auto_save_interval" ) { myAutoSaveTimer->stop(); int autoSaveInterval = resMgr->integerValue( "Study", "auto_save_interval", 0 ); @@ -2865,10 +2958,9 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString if ( sec == "ExternalBrowser" && param == "use_external_browser" ) { if ( resMgr->booleanValue("ExternalBrowser", "use_external_browser", false ) ) - { - if(QtxWebBrowser::webBrowser()) - QtxWebBrowser::webBrowser()->close(); - } + { + QtxWebBrowser::shutdown(); + } } #ifndef DISABLE_PLOT2DVIEWER @@ -2913,17 +3005,8 @@ void LightApp_Application::loadPreferences() mru_load = false; } - myWinGeom.clear(); - QStringList mods = aResMgr->parameters( "windows_geometry" ); - for ( QStringList::const_iterator it = mods.begin(); it != mods.end(); ++it ) - { - QByteArray arr; - if ( aResMgr->value( "windows_geometry", *it, arr ) ) - myWinGeom.insert( *it, arr ); - } - myWinVis.clear(); - mods = aResMgr->parameters( "windows_visibility" ); + QStringList mods = aResMgr->parameters( "windows_visibility" ); for ( QStringList::const_iterator itr = mods.begin(); itr != mods.end(); ++itr ) { QByteArray arr; @@ -2962,9 +3045,6 @@ void LightApp_Application::savePreferences() if ( mru ) mru->saveLinks( aResMgr, "MRU" ); - for ( WinGeom::const_iterator it = myWinGeom.begin(); it != myWinGeom.end(); ++it ) - aResMgr->setValue( "windows_geometry", it.key(), it.value() ); - for ( WinVis::const_iterator itr = myWinVis.begin(); itr != myWinVis.end(); ++itr ) aResMgr->setValue( "windows_visibility", itr.key(), itr.value() ); @@ -3163,51 +3243,91 @@ void LightApp_Application::loadDockWindowsState() { if ( !desktop() ) return; - - bool store = resourceMgr()->booleanValue( "Study", "store_positions", true ); - if( !store ) - return; + SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); + bool storeWin = aResMgr->booleanValue( "Study", "store_positions", true ); + bool storeTb = aResMgr->booleanValue( "Study", "store_tool_positions", true ); QString modName; if ( activeModule() ) modName = activeModule()->name(); - if ( myWinGeom.contains( modName ) ) - desktop()->restoreState( myWinGeom[modName] ); - - if ( !myWinVis.contains( modName ) ) + QtxResourceMgr::WorkingMode prevMode = aResMgr->workingMode(); + aResMgr->setWorkingMode(QtxResourceMgr::IgnoreUserValues); + QByteArray aDefaultState; + aResMgr->value("windows_geometry", modName , aDefaultState ); + QByteArray aDefaultVisibility; + aResMgr->value("windows_visibility", modName , aDefaultVisibility ); + bool hasDefaultVisibility = !aDefaultVisibility.isEmpty(); + aResMgr->setWorkingMode(prevMode); + + if( !storeWin && !storeTb && aDefaultState.isEmpty() && !hasDefaultVisibility) return; - QMap tbMap, dwMap; - dockWindowsState( myWinVis[modName], tbMap, dwMap ); + if ( aResMgr->hasValue("windows_geometry" ,modName ) ) { + QByteArray arr; + aResMgr->value("windows_geometry", modName , arr ); + QByteArray aTargetArray = processState(arr, storeWin, storeTb, true, aDefaultState); + desktop()->restoreState( aTargetArray ); + } - QList tbList = qFindChildren( desktop() ); - for ( QList::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) - { - QToolBar* tb = *tit; + if ( !myWinVis.contains( modName ) && aDefaultVisibility.isEmpty()) + return; - QObject* po = Qtx::findParent( tb, "QMainWindow" ); - if ( po != desktop() ) - continue; + QMap *tbMap = 0; + QMap *dwMap = 0; + + QMap userTbMap, userDwMap; + dockWindowsState( myWinVis[modName], userTbMap, userDwMap ); - if ( tbMap.contains( tb->objectName() ) ) - tb->setVisible( tbMap[tb->objectName()] ); + QMap defaultTbMap, defaultDwMap; + if(hasDefaultVisibility) { + dockWindowsState( aDefaultVisibility, defaultTbMap, defaultDwMap); } - QList dwList = qFindChildren( desktop() ); - for ( QList::iterator dit = dwList.begin(); dit != dwList.end(); ++dit ) - { - QDockWidget* dw = *dit; + if(storeTb) { + tbMap = &userTbMap; + } else { + if(hasDefaultVisibility){ + tbMap = &defaultTbMap; + } + } - QObject* po = Qtx::findParent( dw, "QMainWindow" ); - if ( po != desktop() ) - continue; + if(storeWin) { + dwMap = &userDwMap; + } else { + if(hasDefaultVisibility){ + dwMap = &defaultDwMap; + } + } + + if(tbMap) { + QList tbList = findToolBars(); + for ( QList::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) + { + QToolBar* tb = *tit; + if ( tbMap->contains( tb->objectName() ) ) { + tb->setVisible( (*tbMap)[tb->objectName()] ); + } + } + } - if ( dwMap.contains( dw->objectName() ) ) - dw->setVisible( dwMap[dw->objectName()] ); + if(dwMap) { + QList dwList = qFindChildren( desktop() ); + for ( QList::iterator dit = dwList.begin(); dit != dwList.end(); ++dit ) + { + QDockWidget* dw = *dit; + + QObject* po = Qtx::findParent( dw, "QMainWindow" ); + if ( po != desktop() ) + continue; + + if ( dwMap->contains( dw->objectName() ) ) + dw->setVisible( (*dwMap)[dw->objectName()] ); + } } } + /*! Saves windows geometry */ @@ -3216,15 +3336,18 @@ void LightApp_Application::saveDockWindowsState() if ( !desktop() ) return; - bool store = resourceMgr()->booleanValue( "Study", "store_positions", true ); - if( !store ) + bool storeWin = resourceMgr()->booleanValue( "Study", "store_positions", true ); + bool storeTb = resourceMgr()->booleanValue( "Study", "store_tool_positions", true ); + + if( !storeWin && !storeTb ) return; QString modName; if ( activeModule() ) modName = activeModule()->name(); - myWinGeom.insert( modName, desktop()->saveState() ); + QByteArray arr = desktop()->saveState(); + resourceMgr()->setValue( "windows_geometry", modName, processState(arr, storeWin, storeTb, false) ); QByteArray visArr; if ( myWinVis.contains( modName ) ) @@ -3366,6 +3489,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopu a->setShortcut( ob->shortcutKey(SUIT_DataBrowser::UpdateShortcut) ); } +#ifndef DISABLE_SALOMEOBJECT if ( selMgr && ob ) { SALOME_ListIO selected; selMgr->selectedObjects( selected ); @@ -3384,6 +3508,7 @@ void LightApp_Application::contextMenuPopup( const QString& type, QMenu* thePopu } } } +#endif selMgr->setSelectionCacheEnabled( cacheIsOn ); } @@ -3618,7 +3743,7 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const if ( !isLibFound ) { - INFOS( "****************************************************************" << std::endl + INFOS( "\n****************************************************************" << std::endl << "* Warning: library " << lib.toLatin1().constData() << " cannot be found" << std::endl << "* Module " << moduleTitle.toLatin1().constData() << " will not be available in GUI mode" << std::endl << "****************************************************************" << std::endl ); @@ -3655,7 +3780,7 @@ bool LightApp_Application::isLibExists( const QString& moduleTitle ) const return true; } - printf( "****************************************************************\n" ); + printf( "\n****************************************************************\n" ); printf( "* Warning: python library for %s cannot be found:\n", moduleTitle.toLatin1().constData() ); if (!isPyLib) printf( "* No module named %s\n", moduleName( moduleTitle ).toLatin1().constData() ); @@ -4001,3 +4126,164 @@ void LightApp_Application::onDesktopMessage( const QString& message ) } } } + +/*! + Internal method. + Returns all top level toolbars. + Note : Result list contains only main window toolbars, not including toolbars from viewers. +*/ +QList LightApp_Application::findToolBars() { + QList aResult; + QList tbList = qFindChildren( desktop() ); + for ( QList::iterator tit = tbList.begin(); tit != tbList.end(); ++tit ) { + QToolBar* tb = *tit; + QObject* po = Qtx::findParent( tb, "QMainWindow" ); + if ( po != desktop() ) + continue; + aResult.append(tb); + } + return aResult; +} + +/*! + Internal method to parse toolbars and dockable windows state. + */ +QByteArray LightApp_Application::processState(QByteArray& input, + const bool processWin, + const bool processTb, + const bool isRestoring, + QByteArray defaultState) { + + QByteArray aRes; + bool hasDefaultState = !defaultState.isEmpty(); + bool isDockWinWriten = false; + int nbDocWin = -1; + //Write date from users settings + if(isRestoring){ + QDataStream tmpInputData(&input, QIODevice::ReadOnly); + int marker, version; + uchar dockmarker; + tmpInputData >> marker; + tmpInputData >> version; + tmpInputData >> dockmarker; + tmpInputData >> nbDocWin; + } + if(processWin && processTb && !isRestoring) { + aRes = input; + } else if(!processWin && !processTb ) { + if(hasDefaultState) + aRes = defaultState; + } else { + QDataStream aData(&aRes, QIODevice::WriteOnly); + QList aToolBars = findToolBars(); + + QStringList aNames; + for ( QList::iterator tit = aToolBars.begin(); tit != aToolBars.end(); ++tit ) { + QToolBar* tb = *tit; + aNames.append(tb->objectName()); + } + + int toolBarMarkerIndex = getToolbarMarkerIndex(input,aNames); + QDataStream anInputData(&input, QIODevice::ReadOnly); + if(toolBarMarkerIndex < 0) + return aRes; + + int toolBarMarkerIndexDef; + if(hasDefaultState) { + toolBarMarkerIndexDef = getToolbarMarkerIndex(defaultState, aNames); + if(toolBarMarkerIndexDef < 0) + return aRes; + } + QDataStream anInputDataDef(&defaultState, QIODevice::ReadOnly); + + QDataStream* aTargetData = 0; + int aTargetIndex = -1; + + QByteArray currentArr = desktop()->saveState(); + QDataStream anInputDataCur(¤tArr, QIODevice::ReadOnly); + bool useInputData = !isRestoring || (isRestoring && nbDocWin > 0); + if(processWin && useInputData) { + aTargetData = &anInputData; + aTargetIndex = toolBarMarkerIndex; + } else { + //Write date from default settings + if(hasDefaultState) { + aTargetData = &anInputDataDef; + aTargetIndex = toolBarMarkerIndexDef; + } else { + //If no default state, write current snapshot of the dockable windows + if(isRestoring) { + aTargetData = &anInputDataCur; + int toolBarMarkerIndexCur = getToolbarMarkerIndex(currentArr, aNames); + aTargetIndex = toolBarMarkerIndexCur; + } + } + } + + if(aTargetData && aTargetIndex >= 0 ) { + aTargetData->device()->seek(0); + while( aTargetData->device()->pos() < aTargetIndex ) { + uchar ch; + *aTargetData >> ch; + aData<= 0) { + int index; + if(!isDockWinWriten ) { + //Write version marker + int marker, version; + aTargetData->device()->seek(0); + *aTargetData >> marker; + *aTargetData >> version; + aData << marker; + aData << version; + aData << (uchar) QDockWidgetMarker; + aData << (int) 0; + int shift = 4*sizeof(int) + sizeof(QSize); + index = aTargetIndex - shift; + } else { + index = aTargetIndex; + } + + aTargetData->device()->seek(index); + while(!aTargetData->atEnd()) { + uchar ch; + *aTargetData >> ch; + aData << ch; + } + } else { // Not treat toolbars + aData << (uchar) QToolBarMarker; + aData << (int) 0; //Nb toolbars = 0 + } + } + return aRes; +} + +/*! + \brief Emits operationFinished signal. + \param theModuleName the name of the module which perfomed the operation + \param theOperationName the operation name + \param theEntryList the list of the created objects entries +*/ +void LightApp_Application::emitOperationFinished( const QString& theModuleName, + const QString& theOperationName, + const QStringList& theEntryList ) +{ + emit operationFinished( theModuleName, theOperationName, theEntryList ); +}