X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FModuleBase%2FModuleBase_WidgetOptionalBox.cpp;h=9ce0b4b0b79625785ef1b38e934e6e067fa3dc44;hb=aceff7878bbcc7a44510096de268a781e7380c6f;hp=73a80de18221689321085d338c922d40927d3ca1;hpb=5b6031b015602aa07f5a6fc668c13ac3faf7a8a9;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp b/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp old mode 100755 new mode 100644 index 73a80de18..9ce0b4b0b --- a/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp +++ b/src/ModuleBase/ModuleBase_WidgetOptionalBox.cpp @@ -1,11 +1,25 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: ModuleBase_WidgetOptionalBox.cpp -// Created: 13 Dec 2015 -// Author: Natalia ERMOLAEVA +// Copyright (C) 2014-2021 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 +// #include #include +#include #include #include @@ -28,11 +42,20 @@ ModuleBase_WidgetOptionalBox::ModuleBase_WidgetOptionalBox(QWidget* theParent, myCheckBoxLayout(0), myCheckBoxWidget(0), myGroupBox(0), - myGroupBoxLayout(0) + myGroupBoxLayout(0), + myCheckGroup(0), + myCheckGroupBtn(0), + myCheckContent(0), + myCheckGroupLayout(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); + myAlwaysShowTitle = theData->getBooleanAttribute("show_title", false); + bool isChecked = theData->getBooleanAttribute(ATTR_DEFAULT, false); setDefaultValue(isChecked ? "true" : "false"); @@ -46,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 ModuleBase_WidgetOptionalBox::getControls() const { QList aControls; - if (myOptionType == GroupBox) - aControls.append(myGroupBox); + if (myOptionType == GroupBox) { + if (myGroupBox) + aControls.append(myGroupBox); + else + aControls.append(myCheckGroup); + } else aControls.append(myCheckBoxFrame); @@ -65,8 +93,9 @@ void ModuleBase_WidgetOptionalBox::onPageClicked() storeValue(); updateControlsVisibility(); - if (!isEditingMode()) - emit focusOutWidget(this); + // The widget doesn't accept a focus + //if (!isEditingMode()) + // emit focusOutWidget(this); } void ModuleBase_WidgetOptionalBox::addPageStretch() @@ -80,7 +109,7 @@ void ModuleBase_WidgetOptionalBox::placeModelWidget(ModuleBase_ModelWidget* theW setOptionType(CheckBox); myCheckBoxWidget = theWidget; /// check box frame becomes filled - myCheckBoxLayout->addWidget(theWidget); + myCheckBoxLayout->addWidget(theWidget, 1); } else { createControl(GroupBox); @@ -115,10 +144,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() @@ -130,20 +164,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); @@ -151,7 +203,10 @@ void ModuleBase_WidgetOptionalBox::createControl(const OptionType& theType) myCheckBoxLayout = new QHBoxLayout(myCheckBoxFrame); ModuleBase_Tools::adjustMargins(myCheckBoxLayout); - myCheckBox = new QCheckBox(myCheckBoxFrame); + if (myAlwaysShowTitle) + myCheckBox = new QCheckBox(translate(myGroupTitle), myCheckBoxFrame); + else + myCheckBox = new QCheckBox(myCheckBoxFrame); myCheckBox->setChecked(getDefaultValue() == "true"); myCheckBoxLayout->addWidget(myCheckBox); @@ -163,7 +218,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); @@ -174,8 +234,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; } @@ -189,6 +253,8 @@ void ModuleBase_WidgetOptionalBox::setOptionType( myCheckBoxFrame->setVisible(!isGroupBox); if (myGroupBox) myGroupBox->setVisible(isGroupBox); + else if (myCheckContent) + myCheckGroup->setVisible(isGroupBox); } bool ModuleBase_WidgetOptionalBox::isCheckBoxFilled() const @@ -199,16 +265,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); @@ -221,21 +295,33 @@ void ModuleBase_WidgetOptionalBox::setCurrentValue(const bool& theValue) void ModuleBase_WidgetOptionalBox::updateControlsVisibility() { if (myOptionType == GroupBox) { - bool aChecked = myGroupBox->isChecked(); - if (aChecked) - ModuleBase_Tools::zeroMargins(myGroupBoxLayout); - else - ModuleBase_Tools::adjustMargins(myGroupBoxLayout); + bool aChecked = toEnableWidgets(); + ModuleBase_Tools::adjustMargins(myGroupBoxLayout); + + QLayout* aLayout = myGroupBoxLayout ? myGroupBoxLayout : (QLayout*)myCheckGroupLayout; - int aNbSubControls = myGroupBoxLayout->count(); + 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->setVisible(aChecked); + 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; +}