diff --git a/src/ui/widget/ink-spinscale.cpp b/src/ui/widget/ink-spinscale.cpp index 6fd79c9afa12cf6f51ae88d81ca61f273d9a0ca5..06847ae280f7255a4bb94378dc849694cd6edaf1 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 = 1 + int(std::ceil(std::log10(std::max(1.0, std::fabs(max))))); + if (min < 0) { + maxdigits = +1; + } + maxdigits += digits; + return std::min(max_width_chars == 7 ? maxdigits : max_width_chars, 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 ada7efd294099f0570a7d8e3c13491a450801889..6cc9c94a55e0959fe6fe29f6ad085244c1671b92 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 5e3a2a261f1281d1d744f7a3cda80676184e0819..11907c4a907dfe8d4e125008a7282d1314b2e50a 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 b154cb333b27daebecbd22ce154dd065ba68593d..34aa8a9ae54bad8d6f6e900f4cd5f06af3dd05d6 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: