X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=fa583caead741b96b4c821e5adfb8c5a49a147cb;hb=dc158ea248a9bbd70675887f494388c93e1b3b4d;hp=fec644039bdd94d6cdf17f3becf425bfc5402230;hpb=c3abf4152cb6f2fce8a3c528f9104c0058f3cc3c;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index fec644039..fa583caea 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,30 +1,34 @@ -#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" #include "XGUI_Displayer.h" #include "XGUI_OperationMgr.h" #include "XGUI_SalomeConnector.h" -#include "XGUI_SalomeViewer.h" #include "XGUI_ActionsMgr.h" #include "XGUI_ErrorDialog.h" #include "XGUI_ViewerProxy.h" #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 #include #include #include @@ -33,7 +37,7 @@ #include #include -#include +//#include #include #include @@ -43,12 +47,17 @@ #include #include #include -#include "ModuleBase_WidgetFactory.h" +#include +#include +#include +#include #include #include #include #include +#include +#include #include #include @@ -57,10 +66,12 @@ #include #include #include -#include +#include +#include #ifdef _DEBUG #include +#include #endif #ifdef WIN32 @@ -71,12 +82,41 @@ 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); + } + break; + 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) @@ -86,9 +126,11 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) mySalomeConnector(theConnector), myPropertyPanel(0), myObjectBrowser(0), - myDisplayer(0) + myDisplayer(0), + myUpdatePrefs(false), + myPartActivating(false) { - myMainWindow = mySalomeConnector ? 0 : new XGUI_MainWindow(); + myMainWindow = mySalomeConnector ? 0 : new AppElements_MainWindow(); myDisplayer = new XGUI_Displayer(this); @@ -103,50 +145,66 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) SLOT(onContextMenuCommand(const QString&, bool))); myViewerProxy = new XGUI_ViewerProxy(this); - connect(myViewerProxy, SIGNAL(selectionChanged()), this, SLOT(updateCommandsOnViewSelection())); + connect(myViewerProxy, SIGNAL(selectionChanged()), + myActionsMgr, SLOT(updateOnViewSelection())); myModuleConnector = new XGUI_ModuleConnector(this); - connect(myOperationMgr, SIGNAL(operationStarted()), SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationResumed()), SLOT(onOperationStarted())); + connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), + SLOT(onOperationStarted(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationResumed(ModuleBase_Operation*)), + SLOT(onOperationResumed(ModuleBase_Operation*))); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), SLOT(onOperationStopped(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationCommitted(ModuleBase_Operation*)), + SLOT(onOperationCommitted(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), + SLOT(onOperationAborted(ModuleBase_Operation*))); connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); - connect(myOperationMgr, SIGNAL(operationStarted()), myActionsMgr, SLOT(update())); - connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), myActionsMgr, - SLOT(update())); connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } //****************************************************** XGUI_Workshop::~XGUI_Workshop(void) { + delete myDisplayer; } //****************************************************** 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)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); aLoop->registerListener(this, Events_Loop::eventByName("LongOperation")); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); + 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(); } @@ -157,22 +215,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(); + salomeConnector()->addDesktopMenuSeparator("MEN_DESK_EDIT"); + aAction = salomeConnector()->addDesktopCommand("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), + QIcon(":pictures/rebuild.png"), QKeySequence(), + false, "MEN_DESK_EDIT"); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRebuild())); + 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); @@ -188,10 +263,11 @@ void XGUI_Workshop::initMenu() aCommand->connectTo(this, SLOT(onRedo())); aCommand = aGroup->addFeature("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), - QIcon(":pictures/rebuild.png")); + QIcon(":pictures/rebuild.png"), QKeySequence()); + aCommand->connectTo(this, SLOT(onRebuild())); aCommand = aGroup->addFeature("SAVEAS_CMD", tr("Save as..."), tr("Save the document into a file"), - QIcon(":pictures/save.png")); + QIcon(":pictures/save.png"), QKeySequence()); aCommand->connectTo(this, SLOT(onSaveAs())); //aCommand->disable(); @@ -219,70 +295,103 @@ 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 Events_Message* theMessage) +void XGUI_Workshop::processEvent(const std::shared_ptr& theMessage) { + if (QApplication::instance()->thread() != QThread::currentThread()) { + #ifdef _DEBUG + std::cout << "XGUI_Workshop::processEvent: " << "Working in another thread." << std::endl; + #endif + SessionPtr aMgr = ModelAPI_Session::get(); + PostponeMessageQtEvent* aPostponeEvent = new PostponeMessageQtEvent(theMessage); + QApplication::postEvent(this, aPostponeEvent); + return; + } + //A message to start feature creation received. - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_LOADED)) { - const Config_FeatureMessage* aFeatureMsg = - dynamic_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); } - return; } // Process creation of Part - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { - const ModelAPI_ObjectUpdatedMessage* aUpdMsg = - dynamic_cast(theMessage); + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); onFeatureCreatedMsg(aUpdMsg); - return; + if (myUpdatePrefs) { + if (mySalomeConnector) + mySalomeConnector->createPreferences(); + myUpdatePrefs = false; + } + } + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_PLUGIN_LOADED)) { + myUpdatePrefs = true; } // Redisplay feature - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { - const ModelAPI_ObjectUpdatedMessage* aUpdMsg = - dynamic_cast(theMessage); + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); - return; } //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. - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { - const ModelAPI_ObjectUpdatedMessage* anUpdateMsg = - dynamic_cast(theMessage); + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); onFeatureUpdatedMsg(anUpdateMsg); - return; } - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { - const ModelAPI_ObjectDeletedMessage* aDelMsg = - dynamic_cast(theMessage); + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { + std::shared_ptr aDelMsg = + std::dynamic_pointer_cast(theMessage); onObjectDeletedMsg(aDelMsg); - return; } - if (theMessage->eventID() == Events_LongOp::eventID()) { + else if (theMessage->eventID() == Events_LongOp::eventID()) { if (Events_LongOp::isPerformed()) QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - //QTimer::singleShot(10, this, SLOT(onStartWaiting())); else QApplication::restoreOverrideCursor(); - return; + } + + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) { + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); + const std::set& aObjList = anUpdateMsg->objects(); + QObjectPtrList aList; + std::set::const_iterator aIt; + for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) + aList.append(*aIt); + showObjects(aList, true); + } + + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOHIDE)) { + std::shared_ptr anUpdateMsg = + std::dynamic_pointer_cast(theMessage); + const std::set& aObjList = anUpdateMsg->objects(); + QObjectPtrList aList; + std::set::const_iterator aIt; + for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) + aList.append(*aIt); + showObjects(aList, false); } //An operation passed by message. Start it, process and commit. - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { - const Config_PointerMessage* aPartSetMsg = - dynamic_cast(theMessage); + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { + std::shared_ptr aPartSetMsg = + std::dynamic_pointer_cast(theMessage); //myPropertyPanel->cleanContent(); ModuleBase_Operation* anOperation = (ModuleBase_Operation*) aPartSetMsg->pointer(); @@ -293,15 +402,59 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) updateCommandStatus(); } } - return; } - //Show error dialog if error message received. - const Events_Error* anAppError = dynamic_cast(theMessage); - if (anAppError) { - emit errorOccurred(QString::fromLatin1(anAppError->description())); + else if (theMessage->eventID() == Events_Loop::loop()->eventByName("CurrentDocumentChanged")) { + myActionsMgr->update(); + // Find and Activate active part + if (myPartActivating) + return; + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aActiveDoc = aMgr->activeDocument(); + DocumentPtr aDoc = aMgr->moduleDocument(); + if (aActiveDoc == aDoc) { + activatePart(ResultPartPtr()); + return; + } + std::string aGrpName = ModelAPI_ResultPart::group(); + for (int i = 0; i < aDoc->size(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; + } + } + // If not found then activate global document + activatePart(ResultPartPtr()); + + } + else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_SELFILTER_LOADED)) { + std::shared_ptr aMsg = + std::dynamic_pointer_cast(theMessage); + if (aMsg) { + ModuleBase_FilterFactory* aFactory = moduleConnector()->selectionFilters(); + if (!aMsg->attributeId().empty()) { + aFactory->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId(), + aMsg->parameters()); + } + } + } + + + else { + //Show error dialog if error message received. + std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); + if (anAppError) { + emit errorOccurred(QString::fromLatin1(anAppError->description())); + } + } + if (!isSalomeMode()) { + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->isModified() != myMainWindow->isModifiedState()) + myMainWindow->setModifiedState(aMgr->isModified()); } } + //****************************************************** void XGUI_Workshop::onStartWaiting() { @@ -311,7 +464,7 @@ void XGUI_Workshop::onStartWaiting() } //****************************************************** -void XGUI_Workshop::onFeatureUpdatedMsg(const ModelAPI_ObjectUpdatedMessage* theMsg) +void XGUI_Workshop::onFeatureUpdatedMsg(const std::shared_ptr& theMsg) { std::set aFeatures = theMsg->objects(); if (myOperationMgr->hasOperation()) { @@ -325,26 +478,42 @@ void XGUI_Workshop::onFeatureUpdatedMsg(const ModelAPI_ObjectUpdatedMessage* the } } } - myOperationMgr->validateCurrentOperation(); + myOperationMgr->onValidateOperation(); + if (myObjectBrowser) + myObjectBrowser->processEvent(theMsg); } //****************************************************** -void XGUI_Workshop::onFeatureRedisplayMsg(const ModelAPI_ObjectUpdatedMessage* theMsg) +void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptr& theMsg) { std::set aObjects = theMsg->objects(); std::set::const_iterator aIt; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); - if (!aObj->data() || !aObj->data()->isValid()) + bool aHide = !aObj->data() || !aObj->data()->isValid(); + if (!aHide) { // check that this is not hidden result + ResultPtr aRes = std::dynamic_pointer_cast(aObj); + aHide = aRes && aRes->isConcealed(); + } + if (aHide) myDisplayer->erase(aObj, false); else { - if (myDisplayer->isVisible(aObj)) // TODO VSV: Correction sketch drawing + if (myDisplayer->isVisible(aObj)) { myDisplayer->display(aObj, false); // In order to update presentation - else { if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (aOperation->hasObject(aObj)) { // Display only current operation results + 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()*/) { myDisplayer->display(aObj, false); + // Deactivate object of current operation from selection + if (myDisplayer->isActive(aObj)) + myDisplayer->deactivate(aObj); } } } @@ -354,7 +523,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const ModelAPI_ObjectUpdatedMessage* t } //****************************************************** -void XGUI_Workshop::onFeatureCreatedMsg(const ModelAPI_ObjectUpdatedMessage* theMsg) +void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptr& theMsg) { std::set aObjects = theMsg->objects(); @@ -362,7 +531,7 @@ void XGUI_Workshop::onFeatureCreatedMsg(const ModelAPI_ObjectUpdatedMessage* the bool aHasPart = false; bool isDisplayed = false; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { - ResultPartPtr aPart = boost::dynamic_pointer_cast(*aIt); + ResultPartPtr aPart = std::dynamic_pointer_cast(*aIt); if (aPart) { aHasPart = true; // If a feature is created from the aplication's python console @@ -375,60 +544,52 @@ void XGUI_Workshop::onFeatureCreatedMsg(const ModelAPI_ObjectUpdatedMessage* the } } } + if (myObjectBrowser) + myObjectBrowser->processEvent(theMsg); if (isDisplayed) myDisplayer->updateViewer(); - if (aHasPart) { - //The created part will be created in Object Browser later and we have to activate it - // only when it is created everywere - QTimer::singleShot(50, this, SLOT(activateLastPart())); - } + //if (aHasPart) { // TODO: Avoid activate last part on loading of document + // activateLastPart(); + //} } //****************************************************** -void XGUI_Workshop::onObjectDeletedMsg(const ModelAPI_ObjectDeletedMessage* theMsg) +void XGUI_Workshop::onObjectDeletedMsg(const std::shared_ptr& theMsg) { + if (myObjectBrowser) + myObjectBrowser->processEvent(theMsg); //std::set aFeatures = theMsg->objects(); } //****************************************************** -void XGUI_Workshop::onOperationStarted() +void XGUI_Workshop::onOperationStarted(ModuleBase_Operation* theOperation) { - ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - aOperation->setNestedFeatures(myActionsMgr->nestedCommands(aOperation->id())); - - if (aOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel - connectWithOperation(aOperation); - - showPropertyPanel(); - QString aXmlRepr = aOperation->getDescription()->xmlRepresentation(); - ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), - myModuleConnector); - - myPropertyPanel->cleanContent(); - aFactory.createWidget(myPropertyPanel->contentWidget()); - - QList aWidgets = aFactory.getModelWidgets(); - QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); - ModuleBase_ModelWidget* aWidget; - for (; anIt != aLast; anIt++) { - aWidget = *anIt; - aWidget->setFeature(aOperation->feature()); - //QObject::connect(aWidget, SIGNAL(valuesChanged()), aOperation, SLOT(storeCustomValue())); - QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); - // Init default values - if (!aOperation->isEditOperation()) { - //aWidget->storeValue(aOperation->feature()); - - aWidget->storeValue(); - } - } + setNestedFeatures(theOperation); - myPropertyPanel->setModelWidgets(aWidgets); - myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); + if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel + connectWithOperation(theOperation); + setPropertyPanel(theOperation); } updateCommandStatus(); + + myModule->operationStarted(theOperation); } +//****************************************************** +void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) +{ + setNestedFeatures(theOperation); + + if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel + connectWithOperation(theOperation); + setPropertyPanel(theOperation); + } + updateCommandStatus(); + + myModule->operationResumed(theOperation); +} + + //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { @@ -436,12 +597,82 @@ 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); + } + myModule->operationStopped(theOperation); +} + + +void XGUI_Workshop::onOperationCommitted(ModuleBase_Operation* theOperation) +{ + myModule->operationCommitted(theOperation); +} + +void XGUI_Workshop::onOperationAborted(ModuleBase_Operation* theOperation) +{ + myModule->operationAborted(theOperation); +} + +void XGUI_Workshop::setNestedFeatures(ModuleBase_Operation* theOperation) +{ + if (this->isSalomeMode()) + theOperation->setNestedFeatures(mySalomeConnector->nestedActions(theOperation->id())); + else + theOperation->setNestedFeatures(myActionsMgr->nestedCommands(theOperation->id())); +} + +void XGUI_Workshop::setPropertyPanel(ModuleBase_Operation* theOperation) +{ + showPropertyPanel(); + QString aXmlRepr = theOperation->getDescription()->xmlRepresentation(); + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), + myModuleConnector); + + myPropertyPanel->cleanContent(); + aFactory.createWidget(myPropertyPanel->contentWidget()); + ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget()); + + QList aWidgets = aFactory.getModelWidgets(); + foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { + aWidget->setFeature(theOperation->feature()); + aWidget->enableFocusProcessing(); + QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); + // Init default values + if (!theOperation->isEditOperation() && !aWidget->isComputedDefault()) { + aWidget->storeValue(); + } + } + + myPropertyPanel->setModelWidgets(aWidgets); + theOperation->setPropertyPanel(myPropertyPanel); + + myModule->propertyPanelDefined(theOperation); + + myPropertyPanel->setWindowTitle(theOperation->getDescription()->description()); +} + +bool XGUI_Workshop::event(QEvent * theEvent) +{ + PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); + if (aPostponedEv) { + std::shared_ptr aEventPtr = aPostponedEv->postponedMessage(); + processEvent(aEventPtr); + return true; + } + return false; } /* * */ -void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) +void XGUI_Workshop::addFeature(const std::shared_ptr& theMessage) { if (!theMessage) { #ifdef _DEBUG @@ -462,35 +693,41 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) QString::fromStdString(theMessage->text()), QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), - QKeySequence(), isUsePropPanel); - salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ")); + QKeySequence(), + isUsePropPanel); + salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ", QString::SkipEmptyParts)); + 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); } + QString aDocKind = QString::fromStdString(theMessage->documentKind()); // Check if hotkey sequence is already defined: 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()), aHotKey, + QIcon(theMessage->icon().c_str()), + aDocKind, + aHotKey, isUsePropPanel); aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aCommand); - myModule->featureCreated(aCommand); + myModule->actionCreated(aCommand); } } @@ -505,32 +742,38 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) if (isSalomeMode()) { aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); } else { - XGUI_MainMenu* aMenu = myMainWindow->menuObject(); - aCommand = aMenu->feature(theOperation->getDescription()->operationId()); + AppElements_MainMenu* aMenu = myMainWindow->menuObject(); + FeaturePtr aFeature = theOperation->feature(); + if(aFeature) + aCommand = aMenu->feature(QString::fromStdString(aFeature->getKind())); } //Abort operation on uncheck the command - if (aCommand) + if (aCommand) { connect(aCommand, SIGNAL(triggered(bool)), theOperation, SLOT(setRunning(bool))); + } } /* * Saves document with given name. */ -void XGUI_Workshop::saveDocument(QString theName) +void XGUI_Workshop::saveDocument(const QString& theName, std::list& theFileNames) { QApplication::restoreOverrideCursor(); - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aDoc = aMgr->rootDocument(); - aDoc->save(theName.toLatin1().constData()); + SessionPtr aMgr = ModelAPI_Session::get(); + aMgr->save(theName.toLatin1().constData(), theFileNames); QApplication::restoreOverrideCursor(); } +bool XGUI_Workshop::isActiveOperationAborted() +{ + return myOperationMgr->abortAllOperations(); +} + //****************************************************** void XGUI_Workshop::onExit() { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aDoc = aMgr->rootDocument(); - if (aDoc->isModified()) { + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->isModified()) { int anAnswer = QMessageBox::question( myMainWindow, tr("Save current file"), tr("The document is modified, save before exit?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); @@ -569,10 +812,11 @@ void XGUI_Workshop::onNew() //****************************************************** void XGUI_Workshop::onOpen() { + if(!isActiveOperationAborted()) + return; //save current file before close if modified - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aDoc = aMgr->rootDocument(); - if (aDoc->isModified()) { + SessionPtr aSession = ModelAPI_Session::get(); + if (aSession->isModified()) { //TODO(sbh): re-launch the app? int anAnswer = QMessageBox::question( myMainWindow, tr("Save current file"), @@ -583,7 +827,7 @@ void XGUI_Workshop::onOpen() } else if (anAnswer == QMessageBox::Cancel) { return; } - aDoc->close(); + aSession->closeAll(); myCurrentDir = ""; } @@ -598,7 +842,7 @@ void XGUI_Workshop::onOpen() return; } QApplication::setOverrideCursor(Qt::WaitCursor); - aDoc->load(myCurrentDir.toLatin1().constData()); + aSession->load(myCurrentDir.toLatin1().constData()); myObjectBrowser->rebuildDataTree(); displayAllResults(); updateCommandStatus(); @@ -608,17 +852,24 @@ void XGUI_Workshop::onOpen() //****************************************************** bool XGUI_Workshop::onSave() { + if(!isActiveOperationAborted()) + return false; if (myCurrentDir.isEmpty()) { return onSaveAs(); } - saveDocument(myCurrentDir); + std::list aFiles; + saveDocument(myCurrentDir, aFiles); updateCommandStatus(); + if (!isSalomeMode()) + myMainWindow->setModifiedState(false); return true; } //****************************************************** bool XGUI_Workshop::onSaveAs() { + if(!isActiveOperationAborted()) + return false; QFileDialog dialog(mainWindow()); dialog.setWindowTitle(tr("Select directory to save files...")); dialog.setFileMode(QFileDialog::Directory); @@ -643,6 +894,10 @@ bool XGUI_Workshop::onSaveAs() } } myCurrentDir = aTempDir; + if (!isSalomeMode()) { + myMainWindow->setCurrentDir(myCurrentDir, false); + myMainWindow->setModifiedState(false); + } return onSave(); } @@ -650,11 +905,10 @@ bool XGUI_Workshop::onSaveAs() void XGUI_Workshop::onUndo() { objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aDoc = aMgr->rootDocument(); - if (aDoc->isOperation()) - operationMgr()->abortOperation(); - aDoc->undo(); + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->isOperation()) + operationMgr()->onAbortOperation(); + aMgr->undo(); updateCommandStatus(); } @@ -662,28 +916,43 @@ void XGUI_Workshop::onUndo() void XGUI_Workshop::onRedo() { objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aDoc = aMgr->rootDocument(); - if (aDoc->isOperation()) - operationMgr()->abortOperation(); - aDoc->redo(); + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->isOperation()) + operationMgr()->onAbortOperation(); + aMgr->redo(); updateCommandStatus(); } +//****************************************************** +void XGUI_Workshop::onRebuild() +{ + SessionPtr aMgr = ModelAPI_Session::get(); + bool aWasOperation = aMgr->isOperation(); // keep this value + if (!aWasOperation) { + aMgr->startOperation(); + } + static const Events_ID aRebuildEvent = Events_Loop::loop()->eventByName("Rebuild"); + Events_Loop::loop()->send(std::shared_ptr( + new Events_Message(aRebuildEvent, this))); + if (!aWasOperation) { + aMgr->finishOperation(); + } +} + //****************************************************** 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(); } @@ -738,11 +1007,11 @@ ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule) } #endif - ModuleBase_IModule* aModule = crtInst ? crtInst(this) : 0; + ModuleBase_IModule* aModule = crtInst ? crtInst(myModuleConnector) : 0; if (!err.isEmpty()) { if (mainWindow()) { - QMessageBox::warning(mainWindow(), tr("Error"), err); + Events_Error::send(err.toStdString()); } else { qWarning(qPrintable(err)); } @@ -770,16 +1039,14 @@ 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); } - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - if (aMgr->hasRootDocument()) { - QAction* aUndoCmd; - QAction* aRedoCmd; - foreach(QAction* aCmd, aCommands) - { + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->hasModuleDocument()) { + QAction *aUndoCmd, *aRedoCmd; + foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "UNDO_CMD") aUndoCmd = aCmd; @@ -789,12 +1056,10 @@ void XGUI_Workshop::updateCommandStatus() // Enable all commands aCmd->setEnabled(true); } - DocumentPtr aDoc = aMgr->rootDocument(); - aUndoCmd->setEnabled(aDoc->canUndo()); - aRedoCmd->setEnabled(aDoc->canRedo()); + aUndoCmd->setEnabled(aMgr->canUndo() && !aMgr->isOperation()); + aRedoCmd->setEnabled(aMgr->canRedo() && !aMgr->isOperation()); } else { - foreach(QAction* aCmd, aCommands) - { + foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "NEW_CMD") aCmd->setEnabled(true); @@ -805,22 +1070,7 @@ void XGUI_Workshop::updateCommandStatus() } } myActionsMgr->update(); -} - -//****************************************************** -QList XGUI_Workshop::getModuleCommands() const -{ - QList aCommands; - if (isSalomeMode()) { // update commands in SALOME mode - aCommands = salomeConnector()->commandList(); - } else { - XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); - foreach(XGUI_Command* aCmd, aMenuBar->features()) - { - aCommands.append(aCmd); - } - } - return aCommands; + emit commandStatusUpdated(); } //****************************************************** @@ -852,23 +1102,21 @@ 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(const std::string&, QKeyEvent*)), myOperationMgr, - SLOT(onKeyReleased(const std::string&, QKeyEvent*))); - - connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), myOperationMgr, - SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); - connect(myOperationMgr, SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)), myPropertyPanel, - SLOT(onActivateNextWidget(ModuleBase_ModelWidget*))); + connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr, + SLOT(onKeyReleased(QKeyEvent*))); connect(myOperationMgr, SIGNAL(operationValidated(bool)), myPropertyPanel, SLOT(setAcceptEnabled(bool))); @@ -919,18 +1167,18 @@ void XGUI_Workshop::onFeatureTriggered() //****************************************************** void XGUI_Workshop::changeCurrentDocument(ObjectPtr theObj) { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + 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) { - aMgr->setCurrentDocument(aPartDoc); + aMgr->setActiveDocument(aPartDoc); return; } } } - aMgr->setCurrentDocument(aMgr->rootDocument()); + aMgr->setActiveDocument(aMgr->moduleDocument()); } //****************************************************** @@ -940,7 +1188,7 @@ void XGUI_Workshop::salomeViewerSelectionChanged() } //************************************************************** -XGUI_SalomeViewer* XGUI_Workshop::salomeViewer() const +ModuleBase_IViewer* XGUI_Workshop::salomeViewer() const { return mySalomeConnector->viewer(); } @@ -948,9 +1196,9 @@ XGUI_SalomeViewer* 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()); @@ -962,6 +1210,17 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) showObjects(aObjects, false); else if (theId == "SHOW_ONLY_CMD") showOnlyObjects(aObjects); + else if (theId == "SHADING_CMD") + setDisplayMode(aObjects, XGUI_Displayer::Shading); + else if (theId == "WIREFRAME_CMD") + 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); + } } //************************************************************** @@ -971,15 +1230,12 @@ void XGUI_Workshop::onWidgetValuesChanged() FeaturePtr aFeature = anOperation->feature(); ModuleBase_ModelWidget* aSenderWidget = dynamic_cast(sender()); - //if (aCustom) - // aCustom->storeValue(aFeature); const QList& aWidgets = myPropertyPanel->modelWidgets(); QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); for (; anIt != aLast; anIt++) { ModuleBase_ModelWidget* aCustom = *anIt; - if (aCustom && (/*!aCustom->isInitialized(aFeature) ||*/aCustom == aSenderWidget)) { - //aCustom->storeValue(aFeature); + if (aCustom && (aCustom == aSenderWidget)) { aCustom->storeValue(); } } @@ -988,26 +1244,31 @@ void XGUI_Workshop::onWidgetValuesChanged() //************************************************************** void XGUI_Workshop::activatePart(ResultPartPtr theFeature) { - if (theFeature) - theFeature->activate(); - changeCurrentDocument(theFeature); - myObjectBrowser->activatePart(theFeature); + if (!myPartActivating) { + myPartActivating = true; + if (theFeature) + theFeature->activate(); + changeCurrentDocument(theFeature); + myObjectBrowser->activatePart(theFeature); + myPartActivating = false; + } } //************************************************************** void XGUI_Workshop::activateLastPart() { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aDoc = aMgr->rootDocument(); + SessionPtr aMgr = ModelAPI_Session::get(); + 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); - if (aPart) + 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( @@ -1015,98 +1276,65 @@ void XGUI_Workshop::deleteObjects(const QList& theList) QMessageBox::No | QMessageBox::Yes, QMessageBox::No); // ToDo: definbe deleting method if (aRes == QMessageBox::Yes) { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - aMgr->rootDocument()->startOperation(); + SessionPtr aMgr = ModelAPI_Session::get(); + 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->currentDocument()) { + if (aDoc == aMgr->activeDocument()) { aDoc->close(); } - //aMgr->rootDocument()->removeFeature(aPart->owner()); + //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); } } myDisplayer->updateViewer(); - aMgr->rootDocument()->finishOperation(); + aMgr->finishOperation(); } } //************************************************************** -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); } -//************************************************************** -void XGUI_Workshop::updateCommandsOnViewSelection() -{ - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - XGUI_Selection* aSelection = mySelector->selection(); - if (aSelection->getSelected().size() == 0) - return; - - QList aActions = getModuleCommands(); - foreach(QAction* aAction, aActions) - { - QString aId = aAction->data().toString(); - std::list aValidators; - std::list > anArguments; - aFactory->validators(aId.toStdString(), aValidators, anArguments); - std::list::iterator aValidator = aValidators.begin(); - for (; aValidator != aValidators.end(); aValidator++) { - if (*aValidator) { - const ModuleBase_SelectionValidator* aSelValidator = - dynamic_cast(*aValidator); - if (aSelValidator) { - aAction->setEnabled(aSelValidator->isValid(aSelection)); - } - } - } - } -} - //************************************************************** void XGUI_Workshop::registerValidators() const { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); } //************************************************************** void XGUI_Workshop::displayAllResults() { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - DocumentPtr aRootDoc = aMgr->rootDocument(); + SessionPtr aMgr = ModelAPI_Session::get(); + DocumentPtr aRootDoc = aMgr->moduleDocument(); 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(); @@ -1127,3 +1355,25 @@ void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup for (int i = 0; i < theDoc->size(theGroup); i++) myDisplayer->display(theDoc->object(theGroup, i), false); } + +//************************************************************** +void XGUI_Workshop::setDisplayMode(const QObjectPtrList& theList, int theMode) +{ + foreach(ObjectPtr aObj, theList) { + myDisplayer->setDisplayMode(aObj, (XGUI_Displayer::DisplayMode)theMode, false); + } + 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(); +}