diff --git a/gtk2_ardour/slot_properties_box.cc b/gtk2_ardour/slot_properties_box.cc index 2f5d1e9021..ed327d9c75 100644 --- a/gtk2_ardour/slot_properties_box.cc +++ b/gtk2_ardour/slot_properties_box.cc @@ -101,27 +101,26 @@ SlotPropertiesBox::set_slot (TriggerReference tref) SlotPropertyTable::SlotPropertyTable () : _color_button (ArdourButton::Element (ArdourButton::just_led_default_elements | ArdourButton::ColorBox)) - , _follow_action_button (ArdourButton::led_default_elements) , _velocity_adjustment(1.,0.,1.0,0.01,0.1) , _velocity_slider (&_velocity_adjustment, boost::shared_ptr(), 24/*length*/, 12/*girth*/ ) , _follow_probability_adjustment(0,0,100,2,5) , _follow_probability_slider (&_follow_probability_adjustment, boost::shared_ptr(), 24/*length*/, 12/*girth*/ ) , _follow_count_adjustment (1, 1, 128, 1, 4) , _follow_count_spinner (_follow_count_adjustment) - , _follow_length_adjustment (0, 0, 128, 1, 4) + , _use_follow_length_button (ArdourButton::default_elements) + , _follow_length_adjustment (1, 1, 128, 1, 4) , _follow_length_spinner (_follow_length_adjustment) , _legato_button (ArdourButton::led_default_elements) + , _ignore_changes(false) { using namespace Gtk::Menu_Helpers; - _follow_action_button.set_name("FollowAction"); - _follow_action_button.set_text (_("Follow Action")); - _follow_action_button.signal_event().connect (sigc::mem_fun (*this, (&SlotPropertyTable::follow_action_button_event))); - _follow_count_spinner.set_can_focus(false); _follow_count_spinner.signal_changed ().connect (sigc::mem_fun (*this, &SlotPropertyTable::follow_count_event)); + _use_follow_length_button.signal_event().connect (sigc::mem_fun (*this, (&SlotPropertyTable::use_follow_length_event))); + _follow_length_spinner.set_can_focus(false); _follow_length_spinner.signal_changed ().connect (sigc::mem_fun (*this, &SlotPropertyTable::follow_length_event)); @@ -296,7 +295,8 @@ SlotPropertyTable::SlotPropertyTable () Gtk::Alignment *fl_align = manage (new Gtk::Alignment (0, .5, 0, 0)); fl_align->add (_follow_length_spinner); _follow_table.attach(*fl_align, 1, 2, row, row+1, Gtk::FILL, Gtk::SHRINK, 0, 0 ); - _follow_table.attach(*beat_label, 2, 3, row, row+1, Gtk::SHRINK, Gtk::SHRINK); row++; + _follow_table.attach(*beat_label, 2, 3, row, row+1, Gtk::SHRINK, Gtk::SHRINK); + _follow_table.attach(_use_follow_length_button, 3, 4, row, row+1, Gtk::SHRINK, Gtk::SHRINK); row++; Gtk::EventBox* eFollowBox = manage (new Gtk::EventBox); // a themeable box eFollowBox->set_name("EditorDark"); @@ -331,6 +331,10 @@ SlotPropertyTable::set_quantize (BBT_Offset bbo) void SlotPropertyTable::follow_length_event () { + if (_ignore_changes) { + return; + } + int beatz = (int) _follow_length_adjustment.get_value(); int metrum_numerator = trigger()->meter().divisions_per_bar(); @@ -339,45 +343,65 @@ SlotPropertyTable::follow_length_event () int beats = beatz%metrum_numerator; trigger()->set_follow_length(Temporal::BBT_Offset(bars,beats,0)); + trigger()->set_use_follow_length (true); //if the user is adjusting follow-length, they want to use it } void SlotPropertyTable::follow_count_event () { + if (_ignore_changes) { + return; + } + trigger()->set_follow_count ((int) _follow_count_adjustment.get_value()); } void SlotPropertyTable::velocity_adjusted () { + if (_ignore_changes) { + return; + } + trigger()->set_midi_velocity_effect (_velocity_adjustment.get_value()); } void SlotPropertyTable::probability_adjusted () { + if (_ignore_changes) { + return; + } + trigger()->set_follow_action_probability ((int) _follow_probability_adjustment.get_value()); } bool -SlotPropertyTable::follow_action_button_event (GdkEvent* ev) +SlotPropertyTable::use_follow_length_event (GdkEvent* ev) { -#if 0 /* ben to remove */ + if (_ignore_changes) { + return false; + } + switch (ev->type) { case GDK_BUTTON_PRESS: - trigger()->set_use_follow (!trigger()->use_follow()); + trigger()->set_use_follow_length (!trigger()->use_follow_length()); return true; default: break; } -#endif + return false; } bool SlotPropertyTable::legato_button_event (GdkEvent* ev) { + if (_ignore_changes) { + return false; + } + switch (ev->type) { case GDK_BUTTON_PRESS: trigger()->set_legato (!trigger()->legato()); @@ -393,18 +417,28 @@ SlotPropertyTable::legato_button_event (GdkEvent* ev) void SlotPropertyTable::set_launch_style (Trigger::LaunchStyle ls) { + if (_ignore_changes) { + return; + } + trigger()->set_launch_style (ls); } void SlotPropertyTable::set_follow_action (Trigger::FollowAction fa, uint64_t idx) { + if (_ignore_changes) { + return; + } + trigger()->set_follow_action (fa, idx); } void SlotPropertyTable::on_trigger_changed (PropertyChange const& pc) { + _ignore_changes = true; + int probability = trigger()->follow_action_probability(); if (pc.contains (Properties::name)) { @@ -422,11 +456,15 @@ SlotPropertyTable::on_trigger_changed (PropertyChange const& pc) _follow_count_adjustment.set_value (trigger()->follow_count()); } - if (pc.contains (Properties::tempo_meter)) { + if (pc.contains (Properties::tempo_meter) || pc.contains (Properties::follow_length)) { int metrum_numerator = trigger()->meter().divisions_per_bar(); int bar_beats = metrum_numerator * trigger()->follow_length().bars; int beats = trigger()->follow_length().beats; - _follow_length_adjustment.set_value (bar_beats+beats); //note: 0 is a special case meaning "use clip length" + _follow_length_adjustment.set_value (bar_beats+beats); + } + + if (pc.contains (Properties::use_follow_length)) { + _use_follow_length_button.set_active_state(trigger()->use_follow_length() ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off); } if (pc.contains (Properties::legato)) { @@ -461,13 +499,17 @@ SlotPropertyTable::on_trigger_changed (PropertyChange const& pc) _follow_right.set_sensitive(true); _follow_count_spinner.set_sensitive(true); _follow_length_spinner.set_sensitive(true); + _use_follow_length_button.set_sensitive(true); _follow_probability_slider.set_sensitive(true); } else { _follow_right.set_sensitive(false); _follow_count_spinner.set_sensitive(false); _follow_length_spinner.set_sensitive(false); + _use_follow_length_button.set_sensitive(false); _follow_probability_slider.set_sensitive(false); } + + _ignore_changes = false; } /* ------------ */ diff --git a/gtk2_ardour/slot_properties_box.h b/gtk2_ardour/slot_properties_box.h index 036040c496..a585683b3d 100644 --- a/gtk2_ardour/slot_properties_box.h +++ b/gtk2_ardour/slot_properties_box.h @@ -64,8 +64,6 @@ class SlotPropertyTable : public TriggerUI, public Gtk::Table ArdourWidgets::ArdourButton _load_button; - ArdourWidgets::ArdourButton _follow_action_button; - Gtk::Adjustment _velocity_adjustment; ArdourWidgets::HSliderController _velocity_slider; @@ -81,8 +79,9 @@ class SlotPropertyTable : public TriggerUI, public Gtk::Table Gtk::Adjustment _follow_count_adjustment; Gtk::SpinButton _follow_count_spinner; - Gtk::Adjustment _follow_length_adjustment; - Gtk::SpinButton _follow_length_spinner; + ArdourWidgets::ArdourButton _use_follow_length_button; + Gtk::Adjustment _follow_length_adjustment; + Gtk::SpinButton _follow_length_spinner; ArdourWidgets::ArdourDropdown _follow_left; ArdourWidgets::ArdourDropdown _follow_right; @@ -99,13 +98,17 @@ class SlotPropertyTable : public TriggerUI, public Gtk::Table void on_trigger_changed (PBD::PropertyChange const& ); - bool follow_action_button_event (GdkEvent*); bool legato_button_event (GdkEvent*); void follow_count_event (); + + bool use_follow_length_event (GdkEvent*); void follow_length_event (); void probability_adjusted (); void velocity_adjusted (); + +private: + bool _ignore_changes; }; class SlotPropertyWidget : public Gtk::VBox diff --git a/gtk2_ardour/trigger_ui.cc b/gtk2_ardour/trigger_ui.cc index d51a84244d..d08308de48 100644 --- a/gtk2_ardour/trigger_ui.cc +++ b/gtk2_ardour/trigger_ui.cc @@ -850,9 +850,13 @@ TriggerUI::set_trigger (ARDOUR::TriggerReference tr) pc.add (Properties::name); pc.add (Properties::color); + pc.add (Properties::gain); + pc.add (Properties::stretch_mode); pc.add (Properties::legato); pc.add (Properties::quantization); pc.add (Properties::launch_style); + pc.add (Properties::use_follow_length); + pc.add (Properties::follow_length); pc.add (Properties::follow_count); pc.add (Properties::follow_action0); pc.add (Properties::follow_action1);