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.
24 #include <ardour/diskstream.h>
25 #include <ardour/audioplaylist.h>
28 #include "public_editor.h"
29 #include "regionview.h"
30 #include "streamview.h"
31 #include "crossfade_view.h"
32 #include "audio_time_axis.h"
33 #include "region_gain_line.h"
34 #include "automation_gain_line.h"
35 #include "automation_pan_line.h"
36 #include "automation_time_axis.h"
37 #include "redirect_automation_line.h"
38 #include "canvas_impl.h"
39 #include "simplerect.h"
44 using namespace ARDOUR;
48 Editor::track_canvas_scroll (GdkEventScroll* ev)
53 switch (ev->direction) {
55 if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
56 //if (ev->state == GDK_CONTROL_MASK) {
58 the ev->x will be out of step with the canvas
59 if we're in mid zoom, so we have to get the damn mouse
62 track_canvas.get_pointer (x, y);
63 track_canvas.window_to_world (x, y, wx, wy);
64 wx += horizontal_adjustment.get_value();
65 wy += vertical_adjustment.get_value();
68 event.type = GDK_BUTTON_RELEASE;
72 jack_nframes_t where = event_frame (&event, 0, 0);
73 temporal_zoom_to_frame (true, where);
76 scroll_tracks_up_line ();
81 if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
82 //if (ev->state == GDK_CONTROL_MASK) {
83 track_canvas.get_pointer (x, y);
84 track_canvas.window_to_world (x, y, wx, wy);
85 wx += horizontal_adjustment.get_value();
86 wy += vertical_adjustment.get_value();
89 event.type = GDK_BUTTON_RELEASE;
93 jack_nframes_t where = event_frame (&event, 0, 0);
94 temporal_zoom_to_frame (false, where);
96 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
97 if (clicked_trackview) {
98 if (!current_stepping_trackview) {
99 step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500);
100 current_stepping_trackview = clicked_trackview;
102 gettimeofday (&last_track_height_step_timestamp, 0);
103 current_stepping_trackview->step_height (true);
107 scroll_tracks_down_line ();
112 /* no left/right handling yet */
120 Editor::track_canvas_event (GdkEvent *event, ArdourCanvas::Item* item)
124 /* this is the handler for events that are not handled by
128 switch (event->type) {
129 case GDK_MOTION_NOTIFY:
130 /* keep those motion events coming */
131 track_canvas.get_pointer (x, y);
132 return track_canvas_motion (event);
134 case GDK_BUTTON_PRESS:
135 track_canvas.grab_focus();
138 case GDK_BUTTON_RELEASE:
139 switch (event->button.button) {
142 button_release_handler (item, event, NoItem);
148 track_canvas.grab_focus();
149 track_canvas_scroll (&event->scroll);
160 Editor::track_canvas_motion (GdkEvent *ev)
162 if (verbose_cursor_visible) {
163 verbose_canvas_cursor->property_x() = ev->motion.x + 20;
164 verbose_canvas_cursor->property_y() = ev->motion.y + 20;
170 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
174 switch (event->type) {
175 case GDK_BUTTON_PRESS:
176 case GDK_2BUTTON_PRESS:
177 case GDK_3BUTTON_PRESS:
178 ret = button_press_handler (item, event, type);
180 case GDK_BUTTON_RELEASE:
181 ret = button_release_handler (item, event, type);
183 case GDK_MOTION_NOTIFY:
184 ret = motion_handler (item, event, type);
187 case GDK_ENTER_NOTIFY:
188 ret = enter_handler (item, event, type);
191 case GDK_LEAVE_NOTIFY:
192 ret = leave_handler (item, event, type);
203 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
207 switch (event->type) {
208 case GDK_BUTTON_PRESS:
209 case GDK_2BUTTON_PRESS:
210 case GDK_3BUTTON_PRESS:
211 clicked_regionview = rv;
212 clicked_control_point = 0;
213 clicked_trackview = &rv->get_time_axis_view();
214 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
215 ret = button_press_handler (item, event, RegionItem);
218 case GDK_BUTTON_RELEASE:
219 ret = button_release_handler (item, event, RegionItem);
222 case GDK_MOTION_NOTIFY:
223 ret = motion_handler (item, event, RegionItem);
226 case GDK_ENTER_NOTIFY:
227 set_entered_regionview (rv);
230 case GDK_LEAVE_NOTIFY:
231 set_entered_regionview (0);
242 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, AudioTimeAxisView *tv)
246 switch (event->type) {
247 case GDK_BUTTON_PRESS:
248 case GDK_2BUTTON_PRESS:
249 case GDK_3BUTTON_PRESS:
250 clicked_regionview = 0;
251 clicked_control_point = 0;
252 clicked_trackview = tv;
253 clicked_audio_trackview = tv;
254 ret = button_press_handler (item, event, StreamItem);
257 case GDK_BUTTON_RELEASE:
258 ret = button_release_handler (item, event, StreamItem);
261 case GDK_MOTION_NOTIFY:
262 ret = motion_handler (item, event, StreamItem);
265 case GDK_ENTER_NOTIFY:
278 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
282 switch (event->type) {
283 case GDK_BUTTON_PRESS:
284 case GDK_2BUTTON_PRESS:
285 case GDK_3BUTTON_PRESS:
286 clicked_regionview = 0;
287 clicked_control_point = 0;
288 clicked_trackview = atv;
289 clicked_audio_trackview = 0;
290 ret = button_press_handler (item, event, AutomationTrackItem);
293 case GDK_BUTTON_RELEASE:
294 ret = button_release_handler (item, event, AutomationTrackItem);
297 case GDK_MOTION_NOTIFY:
298 ret = motion_handler (item, event, AutomationTrackItem);
301 case GDK_ENTER_NOTIFY:
302 ret = enter_handler (item, event, AutomationTrackItem);
305 case GDK_LEAVE_NOTIFY:
306 ret = leave_handler (item, event, AutomationTrackItem);
317 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
319 /* we handle only button 3 press/release events */
321 switch (event->type) {
322 case GDK_BUTTON_PRESS:
323 clicked_regionview = rv;
324 clicked_control_point = 0;
325 clicked_trackview = &rv->get_time_axis_view();
326 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
327 if (event->button.button == 3) {
328 return button_press_handler (item, event, FadeInItem);
332 case GDK_BUTTON_RELEASE:
333 if (event->button.button == 3) {
334 return button_release_handler (item, event, FadeInItem);
343 /* proxy for the regionview */
345 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
349 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
353 switch (event->type) {
354 case GDK_BUTTON_PRESS:
355 case GDK_2BUTTON_PRESS:
356 case GDK_3BUTTON_PRESS:
357 clicked_regionview = rv;
358 clicked_control_point = 0;
359 clicked_trackview = &rv->get_time_axis_view();
360 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
361 ret = button_press_handler (item, event, FadeInHandleItem);
364 case GDK_BUTTON_RELEASE:
365 ret = button_release_handler (item, event, FadeInHandleItem);
368 case GDK_MOTION_NOTIFY:
369 ret = motion_handler (item, event, FadeInHandleItem);
372 case GDK_ENTER_NOTIFY:
373 ret = enter_handler (item, event, FadeInHandleItem);
376 case GDK_LEAVE_NOTIFY:
377 ret = leave_handler (item, event, FadeInHandleItem);
388 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
390 /* we handle only button 3 press/release events */
392 switch (event->type) {
393 case GDK_BUTTON_PRESS:
394 clicked_regionview = rv;
395 clicked_control_point = 0;
396 clicked_trackview = &rv->get_time_axis_view();
397 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
398 if (event->button.button == 3) {
399 return button_press_handler (item, event, FadeOutItem);
403 case GDK_BUTTON_RELEASE:
404 if (event->button.button == 3) {
405 return button_release_handler (item, event, FadeOutItem);
414 /* proxy for the regionview */
416 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
420 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
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_trackview = &rv->get_time_axis_view();
431 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
432 ret = button_press_handler (item, event, FadeOutHandleItem);
435 case GDK_BUTTON_RELEASE:
436 ret = button_release_handler (item, event, FadeOutHandleItem);
439 case GDK_MOTION_NOTIFY:
440 ret = motion_handler (item, event, FadeOutHandleItem);
443 case GDK_ENTER_NOTIFY:
444 ret = enter_handler (item, event, FadeOutHandleItem);
447 case GDK_LEAVE_NOTIFY:
448 ret = leave_handler (item, event, FadeOutHandleItem);
458 struct DescendingRegionLayerSorter {
459 bool operator()(Region* a, Region* b) {
460 return a->layer() > b->layer();
465 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
467 /* we handle only button 3 press/release events */
469 switch (event->type) {
470 case GDK_BUTTON_PRESS:
471 clicked_crossfadeview = xfv;
472 clicked_trackview = &clicked_crossfadeview->get_time_axis_view();
473 if (event->button.button == 3) {
474 return button_press_handler (item, event, CrossfadeViewItem);
478 case GDK_BUTTON_RELEASE:
479 if (event->button.button == 3) {
480 bool ret = button_release_handler (item, event, CrossfadeViewItem);
491 /* proxy for the upper most regionview */
493 /* XXX really need to check if we are in the name highlight,
494 and proxy to that when required.
497 TimeAxisView& tv (xfv->get_time_axis_view());
498 AudioTimeAxisView* atv;
500 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
502 if (atv->is_audio_track()) {
504 AudioPlaylist* pl = atv->get_diskstream()->playlist();
505 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
508 DescendingRegionLayerSorter cmp;
511 AudioRegionView* arv = atv->view->find_view (*(dynamic_cast<AudioRegion*> (rl->front())));
517 return canvas_region_view_event (event, arv->get_canvas_group(), arv);
526 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
530 switch (event->type) {
531 case GDK_BUTTON_PRESS:
532 case GDK_2BUTTON_PRESS:
533 case GDK_3BUTTON_PRESS:
534 clicked_control_point = cp;
535 clicked_trackview = &cp->line.trackview;
536 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
537 clicked_regionview = 0;
544 if (dynamic_cast<AudioRegionGainLine*> (&cp->line) != 0) {
545 type = GainControlPointItem;
546 } else if (dynamic_cast<AutomationGainLine*> (&cp->line) != 0) {
547 type = GainAutomationControlPointItem;
548 } else if (dynamic_cast<AutomationPanLine*> (&cp->line) != 0) {
549 type = PanAutomationControlPointItem;
550 } else if (dynamic_cast<RedirectAutomationLine*> (&cp->line) != 0) {
551 type = RedirectAutomationControlPointItem;
556 return typed_event (item, event, type);
560 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
564 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
566 } else if (dynamic_cast<AutomationGainLine*> (al) != 0) {
567 type = GainAutomationLineItem;
568 } else if (dynamic_cast<AutomationPanLine*> (al) != 0) {
569 type = PanAutomationLineItem;
570 } else if (dynamic_cast<RedirectAutomationLine*> (al) != 0) {
571 type = RedirectAutomationLineItem;
576 return typed_event (item, event, type);
580 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
584 switch (event->type) {
585 case GDK_BUTTON_PRESS:
586 case GDK_2BUTTON_PRESS:
587 case GDK_3BUTTON_PRESS:
588 clicked_selection = rect->id;
589 ret = button_press_handler (item, event, SelectionItem);
591 case GDK_BUTTON_RELEASE:
592 ret = button_release_handler (item, event, SelectionItem);
594 case GDK_MOTION_NOTIFY:
595 ret = motion_handler (item, event, SelectionItem);
597 /* Don't need these at the moment. */
598 case GDK_ENTER_NOTIFY:
599 ret = enter_handler (item, event, SelectionItem);
602 case GDK_LEAVE_NOTIFY:
603 ret = leave_handler (item, event, SelectionItem);
614 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
618 switch (event->type) {
619 case GDK_BUTTON_PRESS:
620 case GDK_2BUTTON_PRESS:
621 case GDK_3BUTTON_PRESS:
622 clicked_selection = rect->id;
623 ret = button_press_handler (item, event, StartSelectionTrimItem);
625 case GDK_BUTTON_RELEASE:
626 ret = button_release_handler (item, event, StartSelectionTrimItem);
628 case GDK_MOTION_NOTIFY:
629 ret = motion_handler (item, event, StartSelectionTrimItem);
631 case GDK_ENTER_NOTIFY:
632 ret = enter_handler (item, event, StartSelectionTrimItem);
635 case GDK_LEAVE_NOTIFY:
636 ret = leave_handler (item, event, StartSelectionTrimItem);
647 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
651 switch (event->type) {
652 case GDK_BUTTON_PRESS:
653 case GDK_2BUTTON_PRESS:
654 case GDK_3BUTTON_PRESS:
655 clicked_selection = rect->id;
656 ret = button_press_handler (item, event, EndSelectionTrimItem);
658 case GDK_BUTTON_RELEASE:
659 ret = button_release_handler (item, event, EndSelectionTrimItem);
661 case GDK_MOTION_NOTIFY:
662 ret = motion_handler (item, event, EndSelectionTrimItem);
664 case GDK_ENTER_NOTIFY:
665 ret = enter_handler (item, event, EndSelectionTrimItem);
668 case GDK_LEAVE_NOTIFY:
669 ret = leave_handler (item, event, EndSelectionTrimItem);
681 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, AudioRegionView* rv)
685 switch (event->type) {
686 case GDK_BUTTON_PRESS:
687 case GDK_2BUTTON_PRESS:
688 case GDK_3BUTTON_PRESS:
689 clicked_regionview = rv;
690 clicked_control_point = 0;
691 clicked_trackview = &clicked_regionview->get_time_axis_view();
692 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
693 ret = button_press_handler (item, event, AudioRegionViewNameHighlight);
695 case GDK_BUTTON_RELEASE:
696 ret = button_release_handler (item, event, AudioRegionViewNameHighlight);
698 case GDK_MOTION_NOTIFY:
699 ret = motion_handler (item, event, AudioRegionViewNameHighlight);
701 case GDK_ENTER_NOTIFY:
702 ret = enter_handler (item, event, AudioRegionViewNameHighlight);
705 case GDK_LEAVE_NOTIFY:
706 ret = leave_handler (item, event, AudioRegionViewNameHighlight);
717 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView* rv)
721 switch (event->type) {
722 case GDK_BUTTON_PRESS:
723 case GDK_2BUTTON_PRESS:
724 case GDK_3BUTTON_PRESS:
725 clicked_regionview = rv;
726 clicked_control_point = 0;
727 clicked_trackview = &clicked_regionview->get_time_axis_view();
728 clicked_audio_trackview = dynamic_cast<AudioTimeAxisView*>(clicked_trackview);
729 ret = button_press_handler (item, event, AudioRegionViewName);
731 case GDK_BUTTON_RELEASE:
732 ret = button_release_handler (item, event, AudioRegionViewName);
734 case GDK_MOTION_NOTIFY:
735 ret = motion_handler (item, event, AudioRegionViewName);
737 case GDK_ENTER_NOTIFY:
738 ret = enter_handler (item, event, AudioRegionViewName);
741 case GDK_LEAVE_NOTIFY:
742 ret = leave_handler (item, event, AudioRegionViewName);
753 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* marker)
755 return typed_event (item, event, MarkerItem);
759 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
761 return typed_event (item, event, MarkerBarItem);
765 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
767 return typed_event (item, event, RangeMarkerBarItem);
771 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
773 return typed_event (item, event, TransportMarkerBarItem);
777 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* marker)
779 return typed_event (item, event, TempoMarkerItem);
783 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* marker)
785 return typed_event (item, event, MeterMarkerItem);
789 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
791 return typed_event (item, event, TempoBarItem);
795 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
797 return typed_event (item, event, MeterBarItem);
801 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
803 return typed_event (item, event, PlayheadCursorItem);
807 Editor::canvas_edit_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
809 return typed_event (item, event, EditCursorItem);
813 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
815 return typed_event (item, event, NoItem);