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/audioplaylist.h"
28 #include "ardour/audioregion.h"
29 #include "ardour/region_factory.h"
30 #include "ardour/midi_region.h"
34 #include "public_editor.h"
35 #include "audio_region_view.h"
36 #include "audio_streamview.h"
37 #include "canvas-noevent-text.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"
55 using namespace ARDOUR;
58 using namespace ArdourCanvas;
60 using Gtkmm2ext::Keyboard;
63 Editor::track_canvas_scroll (GdkEventScroll* ev)
68 int direction = ev->direction;
70 Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y);
71 InteractiveItem* interactive_item = dynamic_cast<InteractiveItem*>(item);
72 if (interactive_item) {
73 return interactive_item->on_event(reinterpret_cast<GdkEvent*>(ev));
79 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
80 //if (ev->state == GDK_CONTROL_MASK) {
82 the ev->x will be out of step with the canvas
83 if we're in mid zoom, so we have to get the damn mouse
86 track_canvas->get_pointer (x, y);
87 track_canvas->window_to_world (x, y, wx, wy);
90 event.type = GDK_BUTTON_RELEASE;
94 nframes64_t where = event_frame (&event, 0, 0);
95 temporal_zoom_to_frame (false, where);
97 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
98 direction = GDK_SCROLL_LEFT;
100 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
101 if (!current_stepping_trackview) {
102 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
103 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
104 current_stepping_trackview = p.first;
105 if (!current_stepping_trackview) {
109 last_track_height_step_timestamp = get_microseconds();
110 current_stepping_trackview->step_height (true);
113 scroll_tracks_up_line ();
118 case GDK_SCROLL_DOWN:
119 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
120 //if (ev->state == GDK_CONTROL_MASK) {
121 track_canvas->get_pointer (x, y);
122 track_canvas->window_to_world (x, y, wx, wy);
125 event.type = GDK_BUTTON_RELEASE;
129 nframes64_t where = event_frame (&event, 0, 0);
130 temporal_zoom_to_frame (true, where);
132 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
133 direction = GDK_SCROLL_RIGHT;
135 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
136 if (!current_stepping_trackview) {
137 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
138 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
139 current_stepping_trackview = p.first;
140 if (!current_stepping_trackview) {
144 last_track_height_step_timestamp = get_microseconds();
145 current_stepping_trackview->step_height (false);
148 scroll_tracks_down_line ();
153 case GDK_SCROLL_LEFT:
154 xdelta = (current_page_frames() / 8);
155 if (leftmost_frame > xdelta) {
156 reset_x_origin (leftmost_frame - xdelta);
162 case GDK_SCROLL_RIGHT:
163 xdelta = (current_page_frames() / 8);
164 if (max_frames - xdelta > leftmost_frame) {
165 reset_x_origin (leftmost_frame + xdelta);
167 reset_x_origin (max_frames - current_page_frames());
180 Editor::track_canvas_scroll_event (GdkEventScroll *event)
182 track_canvas->grab_focus();
183 track_canvas_scroll (event);
188 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
191 track_canvas->grab_focus();
196 Editor::track_canvas_button_release_event (GdkEventButton *event)
198 if (_drags->active ()) {
199 _drags->end_grab ((GdkEvent*) event);
205 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
208 /* keep those motion events coming */
209 track_canvas->get_pointer (x, y);
214 Editor::track_canvas_motion (GdkEvent *ev)
216 if (verbose_cursor_visible) {
217 verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10);
218 verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10);
225 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
229 switch (event->type) {
230 case GDK_BUTTON_PRESS:
231 case GDK_2BUTTON_PRESS:
232 case GDK_3BUTTON_PRESS:
233 ret = button_press_handler (item, event, type);
235 case GDK_BUTTON_RELEASE:
236 ret = button_release_handler (item, event, type);
238 case GDK_MOTION_NOTIFY:
239 ret = motion_handler (item, event);
242 case GDK_ENTER_NOTIFY:
243 ret = enter_handler (item, event, type);
246 case GDK_LEAVE_NOTIFY:
247 ret = leave_handler (item, event, type);
257 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
261 if (!rv->sensitive ()) {
265 switch (event->type) {
266 case GDK_BUTTON_PRESS:
267 case GDK_2BUTTON_PRESS:
268 case GDK_3BUTTON_PRESS:
269 clicked_regionview = rv;
270 clicked_control_point = 0;
271 clicked_axisview = &rv->get_time_axis_view();
272 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
273 ret = button_press_handler (item, event, RegionItem);
276 case GDK_BUTTON_RELEASE:
277 ret = button_release_handler (item, event, RegionItem);
280 case GDK_MOTION_NOTIFY:
281 ret = motion_handler (item, event);
284 case GDK_ENTER_NOTIFY:
285 set_entered_track (&rv->get_time_axis_view ());
286 set_entered_regionview (rv);
289 case GDK_LEAVE_NOTIFY:
290 set_entered_track (0);
291 set_entered_regionview (0);
302 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
306 switch (event->type) {
307 case GDK_BUTTON_PRESS:
308 case GDK_2BUTTON_PRESS:
309 case GDK_3BUTTON_PRESS:
310 clicked_regionview = 0;
311 clicked_control_point = 0;
312 clicked_axisview = tv;
313 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(tv);
314 ret = button_press_handler (item, event, StreamItem);
317 case GDK_BUTTON_RELEASE:
318 ret = button_release_handler (item, event, StreamItem);
321 case GDK_MOTION_NOTIFY:
322 ret = motion_handler (item, event);
325 case GDK_ENTER_NOTIFY:
326 set_entered_track (tv);
329 case GDK_LEAVE_NOTIFY:
330 set_entered_track (0);
341 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
345 switch (event->type) {
346 case GDK_BUTTON_PRESS:
347 case GDK_2BUTTON_PRESS:
348 case GDK_3BUTTON_PRESS:
349 clicked_regionview = 0;
350 clicked_control_point = 0;
351 clicked_axisview = atv;
352 clicked_routeview = 0;
353 ret = button_press_handler (item, event, AutomationTrackItem);
356 case GDK_BUTTON_RELEASE:
357 ret = button_release_handler (item, event, AutomationTrackItem);
360 case GDK_MOTION_NOTIFY:
361 ret = motion_handler (item, event);
364 case GDK_ENTER_NOTIFY:
365 ret = enter_handler (item, event, AutomationTrackItem);
368 case GDK_LEAVE_NOTIFY:
369 ret = leave_handler (item, event, AutomationTrackItem);
380 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
382 /* we handle only button 3 press/release events */
384 if (!rv->sensitive()) {
388 switch (event->type) {
389 case GDK_BUTTON_PRESS:
390 clicked_regionview = rv;
391 clicked_control_point = 0;
392 clicked_axisview = &rv->get_time_axis_view();
393 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
394 if (event->button.button == 3) {
395 return button_press_handler (item, event, FadeInItem);
399 case GDK_BUTTON_RELEASE:
400 if (event->button.button == 3) {
401 return button_release_handler (item, event, FadeInItem);
410 /* proxy for the regionview */
412 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
416 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
420 if (!rv->sensitive()) {
424 switch (event->type) {
425 case GDK_BUTTON_PRESS:
426 case GDK_2BUTTON_PRESS:
427 case GDK_3BUTTON_PRESS:
428 clicked_regionview = rv;
429 clicked_control_point = 0;
430 clicked_axisview = &rv->get_time_axis_view();
431 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
432 ret = button_press_handler (item, event, FadeInHandleItem);
435 case GDK_BUTTON_RELEASE:
436 ret = button_release_handler (item, event, FadeInHandleItem);
439 case GDK_MOTION_NOTIFY:
440 ret = motion_handler (item, event);
443 case GDK_ENTER_NOTIFY:
444 ret = enter_handler (item, event, FadeInHandleItem);
447 case GDK_LEAVE_NOTIFY:
448 ret = leave_handler (item, event, FadeInHandleItem);
459 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
461 /* we handle only button 3 press/release events */
463 if (!rv->sensitive()) {
467 switch (event->type) {
468 case GDK_BUTTON_PRESS:
469 clicked_regionview = rv;
470 clicked_control_point = 0;
471 clicked_axisview = &rv->get_time_axis_view();
472 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
473 if (event->button.button == 3) {
474 return button_press_handler (item, event, FadeOutItem);
478 case GDK_BUTTON_RELEASE:
479 if (event->button.button == 3) {
480 return button_release_handler (item, event, FadeOutItem);
489 /* proxy for the regionview */
491 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
495 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
499 if (!rv->sensitive()) {
503 switch (event->type) {
504 case GDK_BUTTON_PRESS:
505 case GDK_2BUTTON_PRESS:
506 case GDK_3BUTTON_PRESS:
507 clicked_regionview = rv;
508 clicked_control_point = 0;
509 clicked_axisview = &rv->get_time_axis_view();
510 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
511 ret = button_press_handler (item, event, FadeOutHandleItem);
514 case GDK_BUTTON_RELEASE:
515 ret = button_release_handler (item, event, FadeOutHandleItem);
518 case GDK_MOTION_NOTIFY:
519 ret = motion_handler (item, event);
522 case GDK_ENTER_NOTIFY:
523 ret = enter_handler (item, event, FadeOutHandleItem);
526 case GDK_LEAVE_NOTIFY:
527 ret = leave_handler (item, event, FadeOutHandleItem);
537 struct DescendingRegionLayerSorter {
538 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
539 return a->layer() > b->layer();
544 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
546 /* we handle only button 3 press/release events */
548 switch (event->type) {
549 case GDK_BUTTON_PRESS:
550 clicked_crossfadeview = xfv;
551 clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
552 if (event->button.button == 3) {
553 return button_press_handler (item, event, CrossfadeViewItem);
557 case GDK_BUTTON_RELEASE:
558 if (event->button.button == 3) {
559 bool ret = button_release_handler (item, event, CrossfadeViewItem);
569 /* XXX do not forward double clicks */
571 if (event->type == GDK_2BUTTON_PRESS) {
575 /* proxy for an underlying regionview */
577 /* XXX really need to check if we are in the name highlight,
578 and proxy to that when required.
581 TimeAxisView& tv (xfv->get_time_axis_view());
582 AudioTimeAxisView* atv;
584 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
586 if (atv->is_audio_track()) {
588 boost::shared_ptr<AudioPlaylist> pl;
589 if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->track()->playlist())) != 0) {
591 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
594 if (atv->layer_display() == Overlaid) {
596 /* we're in overlaid mode; proxy to the uppermost region view */
598 DescendingRegionLayerSorter cmp;
601 RegionView* rv = atv->view()->find_view (rl->front());
606 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
610 /* we're in stacked mode; proxy to the region view under the mouse */
612 /* XXX: FIXME: this is an evil hack; it assumes that any event for which
613 this proxy is being used has its GdkEvent laid out such that the y
614 member is in the same place as that for a GdkEventButton */
616 /* position of the event within the track */
617 double cx = event->button.x;
618 double cy = event->button.y;
619 atv->view()->canvas_item()->w2i (cx, cy);
621 /* hence layer that we're over */
622 double const c = atv->view()->child_height ();
623 layer_t const l = pl->top_layer () + 1 - (cy / c);
626 Playlist::RegionList::iterator i = rl->begin();
627 while (i != rl->end() && (*i)->layer() != l) {
631 if (i != rl->end()) {
632 RegionView* rv = atv->view()->find_view (*i);
636 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
650 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
652 switch (event->type) {
653 case GDK_BUTTON_PRESS:
654 case GDK_2BUTTON_PRESS:
655 case GDK_3BUTTON_PRESS:
656 clicked_control_point = cp;
657 clicked_axisview = &cp->line().trackview;
658 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
659 clicked_regionview = 0;
665 case GDK_SCROLL_DOWN:
672 return typed_event (item, event, ControlPointItem);
676 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
680 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
683 type = AutomationLineItem;
686 return typed_event (item, event, type);
690 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
694 switch (event->type) {
695 case GDK_BUTTON_PRESS:
696 case GDK_2BUTTON_PRESS:
697 case GDK_3BUTTON_PRESS:
698 clicked_selection = rect->id;
699 ret = button_press_handler (item, event, SelectionItem);
701 case GDK_BUTTON_RELEASE:
702 ret = button_release_handler (item, event, SelectionItem);
704 case GDK_MOTION_NOTIFY:
705 ret = motion_handler (item, event);
707 /* Don't need these at the moment. */
708 case GDK_ENTER_NOTIFY:
709 ret = enter_handler (item, event, SelectionItem);
712 case GDK_LEAVE_NOTIFY:
713 ret = leave_handler (item, event, SelectionItem);
724 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
728 switch (event->type) {
729 case GDK_BUTTON_PRESS:
730 case GDK_2BUTTON_PRESS:
731 case GDK_3BUTTON_PRESS:
732 clicked_selection = rect->id;
733 ret = button_press_handler (item, event, StartSelectionTrimItem);
735 case GDK_BUTTON_RELEASE:
736 ret = button_release_handler (item, event, StartSelectionTrimItem);
738 case GDK_MOTION_NOTIFY:
739 ret = motion_handler (item, event);
741 case GDK_ENTER_NOTIFY:
742 ret = enter_handler (item, event, StartSelectionTrimItem);
745 case GDK_LEAVE_NOTIFY:
746 ret = leave_handler (item, event, StartSelectionTrimItem);
757 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
761 switch (event->type) {
762 case GDK_BUTTON_PRESS:
763 case GDK_2BUTTON_PRESS:
764 case GDK_3BUTTON_PRESS:
765 clicked_selection = rect->id;
766 ret = button_press_handler (item, event, EndSelectionTrimItem);
768 case GDK_BUTTON_RELEASE:
769 ret = button_release_handler (item, event, EndSelectionTrimItem);
771 case GDK_MOTION_NOTIFY:
772 ret = motion_handler (item, event);
774 case GDK_ENTER_NOTIFY:
775 ret = enter_handler (item, event, EndSelectionTrimItem);
778 case GDK_LEAVE_NOTIFY:
779 ret = leave_handler (item, event, EndSelectionTrimItem);
790 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
794 /* frame handles are not active when in internal edit mode, because actual notes
795 might be in the area occupied by the handle - we want them to be editable as normal.
798 if (internal_editing() || !rv->sensitive()) {
802 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
803 perspective. XXX change this ??
806 switch (event->type) {
807 case GDK_BUTTON_PRESS:
808 case GDK_2BUTTON_PRESS:
809 case GDK_3BUTTON_PRESS:
810 clicked_regionview = rv;
811 clicked_control_point = 0;
812 clicked_axisview = &clicked_regionview->get_time_axis_view();
813 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
814 ret = button_press_handler (item, event, RegionViewNameHighlight);
816 case GDK_BUTTON_RELEASE:
817 ret = button_release_handler (item, event, RegionViewNameHighlight);
819 case GDK_MOTION_NOTIFY:
820 ret = motion_handler (item, event);
822 case GDK_ENTER_NOTIFY:
823 ret = enter_handler (item, event, RegionViewNameHighlight);
826 case GDK_LEAVE_NOTIFY:
827 ret = leave_handler (item, event, RegionViewNameHighlight);
839 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
843 if (!rv->sensitive()) {
847 switch (event->type) {
848 case GDK_BUTTON_PRESS:
849 case GDK_2BUTTON_PRESS:
850 case GDK_3BUTTON_PRESS:
851 clicked_regionview = rv;
852 clicked_control_point = 0;
853 clicked_axisview = &clicked_regionview->get_time_axis_view();
854 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
855 ret = button_press_handler (item, event, RegionViewNameHighlight);
857 case GDK_BUTTON_RELEASE:
858 ret = button_release_handler (item, event, RegionViewNameHighlight);
860 case GDK_MOTION_NOTIFY:
861 ret = motion_handler (item, event);
863 case GDK_ENTER_NOTIFY:
864 ret = enter_handler (item, event, RegionViewNameHighlight);
867 case GDK_LEAVE_NOTIFY:
868 ret = leave_handler (item, event, RegionViewNameHighlight);
879 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
883 if (!rv->sensitive()) {
887 switch (event->type) {
888 case GDK_BUTTON_PRESS:
889 case GDK_2BUTTON_PRESS:
890 case GDK_3BUTTON_PRESS:
891 clicked_regionview = rv;
892 clicked_control_point = 0;
893 clicked_axisview = &clicked_regionview->get_time_axis_view();
894 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
895 ret = button_press_handler (item, event, RegionViewName);
897 case GDK_BUTTON_RELEASE:
898 ret = button_release_handler (item, event, RegionViewName);
900 case GDK_MOTION_NOTIFY:
901 ret = motion_handler (item, event);
903 case GDK_ENTER_NOTIFY:
904 ret = enter_handler (item, event, RegionViewName);
907 case GDK_LEAVE_NOTIFY:
908 ret = leave_handler (item, event, RegionViewName);
919 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
921 return typed_event (item, event, MarkerItem);
925 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
927 return typed_event (item, event, MarkerBarItem);
931 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
933 return typed_event (item, event, RangeMarkerBarItem);
937 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
939 return typed_event (item, event, TransportMarkerBarItem);
943 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
945 return typed_event (item, event, CdMarkerBarItem);
949 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
951 return typed_event (item, event, TempoMarkerItem);
955 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
957 return typed_event (item, event, MeterMarkerItem);
961 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
963 return typed_event (item, event, TempoBarItem);
967 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
969 return typed_event (item, event, MeterBarItem);
973 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
975 return typed_event (item, event, PlayheadCursorItem);
979 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
981 return typed_event (item, event, NoItem);
985 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
987 if (!internal_editing()) {
991 return typed_event (item, event, NoteItem);
995 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
999 track_canvas->window_to_world (x, y, wx, wy);
1002 event.type = GDK_MOTION_NOTIFY;
1003 event.button.x = wx;
1004 event.button.y = wy;
1005 /* assume we're dragging with button 1 */
1006 event.motion.state = Gdk::BUTTON1_MASK;
1008 if (!_drags->active ()) {
1012 nframes64_t const pos = event_frame (&event, &px, &py);
1014 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1015 if (tv.first == 0) {
1019 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1020 if (rtav == 0 || !rtav->is_track ()) {
1024 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1026 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1028 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1029 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1031 /* audio -> non-audio */
1035 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
1036 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
1038 /* MIDI -> non-MIDI */
1042 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1045 _drags->motion_handler (&event, false);