include/vcl/weld.hxx                  |   30 ++++++-----------------------
 vcl/inc/jsdialog/jsdialogbuilder.hxx  |    2 -
 vcl/inc/qt5/QtInstanceCheckButton.hxx |    8 +------
 vcl/inc/salvtables.hxx                |    8 +------
 vcl/jsdialog/jsdialogbuilder.cxx      |    8 +++----
 vcl/qt5/QtInstanceCheckButton.cxx     |   32 ++++++-------------------------
 vcl/source/app/salvtables.cxx         |   21 +++-----------------
 vcl/unx/gtk3/gtkinst.cxx              |   35 ++++++++++++++++------------------
 8 files changed, 44 insertions(+), 100 deletions(-)

New commits:
commit 71404cc52699e93ef6938e8c8e846b8f1882bb39
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Thu Jul 17 13:42:11 2025 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Fri Jul 18 07:08:11 2025 +0200

    weld: Simplify internal CheckButton logic
    
    Align the internal logic more with the public
    interface by no longer requiring that implementations
    handle a (bool) inconsistent state and a (bool)
    active state separately, but instead require them
    to implement CheckButton::get_state and
    CheckButton::set_state that directly operate on
    a TriState parameter.
    
    With that in place, CheckButton::{g,s}et_inconsistent
    are no longer needed and CheckButton::{g,s}et_active
    can be implemented by the weld::CheckButton base
    class itself.
    
    Change-Id: Ia8a5d89faf33d441fb4683185ac01c1bf7d13821
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188007
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index bd4927a401c6..3184fbc25b2c 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -1683,36 +1683,20 @@ class VCL_DLLPUBLIC MenuToggleButton : virtual public 
MenuButton
 class VCL_DLLPUBLIC CheckButton : virtual public Toggleable
 {
 public:
-    virtual TriState get_state() const override
-    {
-        if (get_inconsistent())
-            return TRISTATE_INDET;
-        return weld::Toggleable::get_state();
-    }
+    // must override Toggleable::get_state to support TRISTATE_INDET
+    virtual TriState get_state() const override = 0;
+    virtual void set_state(TriState eState) = 0;
 
-    void set_state(TriState eState)
+    virtual void set_active(bool bActive) override final
     {
-        switch (eState)
-        {
-            case TRISTATE_INDET:
-                set_inconsistent();
-                break;
-            case TRISTATE_TRUE:
-                set_active(true);
-                break;
-            case TRISTATE_FALSE:
-                set_active(false);
-                break;
-        }
+        set_state(bActive ? TRISTATE_TRUE : TRISTATE_FALSE);
     }
 
+    virtual bool get_active() const override final { return get_state() == 
TRISTATE_TRUE; }
+
     virtual void set_label(const OUString& rText) = 0;
     virtual OUString get_label() const = 0;
     virtual void set_label_wrap(bool wrap) = 0;
-
-protected:
-    virtual void set_inconsistent() = 0;
-    virtual bool get_inconsistent() const = 0;
 };
 
 struct VCL_DLLPUBLIC TriStateEnabled
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx 
b/vcl/inc/jsdialog/jsdialogbuilder.hxx
index be76e9c54164..3fddebeddfe3 100644
--- a/vcl/inc/jsdialog/jsdialogbuilder.hxx
+++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx
@@ -634,7 +634,7 @@ public:
     JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, 
SalInstanceBuilder* pBuilder,
                   bool bTakeOwnership);
 
-    virtual void set_active(bool active) override;
+    virtual void set_state(TriState eState) override;
 };
 
 class JSDrawingArea final : public JSWidget<SalInstanceDrawingArea, 
VclDrawingArea>
diff --git a/vcl/inc/qt5/QtInstanceCheckButton.hxx 
b/vcl/inc/qt5/QtInstanceCheckButton.hxx
index df88c32ed3db..ad4fbf2e0291 100644
--- a/vcl/inc/qt5/QtInstanceCheckButton.hxx
+++ b/vcl/inc/qt5/QtInstanceCheckButton.hxx
@@ -23,13 +23,9 @@ class QtInstanceCheckButton : public QtInstanceWidget, 
public virtual weld::Chec
 public:
     QtInstanceCheckButton(QCheckBox* pCheckBox);
 
-    // weld::Toggleable methods
-    virtual void set_active(bool bActive) override;
-    virtual bool get_active() const override;
-    virtual void set_inconsistent() override;
-    virtual bool get_inconsistent() const override;
+    virtual void set_state(TriState eState) override;
+    virtual TriState get_state() const override;
 
-    // weld::CheckButton methods
     virtual void set_label(const OUString& rText) override;
     virtual OUString get_label() const override;
     virtual void set_label_wrap(bool bWrap) override;
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index cfb17e112279..cd43bc4447c1 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1241,13 +1241,9 @@ private:
 public:
     SalInstanceCheckButton(CheckBox* pButton, SalInstanceBuilder* pBuilder, 
bool bTakeOwnership);
 
-    virtual void set_active(bool active) override;
-
-    virtual bool get_active() const override;
-
-    virtual void set_inconsistent() override;
+    virtual void set_state(TriState eState) override;
 
-    virtual bool get_inconsistent() const override;
+    virtual TriState get_state() const override;
 
     virtual void set_label(const OUString& rText) override { 
SalInstanceButton::set_label(rText); }
 
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index c5414e70a615..cffd42128252 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -1554,11 +1554,11 @@ JSCheckButton::JSCheckButton(JSDialogSender* pSender, 
::CheckBox* pCheckBox,
 {
 }
 
-void JSCheckButton::set_active(bool active)
+void JSCheckButton::set_state(TriState eState)
 {
-    bool bWasActive = get_active();
-    SalInstanceCheckButton::set_active(active);
-    if (bWasActive != active)
+    TriState eOldState = get_state();
+    SalInstanceCheckButton::set_state(eState);
+    if (eOldState != eState)
         sendUpdate();
 }
 
diff --git a/vcl/qt5/QtInstanceCheckButton.cxx 
b/vcl/qt5/QtInstanceCheckButton.cxx
index 747191171a37..e92afa8488f8 100644
--- a/vcl/qt5/QtInstanceCheckButton.cxx
+++ b/vcl/qt5/QtInstanceCheckButton.cxx
@@ -20,39 +20,21 @@ QtInstanceCheckButton::QtInstanceCheckButton(QCheckBox* 
pCheckBox)
     connect(m_pCheckBox, &QCheckBox::toggled, this, 
&QtInstanceCheckButton::handleToggled);
 }
 
-void QtInstanceCheckButton::set_active(bool bActive)
+void QtInstanceCheckButton::set_state(TriState eState)
 {
     SolarMutexGuard g;
     GetQtInstance().RunInMainThread([&] {
-        m_pCheckBox->setTristate(false);
-        m_pCheckBox->setChecked(bActive);
+        m_pCheckBox->setTristate(eState == TRISTATE_INDET);
+        m_pCheckBox->setCheckState(toQtCheckState(eState));
     });
 }
 
-bool QtInstanceCheckButton::get_active() const
+TriState QtInstanceCheckButton::get_state() const
 {
     SolarMutexGuard g;
-    bool bActive;
-    GetQtInstance().RunInMainThread([&] { bActive = m_pCheckBox->isChecked(); 
});
-    return bActive;
-}
-
-void QtInstanceCheckButton::set_inconsistent()
-{
-    SolarMutexGuard g;
-    GetQtInstance().RunInMainThread([&] {
-        m_pCheckBox->setTristate(true);
-        m_pCheckBox->setCheckState(Qt::PartiallyChecked);
-    });
-}
-
-bool QtInstanceCheckButton::get_inconsistent() const
-{
-    SolarMutexGuard g;
-    bool bInconsistent;
-    GetQtInstance().RunInMainThread(
-        [&] { bInconsistent = m_pCheckBox->checkState() == 
Qt::PartiallyChecked; });
-    return bInconsistent;
+    TriState eState = TRISTATE_INDET;
+    GetQtInstance().RunInMainThread([&] { eState = 
toVclTriState(m_pCheckBox->checkState()); });
+    return eState;
 }
 
 void QtInstanceCheckButton::set_label(const OUString& rText)
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index e338e42c8789..408fb4bb658b 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -3206,28 +3206,15 @@ 
SalInstanceCheckButton::SalInstanceCheckButton(CheckBox* pButton, SalInstanceBui
     m_xCheckButton->SetToggleHdl(LINK(this, SalInstanceCheckButton, 
ToggleHdl));
 }
 
-void SalInstanceCheckButton::set_active(bool active)
+void SalInstanceCheckButton::set_state(TriState eState)
 {
     disable_notify_events();
-    m_xCheckButton->EnableTriState(false);
-    m_xCheckButton->Check(active);
+    m_xCheckButton->EnableTriState(eState == TRISTATE_INDET);
+    m_xCheckButton->SetState(eState);
     enable_notify_events();
 }
 
-bool SalInstanceCheckButton::get_active() const { return 
m_xCheckButton->IsChecked(); }
-
-void SalInstanceCheckButton::set_inconsistent()
-{
-    disable_notify_events();
-    m_xCheckButton->EnableTriState(true);
-    m_xCheckButton->SetState(TRISTATE_INDET);
-    enable_notify_events();
-}
-
-bool SalInstanceCheckButton::get_inconsistent() const
-{
-    return m_xCheckButton->GetState() == TRISTATE_INDET;
-}
+TriState SalInstanceCheckButton::get_state() const { return 
m_xCheckButton->GetState(); }
 
 void SalInstanceCheckButton::set_label_wrap(bool bWrap)
 {
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 15f9d92a9613..447b3e5fad6c 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -12782,38 +12782,37 @@ public:
     {
     }
 
-    virtual void set_active(bool active) override
+    virtual void set_state(TriState eState) override
     {
         disable_notify_events();
+        const bool bInconsistent = eState == TRISTATE_INDET;
 #if GTK_CHECK_VERSION(4, 0, 0)
-        gtk_check_button_set_inconsistent(m_pCheckButton, false);
-        gtk_check_button_set_active(m_pCheckButton, active);
+        gtk_check_button_set_inconsistent(m_pCheckButton, bInconsistent);
+        if (!bInconsistent)
+            gtk_check_button_set_active(m_pCheckButton, eState == 
TRISTATE_TRUE);
 #else
-        gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(m_pCheckButton), 
false);
-        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pCheckButton), 
active);
+        gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(m_pCheckButton), 
bInconsistent);
+        if (!bInconsistent)
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_pCheckButton),
+                                         eState == TRISTATE_TRUE);
 #endif
         enable_notify_events();
     }
 
-    virtual bool get_active() const override
-    {
-#if GTK_CHECK_VERSION(4, 0, 0)
-        return gtk_check_button_get_active(m_pCheckButton);
-#else
-        return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_pCheckButton));
-#endif
-    }
-
-    virtual void set_inconsistent() override
+    virtual TriState get_state() const override
     {
+        if (get_inconsistent())
+            return TRISTATE_INDET;
 #if GTK_CHECK_VERSION(4, 0, 0)
-        gtk_check_button_set_inconsistent(m_pCheckButton, true);
+        if (gtk_check_button_get_active(m_pCheckButton))
 #else
-        gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(m_pCheckButton), 
true);
+        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_pCheckButton)))
 #endif
+            return TRISTATE_TRUE;
+        return TRISTATE_FALSE;
     }
 
-    virtual bool get_inconsistent() const override
+    bool get_inconsistent() const
     {
 #if GTK_CHECK_VERSION(4, 0, 0)
         return gtk_check_button_get_inconsistent(m_pCheckButton);

Reply via email to