From: nds Date: Thu, 14 Jul 2016 07:46:44 +0000 (+0300) Subject: Issue #1659 New widget for supporting optional inputs : rename CheckGroupBox to Optio... X-Git-Tag: V_2.5.0~196 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=aeff2c65984b63ed02a0e569511f18e83899274e;p=modules%2Fshaper.git Issue #1659 New widget for supporting optional inputs : rename CheckGroupBox to OptionalBox as it shows usual check box for singular widget. --- diff --git a/src/Config/Config_Common.cpp b/src/Config/Config_Common.cpp index ac274ada8..6d89535e7 100644 --- a/src/Config/Config_Common.cpp +++ b/src/Config/Config_Common.cpp @@ -56,14 +56,14 @@ bool isAttributeNode(xmlNodePtr theNode) return false; // it's parent is "feature" or "source" or page ("case" or "box") if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, - WDG_GROUP, WDG_CHECK_GROUP, + WDG_GROUP, WDG_OPTIONALBOX, WDG_TOOLBOX_BOX, WDG_SWITCH_CASE, NULL)) return false; //it should not be a "source" or a "validator" node bool isLogical = isNode(theNode, NODE_SOURCE, NODE_VALIDATOR, NODE_SELFILTER, NULL); bool isPagedContainer = isNode(theNode, WDG_TOOLBOX, WDG_TOOLBOX_BOX, - WDG_GROUP, WDG_CHECK_GROUP, + WDG_GROUP, WDG_OPTIONALBOX, WDG_SWITCH, WDG_SWITCH_CASE, NULL); return !isLogical && !isPagedContainer; } @@ -73,7 +73,7 @@ bool isWidgetNode(xmlNodePtr theNode) if(!isElementNode(theNode)) return false; // it's parent is "feature" or "source" or a page ("box", "case") - if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, WDG_GROUP, WDG_CHECK_GROUP, + if(!hasParent(theNode, NODE_FEATURE, NODE_SOURCE, WDG_GROUP, WDG_OPTIONALBOX, WDG_TOOLBOX_BOX, WDG_SWITCH_CASE, NULL)) return false; @@ -87,7 +87,7 @@ bool isCaseNode(xmlNodePtr theNode) if(!isElementNode(theNode)) return false; - return isNode(theNode, WDG_CHECK_GROUP, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, NULL); + return isNode(theNode, WDG_OPTIONALBOX, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, NULL); } bool hasChild(xmlNodePtr theNode) diff --git a/src/Config/Config_FeatureReader.cpp b/src/Config/Config_FeatureReader.cpp index 4797d9d4a..5fdd12f6a 100644 --- a/src/Config/Config_FeatureReader.cpp +++ b/src/Config/Config_FeatureReader.cpp @@ -73,7 +73,7 @@ void Config_FeatureReader::processNode(xmlNodePtr theNode) aMessage->setConcealment(getBooleanAttribute(theNode, ATTR_CONCEALMENT, false)); std::list > aCases; - xmlNodePtr aCaseNode = hasParentRecursive(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, WDG_CHECK_GROUP, NULL); + xmlNodePtr aCaseNode = hasParentRecursive(theNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, WDG_OPTIONALBOX, NULL); while(aCaseNode) { std::string aCaseNodeID = getProperty(aCaseNode, _ID); std::string aSwitchNodeID = ""; @@ -85,7 +85,7 @@ void Config_FeatureReader::processNode(xmlNodePtr theNode) else if (!xmlStrcmp(aName, (const xmlChar *) WDG_TOOLBOX_BOX)) { aSwitchNode = hasParentRecursive(aCaseNode, WDG_TOOLBOX, NULL); } - if (!xmlStrcmp(aName, (const xmlChar *) WDG_CHECK_GROUP)) { + if (!xmlStrcmp(aName, (const xmlChar *) WDG_OPTIONALBOX)) { /// the box is optional, attribute is in case if the optional attribute value is not empty aSwitchNode = aCaseNode; } @@ -93,13 +93,13 @@ void Config_FeatureReader::processNode(xmlNodePtr theNode) aSwitchNodeID = getProperty(aSwitchNode, _ID); aCases.push_back(std::make_pair(aSwitchNodeID, aCaseNodeID)); - aCaseNode = hasParentRecursive(aSwitchNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, WDG_CHECK_GROUP, NULL); + aCaseNode = hasParentRecursive(aSwitchNode, WDG_SWITCH_CASE, WDG_TOOLBOX_BOX, WDG_OPTIONALBOX, NULL); } aMessage->setCases(aCases); Events_Loop::loop()->send(aMessage); } // container pages, like "case" or "box" - } else if (isNode(theNode, WDG_CHECK_GROUP, WDG_SWITCH, WDG_SWITCH_CASE, + } else if (isNode(theNode, WDG_OPTIONALBOX, WDG_SWITCH, WDG_SWITCH_CASE, WDG_TOOLBOX, WDG_TOOLBOX_BOX, NULL)) { storeAttribute(theNode, _ID); // save case:caseId (or box:boxId) } @@ -110,7 +110,7 @@ void Config_FeatureReader::processNode(xmlNodePtr theNode) void Config_FeatureReader::cleanup(xmlNodePtr theNode) { - if (isNode(theNode, WDG_CHECK_GROUP, WDG_SWITCH, WDG_SWITCH_CASE, + if (isNode(theNode, WDG_OPTIONALBOX, WDG_SWITCH, WDG_SWITCH_CASE, WDG_TOOLBOX, WDG_TOOLBOX_BOX, NULL)) { // cleanup id of cases when leave case node cleanupAttribute(theNode, _ID); @@ -122,7 +122,7 @@ bool Config_FeatureReader::processChildren(xmlNodePtr theNode) bool result = isNode(theNode, NODE_WORKBENCH, NODE_GROUP, NULL); if(!result && myIsProcessWidgets) { result = isNode(theNode, NODE_FEATURE, - WDG_GROUP, WDG_CHECK_GROUP, + WDG_GROUP, WDG_OPTIONALBOX, WDG_TOOLBOX, WDG_TOOLBOX_BOX, WDG_SWITCH, WDG_SWITCH_CASE, NULL); } diff --git a/src/Config/Config_Keywords.h b/src/Config/Config_Keywords.h index 0fc75262d..43227a571 100644 --- a/src/Config/Config_Keywords.h +++ b/src/Config/Config_Keywords.h @@ -41,7 +41,7 @@ const static char* WDG_ACTION = "action"; // Containers const static char* WDG_GROUP = "groupbox"; -const static char* WDG_CHECK_GROUP = "check_groupbox"; +const static char* WDG_OPTIONALBOX = "optionalbox"; const static char* WDG_TOOLBOX = "toolbox"; const static char* WDG_TOOLBOX_BOX = "box"; const static char* WDG_SWITCH = "switch"; diff --git a/src/Config/Config_WidgetAPI.cpp b/src/Config/Config_WidgetAPI.cpp index 2b74277a1..e8dcbf4be 100644 --- a/src/Config/Config_WidgetAPI.cpp +++ b/src/Config/Config_WidgetAPI.cpp @@ -81,7 +81,7 @@ std::string Config_WidgetAPI::widgetType() const bool Config_WidgetAPI::isGroupBoxWidget() const { - return isNode(myCurrentNode, WDG_GROUP, WDG_CHECK_GROUP, + return isNode(myCurrentNode, WDG_GROUP, WDG_OPTIONALBOX, NULL); } diff --git a/src/ModuleBase/CMakeLists.txt b/src/ModuleBase/CMakeLists.txt index c4fe31943..8dd3b5de7 100644 --- a/src/ModuleBase/CMakeLists.txt +++ b/src/ModuleBase/CMakeLists.txt @@ -42,7 +42,6 @@ SET(PROJECT_HEADERS ModuleBase_ViewerPrs.h ModuleBase_WidgetAction.h ModuleBase_WidgetBoolValue.h - ModuleBase_WidgetCheckGroupBox.h ModuleBase_WidgetChoice.h ModuleBase_WidgetCreatorFactory.h ModuleBase_WidgetDoubleValue.h @@ -54,6 +53,7 @@ SET(PROJECT_HEADERS ModuleBase_WidgetLabel.h ModuleBase_WidgetLineEdit.h ModuleBase_WidgetMultiSelector.h + ModuleBase_WidgetOptionalBox.h ModuleBase_WidgetSelector.h ModuleBase_WidgetSelectorStore.h ModuleBase_WidgetShapeSelector.h @@ -101,7 +101,6 @@ SET(PROJECT_SOURCES ModuleBase_ViewerPrs.cpp ModuleBase_WidgetAction.cpp ModuleBase_WidgetBoolValue.cpp - ModuleBase_WidgetCheckGroupBox.cpp ModuleBase_WidgetChoice.cpp ModuleBase_WidgetCreatorFactory.cpp ModuleBase_WidgetDoubleValue.cpp @@ -113,6 +112,7 @@ SET(PROJECT_SOURCES ModuleBase_WidgetLabel.cpp ModuleBase_WidgetLineEdit.cpp ModuleBase_WidgetMultiSelector.cpp + ModuleBase_WidgetOptionalBox.cpp ModuleBase_WidgetSelector.cpp ModuleBase_WidgetSelectorStore.cpp ModuleBase_WidgetShapeSelector.cpp diff --git a/src/ModuleBase/ModuleBase_WidgetCheckGroupBox.cpp b/src/ModuleBase/ModuleBase_WidgetCheckGroupBox.cpp deleted file mode 100755 index 6ca136d04..000000000 --- a/src/ModuleBase/ModuleBase_WidgetCheckGroupBox.cpp +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: ModuleBase_WidgetCheckGroupBox.cpp -// Created: 13 Dec 2015 -// Author: Natalia ERMOLAEVA - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include - -ModuleBase_WidgetCheckGroupBox::ModuleBase_WidgetCheckGroupBox(QWidget* theParent, - const Config_WidgetAPI* theData) -: ModuleBase_ModelWidget(theParent, theData), - ModuleBase_PageBase(), - myOptionType(CheckBox), - myCheckBoxFrame(0), - myCheckBox(0), - myCheckBoxLayout(0), - myCheckBoxWidget(0), - myGroupBox(0), - myGroupBoxLayout(0) -{ - myToolTip = theData->widgetTooltip(); - myGroupTitle = theData->getProperty(CONTAINER_PAGE_NAME); - - bool isChecked = theData->getBooleanAttribute(ATTR_DEFAULT, false); - setDefaultValue(isChecked ? "true" : "false"); - - myMainLayout = new QVBoxLayout(this); - ModuleBase_Tools::adjustMargins(myMainLayout); -} - -ModuleBase_WidgetCheckGroupBox::~ModuleBase_WidgetCheckGroupBox() -{ -} - -QWidget* ModuleBase_WidgetCheckGroupBox::pageWidget() -{ - return myOptionType == GroupBox ? myGroupBox : (QWidget*)myCheckBoxFrame; -} - -QList ModuleBase_WidgetCheckGroupBox::getControls() const -{ - QList aControls; - if (myOptionType == GroupBox) - aControls.append(myGroupBox); - else - aControls.append(myCheckBoxFrame); - - return aControls; -} - -void ModuleBase_WidgetCheckGroupBox::onPageClicked() -{ - storeValue(); - updateControlsVisibility(); - - if (!isEditingMode()) - emit focusOutWidget(this); -} - -void ModuleBase_WidgetCheckGroupBox::addPageStretch() -{ -} - -void ModuleBase_WidgetCheckGroupBox::placeModelWidget(ModuleBase_ModelWidget* theWidget) -{ - if(!isCheckBoxFilled() && myOptionType == CheckBox) { - createControl(CheckBox); - setOptionType(CheckBox); - - myCheckBoxWidget = theWidget; /// check box frame becomes filled - myCheckBoxLayout->addWidget(theWidget); - } - else { - createControl(GroupBox); - setOptionType(GroupBox); - - ModuleBase_ModelWidget* aCheckBoxWidget = myCheckBoxWidget; - myCheckBoxWidget = 0; - if (aCheckBoxWidget) // move the model widget from check box frame to group box frame - placeModelWidget(aCheckBoxWidget); - - const int kCol = 0; - const int kRow = myGroupBoxLayout->count(); - // it seems, that the align on left is not necessary here, but leads to widgets, which are - // not extended on full width of the parent page. The case is grouped widgets in - // the sketch translation operation - myGroupBoxLayout->addWidget(theWidget, kRow, kCol, Qt::AlignTop);// | Qt::AlignLeft); - myGroupBoxLayout->setRowStretch(kRow, 0); - } -} - -void ModuleBase_WidgetCheckGroupBox::placeWidget(QWidget* theWidget) -{ - createControl(GroupBox); - setOptionType(GroupBox); - if (isCheckBoxFilled()) - placeModelWidget(myCheckBoxWidget); - - - if (!theWidget) { -#ifdef _DEBUG - std::cout << "ModuleBase_PageGroupBox::placePageWidget: can not cast page" << std::endl; -#endif - return; - } - const int kCol = 0; - const int kRow = myGroupBoxLayout->count(); - myGroupBoxLayout->addWidget(theWidget, kRow, kCol); - myGroupBoxLayout->setRowStretch(kRow, 0); -} - -QLayout* ModuleBase_WidgetCheckGroupBox::pageLayout() -{ - return myOptionType == GroupBox ? myGroupBoxLayout : (QLayout*)myCheckBoxLayout; -} - -void ModuleBase_WidgetCheckGroupBox::createControl(const OptionType& theType) -{ - if (theType == GroupBox && !myGroupBox) { - // group box: more than one model widget is inside - myGroupBox = new QGroupBox(this); - myGroupBox->setTitle(QString::fromStdString(myGroupTitle)); - myGroupBox->setVisible(false); - myGroupBox->setCheckable(true); - myGroupBox->setChecked(getDefaultValue() == "true"); - myGroupBox->setToolTip(QString::fromStdString(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 if (theType == CheckBox && !myCheckBoxFrame) { - myCheckBoxFrame = new QFrame(this); - myMainLayout->addWidget(myCheckBoxFrame); - - myCheckBoxLayout = new QHBoxLayout(myCheckBoxFrame); - ModuleBase_Tools::adjustMargins(myCheckBoxLayout); - myCheckBox = new QCheckBox(myCheckBoxFrame); - myCheckBox->setChecked(getDefaultValue() == "true"); - myCheckBoxLayout->addWidget(myCheckBox); - - connect(myCheckBox, SIGNAL(clicked(bool)), this, SLOT(onPageClicked())); - } -} - -bool ModuleBase_WidgetCheckGroupBox::storeValueCustom() -{ - DataPtr aData = myFeature->data(); - AttributeStringPtr aStringAttr = aData->string(attributeID()); - aStringAttr->setValue(getCurrentValue() ? attributeID() : ""); - - updateObject(myFeature); - - return true; -} - -bool ModuleBase_WidgetCheckGroupBox::restoreValueCustom() -{ - DataPtr aData = myFeature->data(); - AttributeStringPtr aStringAttr = aData->string(attributeID()); - setCurrentValue(!aStringAttr->value().empty()); - - return true; -} - -void ModuleBase_WidgetCheckGroupBox::setOptionType( - const ModuleBase_WidgetCheckGroupBox::OptionType& theType) -{ - myOptionType = theType; - - bool isGroupBox = myOptionType == GroupBox; - if (myCheckBoxFrame) - myCheckBoxFrame->setVisible(!isGroupBox); - if (myGroupBox) - myGroupBox->setVisible(isGroupBox); -} - -bool ModuleBase_WidgetCheckGroupBox::isCheckBoxFilled() const -{ - return myCheckBoxWidget != 0; -} - -bool ModuleBase_WidgetCheckGroupBox::getCurrentValue() const -{ - bool isGroupBox = myOptionType == GroupBox; - return isGroupBox ? myGroupBox->isChecked() : myCheckBox->isChecked(); -} - -void ModuleBase_WidgetCheckGroupBox::setCurrentValue(const bool& theValue) -{ - bool isGroupBox = myOptionType == GroupBox; - if (isGroupBox) { - bool isBlocked = myGroupBox->blockSignals(true); - myGroupBox->setChecked(theValue); - myGroupBox->blockSignals(isBlocked); - } - else { - bool isBlocked = myCheckBox->blockSignals(true); - myCheckBox->setChecked(theValue); - myCheckBox->blockSignals(isBlocked); - } - updateControlsVisibility(); -} - -void ModuleBase_WidgetCheckGroupBox::updateControlsVisibility() -{ - if (myOptionType == GroupBox) { - bool aChecked = myGroupBox->isChecked(); - if (aChecked) - ModuleBase_Tools::zeroMargins(myGroupBoxLayout); - else - ModuleBase_Tools::adjustMargins(myGroupBoxLayout); - - int aNbSubControls = myGroupBoxLayout->count(); - for (int i = 0; i < aNbSubControls; i++) { - QWidget* aWidget = myGroupBoxLayout->itemAt(i)->widget(); - if (aWidget) - aWidget->setVisible(aChecked); - } - } - else { - bool aChecked = myCheckBox->isChecked(); - myCheckBoxWidget->setEnabled(aChecked); - } -} diff --git a/src/ModuleBase/ModuleBase_WidgetCheckGroupBox.h b/src/ModuleBase/ModuleBase_WidgetCheckGroupBox.h deleted file mode 100755 index 8db7491d7..000000000 --- a/src/ModuleBase/ModuleBase_WidgetCheckGroupBox.h +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: ModuleBase_WidgetCheckGroupBox.h -// Created: 13 Dec 2015 -// Author: Natalia ERMOLAEVA - -#ifndef ModuleBase_WidgetCheckGroupBox_H_ -#define ModuleBase_WidgetCheckGroupBox_H_ - -#include -#include -#include - -class QGroupBox; -class QFrame; -class QCheckBox; -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; - -/** -* \ingroup GUI -* Implements a model widget for switch as a container widget. It can be defined in XML with "toolbox" keyword -*/ -class MODULEBASE_EXPORT ModuleBase_WidgetCheckGroupBox : public ModuleBase_ModelWidget, - public ModuleBase_PageBase -{ - Q_OBJECT - - enum OptionType {CheckBox, GroupBox}; -public: - /// Constructor - /// \param theParent the parent object - /// \param theData the widget configuration. The attribute of the model widget is obtained from - ModuleBase_WidgetCheckGroupBox(QWidget* theParent, const Config_WidgetAPI* theData); - virtual ~ModuleBase_WidgetCheckGroupBox(); - - /// Defines if it is supported to set the value in this widget - /// \return false because this is an info widget - virtual bool canAcceptFocus() const { return false; }; - - /// Methods to be redefined from ModuleBase_PageBase: start - /// Cast the page to regular QWidget - virtual QWidget* pageWidget(); - /// Methods to be redefined from ModuleBase_PageBase: end - - /// Methods to be redefined from ModuleBase_ModelWidget: start - /// Returns list of widget controls - /// \return a control list - virtual QList getControls() const; - /// Methods to be redefined from ModuleBase_ModelWidget: end - -protected slots: - // store value to the model - void onPageClicked(); - -protected: - /// Methods to be redefined from ModuleBase_PageBase: start - /// Adds the given widget to page's layout - virtual void placeModelWidget(ModuleBase_ModelWidget* theWidget); - /// Adds the given page to page's layout - virtual void placeWidget(QWidget* theWidget); - /// Returns page's layout (QGridLayout) - virtual QLayout* pageLayout(); - /// Adds a stretch to page's layout - virtual void addPageStretch(); - /// Methods to be redefined from ModuleBase_PageBase: end - - - /// Methods to be redefined from ModuleBase_ModelWidget: start - /// Saves the internal parameters to the given feature - /// \return True in success - virtual bool storeValueCustom(); - /// Restore value from attribute data to the widget's control - virtual bool restoreValueCustom(); - /// Methods to be redefined from ModuleBase_ModelWidget: end - -private: - /// Sets whether Check box or Group box is used currently - /// \param theType a type of the control - void setOptionType(const OptionType& theType); - - /// Returns true if the model widget is set into the check box frame - /// \return boolean value - bool isCheckBoxFilled() const; - - /// Creates controls for the given type if it was not perfomed yet - /// \param theType a type to create whether check box or group box controls - void createControl(const OptionType& theType); - - /// Returns true if control is checked - /// \return boolean value - bool getCurrentValue() const; - - /// Returns true if control is checked - /// \param theValue a new value to fill the control state - void setCurrentValue(const bool& theValue); - - /// Makes model widget controls either disabled(for check box mode) or hidden(for group box mode) - void updateControlsVisibility(); - -private: - std::string myToolTip; ///< tool tip defined in XML - std::string myGroupTitle; ///< a title for group box - - 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 - 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 -}; - -#endif /* ModuleBase_WidgetCheckGroupBox_H_ */ diff --git a/src/ModuleBase/ModuleBase_WidgetFactory.cpp b/src/ModuleBase/ModuleBase_WidgetFactory.cpp index 8016ab6ea..a33522dee 100644 --- a/src/ModuleBase/ModuleBase_WidgetFactory.cpp +++ b/src/ModuleBase/ModuleBase_WidgetFactory.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include #include @@ -257,8 +257,8 @@ ModuleBase_PageBase* ModuleBase_WidgetFactory::createPageByType(const std::strin aPage->setTitle(aGroupName); aResult = aPage; } - else if (theType == WDG_CHECK_GROUP) { - ModuleBase_WidgetCheckGroupBox* aPage = new ModuleBase_WidgetCheckGroupBox(theParent, + else if (theType == WDG_OPTIONALBOX) { + ModuleBase_WidgetOptionalBox* aPage = new ModuleBase_WidgetOptionalBox(theParent, myWidgetApi); aResult = aPage; } diff --git a/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp b/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp new file mode 100755 index 000000000..b2e6ad5a4 --- /dev/null +++ b/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp @@ -0,0 +1,241 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + +// File: ModuleBase_WidgetOptionalBox.cpp +// Created: 13 Dec 2015 +// Author: Natalia ERMOLAEVA + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +ModuleBase_WidgetOptionalBox::ModuleBase_WidgetOptionalBox(QWidget* theParent, + const Config_WidgetAPI* theData) +: ModuleBase_ModelWidget(theParent, theData), + ModuleBase_PageBase(), + myOptionType(CheckBox), + myCheckBoxFrame(0), + myCheckBox(0), + myCheckBoxLayout(0), + myCheckBoxWidget(0), + myGroupBox(0), + myGroupBoxLayout(0) +{ + myToolTip = theData->widgetTooltip(); + myGroupTitle = theData->getProperty(CONTAINER_PAGE_NAME); + + bool isChecked = theData->getBooleanAttribute(ATTR_DEFAULT, false); + setDefaultValue(isChecked ? "true" : "false"); + + myMainLayout = new QVBoxLayout(this); + ModuleBase_Tools::adjustMargins(myMainLayout); +} + +ModuleBase_WidgetOptionalBox::~ModuleBase_WidgetOptionalBox() +{ +} + +QWidget* ModuleBase_WidgetOptionalBox::pageWidget() +{ + return myOptionType == GroupBox ? myGroupBox : (QWidget*)myCheckBoxFrame; +} + +QList ModuleBase_WidgetOptionalBox::getControls() const +{ + QList aControls; + if (myOptionType == GroupBox) + aControls.append(myGroupBox); + else + aControls.append(myCheckBoxFrame); + + return aControls; +} + +void ModuleBase_WidgetOptionalBox::onPageClicked() +{ + storeValue(); + updateControlsVisibility(); + + if (!isEditingMode()) + emit focusOutWidget(this); +} + +void ModuleBase_WidgetOptionalBox::addPageStretch() +{ +} + +void ModuleBase_WidgetOptionalBox::placeModelWidget(ModuleBase_ModelWidget* theWidget) +{ + if(!isCheckBoxFilled() && myOptionType == CheckBox) { + createControl(CheckBox); + setOptionType(CheckBox); + + myCheckBoxWidget = theWidget; /// check box frame becomes filled + myCheckBoxLayout->addWidget(theWidget); + } + else { + createControl(GroupBox); + setOptionType(GroupBox); + + ModuleBase_ModelWidget* aCheckBoxWidget = myCheckBoxWidget; + myCheckBoxWidget = 0; + if (aCheckBoxWidget) // move the model widget from check box frame to group box frame + placeModelWidget(aCheckBoxWidget); + + const int kCol = 0; + const int kRow = myGroupBoxLayout->count(); + // it seems, that the align on left is not necessary here, but leads to widgets, which are + // not extended on full width of the parent page. The case is grouped widgets in + // the sketch translation operation + myGroupBoxLayout->addWidget(theWidget, kRow, kCol, Qt::AlignTop);// | Qt::AlignLeft); + myGroupBoxLayout->setRowStretch(kRow, 0); + } +} + +void ModuleBase_WidgetOptionalBox::placeWidget(QWidget* theWidget) +{ + createControl(GroupBox); + setOptionType(GroupBox); + if (isCheckBoxFilled()) + placeModelWidget(myCheckBoxWidget); + + + if (!theWidget) { +#ifdef _DEBUG + std::cout << "ModuleBase_PageGroupBox::placePageWidget: can not cast page" << std::endl; +#endif + return; + } + const int kCol = 0; + const int kRow = myGroupBoxLayout->count(); + myGroupBoxLayout->addWidget(theWidget, kRow, kCol); + myGroupBoxLayout->setRowStretch(kRow, 0); +} + +QLayout* ModuleBase_WidgetOptionalBox::pageLayout() +{ + return myOptionType == GroupBox ? myGroupBoxLayout : (QLayout*)myCheckBoxLayout; +} + +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(QString::fromStdString(myGroupTitle)); + myGroupBox->setVisible(false); + myGroupBox->setCheckable(true); + myGroupBox->setChecked(getDefaultValue() == "true"); + myGroupBox->setToolTip(QString::fromStdString(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 if (theType == CheckBox && !myCheckBoxFrame) { + myCheckBoxFrame = new QFrame(this); + myMainLayout->addWidget(myCheckBoxFrame); + + myCheckBoxLayout = new QHBoxLayout(myCheckBoxFrame); + ModuleBase_Tools::adjustMargins(myCheckBoxLayout); + myCheckBox = new QCheckBox(myCheckBoxFrame); + myCheckBox->setChecked(getDefaultValue() == "true"); + myCheckBoxLayout->addWidget(myCheckBox); + + connect(myCheckBox, SIGNAL(clicked(bool)), this, SLOT(onPageClicked())); + } +} + +bool ModuleBase_WidgetOptionalBox::storeValueCustom() +{ + DataPtr aData = myFeature->data(); + AttributeStringPtr aStringAttr = aData->string(attributeID()); + aStringAttr->setValue(getCurrentValue() ? attributeID() : ""); + + updateObject(myFeature); + + return true; +} + +bool ModuleBase_WidgetOptionalBox::restoreValueCustom() +{ + DataPtr aData = myFeature->data(); + AttributeStringPtr aStringAttr = aData->string(attributeID()); + setCurrentValue(!aStringAttr->value().empty()); + + return true; +} + +void ModuleBase_WidgetOptionalBox::setOptionType( + const ModuleBase_WidgetOptionalBox::OptionType& theType) +{ + myOptionType = theType; + + bool isGroupBox = myOptionType == GroupBox; + if (myCheckBoxFrame) + myCheckBoxFrame->setVisible(!isGroupBox); + if (myGroupBox) + myGroupBox->setVisible(isGroupBox); +} + +bool ModuleBase_WidgetOptionalBox::isCheckBoxFilled() const +{ + return myCheckBoxWidget != 0; +} + +bool ModuleBase_WidgetOptionalBox::getCurrentValue() const +{ + bool isGroupBox = myOptionType == GroupBox; + return isGroupBox ? myGroupBox->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); + } + else { + bool isBlocked = myCheckBox->blockSignals(true); + myCheckBox->setChecked(theValue); + myCheckBox->blockSignals(isBlocked); + } + updateControlsVisibility(); +} + +void ModuleBase_WidgetOptionalBox::updateControlsVisibility() +{ + if (myOptionType == GroupBox) { + bool aChecked = myGroupBox->isChecked(); + if (aChecked) + ModuleBase_Tools::zeroMargins(myGroupBoxLayout); + else + ModuleBase_Tools::adjustMargins(myGroupBoxLayout); + + int aNbSubControls = myGroupBoxLayout->count(); + for (int i = 0; i < aNbSubControls; i++) { + QWidget* aWidget = myGroupBoxLayout->itemAt(i)->widget(); + if (aWidget) + aWidget->setVisible(aChecked); + } + } + else { + bool aChecked = myCheckBox->isChecked(); + myCheckBoxWidget->setEnabled(aChecked); + } +} diff --git a/src/ModuleBase/ModuleBase_WidgetOptionalBox.h b/src/ModuleBase/ModuleBase_WidgetOptionalBox.h new file mode 100755 index 000000000..63027a9e9 --- /dev/null +++ b/src/ModuleBase/ModuleBase_WidgetOptionalBox.h @@ -0,0 +1,118 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + +// File: ModuleBase_WidgetOptionalBox.h +// Created: 13 Dec 2015 +// Author: Natalia ERMOLAEVA + +#ifndef ModuleBase_WidgetOptionalBox_H_ +#define ModuleBase_WidgetOptionalBox_H_ + +#include +#include +#include + +class QGroupBox; +class QFrame; +class QCheckBox; +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; + +/** +* \ingroup GUI +* Implements a model widget for switch as a container widget. It can be defined in XML with "toolbox" keyword +*/ +class MODULEBASE_EXPORT ModuleBase_WidgetOptionalBox : public ModuleBase_ModelWidget, + public ModuleBase_PageBase +{ + Q_OBJECT + + enum OptionType {CheckBox, GroupBox}; +public: + /// Constructor + /// \param theParent the parent object + /// \param theData the widget configuration. The attribute of the model widget is obtained from + ModuleBase_WidgetOptionalBox(QWidget* theParent, const Config_WidgetAPI* theData); + virtual ~ModuleBase_WidgetOptionalBox(); + + /// Defines if it is supported to set the value in this widget + /// \return false because this is an info widget + virtual bool canAcceptFocus() const { return false; }; + + /// Methods to be redefined from ModuleBase_PageBase: start + /// Cast the page to regular QWidget + virtual QWidget* pageWidget(); + /// Methods to be redefined from ModuleBase_PageBase: end + + /// Methods to be redefined from ModuleBase_ModelWidget: start + /// Returns list of widget controls + /// \return a control list + virtual QList getControls() const; + /// Methods to be redefined from ModuleBase_ModelWidget: end + +protected slots: + // store value to the model + void onPageClicked(); + +protected: + /// Methods to be redefined from ModuleBase_PageBase: start + /// Adds the given widget to page's layout + virtual void placeModelWidget(ModuleBase_ModelWidget* theWidget); + /// Adds the given page to page's layout + virtual void placeWidget(QWidget* theWidget); + /// Returns page's layout (QGridLayout) + virtual QLayout* pageLayout(); + /// Adds a stretch to page's layout + virtual void addPageStretch(); + /// Methods to be redefined from ModuleBase_PageBase: end + + + /// Methods to be redefined from ModuleBase_ModelWidget: start + /// Saves the internal parameters to the given feature + /// \return True in success + virtual bool storeValueCustom(); + /// Restore value from attribute data to the widget's control + virtual bool restoreValueCustom(); + /// Methods to be redefined from ModuleBase_ModelWidget: end + +private: + /// Sets whether Check box or Group box is used currently + /// \param theType a type of the control + void setOptionType(const OptionType& theType); + + /// Returns true if the model widget is set into the check box frame + /// \return boolean value + bool isCheckBoxFilled() const; + + /// Creates controls for the given type if it was not perfomed yet + /// \param theType a type to create whether check box or group box controls + void createControl(const OptionType& theType); + + /// Returns true if control is checked + /// \return boolean value + bool getCurrentValue() const; + + /// Returns true if control is checked + /// \param theValue a new value to fill the control state + void setCurrentValue(const bool& theValue); + + /// Makes model widget controls either disabled(for check box mode) or hidden(for group box mode) + void updateControlsVisibility(); + +private: + std::string myToolTip; ///< tool tip defined in XML + std::string myGroupTitle; ///< a title for group box + + 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 + 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 +}; + +#endif /* ModuleBase_WidgetOptionalBox_H_ */