summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-03-29 14:09:03 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-03-29 14:09:03 -0400
commit197e75ab80a863585d83b515de8762407dfc70e1 (patch)
tree408f303270eb2d76351344f4662f9545d27128bd /gtk2_ardour
parent9fce80d2bc05a690bd439bb5cffad81f2cff4c50 (diff)
allow Drag-n-Drop onto the empty canvas (again); always import MIDI files since we consider them writable and so embedding isn't a safe option
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor_canvas.cc30
-rw-r--r--gtk2_ardour/editor_canvas_events.cc67
2 files changed, 66 insertions, 31 deletions
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<string>& 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<string> midi_paths;
+ vector<string> audio_paths;
+
+ for (vector<string>::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<TimeAxisView*, int> const tvp = trackview_by_y_position (ypos);
if (tvp.first == 0) {
@@ -430,10 +448,12 @@ Editor::drop_paths_part_two (const vector<string>& 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<RouteTimeAxisView*> (tvp.first)) != 0) {
@@ -444,10 +464,12 @@ Editor::drop_paths_part_two (const vector<string>& 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<Gdk::DragContext> const& context,
(void) event_frame (&event, &px, &py);
std::pair<TimeAxisView*, int> 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<RouteTimeAxisView*> (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<AudioRegion> (region) != 0 &&
- dynamic_cast<AudioTimeAxisView*> (tv.first) != 0) ||
- (boost::dynamic_pointer_cast<MidiRegion> (region) != 0 &&
- dynamic_cast<MidiTimeAxisView*> (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;
- }
+ if (can_drop) {
+ region = _regions->get_dragged_region ();
+
+ if (region) {
+
+ if ((boost::dynamic_pointer_cast<AudioRegion> (region) != 0 &&
+ dynamic_cast<AudioTimeAxisView*> (tv.first) != 0) ||
+ (boost::dynamic_pointer_cast<MidiRegion> (region) != 0 &&
+ dynamic_cast<MidiTimeAxisView*> (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 {
- /* 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()) {
+ if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) {
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);
+ context->drag_status(Gdk::ACTION_LINK, time);
}
- return true;
}
+ return true;
}
}