13
0

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".
This commit is contained in:
Robin Gareus 2014-11-01 18:24:31 +01:00
parent 049c11de58
commit cffd18d2d8
3 changed files with 61 additions and 13 deletions

View File

@ -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));

View File

@ -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<PBD::Controllable> c) { binding_proxy.set_controllable (c); }
Gtk::SpinButton& get_spin_button () { assert(_ctrl); return _spin; }
void set_controllable (boost::shared_ptr<PBD::Controllable> 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<PBD::Controllable> _ctrl;
Gtk::Adjustment *_ctrl_adj;
Gtk::Adjustment _spin_adj;
Gtk::SpinButton _spin;
bool _ctrl_ignore;
bool _spin_ignore;
};
class LIBGTKMM2EXT_API VSliderController : public SliderController

View File

@ -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)
{