From 2aadc53a443f842fe03b212558e1db3db493d5d3 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 1 Dec 2025 20:34:33 +0100 Subject: [PATCH] Strip Import: add option to show all local tracks --- gtk2_ardour/strip_import_dialog.cc | 109 +++++++++++++++++++++-------- gtk2_ardour/strip_import_dialog.h | 6 +- 2 files changed, 81 insertions(+), 34 deletions(-) diff --git a/gtk2_ardour/strip_import_dialog.cc b/gtk2_ardour/strip_import_dialog.cc index 5aeff03821..bd60c375c1 100644 --- a/gtk2_ardour/strip_import_dialog.cc +++ b/gtk2_ardour/strip_import_dialog.cc @@ -425,10 +425,29 @@ StripImportDialog::refill_import_table () _strip_table.attach (*manage (new ArdourHSpacer (1.0)), 0, 4, 1, 2, EXPAND | FILL, SHRINK, 4, 8); /* clang-format on */ + const bool show_all_local_tracks = _show_all_toggle->get_active (); + std::vector> sorted_map; - for (auto const& i : _import_map) { - sorted_map.push_back (i); + + if (show_all_local_tracks) { + for (auto const& r : _route_map) { + PBD::ID d (0); + try { + d = _import_map.at (r.first); + } catch (...) {} + sorted_map.push_back (make_pair (r.first, d)); + } + for (auto const& i : _import_map) { + if (_route_map.find (i.first) == _route_map.end ()) { + sorted_map.push_back (i); + } + } + } else { + for (auto const& i : _import_map) { + sorted_map.push_back (i); + } } + std::sort (sorted_map.begin (), sorted_map.end (), [=] (auto& a, auto& b) { try { return _route_map.at (a.first).pi.order () < _route_map.at (b.first).pi.order (); @@ -440,27 +459,42 @@ StripImportDialog::refill_import_table () /* Refill table */ int r = 1; for (auto& [rid, eid] : sorted_map /*_import_map*/) { - ++r; - if (_route_map.find (rid) != _route_map.end ()) { + bool is_new = _route_map.find (rid) == _route_map.end (); + + if (!is_new) { l = manage (new Label (_route_map.at (rid).name, 0, 0.5)); } else { l = manage (new Label (_("New Track"), 0, 0.5)); l->set_use_markup (); } + + ++r; _strip_table.attach (*l, 0, 1, r, r + 1, EXPAND | FILL, SHRINK); + #if 0 l = manage (new Label (_extern_map[eid], 1.0, 0.5)); _strip_table.attach (*l, 2, 3, r, r + 1, EXPAND | FILL, SHRINK); #else using namespace Menu_Helpers; ArdourDropdown* dd = manage (new ArdourDropdown ()); + if (show_all_local_tracks) { + dd->add_menu_elem (MenuElem ("---", sigc::bind (sigc::mem_fun (*this, &StripImportDialog::change_mapping), dd, rid, PBD::ID (0), "---"))); + } for (auto& [eid, einfo] : _extern_map) { dd->add_menu_elem (MenuElem (Gtkmm2ext::markup_escape_text (einfo.name), sigc::bind (sigc::mem_fun (*this, &StripImportDialog::change_mapping), dd, rid, eid, einfo.name))); } - dd->set_text (_extern_map.at (eid).name); + assert (show_all_local_tracks || _extern_map.find (eid) != _extern_map.end ()); + try { + dd->set_text (_extern_map.at (eid).name); + } catch (std::out_of_range const&) { + dd->set_text ("---"); + } _strip_table.attach (*dd, 2, 3, r, r + 1, EXPAND | FILL, SHRINK); #endif + if (show_all_local_tracks && !is_new) { + continue; + } ArdourButton* rm = manage (new ArdourButton ()); rm->set_icon (ArdourIcon::CloseCross); rm->signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &StripImportDialog::remove_mapping), rid)); @@ -497,12 +531,14 @@ StripImportDialog::refill_import_table () _add_rid_dropdown->add_menu_elem (MenuElem (_(" -- New Track -- "), sigc::bind (sigc::mem_fun (*this, &StripImportDialog::prepare_mapping), false, next_new, _("New Track")))); sizing_texts.push_back (_(" -- New Track -- ")); - for (auto& [rid, rinfo] : _route_map) { - if (_import_map.find (rid) != _import_map.end ()) { - continue; + if (!show_all_local_tracks) { + for (auto& [rid, rinfo] : _route_map) { + if (_import_map.find (rid) != _import_map.end ()) { + continue; + } + _add_rid_dropdown->add_menu_elem (MenuElem (Gtkmm2ext::markup_escape_text (rinfo.name), sigc::bind (sigc::mem_fun (*this, &StripImportDialog::prepare_mapping), false, rid, rinfo.name))); + sizing_texts.push_back (rinfo.name); } - _add_rid_dropdown->add_menu_elem (MenuElem (Gtkmm2ext::markup_escape_text (rinfo.name), sigc::bind (sigc::mem_fun (*this, &StripImportDialog::prepare_mapping), false, rid, rinfo.name))); - sizing_texts.push_back (rinfo.name); } _add_eid_dropdown = manage (new ArdourWidgets::ArdourDropdown ()); @@ -546,8 +582,16 @@ StripImportDialog::idle_refill_import_table () void StripImportDialog::change_mapping (ArdourDropdown* dd, PBD::ID const& rid, PBD::ID const& eid, std::string const& name) { + if (eid == PBD::ID (0)) { + _import_map.erase (rid); + } else { + _import_map[rid] = eid; + } dd->set_text (name); - _import_map[rid] = eid; + + if (_show_all_toggle->get_active ()) { + idle_refill_import_table (); + } } void @@ -570,7 +614,6 @@ StripImportDialog::add_mapping () assert (_add_rid != PBD::ID (0)); assert (_add_eid != PBD::ID (0)); - _default_mapping = false; _import_map[_add_rid] = _add_eid; idle_refill_import_table (); @@ -580,7 +623,6 @@ void StripImportDialog::remove_mapping (PBD::ID const& id) { if (1 == _import_map.erase (id)) { - _default_mapping = false; idle_refill_import_table (); } } @@ -588,7 +630,6 @@ StripImportDialog::remove_mapping (PBD::ID const& id) void StripImportDialog::clear_mapping () { - _default_mapping = false; _import_map.clear (); idle_refill_import_table (); } @@ -596,11 +637,18 @@ StripImportDialog::clear_mapping () void StripImportDialog::import_all_strips () { - _default_mapping = false; _import_map.clear (); int64_t next_id = std::numeric_limits::max () - 1 - _extern_map.size (); for (auto& [eid, einfo] : _extern_map) { + if (einfo.pi.special () || einfo.pi.hidden ()) { + continue; + } +#ifdef MIXBUS + if (einfo.mixbus > 0) { + continue; + } +#endif PBD::ID next_new = PBD::ID (next_id++); _import_map[next_new] = eid; } @@ -612,7 +660,6 @@ void StripImportDialog::set_default_mapping (bool and_idle_update) { _import_map.clear (); - _default_mapping = true; if (_match_pbd_id) { /* try a 1:1 mapping */ @@ -657,23 +704,22 @@ StripImportDialog::setup_strip_import_page () #endif } - set_default_mapping (false); + using namespace Menu_Helpers; + _action = manage (new ArdourWidgets::ArdourDropdown ()); + _action->add_menu_elem (MenuElem (_("Clear Mapping"), sigc::mem_fun (*this, &StripImportDialog::clear_mapping))); + _action->add_menu_elem (MenuElem (_("Import all as new tracks"), sigc::mem_fun (*this, &StripImportDialog::import_all_strips))); + _action->add_menu_elem (MenuElem (_match_pbd_id ? _("Reset - auto-map by ID") : _("Reset - auto-map by name"), sigc::bind (mem_fun (*this, &StripImportDialog::set_default_mapping), true))); + _action->set_text (_("Actions")); - refill_import_table (); - - _clear_mapping = new ArdourButton (_("Clear Mapping")); - _reset_mapping = new ArdourButton (_match_pbd_id ? _("Reset - auto-map by ID") : _("Reset - auto-map by name")); - _import_strips = new ArdourButton (_("Import all as new tracks")); - - _clear_mapping->signal_clicked.connect (mem_fun (*this, &StripImportDialog::clear_mapping)); - _import_strips->signal_clicked.connect (mem_fun (*this, &StripImportDialog::import_all_strips)); - _reset_mapping->signal_clicked.connect (sigc::bind (mem_fun (*this, &StripImportDialog::set_default_mapping), true)); + _show_all_toggle = new ArdourButton (_("Show all local tracks"), ArdourButton::led_default_elements, true); + _show_all_toggle->set_led_left (true); + _show_all_toggle->set_can_focus (true); + _show_all_toggle->signal_clicked.connect (mem_fun (*this, &StripImportDialog::refill_import_table)); HBox* hbox = manage (new HBox ()); hbox->set_spacing (4); - hbox->pack_start (*_clear_mapping, true, false); - hbox->pack_start (*_import_strips, true, false); - hbox->pack_start (*_reset_mapping, true, false); + hbox->pack_start (*_action, true, false); + hbox->pack_start (*_show_all_toggle, true, false); VBox* vbox = manage (new VBox ()); vbox->pack_start (_strip_table, false, false, 4); @@ -686,7 +732,10 @@ StripImportDialog::setup_strip_import_page () _page_strip.pack_end (*hbox, false, false, 4); _page_strip.show_all (); - _ok_button->set_sensitive (true); // XXX + _ok_button->set_sensitive (true); + + set_default_mapping (false); + refill_import_table (); } void diff --git a/gtk2_ardour/strip_import_dialog.h b/gtk2_ardour/strip_import_dialog.h index 61e0daf5ea..2bc7b5fa15 100644 --- a/gtk2_ardour/strip_import_dialog.h +++ b/gtk2_ardour/strip_import_dialog.h @@ -119,9 +119,8 @@ private: ArdourWidgets::ArdourDropdown* _add_rid_dropdown; ArdourWidgets::ArdourDropdown* _add_eid_dropdown; ArdourWidgets::ArdourButton* _add_new_mapping; - ArdourWidgets::ArdourButton* _clear_mapping; - ArdourWidgets::ArdourButton* _reset_mapping; - ArdourWidgets::ArdourButton* _import_strips; + ArdourWidgets::ArdourDropdown* _action; + ArdourWidgets::ArdourButton* _show_all_toggle; bool _match_pbd_id; std::string _path; @@ -132,7 +131,6 @@ private: PBD::ID _add_rid; PBD::ID _add_eid; - bool _default_mapping; sigc::connection _notebook_connection; sigc::connection _chooser_connection;