From 5362c818c84c477ead5bf32146cafe4ea71e8658 Mon Sep 17 00:00:00 2001 From: Furgo <148809153+furgo16@users.noreply.github.com> Date: Wed, 11 Jun 2025 01:51:40 +0200 Subject: [PATCH] Gui: add new PrefCheckableGroupBox widget --- src/Gui/PrefWidgets.cpp | 33 +++++++++++++++++++++++++++++++++ src/Gui/PrefWidgets.h | 26 ++++++++++++++++++++++++++ src/Gui/PropertyPage.cpp | 2 ++ src/Gui/resource.cpp | 1 + 4 files changed, 62 insertions(+) diff --git a/src/Gui/PrefWidgets.cpp b/src/Gui/PrefWidgets.cpp index 66dbeaa839..5f71f0f19b 100644 --- a/src/Gui/PrefWidgets.cpp +++ b/src/Gui/PrefWidgets.cpp @@ -864,4 +864,37 @@ void PrefFontBox::savePreferences() getWindowParameter()->SetASCII(entryName(), currName.toUtf8()); } +// -------------------------------------------------------------------- + +PrefCheckableGroupBox::PrefCheckableGroupBox(QWidget* parent) + : QGroupBox(parent), PrefWidget() +{ +} + +PrefCheckableGroupBox::~PrefCheckableGroupBox() = default; + +void PrefCheckableGroupBox::restorePreferences() +{ + if (getWindowParameter().isNull() || entryName().isEmpty()) { + failedToRestore(objectName()); + return; + } + + // Default value is the current state of the checkbox (usually from .ui on first load) + bool defaultValueInUi = isChecked(); + bool actualValue = getWindowParameter()->GetBool(entryName(), defaultValueInUi); + setChecked(actualValue); +} + +void PrefCheckableGroupBox::savePreferences() +{ + if (getWindowParameter().isNull() || entryName().isEmpty()) + { + failedToSave(objectName()); + return; + } + + getWindowParameter()->SetBool(entryName(), isChecked()); +} + #include "moc_PrefWidgets.cpp" diff --git a/src/Gui/PrefWidgets.h b/src/Gui/PrefWidgets.h index c805f7d063..8f69406d2c 100644 --- a/src/Gui/PrefWidgets.h +++ b/src/Gui/PrefWidgets.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -426,6 +427,31 @@ protected: void savePreferences() override; }; +/** + * The PrefCheckableGroupBox class allows a QGroupBox to act as a boolean preference. + * Its 'checked' state is saved to and restored from the FreeCAD parameter system + * using the 'prefEntry' and 'prefPath' dynamic properties set in the .ui file. + * When the GroupBox is checked, its children are enabled; when unchecked, disabled (standard + * QGroupBox behavior). + */ +class GuiExport PrefCheckableGroupBox : public QGroupBox, public PrefWidget +{ + Q_OBJECT + + Q_PROPERTY(QByteArray prefEntry READ entryName WRITE setEntryName) // clazy:exclude=qproperty-without-notify + Q_PROPERTY(QByteArray prefPath READ paramGrpPath WRITE setParamGrpPath) // clazy:exclude=qproperty-without-notify + +public: + explicit PrefCheckableGroupBox(QWidget* parent = nullptr); + ~PrefCheckableGroupBox() override; + +protected: + // restore from/save to parameters + void restorePreferences() override; + void savePreferences() override; + +}; + } // namespace Gui #endif // GUI_PREFWIDGETS_H diff --git a/src/Gui/PropertyPage.cpp b/src/Gui/PropertyPage.cpp index 08c8407720..09da2764b5 100644 --- a/src/Gui/PropertyPage.cpp +++ b/src/Gui/PropertyPage.cpp @@ -187,6 +187,7 @@ void PreferenceUiForm::loadSettings() loadPrefWidgets(); loadPrefWidgets(); loadPrefWidgets(); + loadPrefWidgets(); } void PreferenceUiForm::saveSettings() @@ -208,6 +209,7 @@ void PreferenceUiForm::saveSettings() savePrefWidgets(); savePrefWidgets(); savePrefWidgets(); + savePrefWidgets(); } QWidget* Gui::Dialog::PreferenceUiForm::form() diff --git a/src/Gui/resource.cpp b/src/Gui/resource.cpp index f0d630a281..9239a9b24b 100644 --- a/src/Gui/resource.cpp +++ b/src/Gui/resource.cpp @@ -115,6 +115,7 @@ WidgetFactorySupplier::WidgetFactorySupplier() new WidgetProducer; new WidgetProducer; new WidgetProducer; + new WidgetProducer; new WidgetProducer; new WidgetProducer; new WidgetProducer;