diff options
author | Robin Gareus <robin@gareus.org> | 2014-11-01 18:24:31 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-11-01 18:24:31 +0100 |
commit | cffd18d2d84103fa83f3b65ac878b191106b4823 (patch) | |
tree | b368231c13a21fe3c67a59e6cb32b304270ee3b1 /libs/gtkmm2ext/slider_controller.cc | |
parent | 049c11de58704790bc652dcb9acfb207af4a8ebe (diff) |
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".
Diffstat (limited to 'libs/gtkmm2ext/slider_controller.cc')
-rw-r--r-- | libs/gtkmm2ext/slider_controller.cc | 57 |
1 files changed, 49 insertions, 8 deletions
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<PBD::Controllable> 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<PBD::Controllable> mc, int fader_length, int fader_girth) : SliderController (adj, mc, VERT, fader_length, fader_girth) { |