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 temporal_zoom_step (false);
82 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
83 direction = GDK_SCROLL_LEFT;
85 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
86 if (!current_stepping_trackview) {
87 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
88 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
89 current_stepping_trackview = p.first;
90 if (!current_stepping_trackview) {
94 last_track_height_step_timestamp = get_microseconds();
95 current_stepping_trackview->step_height (true);
98 scroll_tracks_up_line ();
103 case GDK_SCROLL_DOWN:
104 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
105 temporal_zoom_step (true);
107 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
108 direction = GDK_SCROLL_RIGHT;
110 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
111 if (!current_stepping_trackview) {
112 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
113 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
114 current_stepping_trackview = p.first;
115 if (!current_stepping_trackview) {
119 last_track_height_step_timestamp = get_microseconds();
120 current_stepping_trackview->step_height (false);
123 scroll_tracks_down_line ();
128 case GDK_SCROLL_LEFT:
129 xdelta = (current_page_frames() / 8);
130 if (leftmost_frame > xdelta) {
131 reset_x_origin (leftmost_frame - xdelta);
137 case GDK_SCROLL_RIGHT:
138 xdelta = (current_page_frames() / 8);
139 if (max_frames - xdelta > leftmost_frame) {
140 reset_x_origin (leftmost_frame + xdelta);
142 reset_x_origin (max_frames - current_page_frames());
155 Editor::track_canvas_scroll_event (GdkEventScroll *event)
157 track_canvas->grab_focus();
158 track_canvas_scroll (event);
163 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
166 track_canvas->grab_focus();
171 Editor::track_canvas_button_release_event (GdkEventButton *event)
173 if (_drags->active ()) {
174 _drags->end_grab ((GdkEvent*) event);
180 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
183 /* keep those motion events coming */
184 track_canvas->get_pointer (x, y);
189 Editor::track_canvas_motion (GdkEvent *ev)
191 if (verbose_cursor_visible) {
192 verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10);
193 verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10);
200 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
204 switch (event->type) {
205 case GDK_BUTTON_PRESS:
206 case GDK_2BUTTON_PRESS:
207 case GDK_3BUTTON_PRESS:
208 ret = button_press_handler (item, event, type);
210 case GDK_BUTTON_RELEASE:
211 ret = button_release_handler (item, event, type);
213 case GDK_MOTION_NOTIFY:
214 ret = motion_handler (item, event);
217 case GDK_ENTER_NOTIFY:
218 ret = enter_handler (item, event, type);
221 case GDK_LEAVE_NOTIFY:
222 ret = leave_handler (item, event, type);
232 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
236 if (!rv->sensitive ()) {
240 switch (event->type) {
241 case GDK_BUTTON_PRESS:
242 case GDK_2BUTTON_PRESS:
243 case GDK_3BUTTON_PRESS:
244 clicked_regionview = rv;
245 clicked_control_point = 0;
246 clicked_axisview = &rv->get_time_axis_view();
247 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
248 ret = button_press_handler (item, event, RegionItem);
251 case GDK_BUTTON_RELEASE:
252 ret = button_release_handler (item, event, RegionItem);
255 case GDK_MOTION_NOTIFY:
256 ret = motion_handler (item, event);
259 case GDK_ENTER_NOTIFY:
260 set_entered_track (&rv->get_time_axis_view ());
261 set_entered_regionview (rv);
264 case GDK_LEAVE_NOTIFY:
265 set_entered_track (0);
266 set_entered_regionview (0);
277 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
281 switch (event->type) {
282 case GDK_BUTTON_PRESS:
283 case GDK_2BUTTON_PRESS:
284 case GDK_3BUTTON_PRESS:
285 clicked_regionview = 0;
286 clicked_control_point = 0;
287 clicked_axisview = tv;
288 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(tv);
289 ret = button_press_handler (item, event, StreamItem);
292 case GDK_BUTTON_RELEASE:
293 ret = button_release_handler (item, event, StreamItem);
296 case GDK_MOTION_NOTIFY:
297 ret = motion_handler (item, event);
300 case GDK_ENTER_NOTIFY:
301 set_entered_track (tv);
304 case GDK_LEAVE_NOTIFY:
305 set_entered_track (0);
316 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
320 switch (event->type) {
321 case GDK_BUTTON_PRESS:
322 case GDK_2BUTTON_PRESS:
323 case GDK_3BUTTON_PRESS:
324 clicked_regionview = 0;
325 clicked_control_point = 0;
326 clicked_axisview = atv;
327 clicked_routeview = 0;
328 ret = button_press_handler (item, event, AutomationTrackItem);
331 case GDK_BUTTON_RELEASE:
332 ret = button_release_handler (item, event, AutomationTrackItem);
335 case GDK_MOTION_NOTIFY:
336 ret = motion_handler (item, event);
339 case GDK_ENTER_NOTIFY:
340 ret = enter_handler (item, event, AutomationTrackItem);
343 case GDK_LEAVE_NOTIFY:
344 ret = leave_handler (item, event, AutomationTrackItem);
355 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
357 /* we handle only button 3 press/release events */
359 if (!rv->sensitive()) {
363 switch (event->type) {
364 case GDK_BUTTON_PRESS:
365 clicked_regionview = rv;
366 clicked_control_point = 0;
367 clicked_axisview = &rv->get_time_axis_view();
368 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
369 if (event->button.button == 3) {
370 return button_press_handler (item, event, FadeInItem);
374 case GDK_BUTTON_RELEASE:
375 if (event->button.button == 3) {
376 return button_release_handler (item, event, FadeInItem);
385 /* proxy for the regionview */
387 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
391 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
395 if (!rv->sensitive()) {
399 switch (event->type) {
400 case GDK_BUTTON_PRESS:
401 case GDK_2BUTTON_PRESS:
402 case GDK_3BUTTON_PRESS:
403 clicked_regionview = rv;
404 clicked_control_point = 0;
405 clicked_axisview = &rv->get_time_axis_view();
406 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
407 ret = button_press_handler (item, event, FadeInHandleItem);
410 case GDK_BUTTON_RELEASE:
411 ret = button_release_handler (item, event, FadeInHandleItem);
414 case GDK_MOTION_NOTIFY:
415 ret = motion_handler (item, event);
418 case GDK_ENTER_NOTIFY:
419 ret = enter_handler (item, event, FadeInHandleItem);
422 case GDK_LEAVE_NOTIFY:
423 ret = leave_handler (item, event, FadeInHandleItem);
434 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
436 /* we handle only button 3 press/release events */
438 if (!rv->sensitive()) {
442 switch (event->type) {
443 case GDK_BUTTON_PRESS:
444 clicked_regionview = rv;
445 clicked_control_point = 0;
446 clicked_axisview = &rv->get_time_axis_view();
447 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
448 if (event->button.button == 3) {
449 return button_press_handler (item, event, FadeOutItem);
453 case GDK_BUTTON_RELEASE:
454 if (event->button.button == 3) {
455 return button_release_handler (item, event, FadeOutItem);
464 /* proxy for the regionview */
466 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
470 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
474 if (!rv->sensitive()) {
478 switch (event->type) {
479 case GDK_BUTTON_PRESS:
480 case GDK_2BUTTON_PRESS:
481 case GDK_3BUTTON_PRESS:
482 clicked_regionview = rv;
483 clicked_control_point = 0;
484 clicked_axisview = &rv->get_time_axis_view();
485 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
486 ret = button_press_handler (item, event, FadeOutHandleItem);
489 case GDK_BUTTON_RELEASE:
490 ret = button_release_handler (item, event, FadeOutHandleItem);
493 case GDK_MOTION_NOTIFY:
494 ret = motion_handler (item, event);
497 case GDK_ENTER_NOTIFY:
498 ret = enter_handler (item, event, FadeOutHandleItem);
501 case GDK_LEAVE_NOTIFY:
502 ret = leave_handler (item, event, FadeOutHandleItem);
512 struct DescendingRegionLayerSorter {
513 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
514 return a->layer() > b->layer();
519 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
521 /* we handle only button 3 press/release events */
523 switch (event->type) {
524 case GDK_BUTTON_PRESS:
525 clicked_crossfadeview = xfv;
526 clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
527 if (event->button.button == 3) {
528 return button_press_handler (item, event, CrossfadeViewItem);
532 case GDK_BUTTON_RELEASE:
533 if (event->button.button == 3) {
534 bool ret = button_release_handler (item, event, CrossfadeViewItem);
544 /* XXX do not forward double clicks */
546 if (event->type == GDK_2BUTTON_PRESS) {
550 /* proxy for an underlying regionview */
552 /* XXX really need to check if we are in the name highlight,
553 and proxy to that when required.
556 TimeAxisView& tv (xfv->get_time_axis_view());
557 AudioTimeAxisView* atv;
559 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
561 if (atv->is_audio_track()) {
563 boost::shared_ptr<AudioPlaylist> pl;
564 if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->track()->playlist())) != 0) {
566 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
569 if (atv->layer_display() == Overlaid) {
571 /* we're in overlaid mode; proxy to the uppermost region view */
573 DescendingRegionLayerSorter cmp;
576 RegionView* rv = atv->view()->find_view (rl->front());
581 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
585 /* we're in stacked mode; proxy to the region view under the mouse */
587 /* XXX: FIXME: this is an evil hack; it assumes that any event for which
588 this proxy is being used has its GdkEvent laid out such that the y
589 member is in the same place as that for a GdkEventButton */
591 /* position of the event within the track */
592 double cx = event->button.x;
593 double cy = event->button.y;
594 atv->view()->canvas_item()->w2i (cx, cy);
596 /* hence layer that we're over */
597 double const c = atv->view()->child_height ();
598 layer_t const l = pl->top_layer () + 1 - (cy / c);
601 Playlist::RegionList::iterator i = rl->begin();
602 while (i != rl->end() && (*i)->layer() != l) {
606 if (i != rl->end()) {
607 RegionView* rv = atv->view()->find_view (*i);
611 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
625 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
627 switch (event->type) {
628 case GDK_BUTTON_PRESS:
629 case GDK_2BUTTON_PRESS:
630 case GDK_3BUTTON_PRESS:
631 clicked_control_point = cp;
632 clicked_axisview = &cp->line().trackview;
633 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
634 clicked_regionview = 0;
640 case GDK_SCROLL_DOWN:
647 return typed_event (item, event, ControlPointItem);
651 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
655 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
658 type = AutomationLineItem;
661 return typed_event (item, event, type);
665 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
669 switch (event->type) {
670 case GDK_BUTTON_PRESS:
671 case GDK_2BUTTON_PRESS:
672 case GDK_3BUTTON_PRESS:
673 clicked_selection = rect->id;
674 ret = button_press_handler (item, event, SelectionItem);
676 case GDK_BUTTON_RELEASE:
677 ret = button_release_handler (item, event, SelectionItem);
679 case GDK_MOTION_NOTIFY:
680 ret = motion_handler (item, event);
682 /* Don't need these at the moment. */
683 case GDK_ENTER_NOTIFY:
684 ret = enter_handler (item, event, SelectionItem);
687 case GDK_LEAVE_NOTIFY:
688 ret = leave_handler (item, event, SelectionItem);
699 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
703 switch (event->type) {
704 case GDK_BUTTON_PRESS:
705 case GDK_2BUTTON_PRESS:
706 case GDK_3BUTTON_PRESS:
707 clicked_selection = rect->id;
708 ret = button_press_handler (item, event, StartSelectionTrimItem);
710 case GDK_BUTTON_RELEASE:
711 ret = button_release_handler (item, event, StartSelectionTrimItem);
713 case GDK_MOTION_NOTIFY:
714 ret = motion_handler (item, event);
716 case GDK_ENTER_NOTIFY:
717 ret = enter_handler (item, event, StartSelectionTrimItem);
720 case GDK_LEAVE_NOTIFY:
721 ret = leave_handler (item, event, StartSelectionTrimItem);
732 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
736 switch (event->type) {
737 case GDK_BUTTON_PRESS:
738 case GDK_2BUTTON_PRESS:
739 case GDK_3BUTTON_PRESS:
740 clicked_selection = rect->id;
741 ret = button_press_handler (item, event, EndSelectionTrimItem);
743 case GDK_BUTTON_RELEASE:
744 ret = button_release_handler (item, event, EndSelectionTrimItem);
746 case GDK_MOTION_NOTIFY:
747 ret = motion_handler (item, event);
749 case GDK_ENTER_NOTIFY:
750 ret = enter_handler (item, event, EndSelectionTrimItem);
753 case GDK_LEAVE_NOTIFY:
754 ret = leave_handler (item, event, EndSelectionTrimItem);
765 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
769 /* frame handles are not active when in internal edit mode, because actual notes
770 might be in the area occupied by the handle - we want them to be editable as normal.
773 if (internal_editing() || !rv->sensitive()) {
777 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
778 perspective. XXX change this ??
781 switch (event->type) {
782 case GDK_BUTTON_PRESS:
783 case GDK_2BUTTON_PRESS:
784 case GDK_3BUTTON_PRESS:
785 clicked_regionview = rv;
786 clicked_control_point = 0;
787 clicked_axisview = &clicked_regionview->get_time_axis_view();
788 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
789 ret = button_press_handler (item, event, RegionViewNameHighlight);
791 case GDK_BUTTON_RELEASE:
792 ret = button_release_handler (item, event, RegionViewNameHighlight);
794 case GDK_MOTION_NOTIFY:
795 ret = motion_handler (item, event);
797 case GDK_ENTER_NOTIFY:
798 ret = enter_handler (item, event, RegionViewNameHighlight);
801 case GDK_LEAVE_NOTIFY:
802 ret = leave_handler (item, event, RegionViewNameHighlight);
814 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
818 if (!rv->sensitive()) {
822 switch (event->type) {
823 case GDK_BUTTON_PRESS:
824 case GDK_2BUTTON_PRESS:
825 case GDK_3BUTTON_PRESS:
826 clicked_regionview = rv;
827 clicked_control_point = 0;
828 clicked_axisview = &clicked_regionview->get_time_axis_view();
829 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
830 ret = button_press_handler (item, event, RegionViewNameHighlight);
832 case GDK_BUTTON_RELEASE:
833 ret = button_release_handler (item, event, RegionViewNameHighlight);
835 case GDK_MOTION_NOTIFY:
836 ret = motion_handler (item, event);
838 case GDK_ENTER_NOTIFY:
839 ret = enter_handler (item, event, RegionViewNameHighlight);
842 case GDK_LEAVE_NOTIFY:
843 ret = leave_handler (item, event, RegionViewNameHighlight);
854 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
858 if (!rv->sensitive()) {
862 switch (event->type) {
863 case GDK_BUTTON_PRESS:
864 case GDK_2BUTTON_PRESS:
865 case GDK_3BUTTON_PRESS:
866 clicked_regionview = rv;
867 clicked_control_point = 0;
868 clicked_axisview = &clicked_regionview->get_time_axis_view();
869 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
870 ret = button_press_handler (item, event, RegionViewName);
872 case GDK_BUTTON_RELEASE:
873 ret = button_release_handler (item, event, RegionViewName);
875 case GDK_MOTION_NOTIFY:
876 ret = motion_handler (item, event);
878 case GDK_ENTER_NOTIFY:
879 ret = enter_handler (item, event, RegionViewName);
882 case GDK_LEAVE_NOTIFY:
883 ret = leave_handler (item, event, RegionViewName);
894 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
896 return typed_event (item, event, MarkerItem);
900 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
902 return typed_event (item, event, MarkerBarItem);
906 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
908 return typed_event (item, event, RangeMarkerBarItem);
912 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
914 return typed_event (item, event, TransportMarkerBarItem);
918 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
920 return typed_event (item, event, CdMarkerBarItem);
924 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
926 return typed_event (item, event, TempoMarkerItem);
930 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
932 return typed_event (item, event, MeterMarkerItem);
936 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
938 return typed_event (item, event, TempoBarItem);
942 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
944 return typed_event (item, event, MeterBarItem);
948 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
950 return typed_event (item, event, PlayheadCursorItem);
954 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
956 return typed_event (item, event, NoItem);
960 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
962 if (!internal_editing()) {
966 return typed_event (item, event, NoteItem);
970 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
974 track_canvas->window_to_world (x, y, wx, wy);
977 event.type = GDK_MOTION_NOTIFY;
980 /* assume we're dragging with button 1 */
981 event.motion.state = Gdk::BUTTON1_MASK;
983 if (!_drags->active ()) {
987 nframes64_t const pos = event_frame (&event, &px, &py);
989 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
994 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
995 if (rtav == 0 || !rtav->is_track ()) {
999 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1001 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1003 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1004 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1006 /* audio -> non-audio */
1010 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
1011 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
1013 /* MIDI -> non-MIDI */
1017 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1020 _drags->motion_handler (&event, false);