From a30148b2a1f483cf8763ac7409d1532ff3d1eafe Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 11 Oct 2021 17:58:51 -0600 Subject: [PATCH] triggerboxUI: showing trigger box UI is global now; move load op to context menu; handle multiple selection --- gtk2_ardour/mixer_strip.cc | 30 ++++++++++++++++++++++++++++++ gtk2_ardour/processor_box.cc | 5 +---- gtk2_ardour/triggerbox_ui.cc | 14 ++++++++++---- gtk2_ardour/ui_config_vars.h | 1 + 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 75f5e95dce..e4f1068c31 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -535,6 +535,17 @@ MixerStrip::set_route (boost::shared_ptr rt) bottom_button_table.remove (group_button); } + if (rt != route()) { + if (rt && route()) { + std::cerr << "switching from " << rt->name() << " to " << route()->name() << std::endl; + } + if (trigger_display && trigger_display->get_parent() == &global_vpacker) { + global_vpacker.remove (*trigger_display); + delete trigger_display; + trigger_display = 0; + } + } + RouteUI::set_route (rt); control_slave_ui.set_stripable (boost::dynamic_pointer_cast (rt)); @@ -1643,6 +1654,19 @@ MixerStrip::revert_to_default_display () } reset_strip_style (); + + if (_route->triggerbox() && UIConfiguration::instance().get_show_triggers_inline()) { + create_trigger_display (_route->triggerbox()); + if (trigger_display->get_parent() != &global_vpacker) { + global_vpacker.pack_start (*trigger_display, true, true); + trigger_display->show (); + global_vpacker.reorder_child (*trigger_display, 4); + } + } else { + if (trigger_display && (trigger_display->get_parent() == &global_vpacker)) { + global_vpacker.remove (*trigger_display); + } + } } void @@ -1794,6 +1818,12 @@ MixerStrip::parameter_changed (string p) master_volume_table.hide (); } } + } else if (p == "show-triggers-inline") { + boost::shared_ptr tb = route()->triggerbox(); + if (tb) { + create_trigger_display (tb); + toggle_trigger_display (); + } } } diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 76e75689e8..ed3fe68751 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -4302,10 +4302,7 @@ ProcessorBox::edit_triggerbox (boost::shared_ptr processor) return false; } - if (_parent_strip) { - _parent_strip->create_trigger_display (tb); - _parent_strip->toggle_trigger_display (); - } + UIConfiguration::instance().set_show_triggers_inline (!UIConfiguration::instance().get_show_triggers_inline()); return true; } diff --git a/gtk2_ardour/triggerbox_ui.cc b/gtk2_ardour/triggerbox_ui.cc index 8a8218c27f..512f7ed4ae 100644 --- a/gtk2_ardour/triggerbox_ui.cc +++ b/gtk2_ardour/triggerbox_ui.cc @@ -257,6 +257,7 @@ TriggerBoxUI::TriggerBoxUI (ArdourCanvas::Item* parent, TriggerBox& tb) TriggerBoxUI::~TriggerBoxUI () { + update_connection.disconnect (); } void @@ -299,7 +300,7 @@ TriggerBoxUI::event (GdkEvent* ev, uint64_t n) { switch (ev->type) { case GDK_2BUTTON_PRESS: - choose_sample (n); + edit_trigger (n); return true; case GDK_BUTTON_RELEASE: switch (ev->button.button) { @@ -483,6 +484,7 @@ TriggerBoxUI::context_menu (uint64_t n) dynamic_cast (&qitems.back ())->set_active (true); } + items.push_back (MenuElem (_("Load..."), sigc::bind (sigc::mem_fun (*this, &TriggerBoxUI::choose_sample), n))); items.push_back (MenuElem (_("Edit..."), sigc::bind (sigc::mem_fun (*this, &TriggerBoxUI::edit_trigger), n))); items.push_back (MenuElem (_("Follow Action..."), *follow_menu)); items.push_back (MenuElem (_("Launch Style..."), *launch_menu)); @@ -530,6 +532,7 @@ TriggerBoxUI::choose_sample (uint64_t n) file_chooser = new Gtk::FileChooserDialog (_("Select sample"), Gtk::FILE_CHOOSER_ACTION_OPEN); file_chooser->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); file_chooser->add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); + file_chooser->set_select_multiple (true); } file_chooser_connection.disconnect (); @@ -550,10 +553,13 @@ TriggerBoxUI::sample_chosen (int response, uint64_t n) return; } - std::string path = file_chooser->get_filename (); + std::list paths = file_chooser->get_filenames (); - _triggerbox.set_from_path (n, path); - // _triggerbox.trigger (n)->set_length (timecnt_t (Temporal::Beats (4, 0))); + for (std::list::iterator s = paths.begin(); s != paths.end(); ++s) { + /* this will do nothing if n is too large */ + _triggerbox.set_from_path (n, *s); + ++n; + } } void diff --git a/gtk2_ardour/ui_config_vars.h b/gtk2_ardour/ui_config_vars.h index 36b5e23083..e45739dfc2 100644 --- a/gtk2_ardour/ui_config_vars.h +++ b/gtk2_ardour/ui_config_vars.h @@ -132,3 +132,4 @@ UI_CONFIG_VARIABLE (bool, rulers_follow_grid, "rulers-follow-grid", false) UI_CONFIG_VARIABLE (bool, grid_follows_internal, "grid-follows-internal", false) //this feature is deprecated, default it FALSE for now; remove it in v6 UI_CONFIG_VARIABLE (bool, show_region_name, "show-region-name", true) UI_CONFIG_VARIABLE (int, time_axis_name_ellipsize_mode, "time-axis-name-ellipsize-mode", 0) +UI_CONFIG_VARIABLE (bool, show_triggers_inline, "show-triggers-inline", false)