X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=b5b0b5f6baeeb50b95d9cd621859c12dd4d9cfdf;hb=47c18d4de2719126f6b045b5c37525cd8f170aa1;hp=a5d6cddab790c12b436efa0c78a10778484ca614;hpb=d0350421b47740df5540b8165ac7643657cccf66;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index a5d6cddab..b5b0b5f6b 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -1,4 +1,4 @@ -#include "XGUI_Module.h" +#include "ModuleBase_IModule.h" #include "XGUI_Constants.h" #include "XGUI_Command.h" #include "XGUI_MainMenu.h" @@ -10,6 +10,7 @@ #include "XGUI_Viewer.h" #include "ModuleBase_WidgetFactory.h" #include "XGUI_SelectionMgr.h" +#include "XGUI_Selection.h" #include "XGUI_ObjectsBrowser.h" #include "XGUI_Displayer.h" #include "XGUI_OperationMgr.h" @@ -20,6 +21,7 @@ #include "XGUI_ViewerProxy.h" #include "XGUI_PropertyPanel.h" #include "XGUI_ContextMenuMgr.h" +#include "XGUI_ModuleConnector.h" #include #include @@ -27,12 +29,18 @@ #include #include #include +#include + +#include #include #include + #include #include #include +#include + #include #include #include @@ -71,7 +79,7 @@ QString XGUI_Workshop::featureIcon(const std::string& theId) XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) : QObject(), myCurrentDir(QString()), - myPartSetModule(NULL), + myModule(NULL), mySalomeConnector(theConnector), myPropertyPanel(0), myObjectBrowser(0), @@ -82,6 +90,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myDisplayer = new XGUI_Displayer(this); mySelector = new XGUI_SelectionMgr(this); + //connect(mySelector, SIGNAL(selectionChanged()), this, SLOT(updateModuleCommands())); myOperationMgr = new XGUI_OperationMgr(this); myActionsMgr = new XGUI_ActionsMgr(this); @@ -91,11 +100,16 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) this, SLOT(onContextMenuCommand(const QString&, bool))); myViewerProxy = new XGUI_ViewerProxy(this); - - connect(myOperationMgr, SIGNAL(operationStarted()), this, SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationResumed()), this, SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), - this, SLOT(onOperationStopped(ModuleBase_Operation*))); + connect(myViewerProxy, SIGNAL(selectionChanged()), this, SLOT(updateCommandsOnViewSelection())); + + myModuleConnector = new XGUI_ModuleConnector(this); + + connect(myOperationMgr, SIGNAL(operationStarted()), SLOT(onOperationStarted())); + connect(myOperationMgr, SIGNAL(operationResumed()), 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())); connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } @@ -112,14 +126,12 @@ void XGUI_Workshop::startApplication() 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] - Events_ID aFeatureId = aLoop->eventByName(EVENT_FEATURE_LOADED); - aLoop->registerListener(this, aFeatureId); - Events_ID aPartSetId = aLoop->eventByName("PartSetModuleEvent"); - aLoop->registerListener(this, aPartSetId); - Events_ID aFeatureUpdatedId = aLoop->eventByName(EVENT_FEATURE_UPDATED); - aLoop->registerListener(this, aFeatureUpdatedId); + 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(EVENT_OPERATION_LAUNCHED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_UPDATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_CREATED)); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_DELETED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_FEATURE_TO_REDISPLAY)); activateModule(); if (myMainWindow) { @@ -188,6 +200,12 @@ void XGUI_Workshop::initMenu() aCommand = aGroup->addFeature("EXIT_CMD", tr("Exit"), tr("Exit application"), QIcon(":pictures/close.png"), QKeySequence::Close); aCommand->connectTo(this, SLOT(onExit())); + //FIXME: SBH's test action. Can be used for some GUI tests. + //#ifdef _DEBUG + // aCommand = aGroup->addFeature("TEST_CMD", "Test!", "Private debug button", + // QIcon(":pictures/close.png")); + // aCommand->connectTo(myActionsMgr, SLOT(update())); + //#endif } //****************************************************** @@ -209,62 +227,36 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) } return; } + // Process creation of Part if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_CREATED)) { const Model_FeatureUpdatedMessage* aUpdMsg = dynamic_cast(theMessage); - std::set aFeatures = aUpdMsg->features(); - - std::set::const_iterator aIt; - bool aHasPart = false; - for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { - FeaturePtr aFeature = (*aIt); - if (aFeature->getKind() == "Part") { - aHasPart = true; - break; - } - } - 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())); - } + onFeatureCreatedMsg(aUpdMsg); } - // Process deletion of a part - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_DELETED)) { - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - if (aMgr->currentDocument() == aMgr->rootDocument()) - activatePart(FeaturePtr()); // Activate PartSet + // Redisplay feature + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_TO_REDISPLAY)) { + const Model_FeatureUpdatedMessage* aUpdMsg = dynamic_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. - static Events_ID aFeatureUpdatedId = Events_Loop::loop()->eventByName(EVENT_FEATURE_UPDATED); - if (theMessage->eventID() == aFeatureUpdatedId && myOperationMgr->hasOperation()) - { + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_UPDATED)) { const Model_FeatureUpdatedMessage* anUpdateMsg = dynamic_cast(theMessage); - std::set aFeatures = anUpdateMsg->features(); - - FeaturePtr aCurrentFeature = myOperationMgr->currentOperation()->feature(); - std::set::const_iterator aIt; - for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { - FeaturePtr aNewFeature = (*aIt); - if(aNewFeature == aCurrentFeature) { - myPropertyPanel->updateContentWidget(aCurrentFeature); - break; - } - } + onFeatureUpdatedMsg(anUpdateMsg); } + //An operation passed by message. Start it, process and commit. - const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); - if (aPartSetMsg) { - ModuleBase_Operation* anOperation = - (ModuleBase_Operation*)(aPartSetMsg->pointer()); + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { + const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); + //myPropertyPanel->cleanContent(); + ModuleBase_Operation* anOperation = (ModuleBase_Operation*)aPartSetMsg->pointer(); if (myOperationMgr->startOperation(anOperation)) { myPropertyPanel->updateContentWidget(anOperation->feature()); - if (anOperation->getDescription()->xmlRepresentation().isEmpty()) { + if (!anOperation->getDescription()->hasXmlRepresentation()) { anOperation->commit(); updateCommandStatus(); } @@ -275,47 +267,111 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) const Events_Error* anAppError = dynamic_cast(theMessage); if (anAppError) { emit errorOccurred(QString::fromLatin1(anAppError->description())); - myErrorDlg->show(); - myErrorDlg->raise(); - myErrorDlg->activateWindow(); } +} +//****************************************************** +void XGUI_Workshop::onFeatureUpdatedMsg(const Model_FeatureUpdatedMessage* theMsg) +{ + std::set aFeatures = theMsg->features(); + if (myOperationMgr->hasOperation()) + { + FeaturePtr aCurrentFeature = myOperationMgr->currentOperation()->feature(); + std::set::const_iterator aIt; + for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { + FeaturePtr aNewFeature = (*aIt); + if(aNewFeature == aCurrentFeature) { + myPropertyPanel->updateContentWidget(aCurrentFeature); + break; + } + } + } +} + +//****************************************************** +void XGUI_Workshop::onFeatureRedisplayMsg(const Model_FeatureUpdatedMessage* theMsg) +{ + std::set aFeatures = theMsg->features(); + std::set::const_iterator aIt; + bool isDisplayed = false; + for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { + FeaturePtr aFeature = (*aIt); + if (aFeature->getKind() != PARTSET_PART_KIND) { + isDisplayed = myDisplayer->redisplay(aFeature, false); + } + } + if (isDisplayed) + myDisplayer->updateViewer(); } +//****************************************************** +void XGUI_Workshop::onFeatureCreatedMsg(const Model_FeatureUpdatedMessage* theMsg) +{ + std::set aFeatures = theMsg->features(); + + std::set::const_iterator aIt; + bool aHasPart = false; + bool isDisplayed = false; + for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { + FeaturePtr aFeature = (*aIt); + if (aFeature->getKind() == PARTSET_PART_KIND) { + aHasPart = true; + //break; + } else { + isDisplayed = myDisplayer->display(aFeature, false); + } + } + 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())); + } +} + //****************************************************** void XGUI_Workshop::onOperationStarted() { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if(!aOperation->getDescription()->xmlRepresentation().isEmpty()) { //!< No need for property panel + 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; + //QObject::connect(aWidget, SIGNAL(valuesChanged()), aOperation, SLOT(storeCustomValue())); + QObject::connect(aWidget, SIGNAL(valuesChanged()), + this, SLOT(onWidgetValuesChanged())); + // Init default values + if (!aOperation->isEditOperation() && aWidget->hasDefaultValue()) { + aWidget->storeValue(aOperation->feature()); + } + } - ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation); - QWidget* aContent = myPropertyPanel->contentWidget(); - qDeleteAll(aContent->children()); - aFactory.createWidget(aContent); - myPropertyPanel->setModelWidgets(aFactory.getModelWidgets()); + myPropertyPanel->setModelWidgets(aWidgets); myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); } + updateCommandStatus(); } //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { - ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - //!< No need for property panel updateCommandStatus(); hidePropertyPanel(); - if(myOperationMgr->operationsCount() > 1) { - myActionsMgr->updateAction(theOperation->getDescription()->operationId()); - return; - } - if(!aOperation->getDescription()->xmlRepresentation().isEmpty()) { - myActionsMgr->restoreCommandState(); - } + myPropertyPanel->cleanContent(); } /* @@ -344,9 +400,9 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), QKeySequence(), isUsePropPanel); - myActionsMgr->addCommand(aAction); salomeConnector()->setNestedActions(aId, aNestedFeatures.split(" ")); - myPartSetModule->featureCreated(aAction); + myActionsMgr->addCommand(aAction); + myModule->featureCreated(aAction); } else { XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); @@ -366,9 +422,9 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), QKeySequence(), isUsePropPanel); - aCommand->setUnblockableCommands(aNestedFeatures.split(" ")); + aCommand->setNestedCommands(aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aCommand); - myPartSetModule->featureCreated(aCommand); + myModule->featureCreated(aCommand); } } @@ -413,7 +469,10 @@ void XGUI_Workshop::onExit() tr("The document is modified, save before exit?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Cancel); if(anAnswer == QMessageBox::Save) { - onSave(); + bool saved = onSave(); + if(!saved) { + return; + } } else if (anAnswer == QMessageBox::Cancel) { return; } @@ -437,6 +496,7 @@ void XGUI_Workshop::onNew() aWnd->showMaximized(); updateCommandStatus(); } + myContextMenuMgr->connectViewer(); QApplication::restoreOverrideCursor(); } @@ -473,23 +533,24 @@ void XGUI_Workshop::onOpen() } QApplication::setOverrideCursor(Qt::WaitCursor); aDoc->load(myCurrentDir.toLatin1().constData()); - QApplication::restoreOverrideCursor(); updateCommandStatus(); + myObjectBrowser->rebuildDataTree(); + QApplication::restoreOverrideCursor(); } //****************************************************** -void XGUI_Workshop::onSave() +bool XGUI_Workshop::onSave() { if(myCurrentDir.isEmpty()) { - onSaveAs(); - return; + return onSaveAs(); } saveDocument(myCurrentDir); updateCommandStatus(); + return true; } //****************************************************** -void XGUI_Workshop::onSaveAs() +bool XGUI_Workshop::onSaveAs() { QFileDialog dialog(mainWindow()); dialog.setWindowTitle(tr("Select directory to save files...")); @@ -499,20 +560,22 @@ void XGUI_Workshop::onSaveAs() dialog.setViewMode(QFileDialog::Detail); if(!dialog.exec()) { - return; + return false; } QString aTempDir = dialog.selectedFiles().first(); QDir aDir(aTempDir); if(aDir.exists() && !aDir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries).isEmpty()) { int answer = QMessageBox::question(myMainWindow, - QString(), + //: Title of the dialog which asks user if he wants to save study in existing non-empty folder + tr("Save"), tr("The folder already contains some files, save anyway?"), QMessageBox::Save|QMessageBox::Cancel); - if(answer == QMessageBox::Cancel) - return; + if(answer == QMessageBox::Cancel) { + return false; + } } myCurrentDir = aTempDir; - onSave(); + return onSave(); } //****************************************************** @@ -533,12 +596,14 @@ void XGUI_Workshop::onRedo() objectBrowser()->treeView()->setCurrentIndex(QModelIndex()); PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); DocumentPtr aDoc = aMgr->rootDocument(); + if (aDoc->isOperation()) + operationMgr()->abortOperation(); aDoc->redo(); updateCommandStatus(); } //****************************************************** -XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) +ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule) { QString libName = QString::fromStdString(library(theModule.toStdString())); @@ -586,7 +651,7 @@ XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) } #endif - XGUI_Module* aModule = crtInst ? crtInst(this) : 0; + ModuleBase_IModule* aModule = crtInst ? crtInst(this) : 0; if (!err.isEmpty()) { if (mainWindow()) { @@ -603,10 +668,11 @@ bool XGUI_Workshop::activateModule() { Config_ModuleReader aModuleReader; QString moduleName = QString::fromStdString(aModuleReader.getModuleName()); - myPartSetModule = loadModule(moduleName); - if (!myPartSetModule) + myModule = loadModule(moduleName); + if (!myModule) return false; - myPartSetModule->createFeatures(); + myModule->createFeatures(); + myActionsMgr->update(); return true; } @@ -648,6 +714,25 @@ void XGUI_Workshop::updateCommandStatus() aCmd->setEnabled(false); } } + 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_Workbench* aWb, aMenuBar->workbenches()) { + if (aWb != aMenuBar->generalPage()) { + foreach(XGUI_Command* aCmd, aWb->features()) + aCommands.append(aCmd); + } + } + } + return aCommands; } //****************************************************** @@ -656,6 +741,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) QDockWidget* aObjDock = new QDockWidget(theParent); aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); aObjDock->setWindowTitle(tr("Object browser")); + aObjDock->setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }"); myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock); connect(myObjectBrowser, SIGNAL(activePartChanged(FeaturePtr)), this, SLOT(changeCurrentDocument(FeaturePtr))); aObjDock->setWidget(myObjectBrowser); @@ -685,6 +771,14 @@ void XGUI_Workshop::createDockWidgets() connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation())); QPushButton* aCancelBtn = myPropertyPanel->findChild(XGUI::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*))); } //****************************************************** @@ -725,7 +819,7 @@ void XGUI_Workshop::onFeatureTriggered() if (aCmd) { QString aId = salomeConnector()->commandId(aCmd); if (!aId.isNull()) - myPartSetModule->launchOperation(aId); + myModule->launchOperation(aId); } } @@ -734,9 +828,15 @@ void XGUI_Workshop::changeCurrentDocument(FeaturePtr thePart) { PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); if (thePart) { - boost::shared_ptr aDocRef = thePart->data()->docRef("PartDocument"); - if (aDocRef) - aMgr->setCurrentDocument(aDocRef->value()); + DocumentPtr aFeaDoc; + if (!XGUI_Tools::isModelObject(thePart)) { + aFeaDoc = thePart->data()->docRef("PartDocument")->value(); + } else { + ObjectPtr aObject = boost::dynamic_pointer_cast(thePart); + aFeaDoc = aObject->featureRef()->data()->docRef("PartDocument")->value(); + } + if (aFeaDoc) + aMgr->setCurrentDocument(aFeaDoc); } else { aMgr->setCurrentDocument(aMgr->rootDocument()); } @@ -758,13 +858,37 @@ XGUI_SalomeViewer* XGUI_Workshop::salomeViewer() const //************************************************************** void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) { - QFeatureList aFeatures = mySelector->selectedFeatures(); + QFeatureList aFeatures = mySelector->selection()->selectedFeatures(); if ((theId == "ACTIVATE_PART_CMD") && (aFeatures.size() > 0)) activatePart(aFeatures.first()); else if (theId == "DEACTIVATE_PART_CMD") activatePart(FeaturePtr()); else if (theId == "DELETE_CMD") deleteFeatures(aFeatures); + else if (theId == "SHOW_CMD") + showFeatures(aFeatures, true); + else if (theId == "HIDE_CMD") + showFeatures(aFeatures, false); +} + +//************************************************************** +void XGUI_Workshop::onWidgetValuesChanged() +{ + ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); + 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); + } + } } //************************************************************** @@ -794,15 +918,65 @@ void XGUI_Workshop::deleteFeatures(QFeatureList theList) PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); aMgr->rootDocument()->startOperation(); foreach (FeaturePtr aFeature, theList) { - if (aFeature->getKind() == "Part") { - DocumentPtr aDoc = aFeature->data()->docRef("PartDocument")->value(); + if (aFeature->getKind() == PARTSET_PART_KIND) { + DocumentPtr aDoc; + if (!XGUI_Tools::isModelObject(aFeature)) { + aDoc = aFeature->data()->docRef("PartDocument")->value(); + } else { + ObjectPtr aObject = boost::dynamic_pointer_cast(aFeature); + aDoc = aObject->featureRef()->data()->docRef("PartDocument")->value(); + aFeature = aObject->featureRef(); + } if (aDoc == aMgr->currentDocument()) { aDoc->close(); } - } //else - //aDoc = aFeature->document(); - aMgr->rootDocument()->removeFeature(aFeature); + } else { + if (XGUI_Tools::isModelObject(aFeature)) { + ObjectPtr aObject = boost::dynamic_pointer_cast(aFeature); + aFeature = aObject->featureRef(); + } + } + if (myDisplayer->isVisible(aFeature)) + myDisplayer->erase(aFeature, false); + aFeature->document()->removeFeature(aFeature); } + myDisplayer->updateViewer(); aMgr->rootDocument()->finishOperation(); } } + +//************************************************************** +void XGUI_Workshop::showFeatures(QFeatureList theList, bool isVisible) +{ + if (isVisible) { + foreach (FeaturePtr aFeature, theList) { + myDisplayer->display(aFeature, false); + } + } else { + foreach (FeaturePtr aFeature, theList) { + myDisplayer->erase(aFeature, false); + } + } + myDisplayer->updateViewer(); +} + +//************************************************************** +void XGUI_Workshop::updateCommandsOnViewSelection() +{ + PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); + XGUI_Selection* aSelection = mySelector->selection(); + + QList aActions = getModuleCommands(); + foreach(QAction* aAction, aActions) { + QString aId = aAction->data().toString(); + const ModelAPI_Validator* aValidator = aFactory->validator(aId.toStdString()); + if (aValidator) { + const ModuleBase_SelectionValidator* aSelValidator = + dynamic_cast(aValidator); + if (aSelValidator) { + aAction->setEnabled(aSelValidator->isValid(aSelection)); + } + } + } +}