From cffd18d2d84103fa83f3b65ac878b191106b4823 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 1 Nov 2014 18:24:31 +0100 Subject: [PATCH] implement spin-button internal<>interface bridge Widgets were written to use "[User] Interface" values, but the spinbutton in a Bar-controller should allow to directly access the "Internal Value". --- libs/gtkmm2ext/barcontroller.cc | 1 - libs/gtkmm2ext/gtkmm2ext/slider_controller.h | 16 ++++-- libs/gtkmm2ext/slider_controller.cc | 57 +++++++++++++++++--- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/libs/gtkmm2ext/barcontroller.cc b/libs/gtkmm2ext/barcontroller.cc index bb20cae922..0c777ed999 100644 --- a/libs/gtkmm2ext/barcontroller.cc +++ b/libs/gtkmm2ext/barcontroller.cc @@ -47,7 +47,6 @@ BarController::BarController (Gtk::Adjustment& adj, add_events (Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); set (.5, .5, 1.0, 1.0); set_border_width (0); - _slider.set_controllable (mc); _slider.set_tweaks (PixFader::NoShowUnityLine); _slider.StartGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_start)); diff --git a/libs/gtkmm2ext/gtkmm2ext/slider_controller.h b/libs/gtkmm2ext/gtkmm2ext/slider_controller.h index f67960babd..965b7b7d75 100644 --- a/libs/gtkmm2ext/gtkmm2ext/slider_controller.h +++ b/libs/gtkmm2ext/gtkmm2ext/slider_controller.h @@ -49,13 +49,21 @@ class LIBGTKMM2EXT_API SliderController : public Gtkmm2ext::PixFader virtual ~SliderController () {} - Gtk::SpinButton& get_spin_button () { return spin; } - void set_controllable (boost::shared_ptr c) { binding_proxy.set_controllable (c); } + Gtk::SpinButton& get_spin_button () { assert(_ctrl); return _spin; } + void set_controllable (boost::shared_ptr c) { _binding_proxy.set_controllable (c); } protected: bool on_button_press_event (GdkEventButton *ev); - BindingProxy binding_proxy; - Gtk::SpinButton spin; + void ctrl_adjusted(); + void spin_adjusted(); + + BindingProxy _binding_proxy; + boost::shared_ptr _ctrl; + Gtk::Adjustment *_ctrl_adj; + Gtk::Adjustment _spin_adj; + Gtk::SpinButton _spin; + bool _ctrl_ignore; + bool _spin_ignore; }; class LIBGTKMM2EXT_API VSliderController : public SliderController diff --git a/libs/gtkmm2ext/slider_controller.cc b/libs/gtkmm2ext/slider_controller.cc index ab629f411a..f19a49b1c2 100644 --- a/libs/gtkmm2ext/slider_controller.cc +++ b/libs/gtkmm2ext/slider_controller.cc @@ -31,23 +31,64 @@ using namespace PBD; SliderController::SliderController (Gtk::Adjustment *adj, boost::shared_ptr mc, int orientation, int fader_length, int fader_girth) : PixFader (*adj, orientation, fader_length, fader_girth) - , spin (*adj, 0, 2) -{ - spin.set_name ("SliderControllerValue"); - spin.set_numeric (true); - spin.set_snap_to_ticks (false); + , _ctrl (mc) + , _ctrl_adj (adj) + , _spin_adj (0, 0, 1.0, .1, .01) + , _spin (_spin_adj, 0, 2) +{ + if (mc) { + _spin_adj.set_lower (mc->lower ()); + _spin_adj.set_upper (mc->upper ()); + _spin_adj.set_step_increment((mc->upper () - mc->lower ()) / 100); + _spin_adj.set_page_increment((mc->upper () - mc->lower ()) / 10); + + adj->signal_value_changed().connect (sigc::mem_fun(*this, &SliderController::ctrl_adjusted)); + _spin_adj.signal_value_changed().connect (sigc::mem_fun(*this, &SliderController::spin_adjusted)); + + _binding_proxy.set_controllable (mc); + } + + _spin.set_name ("SliderControllerValue"); + _spin.set_numeric (true); + _spin.set_snap_to_ticks (false); } -bool -SliderController::on_button_press_event (GdkEventButton *ev) +bool +SliderController::on_button_press_event (GdkEventButton *ev) { - if (binding_proxy.button_press_handler (ev)) { + if (_binding_proxy.button_press_handler (ev)) { return true; } return PixFader::on_button_press_event (ev); } +void +SliderController::ctrl_adjusted () +{ + assert (_ctrl); // only used w/BarControlle + if (_spin_ignore) return; + _ctrl_ignore = true; + // TODO consider using internal_to_user, too (amp, dB) + // (also needs _spin_adj min/max range changed accordingly + // and dedicated support for log-scale, revert parts of ceff2e3a62f839) + _spin_adj.set_value (_ctrl->interface_to_internal (_ctrl_adj->get_value())); + _ctrl_ignore = false; +} + +void +SliderController::spin_adjusted () +{ + assert (_ctrl); // only used w/BarController + if (_ctrl_ignore) return; + _spin_ignore = true; + // TODO consider using user_to_internal, as well + _ctrl_adj->set_value(_ctrl->internal_to_interface (_spin_adj.get_value())); + _spin_ignore = false; +} + + + VSliderController::VSliderController (Gtk::Adjustment *adj, boost::shared_ptr mc, int fader_length, int fader_girth) : SliderController (adj, mc, VERT, fader_length, fader_girth) {