]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Create a radio buttons widget according to point 2.3.2 in CEA specification
authorvsv <vsv@opencascade.com>
Wed, 27 Jun 2018 10:03:25 +0000 (13:03 +0300)
committervsv <vsv@opencascade.com>
Wed, 27 Jun 2018 10:03:25 +0000 (13:03 +0300)
src/Config/Config_FeatureReader.cpp
src/Config/Config_Keywords.h
src/Config/Config_WidgetAPI.cpp
src/ConstructionPlugin/point_widget.xml
src/ModuleBase/CMakeLists.txt
src/ModuleBase/ModuleBase_WidgetFactory.cpp
src/ModuleBase/ModuleBase_WidgetRadiobox.cpp [new file with mode: 0644]
src/ModuleBase/ModuleBase_WidgetRadiobox.h [new file with mode: 0644]

index c0af30ac45e5c9ed4960cfa46e242c7aebaede56..ffb5bc372731df987a2853961d47152e958d8d92 100644 (file)
@@ -103,6 +103,9 @@ void Config_FeatureReader::processNode(xmlNodePtr theNode)
           else if (!xmlStrcmp(aName, (const xmlChar *) WDG_TOOLBOX_BOX)) {
             aSwitchNode = hasParentRecursive(aCaseNode, WDG_TOOLBOX, NULL);
           }
+          else if (!xmlStrcmp(aName, (const xmlChar *)WDG_RADIOBOX_ITEM)) {
+            aSwitchNode = hasParentRecursive(aCaseNode, WDG_RADIOBOX, NULL);
+          }
           if (!xmlStrcmp(aName, (const xmlChar *) WDG_OPTIONALBOX)) {
             /// the box is optional, attribute is in case
             /// if the optional attribute value is not empty
@@ -120,7 +123,8 @@ void Config_FeatureReader::processNode(xmlNodePtr theNode)
       }
     // container pages, like "case" or "box"
     } else if (isNode(theNode, WDG_OPTIONALBOX, WDG_SWITCH, WDG_SWITCH_CASE,
-                      WDG_TOOLBOX, WDG_TOOLBOX_BOX, NULL)) {
+                      WDG_TOOLBOX, WDG_TOOLBOX_BOX,
+                      WDG_RADIOBOX, WDG_RADIOBOX_ITEM, NULL)) {
       storeAttribute(theNode, _ID); // save case:caseId (or box:boxId)
     }
   }
@@ -144,6 +148,7 @@ bool Config_FeatureReader::processChildren(xmlNodePtr theNode)
     result = isNode(theNode, NODE_FEATURE,
                              WDG_GROUP, WDG_OPTIONALBOX,
                              WDG_TOOLBOX, WDG_TOOLBOX_BOX,
+                             WDG_RADIOBOX, WDG_RADIOBOX_ITEM,
                              WDG_SWITCH, WDG_SWITCH_CASE, NULL);
   }
   return result;
index 2e8261fef44da4f5ab66f704d7f3703c8911f3db..db42211672c32216c5968324ce97333d1866b55d 100644 (file)
@@ -57,6 +57,8 @@ const static char* WDG_ACTION = "action";
 const static char* WDG_GROUP = "groupbox";
 const static char* WDG_OPTIONALBOX = "optionalbox";
 const static char* WDG_TOOLBOX = "toolbox";
+const static char* WDG_RADIOBOX = "radiobox";
+const static char* WDG_RADIOBOX_ITEM = "radio";
 const static char* WDG_TOOLBOX_BOX = "box";
 const static char* WDG_SWITCH = "switch";
 const static char* WDG_SWITCH_CASE = "case";
index 7a9eac960ad4e477375e592cbad2a654c034cf5c..023ad2868ff8a647c819510b5924cef3e8f8eae5 100644 (file)
@@ -99,7 +99,7 @@ bool Config_WidgetAPI::isGroupBoxWidget() const
 
 bool Config_WidgetAPI::isPagedWidget() const
 {
-  return isNode(myCurrentNode, WDG_TOOLBOX, WDG_SWITCH,
+  return isNode(myCurrentNode, WDG_TOOLBOX, WDG_SWITCH, WDG_RADIOBOX,
                 NULL);
 }
 
index 47918c049522aca3a33fefd071ef1d2076e371f8..63fd48350fb56e8feccaf5cdc2526895ceb75c21 100644 (file)
@@ -52,33 +52,31 @@ email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com
                       shape_types="edge">
         <validator id="GeomValidators_Finite"/>
       </shape_selector>
-      <toolbox id="offset_type">
-        <box id="offset_type_by_distance"
+      <radiobox id="offset_type">
+        <radio id="offset_type_by_distance"
              title="Distance on edge by value"
              tooltip="Point on an edge, at a given distance specified by value."
              icon="icons/Construction/point_by_distance_on_edge_24x24.png">
           <doublevalue id="distance"
              label="Distance"
              tooltip="Distance value."
-             icon="icons/Construction/distance_value.png"
              min="0.0"
              default="10">
           </doublevalue>
-        </box>
-        <box id="offset_type_by_ratio"
+        </radio>
+        <radio id="offset_type_by_ratio"
              title="Distance on edge by ratio"
              tooltip="Point on an edge, at a given distance specified by ratio."
              icon="icons/Construction/point_by_ratio_on_edge_24x24.png">
           <doublevalue id="ratio"
              label="Ratio"
              tooltip="Ratio value."
-             icon="icons/Construction/distance_value.png"
              min="0.0"
              max="1.0"
              default="0.5">
           </doublevalue>
-        </box>
-      </toolbox>
+        </radio>
+      </radiobox>
       <boolvalue id="reverse"
            label="Reverse"
            tooltip="Distance from edge end point."
index 3e8fc7d4bce53a2b352f7f47d45bad5943ca46d8..357f85b549f752b16fbb057dd4ceaeb847fa4a0e 100644 (file)
@@ -101,6 +101,7 @@ SET(PROJECT_HEADERS
   ModuleBase_ActionIntParameter.h
   ModuleBase_ChoiceCtrl.h
   ModuleBase_WidgetNameEdit.h
+  ModuleBase_WidgetRadiobox.h
 )
 
 SET(PROJECT_MOC_HEADERS
@@ -148,6 +149,7 @@ SET(PROJECT_MOC_HEADERS
   ModuleBase_WidgetValidated.h
   ModuleBase_ChoiceCtrl.h
   ModuleBase_WidgetNameEdit.h
+  ModuleBase_WidgetRadiobox.h
 )
 
 SET(PROJECT_SOURCES
@@ -214,6 +216,7 @@ SET(PROJECT_SOURCES
   ModuleBase_Dialog.cpp
   ModuleBase_ChoiceCtrl.cpp
   ModuleBase_WidgetNameEdit.cpp
+  ModuleBase_WidgetRadiobox.cpp
 )
 
 SET(PROJECT_LIBRARIES
index cc62794037c6db483da4dee52bb349a8ce604f64..afc886b8faffd595c04e6d89ab3fe9362e19ea06 100644 (file)
@@ -42,6 +42,7 @@
 #include <ModuleBase_WidgetConcealedObjects.h>
 #include <ModuleBase_WidgetLabel.h>
 #include <ModuleBase_WidgetToolbox.h>
+#include <ModuleBase_WidgetRadiobox.h>
 #include <ModuleBase_PageBase.h>
 #include <ModuleBase_PageGroupBox.h>
 #include <ModuleBase_WidgetOptionalBox.h>
@@ -133,7 +134,7 @@ void ModuleBase_WidgetFactory::createWidget(ModuleBase_PageBase* thePage, bool a
             QString aCaseId = qs(myWidgetApi->getProperty(_ID));
             ModuleBase_PageBase* aPage = new ModuleBase_PageWidget(aWidget);
             createWidget(aPage);
-            if (aWdgType == WDG_SWITCH || aWdgType == WDG_TOOLBOX) {
+            if (aWdgType == WDG_SWITCH || aWdgType == WDG_TOOLBOX || aWdgType == WDG_RADIOBOX) {
               ModuleBase_PagedContainer* aContainer =
                 qobject_cast<ModuleBase_PagedContainer*>(aWidget);
 
@@ -330,6 +331,8 @@ ModuleBase_ModelWidget* ModuleBase_WidgetFactory::createWidgetByType(const std::
     result = new ModuleBase_WidgetConcealedObjects(theParent, myWidgetApi);
   } else if (theType == WDG_TOOLBOX) {
     result = new ModuleBase_WidgetToolbox(theParent, myWidgetApi);
+  } else if (theType == WDG_RADIOBOX) {
+    result = new ModuleBase_WidgetRadiobox(theParent, myWidgetApi);
   } else if (theType == WDG_SWITCH) {
     result = new ModuleBase_WidgetSwitch(theParent, myWidgetApi);
   } else if (theType == WDG_TOOLBOX_BOX || theType == WDG_SWITCH_CASE ||
diff --git a/src/ModuleBase/ModuleBase_WidgetRadiobox.cpp b/src/ModuleBase/ModuleBase_WidgetRadiobox.cpp
new file mode 100644 (file)
index 0000000..cf93559
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
+
+#include <ModuleBase_WidgetRadiobox.h>
+#include <ModuleBase_PageBase.h>
+
+#include <QFormLayout>
+#include <QRadioButton>
+#include <QFrame>
+#include <QButtonGroup>
+
+
+ModuleBase_WidgetRadiobox::ModuleBase_WidgetRadiobox(QWidget* theParent,
+                                                     const Config_WidgetAPI* theData)
+  : ModuleBase_PagedContainer(theParent, theData)
+{
+  myLayout = new QFormLayout(this);
+  ModuleBase_Tools::adjustMargins(myLayout);
+  myGroup = new QButtonGroup(this);
+  myGroup->setExclusive(true);
+
+  connect(myGroup, SIGNAL(buttonToggled(int, bool)), SLOT(onPageChanged()));
+}
+
+ModuleBase_WidgetRadiobox::~ModuleBase_WidgetRadiobox()
+{
+}
+
+int ModuleBase_WidgetRadiobox::addPage(ModuleBase_PageBase* thePage,
+                                        const QString& theName,
+                                        const QString& theCaseId,
+                                        const QPixmap& theIcon)
+{
+  ModuleBase_PagedContainer::addPage(thePage, theName, theCaseId, theIcon);
+  QWidget* aWgt = new QWidget(this);
+  QVBoxLayout* aLay = new QVBoxLayout(aWgt);
+  aLay->setContentsMargins(0, 0, 0, 0);
+
+  QRadioButton* aButton = new QRadioButton(aWgt);
+  aButton->setToolTip(theName);
+  aLay->addStretch();
+  aLay->addWidget(aButton);
+  aLay->addStretch();
+
+  //QFrame* aFrame = dynamic_cast<QFrame*>(thePage);
+  QWidget* aPage = thePage->pageWidget();
+  myLayout->addRow(aWgt, aPage);
+  myGroup->addButton(aButton, myGroup->buttons().count());
+
+  bool isDefault = theCaseId.toStdString() == getDefaultValue();
+  aButton->setChecked(isDefault);
+  aPage->setEnabled(isDefault);
+  connect(aButton, SIGNAL(toggled(bool)), aPage, SLOT(setEnabled(bool)));
+
+  return myGroup->buttons().count();
+}
+
+int ModuleBase_WidgetRadiobox::currentPageIndex() const
+{
+  return myGroup->checkedId();
+}
+
+void ModuleBase_WidgetRadiobox::setCurrentPageIndex(int theIndex)
+{
+  bool isSignalsBlocked = myGroup->blockSignals(true);
+  myGroup->button(theIndex)->setChecked(true);
+  myGroup->blockSignals(isSignalsBlocked);
+}
diff --git a/src/ModuleBase/ModuleBase_WidgetRadiobox.h b/src/ModuleBase/ModuleBase_WidgetRadiobox.h
new file mode 100644 (file)
index 0000000..81713d8
--- /dev/null
@@ -0,0 +1,64 @@
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
+
+#ifndef MODULEBASE_WIDGETRADIOBOX_H_
+#define MODULEBASE_WIDGETRADIOBOX_H_
+
+#include <ModuleBase.h>
+#include <ModuleBase_PagedContainer.h>
+
+class QFormLayout;
+class QButtonGroup;
+class QRadioButton;
+
+class MODULEBASE_EXPORT ModuleBase_WidgetRadiobox : public ModuleBase_PagedContainer
+{
+  Q_OBJECT
+public:
+  /// Constructor
+  /// \param theParent the parent object
+  /// \param theData the widget configuration. The attribute of the model widget is obtained from
+  ModuleBase_WidgetRadiobox(QWidget* theParent, const Config_WidgetAPI* theData);
+  virtual ~ModuleBase_WidgetRadiobox();
+
+
+  /// Add a page to the widget
+  /// \param theWidget a page widget
+  /// \param theName a name of page
+  /// \param theCaseId an Id of the page
+  /// \param theIcon an icon of the page
+  virtual int addPage(ModuleBase_PageBase* theWidget,
+    const QString& theName,
+    const QString& theCaseId,
+    const QPixmap& theIcon);
+
+protected:
+  /// Implements ModuleBase_PagedContainer
+  virtual int currentPageIndex() const;
+
+  /// Implements ModuleBase_PagedContainer
+  virtual void setCurrentPageIndex(int);
+
+private:
+  QFormLayout* myLayout;
+  QButtonGroup* myGroup;
+};
+
+#endif
\ No newline at end of file