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/midi_region.h"
28 #include "ardour/region_factory.h"
32 #include "public_editor.h"
33 #include "audio_region_view.h"
34 #include "audio_streamview.h"
35 #include "canvas-noevent-text.h"
36 #include "audio_time_axis.h"
37 #include "region_gain_line.h"
38 #include "automation_line.h"
39 #include "automation_time_axis.h"
40 #include "automation_line.h"
41 #include "control_point.h"
42 #include "canvas_impl.h"
43 #include "simplerect.h"
44 #include "editor_drag.h"
45 #include "midi_time_axis.h"
46 #include "editor_regions.h"
47 #include "verbose_cursor.h"
52 using namespace ARDOUR;
55 using namespace ArdourCanvas;
57 using Gtkmm2ext::Keyboard;
60 Editor::track_canvas_scroll (GdkEventScroll* ev)
63 int direction = ev->direction;
68 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
69 temporal_zoom_step (false);
71 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
72 direction = GDK_SCROLL_LEFT;
74 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
75 if (!current_stepping_trackview) {
76 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
77 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
78 current_stepping_trackview = p.first;
79 if (!current_stepping_trackview) {
83 last_track_height_step_timestamp = get_microseconds();
84 current_stepping_trackview->step_height (false);
87 scroll_tracks_up_line ();
93 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
94 temporal_zoom_step (true);
96 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
97 direction = GDK_SCROLL_RIGHT;
99 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
100 if (!current_stepping_trackview) {
101 step_timeout = Glib::signal_timeout().connect (sigc::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_down_line ();
117 case GDK_SCROLL_LEFT:
118 xdelta = (current_page_frames() / 8);
119 if (leftmost_frame > xdelta) {
120 reset_x_origin (leftmost_frame - xdelta);
126 case GDK_SCROLL_RIGHT:
127 xdelta = (current_page_frames() / 8);
128 if (max_framepos - xdelta > leftmost_frame) {
129 reset_x_origin (leftmost_frame + xdelta);
131 reset_x_origin (max_framepos - current_page_frames());
144 Editor::track_canvas_scroll_event (GdkEventScroll *event)
146 track_canvas->grab_focus();
147 return track_canvas_scroll (event);
151 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
154 track_canvas->grab_focus();
159 Editor::track_canvas_button_release_event (GdkEventButton *event)
161 if (_drags->active ()) {
162 _drags->end_grab ((GdkEvent*) event);
168 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
171 /* keep those motion events coming */
172 track_canvas->get_pointer (x, y);
177 Editor::track_canvas_motion (GdkEvent *ev)
179 if (_verbose_cursor->visible ()) {
180 _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10);
187 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
191 switch (event->type) {
192 case GDK_BUTTON_PRESS:
193 case GDK_2BUTTON_PRESS:
194 case GDK_3BUTTON_PRESS:
195 ret = button_press_handler (item, event, type);
197 case GDK_BUTTON_RELEASE:
198 ret = button_release_handler (item, event, type);
200 case GDK_MOTION_NOTIFY:
201 ret = motion_handler (item, event);
204 case GDK_ENTER_NOTIFY:
205 ret = enter_handler (item, event, type);
208 case GDK_LEAVE_NOTIFY:
209 ret = leave_handler (item, event, type);
213 ret = key_press_handler (item, event, type);
216 case GDK_KEY_RELEASE:
217 ret = key_release_handler (item, event, type);
227 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
231 if (!rv->sensitive ()) {
235 switch (event->type) {
236 case GDK_BUTTON_PRESS:
237 case GDK_2BUTTON_PRESS:
238 case GDK_3BUTTON_PRESS:
239 clicked_regionview = rv;
240 clicked_control_point = 0;
241 clicked_axisview = &rv->get_time_axis_view();
242 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
243 ret = button_press_handler (item, event, RegionItem);
246 case GDK_BUTTON_RELEASE:
247 ret = button_release_handler (item, event, RegionItem);
250 case GDK_MOTION_NOTIFY:
251 ret = motion_handler (item, event);
254 case GDK_ENTER_NOTIFY:
255 set_entered_track (&rv->get_time_axis_view ());
256 set_entered_regionview (rv);
259 case GDK_LEAVE_NOTIFY:
260 set_entered_track (0);
261 set_entered_regionview (0);
272 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
276 switch (event->type) {
277 case GDK_BUTTON_PRESS:
278 case GDK_2BUTTON_PRESS:
279 case GDK_3BUTTON_PRESS:
280 clicked_regionview = 0;
281 clicked_control_point = 0;
282 clicked_axisview = tv;
283 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
284 ret = button_press_handler (item, event, StreamItem);
287 case GDK_BUTTON_RELEASE:
288 ret = button_release_handler (item, event, StreamItem);
291 case GDK_MOTION_NOTIFY:
292 ret = motion_handler (item, event);
295 case GDK_ENTER_NOTIFY:
296 set_entered_track (tv);
299 case GDK_LEAVE_NOTIFY:
300 set_entered_track (0);
311 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
315 switch (event->type) {
316 case GDK_BUTTON_PRESS:
317 case GDK_2BUTTON_PRESS:
318 case GDK_3BUTTON_PRESS:
319 clicked_regionview = 0;
320 clicked_control_point = 0;
321 clicked_axisview = atv;
322 clicked_routeview = 0;
323 ret = button_press_handler (item, event, AutomationTrackItem);
326 case GDK_BUTTON_RELEASE:
327 ret = button_release_handler (item, event, AutomationTrackItem);
330 case GDK_MOTION_NOTIFY:
331 ret = motion_handler (item, event);
334 case GDK_ENTER_NOTIFY:
335 ret = enter_handler (item, event, AutomationTrackItem);
338 case GDK_LEAVE_NOTIFY:
339 ret = leave_handler (item, event, AutomationTrackItem);
350 Editor::canvas_start_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
352 if (!rv->sensitive()) {
356 switch (event->type) {
357 case GDK_BUTTON_PRESS:
358 clicked_regionview = rv;
359 clicked_control_point = 0;
360 clicked_axisview = &rv->get_time_axis_view();
361 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
362 if (event->button.button == 3) {
363 return button_press_handler (item, event, StartCrossFadeItem);
367 case GDK_BUTTON_RELEASE:
368 if (event->button.button == 3) {
369 return button_release_handler (item, event, StartCrossFadeItem);
378 return typed_event (item, event, StartCrossFadeItem);
382 Editor::canvas_end_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
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, EndCrossFadeItem);
399 case GDK_BUTTON_RELEASE:
400 if (event->button.button == 3) {
401 return button_release_handler (item, event, EndCrossFadeItem);
410 return typed_event (item, event, EndCrossFadeItem);
414 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
416 /* we handle only button 3 press/release events */
418 if (!rv->sensitive()) {
422 switch (event->type) {
423 case GDK_BUTTON_PRESS:
424 clicked_regionview = rv;
425 clicked_control_point = 0;
426 clicked_axisview = &rv->get_time_axis_view();
427 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
428 if (event->button.button == 3) {
429 return button_press_handler (item, event, FadeInItem);
433 case GDK_BUTTON_RELEASE:
434 if (event->button.button == 3) {
435 return button_release_handler (item, event, FadeInItem);
444 /* proxy for the regionview */
446 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
450 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
454 if (!rv->sensitive()) {
458 switch (event->type) {
459 case GDK_BUTTON_PRESS:
460 case GDK_2BUTTON_PRESS:
461 case GDK_3BUTTON_PRESS:
462 clicked_regionview = rv;
463 clicked_control_point = 0;
464 clicked_axisview = &rv->get_time_axis_view();
465 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
466 ret = button_press_handler (item, event, FadeInHandleItem);
469 case GDK_BUTTON_RELEASE:
470 ret = button_release_handler (item, event, FadeInHandleItem);
473 case GDK_MOTION_NOTIFY:
474 ret = motion_handler (item, event);
477 case GDK_ENTER_NOTIFY:
478 set_entered_regionview (rv);
479 ret = enter_handler (item, event, FadeInHandleItem);
482 case GDK_LEAVE_NOTIFY:
483 set_entered_regionview (0);
484 ret = leave_handler (item, event, FadeInHandleItem);
495 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
497 /* we handle only button 3 press/release events */
499 if (!rv->sensitive()) {
503 switch (event->type) {
504 case GDK_BUTTON_PRESS:
505 clicked_regionview = rv;
506 clicked_control_point = 0;
507 clicked_axisview = &rv->get_time_axis_view();
508 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
509 if (event->button.button == 3) {
510 return button_press_handler (item, event, FadeOutItem);
514 case GDK_BUTTON_RELEASE:
515 if (event->button.button == 3) {
516 return button_release_handler (item, event, FadeOutItem);
525 /* proxy for the regionview */
527 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
531 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
535 if (!rv->sensitive()) {
539 switch (event->type) {
540 case GDK_BUTTON_PRESS:
541 case GDK_2BUTTON_PRESS:
542 case GDK_3BUTTON_PRESS:
543 clicked_regionview = rv;
544 clicked_control_point = 0;
545 clicked_axisview = &rv->get_time_axis_view();
546 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
547 ret = button_press_handler (item, event, FadeOutHandleItem);
550 case GDK_BUTTON_RELEASE:
551 ret = button_release_handler (item, event, FadeOutHandleItem);
554 case GDK_MOTION_NOTIFY:
555 ret = motion_handler (item, event);
558 case GDK_ENTER_NOTIFY:
559 set_entered_regionview (rv);
560 ret = enter_handler (item, event, FadeOutHandleItem);
563 case GDK_LEAVE_NOTIFY:
564 set_entered_regionview (0);
565 ret = leave_handler (item, event, FadeOutHandleItem);
575 struct DescendingRegionLayerSorter {
576 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
577 return a->layer() > b->layer();
582 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
584 switch (event->type) {
585 case GDK_BUTTON_PRESS:
586 case GDK_2BUTTON_PRESS:
587 case GDK_3BUTTON_PRESS:
588 clicked_control_point = cp;
589 clicked_axisview = &cp->line().trackview;
590 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
591 clicked_regionview = 0;
597 case GDK_SCROLL_DOWN:
604 return typed_event (item, event, ControlPointItem);
608 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
612 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
615 type = AutomationLineItem;
618 return typed_event (item, event, type);
622 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
626 switch (event->type) {
627 case GDK_BUTTON_PRESS:
628 case GDK_2BUTTON_PRESS:
629 case GDK_3BUTTON_PRESS:
630 clicked_selection = rect->id;
631 ret = button_press_handler (item, event, SelectionItem);
633 case GDK_BUTTON_RELEASE:
634 ret = button_release_handler (item, event, SelectionItem);
636 case GDK_MOTION_NOTIFY:
637 ret = motion_handler (item, event);
639 /* Don't need these at the moment. */
640 case GDK_ENTER_NOTIFY:
641 ret = enter_handler (item, event, SelectionItem);
644 case GDK_LEAVE_NOTIFY:
645 ret = leave_handler (item, event, SelectionItem);
656 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
660 switch (event->type) {
661 case GDK_BUTTON_PRESS:
662 case GDK_2BUTTON_PRESS:
663 case GDK_3BUTTON_PRESS:
664 clicked_selection = rect->id;
665 ret = button_press_handler (item, event, StartSelectionTrimItem);
667 case GDK_BUTTON_RELEASE:
668 ret = button_release_handler (item, event, StartSelectionTrimItem);
670 case GDK_MOTION_NOTIFY:
671 ret = motion_handler (item, event);
673 case GDK_ENTER_NOTIFY:
674 ret = enter_handler (item, event, StartSelectionTrimItem);
677 case GDK_LEAVE_NOTIFY:
678 ret = leave_handler (item, event, StartSelectionTrimItem);
689 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
693 switch (event->type) {
694 case GDK_BUTTON_PRESS:
695 case GDK_2BUTTON_PRESS:
696 case GDK_3BUTTON_PRESS:
697 clicked_selection = rect->id;
698 ret = button_press_handler (item, event, EndSelectionTrimItem);
700 case GDK_BUTTON_RELEASE:
701 ret = button_release_handler (item, event, EndSelectionTrimItem);
703 case GDK_MOTION_NOTIFY:
704 ret = motion_handler (item, event);
706 case GDK_ENTER_NOTIFY:
707 ret = enter_handler (item, event, EndSelectionTrimItem);
710 case GDK_LEAVE_NOTIFY:
711 ret = leave_handler (item, event, EndSelectionTrimItem);
722 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
726 /* frame handles are not active when in internal edit mode, because actual notes
727 might be in the area occupied by the handle - we want them to be editable as normal.
730 if (internal_editing() || !rv->sensitive()) {
734 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
735 perspective. XXX change this ??
740 if (item->get_data ("isleft")) {
741 type = LeftFrameHandle;
743 type = RightFrameHandle;
746 switch (event->type) {
747 case GDK_BUTTON_PRESS:
748 case GDK_2BUTTON_PRESS:
749 case GDK_3BUTTON_PRESS:
750 clicked_regionview = rv;
751 clicked_control_point = 0;
752 clicked_axisview = &clicked_regionview->get_time_axis_view();
753 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
754 ret = button_press_handler (item, event, type);
756 case GDK_BUTTON_RELEASE:
757 ret = button_release_handler (item, event, type);
759 case GDK_MOTION_NOTIFY:
760 ret = motion_handler (item, event);
762 case GDK_ENTER_NOTIFY:
763 set_entered_regionview (rv);
764 ret = enter_handler (item, event, type);
767 case GDK_LEAVE_NOTIFY:
768 set_entered_regionview (0);
769 ret = leave_handler (item, event, type);
781 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
785 if (!rv->sensitive()) {
789 switch (event->type) {
790 case GDK_BUTTON_PRESS:
791 case GDK_2BUTTON_PRESS:
792 case GDK_3BUTTON_PRESS:
793 clicked_regionview = rv;
794 clicked_control_point = 0;
795 clicked_axisview = &clicked_regionview->get_time_axis_view();
796 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
797 ret = button_press_handler (item, event, RegionViewNameHighlight);
799 case GDK_BUTTON_RELEASE:
800 ret = button_release_handler (item, event, RegionViewNameHighlight);
802 case GDK_MOTION_NOTIFY:
803 motion_handler (item, event);
804 ret = true; // force this to avoid progagating the event into the regionview
806 case GDK_ENTER_NOTIFY:
807 set_entered_regionview (rv);
808 ret = enter_handler (item, event, RegionViewNameHighlight);
811 case GDK_LEAVE_NOTIFY:
812 set_entered_regionview (0);
813 ret = leave_handler (item, event, RegionViewNameHighlight);
824 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
828 if (!rv->sensitive()) {
832 switch (event->type) {
833 case GDK_BUTTON_PRESS:
834 case GDK_2BUTTON_PRESS:
835 case GDK_3BUTTON_PRESS:
836 clicked_regionview = rv;
837 clicked_control_point = 0;
838 clicked_axisview = &clicked_regionview->get_time_axis_view();
839 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
840 ret = button_press_handler (item, event, RegionViewName);
842 case GDK_BUTTON_RELEASE:
843 ret = button_release_handler (item, event, RegionViewName);
845 case GDK_MOTION_NOTIFY:
846 ret = motion_handler (item, event);
848 case GDK_ENTER_NOTIFY:
849 set_entered_regionview (rv);
850 ret = enter_handler (item, event, RegionViewName);
853 case GDK_LEAVE_NOTIFY:
854 set_entered_regionview (0);
855 ret = leave_handler (item, event, RegionViewName);
866 Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*)
870 switch (event->type) {
871 case GDK_BUTTON_PRESS:
872 case GDK_2BUTTON_PRESS:
873 case GDK_3BUTTON_PRESS:
874 clicked_regionview = 0;
875 clicked_control_point = 0;
876 clicked_axisview = 0;
877 clicked_routeview = 0; //dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
878 ret = button_press_handler (item, event, FeatureLineItem);
881 case GDK_BUTTON_RELEASE:
882 ret = button_release_handler (item, event, FeatureLineItem);
885 case GDK_MOTION_NOTIFY:
886 ret = motion_handler (item, event);
889 case GDK_ENTER_NOTIFY:
890 ret = enter_handler (item, event, FeatureLineItem);
893 case GDK_LEAVE_NOTIFY:
894 ret = leave_handler (item, event, FeatureLineItem);
905 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
907 return typed_event (item, event, MarkerItem);
911 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
913 return typed_event (item, event, MarkerBarItem);
917 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
919 return typed_event (item, event, RangeMarkerBarItem);
923 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
925 return typed_event (item, event, TransportMarkerBarItem);
929 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
931 return typed_event (item, event, CdMarkerBarItem);
935 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
937 return typed_event (item, event, TempoMarkerItem);
941 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
943 return typed_event (item, event, MeterMarkerItem);
947 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
949 return typed_event (item, event, TempoBarItem);
953 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
955 return typed_event (item, event, MeterBarItem);
959 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
961 return typed_event (item, event, PlayheadCursorItem);
965 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
967 return typed_event (item, event, NoItem);
971 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
973 if (!internal_editing()) {
977 return typed_event (item, event, NoteItem);
981 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
985 track_canvas->window_to_world (x, y, wx, wy);
988 event.type = GDK_MOTION_NOTIFY;
991 /* assume we're dragging with button 1 */
992 event.motion.state = Gdk::BUTTON1_MASK;
994 if (!_drags->active ()) {
998 framepos_t const pos = event_frame (&event, &px, &py);
1000 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1001 if (tv.first == 0) {
1005 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1006 if (rtav == 0 || !rtav->is_track ()) {
1010 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1016 boost::shared_ptr<Region> region_copy = RegionFactory::create (region, true);
1018 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1019 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1021 /* audio -> non-audio */
1025 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) != 0 &&
1026 dynamic_cast<MidiTimeAxisView*> (tv.first) == 0) {
1028 /* MIDI -> non-MIDI */
1032 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1035 _drags->motion_handler (&event, false);
1041 Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType)
1047 Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
1050 bool handled = false;
1053 case TempoMarkerItem:
1054 switch (event->key.keyval) {
1056 remove_tempo_marker (item);
1064 case MeterMarkerItem:
1065 switch (event->key.keyval) {
1067 remove_meter_marker (item);