X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=ee311ff8f6bc943b96cf651331f1a684b8968511;hb=12621bb509825d0eb1fb0847a7f9c8011021ca5a;hp=ca06c5e1f6007d6f78b9c616384d21a00e475bdd;hpb=457214a36e82dde329881652d5516b49ad118fc9;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index ca06c5e1f..ee311ff8f 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" @@ -85,6 +85,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); @@ -232,9 +233,12 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) FeaturePtr aFeature = (*aIt); if (aFeature->getKind() == PARTSET_PART_KIND) { aHasPart = true; - break; + //break; + } else { + myDisplayer->display(aFeature, false); } } + 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 @@ -245,33 +249,46 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) //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() == aFeatureUpdatedId) { const Model_FeatureUpdatedMessage* anUpdateMsg = dynamic_cast(theMessage); - std::set aFeatures = anUpdateMsg->features(); - FeaturePtr aCurrentFeature = myOperationMgr->currentOperation()->feature(); + std::set aFeatures = anUpdateMsg->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; + } + } + } + // Redisplay feature if it is modified std::set::const_iterator aIt; for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { - FeaturePtr aNewFeature = (*aIt); - if(aNewFeature == aCurrentFeature) { - myPropertyPanel->updateContentWidget(aCurrentFeature); - break; - } + FeaturePtr aFeature = (*aIt); + if (aFeature->getKind() != PARTSET_PART_KIND) { + if (myDisplayer->isVisible(aFeature)) + myDisplayer->redisplay(aFeature, false); + else + myDisplayer->display(aFeature, false); + } } + myDisplayer->updateViewer(); } //An operation passed by message. Start it, process and commit. const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); if (aPartSetMsg) { - // Clear previous content 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(); } @@ -291,16 +308,31 @@ 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(); - - ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aOperation, myModuleConnector); + QString aXmlRepr = aOperation->getDescription()->xmlRepresentation(); + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), myModuleConnector); QWidget* aContent = myPropertyPanel->contentWidget(); qDeleteAll(aContent->children()); aFactory.createWidget(aContent); - myPropertyPanel->setModelWidgets(aFactory.getModelWidgets()); + + 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()); + } + } + + myPropertyPanel->setModelWidgets(aWidgets); myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); } updateCommandStatus(); @@ -312,6 +344,7 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) //!< No need for property panel updateCommandStatus(); hidePropertyPanel(); + //myPropertyPanel->cleanContent(); } /* @@ -436,6 +469,7 @@ void XGUI_Workshop::onNew() aWnd->showMaximized(); updateCommandStatus(); } + myContextMenuMgr->connectViewer(); QApplication::restoreOverrideCursor(); } @@ -542,7 +576,7 @@ void XGUI_Workshop::onRedo() } //****************************************************** -XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) +ModuleBase_IModule* XGUI_Workshop::loadModule(const QString& theModule) { QString libName = QString::fromStdString(library(theModule.toStdString())); @@ -590,7 +624,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()) { @@ -656,6 +690,26 @@ void XGUI_Workshop::updateCommandStatus() myActionsMgr->update(); } +//****************************************************** +void XGUI_Workshop::updateModuleCommands() +{ + 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); + } + } + } + foreach(QAction* aCmd, aCommands) { + aCmd->setEnabled(myPartSetModule->isFeatureEnabled(aCmd->data().toString())); + } +} + //****************************************************** QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent) { @@ -695,6 +749,11 @@ void XGUI_Workshop::createDockWidgets() 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*))); } //****************************************************** @@ -787,6 +846,26 @@ void XGUI_Workshop::onContextMenuCommand(const QString& theId, bool isChecked) 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); + } + } +} + //************************************************************** void XGUI_Workshop::activatePart(FeaturePtr theFeature) { @@ -832,8 +911,11 @@ void XGUI_Workshop::deleteFeatures(QFeatureList theList) aFeature = aObject->featureRef(); } } + if (myDisplayer->isVisible(aFeature)) + myDisplayer->erase(aFeature, false); aFeature->document()->removeFeature(aFeature); } + myDisplayer->updateViewer(); aMgr->rootDocument()->finishOperation(); } }