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"
29 #include "ardour/profile.h"
31 #include "canvas/canvas.h"
32 #include "canvas/text.h"
36 #include "public_editor.h"
37 #include "audio_region_view.h"
38 #include "audio_streamview.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 "editor_drag.h"
46 #include "midi_time_axis.h"
47 #include "editor_regions.h"
48 #include "verbose_cursor.h"
53 using namespace ARDOUR;
56 using namespace ArdourCanvas;
58 using Gtkmm2ext::Keyboard;
61 Editor::track_canvas_scroll (GdkEventScroll* ev)
64 int direction = ev->direction;
66 /* this event arrives without transformation by the canvas, so we have
67 * to transform the coordinates to be able to look things up.
70 Duple event_coords = _track_canvas->window_to_canvas (Duple (ev->x, ev->y));
75 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
76 //for mouse-wheel zoom, force zoom-focus to mouse
77 Editing::ZoomFocus temp_focus = zoom_focus;
78 zoom_focus = Editing::ZoomFocusMouse;
79 temporal_zoom_step (false);
80 zoom_focus = temp_focus;
82 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
83 direction = GDK_SCROLL_LEFT;
85 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
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 (event_coords.y);
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 (false);
98 scroll_tracks_up_line ();
103 case GDK_SCROLL_DOWN:
104 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
105 //for mouse-wheel zoom, force zoom-focus to mouse
106 Editing::ZoomFocus temp_focus = zoom_focus;
107 zoom_focus = Editing::ZoomFocusMouse;
108 temporal_zoom_step (true);
109 zoom_focus = temp_focus;
111 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
112 direction = GDK_SCROLL_RIGHT;
114 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
115 if (!current_stepping_trackview) {
116 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
117 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (event_coords.y);
118 current_stepping_trackview = p.first;
119 if (!current_stepping_trackview) {
123 last_track_height_step_timestamp = get_microseconds();
124 current_stepping_trackview->step_height (true);
127 scroll_tracks_down_line ();
132 case GDK_SCROLL_LEFT:
133 xdelta = (current_page_samples() / 8);
134 if (leftmost_frame > xdelta) {
135 reset_x_origin (leftmost_frame - xdelta);
141 case GDK_SCROLL_RIGHT:
142 xdelta = (current_page_samples() / 8);
143 if (max_framepos - xdelta > leftmost_frame) {
144 reset_x_origin (leftmost_frame + xdelta);
146 reset_x_origin (max_framepos - current_page_samples());
159 Editor::track_canvas_scroll_event (GdkEventScroll *event)
161 _track_canvas->grab_focus();
162 return track_canvas_scroll (event);
166 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
169 _track_canvas->grab_focus();
174 Editor::track_canvas_button_release_event (GdkEventButton *event)
176 if (_drags->active ()) {
177 _drags->end_grab ((GdkEvent*) event);
183 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
186 /* keep those motion events coming */
187 _track_canvas->get_pointer (x, y);
192 Editor::track_canvas_motion (GdkEvent *ev)
194 if (_verbose_cursor->visible ()) {
195 _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10);
202 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
206 switch (event->type) {
207 case GDK_BUTTON_PRESS:
208 case GDK_2BUTTON_PRESS:
209 case GDK_3BUTTON_PRESS:
210 ret = button_press_handler (item, event, type);
212 case GDK_BUTTON_RELEASE:
213 ret = button_release_handler (item, event, type);
215 case GDK_MOTION_NOTIFY:
216 ret = motion_handler (item, event);
219 case GDK_ENTER_NOTIFY:
220 ret = enter_handler (item, event, type);
223 case GDK_LEAVE_NOTIFY:
224 ret = leave_handler (item, event, type);
228 ret = key_press_handler (item, event, type);
231 case GDK_KEY_RELEASE:
232 ret = key_release_handler (item, event, type);
242 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
246 if (!rv->sensitive ()) {
250 switch (event->type) {
251 case GDK_BUTTON_PRESS:
252 case GDK_2BUTTON_PRESS:
253 case GDK_3BUTTON_PRESS:
254 clicked_regionview = rv;
255 clicked_control_point = 0;
256 clicked_axisview = &rv->get_time_axis_view();
257 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
258 ret = button_press_handler (item, event, RegionItem);
261 case GDK_BUTTON_RELEASE:
262 ret = button_release_handler (item, event, RegionItem);
265 case GDK_MOTION_NOTIFY:
266 ret = motion_handler (item, event);
269 case GDK_ENTER_NOTIFY:
270 set_entered_track (&rv->get_time_axis_view ());
271 set_entered_regionview (rv);
274 case GDK_LEAVE_NOTIFY:
275 set_entered_track (0);
276 set_entered_regionview (0);
287 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
291 switch (event->type) {
292 case GDK_BUTTON_PRESS:
293 case GDK_2BUTTON_PRESS:
294 case GDK_3BUTTON_PRESS:
295 clicked_regionview = 0;
296 clicked_control_point = 0;
297 clicked_axisview = tv;
298 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
299 ret = button_press_handler (item, event, StreamItem);
302 case GDK_BUTTON_RELEASE:
303 ret = button_release_handler (item, event, StreamItem);
306 case GDK_MOTION_NOTIFY:
307 ret = motion_handler (item, event);
310 case GDK_ENTER_NOTIFY:
311 set_entered_track (tv);
314 case GDK_LEAVE_NOTIFY:
315 set_entered_track (0);
326 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
330 switch (event->type) {
331 case GDK_BUTTON_PRESS:
332 case GDK_2BUTTON_PRESS:
333 case GDK_3BUTTON_PRESS:
334 clicked_regionview = 0;
335 clicked_control_point = 0;
336 clicked_axisview = atv;
337 clicked_routeview = 0;
338 ret = button_press_handler (item, event, AutomationTrackItem);
341 case GDK_BUTTON_RELEASE:
342 ret = button_release_handler (item, event, AutomationTrackItem);
345 case GDK_MOTION_NOTIFY:
346 ret = motion_handler (item, event);
349 case GDK_ENTER_NOTIFY:
350 ret = enter_handler (item, event, AutomationTrackItem);
353 case GDK_LEAVE_NOTIFY:
354 ret = leave_handler (item, event, AutomationTrackItem);
365 Editor::canvas_start_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
367 if (!rv->sensitive()) {
371 switch (event->type) {
372 case GDK_BUTTON_PRESS:
373 clicked_regionview = rv;
374 clicked_control_point = 0;
375 clicked_axisview = &rv->get_time_axis_view();
376 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
377 if (event->button.button == 3) {
378 return button_press_handler (item, event, StartCrossFadeItem);
382 case GDK_BUTTON_RELEASE:
383 if (event->button.button == 3) {
384 return button_release_handler (item, event, StartCrossFadeItem);
393 /* In Mixbus, the crossfade area is used to trim the region while leaving the fade anchor intact (see preserve_fade_anchor)*/
394 /* however in A3 this feature is unfinished, and it might be better to do it with a modifier-trim instead, anyway */
395 /* if we return RegionItem here then we avoid the issue until it is resolved later */
396 return typed_event (item, event, RegionItem); // StartCrossFadeItem);
400 Editor::canvas_end_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
402 if (!rv->sensitive()) {
406 switch (event->type) {
407 case GDK_BUTTON_PRESS:
408 clicked_regionview = rv;
409 clicked_control_point = 0;
410 clicked_axisview = &rv->get_time_axis_view();
411 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
412 if (event->button.button == 3) {
413 return button_press_handler (item, event, EndCrossFadeItem);
417 case GDK_BUTTON_RELEASE:
418 if (event->button.button == 3) {
419 return button_release_handler (item, event, EndCrossFadeItem);
428 /* In Mixbus, the crossfade area is used to trim the region while leaving the fade anchor intact (see preserve_fade_anchor)*/
429 /* however in A3 this feature is unfinished, and it might be better to do it with a modifier-trim instead, anyway */
430 /* if we return RegionItem here then we avoid the issue until it is resolved later */
431 return typed_event (item, event, RegionItem); // EndCrossFadeItem);
435 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
437 /* we handle only button 3 press/release events */
439 if (!rv->sensitive()) {
443 switch (event->type) {
444 case GDK_BUTTON_PRESS:
445 clicked_regionview = rv;
446 clicked_control_point = 0;
447 clicked_axisview = &rv->get_time_axis_view();
448 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
449 if (event->button.button == 3) {
450 return button_press_handler (item, event, FadeInItem);
454 case GDK_BUTTON_RELEASE:
455 if (event->button.button == 3) {
456 return button_release_handler (item, event, FadeInItem);
465 /* proxy for the regionview */
467 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
471 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
475 if (!rv->sensitive()) {
479 switch (event->type) {
480 case GDK_BUTTON_PRESS:
481 case GDK_2BUTTON_PRESS:
482 case GDK_3BUTTON_PRESS:
483 clicked_regionview = rv;
484 clicked_control_point = 0;
485 clicked_axisview = &rv->get_time_axis_view();
486 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
487 ret = button_press_handler (item, event, FadeInHandleItem);
490 case GDK_BUTTON_RELEASE:
491 ret = button_release_handler (item, event, FadeInHandleItem);
492 maybe_locate_with_edit_preroll ( rv->region()->position() );
495 case GDK_MOTION_NOTIFY:
496 ret = motion_handler (item, event);
499 case GDK_ENTER_NOTIFY:
500 set_entered_regionview (rv);
501 ret = enter_handler (item, event, FadeInHandleItem);
504 case GDK_LEAVE_NOTIFY:
505 set_entered_regionview (0);
506 ret = leave_handler (item, event, FadeInHandleItem);
517 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
519 /* we handle only button 3 press/release events */
521 if (!rv->sensitive()) {
525 switch (event->type) {
526 case GDK_BUTTON_PRESS:
527 clicked_regionview = rv;
528 clicked_control_point = 0;
529 clicked_axisview = &rv->get_time_axis_view();
530 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
531 if (event->button.button == 3) {
532 return button_press_handler (item, event, FadeOutItem);
536 case GDK_BUTTON_RELEASE:
537 if (event->button.button == 3) {
538 return button_release_handler (item, event, FadeOutItem);
547 /* proxy for the regionview */
549 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
553 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
557 if (!rv->sensitive()) {
561 switch (event->type) {
562 case GDK_BUTTON_PRESS:
563 case GDK_2BUTTON_PRESS:
564 case GDK_3BUTTON_PRESS:
565 clicked_regionview = rv;
566 clicked_control_point = 0;
567 clicked_axisview = &rv->get_time_axis_view();
568 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
569 ret = button_press_handler (item, event, FadeOutHandleItem);
572 case GDK_BUTTON_RELEASE:
573 ret = button_release_handler (item, event, FadeOutHandleItem);
574 maybe_locate_with_edit_preroll ( rv->region()->last_frame() - rv->get_fade_out_shape_width() );
577 case GDK_MOTION_NOTIFY:
578 ret = motion_handler (item, event);
581 case GDK_ENTER_NOTIFY:
582 set_entered_regionview (rv);
583 ret = enter_handler (item, event, FadeOutHandleItem);
586 case GDK_LEAVE_NOTIFY:
587 set_entered_regionview (0);
588 ret = leave_handler (item, event, FadeOutHandleItem);
598 struct DescendingRegionLayerSorter {
599 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
600 return a->layer() > b->layer();
605 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
607 switch (event->type) {
608 case GDK_BUTTON_PRESS:
609 case GDK_2BUTTON_PRESS:
610 case GDK_3BUTTON_PRESS:
611 clicked_control_point = cp;
612 clicked_axisview = &cp->line().trackview;
613 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
614 clicked_regionview = 0;
620 case GDK_SCROLL_DOWN:
627 return typed_event (item, event, ControlPointItem);
631 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
635 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
638 type = AutomationLineItem;
641 return typed_event (item, event, type);
645 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
649 switch (event->type) {
650 case GDK_BUTTON_PRESS:
651 case GDK_2BUTTON_PRESS:
652 case GDK_3BUTTON_PRESS:
653 clicked_selection = rect->id;
654 ret = button_press_handler (item, event, SelectionItem);
656 case GDK_BUTTON_RELEASE:
657 ret = button_release_handler (item, event, SelectionItem);
659 case GDK_MOTION_NOTIFY:
660 ret = motion_handler (item, event);
662 /* Don't need these at the moment. */
663 case GDK_ENTER_NOTIFY:
664 ret = enter_handler (item, event, SelectionItem);
667 case GDK_LEAVE_NOTIFY:
668 ret = leave_handler (item, event, SelectionItem);
679 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
683 switch (event->type) {
684 case GDK_BUTTON_PRESS:
685 case GDK_2BUTTON_PRESS:
686 case GDK_3BUTTON_PRESS:
687 clicked_selection = rect->id;
688 ret = button_press_handler (item, event, StartSelectionTrimItem);
690 case GDK_BUTTON_RELEASE:
691 ret = button_release_handler (item, event, StartSelectionTrimItem);
693 case GDK_MOTION_NOTIFY:
694 ret = motion_handler (item, event);
696 case GDK_ENTER_NOTIFY:
697 ret = enter_handler (item, event, StartSelectionTrimItem);
700 case GDK_LEAVE_NOTIFY:
701 ret = leave_handler (item, event, StartSelectionTrimItem);
712 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
716 switch (event->type) {
717 case GDK_BUTTON_PRESS:
718 case GDK_2BUTTON_PRESS:
719 case GDK_3BUTTON_PRESS:
720 clicked_selection = rect->id;
721 ret = button_press_handler (item, event, EndSelectionTrimItem);
723 case GDK_BUTTON_RELEASE:
724 ret = button_release_handler (item, event, EndSelectionTrimItem);
726 case GDK_MOTION_NOTIFY:
727 ret = motion_handler (item, event);
729 case GDK_ENTER_NOTIFY:
730 ret = enter_handler (item, event, EndSelectionTrimItem);
733 case GDK_LEAVE_NOTIFY:
734 ret = leave_handler (item, event, EndSelectionTrimItem);
745 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
749 /* frame handles are not active when in internal edit mode, because actual notes
750 might be in the area occupied by the handle - we want them to be editable as normal.
753 if (internal_editing() || !rv->sensitive()) {
757 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
758 perspective. XXX change this ??
763 if (item->get_data ("isleft")) {
764 type = LeftFrameHandle;
766 type = RightFrameHandle;
769 switch (event->type) {
770 case GDK_BUTTON_PRESS:
771 case GDK_2BUTTON_PRESS:
772 case GDK_3BUTTON_PRESS:
773 clicked_regionview = rv;
774 clicked_control_point = 0;
775 clicked_axisview = &clicked_regionview->get_time_axis_view();
776 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
777 ret = button_press_handler (item, event, type);
779 case GDK_BUTTON_RELEASE:
780 ret = button_release_handler (item, event, type);
782 case GDK_MOTION_NOTIFY:
783 ret = motion_handler (item, event);
785 case GDK_ENTER_NOTIFY:
786 set_entered_regionview (rv);
787 ret = enter_handler (item, event, type);
790 case GDK_LEAVE_NOTIFY:
791 set_entered_regionview (0);
792 ret = leave_handler (item, event, type);
804 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
808 if (!rv->sensitive()) {
812 switch (event->type) {
813 case GDK_BUTTON_PRESS:
814 case GDK_2BUTTON_PRESS:
815 case GDK_3BUTTON_PRESS:
816 clicked_regionview = rv;
817 clicked_control_point = 0;
818 clicked_axisview = &clicked_regionview->get_time_axis_view();
819 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
820 ret = button_press_handler (item, event, RegionViewNameHighlight);
822 case GDK_BUTTON_RELEASE:
823 ret = button_release_handler (item, event, RegionViewNameHighlight);
825 case GDK_MOTION_NOTIFY:
826 motion_handler (item, event);
827 ret = true; // force this to avoid progagating the event into the regionview
829 case GDK_ENTER_NOTIFY:
830 set_entered_regionview (rv);
831 ret = enter_handler (item, event, RegionViewNameHighlight);
834 case GDK_LEAVE_NOTIFY:
835 set_entered_regionview (0);
836 ret = leave_handler (item, event, RegionViewNameHighlight);
847 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
851 if (!rv->sensitive()) {
855 switch (event->type) {
856 case GDK_BUTTON_PRESS:
857 case GDK_2BUTTON_PRESS:
858 case GDK_3BUTTON_PRESS:
859 clicked_regionview = rv;
860 clicked_control_point = 0;
861 clicked_axisview = &clicked_regionview->get_time_axis_view();
862 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
863 ret = button_press_handler (item, event, RegionViewName);
865 case GDK_BUTTON_RELEASE:
866 ret = button_release_handler (item, event, RegionViewName);
868 case GDK_MOTION_NOTIFY:
869 ret = motion_handler (item, event);
871 case GDK_ENTER_NOTIFY:
872 set_entered_regionview (rv);
873 ret = enter_handler (item, event, RegionViewName);
876 case GDK_LEAVE_NOTIFY:
877 set_entered_regionview (0);
878 ret = leave_handler (item, event, RegionViewName);
889 Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*)
893 switch (event->type) {
894 case GDK_BUTTON_PRESS:
895 case GDK_2BUTTON_PRESS:
896 case GDK_3BUTTON_PRESS:
897 clicked_regionview = 0;
898 clicked_control_point = 0;
899 clicked_axisview = 0;
900 clicked_routeview = 0; //dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
901 ret = button_press_handler (item, event, FeatureLineItem);
904 case GDK_BUTTON_RELEASE:
905 ret = button_release_handler (item, event, FeatureLineItem);
908 case GDK_MOTION_NOTIFY:
909 ret = motion_handler (item, event);
912 case GDK_ENTER_NOTIFY:
913 ret = enter_handler (item, event, FeatureLineItem);
916 case GDK_LEAVE_NOTIFY:
917 ret = leave_handler (item, event, FeatureLineItem);
928 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
930 return typed_event (item, event, MarkerItem);
934 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
936 return typed_event (item, event, MarkerBarItem);
940 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
942 return typed_event (item, event, RangeMarkerBarItem);
946 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
948 return typed_event (item, event, TransportMarkerBarItem);
952 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
954 return typed_event (item, event, CdMarkerBarItem);
958 Editor::canvas_videotl_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
960 return typed_event (item, event, VideoBarItem);
964 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
966 return typed_event (item, event, TempoMarkerItem);
970 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
972 return typed_event (item, event, MeterMarkerItem);
976 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
978 return typed_event (item, event, TempoBarItem);
982 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
984 return typed_event (item, event, MeterBarItem);
988 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
990 return typed_event (item, event, PlayheadCursorItem);
994 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
996 return typed_event (item, event, NoItem);
1000 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
1002 if (!internal_editing()) {
1006 return typed_event (item, event, NoteItem);
1010 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const& context, int x, int y, guint time)
1012 boost::shared_ptr<Region> region;
1013 boost::shared_ptr<Region> region_copy;
1014 RouteTimeAxisView* rtav;
1019 string target = _track_canvas->drag_dest_find_target (context, _track_canvas->drag_dest_get_target_list());
1021 if (target.empty()) {
1025 event.type = GDK_MOTION_NOTIFY;
1028 /* assume we're dragging with button 1 */
1029 event.motion.state = Gdk::BUTTON1_MASK;
1031 (void) window_event_frame (&event, &px, &py);
1033 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1034 bool can_drop = false;
1036 if (tv.first != 0) {
1038 /* over a time axis view of some kind */
1040 rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1042 if (rtav != 0 && rtav->is_track ()) {
1043 /* over a track, not a bus */
1049 /* not over a time axis view, so drop is possible */
1054 region = _regions->get_dragged_region ();
1058 if ((boost::dynamic_pointer_cast<AudioRegion> (region) != 0 &&
1059 dynamic_cast<AudioTimeAxisView*> (tv.first) != 0) ||
1060 (boost::dynamic_pointer_cast<MidiRegion> (region) != 0 &&
1061 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0)) {
1068 context->drag_status (context->get_suggested_action(), time);
1072 /* DND originating from outside ardour
1074 * TODO: check if file is audio/midi, allow drops on same track-type only,
1075 * currently: if audio is dropped on a midi-track, it is only added to the region-list
1077 if (Profile->get_sae() || Config->get_only_copy_imported_files()) {
1078 context->drag_status(Gdk::ACTION_COPY, time);
1080 if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) {
1081 context->drag_status(Gdk::ACTION_COPY, time);
1083 context->drag_status(Gdk::ACTION_LINK, time);
1091 context->drag_status (Gdk::DragAction (0), time);
1096 Editor::drop_regions (const Glib::RefPtr<Gdk::DragContext>& /*context*/,
1098 const SelectionData& /*data*/,
1099 guint /*info*/, guint /*time*/)
1101 boost::shared_ptr<Region> region;
1102 boost::shared_ptr<Region> region_copy;
1103 RouteTimeAxisView* rtav;
1108 event.type = GDK_MOTION_NOTIFY;
1111 /* assume we're dragging with button 1 */
1112 event.motion.state = Gdk::BUTTON1_MASK;
1114 framepos_t const pos = window_event_frame (&event, &px, &py);
1116 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1118 if (tv.first != 0) {
1120 rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1122 if (rtav != 0 && rtav->is_track ()) {
1124 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1128 region_copy = RegionFactory::create (region, true);
1131 if ((boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1132 dynamic_cast<AudioTimeAxisView*> (tv.first) != 0) ||
1133 (boost::dynamic_pointer_cast<MidiRegion> (region_copy) != 0 &&
1134 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0)) {
1142 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1143 _drags->end_grab (0);
1151 Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType)
1157 Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
1160 bool handled = false;
1163 case TempoMarkerItem:
1164 switch (event->key.keyval) {
1166 remove_tempo_marker (item);
1174 case MeterMarkerItem:
1175 switch (event->key.keyval) {
1177 remove_meter_marker (item);