]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #2643: Extend optional box with possibility to work without frame. Avoid using...
authorvsv <vsv@opencascade.com>
Thu, 20 Sep 2018 10:56:35 +0000 (13:56 +0300)
committervsv <vsv@opencascade.com>
Thu, 20 Sep 2018 10:56:53 +0000 (13:56 +0300)
src/BuildPlugin/BuildPlugin_Interpolation.cpp
src/BuildPlugin/interpolation_widget.xml
src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp
src/ModuleBase/ModuleBase_WidgetOptionalBox.h

index bc651c9d6df408b59e3ff68bff6bbff9c38f6266..4af802725d2602ab120461a2c1cd9fc511e40b56 100644 (file)
@@ -86,7 +86,7 @@ void BuildPlugin_Interpolation::execute()
   bool isToReorder = boolean(REORDER_ID())->value();
 
   // Get use tangents flag value
-  bool isToUseTangents = !string(USE_TANGENTS_ID())->value().empty();
+  bool isToUseTangents = isClosed? false : (!string(USE_TANGENTS_ID())->value().empty());
 
   // Get tangent for start and end points
   GeomDirPtr aDirStart, aDirEnd;
index e5d6071ad783105464652c4bb547021585b36d22..eb8e3e1382ffb53e36351b9ae15775b4d179d599 100644 (file)
@@ -27,25 +27,27 @@ email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com
                   concealment="true">
     <validator id="GeomValidators_DifferentShapes"/>
   </multi_selector>
-  <boolvalue id="closed" label="Closed" tooltip="Makes the curve closed." default="false"/>
   <boolvalue id="reorder" label="Reorder" tooltip="Changes the order of points to construct the shortest curve." default="false"/>
-  <optionalbox id="use_tangents" title="Tangents" default="false">
-    <shape_selector id="tangent_start"
-                    icon="icons/Features/axis.png"
-                    label="Start"
-                    tooltip="Select vector tangent to the start of curve"
-                    shape_types="edge"
-                    default="&lt;start&gt;">
-      <validator id="GeomValidators_ShapeType" parameters="empty,line"/>
-    </shape_selector>
-    <shape_selector id="tangent_end"
-                    icon="icons/Features/axis.png"
-                    label="End"
-                    tooltip="Select vector tangent to the end of curve"
-                    shape_types="edge"
-                    default="&lt;end&gt;">
-      <validator id="GeomValidators_ShapeType" parameters="empty,line"/>
-    </shape_selector>
+  <optionalbox id="closed" title="Closed" tooltip="Makes the curve closed or not." default="false"
+               has_frame="false" enable_on_check="false">
+    <optionalbox id="use_tangents" title="Tangents" default="false">
+      <shape_selector id="tangent_start"
+                      icon="icons/Features/axis.png"
+                      label="Start"
+                      tooltip="Select vector tangent to the start of curve"
+                      shape_types="edge"
+                      default="&lt;start&gt;">
+        <validator id="GeomValidators_ShapeType" parameters="empty,line"/>
+      </shape_selector>
+      <shape_selector id="tangent_end"
+                      icon="icons/Features/axis.png"
+                      label="End"
+                      tooltip="Select vector tangent to the end of curve"
+                      shape_types="edge"
+                      default="&lt;end&gt;">
+        <validator id="GeomValidators_ShapeType" parameters="empty,line"/>
+      </shape_selector>
+    </optionalbox>
   </optionalbox>
   <validator id="GeomValidators_MinObjectsSelected" parameters="base_objects,2"/>
 </source>
index d9d96157cb69c6ea18ec8d51bb2954c1ad41e518..c035f02c760c7fa56bbf29c4c5d4a61f02fba723 100755 (executable)
@@ -20,6 +20,7 @@
 
 #include <ModuleBase_WidgetOptionalBox.h>
 #include <ModelAPI_AttributeString.h>
+#include <ModelAPI_AttributeBoolean.h>
 
 #include <Config_WidgetAPI.h>
 #include <Config_Keywords.h>
@@ -42,11 +43,19 @@ ModuleBase_WidgetOptionalBox::ModuleBase_WidgetOptionalBox(QWidget* theParent,
   myCheckBoxLayout(0),
   myCheckBoxWidget(0),
   myGroupBox(0),
-  myGroupBoxLayout(0)
+  myGroupBoxLayout(0),
+  myCheckGroup(0),
+  myCheckGroupLayout(0),
+  myCheckContent(0),
+  myCheckGroupBtn(0),
+  myEnableOnCheck(true)
 {
   myToolTip = theData->widgetTooltip();
   myGroupTitle = theData->getProperty(CONTAINER_PAGE_NAME);
 
+  myHaveFrame = theData->getBooleanAttribute("has_frame", true);
+  myEnableOnCheck = theData->getBooleanAttribute("enable_on_check", true);
+
   bool isChecked = theData->getBooleanAttribute(ATTR_DEFAULT, false);
   setDefaultValue(isChecked ? "true" : "false");
 
@@ -60,14 +69,19 @@ ModuleBase_WidgetOptionalBox::~ModuleBase_WidgetOptionalBox()
 
 QWidget* ModuleBase_WidgetOptionalBox::pageWidget()
 {
-  return myOptionType == GroupBox ? myGroupBox : (QWidget*)myCheckBoxFrame;
+  return myOptionType == GroupBox ? (myGroupBox? myGroupBox : myCheckGroup) :
+    (QWidget*)myCheckBoxFrame;
 }
 
 QList<QWidget*> ModuleBase_WidgetOptionalBox::getControls() const
 {
   QList<QWidget*> aControls;
-  if (myOptionType == GroupBox)
-    aControls.append(myGroupBox);
+  if (myOptionType == GroupBox) {
+    if (myGroupBox)
+      aControls.append(myGroupBox);
+    else
+      aControls.append(myCheckGroup);
+  }
   else
     aControls.append(myCheckBoxFrame);
 
@@ -129,10 +143,15 @@ void ModuleBase_WidgetOptionalBox::placeWidget(QWidget* theWidget)
 #endif
     return;
   }
-  const int kCol = 0;
-  const int kRow = myGroupBoxLayout->count();
-  myGroupBoxLayout->addWidget(theWidget, kRow, kCol);
-  myGroupBoxLayout->setRowStretch(kRow, 0);
+  if (myGroupBoxLayout) {
+    const int kCol = 0;
+    const int kRow = myGroupBoxLayout->count();
+    myGroupBoxLayout->addWidget(theWidget, kRow, kCol);
+    myGroupBoxLayout->setRowStretch(kRow, 0);
+  }
+  else {
+    myCheckGroupLayout->addWidget(theWidget);
+  }
 }
 
 QLayout* ModuleBase_WidgetOptionalBox::pageLayout()
@@ -144,20 +163,38 @@ void ModuleBase_WidgetOptionalBox::createControl(const OptionType& theType)
 {
   if (theType == GroupBox && !myGroupBox) {
     // group box: more than one model widget is inside
-    myGroupBox = new QGroupBox(this);
-    myGroupBox->setTitle(translate(myGroupTitle));
-    myGroupBox->setVisible(false);
-    myGroupBox->setCheckable(true);
-    myGroupBox->setChecked(getDefaultValue() == "true");
-    myGroupBox->setToolTip(translate(myToolTip));
-
-    myGroupBoxLayout = new QGridLayout(myGroupBox);
-    ModuleBase_Tools::zeroMargins(myGroupBoxLayout);
-    myGroupBox->setLayout(myGroupBoxLayout);
-
-    // default vertical size policy is preferred
-    myMainLayout->addWidget(myGroupBox);
-    connect(myGroupBox, SIGNAL(clicked(bool)), this, SLOT(onPageClicked()));
+    if (myHaveFrame) {
+      myGroupBox = new QGroupBox(this);
+      myGroupBox->setTitle(translate(myGroupTitle));
+      myGroupBox->setVisible(false);
+      myGroupBox->setCheckable(true);
+      myGroupBox->setChecked(getDefaultValue() == "true");
+      myGroupBox->setToolTip(translate(myToolTip));
+
+      myGroupBoxLayout = new QGridLayout(myGroupBox);
+      ModuleBase_Tools::zeroMargins(myGroupBoxLayout);
+      myGroupBox->setLayout(myGroupBoxLayout);
+
+      // default vertical size policy is preferred
+      myMainLayout->addWidget(myGroupBox);
+      connect(myGroupBox, SIGNAL(clicked(bool)), this, SLOT(onPageClicked()));
+    }
+    else {
+      myCheckGroup = new QWidget(this);
+      QVBoxLayout* aLayout = new QVBoxLayout(myCheckGroup);
+      ModuleBase_Tools::zeroMargins(aLayout);
+
+      myCheckGroupBtn = new QCheckBox(translate(myGroupTitle), myCheckGroup);
+      aLayout->addWidget(myCheckGroupBtn);
+
+      myCheckContent = new QWidget(myCheckGroup);
+      myCheckGroupLayout = new QVBoxLayout(myCheckContent);
+      ModuleBase_Tools::zeroMargins(myCheckGroupLayout);
+      aLayout->addWidget(myCheckContent);
+
+      myMainLayout->addWidget(myCheckGroup);
+      connect(myCheckGroupBtn, SIGNAL(toggled(bool)), this, SLOT(onPageClicked()));
+    }
   }
   else if (theType == CheckBox && !myCheckBoxFrame) {
     myCheckBoxFrame = new QFrame(this);
@@ -177,7 +214,12 @@ bool ModuleBase_WidgetOptionalBox::storeValueCustom()
 {
   DataPtr aData = myFeature->data();
   AttributeStringPtr aStringAttr = aData->string(attributeID());
-  aStringAttr->setValue(getCurrentValue() ? attributeID() : "");
+  if (aStringAttr.get())
+    aStringAttr->setValue(getCurrentValue() ? attributeID() : "");
+  else {
+    AttributeBooleanPtr aBoolAtr = aData->boolean(attributeID());
+    aBoolAtr->setValue(getCurrentValue());
+  }
 
   updateObject(myFeature);
 
@@ -188,8 +230,12 @@ bool ModuleBase_WidgetOptionalBox::restoreValueCustom()
 {
   DataPtr aData = myFeature->data();
   AttributeStringPtr aStringAttr = aData->string(attributeID());
-  setCurrentValue(!aStringAttr->value().empty());
-
+  if (aStringAttr.get())
+    setCurrentValue(!aStringAttr->value().empty());
+  else {
+    AttributeBooleanPtr aBoolAtr = aData->boolean(attributeID());
+    setCurrentValue(aBoolAtr->value());
+  }
   return true;
 }
 
@@ -203,6 +249,8 @@ void ModuleBase_WidgetOptionalBox::setOptionType(
     myCheckBoxFrame->setVisible(!isGroupBox);
   if (myGroupBox)
     myGroupBox->setVisible(isGroupBox);
+  else if (myCheckContent)
+    myCheckGroup->setVisible(isGroupBox);
 }
 
 bool ModuleBase_WidgetOptionalBox::isCheckBoxFilled() const
@@ -213,16 +261,24 @@ bool ModuleBase_WidgetOptionalBox::isCheckBoxFilled() const
 bool ModuleBase_WidgetOptionalBox::getCurrentValue() const
 {
   bool isGroupBox = myOptionType == GroupBox;
-  return isGroupBox ? myGroupBox->isChecked() : myCheckBox->isChecked();
+  return isGroupBox ? (myGroupBox? myGroupBox->isChecked() : myCheckGroupBtn->isChecked()) :
+    myCheckBox->isChecked();
 }
 
 void ModuleBase_WidgetOptionalBox::setCurrentValue(const bool& theValue)
 {
   bool isGroupBox = myOptionType == GroupBox;
   if (isGroupBox) {
-    bool isBlocked = myGroupBox->blockSignals(true);
-    myGroupBox->setChecked(theValue);
-    myGroupBox->blockSignals(isBlocked);
+    if (myGroupBox) {
+      bool isBlocked = myGroupBox->blockSignals(true);
+      myGroupBox->setChecked(theValue);
+      myGroupBox->blockSignals(isBlocked);
+    }
+    else {
+      bool isBlocked = myCheckGroupBtn->blockSignals(true);
+      myCheckGroupBtn->setChecked(theValue);
+      myCheckGroupBtn->blockSignals(isBlocked);
+    }
   }
   else {
     bool isBlocked = myCheckBox->blockSignals(true);
@@ -235,18 +291,33 @@ void ModuleBase_WidgetOptionalBox::setCurrentValue(const bool& theValue)
 void ModuleBase_WidgetOptionalBox::updateControlsVisibility()
 {
   if (myOptionType == GroupBox) {
-    bool aChecked = myGroupBox->isChecked();
+    bool aChecked = toEnableWidgets();
     ModuleBase_Tools::adjustMargins(myGroupBoxLayout);
 
-    int aNbSubControls = myGroupBoxLayout->count();
+    QLayout* aLayout = myGroupBoxLayout ? myGroupBoxLayout : (QLayout*)myCheckGroupLayout;
+
+    int aNbSubControls = aLayout->count();
     for (int i = 0; i < aNbSubControls; i++) {
-      QWidget* aWidget = myGroupBoxLayout->itemAt(i)->widget();
+      QWidget* aWidget = aLayout->itemAt(i)->widget();
       if (aWidget)
         aWidget->setEnabled(aChecked);
     }
   }
   else {
-    bool aChecked = myCheckBox->isChecked();
-    myCheckBoxWidget->setEnabled(aChecked);
+    myCheckBoxWidget->setEnabled(toEnableWidgets());
   }
 }
+
+bool ModuleBase_WidgetOptionalBox::toEnableWidgets() const
+{
+  bool aChecked;
+  if (myOptionType == GroupBox)
+    aChecked = myGroupBox ? myGroupBox->isChecked() : myCheckGroupBtn->isChecked();
+  else
+    aChecked = myCheckBox->isChecked();
+
+  if (myEnableOnCheck)
+    return aChecked;
+  else
+    return !aChecked;
+}
index 6a04e803391e5d146053f47e874ce6ba689ac3fa..b2d9fb8a0c33d84f26f27adf79e9977936ca3486 100755 (executable)
@@ -113,6 +113,8 @@ private:
   /// Makes model widget controls either disabled(for check box mode) or hidden(for group box mode)
   void updateControlsVisibility();
 
+  bool toEnableWidgets() const;
+
 private:
   std::string myToolTip; ///< tool tip defined in XML
   std::string myGroupTitle; ///< a title for group box
@@ -120,13 +122,21 @@ private:
   OptionType myOptionType; ///< current option state
   QVBoxLayout* myMainLayout; ///< the main layout
   // controls to fill check box frame
-  QFrame* myCheckBoxFrame; ///< frame with check box, to be hidden when group box is used
+  QWidget* myCheckBoxFrame; ///< frame with check box, to be hidden when group box is used
   QCheckBox* myCheckBox; ///< control used if only one model widget is placed inside
   QHBoxLayout* myCheckBoxLayout; ///< layout of check box frame
   ModuleBase_ModelWidget* myCheckBoxWidget; /// model widget, placed in the check box frame
   // controls to fill group box frame
   QGroupBox* myGroupBox; ///< control used if more than model widget is placed inside
   QGridLayout* myGroupBoxLayout; ///< page's layout
+
+  QWidget* myCheckGroup;
+  QCheckBox* myCheckGroupBtn;
+  QWidget* myCheckContent;
+  QVBoxLayout* myCheckGroupLayout;
+
+  bool myHaveFrame;
+  bool myEnableOnCheck;
 };
 
 #endif /* ModuleBase_WidgetOptionalBox_H_ */