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 "canvas-noevent-text.h"
39 #include "crossfade_view.h"
40 #include "audio_time_axis.h"
41 #include "region_gain_line.h"
42 #include "automation_line.h"
43 #include "automation_time_axis.h"
44 #include "automation_line.h"
45 #include "control_point.h"
46 #include "canvas_impl.h"
47 #include "simplerect.h"
48 #include "interactive-item.h"
49 #include "editor_drag.h"
50 #include "midi_time_axis.h"
51 #include "editor_regions.h"
56 using namespace ARDOUR;
59 using namespace ArdourCanvas;
61 using Gtkmm2ext::Keyboard;
64 Editor::track_canvas_scroll (GdkEventScroll* ev)
69 int direction = ev->direction;
71 Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y);
72 InteractiveItem* interactive_item = dynamic_cast<InteractiveItem*>(item);
73 if (interactive_item) {
74 return interactive_item->on_event(reinterpret_cast<GdkEvent*>(ev));
80 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
81 //if (ev->state == GDK_CONTROL_MASK) {
83 the ev->x will be out of step with the canvas
84 if we're in mid zoom, so we have to get the damn mouse
87 track_canvas->get_pointer (x, y);
88 track_canvas->window_to_world (x, y, wx, wy);
91 event.type = GDK_BUTTON_RELEASE;
95 nframes64_t where = event_frame (&event, 0, 0);
96 temporal_zoom_to_frame (false, where);
98 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
99 direction = GDK_SCROLL_LEFT;
101 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
102 if (!current_stepping_trackview) {
103 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
104 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
105 current_stepping_trackview = p.first;
106 if (!current_stepping_trackview) {
110 last_track_height_step_timestamp = get_microseconds();
111 current_stepping_trackview->step_height (true);
114 scroll_tracks_up_line ();
119 case GDK_SCROLL_DOWN:
120 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
121 //if (ev->state == GDK_CONTROL_MASK) {
122 track_canvas->get_pointer (x, y);
123 track_canvas->window_to_world (x, y, wx, wy);
126 event.type = GDK_BUTTON_RELEASE;
130 nframes64_t where = event_frame (&event, 0, 0);
131 temporal_zoom_to_frame (true, where);
133 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
134 direction = GDK_SCROLL_RIGHT;
136 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
137 if (!current_stepping_trackview) {
138 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
139 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
140 current_stepping_trackview = p.first;
141 if (!current_stepping_trackview) {
145 last_track_height_step_timestamp = get_microseconds();
146 current_stepping_trackview->step_height (false);
149 scroll_tracks_down_line ();
154 case GDK_SCROLL_LEFT:
155 xdelta = (current_page_frames() / 8);
156 if (leftmost_frame > xdelta) {
157 reset_x_origin (leftmost_frame - xdelta);
163 case GDK_SCROLL_RIGHT:
164 xdelta = (current_page_frames() / 8);
165 if (max_frames - xdelta > leftmost_frame) {
166 reset_x_origin (leftmost_frame + xdelta);
168 reset_x_origin (max_frames - current_page_frames());
181 Editor::track_canvas_scroll_event (GdkEventScroll *event)
183 track_canvas->grab_focus();
184 track_canvas_scroll (event);
189 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
192 track_canvas->grab_focus();
197 Editor::track_canvas_button_release_event (GdkEventButton *event)
200 _drag->end_grab ((GdkEvent*) event);
208 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
211 /* keep those motion events coming */
212 track_canvas->get_pointer (x, y);
217 Editor::track_canvas_motion (GdkEvent *ev)
219 if (verbose_cursor_visible) {
220 verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10);
221 verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10);
228 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
232 switch (event->type) {
233 case GDK_BUTTON_PRESS:
234 case GDK_2BUTTON_PRESS:
235 case GDK_3BUTTON_PRESS:
236 ret = button_press_handler (item, event, type);
238 case GDK_BUTTON_RELEASE:
239 ret = button_release_handler (item, event, type);
241 case GDK_MOTION_NOTIFY:
242 ret = motion_handler (item, event);
245 case GDK_ENTER_NOTIFY:
246 ret = enter_handler (item, event, type);
249 case GDK_LEAVE_NOTIFY:
250 ret = leave_handler (item, event, type);
260 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
264 if (!rv->sensitive ()) {
268 switch (event->type) {
269 case GDK_BUTTON_PRESS:
270 case GDK_2BUTTON_PRESS:
271 case GDK_3BUTTON_PRESS:
272 clicked_regionview = rv;
273 clicked_control_point = 0;
274 clicked_axisview = &rv->get_time_axis_view();
275 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
276 ret = button_press_handler (item, event, RegionItem);
279 case GDK_BUTTON_RELEASE:
280 ret = button_release_handler (item, event, RegionItem);
283 case GDK_MOTION_NOTIFY:
284 ret = motion_handler (item, event);
287 case GDK_ENTER_NOTIFY:
288 set_entered_track (&rv->get_time_axis_view ());
289 set_entered_regionview (rv);
292 case GDK_LEAVE_NOTIFY:
293 set_entered_track (0);
294 set_entered_regionview (0);
305 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
309 switch (event->type) {
310 case GDK_BUTTON_PRESS:
311 case GDK_2BUTTON_PRESS:
312 case GDK_3BUTTON_PRESS:
313 clicked_regionview = 0;
314 clicked_control_point = 0;
315 clicked_axisview = tv;
316 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(tv);
317 ret = button_press_handler (item, event, StreamItem);
320 case GDK_BUTTON_RELEASE:
321 ret = button_release_handler (item, event, StreamItem);
324 case GDK_MOTION_NOTIFY:
325 ret = motion_handler (item, event);
328 case GDK_ENTER_NOTIFY:
329 set_entered_track (tv);
332 case GDK_LEAVE_NOTIFY:
333 set_entered_track (0);
344 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
348 switch (event->type) {
349 case GDK_BUTTON_PRESS:
350 case GDK_2BUTTON_PRESS:
351 case GDK_3BUTTON_PRESS:
352 clicked_regionview = 0;
353 clicked_control_point = 0;
354 clicked_axisview = atv;
355 clicked_routeview = 0;
356 ret = button_press_handler (item, event, AutomationTrackItem);
359 case GDK_BUTTON_RELEASE:
360 ret = button_release_handler (item, event, AutomationTrackItem);
363 case GDK_MOTION_NOTIFY:
364 ret = motion_handler (item, event);
367 case GDK_ENTER_NOTIFY:
368 ret = enter_handler (item, event, AutomationTrackItem);
371 case GDK_LEAVE_NOTIFY:
372 ret = leave_handler (item, event, AutomationTrackItem);
383 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
385 /* we handle only button 3 press/release events */
387 if (!rv->sensitive()) {
391 switch (event->type) {
392 case GDK_BUTTON_PRESS:
393 clicked_regionview = rv;
394 clicked_control_point = 0;
395 clicked_axisview = &rv->get_time_axis_view();
396 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
397 if (event->button.button == 3) {
398 return button_press_handler (item, event, FadeInItem);
402 case GDK_BUTTON_RELEASE:
403 if (event->button.button == 3) {
404 return button_release_handler (item, event, FadeInItem);
413 /* proxy for the regionview */
415 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
419 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
423 if (!rv->sensitive()) {
427 switch (event->type) {
428 case GDK_BUTTON_PRESS:
429 case GDK_2BUTTON_PRESS:
430 case GDK_3BUTTON_PRESS:
431 clicked_regionview = rv;
432 clicked_control_point = 0;
433 clicked_axisview = &rv->get_time_axis_view();
434 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
435 ret = button_press_handler (item, event, FadeInHandleItem);
438 case GDK_BUTTON_RELEASE:
439 ret = button_release_handler (item, event, FadeInHandleItem);
442 case GDK_MOTION_NOTIFY:
443 ret = motion_handler (item, event);
446 case GDK_ENTER_NOTIFY:
447 ret = enter_handler (item, event, FadeInHandleItem);
450 case GDK_LEAVE_NOTIFY:
451 ret = leave_handler (item, event, FadeInHandleItem);
462 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
464 /* we handle only button 3 press/release events */
466 if (!rv->sensitive()) {
470 switch (event->type) {
471 case GDK_BUTTON_PRESS:
472 clicked_regionview = rv;
473 clicked_control_point = 0;
474 clicked_axisview = &rv->get_time_axis_view();
475 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
476 if (event->button.button == 3) {
477 return button_press_handler (item, event, FadeOutItem);
481 case GDK_BUTTON_RELEASE:
482 if (event->button.button == 3) {
483 return button_release_handler (item, event, FadeOutItem);
492 /* proxy for the regionview */
494 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
498 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
502 if (!rv->sensitive()) {
506 switch (event->type) {
507 case GDK_BUTTON_PRESS:
508 case GDK_2BUTTON_PRESS:
509 case GDK_3BUTTON_PRESS:
510 clicked_regionview = rv;
511 clicked_control_point = 0;
512 clicked_axisview = &rv->get_time_axis_view();
513 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
514 ret = button_press_handler (item, event, FadeOutHandleItem);
517 case GDK_BUTTON_RELEASE:
518 ret = button_release_handler (item, event, FadeOutHandleItem);
521 case GDK_MOTION_NOTIFY:
522 ret = motion_handler (item, event);
525 case GDK_ENTER_NOTIFY:
526 ret = enter_handler (item, event, FadeOutHandleItem);
529 case GDK_LEAVE_NOTIFY:
530 ret = leave_handler (item, event, FadeOutHandleItem);
540 struct DescendingRegionLayerSorter {
541 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
542 return a->layer() > b->layer();
547 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
549 /* we handle only button 3 press/release events */
551 switch (event->type) {
552 case GDK_BUTTON_PRESS:
553 clicked_crossfadeview = xfv;
554 clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
555 if (event->button.button == 3) {
556 return button_press_handler (item, event, CrossfadeViewItem);
560 case GDK_BUTTON_RELEASE:
561 if (event->button.button == 3) {
562 bool ret = button_release_handler (item, event, CrossfadeViewItem);
572 /* XXX do not forward double clicks */
574 if (event->type == GDK_2BUTTON_PRESS) {
578 /* proxy for an underlying regionview */
580 /* XXX really need to check if we are in the name highlight,
581 and proxy to that when required.
584 TimeAxisView& tv (xfv->get_time_axis_view());
585 AudioTimeAxisView* atv;
587 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
589 if (atv->is_audio_track()) {
591 boost::shared_ptr<AudioPlaylist> pl;
592 if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->get_diskstream()->playlist())) != 0) {
594 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
597 if (atv->layer_display() == Overlaid) {
599 /* we're in overlaid mode; proxy to the uppermost region view */
601 DescendingRegionLayerSorter cmp;
604 RegionView* rv = atv->view()->find_view (rl->front());
609 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
613 /* we're in stacked mode; proxy to the region view under the mouse */
615 /* XXX: FIXME: this is an evil hack; it assumes that any event for which
616 this proxy is being used has its GdkEvent laid out such that the y
617 member is in the same place as that for a GdkEventButton */
619 /* position of the event within the track */
620 double cx = event->button.x;
621 double cy = event->button.y;
622 atv->view()->canvas_item()->w2i (cx, cy);
624 /* hence layer that we're over */
625 double const c = atv->view()->child_height ();
626 layer_t const l = pl->top_layer () + 1 - (cy / c);
629 Playlist::RegionList::iterator i = rl->begin();
630 while (i != rl->end() && (*i)->layer() != l) {
634 if (i != rl->end()) {
635 RegionView* rv = atv->view()->find_view (*i);
639 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
653 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
655 switch (event->type) {
656 case GDK_BUTTON_PRESS:
657 case GDK_2BUTTON_PRESS:
658 case GDK_3BUTTON_PRESS:
659 clicked_control_point = cp;
660 clicked_axisview = &cp->line().trackview;
661 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
662 clicked_regionview = 0;
668 case GDK_SCROLL_DOWN:
675 return typed_event (item, event, ControlPointItem);
679 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
683 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
686 type = AutomationLineItem;
689 return typed_event (item, event, type);
693 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
697 switch (event->type) {
698 case GDK_BUTTON_PRESS:
699 case GDK_2BUTTON_PRESS:
700 case GDK_3BUTTON_PRESS:
701 clicked_selection = rect->id;
702 ret = button_press_handler (item, event, SelectionItem);
704 case GDK_BUTTON_RELEASE:
705 ret = button_release_handler (item, event, SelectionItem);
707 case GDK_MOTION_NOTIFY:
708 ret = motion_handler (item, event);
710 /* Don't need these at the moment. */
711 case GDK_ENTER_NOTIFY:
712 ret = enter_handler (item, event, SelectionItem);
715 case GDK_LEAVE_NOTIFY:
716 ret = leave_handler (item, event, SelectionItem);
727 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
731 switch (event->type) {
732 case GDK_BUTTON_PRESS:
733 case GDK_2BUTTON_PRESS:
734 case GDK_3BUTTON_PRESS:
735 clicked_selection = rect->id;
736 ret = button_press_handler (item, event, StartSelectionTrimItem);
738 case GDK_BUTTON_RELEASE:
739 ret = button_release_handler (item, event, StartSelectionTrimItem);
741 case GDK_MOTION_NOTIFY:
742 ret = motion_handler (item, event);
744 case GDK_ENTER_NOTIFY:
745 ret = enter_handler (item, event, StartSelectionTrimItem);
748 case GDK_LEAVE_NOTIFY:
749 ret = leave_handler (item, event, StartSelectionTrimItem);
760 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
764 switch (event->type) {
765 case GDK_BUTTON_PRESS:
766 case GDK_2BUTTON_PRESS:
767 case GDK_3BUTTON_PRESS:
768 clicked_selection = rect->id;
769 ret = button_press_handler (item, event, EndSelectionTrimItem);
771 case GDK_BUTTON_RELEASE:
772 ret = button_release_handler (item, event, EndSelectionTrimItem);
774 case GDK_MOTION_NOTIFY:
775 ret = motion_handler (item, event);
777 case GDK_ENTER_NOTIFY:
778 ret = enter_handler (item, event, EndSelectionTrimItem);
781 case GDK_LEAVE_NOTIFY:
782 ret = leave_handler (item, event, EndSelectionTrimItem);
793 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
797 /* frame handles are not active when in internal edit mode, because actual notes
798 might be in the area occupied by the handle - we want them to be editable as normal.
801 if (internal_editing() || !rv->sensitive()) {
805 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
806 perspective. XXX change this ??
809 switch (event->type) {
810 case GDK_BUTTON_PRESS:
811 case GDK_2BUTTON_PRESS:
812 case GDK_3BUTTON_PRESS:
813 clicked_regionview = rv;
814 clicked_control_point = 0;
815 clicked_axisview = &clicked_regionview->get_time_axis_view();
816 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
817 ret = button_press_handler (item, event, RegionViewNameHighlight);
819 case GDK_BUTTON_RELEASE:
820 ret = button_release_handler (item, event, RegionViewNameHighlight);
822 case GDK_MOTION_NOTIFY:
823 ret = motion_handler (item, event);
825 case GDK_ENTER_NOTIFY:
826 ret = enter_handler (item, event, RegionViewNameHighlight);
829 case GDK_LEAVE_NOTIFY:
830 ret = leave_handler (item, event, RegionViewNameHighlight);
842 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
846 if (!rv->sensitive()) {
850 switch (event->type) {
851 case GDK_BUTTON_PRESS:
852 case GDK_2BUTTON_PRESS:
853 case GDK_3BUTTON_PRESS:
854 clicked_regionview = rv;
855 clicked_control_point = 0;
856 clicked_axisview = &clicked_regionview->get_time_axis_view();
857 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
858 ret = button_press_handler (item, event, RegionViewNameHighlight);
860 case GDK_BUTTON_RELEASE:
861 ret = button_release_handler (item, event, RegionViewNameHighlight);
863 case GDK_MOTION_NOTIFY:
864 ret = motion_handler (item, event);
866 case GDK_ENTER_NOTIFY:
867 ret = enter_handler (item, event, RegionViewNameHighlight);
870 case GDK_LEAVE_NOTIFY:
871 ret = leave_handler (item, event, RegionViewNameHighlight);
882 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
886 if (!rv->sensitive()) {
890 switch (event->type) {
891 case GDK_BUTTON_PRESS:
892 case GDK_2BUTTON_PRESS:
893 case GDK_3BUTTON_PRESS:
894 clicked_regionview = rv;
895 clicked_control_point = 0;
896 clicked_axisview = &clicked_regionview->get_time_axis_view();
897 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
898 ret = button_press_handler (item, event, RegionViewName);
900 case GDK_BUTTON_RELEASE:
901 ret = button_release_handler (item, event, RegionViewName);
903 case GDK_MOTION_NOTIFY:
904 ret = motion_handler (item, event);
906 case GDK_ENTER_NOTIFY:
907 ret = enter_handler (item, event, RegionViewName);
910 case GDK_LEAVE_NOTIFY:
911 ret = leave_handler (item, event, RegionViewName);
922 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
924 return typed_event (item, event, MarkerItem);
928 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
930 return typed_event (item, event, MarkerBarItem);
934 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
936 return typed_event (item, event, RangeMarkerBarItem);
940 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
942 return typed_event (item, event, TransportMarkerBarItem);
946 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
948 return typed_event (item, event, CdMarkerBarItem);
952 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
954 return typed_event (item, event, TempoMarkerItem);
958 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
960 return typed_event (item, event, MeterMarkerItem);
964 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
966 return typed_event (item, event, TempoBarItem);
970 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
972 return typed_event (item, event, MeterBarItem);
976 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
978 return typed_event (item, event, PlayheadCursorItem);
982 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
984 return typed_event (item, event, NoItem);
988 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
990 if (!internal_editing()) {
994 return typed_event (item, event, NoteItem);
998 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
1002 track_canvas->window_to_world (x, y, wx, wy);
1005 event.type = GDK_MOTION_NOTIFY;
1006 event.button.x = wx;
1007 event.button.y = wy;
1008 /* assume we're dragging with button 1 */
1009 event.motion.state = Gdk::BUTTON1_MASK;
1015 nframes64_t const pos = event_frame (&event, &px, &py);
1017 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1018 if (tv.first == 0) {
1022 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1023 if (rtav == 0 || !rtav->is_track ()) {
1027 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1029 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1031 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1032 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1034 /* audio -> non-audio */
1038 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
1039 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
1041 /* MIDI -> non-MIDI */
1045 _drag = new RegionInsertDrag (this, region_copy, rtav, pos);
1046 _drag->start_grab (&event);
1049 _drag->motion_handler (&event, false);