X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=c7a98185b9d71246dce94c5d101a9e77e0bae25b;hb=b8a6a9047f1bbc365f653fc286d676291274a49a;hp=b48c1edcbda95219b413d4fe67036712aeef428f;hpb=ef9ec2df08d5809313076b149a3a89082a47c75f;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index b48c1edcb..c7a98185b 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -14,7 +14,6 @@ #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" @@ -46,6 +45,7 @@ #include #include #include +#include #include #include @@ -113,14 +113,17 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myModuleConnector = new XGUI_ModuleConnector(this); - connect(myOperationMgr, SIGNAL(operationStarted()), SLOT(onOperationStarted())); + connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), + 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())); + // TODO(sbh): It seems that application works properly without update on operationStarted + connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), + myActionsMgr, SLOT(update())); + connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), + myActionsMgr, SLOT(update())); connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } @@ -137,9 +140,7 @@ void XGUI_Workshop::startApplication() //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)); @@ -178,6 +179,11 @@ void XGUI_Workshop::initMenu() false); connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRedo())); salomeConnector()->addEditMenuSeparator(); + aAction = salomeConnector()->addEditCommand("REBUILD_CMD", tr("Rebuild"), tr("Rebuild data objects"), + QIcon(":pictures/rebuild.png"), QKeySequence(), + false); + connect(aAction, SIGNAL(triggered(bool)), this, SLOT(onRebuild())); + salomeConnector()->addEditMenuSeparator(); return; } // File commands group @@ -251,7 +257,7 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes } //A message to start feature creation received. - if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_FEATURE_LOADED)) { + if (theMessage->eventID() == Events_Loop::loop()->eventByName(Config_FeatureMessage::GUI_EVENT())) { boost::shared_ptr aFeatureMsg = boost::dynamic_pointer_cast(theMessage); if (!aFeatureMsg->isInternal()) { @@ -340,10 +346,10 @@ void XGUI_Workshop::processEvent(const boost::shared_ptr& theMes } } else if (theMessage->eventID() == Events_Loop::loop()->eventByName("CurrentDocumentChanged")) { + myActionsMgr->update(); // Find and Activate active part if (myPartActivating) return; - myActionsMgr->update(); SessionPtr aMgr = ModelAPI_Session::get(); DocumentPtr aActiveDoc = aMgr->activeDocument(); DocumentPtr aDoc = aMgr->moduleDocument(); @@ -410,9 +416,15 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const boost::shared_ptr aObjects = theMsg->objects(); std::set::const_iterator aIt; + QIntList aModes; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); - if (!aObj->data() || !aObj->data()->isValid() || aObj->document()->isConcealed(aObj)) + bool aHide = !aObj->data() || !aObj->data()->isValid(); + if (!aHide) { // check that this is not hidden result + ResultPtr aRes = boost::dynamic_pointer_cast(aObj); + aHide = aRes && aRes->isConcealed(); + } + if (aHide) myDisplayer->erase(aObj, false); else { if (myDisplayer->isVisible(aObj)) { @@ -421,7 +433,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const boost::shared_ptrcurrentOperation(); if (!aOperation->hasObject(aObj)) if (!myDisplayer->isActive(aObj)) - myDisplayer->activate(aObj); + myDisplayer->activate(aObj, aModes); } } else { if (myOperationMgr->hasOperation()) { @@ -456,8 +468,7 @@ void XGUI_Workshop::onFeatureCreatedMsg(const boost::shared_ptrhasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (!(*aIt)->document()->isConcealed(*aIt) && - aOperation->hasObject(*aIt)) { // Display only current operation results + if (aOperation->hasObject(*aIt)) { // Display only current operation results myDisplayer->display(*aIt, false); isDisplayed = true; } @@ -502,10 +513,7 @@ void XGUI_Workshop::onOperationStarted() ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget()); QList aWidgets = aFactory.getModelWidgets(); - QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); - ModuleBase_ModelWidget* aWidget; - for (; anIt != aLast; anIt++) { - aWidget = *anIt; + foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { aWidget->setFeature(aOperation->feature()); aWidget->enableFocusProcessing(); QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); @@ -515,8 +523,10 @@ void XGUI_Workshop::onOperationStarted() } } + aOperation->setPropertyPanel(myPropertyPanel); myPropertyPanel->setModelWidgets(aWidgets); - myPropertyPanel->onActivateNextWidget(NULL); + if (!aOperation->activateByPreselection()) + myPropertyPanel->activateNextWidget(NULL); // Widget activation (from the previous method) may commit the current operation // if pre-selection is enougth for it. So we shouldn't update prop panel's title if(myOperationMgr->isCurrentOperation(aOperation)) { @@ -573,6 +583,8 @@ void XGUI_Workshop::addFeature(const boost::shared_ptr& t QKeySequence(), isUsePropPanel); salomeConnector()->setNestedActions(aFeatureId, aNestedFeatures.split(" ", QString::SkipEmptyParts)); + salomeConnector()->setDocumentKind(aFeatureId, QString::fromStdString(theMessage->documentKind())); + myActionsMgr->addCommand(aAction); myModule->featureCreated(aAction); } else { @@ -881,7 +893,7 @@ 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()) { @@ -919,8 +931,7 @@ void XGUI_Workshop::updateCommandStatus() } SessionPtr aMgr = ModelAPI_Session::get(); if (aMgr->hasModuleDocument()) { - QAction* aUndoCmd; - QAction* aRedoCmd; + QAction *aUndoCmd, *aRedoCmd; foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); if (aId == "UNDO_CMD") @@ -931,8 +942,8 @@ void XGUI_Workshop::updateCommandStatus() // Enable all commands aCmd->setEnabled(true); } - aUndoCmd->setEnabled(aMgr->canUndo()); - aRedoCmd->setEnabled(aMgr->canRedo()); + aUndoCmd->setEnabled(aMgr->canUndo() && !aMgr->isOperation()); + aRedoCmd->setEnabled(aMgr->canRedo() && !aMgr->isOperation()); } else { foreach(QAction* aCmd, aCommands) { QString aId = aCmd->data().toString(); @@ -996,6 +1007,7 @@ void XGUI_Workshop::createDockWidgets() hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanel); + myPropertyPanel->installEventFilter(myOperationMgr); QPushButton* aOkBtn = myPropertyPanel->findChild(XGUI::PROP_PANEL_OK); connect(aOkBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onCommitOperation())); @@ -1003,10 +1015,6 @@ void XGUI_Workshop::createDockWidgets() connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation())); 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, - SLOT(onActivateNextWidget(ModuleBase_ModelWidget*))); connect(myOperationMgr, SIGNAL(operationValidated(bool)), myPropertyPanel, SLOT(setAcceptEnabled(bool))); @@ -1078,7 +1086,7 @@ void XGUI_Workshop::salomeViewerSelectionChanged() } //************************************************************** -XGUI_SalomeViewer* XGUI_Workshop::salomeViewer() const +ModuleBase_IViewer* XGUI_Workshop::salomeViewer() const { return mySalomeConnector->viewer(); } @@ -1297,3 +1305,15 @@ void XGUI_Workshop::setDisplayMode(const QList& theList, int theMode) if (theList.size() > 0) myDisplayer->updateViewer(); } + +//************************************************************** +void XGUI_Workshop::closeDocument() +{ + myDisplayer->closeLocalContexts(); + myDisplayer->eraseAll(); + objectBrowser()->clearContent(); + + SessionPtr aMgr = ModelAPI_Session::get(); + aMgr->moduleDocument()->close(); + objectBrowser()->clearContent(); +}