X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=58d0f8844e07fc20aee6a044b387a58595ab89b5;hb=38afbd899a8645c83e17f2c24a17a2b7414911b4;hp=22358aab96a01a69400684a6fc335bd2a2d5d9ed;hpb=e7205b28051a00406d00ff52d228f1a6dc38dc34;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 22358aab9..58d0f8844 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,13 +1,8 @@ -#include "ModuleBase_IModule.h" -#include "XGUI_Constants.h" -#include "XGUI_Command.h" -#include "XGUI_MainMenu.h" -#include "XGUI_MainWindow.h" -#include "XGUI_MenuGroupPanel.h" +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + +//#include "XGUI_Constants.h" #include "XGUI_Tools.h" -#include "XGUI_Workbench.h" #include "XGUI_Workshop.h" -#include "XGUI_Viewer.h" #include "XGUI_SelectionMgr.h" #include "XGUI_Selection.h" #include "XGUI_ObjectsBrowser.h" @@ -20,9 +15,18 @@ #include "XGUI_PropertyPanel.h" #include "XGUI_ContextMenuMgr.h" #include "XGUI_ModuleConnector.h" -#include "XGUI_Preferences.h" #include +#include +#include +#include +#include +#include +#include + +#include +#include + #include #include #include @@ -33,7 +37,7 @@ #include #include -#include +//#include #include #include @@ -46,11 +50,14 @@ #include #include #include +#include #include #include #include #include +#include +#include #include #include @@ -75,12 +82,39 @@ QMap XGUI_Workshop::myIcons; -QString XGUI_Workshop::featureIcon(const std::string& theId) + +QIcon XGUI_Workshop::featureIcon(const FeaturePtr& theFeature) { - QString aId(theId.c_str()); - if (myIcons.contains(aId)) - return myIcons[aId]; - return QString(); + QIcon anIcon; + + std::string aKind = theFeature->getKind(); + QString aId(aKind.c_str()); + if (!myIcons.contains(aId)) + return anIcon; + + QString anIconString = myIcons[aId]; + + ModelAPI_ExecState aState = theFeature->data()->execState(); + switch(aState) { + case ModelAPI_StateDone: + case ModelAPI_StateNothing: + anIcon = QIcon(anIconString); + case ModelAPI_StateMustBeUpdated: { + anIcon = ModuleBase_Tools::lighter(anIconString); + } + break; + case ModelAPI_StateExecFailed: { + anIcon = ModuleBase_Tools::composite(":pictures/exec_state_failed.png", anIconString); + } + break; + case ModelAPI_StateInvalidArgument: { + anIcon = ModuleBase_Tools::composite(":pictures/exec_state_invalid_parameters.png", + anIconString); + } + break; + default: break; + } + return anIcon; } XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) @@ -94,7 +128,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myUpdatePrefs(false), myPartActivating(false) { - myMainWindow = mySalomeConnector ? 0 : new XGUI_MainWindow(); + myMainWindow = mySalomeConnector ? 0 : new AppElements_MainWindow(); myDisplayer = new XGUI_Displayer(this); @@ -115,13 +149,15 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationResumed()), SLOT(onOperationStarted())); + connect(myOperationMgr, SIGNAL(operationResumed(ModuleBase_Operation*)), SLOT(onOperationStarted())); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), SLOT(onOperationStopped(ModuleBase_Operation*))); connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); - connect(myOperationMgr, SIGNAL(operationStarted()), myActionsMgr, SLOT(update())); - connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), myActionsMgr, - SLOT(update())); + // TODO(sbh): It seems that application works properly without update on operationStarted + connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), + myActionsMgr, SLOT(update())); + connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), + myActionsMgr, SLOT(update())); connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } @@ -135,12 +171,14 @@ XGUI_Workshop::~XGUI_Workshop(void) void XGUI_Workshop::startApplication() { initMenu(); + + Config_PropManager::registerProp("Plugins", "default_path", "Default Path", + Config_Prop::Directory, ""); + //Initialize event listening Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Error::errorID()); //!< Listening application errors. - //TODO(sbh): Implement static method to extract event id [SEID] - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_LOADED)); - // TODO Is it good to use non standard event within workshop? + aLoop->registerListener(this, Events_Loop::eventByName(Config_FeatureMessage::GUI_EVENT())); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OPERATION_LAUNCHED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); @@ -151,14 +189,19 @@ void XGUI_Workshop::startApplication() aLoop->registerListener(this, Events_Loop::eventByName("CurrentDocumentChanged")); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOSHOW)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOHIDE)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SELFILTER_LOADED)); registerValidators(); + + // Calling of loadCustomProps before activating module is required + // by Config_PropManger to restore user-defined path to plugins + ModuleBase_Preferences::loadCustomProps(); activateModule(); if (myMainWindow) { myMainWindow->show(); updateCommandStatus(); } - XGUI_Preferences::loadCustomProps(); + onNew(); } @@ -169,27 +212,39 @@ void XGUI_Workshop::initMenu() if (isSalomeMode()) { // Create only Undo, Redo commands - QAction* aAction = salomeConnector()->addEditCommand("UNDO_CMD", tr("Undo"), + QAction* aAction = salomeConnector()->addDesktopCommand("UNDO_CMD", tr("Undo"), tr("Undo last command"), QIcon(":pictures/undo.png"), - QKeySequence::Undo, false); + QKeySequence::Undo, false, "MEN_DESK_EDIT"); connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onUndo())); - aAction = salomeConnector()->addEditCommand("REDO_CMD", tr("Redo"), tr("Redo last command"), + aAction = salomeConnector()->addDesktopCommand("REDO_CMD", tr("Redo"), tr("Redo last command"), QIcon(":pictures/redo.png"), QKeySequence::Redo, - false); + false, "MEN_DESK_EDIT"); connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRedo())); - salomeConnector()->addEditMenuSeparator(); - aAction = salomeConnector()->addEditCommand("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), + salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); + aAction = salomeConnector()->addDesktopCommand("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), QIcon(":pictures/rebuild.png"), QKeySequence(), - false); + false, "MEN_DESK_EDIT"); connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRebuild())); - salomeConnector()->addEditMenuSeparator(); + salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); + + aAction = salomeConnector()->addDesktopCommand("SAVEAS_CMD", tr("Export NewGeom..."), tr("Export the current document into a NewGeom file"), + QIcon(), QKeySequence(), + false, "MEN_DESK_FILE"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onSaveAs())); + + aAction = salomeConnector()->addDesktopCommand("OPEN_CMD", tr("Import NewGeom..."), tr("Import a NewGeom file"), + QIcon(), QKeySequence(), + false, "MEN_DESK_FILE"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onOpen())); + salomeConnector()->addDesktopMenuSeparator("MEN_DESK_FILE"); + return; } // File commands group - XGUI_MenuGroupPanel* aGroup = myMainWindow->menuObject()->generalPage(); + AppElements_MenuGroupPanel* aGroup = myMainWindow->menuObject()->generalPage(); - XGUI_Command* aCommand; + AppElements_Command* aCommand; aCommand = aGroup->addFeature("SAVE_CMD", tr("Save..."), tr("Save the document"), QIcon(":pictures/save.png"), QKeySequence::Save); @@ -237,14 +292,14 @@ void XGUI_Workshop::initMenu() } //****************************************************** -XGUI_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) +AppElements_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); return aMenuBar->addWorkbench(theName); } //****************************************************** -void XGUI_Workshop::processEvent(const boost::shared_ptr& theMessage) +void XGUI_Workshop::processEvent(const std::shared_ptr& theMessage) { if (QApplication::instance()->thread() != QThread::currentThread()) { #ifdef _DEBUG @@ -257,9 +312,9 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes } //A message to start feature creation received. - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_LOADED)) { - boost::shared_ptr aFeatureMsg = - boost::dynamic_pointer_cast(theMessage); + if (theMessage->eventID() == Events_Loop::loop()->eventByName(Config_FeatureMessage::GUI_EVENT())) { + std::shared_ptr aFeatureMsg = + std::dynamic_pointer_cast(theMessage); if (!aFeatureMsg->isInternal()) { addFeature(aFeatureMsg); } @@ -267,8 +322,8 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes // Process creation of Part else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { - boost::shared_ptr aUpdMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); onFeatureCreatedMsg(aUpdMsg); if (myUpdatePrefs) { if (mySalomeConnector) @@ -282,22 +337,22 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes // Redisplay feature else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { - boost::shared_ptr aUpdMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); } //Update property panel on corresponding message. If there is no current operation (no //property panel), or received message has different feature to the current - do nothing. else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { - boost::shared_ptr anUpdateMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); onFeatureUpdatedMsg(anUpdateMsg); } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { - boost::shared_ptr aDelMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr aDelMsg = + std::dynamic_pointer_cast(theMessage); onObjectDeletedMsg(aDelMsg); } @@ -309,10 +364,10 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) { - boost::shared_ptr anUpdateMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); const std::set& aObjList = anUpdateMsg->objects(); - QList aList; + QObjectPtrList aList; std::set::const_iterator aIt; for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) aList.append(*aIt); @@ -320,10 +375,10 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOHIDE)) { - boost::shared_ptr anUpdateMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); const std::set& aObjList = anUpdateMsg->objects(); - QList aList; + QObjectPtrList aList; std::set::const_iterator aIt; for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) aList.append(*aIt); @@ -332,8 +387,8 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes //An operation passed by message. Start it, process and commit. else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { - boost::shared_ptr aPartSetMsg = - boost::dynamic_pointer_cast(theMessage); + std::shared_ptr aPartSetMsg = + std::dynamic_pointer_cast(theMessage); //myPropertyPanel->cleanContent(); ModuleBase_Operation* anOperation = (ModuleBase_Operation*) aPartSetMsg->pointer(); @@ -359,7 +414,7 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes } std::string aGrpName = ModelAPI_ResultPart::group(); for (int i = 0; i < aDoc->size(aGrpName); i++) { - ResultPartPtr aPart = boost::dynamic_pointer_cast(aDoc->object(aGrpName, i)); + ResultPartPtr aPart = std::dynamic_pointer_cast(aDoc->object(aGrpName, i)); if (aPart->partDoc() == aActiveDoc) { activatePart(aPart); // Activate a part which corresponds to active Doc return; @@ -368,9 +423,23 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes // If not found then activate global document activatePart(ResultPartPtr()); - } else { + } + else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_SELFILTER_LOADED)) { + std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); + if (aMsg) { + if (aMsg->attributeId().empty()) { // feature validator + moduleConnector()->selectionFilters()->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId()); + } else { // attribute validator + moduleConnector()->selectionFilters()->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId()); + } + } + } + + + else { //Show error dialog if error message received. - boost::shared_ptr anAppError = boost::dynamic_pointer_cast(theMessage); + std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); if (anAppError) { emit errorOccurred(QString::fromLatin1(anAppError->description())); } @@ -392,7 +461,7 @@ void XGUI_Workshop::onStartWaiting() } //****************************************************** -void XGUI_Workshop::onFeatureUpdatedMsg(const boost::shared_ptr& theMsg) +void XGUI_Workshop::onFeatureUpdatedMsg(const std::shared_ptr& theMsg) { std::set aFeatures = theMsg->objects(); if (myOperationMgr->hasOperation()) { @@ -412,16 +481,15 @@ void XGUI_Workshop::onFeatureUpdatedMsg(const boost::shared_ptr& theMsg) +void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptr& theMsg) { std::set aObjects = theMsg->objects(); std::set::const_iterator aIt; - QIntList aModes; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); bool aHide = !aObj->data() || !aObj->data()->isValid(); if (!aHide) { // check that this is not hidden result - ResultPtr aRes = boost::dynamic_pointer_cast(aObj); + ResultPtr aRes = std::dynamic_pointer_cast(aObj); aHide = aRes && aRes->isConcealed(); } if (aHide) @@ -431,15 +499,14 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const boost::shared_ptrdisplay(aObj, false); // In order to update presentation if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (!aOperation->hasObject(aObj)) - if (!myDisplayer->isActive(aObj)) - myDisplayer->activate(aObj, aModes); + if (aOperation->hasObject(aObj) && myDisplayer->isActive(aObj)) + myDisplayer->deactivate(aObj); } } else { if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); // Display only current operation results if operation has preview - if (aOperation->hasObject(aObj) && aOperation->hasPreview()) { + if (aOperation->hasObject(aObj)/* && aOperation->hasPreview()*/) { myDisplayer->display(aObj, false); // Deactivate object of current operation from selection if (myDisplayer->isActive(aObj)) @@ -453,7 +520,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const boost::shared_ptr& theMsg) +void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptr& theMsg) { std::set aObjects = theMsg->objects(); @@ -461,7 +528,7 @@ void XGUI_Workshop::onFeatureCreatedMsg(const boost::shared_ptr(*aIt); + ResultPartPtr aPart = std::dynamic_pointer_cast(*aIt); if (aPart) { aHasPart = true; // If a feature is created from the aplication's python console @@ -484,7 +551,7 @@ void XGUI_Workshop::onFeatureCreatedMsg(const boost::shared_ptr& theMsg) +void XGUI_Workshop::onObjectDeletedMsg(const std::shared_ptr& theMsg) { if (myObjectBrowser) myObjectBrowser->processEvent(theMsg); @@ -523,10 +590,16 @@ void XGUI_Workshop::onOperationStarted() } } - aOperation->setPropertyPanel(myPropertyPanel); myPropertyPanel->setModelWidgets(aWidgets); - if (!aOperation->activateByPreselection()) - myPropertyPanel->activateNextWidget(NULL); + aOperation->setPropertyPanel(myPropertyPanel); + // Do not activate widgets by default if the current operation is editing operation + // Because we don't know which widget is going to be edited. + if ((!aOperation->isEditOperation())) { + aOperation->activateByPreselection(); + } + // Set final definitions if they are necessary + myModule->propertyPanelDefined(aOperation); + // Widget activation (from the previous method) may commit the current operation // if pre-selection is enougth for it. So we shouldn't update prop panel's title if(myOperationMgr->isCurrentOperation(aOperation)) { @@ -543,13 +616,22 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) updateCommandStatus(); hidePropertyPanel(); myPropertyPanel->cleanContent(); + + // Activate objects created by current operation + FeaturePtr aFeature = theOperation->feature(); + myDisplayer->activate(aFeature); + const std::list& aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { + myDisplayer->activate(*aIt); + } } bool XGUI_Workshop::event(QEvent * theEvent) { PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); if (aPostponedEv) { - boost::shared_ptr aEventPtr = aPostponedEv->postponedMessage(); + std::shared_ptr aEventPtr = aPostponedEv->postponedMessage(); processEvent(aEventPtr); return true; } @@ -559,7 +641,7 @@ bool XGUI_Workshop::event(QEvent * theEvent) /* * */ -void XGUI_Workshop::addFeature(const boost::shared_ptr& theMessage) +void XGUI_Workshop::addFeature(const std::shared_ptr& theMessage) { if (!theMessage) { #ifdef _DEBUG @@ -586,17 +668,17 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t salomeConnector()->setDocumentKind(aFeatureId, QString::fromStdString(theMessage->documentKind())); myActionsMgr->addCommand(aAction); - myModule->featureCreated(aAction); + myModule->actionCreated(aAction); } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - XGUI_Workbench* aPage = aMenuBar->findWorkbench(aWchName); + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); + AppElements_Workbench* aPage = aMenuBar->findWorkbench(aWchName); if (!aPage) { aPage = addWorkbench(aWchName); } //Find or create Group QString aGroupName = QString::fromStdString(theMessage->groupId()); - XGUI_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); + AppElements_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); if (!aGroup) { aGroup = aPage->addGroup(aGroupName); } @@ -605,7 +687,7 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t QKeySequence aHotKey = myActionsMgr->registerShortcut( QString::fromStdString(theMessage->keysequence())); // Create feature... - XGUI_Command* aCommand = aGroup->addFeature(aFeatureId, + AppElements_Command* aCommand = aGroup->addFeature(aFeatureId, QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), @@ -614,7 +696,7 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t isUsePropPanel); aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aCommand); - myModule->featureCreated(aCommand); + myModule->actionCreated(aCommand); } } @@ -629,7 +711,7 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) if (isSalomeMode()) { aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); } else { - XGUI_MainMenu* aMenu = myMainWindow->menuObject(); + AppElements_MainMenu* aMenu = myMainWindow->menuObject(); FeaturePtr aFeature = theOperation->feature(); if(aFeature) aCommand = aMenu->feature(QString::fromStdString(aFeature->getKind())); @@ -714,7 +796,7 @@ void XGUI_Workshop::onOpen() } else if (anAnswer == QMessageBox::Cancel) { return; } - aSession->moduleDocument()->close(); + aSession->closeAll(); myCurrentDir = ""; } @@ -747,7 +829,8 @@ bool XGUI_Workshop::onSave() std::list aFiles; saveDocument(myCurrentDir, aFiles); updateCommandStatus(); - myMainWindow->setModifiedState(false); + if (!isSalomeMode()) + myMainWindow->setModifiedState(false); return true; } @@ -818,7 +901,7 @@ void XGUI_Workshop::onRebuild() aMgr->startOperation(); } static const Events_ID aRebuildEvent = Events_Loop::loop()->eventByName("Rebuild"); - Events_Loop::loop()->send(boost::shared_ptr( + Events_Loop::loop()->send(std::shared_ptr( new Events_Message(aRebuildEvent, this))); if (!aWasOperation) { aMgr->finishOperation(); @@ -828,17 +911,17 @@ void XGUI_Workshop::onRebuild() //****************************************************** void XGUI_Workshop::onPreferences() { - XGUI_Prefs aModif; - XGUI_Preferences::editPreferences(aModif); + ModuleBase_Prefs aModif; + ModuleBase_Preferences::editPreferences(aModif); if (aModif.size() > 0) { QString aSection; - foreach (XGUI_Pref aPref, aModif) + foreach (ModuleBase_Pref aPref, aModif) { aSection = aPref.first; - if (aSection == XGUI_Preferences::VIEWER_SECTION) { + if (aSection == ModuleBase_Preferences::VIEWER_SECTION) { if (!isSalomeMode()) myMainWindow->viewer()->updateFromResources(); - } else if (aSection == XGUI_Preferences::MENU_SECTION) { + } else if (aSection == ModuleBase_Preferences::MENU_SECTION) { if (!isSalomeMode()) myMainWindow->menuObject()->updateFromResources(); } @@ -925,14 +1008,13 @@ void XGUI_Workshop::updateCommandStatus() if (isSalomeMode()) { // update commands in SALOME mode aCommands = salomeConnector()->commandList(); } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - foreach (XGUI_Command* aCmd, aMenuBar->features()) + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); + foreach (AppElements_Command* aCmd, aMenuBar->features()) aCommands.append(aCmd); } SessionPtr aMgr = ModelAPI_Session::get(); if (aMgr->hasModuleDocument()) { - QAction* aUndoCmd; - QAction* aRedoCmd; + QAction *aUndoCmd, *aRedoCmd; foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "UNDO_CMD") @@ -943,8 +1025,8 @@ void XGUI_Workshop::updateCommandStatus() // Enable all commands aCmd->setEnabled(true); } - aUndoCmd->setEnabled(aMgr->canUndo()); - aRedoCmd->setEnabled(aMgr->canRedo()); + aUndoCmd->setEnabled(aMgr->canUndo() && !aMgr->isOperation()); + aRedoCmd->setEnabled(aMgr->canRedo() && !aMgr->isOperation()); } else { foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); @@ -966,8 +1048,8 @@ QList XGUI_Workshop::getModuleCommands() const if (isSalomeMode()) { // update commands in SALOME mode aCommands = salomeConnector()->commandList(); } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - foreach(XGUI_Command* aCmd, aMenuBar->features()) + AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); + foreach(AppElements_Command* aCmd, aMenuBar->features()) { aCommands.append(aCmd); } @@ -1004,15 +1086,18 @@ void XGUI_Workshop::createDockWidgets() aDesktop->addDockWidget(Qt::LeftDockWidgetArea, aObjDock); myPropertyPanel = new XGUI_PropertyPanel(aDesktop); myPropertyPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); + + connect(myPropertyPanel, SIGNAL(noMoreWidgets()), myModule, SLOT(onNoMoreWidgets())); + aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanel); myPropertyPanel->installEventFilter(myOperationMgr); - QPushButton* aOkBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_OK); + QPushButton* aOkBtn = myPropertyPanel->findChild(PROP_PANEL_OK); connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation())); - QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_CANCEL); + QPushButton* aCancelBtn = myPropertyPanel->findChild(PROP_PANEL_CANCEL); connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation())); connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr, SLOT(onKeyReleased(QKeyEvent*))); @@ -1068,7 +1153,7 @@ void XGUI_Workshop::changeCurrentDocument(ObjectPtr theObj) { SessionPtr aMgr = ModelAPI_Session::get(); if (theObj) { - ResultPartPtr aPart = boost::dynamic_pointer_cast(theObj); + ResultPartPtr aPart = std::dynamic_pointer_cast(theObj); if (aPart) { DocumentPtr aPartDoc = aPart->partDoc(); if (aPartDoc) { @@ -1095,9 +1180,9 @@ ModuleBase_IViewer* XGUI_Workshop::salomeViewer() const //************************************************************** void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) { - QList aObjects = mySelector->selection()->selectedObjects(); + QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); if ((theId == "ACTIVATE_PART_CMD") && (aObjects.size() > 0)) { - ResultPartPtr aPart = boost::dynamic_pointer_cast(aObjects.first()); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObjects.first()); activatePart(aPart); } else if (theId == "DEACTIVATE_PART_CMD") activatePart(ResultPartPtr()); @@ -1115,6 +1200,11 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) setDisplayMode(aObjects, XGUI_Displayer::Wireframe); else if (theId == "HIDEALL_CMD") myDisplayer->eraseAll(); + else if (theId == "EDIT_CMD") { + FeaturePtr aFeature = std::dynamic_pointer_cast(aObjects.first()); + if (aFeature) + myModule->editFeature(aFeature); + } } //************************************************************** @@ -1158,14 +1248,14 @@ void XGUI_Workshop::activateLastPart() DocumentPtr aDoc = aMgr->moduleDocument(); std::string aGrpName = ModelAPI_ResultPart::group(); ObjectPtr aLastPart = aDoc->object(aGrpName, aDoc->size(aGrpName) - 1); - ResultPartPtr aPart = boost::dynamic_pointer_cast(aLastPart); + ResultPartPtr aPart = std::dynamic_pointer_cast(aLastPart); if (aPart) { activatePart(aPart); } } //************************************************************** -void XGUI_Workshop::deleteObjects(const QList& theList) +void XGUI_Workshop::deleteObjects(const QObjectPtrList& theList) { QMainWindow* aDesktop = isSalomeMode() ? salomeConnector()->desktop() : myMainWindow; QMessageBox::StandardButton aRes = QMessageBox::warning( @@ -1177,7 +1267,7 @@ void XGUI_Workshop::deleteObjects(const QList& theList) aMgr->startOperation(); foreach (ObjectPtr aObj, theList) { - ResultPartPtr aPart = boost::dynamic_pointer_cast(aObj); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObj); if (aPart) { DocumentPtr aDoc = aPart->document(); if (aDoc == aMgr->activeDocument()) { @@ -1185,7 +1275,7 @@ void XGUI_Workshop::deleteObjects(const QList& theList) } //aMgr->moduleDocument()->removeFeature(aPart->owner()); } else { - FeaturePtr aFeature = boost::dynamic_pointer_cast(aObj); + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); if (aFeature) aObj->document()->removeFeature(aFeature); } @@ -1196,27 +1286,23 @@ void XGUI_Workshop::deleteObjects(const QList& theList) } //************************************************************** -void XGUI_Workshop::showObjects(const QList& theList, bool isVisible) +void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) { foreach (ObjectPtr aObj, theList) { - ResultPtr aRes = boost::dynamic_pointer_cast(aObj); - if (aRes) { - if (isVisible) { - myDisplayer->display(aRes, false); - } else { - myDisplayer->erase(aRes, false); - } + if (isVisible) { + myDisplayer->display(aObj, false); + } else { + myDisplayer->erase(aObj, false); } } myDisplayer->updateViewer(); } //************************************************************** -void XGUI_Workshop::showOnlyObjects(const QList& theList) +void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) { - myDisplayer->eraseAll(false); - showObjects(theList, true); + myDisplayer->showOnly(theList); } @@ -1275,7 +1361,7 @@ void XGUI_Workshop::displayAllResults() displayDocumentResults(aRootDoc); for (int i = 0; i < aRootDoc->size(ModelAPI_ResultPart::group()); i++) { ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), i); - ResultPartPtr aPart = boost::dynamic_pointer_cast(aObject); + ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); displayDocumentResults(aPart->partDoc()); } myDisplayer->updateViewer(); @@ -1298,7 +1384,7 @@ void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup } //************************************************************** -void XGUI_Workshop::setDisplayMode(const QList& theList, int theMode) +void XGUI_Workshop::setDisplayMode(const QObjectPtrList& theList, int theMode) { foreach(ObjectPtr aObj, theList) { myDisplayer->setDisplayMode(aObj, (XGUI_Displayer::DisplayMode)theMode, false); @@ -1306,3 +1392,15 @@ void XGUI_Workshop::setDisplayMode(const QList& theList, int theMode) if (theList.size() > 0) myDisplayer->updateViewer(); } + +//************************************************************** +void XGUI_Workshop::closeDocument() +{ + myDisplayer->closeLocalContexts(); + myDisplayer->eraseAll(); + objectBrowser()->clearContent(); + + SessionPtr aMgr = ModelAPI_Session::get(); + aMgr->closeAll(); + objectBrowser()->clearContent(); +}