From 07dea5045651e836a38a3944658dc74eda5c077d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 30 Sep 2022 21:28:01 +0200 Subject: [PATCH] Fix DnD import to grouped tracks Import via Drag/Drop previously worked by selecting a track, and then importing to the selected track. This approach fails when the selected track is in a track-group, and selecting the track also selects other tracks of different type. Now the track to drop onto is passed directly passed through to ::finish_bringing_in_material as existing_track. --- gtk2_ardour/editor.h | 4 +++- gtk2_ardour/editor_audio_import.cc | 30 +++++++++++++++++------------- gtk2_ardour/editor_canvas.cc | 11 ++++------- gtk2_ardour/public_editor.h | 4 +++- gtk2_ardour/sfdb_ui.cc | 2 +- gtk2_ardour/trigger_page.cc | 2 +- share/scripts/s_import_files.lua | 4 ++-- 7 files changed, 31 insertions(+), 26 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 781b758146..3f590432ba 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -471,13 +471,15 @@ public: ARDOUR::MidiTempoMapDisposition mtd, Temporal::timepos_t& pos, boost::shared_ptr instrument = boost::shared_ptr(), + boost::shared_ptr track = boost::shared_ptr(), bool with_markers = false); void do_embed (std::vector paths, Editing::ImportDisposition disposition, Editing::ImportMode mode, Temporal::timepos_t& pos, - boost::shared_ptr instrument = boost::shared_ptr()); + boost::shared_ptr instrument = boost::shared_ptr(), + boost::shared_ptr track = boost::shared_ptr()); void get_regionview_corresponding_to (boost::shared_ptr region, std::vector& regions); diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 45845a78d3..64abe8ce42 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -361,17 +361,17 @@ Editor::import_smf_markers (Evoral::SMF & smf, timepos_t const & pos) } void -Editor::do_import (vector paths, - ImportDisposition disposition, - ImportMode mode, - SrcQuality quality, - MidiTrackNameSource midi_track_name_source, - MidiTempoMapDisposition smf_tempo_disposition, - timepos_t& pos, - ARDOUR::PluginInfoPtr instrument, - bool with_markers) +Editor::do_import (vector paths, + ImportDisposition disposition, + ImportMode mode, + SrcQuality quality, + MidiTrackNameSource midi_track_name_source, + MidiTempoMapDisposition smf_tempo_disposition, + timepos_t& pos, + ARDOUR::PluginInfoPtr instrument, + boost::shared_ptr track, + bool with_markers) { - boost::shared_ptr track; vector to_import; int nth = 0; bool use_timestamp = (pos == timepos_t::max (pos.time_domain())); @@ -522,9 +522,13 @@ Editor::do_import (vector paths, } void -Editor::do_embed (vector paths, ImportDisposition import_as, ImportMode mode, timepos_t& pos, ARDOUR::PluginInfoPtr instrument) +Editor::do_embed (vector paths, + ImportDisposition import_as, + ImportMode mode, + timepos_t& pos, + ARDOUR::PluginInfoPtr instrument, + boost::shared_ptr track) { - boost::shared_ptr track; bool check_sample_rate = true; vector to_embed; bool multi = paths.size() > 1; @@ -1051,7 +1055,7 @@ int Editor::finish_bringing_in_material (boost::shared_ptr region, uint32_t in_chans, uint32_t out_chans, - timepos_t& pos, + timepos_t& pos, ImportMode mode, boost::shared_ptr& existing_track, string const& new_track_name, diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index deff6537cc..f5d237bd81 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -440,7 +440,7 @@ Editor::drop_paths_part_two (const vector& paths, timepos_t const & p, d /* drop onto canvas background: create new tracks */ InstrumentSelector is(InstrumentSelector::ForTrackDefault); // instantiation builds instrument-list and sets default. - do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, SMFTrackNumber, SMFTempoIgnore, pos, is.selected_instrument(), false); + do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, SMFTrackNumber, SMFTempoIgnore, pos, is.selected_instrument()); if (UIConfiguration::instance().get_only_copy_imported_files() || copy) { do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, @@ -454,17 +454,14 @@ Editor::drop_paths_part_two (const vector& paths, timepos_t const & p, d /* check that its a track, not a bus */ if (tv->track()) { - /* select the track, then embed/import */ - selection->set (tv); - do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, - SrcBest, SMFTrackNumber, SMFTempoIgnore, pos); + SrcBest, SMFTrackNumber, SMFTempoIgnore, pos, boost::shared_ptr(), tv->track ()); if (UIConfiguration::instance().get_only_copy_imported_files() || copy) { do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, - SrcBest, SMFTrackName, SMFTempoIgnore, pos, boost::shared_ptr(), false); + SrcBest, SMFTrackName, SMFTempoIgnore, pos, boost::shared_ptr()); } else { - do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, pos); + do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, pos, boost::shared_ptr(), tv->track ()); } } } diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 2cf6796130..079fd9d13c 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -282,9 +282,11 @@ public: virtual void do_import (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, ARDOUR::MidiTrackNameSource, ARDOUR::MidiTempoMapDisposition, Temporal::timepos_t&, boost::shared_ptr instrument = boost::shared_ptr(), + boost::shared_ptr track = boost::shared_ptr(), bool with_markers = false) = 0; virtual void do_embed (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, Temporal::timepos_t&, - boost::shared_ptr instrument = boost::shared_ptr()) = 0; + boost::shared_ptr instrument = boost::shared_ptr(), + boost::shared_ptr track = boost::shared_ptr()) = 0; /** Open main export dialog */ virtual void export_audio () = 0; diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 082a100de9..dd50cefa8d 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -2208,7 +2208,7 @@ SoundFileOmega::do_something (int action) _import_active = true; if (copy_files_btn.get_active()) { - PublicEditor::instance().do_import (paths, chns, mode, quality, mts, mtd, where, instrument, with_midi_markers); + PublicEditor::instance().do_import (paths, chns, mode, quality, mts, mtd, where, instrument, boost::shared_ptr(), with_midi_markers); } else { PublicEditor::instance().do_embed (paths, chns, mode, where, instrument); } diff --git a/gtk2_ardour/trigger_page.cc b/gtk2_ardour/trigger_page.cc index 99a9698ebf..0203bf7338 100644 --- a/gtk2_ardour/trigger_page.cc +++ b/gtk2_ardour/trigger_page.cc @@ -724,7 +724,7 @@ TriggerPage::drop_paths_part_two (std::vector paths) } timepos_t pos (0); Editing::ImportDisposition disposition = Editing::ImportSerializeFiles; // or Editing::ImportDistinctFiles // TODO use drop modifier? config? - PublicEditor::instance().do_import (midi_paths, disposition, Editing::ImportAsTrigger, SrcBest, SMFTrackNumber, SMFTempoIgnore, pos, _trigger_clip_picker.instrument_plugin (), false); + PublicEditor::instance().do_import (midi_paths, disposition, Editing::ImportAsTrigger, SrcBest, SMFTrackNumber, SMFTempoIgnore, pos, _trigger_clip_picker.instrument_plugin ()); PublicEditor::instance().do_import (audio_paths, disposition, Editing::ImportAsTrigger, SrcBest, SMFTrackNumber, SMFTempoIgnore, pos); } diff --git a/share/scripts/s_import_files.lua b/share/scripts/s_import_files.lua index 1b7735a497..2a2ce4f797 100644 --- a/share/scripts/s_import_files.lua +++ b/share/scripts/s_import_files.lua @@ -5,10 +5,10 @@ function factory (params) return function () files:push_back("/tmp/test.wav") - local pos = -1 + local pos = Temporal.timepos_t(0) Editor:do_import (files, Editing.ImportDistinctFiles, Editing.ImportAsTrack, ARDOUR.SrcQuality.SrcBest, ARDOUR.MidiTrackNameSource.SMFTrackName, ARDOUR.MidiTempoMapDisposition.SMFTempoIgnore, - pos, ARDOUR.PluginInfo(), false) + pos, ARDOUR.PluginInfo(), ARDOUR.Track(), false) end end