]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Support of additional attributes if ModelWidget and features
authorSergey POKHODENKO <sergey.pokhodenko@opencascade.com>
Wed, 27 May 2015 14:44:54 +0000 (17:44 +0300)
committerspo <sergey.pokhodenko@opencascade.com>
Fri, 5 Jun 2015 10:45:30 +0000 (13:45 +0300)
src/Config/Config_Keywords.h
src/Config/Config_WidgetAPI.cpp
src/Config/Config_WidgetAPI.h
src/ExchangePlugin/plugin-Exchange.xml
src/ModuleBase/ModuleBase_ModelWidget.cpp
src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_WidgetFactory.h
src/ModuleBase/ModuleBase_WidgetFileSelector.cpp
src/PartSet/PartSet_WidgetFileSelector.cpp
src/PartSet/PartSet_WidgetMultiSelector.h

index 96adf95b2f2cb66c55499d41b838a73e88cd415d..59af2f8aafe70cce39ac1aec92842cef0f3d049f 100644 (file)
@@ -18,6 +18,8 @@ const static char* NODE_GROUP = "group";
 const static char* NODE_FEATURE = "feature";
 const static char* NODE_SOURCE = "source";
 const static char* NODE_VALIDATOR = "validator";
+const static char* NODE_ATTRIBUTES = "attributes";
+const static char* NODE_ATTRIBUTE = "attribute";
 const static char* NODE_SELFILTER = "selection_filter";
 const static char* NODE_XMLPARENT = "libxml_parent";
 
@@ -66,6 +68,9 @@ const static char* ATTR_INTERNAL = "internal";
 const static char* ATTR_OBLIGATORY = "obligatory";
 const static char* ATTR_CONCEALMENT = "concealment";
 const static char* ATTR_USE_RESET = "use_reset";
+const static char* ATTR_ID = _ID;
+const static char* ATTR_ROLE = "role";
+const static char* ATTR_MAIN_ROLE = "main";
 
 // WDG_INFO properties
 const static char* INFO_WDG_TEXT = FEATURE_TEXT;
index 1249f9ab817ecd59e05b037d57a0390ad19caa40..3224d7a1826b895d88de07c8d0e2e918c11d995d 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <string>
 
-Config_WidgetAPI::Config_WidgetAPI(std::string theRawXml)
+Config_WidgetAPI::Config_WidgetAPI(const std::string& theRawXml)
 {
   myDoc = xmlParseDoc(BAD_CAST theRawXml.c_str());
   myCurrentNode = xmlDocGetRootElement(myDoc);
@@ -63,6 +63,29 @@ bool Config_WidgetAPI::toParentWidget()
   return myCurrentNode != NULL;
 }
 
+std::list<xmlNodePtr> Config_WidgetAPI::attributes() const
+{
+  std::list<xmlNodePtr> aResult;
+  if (myCurrentNode && hasChild(myCurrentNode)) {
+    xmlNodePtr anAttributesNode = myCurrentNode->children;
+    while (anAttributesNode &&
+           (!isElementNode(anAttributesNode) ||
+            std::string((char *) anAttributesNode->name) != NODE_ATTRIBUTES)) {
+      anAttributesNode = anAttributesNode->next;
+    }
+    if (anAttributesNode && hasChild(anAttributesNode)) {
+      xmlNodePtr anAttributeNode = anAttributesNode->children;
+      while (anAttributeNode) {
+        if (isElementNode(anAttributeNode) &&
+            std::string((char *) anAttributeNode->name) == NODE_ATTRIBUTE)
+          aResult.push_back(anAttributeNode);
+        anAttributeNode = anAttributeNode->next;
+      }
+    }
+  }
+  return aResult;
+}
+
 std::string Config_WidgetAPI::widgetType() const
 {
   std::string result = "";
@@ -113,3 +136,39 @@ std::string Config_WidgetAPI::widgetTooltip() const
 {
   return getProperty(ATTR_TOOLTIP);
 }
+
+std::list<std::string> Config_WidgetAPI::getAttributes(const std::string& theRole/* = std::string()*/) const
+{
+  std::list<std::string> aResult;
+
+  if (theRole.empty() || theRole == ATTR_MAIN_ROLE)
+    aResult.push_back(widgetId());
+
+  if (theRole == ATTR_MAIN_ROLE)
+    return aResult;
+
+  std::list<xmlNodePtr> anAttributes = attributes();
+  for (auto it = anAttributes.begin(); it != anAttributes.end(); ++it) {
+    if (theRole.empty() || theRole == ::getProperty(*it, ATTR_ROLE))
+      aResult.push_back(::getProperty(*it, ATTR_ID));
+  }
+  return aResult;
+}
+
+std::string Config_WidgetAPI::getAttributeProperty(const std::string& theAttribute,
+                                                   const std::string& thePropName) const
+{
+  if (theAttribute == widgetId()) {
+    if (thePropName == ATTR_ROLE)
+      return ATTR_MAIN_ROLE;
+    return ::getProperty(myCurrentNode, thePropName.c_str());
+  }
+
+  std::list<xmlNodePtr> anAttributes = attributes();
+  for (auto it = anAttributes.begin(); it != anAttributes.end(); ++it) {
+    if (theAttribute == ::getProperty(*it, ATTR_ID))
+      return ::getProperty(*it, thePropName.c_str());
+  }
+  return std::string();
+}
+
index e9531e49fb7af27c9615c666c2e172a0a7af2df9..a99ba1a588de0d6cb19945ddf7dbca184821784a 100644 (file)
@@ -13,6 +13,7 @@
 #include <Config_def.h>
 
 #include <cstdarg>
+#include <list>
 #include <string>
 
 //>> Forward declaration of xmlNodePtr.
@@ -56,6 +57,15 @@ class CONFIG_EXPORT Config_WidgetAPI
   //! Returns a custom property of current widget
   std::string getProperty(const char* thePropName) const;
 
+  /*! Returns a list of attributes.
+   *  If theRole is 0 then returns all attributes.
+   *  If theRole is "main" then returns widgetId().
+   */
+  std::list<std::string> getAttributes(const std::string& theRole = std::string()) const;
+  //! Returns a custom property of attribute
+  std::string getAttributeProperty(const std::string& theAttribute,
+                                   const std::string& thePropName) const;
+
   /*! Checks if the XML representation of widget has given attribute,
    *  if yes - returns it's bool value, if no, or if the value can not
    *  be converted to bool - returns theDefault.
@@ -67,7 +77,7 @@ class CONFIG_EXPORT Config_WidgetAPI
 
  protected:
   /// These fields are accessible for ModuleBase_WidgetFactory only
-  Config_WidgetAPI(std::string theRawXml);
+  Config_WidgetAPI(const std::string& theRawXml);
   //! Pass to the next (sibling) node of widget's xml definition. If impossible, returns false
   bool toNextWidget();
   //! Pass into the child node of widget's xml definition. If impossible, returns false
@@ -75,6 +85,8 @@ class CONFIG_EXPORT Config_WidgetAPI
   //! Pass into the parent node of widget's xml definition. If impossible, returns false
   bool toParentWidget();
 
+  std::list<xmlNodePtr> attributes() const;
+
  private:
   xmlDocPtr myDoc; //!< Pointer to the root of widget's xml definition
   xmlNodePtr myCurrentNode; //!< Pointer to the current node in the widget's xml definition
index f601a8f72b5c46cd413e706d81d1799fb13e7791..b335af3bda668d386e7b436557d1d349da23de06 100644 (file)
       <feature id="Export" title="Export" tooltip="Export to file" icon=":icons/export.png">
         <export_file_selector id="export_file_selector" type="save" title="Export file" path="">
           <validator id="ExchangePlugin_ExportFormat" parameters="BREP|BRP:BREP,STEP|STP:STEP,IGES|IGS:IGES-5.1,IGES|IGS:IGES-5.3" />
+          <attributes>
+            <attribute id="export_file_format" role="format" />
+          </attributes>
         </export_file_selector>
         <multi_selector id="selection_list" tooltip="Select a set of objects" type_choice="Vertices Edges Faces Solids" /> 
       </feature>
     </group>
   </workbench>
-</plugin>
\ No newline at end of file
+</plugin>
index b22c1f3b1ca773b70ba8b09d4f45e51bcf904acd..b7b855d564c8a35ea112432441719f34c946f11a 100644 (file)
@@ -35,6 +35,12 @@ ModuleBase_ModelWidget::ModuleBase_ModelWidget(QWidget* theParent,
   myAttributeID = theData ? theData->widgetId() : "";
   myIsObligatory = theData->getBooleanAttribute(ATTR_OBLIGATORY, true);
 
+  std::list<std::string> anAttributes = theData->getAttributes();
+  for (auto it = anAttributes.begin(); it != anAttributes.end(); ++it) {
+    std::string aRole = theData->getAttributeProperty(*it, ATTR_ROLE);
+    myRoleAttributesID[aRole] << *it;
+  }
+
   connect(this, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged()));
 }
 
@@ -82,6 +88,17 @@ void ModuleBase_ModelWidget::setHighlighted(bool isHighlighted)
   }
 }
 
+std::string ModuleBase_ModelWidget::attributeID(const std::string& theRole/* = std::string()*/) const
+{
+  if (theRole.empty())
+    return myAttributeID;
+
+  if (myRoleAttributesID.contains(theRole) && !myRoleAttributesID[theRole].isEmpty())
+    return myRoleAttributesID[theRole].last();
+
+  return std::string();
+}
+
 void ModuleBase_ModelWidget::setFeature(const FeaturePtr& theFeature, const bool theToStoreValue)
 {
   myFeature = theFeature;
index 6ba89d2cc1624e5ddff1a813b92db2ed25ef873d..1b3c6077489f8b9eaab173709bda3abd0de4542d 100644 (file)
@@ -12,6 +12,8 @@
 
 #include <ModelAPI_Feature.h>
 
+#include <QList>
+#include <QMap>
 #include <QWidget>
 
 #include <memory>
@@ -117,10 +119,7 @@ Q_OBJECT
 
   /// Returns the attribute name
   /// \returns the string value
-  std::string attributeID() const
-  {
-    return myAttributeID;
-  }
+  std::string attributeID(const std::string& theRole = std::string()) const;
 
   /// Returns the parent of the attribute
   /// \returns the string value
@@ -204,6 +203,9 @@ protected slots:
   /// The attribute name of the model feature
   std::string myAttributeID;
 
+  /// The list of attribute names of the model feature for a role
+  QMap<std::string, QList<std::string> > myRoleAttributesID;
+
   /// Name of parent
   std::string myParentId;
 
index 1e1f29fa76e8dfc54e6de9b682f1efc2881cc0f5..f7e7bd4927beee3e177948cac8cddb1419fdc287 100644 (file)
@@ -24,8 +24,8 @@ class ModuleBase_PageBase;
 
 /**
 * \ingroup GUI
-* A class for creation of widgets instances in for property panel using XML deskription of 
-* a feature
+* A class for creation of widgets instances in for property panel using
+* XML description of a feature
 */
 class MODULEBASE_EXPORT ModuleBase_WidgetFactory
 {
index ee47d10c944c7cdcb58992f9c0617337fbb0b3d3..0c7caa10bde44f659083067fa8a7c2dcfe5082b5 100644 (file)
@@ -164,7 +164,7 @@ QStringList ModuleBase_WidgetFileSelector::getValidatorFormats() const
 
   std::list<ModelAPI_Validator*> allValidators;
   std::list<std::list<std::string> > allArguments;
-  aFactory->validators(myFeature->getKind(), myAttributeID, allValidators, allArguments);
+  aFactory->validators(myFeature->getKind(), attributeID(), allValidators, allArguments);
 
   QStringList aResult;
   std::list<std::string> anArgumentList = allArguments.front();
index 4f4f9531d037cc52ed548532262fd76fafc80d4f..e38ee8674d246ee4ead8dec2c6c1fbb613e62f9b 100644 (file)
@@ -27,7 +27,7 @@ bool PartSet_WidgetFileSelector::restoreValue()
     return false;
 
   DataPtr aData = myFeature->data();
-  AttributeStringPtr aStringAttr = aData->string("export_file_format");
+  AttributeStringPtr aStringAttr = aData->string(attributeID("format"));
   mySelectedFilter = formatToFilter(shortFormatToFullFormat(QString::fromStdString(aStringAttr->value())));
 
   return ModuleBase_WidgetFileSelector::restoreValue();
@@ -40,7 +40,7 @@ bool PartSet_WidgetFileSelector::storeValueCustom() const
     return false;
 
   DataPtr aData = myFeature->data();
-  AttributeStringPtr aStringAttr = aData->string("export_file_format");
+  AttributeStringPtr aStringAttr = aData->string(attributeID("format"));
   aStringAttr->setValue(filterToShortFormat(mySelectedFilter).toStdString());
 
   return ModuleBase_WidgetFileSelector::storeValueCustom();
index 8b71001e8c147cb98fe5213b77feb2834ade8bea..e93df15a90aef7896aaf8364a72fc511be7e1d5e 100644 (file)
@@ -19,7 +19,7 @@ class PartSet_ExternalObjectsMgr;
 
 /**
 * \ingroup Modules
-* Customosation of ModuleBase_WidgetMultiSelector in order to provide 
+* Customization of ModuleBase_WidgetMultiSelector in order to provide
 * working with sketch specific objects and creation of external objects.
 */
 class PARTSET_EXPORT PartSet_WidgetMultiSelector: public ModuleBase_WidgetMultiSelector
@@ -29,7 +29,7 @@ Q_OBJECT
   /// Constructor
   /// \param theParent the parent object
   /// \param theWorkshop instance of workshop interface
-  /// \param theData the widget configuation. The attribute of the model widget is obtained from
+  /// \param theData the widget configuration. The attribute of the model widget is obtained from
   /// \param theParentId is Id of a parent of the current attribute
   PartSet_WidgetMultiSelector(QWidget* theParent, ModuleBase_IWorkshop* theWorkshop,
     const Config_WidgetAPI* theData, const std::string& theParentId);
@@ -43,7 +43,7 @@ Q_OBJECT
   /// \param theSketch a sketcher object
   void setSketcher(CompositeFeaturePtr theSketch) { mySketch = theSketch; }
 
-  /// Retrurns installed sketcher
+  /// Returns installed sketcher
   CompositeFeaturePtr sketch() const { return mySketch; }
 
   /// Fills the attribute with the value of the selected owner
@@ -81,4 +81,4 @@ protected:
   bool myIsInVaildate;
 };
 
-#endif
\ No newline at end of file
+#endif