include/vcl/formatter.hxx       |    3 ++-
 vcl/source/control/fmtfield.cxx |    7 ++++++-
 vcl/unx/gtk3/gtkinst.cxx        |   13 ++++++++++++-
 3 files changed, 20 insertions(+), 3 deletions(-)

New commits:
commit 4ae776b842a8b6f065206d3250113493fd688756
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Thu May 11 16:03:57 2023 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu May 11 21:39:21 2023 +0200

    tdf#155241 keep current MetricSpinButton value if unparseable junk input
    
    Change-Id: I0f13c9ae25c1788924fd81ed77307e96400f6220
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151677
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/include/vcl/formatter.hxx b/include/vcl/formatter.hxx
index 2049d1e12a6f..4aa81ea1be30 100644
--- a/include/vcl/formatter.hxx
+++ b/include/vcl/formatter.hxx
@@ -117,6 +117,7 @@ protected:
     bool                m_bAutoColor : 1;
     bool                m_bEnableNaN : 1;
     bool                m_bDisableRemainderFactor : 1;
+    bool                m_bDefaultValueSet : 1;
     enum valueState { valueDirty, valueString, valueDouble };
     valueState          m_ValueState;
     double              m_dCurrentValue;
@@ -181,7 +182,7 @@ public:
     void    EnableEmptyField(bool bEnable);
     // If disabled, the value will be reset to the last valid value on leave
 
-    void    SetDefaultValue(double dDefault)    { m_dDefaultValue = dDefault; 
m_ValueState = valueDirty; }
+    void    SetDefaultValue(double dDefault)    { m_dDefaultValue = dDefault; 
m_ValueState = valueDirty; m_bDefaultValueSet = true; }
     // If the current String is invalid, GetValue() returns this value
     double  GetDefaultValue() const             { return m_dDefaultValue; }
 
diff --git a/vcl/source/control/fmtfield.cxx b/vcl/source/control/fmtfield.cxx
index ed73accd3c7c..de5713261e83 100644
--- a/vcl/source/control/fmtfield.cxx
+++ b/vcl/source/control/fmtfield.cxx
@@ -266,6 +266,7 @@ Formatter::Formatter()
     ,m_bAutoColor(false)
     ,m_bEnableNaN(false)
     ,m_bDisableRemainderFactor(false)
+    ,m_bDefaultValueSet(false)
     ,m_ValueState(valueDirty)
     ,m_dCurrentValue(0)
     ,m_dDefaultValue(0)
@@ -791,7 +792,11 @@ bool Formatter::ImplGetValue(double& dNewVal)
     if (m_ValueState == valueDouble)
         return true;
 
-    dNewVal = m_dDefaultValue;
+    // tdf#155241 default to m_dDefaultValue only if explicitly set
+    // otherwise default to m_dCurrentValue
+    if (m_bDefaultValueSet)
+        dNewVal = m_dDefaultValue;
+
     OUString sText(GetEntryText());
     if (sText.isEmpty())
         return true;
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 0106507edad6..adea2d9a7c10 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -17494,6 +17494,11 @@ public:
         m_aCustomFont.use_custom_font(&rFont, u"spinbutton");
     }
 
+    void set_update_policy_if_valid()
+    {
+        gtk_spin_button_set_update_policy(m_pButton, GTK_UPDATE_IF_VALID);
+    }
+
     virtual void disable_notify_events() override
     {
         g_signal_handler_block(m_pButton, m_nValueChangedSignalId);
@@ -24323,7 +24328,13 @@ public:
 
     virtual std::unique_ptr<weld::MetricSpinButton> 
weld_metric_spin_button(const OUString& id, FieldUnit eUnit) override
     {
-        return std::make_unique<weld::MetricSpinButton>(weld_spin_button(id), 
eUnit);
+        std::unique_ptr<weld::SpinButton> xButton(weld_spin_button(id));
+        if (xButton)
+        {
+            GtkInstanceSpinButton& rButton = 
dynamic_cast<GtkInstanceSpinButton&>(*xButton);
+            rButton.set_update_policy_if_valid();
+        }
+        return std::make_unique<weld::MetricSpinButton>(std::move(xButton), 
eUnit);
     }
 
     virtual std::unique_ptr<weld::FormattedSpinButton> 
weld_formatted_spin_button(const OUString &id) override

Reply via email to