X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=2d5c5d60da98526a05a2167ceec030ac0ae3753c;hb=b2a34ee4bab2fe2d97f900cbdafcaf122344c46c;hp=6aacc23e3fe327437035c39d8dff387c8686fe0a;hpb=ba737434252ae41c4bee1b792a0f0bb098ffae87;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 6aacc23e3..2d5c5d60d 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -22,9 +22,10 @@ #include "XGUI_ContextMenuMgr.h" #include "XGUI_ModuleConnector.h" #include "XGUI_Preferences.h" +#include #include -#include +#include #include #include #include @@ -43,7 +44,6 @@ #include #include #include -#include #include "ModuleBase_WidgetFactory.h" #include @@ -58,10 +58,12 @@ #include #include #include -#include +#include +#include #ifdef _DEBUG #include +#include #endif #ifdef WIN32 @@ -87,7 +89,9 @@ 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(); @@ -122,6 +126,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) //****************************************************** XGUI_Workshop::~XGUI_Workshop(void) { + delete myDisplayer; } //****************************************************** @@ -140,6 +145,8 @@ void XGUI_Workshop::startApplication() 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")); registerValidators(); activateModule(); @@ -190,6 +197,7 @@ void XGUI_Workshop::initMenu() aCommand = aGroup->addFeature("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), QIcon(":pictures/rebuild.png")); + aCommand->connectTo(this, SLOT(onRebuild())); aCommand = aGroup->addFeature("SAVEAS_CMD", tr("Save as..."), tr("Save the document into a file"), QIcon(":pictures/save.png")); @@ -227,63 +235,74 @@ XGUI_Workbench* XGUI_Workshop::addWorkbench(const QString& theName) } //****************************************************** -void XGUI_Workshop::processEvent(const Events_Message* theMessage) +void XGUI_Workshop::processEvent(const boost::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); + boost::shared_ptr aFeatureMsg = + boost::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)) { + boost::shared_ptr aUpdMsg = + boost::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)) { + boost::shared_ptr aUpdMsg = + boost::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)) { + boost::shared_ptr anUpdateMsg = + boost::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)) { + boost::shared_ptr aDelMsg = + boost::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; } //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)) { + boost::shared_ptr aPartSetMsg = + boost::dynamic_pointer_cast(theMessage); //myPropertyPanel->cleanContent(); ModuleBase_Operation* anOperation = (ModuleBase_Operation*) aPartSetMsg->pointer(); @@ -294,15 +313,44 @@ 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")) { + // 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 = boost::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 { + //Show error dialog if error message received. + boost::shared_ptr anAppError = boost::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() { @@ -312,7 +360,7 @@ void XGUI_Workshop::onStartWaiting() } //****************************************************** -void XGUI_Workshop::onFeatureUpdatedMsg(const ModelAPI_ObjectUpdatedMessage* theMsg) +void XGUI_Workshop::onFeatureUpdatedMsg(const boost::shared_ptr& theMsg) { std::set aFeatures = theMsg->objects(); if (myOperationMgr->hasOperation()) { @@ -326,17 +374,19 @@ 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 boost::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()) + if (!aObj->data() || !aObj->data()->isValid() || aObj->document()->isConcealed(aObj)) myDisplayer->erase(aObj, false); else { if (myDisplayer->isVisible(aObj)) // TODO VSV: Correction sketch drawing @@ -355,7 +405,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const ModelAPI_ObjectUpdatedMessage* t } //****************************************************** -void XGUI_Workshop::onFeatureCreatedMsg(const ModelAPI_ObjectUpdatedMessage* theMsg) +void XGUI_Workshop::onFeatureCreatedMsg(const boost::shared_ptr& theMsg) { std::set aObjects = theMsg->objects(); @@ -370,24 +420,27 @@ void XGUI_Workshop::onFeatureCreatedMsg(const ModelAPI_ObjectUpdatedMessage* the // it doesn't stored in the operation mgr and doesn't displayed } else if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (aOperation->hasObject(*aIt)) { // Display only current operation results + if (!(*aIt)->document()->isConcealed(*aIt) && + aOperation->hasObject(*aIt)) { // Display only current operation results myDisplayer->display(*aIt, false); isDisplayed = true; } } } + 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())); + activateLastPart(); } } //****************************************************** -void XGUI_Workshop::onObjectDeletedMsg(const ModelAPI_ObjectDeletedMessage* theMsg) +void XGUI_Workshop::onObjectDeletedMsg(const boost::shared_ptr& theMsg) { + if (myObjectBrowser) + myObjectBrowser->processEvent(theMsg); //std::set aFeatures = theMsg->objects(); } @@ -395,8 +448,11 @@ void XGUI_Workshop::onObjectDeletedMsg(const ModelAPI_ObjectDeletedMessage* theM void XGUI_Workshop::onOperationStarted() { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - aOperation->setNestedFeatures(myActionsMgr->nestedCommands(aOperation->id())); - + if (this->isSalomeMode()) + aOperation->setNestedFeatures(mySalomeConnector->nestedActions(aOperation->id())); + else + aOperation->setNestedFeatures(myActionsMgr->nestedCommands(aOperation->id())); + if (aOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel connectWithOperation(aOperation); @@ -414,17 +470,15 @@ void XGUI_Workshop::onOperationStarted() 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()); - + if (!aOperation->isEditOperation() && !aWidget->isComputedDefault()) { aWidget->storeValue(); } } myPropertyPanel->setModelWidgets(aWidgets); + myPropertyPanel->onActivateNextWidget(NULL); myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); } updateCommandStatus(); @@ -439,10 +493,27 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) myPropertyPanel->cleanContent(); } +bool XGUI_Workshop::event(QEvent * theEvent) +{ + PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); + if (aPostponedEv) { +#ifdef _DEBUG + std::cout << "XGUI_Workshop::event " << "Got PostponeMessageQtEvent" << std::endl; + bool isMyThread = (QApplication::instance()->thread() == QThread::currentThread()); + std::cout << "XGUI_Workshop::event " << "I am in the Qt's thread: " + << isMyThread << std::endl; +#endif + boost::shared_ptr aEventPtr = aPostponedEv->postponedMessage(); + processEvent(aEventPtr); + return true; + } + return false; +} + /* * */ -void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) +void XGUI_Workshop::addFeature(const boost::shared_ptr& theMessage) { if (!theMessage) { #ifdef _DEBUG @@ -464,7 +535,7 @@ void XGUI_Workshop::addFeature(const Config_FeatureMessage* theMessage) QString::fromStdString(theMessage->tooltip()), QIcon(theMessage->icon().c_str()), QKeySequence(), isUsePropPanel); - salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ")); + salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ", QString::SkipEmptyParts)); myActionsMgr->addCommand(aAction); myModule->featureCreated(aAction); } else { @@ -507,31 +578,37 @@ void XGUI_Workshop::connectWithOperation(ModuleBase_Operation* theOperation) aCommand = salomeConnector()->command(theOperation->getDescription()->operationId()); } else { XGUI_MainMenu* aMenu = myMainWindow->menuObject(); - aCommand = aMenu->feature(theOperation->getDescription()->operationId()); + 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); @@ -570,10 +647,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"), @@ -584,7 +662,7 @@ void XGUI_Workshop::onOpen() } else if (anAnswer == QMessageBox::Cancel) { return; } - aDoc->close(); + aSession->moduleDocument()->close(); myCurrentDir = ""; } @@ -599,7 +677,7 @@ void XGUI_Workshop::onOpen() return; } QApplication::setOverrideCursor(Qt::WaitCursor); - aDoc->load(myCurrentDir.toLatin1().constData()); + aSession->load(myCurrentDir.toLatin1().constData()); myObjectBrowser->rebuildDataTree(); displayAllResults(); updateCommandStatus(); @@ -609,17 +687,23 @@ 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(); + 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); @@ -644,6 +728,10 @@ bool XGUI_Workshop::onSaveAs() } } myCurrentDir = aTempDir; + if (!isSalomeMode()) { + myMainWindow->setCurrentDir(myCurrentDir, false); + myMainWindow->setModifiedState(false); + } return onSave(); } @@ -651,11 +739,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(); } @@ -663,14 +750,21 @@ 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() +{ + static const Events_ID aRebuildEvent = Events_Loop::loop()->eventByName("Rebuild"); + Events_Loop::loop()->send(boost::shared_ptr( + new Events_Message(aRebuildEvent, this))); +} + //****************************************************** void XGUI_Workshop::onPreferences() { @@ -775,12 +869,11 @@ void XGUI_Workshop::updateCommandStatus() foreach (XGUI_Command* aCmd, aMenuBar->features()) aCommands.append(aCmd); } - PluginManagerPtr aMgr = ModelAPI_PluginManager::get(); - if (aMgr->hasRootDocument()) { + SessionPtr aMgr = ModelAPI_Session::get(); + if (aMgr->hasModuleDocument()) { QAction* aUndoCmd; QAction* aRedoCmd; - foreach(QAction* aCmd, aCommands) - { + foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "UNDO_CMD") aUndoCmd = aCmd; @@ -790,12 +883,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()); + aRedoCmd->setEnabled(aMgr->canRedo()); } else { - foreach(QAction* aCmd, aCommands) - { + foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "NEW_CMD") aCmd->setEnabled(true); @@ -828,7 +919,7 @@ QList XGUI_Workshop::getModuleCommands() const QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) { QDockWidget* aObjDock = new QDockWidget(theParent); - aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + aObjDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); aObjDock->setWindowTitle(tr("Object browser")); aObjDock->setStyleSheet( "::title { position: relative; padding-left: 5px; text-align: left center }"); @@ -852,6 +943,7 @@ void XGUI_Workshop::createDockWidgets() QDockWidget* aObjDock = createObjectBrowser(aDesktop); aDesktop->addDockWidget(Qt::LeftDockWidgetArea, aObjDock); myPropertyPanel = new XGUI_PropertyPanel(aDesktop); + myPropertyPanel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); hidePropertyPanel(); //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(keyReleased(QKeyEvent*)), myOperationMgr, + SLOT(onKeyReleased(QKeyEvent*))); connect(myPropertyPanel, SIGNAL(widgetActivated(ModuleBase_ModelWidget*)), myOperationMgr, SLOT(onWidgetActivated(ModuleBase_ModelWidget*))); connect(myOperationMgr, SIGNAL(activateNextWidget(ModuleBase_ModelWidget*)), myPropertyPanel, @@ -919,18 +1009,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); if (aPart) { DocumentPtr aPartDoc = aPart->partDoc(); if (aPartDoc) { - aMgr->setCurrentDocument(aPartDoc); + aMgr->setActiveDocument(aPartDoc); return; } } } - aMgr->setCurrentDocument(aMgr->rootDocument()); + aMgr->setActiveDocument(aMgr->moduleDocument()); } //****************************************************** @@ -960,6 +1050,8 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) showObjects(aObjects, true); else if (theId == "HIDE_CMD") showObjects(aObjects, false); + else if (theId == "SHOW_ONLY_CMD") + showOnlyObjects(aObjects); } //************************************************************** @@ -986,20 +1078,27 @@ void XGUI_Workshop::onWidgetValuesChanged() //************************************************************** void XGUI_Workshop::activatePart(ResultPartPtr theFeature) { - 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) + if (aPart) { activatePart(aPart); + } } //************************************************************** @@ -1011,17 +1110,17 @@ 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); 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); if (aFeature) @@ -1029,7 +1128,7 @@ void XGUI_Workshop::deleteObjects(const QList& theList) } } myDisplayer->updateViewer(); - aMgr->rootDocument()->finishOperation(); + aMgr->finishOperation(); } } @@ -1050,21 +1149,41 @@ void XGUI_Workshop::showObjects(const QList& theList, bool isVisible) myDisplayer->updateViewer(); } +//************************************************************** +void XGUI_Workshop::showOnlyObjects(const QList& theList) +{ + myDisplayer->eraseAll(false); + showObjects(theList, true); +} + + //************************************************************** 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; + // Restrict validators to manage only nested (child) features + // of the current feature i.e. if current feature is Sketch - + // Sketch Features & Constraints can be validated. + QStringList aNestedIds; + if(myOperationMgr->hasOperation()) { + FeaturePtr aFeature = myOperationMgr->currentOperation()->feature(); + if(aFeature) { + aNestedIds << myActionsMgr->nestedCommands(QString::fromStdString(aFeature->getKind())); + } + } + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); QList aActions = getModuleCommands(); - foreach(QAction* aAction, aActions) - { + foreach(QAction* aAction, aActions) { QString aId = aAction->data().toString(); + if(!aNestedIds.contains(aId)) + continue; std::list aValidators; - aFactory->validators(aId.toStdString(), aValidators); + std::list > anArguments; + aFactory->validators(aId.toStdString(), aValidators, anArguments); std::list::iterator aValidator = aValidators.begin(); for (; aValidator != aValidators.end(); aValidator++) { if (*aValidator) { @@ -1081,15 +1200,15 @@ void XGUI_Workshop::updateCommandsOnViewSelection() //************************************************************** 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); @@ -1102,6 +1221,8 @@ void XGUI_Workshop::displayAllResults() //************************************************************** void XGUI_Workshop::displayDocumentResults(DocumentPtr theDoc) { + if (!theDoc) + return; displayGroupResults(theDoc, ModelAPI_ResultConstruction::group()); displayGroupResults(theDoc, ModelAPI_ResultBody::group()); }