From 0874426a5b6777559a12f87070b2aadb230ec50d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 8 Jun 2009 19:28:51 +0000 Subject: 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 --- gtk2_ardour/editor_canvas_events.cc | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'gtk2_ardour/editor_canvas_events.cc') 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 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 const tv = trackview_by_y_position (py); + if (tv.first == 0) { + return true; + } + + RouteTimeAxisView* rtav = dynamic_cast (tv.first); + if (rtav == 0 || !rtav->is_track ()) { + return true; + } + + list > regions; + TreeView* source; + region_list_display.get_object_drag_data (regions, &source); + assert (regions.size() == 1); + boost::shared_ptr region = regions.front (); + + boost::shared_ptr region_copy = RegionFactory::create (region); + + if (boost::dynamic_pointer_cast (region_copy) != 0 && + dynamic_cast (tv.first) == 0) { + + /* audio -> non-audio */ + return true; + } + + if (boost::dynamic_pointer_cast (region_copy) == 0 && + dynamic_cast (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; +} -- cgit v1.2.3