From 87d5c6663e13212b5541c274c99ef2d221fca245 Mon Sep 17 00:00:00 2001 From: Jabiertxof Date: Thu, 5 Dec 2019 16:52:37 +0100 Subject: [PATCH 1/4] Add spin button improvements --- src/ui/widget/ink-spinscale.cpp | 34 ++++++++++++++++++++++++++++----- src/ui/widget/ink-spinscale.h | 8 ++++++-- src/ui/widget/spin-scale.cpp | 20 +++++++++++++++---- src/ui/widget/spin-scale.h | 8 ++++++-- 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/ui/widget/ink-spinscale.cpp b/src/ui/widget/ink-spinscale.cpp index 6fd79c9afa..f15e3aea8d 100644 --- a/src/ui/widget/ink-spinscale.cpp +++ b/src/ui/widget/ink-spinscale.cpp @@ -17,10 +17,11 @@ */ #include "ink-spinscale.h" + #include #include #include - +#include #include #include @@ -198,10 +199,19 @@ InkScale::set_adjustment_value(double x, bool constrained) { } /*******************************************************************/ +int sp_get_width_chars(double max, double min, int digits, int max_width_chars) { + int maxdigits = Glib::Ascii::dtostr(std::round(max)).size(); + if (min < 0) { + maxdigits = +1; + } + maxdigits = + digits; + return std::min(maxdigits, max_width_chars); +} InkSpinScale::InkSpinScale(double value, double lower, double upper, double step_increment, - double page_increment, double page_size) + double page_increment, double page_size, + int max_width_chars) { set_name("InkSpinScale"); @@ -213,6 +223,7 @@ InkSpinScale::InkSpinScale(double value, double lower, step_increment, page_increment, page_size); + _max_width_chars = max_width_chars; _spinbutton = Gtk::manage(new Gtk::SpinButton(_adjustment)); _spinbutton->set_numeric(); @@ -220,16 +231,17 @@ InkSpinScale::InkSpinScale(double value, double lower, _scale = Gtk::manage(new InkScale(_adjustment, _spinbutton)); _scale->set_draw_value(false); + _spinbutton->set_width_chars(sp_get_width_chars(upper, lower, _spinbutton->get_digits(), _max_width_chars)); pack_end( *_spinbutton, Gtk::PACK_SHRINK ); pack_end( *_scale, Gtk::PACK_EXPAND_WIDGET ); } -InkSpinScale::InkSpinScale(Glib::RefPtr adjustment) +InkSpinScale::InkSpinScale(Glib::RefPtr adjustment, int max_width_chars) : _adjustment(std::move(adjustment)) { set_name("InkSpinScale"); - + _max_width_chars = max_width_chars; g_assert (_adjustment->get_upper() - _adjustment->get_lower() > 0); _spinbutton = Gtk::manage(new Gtk::SpinButton(_adjustment)); @@ -237,7 +249,7 @@ InkSpinScale::InkSpinScale(Glib::RefPtr adjustment) _scale = Gtk::manage(new InkScale(_adjustment, _spinbutton)); _scale->set_draw_value(false); - + _spinbutton->set_width_chars(sp_get_width_chars(_adjustment->get_upper(), _adjustment->get_lower(), _spinbutton->get_digits(), _max_width_chars)); pack_end( *_spinbutton, Gtk::PACK_SHRINK ); pack_end( *_scale, Gtk::PACK_EXPAND_WIDGET ); } @@ -250,6 +262,7 @@ InkSpinScale::set_label(Glib::ustring label) { void InkSpinScale::set_digits(int digits) { _spinbutton->set_digits(digits); + _spinbutton->set_width_chars(sp_get_width_chars(_adjustment->get_upper(), _adjustment->get_lower(), _spinbutton->get_digits(), _max_width_chars)); } int @@ -257,6 +270,17 @@ InkSpinScale::get_digits() const { return _spinbutton->get_digits(); } +int +InkSpinScale::get_max_width_chars() const { + return _max_width_chars; +} + +void +InkSpinScale::set_max_width_chars(int max_width_chars) { + _max_width_chars = max_width_chars; + _spinbutton->set_width_chars(sp_get_width_chars(_adjustment->get_upper(), _adjustment->get_lower(), _spinbutton->get_digits(), _max_width_chars)); +} + void InkSpinScale::set_focus_widget(GtkWidget * focus_widget) { _focus_widget = focus_widget; diff --git a/src/ui/widget/ink-spinscale.h b/src/ui/widget/ink-spinscale.h index ada7efd294..6cc9c94a55 100644 --- a/src/ui/widget/ink-spinscale.h +++ b/src/ui/widget/ink-spinscale.h @@ -67,16 +67,19 @@ class InkSpinScale : public Gtk::Box double upper, double step_increment = 1, double page_increment = 10, - double page_size = 0); + double page_size = 0, + int max_width_chars = 7);// Is 7 a good max default value of digits? // Create an InkSpinScale with a preexisting adjustment. - InkSpinScale(Glib::RefPtr); + InkSpinScale(Glib::RefPtr, int max_width_chars = 7); ~InkSpinScale() override = default;; void set_label(Glib::ustring label); void set_digits(int digits); int get_digits() const; + int get_max_width_chars() const; + void set_max_width_chars(int max_width_chars); void set_focus_widget(GtkWidget *focus_widget); Glib::RefPtr get_adjustment() { return _adjustment; }; @@ -86,6 +89,7 @@ class InkSpinScale : public Gtk::Box Gtk::SpinButton* _spinbutton; Glib::RefPtr _adjustment; GtkWidget* _focus_widget = nullptr; + int _max_width_chars; bool on_key_release_event(GdkEventKey* key_event) override; diff --git a/src/ui/widget/spin-scale.cpp b/src/ui/widget/spin-scale.cpp index 5e3a2a261f..11907c4a90 100644 --- a/src/ui/widget/spin-scale.cpp +++ b/src/ui/widget/spin-scale.cpp @@ -20,7 +20,8 @@ namespace Widget { SpinScale::SpinScale(const Glib::ustring label, double value, double lower, double upper, double step_increment, double page_increment, int digits, - const SPAttributeEnum a, const Glib::ustring tip_text) + const SPAttributeEnum a, const Glib::ustring tip_text, + int max_width_chars) : AttrWidget(a, value) , _inkspinscale(value, lower, upper, step_increment, page_increment, 0) { @@ -29,7 +30,7 @@ SpinScale::SpinScale(const Glib::ustring label, double value, _inkspinscale.set_label (label); _inkspinscale.set_digits (digits); _inkspinscale.set_tooltip_text (tip_text); - + _inkspinscale.set_max_width_chars(max_width_chars); _adjustment = _inkspinscale.get_adjustment(); signal_value_changed().connect(signal_attr_changed().make_slot()); @@ -41,7 +42,8 @@ SpinScale::SpinScale(const Glib::ustring label, double value, SpinScale::SpinScale(const Glib::ustring label, Glib::RefPtr adjustment, int digits, - const SPAttributeEnum a, const Glib::ustring tip_text) + const SPAttributeEnum a, const Glib::ustring tip_text, + int max_width_chars) : AttrWidget(a, 0.0) , _inkspinscale(adjustment) { @@ -50,7 +52,7 @@ SpinScale::SpinScale(const Glib::ustring label, _inkspinscale.set_label (label); _inkspinscale.set_digits (digits); _inkspinscale.set_tooltip_text (tip_text); - + _inkspinscale.set_max_width_chars(max_width_chars); _adjustment = _inkspinscale.get_adjustment(); signal_value_changed().connect(signal_attr_changed().make_slot()); @@ -94,6 +96,16 @@ void SpinScale::set_value(const double val) _adjustment->set_value(val); } +int +SpinScale::get_max_width_chars() const { + return _inkspinscale.get_max_width_chars(); +} + +void +SpinScale::set_max_width_chars(int max_width_chars) { + _inkspinscale.set_max_width_chars(max_width_chars); +} + void SpinScale::set_focuswidget(GtkWidget *widget) { _inkspinscale.set_focus_widget(widget); diff --git a/src/ui/widget/spin-scale.h b/src/ui/widget/spin-scale.h index b154cb333b..34aa8a9ae5 100644 --- a/src/ui/widget/spin-scale.h +++ b/src/ui/widget/spin-scale.h @@ -32,12 +32,14 @@ public: SpinScale(const Glib::ustring label, double value, double lower, double upper, double step_increment, double page_increment, int digits, - const SPAttributeEnum a = SP_ATTR_INVALID, const Glib::ustring tip_text = ""); + const SPAttributeEnum a = SP_ATTR_INVALID, const Glib::ustring tip_text = "", + int max_width_chars = 7); // Used by extensions SpinScale(const Glib::ustring label, Glib::RefPtr adjustment, int digits, - const SPAttributeEnum a = SP_ATTR_INVALID, const Glib::ustring tip_text = ""); + const SPAttributeEnum a = SP_ATTR_INVALID, const Glib::ustring tip_text = "", + int max_width_chars = 7); Glib::ustring get_as_attribute() const override; void set_from_attribute(SPObject*) override; @@ -46,6 +48,8 @@ public: Glib::SignalProxy0 signal_value_changed(); double get_value() const; void set_value(const double); + int get_max_width_chars() const; + void set_max_width_chars(int max_width_chars); void set_focuswidget(GtkWidget *widget); private: -- GitLab From d5e5f3c45ddbefa32f66ed9b03d03474acb4875d Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sat, 7 Dec 2019 08:22:53 +0000 Subject: [PATCH 2/4] Allow override also lower widths if max with char is not the default --- src/ui/widget/ink-spinscale.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/widget/ink-spinscale.cpp b/src/ui/widget/ink-spinscale.cpp index f15e3aea8d..4338c50fec 100644 --- a/src/ui/widget/ink-spinscale.cpp +++ b/src/ui/widget/ink-spinscale.cpp @@ -205,7 +205,7 @@ int sp_get_width_chars(double max, double min, int digits, int max_width_chars) maxdigits = +1; } maxdigits = + digits; - return std::min(maxdigits, max_width_chars); + return std::min(max_width_chars == 7 ? maxdigits : max_width_chars, max_width_chars); } InkSpinScale::InkSpinScale(double value, double lower, -- GitLab From 21f08ae34bfe21e1cdb8f650135c012a30a0a56a Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 22 Dec 2019 10:58:37 +0000 Subject: [PATCH 3/4] Fix issue on digits --- src/ui/widget/ink-spinscale.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/widget/ink-spinscale.cpp b/src/ui/widget/ink-spinscale.cpp index 4338c50fec..4c6a47bb67 100644 --- a/src/ui/widget/ink-spinscale.cpp +++ b/src/ui/widget/ink-spinscale.cpp @@ -204,7 +204,7 @@ int sp_get_width_chars(double max, double min, int digits, int max_width_chars) if (min < 0) { maxdigits = +1; } - maxdigits = + digits; + maxdigits += digits; return std::min(max_width_chars == 7 ? maxdigits : max_width_chars, max_width_chars); } -- GitLab From 20bc1131367e8d03a88808d2f8afd232e71e46f4 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Date: Sun, 22 Dec 2019 11:02:48 +0000 Subject: [PATCH 4/4] Fix computing --- src/ui/widget/ink-spinscale.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/widget/ink-spinscale.cpp b/src/ui/widget/ink-spinscale.cpp index 4c6a47bb67..06847ae280 100644 --- a/src/ui/widget/ink-spinscale.cpp +++ b/src/ui/widget/ink-spinscale.cpp @@ -200,7 +200,7 @@ InkScale::set_adjustment_value(double x, bool constrained) { /*******************************************************************/ int sp_get_width_chars(double max, double min, int digits, int max_width_chars) { - int maxdigits = Glib::Ascii::dtostr(std::round(max)).size(); + int maxdigits = 1 + int(std::ceil(std::log10(std::max(1.0, std::fabs(max))))); if (min < 0) { maxdigits = +1; } -- GitLab