2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "pbd/stacktrace.h"
27 #include "ardour/audio_diskstream.h"
28 #include "ardour/audioplaylist.h"
29 #include "ardour/audioregion.h"
30 #include "ardour/region_factory.h"
31 #include "ardour/midi_region.h"
35 #include "public_editor.h"
36 #include "audio_region_view.h"
37 #include "audio_streamview.h"
38 #include "crossfade_view.h"
39 #include "audio_time_axis.h"
40 #include "region_gain_line.h"
41 #include "automation_line.h"
42 #include "automation_time_axis.h"
43 #include "automation_line.h"
44 #include "control_point.h"
45 #include "canvas_impl.h"
46 #include "simplerect.h"
47 #include "interactive-item.h"
48 #include "editor_drag.h"
49 #include "midi_time_axis.h"
50 #include "editor_regions.h"
56 using namespace ARDOUR;
59 using namespace ArdourCanvas;
62 Editor::track_canvas_scroll (GdkEventScroll* ev)
67 int direction = ev->direction;
69 Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y);
70 InteractiveItem* interactive_item = dynamic_cast<InteractiveItem*>(item);
71 if (interactive_item) {
72 return interactive_item->on_event(reinterpret_cast<GdkEvent*>(ev));
78 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
79 //if (ev->state == GDK_CONTROL_MASK) {
81 the ev->x will be out of step with the canvas
82 if we're in mid zoom, so we have to get the damn mouse
85 track_canvas->get_pointer (x, y);
86 track_canvas->window_to_world (x, y, wx, wy);
89 event.type = GDK_BUTTON_RELEASE;
93 nframes64_t where = event_frame (&event, 0, 0);
94 temporal_zoom_to_frame (false, where);
96 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
97 direction = GDK_SCROLL_LEFT;
99 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
100 if (!current_stepping_trackview) {
101 step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
102 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
103 current_stepping_trackview = p.first;
104 if (!current_stepping_trackview) {
108 last_track_height_step_timestamp = get_microseconds();
109 current_stepping_trackview->step_height (true);
112 scroll_tracks_up_line ();
117 case GDK_SCROLL_DOWN:
118 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
119 //if (ev->state == GDK_CONTROL_MASK) {
120 track_canvas->get_pointer (x, y);
121 track_canvas->window_to_world (x, y, wx, wy);
124 event.type = GDK_BUTTON_RELEASE;
128 nframes64_t where = event_frame (&event, 0, 0);
129 temporal_zoom_to_frame (true, where);
131 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
132 direction = GDK_SCROLL_RIGHT;
134 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
135 if (!current_stepping_trackview) {
136 step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
137 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
138 current_stepping_trackview = p.first;
139 if (!current_stepping_trackview) {
143 last_track_height_step_timestamp = get_microseconds();
144 current_stepping_trackview->step_height (false);
147 scroll_tracks_down_line ();
152 case GDK_SCROLL_LEFT:
153 xdelta = (current_page_frames() / 8);
154 if (leftmost_frame > xdelta) {
155 reset_x_origin (leftmost_frame - xdelta);
161 case GDK_SCROLL_RIGHT:
162 xdelta = (current_page_frames() / 8);
163 if (max_frames - xdelta > leftmost_frame) {
164 reset_x_origin (leftmost_frame + xdelta);
166 reset_x_origin (max_frames - current_page_frames());
179 Editor::track_canvas_scroll_event (GdkEventScroll *event)
181 track_canvas->grab_focus();
182 track_canvas_scroll (event);
187 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
190 track_canvas->grab_focus();
195 Editor::track_canvas_button_release_event (GdkEventButton *event)
198 _drag->end_grab ((GdkEvent*) event);
206 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
209 /* keep those motion events coming */
210 track_canvas->get_pointer (x, y);
215 Editor::track_canvas_motion (GdkEvent *ev)
217 if (verbose_cursor_visible) {
218 verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10);
219 verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10);
226 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
230 switch (event->type) {
231 case GDK_BUTTON_PRESS:
232 case GDK_2BUTTON_PRESS:
233 case GDK_3BUTTON_PRESS:
234 ret = button_press_handler (item, event, type);
236 case GDK_BUTTON_RELEASE:
237 ret = button_release_handler (item, event, type);
239 case GDK_MOTION_NOTIFY:
240 ret = motion_handler (item, event);
243 case GDK_ENTER_NOTIFY:
244 ret = enter_handler (item, event, type);
247 case GDK_LEAVE_NOTIFY:
248 ret = leave_handler (item, event, type);
258 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
262 if (!rv->sensitive ()) {
267 switch (event->type) {
268 case GDK_BUTTON_PRESS:
269 case GDK_2BUTTON_PRESS:
270 case GDK_3BUTTON_PRESS:
271 clicked_regionview = rv;
272 clicked_control_point = 0;
273 clicked_axisview = &rv->get_time_axis_view();
274 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
275 ret = button_press_handler (item, event, RegionItem);
278 case GDK_BUTTON_RELEASE:
279 ret = button_release_handler (item, event, RegionItem);
282 case GDK_MOTION_NOTIFY:
283 ret = motion_handler (item, event);
286 case GDK_ENTER_NOTIFY:
287 set_entered_track (&rv->get_time_axis_view ());
288 set_entered_regionview (rv);
291 case GDK_LEAVE_NOTIFY:
292 set_entered_track (0);
293 set_entered_regionview (0);
304 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
308 switch (event->type) {
309 case GDK_BUTTON_PRESS:
310 case GDK_2BUTTON_PRESS:
311 case GDK_3BUTTON_PRESS:
312 clicked_regionview = 0;
313 clicked_control_point = 0;
314 clicked_axisview = tv;
315 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(tv);
316 ret = button_press_handler (item, event, StreamItem);
319 case GDK_BUTTON_RELEASE:
320 ret = button_release_handler (item, event, StreamItem);
323 case GDK_MOTION_NOTIFY:
324 ret = motion_handler (item, event);
327 case GDK_ENTER_NOTIFY:
328 set_entered_track (tv);
331 case GDK_LEAVE_NOTIFY:
332 set_entered_track (0);
343 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
347 switch (event->type) {
348 case GDK_BUTTON_PRESS:
349 case GDK_2BUTTON_PRESS:
350 case GDK_3BUTTON_PRESS:
351 clicked_regionview = 0;
352 clicked_control_point = 0;
353 clicked_axisview = atv;
354 clicked_routeview = 0;
355 ret = button_press_handler (item, event, AutomationTrackItem);
358 case GDK_BUTTON_RELEASE:
359 ret = button_release_handler (item, event, AutomationTrackItem);
362 case GDK_MOTION_NOTIFY:
363 ret = motion_handler (item, event);
366 case GDK_ENTER_NOTIFY:
367 ret = enter_handler (item, event, AutomationTrackItem);
370 case GDK_LEAVE_NOTIFY:
371 ret = leave_handler (item, event, AutomationTrackItem);
382 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
384 /* we handle only button 3 press/release events */
386 if (!rv->sensitive()) {
390 switch (event->type) {
391 case GDK_BUTTON_PRESS:
392 clicked_regionview = rv;
393 clicked_control_point = 0;
394 clicked_axisview = &rv->get_time_axis_view();
395 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
396 if (event->button.button == 3) {
397 return button_press_handler (item, event, FadeInItem);
401 case GDK_BUTTON_RELEASE:
402 if (event->button.button == 3) {
403 return button_release_handler (item, event, FadeInItem);
412 /* proxy for the regionview */
414 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
418 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
422 if (!rv->sensitive()) {
426 switch (event->type) {
427 case GDK_BUTTON_PRESS:
428 case GDK_2BUTTON_PRESS:
429 case GDK_3BUTTON_PRESS:
430 clicked_regionview = rv;
431 clicked_control_point = 0;
432 clicked_axisview = &rv->get_time_axis_view();
433 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
434 ret = button_press_handler (item, event, FadeInHandleItem);
437 case GDK_BUTTON_RELEASE:
438 ret = button_release_handler (item, event, FadeInHandleItem);
441 case GDK_MOTION_NOTIFY:
442 ret = motion_handler (item, event);
445 case GDK_ENTER_NOTIFY:
446 ret = enter_handler (item, event, FadeInHandleItem);
449 case GDK_LEAVE_NOTIFY:
450 ret = leave_handler (item, event, FadeInHandleItem);
461 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
463 /* we handle only button 3 press/release events */
465 if (!rv->sensitive()) {
469 switch (event->type) {
470 case GDK_BUTTON_PRESS:
471 clicked_regionview = rv;
472 clicked_control_point = 0;
473 clicked_axisview = &rv->get_time_axis_view();
474 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
475 if (event->button.button == 3) {
476 return button_press_handler (item, event, FadeOutItem);
480 case GDK_BUTTON_RELEASE:
481 if (event->button.button == 3) {
482 return button_release_handler (item, event, FadeOutItem);
491 /* proxy for the regionview */
493 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
497 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
501 if (!rv->sensitive()) {
505 switch (event->type) {
506 case GDK_BUTTON_PRESS:
507 case GDK_2BUTTON_PRESS:
508 case GDK_3BUTTON_PRESS:
509 clicked_regionview = rv;
510 clicked_control_point = 0;
511 clicked_axisview = &rv->get_time_axis_view();
512 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
513 ret = button_press_handler (item, event, FadeOutHandleItem);
516 case GDK_BUTTON_RELEASE:
517 ret = button_release_handler (item, event, FadeOutHandleItem);
520 case GDK_MOTION_NOTIFY:
521 ret = motion_handler (item, event);
524 case GDK_ENTER_NOTIFY:
525 ret = enter_handler (item, event, FadeOutHandleItem);
528 case GDK_LEAVE_NOTIFY:
529 ret = leave_handler (item, event, FadeOutHandleItem);
539 struct DescendingRegionLayerSorter {
540 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
541 return a->layer() > b->layer();
546 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
548 /* we handle only button 3 press/release events */
550 switch (event->type) {
551 case GDK_BUTTON_PRESS:
552 clicked_crossfadeview = xfv;
553 clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
554 if (event->button.button == 3) {
555 return button_press_handler (item, event, CrossfadeViewItem);
559 case GDK_BUTTON_RELEASE:
560 if (event->button.button == 3) {
561 bool ret = button_release_handler (item, event, CrossfadeViewItem);
571 /* XXX do not forward double clicks */
573 if (event->type == GDK_2BUTTON_PRESS) {
577 /* proxy for an underlying regionview */
579 /* XXX really need to check if we are in the name highlight,
580 and proxy to that when required.
583 TimeAxisView& tv (xfv->get_time_axis_view());
584 AudioTimeAxisView* atv;
586 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
588 if (atv->is_audio_track()) {
590 boost::shared_ptr<AudioPlaylist> pl;
591 if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->get_diskstream()->playlist())) != 0) {
593 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
596 if (atv->layer_display() == Overlaid) {
598 /* we're in overlaid mode; proxy to the uppermost region view */
600 DescendingRegionLayerSorter cmp;
603 RegionView* rv = atv->view()->find_view (rl->front());
608 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
612 /* we're in stacked mode; proxy to the region view under the mouse */
614 /* XXX: FIXME: this is an evil hack; it assumes that any event for which
615 this proxy is being used has its GdkEvent laid out such that the y
616 member is in the same place as that for a GdkEventButton */
618 /* position of the event within the track */
619 double cx = event->button.x;
620 double cy = event->button.y;
621 atv->view()->canvas_item()->w2i (cx, cy);
623 /* hence layer that we're over */
624 double const c = atv->view()->child_height ();
625 layer_t const l = pl->top_layer () + 1 - (cy / c);
628 Playlist::RegionList::iterator i = rl->begin();
629 while (i != rl->end() && (*i)->layer() != l) {
633 if (i != rl->end()) {
634 RegionView* rv = atv->view()->find_view (*i);
638 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
652 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
654 switch (event->type) {
655 case GDK_BUTTON_PRESS:
656 case GDK_2BUTTON_PRESS:
657 case GDK_3BUTTON_PRESS:
658 clicked_control_point = cp;
659 clicked_axisview = &cp->line().trackview;
660 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
661 clicked_regionview = 0;
667 case GDK_SCROLL_DOWN:
674 return typed_event (item, event, ControlPointItem);
678 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
682 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
685 type = AutomationLineItem;
688 return typed_event (item, event, type);
692 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
696 switch (event->type) {
697 case GDK_BUTTON_PRESS:
698 case GDK_2BUTTON_PRESS:
699 case GDK_3BUTTON_PRESS:
700 clicked_selection = rect->id;
701 ret = button_press_handler (item, event, SelectionItem);
703 case GDK_BUTTON_RELEASE:
704 ret = button_release_handler (item, event, SelectionItem);
706 case GDK_MOTION_NOTIFY:
707 ret = motion_handler (item, event);
709 /* Don't need these at the moment. */
710 case GDK_ENTER_NOTIFY:
711 ret = enter_handler (item, event, SelectionItem);
714 case GDK_LEAVE_NOTIFY:
715 ret = leave_handler (item, event, SelectionItem);
726 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
730 switch (event->type) {
731 case GDK_BUTTON_PRESS:
732 case GDK_2BUTTON_PRESS:
733 case GDK_3BUTTON_PRESS:
734 clicked_selection = rect->id;
735 ret = button_press_handler (item, event, StartSelectionTrimItem);
737 case GDK_BUTTON_RELEASE:
738 ret = button_release_handler (item, event, StartSelectionTrimItem);
740 case GDK_MOTION_NOTIFY:
741 ret = motion_handler (item, event);
743 case GDK_ENTER_NOTIFY:
744 ret = enter_handler (item, event, StartSelectionTrimItem);
747 case GDK_LEAVE_NOTIFY:
748 ret = leave_handler (item, event, StartSelectionTrimItem);
759 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
763 switch (event->type) {
764 case GDK_BUTTON_PRESS:
765 case GDK_2BUTTON_PRESS:
766 case GDK_3BUTTON_PRESS:
767 clicked_selection = rect->id;
768 ret = button_press_handler (item, event, EndSelectionTrimItem);
770 case GDK_BUTTON_RELEASE:
771 ret = button_release_handler (item, event, EndSelectionTrimItem);
773 case GDK_MOTION_NOTIFY:
774 ret = motion_handler (item, event);
776 case GDK_ENTER_NOTIFY:
777 ret = enter_handler (item, event, EndSelectionTrimItem);
780 case GDK_LEAVE_NOTIFY:
781 ret = leave_handler (item, event, EndSelectionTrimItem);
792 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
796 /* frame handles are not active when in internal edit mode, because actual notes
797 might be in the area occupied by the handle - we want them to be editable as normal.
800 if (internal_editing() || !rv->sensitive()) {
804 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
805 perspective. XXX change this ??
808 switch (event->type) {
809 case GDK_BUTTON_PRESS:
810 case GDK_2BUTTON_PRESS:
811 case GDK_3BUTTON_PRESS:
812 clicked_regionview = rv;
813 clicked_control_point = 0;
814 clicked_axisview = &clicked_regionview->get_time_axis_view();
815 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
816 ret = button_press_handler (item, event, RegionViewNameHighlight);
818 case GDK_BUTTON_RELEASE:
819 ret = button_release_handler (item, event, RegionViewNameHighlight);
821 case GDK_MOTION_NOTIFY:
822 ret = motion_handler (item, event);
824 case GDK_ENTER_NOTIFY:
825 ret = enter_handler (item, event, RegionViewNameHighlight);
828 case GDK_LEAVE_NOTIFY:
829 ret = leave_handler (item, event, RegionViewNameHighlight);
841 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
845 if (!rv->sensitive()) {
849 switch (event->type) {
850 case GDK_BUTTON_PRESS:
851 case GDK_2BUTTON_PRESS:
852 case GDK_3BUTTON_PRESS:
853 clicked_regionview = rv;
854 clicked_control_point = 0;
855 clicked_axisview = &clicked_regionview->get_time_axis_view();
856 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
857 ret = button_press_handler (item, event, RegionViewNameHighlight);
859 case GDK_BUTTON_RELEASE:
860 ret = button_release_handler (item, event, RegionViewNameHighlight);
862 case GDK_MOTION_NOTIFY:
863 ret = motion_handler (item, event);
865 case GDK_ENTER_NOTIFY:
866 ret = enter_handler (item, event, RegionViewNameHighlight);
869 case GDK_LEAVE_NOTIFY:
870 ret = leave_handler (item, event, RegionViewNameHighlight);
881 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
885 if (!rv->sensitive()) {
889 switch (event->type) {
890 case GDK_BUTTON_PRESS:
891 case GDK_2BUTTON_PRESS:
892 case GDK_3BUTTON_PRESS:
893 clicked_regionview = rv;
894 clicked_control_point = 0;
895 clicked_axisview = &clicked_regionview->get_time_axis_view();
896 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
897 ret = button_press_handler (item, event, RegionViewName);
899 case GDK_BUTTON_RELEASE:
900 ret = button_release_handler (item, event, RegionViewName);
902 case GDK_MOTION_NOTIFY:
903 ret = motion_handler (item, event);
905 case GDK_ENTER_NOTIFY:
906 ret = enter_handler (item, event, RegionViewName);
909 case GDK_LEAVE_NOTIFY:
910 ret = leave_handler (item, event, RegionViewName);
921 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
923 return typed_event (item, event, MarkerItem);
927 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
929 return typed_event (item, event, MarkerBarItem);
933 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
935 return typed_event (item, event, RangeMarkerBarItem);
939 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
941 return typed_event (item, event, TransportMarkerBarItem);
945 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
947 return typed_event (item, event, CdMarkerBarItem);
951 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
953 return typed_event (item, event, TempoMarkerItem);
957 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
959 return typed_event (item, event, MeterMarkerItem);
963 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
965 return typed_event (item, event, TempoBarItem);
969 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
971 return typed_event (item, event, MeterBarItem);
975 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
977 return typed_event (item, event, PlayheadCursorItem);
981 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
983 return typed_event (item, event, NoItem);
987 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
989 if (!internal_editing()) {
993 return typed_event (item, event, NoteItem);
997 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
1001 track_canvas->window_to_world (x, y, wx, wy);
1004 event.type = GDK_MOTION_NOTIFY;
1005 event.button.x = wx;
1006 event.button.y = wy;
1007 /* assume we're dragging with button 1 */
1008 event.motion.state = Gdk::BUTTON1_MASK;
1014 nframes64_t const pos = event_frame (&event, &px, &py);
1016 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1017 if (tv.first == 0) {
1021 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1022 if (rtav == 0 || !rtav->is_track ()) {
1026 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1028 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1030 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1031 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1033 /* audio -> non-audio */
1037 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
1038 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
1040 /* MIDI -> non-MIDI */
1044 _drag = new RegionInsertDrag (this, region_copy, rtav, pos);
1045 _drag->start_grab (&event);
1048 _drag->motion_handler (&event, false);