[Libreoffice-commits] core.git: include/vcl vcl/source vcl/unx
Caolán McNamara (via logerrit)
logerrit at kemper.freedesktop.org
Fri Jun 26 13:19:16 UTC 2020
include/vcl/weld.hxx | 13 +++++++++++++
vcl/source/app/salvtables.cxx | 39 +++++++++++++++++++++++++++++++++++++++
vcl/unx/gtk3/gtk3gtkinst.cxx | 17 +++++++++++++++++
3 files changed, 69 insertions(+)
New commits:
commit bda370031e669d4a9b19d0a8247da0db230ebf00
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Fri Jun 26 11:22:46 2020 +0100
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Jun 26 15:18:39 2020 +0200
extend FormattedSpinButton to allow custom input/output
Change-Id: Ie84c1d46bc6fa3e29ed97147de486911dc6ecc0c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/97217
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index fe03d0ed3958..05d5eeeb50d4 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -1588,6 +1588,8 @@ class VCL_DLLPUBLIC FormattedSpinButton : virtual public Entry
{
protected:
Link<FormattedSpinButton&, void> m_aValueChangedHdl;
+ Link<FormattedSpinButton&, void> m_aOutputHdl;
+ Link<double*, bool> m_aInputHdl;
void signal_value_changed() { m_aValueChangedHdl.Call(*this); }
@@ -1596,6 +1598,14 @@ public:
virtual double get_value() const = 0;
virtual void set_range(double min, double max) = 0;
virtual void get_range(double& min, double& max) const = 0;
+ virtual void set_increments(double step, double page) = 0;
+
+ void set_min(double min)
+ {
+ double max, dummy;
+ get_range(dummy, max);
+ set_range(min, max);
+ }
void set_max(double max)
{
@@ -1617,6 +1627,9 @@ public:
{
m_aValueChangedHdl = rLink;
}
+
+ void connect_output(const Link<FormattedSpinButton&, void>& rLink) { m_aOutputHdl = rLink; }
+ void connect_input(const Link<double*, bool>& rLink) { m_aInputHdl = rLink; }
};
class VCL_DLLPUBLIC Image : virtual public Widget
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index f395d5240182..6a299156b404 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -5317,12 +5317,18 @@ class SalInstanceFormattedSpinButton : public SalInstanceEntry,
private:
VclPtr<FormattedField> m_xButton;
+ DECL_LINK(OutputHdl, Edit&, bool);
+ DECL_LINK(InputHdl, sal_Int64*, TriState);
+
public:
SalInstanceFormattedSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder,
bool bTakeOwnership)
: SalInstanceEntry(pButton, pBuilder, bTakeOwnership)
, m_xButton(pButton)
{
+ m_xButton->SetOutputHdl(LINK(this, SalInstanceFormattedSpinButton, OutputHdl));
+ m_xButton->SetInputHdl(LINK(this, SalInstanceFormattedSpinButton, InputHdl));
+
// #i6278# allow more decimal places than the output format. As
// the numbers shown in the edit fields are used for input, it makes more
// sense to display the values in the input format rather than the output
@@ -5330,6 +5336,12 @@ public:
m_xButton->UseInputStringForFormatting();
}
+ virtual ~SalInstanceFormattedSpinButton() override
+ {
+ m_xButton->SetInputHdl(Link<sal_Int64*, TriState>());
+ m_xButton->SetOutputHdl(Link<Edit&, bool>());
+ }
+
virtual double get_value() const override { return m_xButton->GetValue(); }
virtual void set_value(double value) override { m_xButton->SetValue(value); }
@@ -5346,6 +5358,11 @@ public:
max = m_xButton->GetMaxValue();
}
+ virtual void set_increments(double step, double /*page*/) override
+ {
+ m_xButton->SetSpinSize(step);
+ }
+
virtual void set_formatter(SvNumberFormatter* pFormatter) override
{
m_xButton->SetFormatter(pFormatter);
@@ -5365,6 +5382,28 @@ public:
virtual void set_digits(unsigned int digits) override { m_xButton->SetDecimalDigits(digits); }
};
+IMPL_LINK_NOARG(SalInstanceFormattedSpinButton, OutputHdl, Edit&, bool)
+{
+ // allow an explicit handler
+ if (!m_aOutputHdl.IsSet())
+ return false;
+ m_aOutputHdl.Call(*this);
+ return true;
+}
+
+IMPL_LINK(SalInstanceFormattedSpinButton, InputHdl, sal_Int64*, pResult, TriState)
+{
+ // allow an explicit handler
+ if (!m_aInputHdl.IsSet())
+ return TRISTATE_INDET;
+
+ double value;
+ TriState eRet = m_aInputHdl.Call(&value) ? TRISTATE_TRUE : TRISTATE_FALSE;
+ if (eRet == TRISTATE_TRUE)
+ *pResult = std::round(value * weld::SpinButton::Power10(m_xButton->GetDecimalDigits()));
+ return eRet;
+}
+
}
SalInstanceLabel::SalInstanceLabel(Control* pLabel, SalInstanceBuilder* pBuilder,
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 7270e3e21be5..804fa0ec7df3 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -12128,6 +12128,12 @@ private:
bool signal_output()
{
+ // allow an explicit handler
+ if (m_aOutputHdl.IsSet())
+ {
+ m_aOutputHdl.Call(*this);
+ return true;
+ }
if (!m_pFormatter)
return false;
double dVal = get_value();
@@ -12157,6 +12163,10 @@ private:
gint signal_input(double* value)
{
+ // allow an explicit handler
+ if (m_aInputHdl.IsSet())
+ return m_aInputHdl.Call(value) ? 1 : GTK_INPUT_ERROR;
+
if (!m_pFormatter)
return 0;
@@ -12244,6 +12254,13 @@ public:
gtk_spin_button_get_range(m_pButton, &min, &max);
}
+ virtual void set_increments(double step, double page) override
+ {
+ disable_notify_events();
+ gtk_spin_button_set_increments(m_pButton, step, page);
+ enable_notify_events();
+ }
+
virtual void set_formatter(SvNumberFormatter* pFormatter) override
{
m_pFormatter = pFormatter;
More information about the Libreoffice-commits
mailing list