]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Parameters manager implementation
authorvsv <vitaly.smetannikov@opencascade.com>
Tue, 12 Apr 2016 12:41:38 +0000 (15:41 +0300)
committervsv <vitaly.smetannikov@opencascade.com>
Tue, 19 Apr 2016 07:51:52 +0000 (10:51 +0300)
31 files changed:
src/Config/Config_DataModelReader.cpp
src/Config/Config_DataModelReader.h
src/Config/Config_FeatureMessage.cpp
src/Config/Config_FeatureMessage.h
src/Config/Config_FeatureReader.cpp
src/Config/Config_Keywords.h
src/Config/dataModel.xml
src/ModuleBase/ModuleBase_ActionInfo.cpp
src/ModuleBase/ModuleBase_ActionInfo.h
src/ParametersPlugin/CMakeLists.txt
src/ParametersPlugin/ParametersPlugin_ParametersMgr.cpp [new file with mode: 0644]
src/ParametersPlugin/ParametersPlugin_ParametersMgr.h [new file with mode: 0644]
src/ParametersPlugin/ParametersPlugin_Plugin.cpp
src/ParametersPlugin/ParametersPlugin_WidgetCreator.cpp [new file with mode: 0644]
src/ParametersPlugin/ParametersPlugin_WidgetCreator.h [new file with mode: 0644]
src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.cpp [new file with mode: 0644]
src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.h [new file with mode: 0644]
src/ParametersPlugin/plugin-Parameters.xml
src/PartSet/PartSet_icons.qrc
src/PartSet/icons/expression.png [new file with mode: 0644]
src/PartSet/icons/paper_roll.png [new file with mode: 0644]
src/XGUI/XGUI_ContextMenuMgr.cpp
src/XGUI/XGUI_ContextMenuMgr.h
src/XGUI/XGUI_DataModel.cpp
src/XGUI/XGUI_DataModel.h
src/XGUI/XGUI_ObjectsBrowser.cpp
src/XGUI/XGUI_ObjectsBrowser.h
src/XGUI/XGUI_Workshop.cpp
src/XGUI/XGUI_Workshop.h
src/XGUI/XGUI_pictures.qrc
src/XGUI/pictures/expression.png [deleted file]

index e9113e85e9bb99c1058a6f122b578814714d8b61..b02ae823c92bbfda2cb7be86ab79f224d2a11a90 100644 (file)
@@ -33,6 +33,7 @@ void Config_DataModelReader::processNode(xmlNodePtr theNode)
    
     std::string aIcon = getProperty(theNode, NODE_ICON);
     std::string aEmpty = getProperty(theNode, SHOW_EMPTY);
+    std::string aFeatures = getProperty(theNode, FOLDER_FEATURES);
     std::string::iterator aIt;
     for (aIt = aEmpty.begin(); aIt != aEmpty.end(); aIt++) {
       (*aIt) = toupper(*aIt);
@@ -44,11 +45,13 @@ void Config_DataModelReader::processNode(xmlNodePtr theNode)
       myRootFolderTypes.push_back(aGroupType);
       myRootFolderIcons.push_back(aIcon);
       myRootFolderShowEmpty.push_back(aIsEmpty);
+      myRootFeaturesList.push_back(aFeatures);
    } else {
       mySubFolderNames.push_back(aName);
       mySubFolderTypes.push_back(aGroupType);
       mySubFolderIcons.push_back(aIcon);
       mySubFolderShowEmpty.push_back(aIsEmpty);
+      mySubFeaturesList.push_back(aFeatures);
    }
   } else if  (isNode(theNode, ROOT_DOCUMENT, NULL)) {
     isRootReading = true;
@@ -86,3 +89,35 @@ int Config_DataModelReader::subFolderId(std::string theType) const
   }
   return -1;
 }
+
+std::string getFolderFeatures(const std::string& theFolderName, 
+                    const std::vector<std::string>& theNames,
+                    const std::vector<std::string>& theFeatures)
+{
+  int aId;
+  bool aFound = false;
+  std::vector<std::string>::const_iterator aIt;
+  for(aIt = theNames.cbegin(), aId = 0; aIt != theNames.cend(); ++aIt, ++aId) {
+    if ((*aIt) == theFolderName) {
+      aFound = true;
+      break;
+    }
+  }
+  if (aFound)
+    return theFeatures.at(aId);
+  return std::string();
+}
+
+std::string Config_DataModelReader::
+  subFolderFeatures(const std::string& theFolderName) const
+{
+  return getFolderFeatures(theFolderName, mySubFolderNames, mySubFeaturesList);
+}
+
+
+std::string Config_DataModelReader::
+  rootFolderFeatures(const std::string& theFolderName) const
+{
+  return getFolderFeatures(theFolderName, myRootFolderNames, myRootFeaturesList);
+}
+
index b5d9b58745c2ef3f6f4b5376ffa25978d459a065..d40fee1affaf85d8ac61c2e615492e9b36c9d7ca 100644 (file)
@@ -58,6 +58,9 @@ class Config_DataModelReader : public Config_XMLReader
   /// \param theId id of the folder
   CONFIG_EXPORT bool rootShowEmpty(int theId) const { return myRootFolderShowEmpty[theId]; }
 
+  /// Returns list of features attached to folder with name theFolderName in sub-document
+  /// \param theFolderName a name of the folder
+  CONFIG_EXPORT std::string rootFolderFeatures(const std::string& theFolderName) const;
 
 
   // SUB folders propertiues ********************
@@ -87,6 +90,11 @@ class Config_DataModelReader : public Config_XMLReader
   /// \param theType type of objects in folder
   CONFIG_EXPORT int subFolderId(std::string theType) const;
 
+  /// Returns list of features attached to folder with name theFolderName in sub-document
+  /// \param theFolderName a name of the folder
+  CONFIG_EXPORT std::string subFolderFeatures(const std::string& theFolderName) const;
+
+
   /// Returns true if the sub-document data tree has to be attached to Part Result node
   /// Otherwise it has to be connected to Part feature node
   CONFIG_EXPORT bool isAttachToResult() const { return myIsResultLink; }
@@ -102,6 +110,7 @@ private:
   std::vector<std::string> myRootFolderNames;
   std::vector<std::string> myRootFolderTypes;
   std::vector<std::string> myRootFolderIcons;
+  std::vector<std::string> myRootFeaturesList;
   std::vector<bool> myRootFolderShowEmpty;
 
   std::string myRootTypes;
@@ -110,6 +119,7 @@ private:
   std::vector<std::string> mySubFolderNames;
   std::vector<std::string> mySubFolderTypes;
   std::vector<std::string> mySubFolderIcons;
+  std::vector<std::string> mySubFeaturesList;
   std::vector<bool> mySubFolderShowEmpty;
 
   bool myIsResultLink;
index a5fd9fd45fbe12e1868f1d44de797a3a6fc544c2..2ed47f4df2bfc14b0e1a6afb23618ba8bcdd63d9 100644 (file)
@@ -130,6 +130,11 @@ bool Config_FeatureMessage::isAutoPreview() const
   return myIsAutoPreview;
 }
 
+bool Config_FeatureMessage::isModal() const
+{
+  return myModal;
+}
+
 void Config_FeatureMessage::setUseInput(bool isUseInput)
 {
   myUseInput = isUseInput;
@@ -140,6 +145,11 @@ void Config_FeatureMessage::setInternal(bool isInternal)
   myInternal = isInternal;
 }
 
+void Config_FeatureMessage::setModal(bool isModal)
+{
+  myModal = isModal;
+}
+
 const std::string& Config_FeatureMessage::nestedFeatures() const
 {
   return myNestedFeatures;
index 481bbf97bc0a025b32794742ccf1f24a4b50010b..d2f75851360615285d3e5f9ab05171c6134258db 100644 (file)
@@ -32,6 +32,7 @@ class Config_FeatureMessage : public Events_Message
 \r
   bool myUseInput;  ///<Action is being checked until user commit the operation\r
   bool myInternal;  ///<Internal feature without GUI representation\r
+  bool myModal;     ///<True if the feature has to be represented by modal dialog box\r
   bool myIsAutoPreview; ///< Preview computation is performed automatically\r
 \r
   std::string myNestedFeatures; ///<Space separated list of child features\r
@@ -83,6 +84,8 @@ class Config_FeatureMessage : public Events_Message
   CONFIG_EXPORT bool isUseInput() const;\r
   /// If true - feature will not be added into the workbench\r
   CONFIG_EXPORT bool isInternal() const;\r
+  /// If true - the feature will be represented by modal dialog box GUI\r
+  CONFIG_EXPORT bool isModal() const;\r
 \r
   /// If true - preview of the feature is done by any modification of the feature attributes\r
   CONFIG_EXPORT bool isAutoPreview() const;\r
@@ -115,6 +118,8 @@ class Config_FeatureMessage : public Events_Message
   CONFIG_EXPORT void setInternal(bool isInternal);\r
   ///Set auto preview state; If true - preview of the feature is computed automatically\r
   CONFIG_EXPORT void setAutoPreview(bool isAutoPreview);\r
+  ///Set modality state; If true - the feature will be represented by modal dialog box GUI\r
+  CONFIG_EXPORT void setModal(bool isModal);\r
 };\r
 \r
 #endif // CONFIG_MESSAGE_H\r
index 6998dcecfa012a0a0fdddacb1948a0526331e948..82ea91252b26412e27871c7e79a97e3d580b4dd3 100644 (file)
@@ -120,6 +120,7 @@ void Config_FeatureReader::fillFeature(xmlNodePtr theFeatureNode,
   outFeatureMessage->setPluginLibrary(myLibraryName);
   outFeatureMessage->setNestedFeatures(getProperty(theFeatureNode, FEATURE_NESTED));
   outFeatureMessage->setActionsWhenNested(getNormalizedProperty(theFeatureNode, FEATURE_WHEN_NESTED));
+  outFeatureMessage->setModal(getBooleanAttribute(theFeatureNode, FEATURE_MODAL, false));
 
   bool isInternal = getBooleanAttribute(theFeatureNode, ATTR_INTERNAL, false);
   outFeatureMessage->setInternal(isInternal);
@@ -127,6 +128,7 @@ void Config_FeatureReader::fillFeature(xmlNodePtr theFeatureNode,
     //Internal feature has no visual representation.
     return;
   }
+  
   outFeatureMessage->setText(getProperty(theFeatureNode, FEATURE_TEXT));
   outFeatureMessage->setTooltip(getProperty(theFeatureNode, FEATURE_TOOLTIP));
   outFeatureMessage->setIcon(getProperty(theFeatureNode, FEATURE_ICON));
index 7824c685d7311add72765f685b52b899ee5efaaf..471d0b9da633e976ba8c2a61a63076d8682925d4 100644 (file)
@@ -63,6 +63,7 @@ const static char* FEATURE_WHEN_NESTED = "when_nested";
 const static char* FEATURE_WHEN_NESTED_ACCEPT = "accept";
 const static char* FEATURE_WHEN_NESTED_ABORT = "abort";
 const static char* FEATURE_DOC = WORKBENCH_DOC;
+const static char* FEATURE_MODAL = "modal";
 const static char* FEATURE_AUTO_PREVIEW = "auto_preview";
 // NODE_VALIDATOR properties, NODE_SELFILTER properties
 const static char* _PARAMETERS = "parameters";
@@ -117,5 +118,6 @@ const static char* SUB_DOCUMENT = "sub_document";
 const static char* NODE_ICON = "icon";
 const static char* SHOW_EMPTY = "show_empty";
 const static char* LINK_ITEM = "from_result";
+const static char* FOLDER_FEATURES = "folder_features";
 
 #endif /* CONFIG_KEYWORDS_H_ */
index cfc47b4f661327162eccade31e2ebb8f22a2dc28..c9742ab12c5ab9ba7012402d98e698529455ae7b 100644 (file)
@@ -1,12 +1,14 @@
 <!-- Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
 <data_model>
     <root_document group_type="Features">
-        <folder name="Parameters" group_type="Parameters" icon=":pictures/params_folder.png"/>
+        <folder name="Parameters" group_type="Parameters" icon=":pictures/params_folder.png"
+                folder_features="ParametersMgr"/>
         <folder name="Constructions" group_type="Construction" icon=":pictures/constr_folder.png"/>
         <folder name="Parts" group_type="Parts" icon=":pictures/constr_folder.png"/>
     </root_document>
     <sub_document group_type="Features" from_result="false">
-        <folder name="Parameters" group_type="Parameters" icon=":pictures/params_folder.png"/>
+        <folder name="Parameters" group_type="Parameters" icon=":pictures/params_folder.png"
+                folder_features="ParametersMgr"/>
         <folder name="Constructions" group_type="Construction" icon=":pictures/constr_folder.png"/>
         <folder name="Groups" group_type="Groups" icon=":pictures/constr_folder.png" show_empty="false"/>
         <folder name="Bodies" group_type="Bodies" icon=":pictures/constr_folder.png"/>
index 897805b731562d0a6213234aeedef9e55d4c49b6..7966f3461b86b5ee28f88a46406507dbf4e35b3a 100644 (file)
@@ -65,6 +65,8 @@ void ModuleBase_ActionInfo::initFrom(std::shared_ptr<Config_FeatureMessage> theM
   }
   // If feature requires PropertyPannel for input, it should be checkable
   checkable = theMessage->isUseInput();
+  // If Feature requires modal Dialog box for input
+  modal = theMessage->isModal();
 }
 
 QAction* ModuleBase_ActionInfo::makeAction(QObject* theParent)
index 16ac4e33127c6635f842f87f536dc3b555ae0b33..a726d137f2c9f0f14bae386ff007097bc016c174 100644 (file)
@@ -28,6 +28,7 @@ struct MODULEBASE_EXPORT ModuleBase_ActionInfo
   bool checked; //!< action's checked state
   bool enabled; //!< action's enabled state
   bool visible; //!< action's visibility state
+  bool modal;   //!< = true if the acton is a modal dialog box else property panel (==false by default)
   QIcon icon; //!< action's icon
   QString text; //!< action's text
   QString iconText; //!< action's descriptive icon text
index b2683044d8ae39328827252d39edda52e6ff49aa..de8a14c2c6eb6909d2d4a57153b2c9d92dce64c1 100644 (file)
@@ -1,6 +1,7 @@
 INCLUDE(Common)
 INCLUDE(FindPython)
 INCLUDE(UnitTest)
+SET(CMAKE_AUTOMOC ON)
 
 SET(PROJECT_HEADERS
     ParametersPlugin.h
@@ -9,6 +10,9 @@ SET(PROJECT_HEADERS
     ParametersPlugin_PyInterp.h
     ParametersPlugin_Validators.h
     ParametersPlugin_EvalListener.h
+    ParametersPlugin_WidgetCreator.h
+    ParametersPlugin_ParametersMgr.h
+    ParametersPlugin_WidgetParamsMgr.h
 )
 
 SET(PROJECT_SOURCES
@@ -17,6 +21,9 @@ SET(PROJECT_SOURCES
     ParametersPlugin_PyInterp.cpp
     ParametersPlugin_Validators.cpp
     ParametersPlugin_EvalListener.cpp
+    ParametersPlugin_WidgetCreator.cpp
+    ParametersPlugin_ParametersMgr.cpp
+    ParametersPlugin_WidgetParamsMgr.cpp
 )
 
 SET(XML_RESOURCES
@@ -28,6 +35,7 @@ INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/Events
                     ${PROJECT_SOURCE_DIR}/src/ModelAPI
                     ${PROJECT_SOURCE_DIR}/src/GeomAPI
                     ${PROJECT_SOURCE_DIR}/src/GeomDataAPI
+                    ${PROJECT_SOURCE_DIR}/src/ModuleBase
                     ${SUIT_INCLUDE}
                     ${PYTHON_INCLUDE_DIR}
 )
@@ -38,8 +46,10 @@ SET(PROJECT_LIBRARIES
     Events
     Config
     ModelAPI
+    ModuleBase
     ${PyInterp}
     ${PYTHON_LIBRARIES}
+    ${QT_LIBRARIES}
 )
 
 ADD_DEFINITIONS(-DPARAMETERSPLUGIN_EXPORTS -DHAVE_DEBUG_PYTHON)
diff --git a/src/ParametersPlugin/ParametersPlugin_ParametersMgr.cpp b/src/ParametersPlugin/ParametersPlugin_ParametersMgr.cpp
new file mode 100644 (file)
index 0000000..4c3b402
--- /dev/null
@@ -0,0 +1,27 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
+// File:        ParametersPlugin_ParametersMgr.cpp
+// Created:     07 April 2016
+// Author:      vsv
+
+#include <pyconfig.h>
+
+#include "ParametersPlugin_ParametersMgr.h"
+
+
+ParametersPlugin_ParametersMgr::ParametersPlugin_ParametersMgr()
+  : ModelAPI_Feature()
+{
+}
+
+ParametersPlugin_ParametersMgr::~ParametersPlugin_ParametersMgr()
+{
+}
+
+void ParametersPlugin_ParametersMgr::initAttributes()
+{
+}
+
+void ParametersPlugin_ParametersMgr::execute()
+{
+}
diff --git a/src/ParametersPlugin/ParametersPlugin_ParametersMgr.h b/src/ParametersPlugin/ParametersPlugin_ParametersMgr.h
new file mode 100644 (file)
index 0000000..374399a
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
+// File:        ParametersPlugin_ParametersMgr.h
+// Created:     07 April 2016
+// Author:      vsv
+
+#ifndef PARAMETERSPLUGIN_PARAMETERSMGR_H_
+#define PARAMETERSPLUGIN_PARAMETERSMGR_H_
+
+#include "ParametersPlugin.h"
+#include <ModelAPI_Feature.h>
+
+/**
+ * \class ParametersPlugin_ParametersMgr
+ * \ingroup Plugins
+ * \brief A macro feature which manages list of parameters in the current document.
+ */
+
+class ParametersPlugin_ParametersMgr : public ModelAPI_Feature
+{
+public:
+  /// Feature kind
+  inline static const std::string& ID()
+  {
+    static const std::string MY_PARAMSMGR_ID("ParametersMgr");
+    return MY_PARAMSMGR_ID;
+  }
+
+  /// Use plugin manager for features creation
+  ParametersPlugin_ParametersMgr();
+
+  /// Destructor
+  virtual ~ParametersPlugin_ParametersMgr();
+
+  /// Request for initialization of data model of the feature: adding all attributes
+  PARAMETERSPLUGIN_EXPORT virtual void initAttributes();
+
+  /// Returns the unique kind of a feature
+  PARAMETERSPLUGIN_EXPORT virtual const std::string& getKind()
+  {
+    static std::string MY_KIND = ParametersPlugin_ParametersMgr::ID();
+    return MY_KIND;
+  };
+
+  /// Computes or recomputes the results
+  PARAMETERSPLUGIN_EXPORT virtual void execute();
+
+  /// Reimplemented from ModelAPI_Feature::isMacro(). Returns true.
+  PARAMETERSPLUGIN_EXPORT virtual bool isMacro() const { return true; }
+
+  /// Reimplemented from ModelAPI_Feature::isPreviewNeeded(). Returns false.
+  PARAMETERSPLUGIN_EXPORT virtual bool isPreviewNeeded() const { return false; }
+};
+
+
+#endif
\ No newline at end of file
index e82a5f67d87b20207d5e2e05aebd2f552813e594..975ca1e3a32eff654ca3bd9cf30239727832cb9e 100644 (file)
@@ -4,7 +4,11 @@
 
 #include <ParametersPlugin_Plugin.h>
 #include <ParametersPlugin_Parameter.h>
+#include <ParametersPlugin_ParametersMgr.h>
 #include <ParametersPlugin_Validators.h>
+#include <ParametersPlugin_WidgetCreator.h>
+
+#include <ModuleBase_WidgetCreatorFactory.h>
 
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Validator.h>
@@ -17,6 +21,10 @@ static ParametersPlugin_Plugin* MY_PARAMETERSPLUGIN_INSTANCE = new ParametersPlu
 ParametersPlugin_Plugin::ParametersPlugin_Plugin()
 {
   // register this plugin
+  WidgetCreatorFactoryPtr aWidgetCreatorFactory = ModuleBase_WidgetCreatorFactory::get();
+  aWidgetCreatorFactory->registerCreator(
+   std::shared_ptr<ParametersPlugin_WidgetCreator>(new ParametersPlugin_WidgetCreator()));
+
   SessionPtr aSession = ModelAPI_Session::get();
   aSession->registerPlugin(this);
 
@@ -35,6 +43,9 @@ FeaturePtr ParametersPlugin_Plugin::createFeature(std::string theFeatureID)
   if (theFeatureID == ParametersPlugin_Parameter::ID()) {
     return FeaturePtr(new ParametersPlugin_Parameter);
   }
+  if (theFeatureID == ParametersPlugin_ParametersMgr::ID()) {
+    return FeaturePtr(new ParametersPlugin_ParametersMgr);
+  }
   return FeaturePtr();
 }
 
diff --git a/src/ParametersPlugin/ParametersPlugin_WidgetCreator.cpp b/src/ParametersPlugin/ParametersPlugin_WidgetCreator.cpp
new file mode 100644 (file)
index 0000000..f78e8a2
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        ParametersPlugin_WidgetCreator.cpp
+// Created:     11 Apr 2016
+// Author:      Vitaly SMETANNIKOV
+
+#include <ParametersPlugin_WidgetCreator.h>
+#include <ParametersPlugin_WidgetParamsMgr.h>
+
+
+ParametersPlugin_WidgetCreator::ParametersPlugin_WidgetCreator()
+  : ModuleBase_IWidgetCreator()
+{
+}
+
+
+void ParametersPlugin_WidgetCreator::widgetTypes(std::set<std::string>& theTypes)
+{
+  theTypes.clear();
+  theTypes.insert("parameters-manager");
+}
+
+
+ModuleBase_ModelWidget* 
+  ParametersPlugin_WidgetCreator::createWidgetByType(const std::string& theType,
+                                                     QWidget* theParent,
+                                                     Config_WidgetAPI* theWidgetApi,
+                                                     ModuleBase_IWorkshop* /*theWorkshop*/)
+{
+  ModuleBase_ModelWidget* aModelWidget = 0;
+  if (theType == "parameters-manager") {
+    aModelWidget = new ParametersPlugin_WidgetParamsMgr(theParent, theWidgetApi);
+  }
+  return aModelWidget;
+}
diff --git a/src/ParametersPlugin/ParametersPlugin_WidgetCreator.h b/src/ParametersPlugin/ParametersPlugin_WidgetCreator.h
new file mode 100644 (file)
index 0000000..872fd55
--- /dev/null
@@ -0,0 +1,44 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
+// File:        ParametersPlugin_WidgetCreator.h
+// Created:     11 Apr 2016
+// Author:      Vitaly SMETANNIKOV
+
+#ifndef ParametersPlugin_WidgetCreator_H
+#define ParametersPlugin_WidgetCreator_H
+
+#include "ParametersPlugin.h"
+
+#include <ModuleBase_IWidgetCreator.h>
+
+#include <string>
+#include <set>
+
+/** 
+* \ingroup GUI
+* Interface to WidgetCreator which can create specific widgets by type
+*/
+class ParametersPlugin_WidgetCreator : public ModuleBase_IWidgetCreator
+{
+public:
+  /// Default constructor
+  ParametersPlugin_WidgetCreator();
+
+  /// Returns a container of possible widget types, which this creator can process
+  /// \param a list of type names
+  virtual void widgetTypes(std::set<std::string>& theTypes);
+
+  /// Create widget by its type
+  /// The default implementation is empty
+  /// \param theType a type
+  /// \param theParent a parent widget
+  /// \param theData a low-level API for reading xml definitions of widgets
+  /// \param theWorkshop a current workshop
+  /// \return a created model widget or null
+  virtual ModuleBase_ModelWidget* createWidgetByType(const std::string& theType,
+                                                     QWidget* theParent,
+                                                     Config_WidgetAPI* theWidgetApi,
+                                                     ModuleBase_IWorkshop* /*theWorkshop*/);
+};
+
+#endif
diff --git a/src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.cpp b/src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.cpp
new file mode 100644 (file)
index 0000000..0328741
--- /dev/null
@@ -0,0 +1,62 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
+// File:        ParametersPlugin_WidgetParamsMgr.cpp
+// Created:     11 Apr 2016
+// Author:      Vitaly SMETANNIKOV
+
+#include "ParametersPlugin_WidgetParamsMgr.h"
+
+#include <QLayout>
+#include <QTreeWidget>
+#include <QPushButton>
+#include <QToolButton>
+
+ParametersPlugin_WidgetParamsMgr::ParametersPlugin_WidgetParamsMgr(QWidget* theParent, const Config_WidgetAPI* theData)
+  : ModuleBase_ModelWidget(theParent, theData)
+{
+  QVBoxLayout* aLayout = new QVBoxLayout(this);
+
+  myTable = new QTreeWidget(this);
+  myTable->setColumnCount(4);
+  QStringList aHeaders;
+  aHeaders << tr("Name") << tr("Equation") << tr("Result") << tr("Comment");
+  myTable->setHeaderLabels(aHeaders);
+  aLayout->addWidget(myTable);
+
+  QHBoxLayout* aBtnLayout = new QHBoxLayout(this);
+
+  QToolButton* aUpBtn = new QToolButton(this);
+  aUpBtn->setArrowType(Qt::DownArrow);
+  aBtnLayout->addWidget(aUpBtn);
+  QToolButton* aDownBtn = new QToolButton(this);
+  aDownBtn->setArrowType(Qt::UpArrow);
+  aBtnLayout->addWidget(aDownBtn);
+
+  aBtnLayout->addStretch();
+
+  QPushButton* aAddBtn = new QPushButton(tr("Add"), this);
+  aBtnLayout->addWidget(aAddBtn);
+  QPushButton* aInsertBtn = new QPushButton(tr("Insert"), this);
+  aBtnLayout->addWidget(aInsertBtn);
+  QPushButton* aRemoveBtn = new QPushButton(tr("Remove"), this);
+  aBtnLayout->addWidget(aRemoveBtn);
+
+  aLayout->addLayout(aBtnLayout);
+}
+
+QList<QWidget*> ParametersPlugin_WidgetParamsMgr::getControls() const
+{
+  QList<QWidget*> aList;
+
+  return aList;
+}
+
+bool ParametersPlugin_WidgetParamsMgr::storeValueCustom() const
+{
+  return true;
+}
+
+bool ParametersPlugin_WidgetParamsMgr::restoreValueCustom()
+{
+  return true;
+}
diff --git a/src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.h b/src/ParametersPlugin/ParametersPlugin_WidgetParamsMgr.h
new file mode 100644 (file)
index 0000000..22fe78d
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
+// File:        ParametersPlugin_WidgetParamsMgr.h
+// Created:     11 Apr 2016
+// Author:      Vitaly SMETANNIKOV
+
+#ifndef ParametersPlugin_WidgetParamsMgr_H_
+#define ParametersPlugin_WidgetParamsMgr_H_
+
+#include <ModuleBase_ModelWidget.h>
+
+class QTreeWidget;
+
+/*!
+ * \ingroup GUI
+ * Represent a content of the property panel to show/modify parameters of some feature.
+ */
+class ParametersPlugin_WidgetParamsMgr : public ModuleBase_ModelWidget
+{
+ Q_OBJECT
+public:
+  /// Constructs a model widget
+  ParametersPlugin_WidgetParamsMgr(QWidget* theParent, const Config_WidgetAPI* theData);
+
+  /// Destructs the model widget
+  virtual ~ParametersPlugin_WidgetParamsMgr() {}
+
+  /// Returns list of widget controls
+  /// \return a control list
+  virtual QList<QWidget*> getControls() const;
+
+protected:
+  /// Saves the internal parameters to the given feature
+  /// \return True in success
+  virtual bool storeValueCustom() const;
+
+  /// Restore value from attribute data to the widget's control
+  virtual bool restoreValueCustom();
+
+private:
+
+  QTreeWidget* myTable;
+};
+
+
+#endif
\ No newline at end of file
index 3bab3831fd5f96cd253abc23cfb4aab19e84301f..7eb78f185ee17de7085903ce8ee6350b4428302d 100644 (file)
@@ -3,14 +3,18 @@
 <plugin>
   <workbench id="Part">
     <group id="Parameters">
-      <feature id="Parameter" title="Parameter" tooltip="Create a parameter" icon=":pictures/expression.png">
-        <stringvalue id="variable" label="Name" icon=":pictures/expression.png" placeholder="Please input the parameter name">
+      <feature id="Parameter" title="Parameter" tooltip="Create a parameter" icon=":icons/expression.png">
+        <stringvalue id="variable" label="Name" icon=":icons/expression.png" placeholder="Please input the parameter name">
           <validator id="Parameters_VariableValidator"/>
         </stringvalue>
         <expr_editor id="expression" placeholder="Please input the expression">
           <validator id="Parameters_ExpressionValidator"/>
         </expr_editor>
       </feature>
+      
+      <feature id="ParametersMgr" title="Parameters" tooltip="Manage parameters" icon=":icons/paper_roll.png" modal="true">
+        <parameters-manager/>
+      </feature>
     </group>
   </workbench>
 </plugin>
index 270a9428fe5b213cbd4e21455904b45b8e2d052b..d4b209b39177a6c4460b7b2fd132126264c2c0d2 100644 (file)
@@ -10,5 +10,7 @@
      <file>icons/hand_point.png</file>
      <file>icons/move_to_end.png</file>
      <file>icons/sketch_shape.png</file>
+     <file>icons/expression.png</file>
+     <file>icons/paper_roll.png</file>
  </qresource>
  </RCC>
diff --git a/src/PartSet/icons/expression.png b/src/PartSet/icons/expression.png
new file mode 100644 (file)
index 0000000..158678a
Binary files /dev/null and b/src/PartSet/icons/expression.png differ
diff --git a/src/PartSet/icons/paper_roll.png b/src/PartSet/icons/paper_roll.png
new file mode 100644 (file)
index 0000000..001b759
Binary files /dev/null and b/src/PartSet/icons/paper_roll.png differ
index bfd87b0ed693187d4f3a08a93464af604c02466c..101a18722d4b8f400efebdaa4d76b4f8678337f0 100644 (file)
@@ -11,6 +11,7 @@
 #include "XGUI_DataModel.h"
 #include "XGUI_OperationMgr.h"
 #include "XGUI_Tools.h"
+#include "XGUI_ActionsMgr.h"
 
 #ifndef HAVE_SALOME
 #include <AppElements_MainWindow.h>
@@ -28,6 +29,8 @@
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_Tools.h>
 
+#include <Config_DataModelReader.h>
+
 #include <ModuleBase_IModule.h>
 #include <ModuleBase_Tools.h>
 #include <ModuleBase_OperationAction.h>
@@ -39,6 +42,7 @@
 #include <QMenu>
 #include <QMdiArea>
 #include <QMainWindow>
+#include <QModelIndex>
 
 
 XGUI_ContextMenuMgr::XGUI_ContextMenuMgr(XGUI_Workshop* theParent)
@@ -510,9 +514,11 @@ void XGUI_ContextMenuMgr::addObjBrowserMenu(QMenu* theMenu) const
       aActions.append(action("DELETE_CMD"));
   }
   theMenu->addActions(aActions);
+  addFeatures(theMenu);
 
-  theMenu->addSeparator();
-  theMenu->addActions(myWorkshop->objectBrowser()->actions());
+  // It is commented out because Object Browser does not have actions
+  //theMenu->addSeparator();
+  //theMenu->addActions(myWorkshop->objectBrowser()->actions());
 }
 
 void XGUI_ContextMenuMgr::addViewerMenu(QMenu* theMenu) const
@@ -611,3 +617,48 @@ void XGUI_ContextMenuMgr::onRename()
   myWorkshop->objectBrowser()->setObjectsSelected(anObjects);
   myWorkshop->objectBrowser()->onEditItem();
 }
+
+void XGUI_ContextMenuMgr::addFeatures(QMenu* theMenu) const
+{
+  SessionPtr aMgr = ModelAPI_Session::get();
+  DocumentPtr aActiveDoc = aMgr->activeDocument();
+
+  XGUI_SelectionMgr* aSelMgr = myWorkshop->selector();
+  XGUI_ActionsMgr* aActionMgr = myWorkshop->actionsMgr();
+  const Config_DataModelReader* aDataModelXML = myWorkshop->dataModelXMLReader();
+  QModelIndexList aSelectedIndexes = aSelMgr->selection()->selectedIndexes();
+
+  QString aName;
+  int aLen = 0;
+  bool aIsRoot = false;
+  foreach(QModelIndex aIdx, aSelectedIndexes) {
+    // Process only first column
+    if (aIdx.column() == 0) {
+      aIsRoot = !aIdx.parent().isValid();
+      // Exit if the selected index belongs to non active document
+      if (aIsRoot && (aActiveDoc != aMgr->moduleDocument()))
+        return;
+      if ((!aIsRoot) && (aIdx.internalPointer() != aActiveDoc.get()))
+        return;
+      
+      // Get name of the selected index
+      aName = aIdx.data().toString();
+      aLen = aName.indexOf('(');
+      if (aLen != -1) {
+        aName = aName.left(--aLen);
+      }
+      std::string aFeaturesStr = aIsRoot? 
+        aDataModelXML->rootFolderFeatures(aName.toStdString()) :
+        aDataModelXML->subFolderFeatures(aName.toStdString());
+        if (aFeaturesStr.length() > 0) {
+          QStringList aFeturesList = 
+            QString(aFeaturesStr.c_str()).split(",", QString::SkipEmptyParts);
+          foreach(QString aFea, aFeturesList) {
+            QAction* aAction = aActionMgr->action(aFea);
+            if (aAction)
+              theMenu->addAction(aAction);
+          }
+        }
+    }
+  }
+}
index 34e3d7b92a8b02e30fd4ff39db07404b4ba6c98f..52c1e6381cf762e622f871b4cbde407bd06cb941 100644 (file)
@@ -95,6 +95,8 @@ signals:
    */
   void addAction(const QString& theId, QAction* theAction);
 
+  void addFeatures(QMenu* theMenu) const;
+
   /// Updates menu for object browser
   void updateObjectBrowserMenu();
 
index 5e1c15d71bb7e3a3893948cbe5ce32ddb7cdf10a..3e7b0e7967c38f7e2e2127e5d4dfd97429daeda1 100644 (file)
@@ -19,6 +19,7 @@
 #include <ModelAPI_Tools.h>
 
 #include <Config_FeatureMessage.h>
+#include <Config_DataModelReader.h>
 
 #include <Events_Loop.h>
 #include <Events_Error.h>
@@ -64,8 +65,6 @@ ModelAPI_Document* getSubDocument(void* theObj)
 // Constructor *************************************************
 XGUI_DataModel::XGUI_DataModel(QObject* theParent) : QAbstractItemModel(theParent)
 {
-  myXMLReader.readAll();
-
   Events_Loop* aLoop = Events_Loop::loop();
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED));
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED));
@@ -74,12 +73,16 @@ XGUI_DataModel::XGUI_DataModel(QObject* theParent) : QAbstractItemModel(theParen
   aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED));
 }
 
+XGUI_DataModel::~XGUI_DataModel()
+{
+}
+
 //******************************************************
 void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMessage)
 {
   DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
-  std::string aRootType = myXMLReader.rootType();
-  std::string aSubType = myXMLReader.subType();
+  std::string aRootType = myXMLReader->rootType();
+  std::string aSubType = myXMLReader->subType();
   int aNbFolders = foldersCount();
 
   // Created object event *******************
@@ -104,7 +107,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
         foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
           if ((aNotEmptyFolder.toStdString() == aObjType) && (aRootDoc->size(aObjType) == 1))
             // Appears first object in folder which can not be shown empty
-            insertRow(myXMLReader.rootFolderId(aObjType));
+            insertRow(myXMLReader->rootFolderId(aObjType));
         }
         // Insert new object
         int aRow = aRootDoc->size(aObjType) - 1;
@@ -112,7 +115,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
           if (aObjType == aRootType) {
             insertRow(aRow + aNbFolders + 1);
           } else {
-            int aFolderId = myXMLReader.rootFolderId(aObjType);
+            int aFolderId = myXMLReader->rootFolderId(aObjType);
             if (aFolderId != -1) {
               insertRow(aRow, createIndex(aFolderId, 0, -1));
             }
@@ -127,7 +130,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
           foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
             if ((aNotEmptyFolder.toStdString() == aObjType) && (aDoc->size(aObjType) == 1))
               // Appears first object in folder which can not be shown empty
-              insertRow(myXMLReader.subFolderId(aObjType), aDocRoot);
+              insertRow(myXMLReader->subFolderId(aObjType), aDocRoot);
           }
           int aRow = aDoc->index(aObject);
           if (aRow != -1) {
@@ -171,7 +174,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
           rebuildBranch(aNbFolders, aRow);
         } else {
           // Process root sub-folder
-          int aFolderId = myXMLReader.rootFolderId(aGroup);
+          int aFolderId = myXMLReader->rootFolderId(aGroup);
           if (aFolderId != -1) {
             QModelIndex aFolderIndex = createIndex(aFolderId, 0, -1);
             removeRow(aRow, aFolderIndex);
@@ -183,8 +186,8 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
         foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
           if ((aNotEmptyFolder.toStdString() == aGroup) && (aRootDoc->size(aGroup) == 0)) {
             // Appears first object in folder which can not be shown empty
-            removeRow(myXMLReader.rootFolderId(aGroup));
-            //rebuildBranch(0, aNbFolders + aDoc->size(myXMLReader.rootType()));
+            removeRow(myXMLReader->rootFolderId(aGroup));
+            //rebuildBranch(0, aNbFolders + aDoc->size(myXMLReader->rootType()));
             break;
           }
         }
@@ -213,8 +216,8 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
           foreach (QString aNotEmptyFolder, aNotEmptyFolders) {
             if ((aNotEmptyFolder.toStdString() == aGroup) && (aSize == 0)) {
               // Appears first object in folder which can not be shown empty
-              removeRow(myXMLReader.subFolderId(aGroup), aDocRoot);
-              //rebuildBranch(0, aNbSubFolders + aDoc->size(myXMLReader.subType()), aDocRoot);
+              removeRow(myXMLReader->subFolderId(aGroup), aDocRoot);
+              //rebuildBranch(0, aNbSubFolders + aDoc->size(myXMLReader->subType()), aDocRoot);
               break;
             }
           }
@@ -244,13 +247,13 @@ void XGUI_DataModel::processEvent(const std::shared_ptr<Events_Message>& theMess
     int aStartId = 0;
     if (aDoc == aRootDoc) {
       // Update a group under root
-      if (aGroup == myXMLReader.rootType()) // Update objects under root
+      if (aGroup == myXMLReader->rootType()) // Update objects under root
         aStartId = foldersCount();
       else // Update objects in folder under root 
         aParent = createIndex(folderId(aGroup), 0, -1);
     } else {
       // Update a sub-document
-      if (aGroup == myXMLReader.subType()) {
+      if (aGroup == myXMLReader->subType()) {
         // Update sub-document root
         aParent = findDocumentRootIndex(aDoc.get());
         aStartId = foldersCount(aDoc.get());
@@ -342,10 +345,10 @@ QModelIndex XGUI_DataModel::objectIndex(const ObjectPtr theObject) const
   }
   SessionPtr aSession = ModelAPI_Session::get();
   DocumentPtr aRootDoc = aSession->moduleDocument();
-  if (aDoc == aRootDoc && myXMLReader.rootType() == aType) { 
+  if (aDoc == aRootDoc && myXMLReader->rootType() == aType) { 
     // The object from root document
     aRow += foldersCount();
-  } else if (myXMLReader.subType() == aType) { 
+  } else if (myXMLReader->subType() == aType) { 
     // The object from sub document
     aRow += foldersCount(aDoc.get());
   }
@@ -370,10 +373,10 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const
   if (aParentId == -1) { // root folders
     switch (theRole) {
       case Qt::DisplayRole:
-        return QString(myXMLReader.rootFolderName(theIndexRow).c_str()) + 
+        return QString(myXMLReader->rootFolderName(theIndexRow).c_str()) + 
           QString(" (%1)").arg(rowCount(theIndex));
       case Qt::DecorationRole:
-        return ModuleBase_IconFactory::loadIcon(myXMLReader.rootFolderIcon(theIndexRow).c_str());
+        return QIcon(myXMLReader->rootFolderIcon(theIndexRow).c_str());
       case Qt::ForegroundRole:
         {
           Qt::ItemFlags aFlags = theIndex.flags();
@@ -403,10 +406,10 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const
 
       switch (theRole) {
         case Qt::DisplayRole:
-          return QString(myXMLReader.subFolderName(aRow).c_str()) + 
+          return QString(myXMLReader->subFolderName(aRow).c_str()) + 
             QString(" (%1)").arg(rowCount(theIndex));
         case Qt::DecorationRole:
-          return ModuleBase_IconFactory::loadIcon(myXMLReader.subFolderIcon(aRow).c_str());
+          return QIcon(myXMLReader->subFolderIcon(aRow).c_str());
       }
     } else {
       ModelAPI_Object* aObj = (ModelAPI_Object*)theIndex.internalPointer();
@@ -421,7 +424,7 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const
             return aTitle + " = " + aVal;
           }
           QString aSuffix;
-          if (aObj->groupName() == myXMLReader.subType()) {
+          if (aObj->groupName() == myXMLReader->subType()) {
             ResultPartPtr aPartRes = getPartResult(aObj);
             if (aPartRes.get()) {
               if (aPartRes->partDoc().get() == NULL)
@@ -456,7 +459,7 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const
     // Return number of items in root
     int aNbFolders = foldersCount();
     int aNbItems = 0;
-    std::string aType = myXMLReader.rootType();
+    std::string aType = myXMLReader->rootType();
     if (!aType.empty())
       aNbItems = aRootDoc->size(aType);
     return aNbFolders + aNbItems;
@@ -466,7 +469,7 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const
   if (aId == -1) { 
     // this is a folder under root
     int aParentPos = theParent.row();
-    std::string aType = myXMLReader.rootFolderType(aParentPos);
+    std::string aType = myXMLReader->rootFolderType(aParentPos);
     return aRootDoc->size(aType);
   } else {
     // It is an object which could have children
@@ -477,7 +480,7 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const
       int aRow = theParent.row();
       while (aMissedIdx.contains(aRow)) 
         aRow++;
-      std::string aType = myXMLReader.subFolderType(aRow);
+      std::string aType = myXMLReader->subFolderType(aRow);
       return aDoc->size(aType);
     } else {
       ModelAPI_Object* aObj = (ModelAPI_Object*)theParent.internalPointer();
@@ -490,7 +493,7 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const
 
         int aNbSubFolders = foldersCount(aSubDoc.get());
         int aNbSubItems = 0;
-        std::string aSubType = myXMLReader.subType();
+        std::string aSubType = myXMLReader->subType();
         if (!aSubType.empty())
           aNbSubItems = aSubDoc->size(aSubType);
         return aNbSubItems + aNbSubFolders;
@@ -527,7 +530,7 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex &
     if (theRow < aNbFolders) // Return first level folder index
       return createIndex(theRow, theColumn, -1);
     else { // return object under root index
-      std::string aType = myXMLReader.rootType();
+      std::string aType = myXMLReader->rootType();
       int aObjId = theRow - aNbFolders;
       if (aObjId < aRootDoc->size(aType)) {
         ObjectPtr aObj = aRootDoc->object(aType, aObjId);
@@ -538,7 +541,7 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex &
     int aId = theParent.internalId();
     int aParentPos = theParent.row();
     if (aId == -1) { // return object index inside of first level of folders
-      std::string aType = myXMLReader.rootFolderType(aParentPos);
+      std::string aType = myXMLReader->rootFolderType(aParentPos);
       if (theRow < aRootDoc->size(aType)) {
         ObjectPtr aObj = aRootDoc->object(aType, theRow);
         aIndex = objectIndex(aObj);
@@ -552,7 +555,7 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex &
         QIntList aMissedIdx = missedFolderIndexes(aDoc);
         while (aMissedIdx.contains(aParentRow))
           aParentRow++;
-        std::string aType = myXMLReader.subFolderType(aParentRow);
+        std::string aType = myXMLReader->subFolderType(aParentRow);
         if (theRow < aDoc->size(aType)) {
           ObjectPtr aObj = aDoc->object(aType, theRow);
           aIndex = objectIndex(aObj);
@@ -569,7 +572,7 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex &
             aIndex = createIndex(theRow, theColumn, aSubDoc.get());
           } else {
             // this is an object under sub document root
-            std::string aType = myXMLReader.subType();
+            std::string aType = myXMLReader->subType();
             ObjectPtr aObj = aSubDoc->object(aType, theRow - aNbSubFolders);
             aIndex = objectIndex(aObj);
           }
@@ -635,20 +638,20 @@ QModelIndex XGUI_DataModel::parent(const QModelIndex& theIndex) const
     DocumentPtr aRootDoc = aSession->moduleDocument();
     DocumentPtr aSubDoc = aObj->document();
     if (aSubDoc == aRootDoc) {
-      if (aType == myXMLReader.rootType())
+      if (aType == myXMLReader->rootType())
         return QModelIndex();
       else {
         // return first level of folder index
-        int aFolderId = myXMLReader.rootFolderId(aType);
+        int aFolderId = myXMLReader->rootFolderId(aType);
         // Items in a one row must have the same parent
         return createIndex(aFolderId, 0, -1);
       }
     } else {
-      if (aType == myXMLReader.subType())
+      if (aType == myXMLReader->subType())
         return findDocumentRootIndex(aSubDoc.get());
       else {
         // return first level of folder index
-        int aFolderId = myXMLReader.subFolderId(aType);
+        int aFolderId = myXMLReader->subFolderId(aType);
         // Items in a one row must have the same parent
         return createIndex(aFolderId, 0, aSubDoc.get());
       }
@@ -753,7 +756,7 @@ QModelIndex XGUI_DataModel::findDocumentRootIndex(const ModelAPI_Document* theDo
 {
   SessionPtr aSession = ModelAPI_Session::get();
   DocumentPtr aRootDoc = aSession->moduleDocument();
-  if (myXMLReader.isAttachToResult()) { // If document is attached to result
+  if (myXMLReader->isAttachToResult()) { // If document is attached to result
     int aNb = aRootDoc->size(ModelAPI_ResultPart::group());
     ObjectPtr aObj;
     ResultPartPtr aPartRes;
@@ -762,7 +765,7 @@ QModelIndex XGUI_DataModel::findDocumentRootIndex(const ModelAPI_Document* theDo
       aPartRes = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
       if (aPartRes.get() && (aPartRes->partDoc().get() == theDoc)) {
         int aRow = i;
-        if (myXMLReader.rootType() == ModelAPI_Feature::group()) {
+        if (myXMLReader->rootType() == ModelAPI_Feature::group()) {
           aRow += foldersCount();
         }
         return createIndex(aRow, 0, aObj.get());
@@ -777,7 +780,7 @@ QModelIndex XGUI_DataModel::findDocumentRootIndex(const ModelAPI_Document* theDo
       aPartRes = getPartResult(aObj.get());
       if (aPartRes.get() && (aPartRes->partDoc().get() == theDoc)) {
         int aRow = i;
-        if (myXMLReader.rootType() == ModelAPI_Feature::group())
+        if (myXMLReader->rootType() == ModelAPI_Feature::group())
           aRow += foldersCount();
         return createIndex(aRow, 0, aObj.get());
       }
@@ -804,20 +807,20 @@ int XGUI_DataModel::foldersCount(ModelAPI_Document* theDoc) const
   SessionPtr aSession = ModelAPI_Session::get();
   DocumentPtr aRootDoc = aSession->moduleDocument();
   if ((theDoc == 0) || (theDoc == aRootDoc.get())) {
-    for (int i = 0; i < myXMLReader.rootFoldersNumber(); i++) {
-      if (myXMLReader.rootShowEmpty(i))
+    for (int i = 0; i < myXMLReader->rootFoldersNumber(); i++) {
+      if (myXMLReader->rootShowEmpty(i))
         aNb++;
       else {
-        if (aRootDoc->size(myXMLReader.rootFolderType(i)) > 0)
+        if (aRootDoc->size(myXMLReader->rootFolderType(i)) > 0)
           aNb++;
       }
     }
   } else {
-    for (int i = 0; i < myXMLReader.subFoldersNumber(); i++) {
-      if (myXMLReader.subShowEmpty(i))
+    for (int i = 0; i < myXMLReader->subFoldersNumber(); i++) {
+      if (myXMLReader->subShowEmpty(i))
         aNb++;
       else {
-        if (theDoc->size(myXMLReader.subFolderType(i)) > 0)
+        if (theDoc->size(myXMLReader->subFolderType(i)) > 0)
           aNb++;
       }
     }
@@ -833,16 +836,16 @@ QIntList XGUI_DataModel::missedFolderIndexes(ModelAPI_Document* theDoc) const
   SessionPtr aSession = ModelAPI_Session::get();
   DocumentPtr aRootDoc = aSession->moduleDocument();
   if ((theDoc == 0) || (theDoc == aRootDoc.get())) {
-    for (int i = 0; i < myXMLReader.rootFoldersNumber(); i++) {
-      if (!myXMLReader.rootShowEmpty(i)) {
-        if (aRootDoc->size(myXMLReader.rootFolderType(i)) == 0)
+    for (int i = 0; i < myXMLReader->rootFoldersNumber(); i++) {
+      if (!myXMLReader->rootShowEmpty(i)) {
+        if (aRootDoc->size(myXMLReader->rootFolderType(i)) == 0)
           aList.append(i);
       }
     }
   } else {
-    for (int i = 0; i < myXMLReader.subFoldersNumber(); i++) {
-      if (!myXMLReader.subShowEmpty(i)) {
-        if (theDoc->size(myXMLReader.subFolderType(i)) == 0)
+    for (int i = 0; i < myXMLReader->subFoldersNumber(); i++) {
+      if (!myXMLReader->subShowEmpty(i)) {
+        if (theDoc->size(myXMLReader->subFolderType(i)) == 0)
           aList.append(i);
       }
     }
@@ -856,14 +859,14 @@ QStringList XGUI_DataModel::listOfShowNotEmptyFolders(bool fromRoot) const
 {
   QStringList aResult;
   if (fromRoot) {
-    for (int i = 0; i < myXMLReader.rootFoldersNumber(); i++) {
-      if (!myXMLReader.rootShowEmpty(i))
-        aResult << myXMLReader.rootFolderType(i).c_str();
+    for (int i = 0; i < myXMLReader->rootFoldersNumber(); i++) {
+      if (!myXMLReader->rootShowEmpty(i))
+        aResult << myXMLReader->rootFolderType(i).c_str();
     }
   } else {
-    for (int i = 0; i < myXMLReader.subFoldersNumber(); i++) {
-      if (!myXMLReader.subShowEmpty(i))
-        aResult << myXMLReader.subFolderType(i).c_str();
+    for (int i = 0; i < myXMLReader->subFoldersNumber(); i++) {
+      if (!myXMLReader->subShowEmpty(i))
+        aResult << myXMLReader->subFolderType(i).c_str();
     }
   }
   return aResult;
@@ -898,20 +901,20 @@ int XGUI_DataModel::folderId(std::string theType, ModelAPI_Document* theDoc)
 
   int aRes = -1;
   if (aUseSubDoc) {
-    int aId = myXMLReader.subFolderId(theType);
+    int aId = myXMLReader->subFolderId(theType);
     aRes = aId;
     for (int i = 0; i < aId; i++) {
-      if (!myXMLReader.subShowEmpty(i)) {
-        if (aDoc->size(myXMLReader.subFolderType(i)) == 0)
+      if (!myXMLReader->subShowEmpty(i)) {
+        if (aDoc->size(myXMLReader->subFolderType(i)) == 0)
           aRes--;
       }
     }
   } else {
-    int aId = myXMLReader.rootFolderId(theType);
+    int aId = myXMLReader->rootFolderId(theType);
     aRes = aId;
     for (int i = 0; i < aId; i++) {
-      if (!myXMLReader.rootShowEmpty(i)) {
-        if (aDoc->size(myXMLReader.rootFolderType(i)) == 0)
+      if (!myXMLReader->rootShowEmpty(i)) {
+        if (aDoc->size(myXMLReader->rootFolderType(i)) == 0)
           aRes--;
       }
     }
index d08ccc42a8f301529b7d0e5f6352c3e1f6ac6b36..47b0f7b6b487355cf4bcec3fc22f0d8b17d13bae 100644 (file)
 #include <ModuleBase_Definitions.h>
 #include <ModelAPI_Object.h>
 #include <ModelAPI_Document.h>
-#include <Config_DataModelReader.h>
 #include <Events_Listener.h>
 
 #include <QAbstractItemModel>
 
+class Config_DataModelReader;
+
 /**\class XGUI_DataModel
  * \ingroup GUI
  * \brief This is a data model for Object Browser (QTreeView).
@@ -35,6 +36,9 @@ public:
   /// \param theParent a parent object
   XGUI_DataModel(QObject* theParent);
 
+  /// Destructor
+  virtual ~XGUI_DataModel();
+
   /// Event Listener method
   /// \param theMessage an event message
   virtual void processEvent(const std::shared_ptr<Events_Message>& theMessage);
@@ -116,6 +120,9 @@ public:
   /// Returns last history object index
   virtual QModelIndex lastHistoryIndex() const;
 
+  /// Initialises XML data model reader. It must be initialised before DataModel using.
+  void setXMLReader(Config_DataModelReader* theReader) { myXMLReader = theReader; }
+
 private:
   /// Find a root index which contains objects of the given document
   /// \param theDoc the document object
@@ -145,7 +152,7 @@ private:
   /// \param fromRoot - root document flag
   QStringList listOfShowNotEmptyFolders(bool fromRoot = true) const;
 
-  Config_DataModelReader myXMLReader;
+  Config_DataModelReader* myXMLReader;
 };
 
 #endif
\ No newline at end of file
index 7eb50de3409ce79f2c8a48199da60345c0a26c93..8c25035f0ca960272ff00f5a96e29440b7a0d29e 100644 (file)
@@ -361,10 +361,6 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent)
   aLabelWgt->setPalette(aPalet);
 
   myDocModel = new XGUI_DataModel(this);
-  myTreeView->setModel(myDocModel);
-
-  // It has to be done after setting of model
-  myActiveDocLbl->setTreeView(myTreeView);
 
   QItemSelectionModel* aSelMod = myTreeView->selectionModel();
   connect(aSelMod, SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
@@ -379,6 +375,14 @@ XGUI_ObjectsBrowser::~XGUI_ObjectsBrowser()
 {
 }
 
+void XGUI_ObjectsBrowser::setXMLReader(Config_DataModelReader* theReader)
+{ 
+  myDocModel->setXMLReader(theReader); 
+  myTreeView->setModel(myDocModel);
+
+  // It has to be done after setting of model
+  myActiveDocLbl->setTreeView(myTreeView);
+}
 
 //***************************************************
 void XGUI_ObjectsBrowser::onContextMenuRequested(QContextMenuEvent* theEvent)
index b1a70d487ec1cab3f2d1c6bdc6baf1e8bc89df45..c71206dcc0e884810ae1c65f407dcd8c068eac72 100644 (file)
@@ -15,6 +15,7 @@
 
 class ModuleBase_IDocumentDataModel;
 class XGUI_DataModel;
+class Config_DataModelReader;
 
 /**
 * \ingroup GUI
@@ -180,6 +181,8 @@ Q_OBJECT
   /// Resets the object browser into initial state
   void clearContent();
 
+  void setXMLReader(Config_DataModelReader* theReader);
+
 public slots:
   //! Called on Edit command request
   void onEditItem();
index 4949ecd94f016084cc778f63384fc13ebfe92730..540991d6464553772a00ac55dfad7e56a5841a61 100755 (executable)
@@ -77,6 +77,7 @@
 #include <Config_PointerMessage.h>
 #include <Config_PropManager.h>
 #include <Config_SelectionFilterMessage.h>
+#include <Config_DataModelReader.h>
 
 #include <SUIT_ResourceMgr.h>
 
@@ -135,6 +136,9 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
     QLocale::setDefault( QLocale::system() );
 #endif
 
+  myDataModelXMLReader = new Config_DataModelReader();
+  myDataModelXMLReader->readAll();
+
   myDisplayer = new XGUI_Displayer(this);
 
   mySelector = new XGUI_SelectionMgr(this);
@@ -200,6 +204,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector)
 XGUI_Workshop::~XGUI_Workshop(void)
 {
   delete myDisplayer;
+  delete myDataModelXMLReader;
 }
 
 //******************************************************
@@ -1078,6 +1083,7 @@ QDockWidget* XGUI_Workshop::createObjectBrowser(QWidget* theParent)
   aObjDock->setStyleSheet(
       "::title { position: relative; padding-left: 5px; text-align: left center }");
   myObjectBrowser = new XGUI_ObjectsBrowser(aObjDock);
+  myObjectBrowser->setXMLReader(myDataModelXMLReader);
   myModule->customizeObjectBrowser(myObjectBrowser);
   aObjDock->setWidget(myObjectBrowser);
 
index 6cbc1429cf5a06a7e16b1a7aeab7a6f48bf55e84..086f691ab2030ddb6073c42ee9067faeea435cb9 100755 (executable)
@@ -47,7 +47,7 @@ class QDockWidget;
 class QMainWindow;
 
 class QAction;
-
+class Config_DataModelReader;
 
 /**\class XGUI_Workshop
  * \ingroup GUI
@@ -288,6 +288,10 @@ Q_OBJECT
   /// features found in the given list
   void highlightResults(const QObjectPtrList& theObjects);
 
+  /// Returns Data Model XML reader which contains information about 
+  /// Data structure configuration
+  const Config_DataModelReader* dataModelXMLReader() const { return myDataModelXMLReader; }
+
   /// A constant string used for "Move to end" command definition
   /// It is used for specific processing of Undo/Redo for this command.
   static QString MOVE_TO_END_COMMAND;
@@ -537,6 +541,8 @@ private:
   QString myCurrentDir;
 
   int myViewerSelMode;
+
+  Config_DataModelReader* myDataModelXMLReader;
 };
 
 #endif
index 989cb501c822ee7fd33bb57ad5915949a4473c2a..86cc1b28f73014dfab36d55da5bb68f971abe8d3 100644 (file)
@@ -43,7 +43,6 @@
      <file>pictures/module.png</file>
      <file>pictures/shading.png</file>
      <file>pictures/wireframe.png</file>
-     <file>pictures/expression.png</file>
      <file>pictures/arrow.png</file>
 
      <file>pictures/solid.png</file>
diff --git a/src/XGUI/pictures/expression.png b/src/XGUI/pictures/expression.png
deleted file mode 100644 (file)
index 158678a..0000000
Binary files a/src/XGUI/pictures/expression.png and /dev/null differ