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:
parent
049c11de58
commit
cffd18d2d8
@ -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));
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user