diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index e66ca1ef22..8be0e61a7b 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -29,6 +29,7 @@ #include "ardour/profile.h" #include "ardour/rc_configuration.h" +#include "ardour/smf_source.h" #include "ardour_ui.h" #include "editor.h" @@ -422,6 +423,23 @@ void Editor::drop_paths_part_two (const vector& paths, framepos_t frame, double ypos, bool copy) { RouteTimeAxisView* tv; + + /* MIDI files must always be imported, because we consider them + * writable. So split paths into two vectors, and follow the import + * path on the MIDI part. + */ + + vector midi_paths; + vector audio_paths; + + for (vector::const_iterator i = paths.begin(); i != paths.end(); ++i) { + if (SMFSource::safe_midi_file_extension (*i)) { + midi_paths.push_back (*i); + } else { + audio_paths.push_back (*i); + } + } + std::pair const tvp = trackview_by_y_position (ypos); if (tvp.first == 0) { @@ -430,10 +448,12 @@ Editor::drop_paths_part_two (const vector& paths, framepos_t frame, doub frame = 0; + do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, frame); + if (Profile->get_sae() || Config->get_only_copy_imported_files() || copy) { - do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, SrcBest, frame); + do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, SrcBest, frame); } else { - do_embed (paths, Editing::ImportDistinctFiles, ImportAsTrack, frame); + do_embed (audio_paths, Editing::ImportDistinctFiles, ImportAsTrack, frame); } } else if ((tv = dynamic_cast (tvp.first)) != 0) { @@ -444,10 +464,12 @@ Editor::drop_paths_part_two (const vector& paths, framepos_t frame, doub /* select the track, then embed/import */ selection->set (tv); + do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, SrcBest, frame); + if (Profile->get_sae() || Config->get_only_copy_imported_files() || copy) { - do_import (paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, SrcBest, frame); + do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, SrcBest, frame); } else { - do_embed (paths, Editing::ImportSerializeFiles, ImportToTrack, frame); + do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, frame); } } } diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 7cd25ca92c..e76b4ce8ee 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -1031,46 +1031,59 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const& context, (void) event_frame (&event, &px, &py); std::pair const tv = trackview_by_y_position (py); - + bool can_drop = false; + if (tv.first != 0) { + /* over a time axis view of some kind */ + rtav = dynamic_cast (tv.first); if (rtav != 0 && rtav->is_track ()) { - - region = _regions->get_dragged_region (); + /* over a track, not a bus */ + can_drop = true; + } - if (region) { - - if ((boost::dynamic_pointer_cast (region) != 0 && - dynamic_cast (tv.first) != 0) || - (boost::dynamic_pointer_cast (region) != 0 && - dynamic_cast (tv.first) != 0)) { - /* audio to audio - OR - midi to midi - */ + } else { + /* not over a time axis view, so drop is possible */ + can_drop = true; + } - context->drag_status (context->get_suggested_action(), time); - return true; - } - } else { - /* DND originating from outside ardour - * - * TODO: check if file is audio/midi, allow drops on same track-type only, - * currently: if audio is dropped on a midi-track, it is only added to the region-list - */ - if (Profile->get_sae() || Config->get_only_copy_imported_files()) { - context->drag_status(Gdk::ACTION_COPY, time); - } else { - if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) - context->drag_status(Gdk::ACTION_COPY, time); - else - context->drag_status(Gdk::ACTION_LINK, time); - } + if (can_drop) { + region = _regions->get_dragged_region (); + + if (region) { + + if ((boost::dynamic_pointer_cast (region) != 0 && + dynamic_cast (tv.first) != 0) || + (boost::dynamic_pointer_cast (region) != 0 && + dynamic_cast (tv.first) != 0)) { + + /* audio to audio + OR + midi to midi + */ + + context->drag_status (context->get_suggested_action(), time); return true; } + } else { + /* DND originating from outside ardour + * + * TODO: check if file is audio/midi, allow drops on same track-type only, + * currently: if audio is dropped on a midi-track, it is only added to the region-list + */ + if (Profile->get_sae() || Config->get_only_copy_imported_files()) { + context->drag_status(Gdk::ACTION_COPY, time); + } else { + if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) { + context->drag_status(Gdk::ACTION_COPY, time); + } else { + context->drag_status(Gdk::ACTION_LINK, time); + } + } + return true; } }