summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_canvas_events.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-06-08 19:28:51 +0000
committerCarl Hetherington <carl@carlh.net>2009-06-08 19:28:51 +0000
commit0874426a5b6777559a12f87070b2aadb230ec50d (patch)
treed5126aab2f88035fe42531e663816f4509333618 /gtk2_ardour/editor_canvas_events.cc
parent472fa271fd2de889ef41dc3d7a1aaccce9ea42c0 (diff)
Further refactoring of drag code. Changes so that drags from the region list display a region view during the drag.
git-svn-id: svn://localhost/ardour2/branches/3.0@5127 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_canvas_events.cc')
-rw-r--r--gtk2_ardour/editor_canvas_events.cc64
1 files changed, 64 insertions, 0 deletions
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc
index 73c02d75d6..99868367f0 100644
--- a/gtk2_ardour/editor_canvas_events.cc
+++ b/gtk2_ardour/editor_canvas_events.cc
@@ -26,6 +26,9 @@
#include "ardour/audio_diskstream.h"
#include "ardour/audioplaylist.h"
+#include "ardour/midi_region.h"
+#include "ardour/audioregion.h"
+#include "ardour/region_factory.h"
#include "editor.h"
#include "keyboard.h"
@@ -43,6 +46,7 @@
#include "simplerect.h"
#include "interactive-item.h"
#include "editor_drag.h"
+#include "midi_time_axis.h"
#include "i18n.h"
@@ -896,3 +900,63 @@ Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
return typed_event (item, event, NoItem);
}
+bool
+Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & c, int x, int y, guint time)
+{
+ double wx;
+ double wy;
+ track_canvas->window_to_world (x, y, wx, wy);
+
+ GdkEvent event;
+ event.type = GDK_MOTION_NOTIFY;
+ event.button.x = wx;
+ event.button.y = wy;
+ /* assume we're dragging with button 1 */
+ event.motion.state = Gdk::BUTTON1_MASK;
+
+ if (_drag == 0) {
+
+ double px;
+ double py;
+ nframes64_t const pos = event_frame (&event, &px, &py);
+
+ std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
+ if (tv.first == 0) {
+ return true;
+ }
+
+ RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
+ if (rtav == 0 || !rtav->is_track ()) {
+ return true;
+ }
+
+ list<boost::shared_ptr<Region> > regions;
+ TreeView* source;
+ region_list_display.get_object_drag_data (regions, &source);
+ assert (regions.size() == 1);
+ boost::shared_ptr<Region> region = regions.front ();
+
+ boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
+
+ if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
+ dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
+
+ /* audio -> non-audio */
+ return true;
+ }
+
+ if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
+ dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
+
+ /* MIDI -> non-MIDI */
+ return true;
+ }
+
+ _drag = new RegionInsertDrag (this, region_copy, rtav, pos);
+ _drag->start_grab (&event);
+ }
+
+ _drag->motion_handler (&event, false);
+
+ return true;
+}