From f8d51abf2ab6024a974d42c139f7650ccf0ef774 Mon Sep 17 00:00:00 2001 From: nds Date: Mon, 16 Jun 2014 10:45:04 +0400 Subject: [PATCH] According to "operation-widget_factory-property" final modification to use in the property panel the operation widgets. To do: the property panel clear the widgets, but should not do it. --- src/ModuleBase/ModuleBase_IOperation.cpp | 11 ++++++++ src/ModuleBase/ModuleBase_IOperation.h | 8 ++++++ src/ModuleBase/ModuleBase_Operation.cpp | 12 ++++++--- .../ModuleBase_OperationDescription.cpp | 25 +++++++++++------ .../ModuleBase_OperationDescription.h | 25 ++++++++++++----- src/PartSet/PartSet_Module.cpp | 16 ++++++++--- src/PartSet/PartSet_Tools.cpp | 15 ++++++----- src/XGUI/XGUI_Workshop.cpp | 27 +++++++------------ src/XGUI/XGUI_Workshop.h | 4 +++ 9 files changed, 98 insertions(+), 45 deletions(-) diff --git a/src/ModuleBase/ModuleBase_IOperation.cpp b/src/ModuleBase/ModuleBase_IOperation.cpp index 378af8663..30af6ccc1 100644 --- a/src/ModuleBase/ModuleBase_IOperation.cpp +++ b/src/ModuleBase/ModuleBase_IOperation.cpp @@ -7,6 +7,7 @@ #include "ModuleBase_IOperation.h" #include "ModuleBase_OperationDescription.h" +#include "ModuleBase_ModelWidget.h" #include #include @@ -41,6 +42,16 @@ bool ModuleBase_IOperation::isGranted(ModuleBase_IOperation* /*theOperation*/) c return false; } +void ModuleBase_IOperation::setModelWidgets(const std::string& theXmlRepresentation, + QList theWidgets) +{ + QList::const_iterator anIt = theWidgets.begin(), aLast = theWidgets.end(); + for (; anIt != aLast; anIt++) { + QObject::connect(*anIt, SIGNAL(valuesChanged()), this, SLOT(storeCustomValue())); + } + getDescription()->setModelWidgets(theXmlRepresentation, theWidgets); +} + boost::shared_ptr ModuleBase_IOperation::document() const { return ModelAPI_PluginManager::get()->rootDocument(); diff --git a/src/ModuleBase/ModuleBase_IOperation.h b/src/ModuleBase/ModuleBase_IOperation.h index a936a6f10..5c753c728 100644 --- a/src/ModuleBase/ModuleBase_IOperation.h +++ b/src/ModuleBase/ModuleBase_IOperation.h @@ -13,11 +13,13 @@ #include #include +#include #include class ModelAPI_Document; class ModuleBase_OperationDescription; +class ModuleBase_ModelWidget; /*! \class ModuleBase_IOperation @@ -68,6 +70,12 @@ public: /// \param theOperation the previous running operation virtual bool isGranted(ModuleBase_IOperation* theOperation) const; + /// Sets a list of model widgets, according to the operation feature xml definition + /// \param theXmlRepresentation an xml feature definition + /// \param theWidgets a list of widgets + void setModelWidgets(const std::string& theXmlRepresentation, + QList theWidgets); + signals: void started(); /// the operation is started void aborted(); /// the operation is aborted diff --git a/src/ModuleBase/ModuleBase_Operation.cpp b/src/ModuleBase/ModuleBase_Operation.cpp index 3a5364fe8..223bf59e2 100644 --- a/src/ModuleBase/ModuleBase_Operation.cpp +++ b/src/ModuleBase/ModuleBase_Operation.cpp @@ -100,10 +100,16 @@ void ModuleBase_Operation::flushCreated() FeaturePtr ModuleBase_Operation::createFeature(const bool theFlushMessage) { boost::shared_ptr aDoc = document(); - FeaturePtr aFeature = aDoc->addFeature( - getDescription()->operationId().toStdString()); - if (aFeature) // TODO: generate an error if feature was not created + FeaturePtr aFeature = aDoc->addFeature(getDescription()->operationId().toStdString()); + if (aFeature) { // TODO: generate an error if feature was not created aFeature->execute(); + // Init default values + QList aWidgets = getDescription()->modelWidgets(); + QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); + for (; anIt != aLast; anIt++) { + (*anIt)->storeValue(aFeature); + } + } if (theFlushMessage) flushCreated(); diff --git a/src/ModuleBase/ModuleBase_OperationDescription.cpp b/src/ModuleBase/ModuleBase_OperationDescription.cpp index 692c5721a..a97d11816 100644 --- a/src/ModuleBase/ModuleBase_OperationDescription.cpp +++ b/src/ModuleBase/ModuleBase_OperationDescription.cpp @@ -22,23 +22,32 @@ const QString& ModuleBase_OperationDescription::operationId() const return myOperationId; } -const QString& ModuleBase_OperationDescription::xmlRepresentation() const +const QString& ModuleBase_OperationDescription::description() const { - return myXmlRepr; + return myDescription; } -void ModuleBase_OperationDescription::setXmlRepresentation(const QString& xmlRepr) +void ModuleBase_OperationDescription::setDescription(const QString& theDescription) { - myXmlRepr = xmlRepr; + myDescription = theDescription; } -const QString& ModuleBase_OperationDescription::description() const +void ModuleBase_OperationDescription::setModelWidgets(const std::string& theXmlRepresentation, + const QList& theWidgets) { - return myDescription; + myWidgets.clear(); + QList::const_iterator anIt = theWidgets.begin(), aLast = theWidgets.end(); + for (; anIt != aLast; anIt++) + myWidgets.push_back(*anIt); + myXmlRepresentation = theXmlRepresentation; } -void ModuleBase_OperationDescription::setDescription(const QString& theDescription) +const QList& ModuleBase_OperationDescription::modelWidgets() const { - myDescription = theDescription; + return myWidgets; } +bool ModuleBase_OperationDescription::hasXmlRepresentation() const +{ + return !myWidgets.empty() || !myXmlRepresentation.empty(); +} diff --git a/src/ModuleBase/ModuleBase_OperationDescription.h b/src/ModuleBase/ModuleBase_OperationDescription.h index 56b37c28e..11b4abc10 100644 --- a/src/ModuleBase/ModuleBase_OperationDescription.h +++ b/src/ModuleBase/ModuleBase_OperationDescription.h @@ -13,9 +13,12 @@ #include #include +#include #include +class ModuleBase_ModelWidget; + /*! * \class ModuleBase_OperationDescription * @@ -35,11 +38,7 @@ public: /// Returns XML representation of the operation's widget. /// \return XML QString - const QString& xmlRepresentation() const; - - /// Sets XML representation of the operation's widget. - /// \param xmlRepr - XML QString - void setXmlRepresentation(const QString& xmlRepr); + //const QString& xmlRepresentation() const; /// Returns a short description of operation (will be /// inserted in title of property panel) @@ -49,11 +48,25 @@ public: /// inserted in title of property panel) void setDescription(const QString& theDescription); + /// Sets a list of model widgets, according to the operation feature xml definition + /// \param theWidgets a list of widgets + void setModelWidgets(const std::string& theXmlRepresentation, + const QList& theWidgets); + + /// Sets a list of model widgets, according to the operation feature xml definition + /// \param theWidgets a list of widgets + const QList& modelWidgets() const; + + /// Returns true if there are no model widgets + /// \return the boolean value + bool hasXmlRepresentation() const; + private: //!< Next fields could be extracted into a subclass; QString myOperationId; /// the operation identifier - QString myXmlRepr; /// the XML representation of the operation's widget QString myDescription; /// the short description of the opertaion + std::string myXmlRepresentation; /// the xml definition + QList myWidgets; /// the list of operation widgets }; #endif //ModuleBase_OperationDescription_H diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index ae43f8a3a..f33b67a13 100644 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -23,6 +24,7 @@ #include #include #include +#include #include #include @@ -231,7 +233,7 @@ void PartSet_Module::onLaunchOperation(std::string theName, FeaturePtr theFeatur if (aPreviewOp) { XGUI_Displayer* aDisplayer = myWorkshop->displayer(); - // refill the features list with avoiding of the features, obtained only by vertex shape (TODO) + // refill the features list with avoiding of the features, obtained only by vertex shape (TODO) std::list aSelected = aDisplayer->getSelected(TopAbs_VERTEX); std::list aHighlighted = aDisplayer->getHighlighted(TopAbs_VERTEX); aPreviewOp->init(theFeature, aSelected, aHighlighted); @@ -333,7 +335,7 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI anOperation = new ModuleBase_Operation(theCmdId.c_str(), this); } - // set operation xml description + // set operation description and list of widgets corresponding to the feature xml definition std::string aFeatureKind = theFeatureKind.empty() ? theCmdId : theFeatureKind; std::string aPluginFileName = featureFile(aFeatureKind); @@ -342,9 +344,17 @@ ModuleBase_Operation* PartSet_Module::createOperation(const std::string& theCmdI std::string aXmlCfg = aWdgReader.featureWidgetCfg(aFeatureKind); std::string aDescription = aWdgReader.featureDescription(aFeatureKind); - anOperation->getDescription()->setXmlRepresentation(QString::fromStdString(aXmlCfg)); + QString aXmlRepr = QString::fromStdString(aXmlCfg); + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), + myWorkshop->moduleConnector()); + QWidget* aContent = myWorkshop->propertyPanel()->contentWidget(); + qDeleteAll(aContent->children()); + aFactory.createWidget(aContent); + anOperation->getDescription()->setDescription(QString::fromStdString(aDescription)); + anOperation->setModelWidgets(aXmlRepr.toStdString(), aFactory.getModelWidgets()); + // connect the operation PartSet_OperationSketchBase* aPreviewOp = dynamic_cast(anOperation); if (aPreviewOp) { diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index 3cfa835db..3e965280a 100644 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -179,24 +179,25 @@ boost::shared_ptr PartSet_Tools::createFeaturePrs(const std: FeaturePtr theSketch, FeaturePtr theFeature) { - PartSet_FeaturePrs* aFeaturePrs; + boost::shared_ptr aFeaturePrs; if (theKind == PartSet_FeaturePointPrs::getKind()) { - aFeaturePrs = new PartSet_FeaturePointPrs(theSketch); + aFeaturePrs = boost::shared_ptr(new PartSet_FeaturePointPrs(theSketch)); } else if (theKind == PartSet_FeatureLinePrs::getKind()) { - aFeaturePrs = new PartSet_FeatureLinePrs(theSketch); + aFeaturePrs = boost::shared_ptr(new PartSet_FeatureLinePrs(theSketch)); } else if (theKind == PartSet_FeatureCirclePrs::getKind()) { - aFeaturePrs = new PartSet_FeatureCirclePrs(theSketch); + aFeaturePrs = boost::shared_ptr(new PartSet_FeatureCirclePrs(theSketch)); } else if (theKind == PartSet_FeatureArcPrs::getKind()) { - aFeaturePrs = new PartSet_FeatureArcPrs(theSketch); + aFeaturePrs = boost::shared_ptr(new PartSet_FeatureArcPrs(theSketch)); } - if (theFeature) + + if (theFeature && aFeaturePrs) aFeaturePrs->init(theFeature, FeaturePtr()); - return boost::shared_ptr(aFeaturePrs); + return aFeaturePrs; } FeaturePtr PartSet_Tools::nearestFeature(QPoint thePoint, Handle_V3d_View theView, diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 26d1bb1d2..affbac1a1 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -281,14 +281,14 @@ void XGUI_Workshop::processEvent(const Events_Message* theMessage) //An operation passed by message. Start it, process and commit. const Config_PointerMessage* aPartSetMsg = dynamic_cast(theMessage); if (aPartSetMsg) { - // Clear previous content - myPropertyPanel->cleanContent(); + // TODO: 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(); } @@ -308,30 +308,20 @@ 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(); - + // TODO: Clear previous content + /* QString aXmlRepr = aOperation->getDescription()->xmlRepresentation(); ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), myModuleConnector); QWidget* aContent = myPropertyPanel->contentWidget(); qDeleteAll(aContent->children()); aFactory.createWidget(aContent); - - 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())); - // Init default values - if (!aOperation->isEditOperation()) { - aWidget->storeValue(aOperation->feature()); - } - } - myPropertyPanel->setModelWidgets(aFactory.getModelWidgets()); + */ + myPropertyPanel->setModelWidgets(aOperation->getDescription()->modelWidgets()); myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); } updateCommandStatus(); @@ -343,6 +333,7 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) //!< No need for property panel updateCommandStatus(); hidePropertyPanel(); + //myPropertyPanel->cleanContent(); } /* diff --git a/src/XGUI/XGUI_Workshop.h b/src/XGUI/XGUI_Workshop.h index dad085707..fba793e83 100644 --- a/src/XGUI/XGUI_Workshop.h +++ b/src/XGUI/XGUI_Workshop.h @@ -96,6 +96,10 @@ public: XGUI_ViewerProxy* viewer() const { return myViewerProxy; } + /// Returns the module connectory + /// \returns the instance of connector + XGUI_ModuleConnector* moduleConnector() const { return myModuleConnector; } + //! Returns icon name according to feature Id static QString featureIcon(const std::string& theId); -- 2.39.2