summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext/slider_controller.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-11-01 18:24:31 +0100
committerRobin Gareus <robin@gareus.org>2014-11-01 18:24:31 +0100
commitcffd18d2d84103fa83f3b65ac878b191106b4823 (patch)
treeb368231c13a21fe3c67a59e6cb32b304270ee3b1 /libs/gtkmm2ext/slider_controller.cc
parent049c11de58704790bc652dcb9acfb207af4a8ebe (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.cc57
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)
{