X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas_events.cc;h=f821220cf38a2229ebef88650891cbc91aa8f6e7;hb=4e1f451520975868659f4c00d00883f5f1cd5805;hp=f09c4d028f2a1da24ace96c1e70b10126c4d5f96;hpb=45addca9eb60a92acda39c8f811d25daa0cfb216;p=ardour.git diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index f09c4d028f..f821220cf3 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -15,98 +15,209 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include #include +#include -#include +#include + +#include #include #include "editor.h" +#include "keyboard.h" #include "public_editor.h" -#include "regionview.h" -#include "streamview.h" +#include "audio_region_view.h" +#include "audio_streamview.h" #include "crossfade_view.h" #include "audio_time_axis.h" #include "region_gain_line.h" -#include "automation_gain_line.h" -#include "automation_pan_line.h" +#include "automation_line.h" #include "automation_time_axis.h" -#include "redirect_automation_line.h" +#include "automation_line.h" +#include "control_point.h" #include "canvas_impl.h" #include "simplerect.h" +#include "canvas-note-event.h" +#include "canvas-program-change.h" #include "i18n.h" using namespace sigc; +using namespace std; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; +using namespace ArdourCanvas; bool Editor::track_canvas_scroll (GdkEventScroll* ev) { - switch (ev->direction) { + int x, y; + double wx, wy; + nframes64_t xdelta; + int direction = ev->direction; + CanvasNoteEvent *midi_event = dynamic_cast(track_canvas->get_item_at(ev->x, ev->y)); + CanvasFlagRect *flag_rect = dynamic_cast(track_canvas->get_item_at(ev->x, ev->y)); + CanvasFlagText *flag_text = dynamic_cast(track_canvas->get_item_at(ev->x, ev->y)); + + retry: + switch (direction) { case GDK_SCROLL_UP: - scroll_tracks_up_line (); - return true; + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { + //if (ev->state == GDK_CONTROL_MASK) { + /* XXX + the ev->x will be out of step with the canvas + if we're in mid zoom, so we have to get the damn mouse + pointer again + */ + track_canvas->get_pointer (x, y); + track_canvas->window_to_world (x, y, wx, wy); + + GdkEvent event; + event.type = GDK_BUTTON_RELEASE; + event.button.x = wx; + event.button.y = wy; + + nframes64_t where = event_frame (&event, 0, 0); + temporal_zoom_to_frame (false, where); + return true; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + direction = GDK_SCROLL_LEFT; + goto retry; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { + if (!current_stepping_trackview) { + step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + if (!(current_stepping_trackview = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize))) { + return false; + } + } + last_track_height_step_timestamp = get_microseconds(); + current_stepping_trackview->step_height (true); + return true; + } else { + if(midi_event) { + return midi_event->on_event(reinterpret_cast(ev)); + } else if (flag_rect) { + return flag_rect->on_event(reinterpret_cast(ev)); + } else if (flag_text) { + return flag_text->on_event(reinterpret_cast(ev)); + } + scroll_tracks_up_line (); + return true; + } break; case GDK_SCROLL_DOWN: - scroll_tracks_down_line (); - return true; - + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { + //if (ev->state == GDK_CONTROL_MASK) { + track_canvas->get_pointer (x, y); + track_canvas->window_to_world (x, y, wx, wy); + + GdkEvent event; + event.type = GDK_BUTTON_RELEASE; + event.button.x = wx; + event.button.y = wy; + + nframes64_t where = event_frame (&event, 0, 0); + temporal_zoom_to_frame (true, where); + return true; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + direction = GDK_SCROLL_RIGHT; + goto retry; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { + if (!current_stepping_trackview) { + step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + if (!(current_stepping_trackview = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize))) { + return false; + } + } + last_track_height_step_timestamp = get_microseconds(); + current_stepping_trackview->step_height (false); + return true; + } else { + if(midi_event) { + return midi_event->on_event(reinterpret_cast(ev)); + } else if (flag_rect) { + return flag_rect->on_event(reinterpret_cast(ev)); + } else if (flag_text) { + return flag_text->on_event(reinterpret_cast(ev)); + } + scroll_tracks_down_line (); + return true; + } + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_frames() / 8); + if (leftmost_frame > xdelta) { + reset_x_origin (leftmost_frame - xdelta); + } else { + reset_x_origin (0); + } + break; + + case GDK_SCROLL_RIGHT: + xdelta = (current_page_frames() / 8); + if (max_frames - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_frames - current_page_frames()); + } + break; + default: - /* no left/right handling yet */ + /* what? */ break; } - + return false; } bool -Editor::track_canvas_event (GdkEvent *event, ArdourCanvas::Item* item) +Editor::track_canvas_scroll_event (GdkEventScroll *event) { - gint x, y; - - /* this is the handler for events that are not handled by - items. - */ - - switch (event->type) { - case GDK_MOTION_NOTIFY: - /* keep those motion events coming */ - track_canvas.get_pointer (x, y); - return track_canvas_motion (event); - - case GDK_BUTTON_RELEASE: - switch (event->button.button) { - case 4: - case 5: - button_release_handler (item, event, NoItem); - break; - } - break; + track_canvas->grab_focus(); + track_canvas_scroll (event); + return false; +} - case GDK_SCROLL: - track_canvas_scroll (&event->scroll); - break; +bool +Editor::track_canvas_button_press_event (GdkEventButton *event) +{ + selection->clear (); + track_canvas->grab_focus(); + return false; +} - default: - break; +bool +Editor::track_canvas_button_release_event (GdkEventButton *event) +{ + if (drag_info.item) { + end_grab (drag_info.item, (GdkEvent*) event); } + return false; +} - return FALSE; +bool +Editor::track_canvas_motion_notify_event (GdkEventMotion *event) +{ + int x, y; + /* keep those motion events coming */ + track_canvas->get_pointer (x, y); + return false; } bool Editor::track_canvas_motion (GdkEvent *ev) { if (verbose_cursor_visible) { - verbose_canvas_cursor->property_x() = ev->motion.x + 20; - verbose_canvas_cursor->property_y() = ev->motion.y + 20; + verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10); + verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10); } + return false; } @@ -139,23 +250,27 @@ Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type) default: break; } - return ret; } bool -Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) +Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv) { - gint ret = FALSE; - + bool ret = false; + + if (!rv->sensitive ()) { + return false; + } + + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &rv->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); ret = button_press_handler (item, event, RegionItem); break; @@ -168,10 +283,12 @@ Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, Aud break; case GDK_ENTER_NOTIFY: + set_entered_track (&rv->get_time_axis_view ()); set_entered_regionview (rv); break; case GDK_LEAVE_NOTIFY: + set_entered_track (0); set_entered_regionview (0); break; @@ -183,7 +300,7 @@ Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, Aud } bool -Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, AudioTimeAxisView *tv) +Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv) { bool ret = FALSE; @@ -193,8 +310,8 @@ Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, Aud case GDK_3BUTTON_PRESS: clicked_regionview = 0; clicked_control_point = 0; - clicked_trackview = tv; - clicked_audio_trackview = tv; + clicked_axisview = tv; + clicked_routeview = dynamic_cast(tv); ret = button_press_handler (item, event, StreamItem); break; @@ -207,6 +324,11 @@ Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, Aud break; case GDK_ENTER_NOTIFY: + set_entered_track (tv); + break; + + case GDK_LEAVE_NOTIFY: + set_entered_track (0); break; default: @@ -216,12 +338,11 @@ Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, Aud return ret; } - - bool Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv) { bool ret = false; + switch (event->type) { case GDK_BUTTON_PRESS: @@ -229,8 +350,8 @@ Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item case GDK_3BUTTON_PRESS: clicked_regionview = 0; clicked_control_point = 0; - clicked_trackview = atv; - clicked_audio_trackview = 0; + clicked_axisview = atv; + clicked_routeview = 0; ret = button_press_handler (item, event, AutomationTrackItem); break; @@ -262,12 +383,16 @@ Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRe { /* we handle only button 3 press/release events */ + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &rv->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); if (event->button.button == 3) { return button_press_handler (item, event, FadeInItem); } @@ -294,14 +419,18 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, { bool ret = false; + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &rv->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); ret = button_press_handler (item, event, FadeInHandleItem); break; @@ -333,12 +462,16 @@ Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioR { /* we handle only button 3 press/release events */ + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &rv->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); if (event->button.button == 3) { return button_press_handler (item, event, FadeOutItem); } @@ -365,14 +498,18 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, { bool ret = false; + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &rv->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); ret = button_press_handler (item, event, FadeOutHandleItem); break; @@ -400,7 +537,7 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, } struct DescendingRegionLayerSorter { - bool operator()(Region* a, Region* b) { + bool operator()(boost::shared_ptr a, boost::shared_ptr b) { return a->layer() > b->layer(); } }; @@ -413,7 +550,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, switch (event->type) { case GDK_BUTTON_PRESS: clicked_crossfadeview = xfv; - clicked_trackview = &clicked_crossfadeview->get_time_axis_view(); + clicked_axisview = &clicked_crossfadeview->get_time_axis_view(); if (event->button.button == 3) { return button_press_handler (item, event, CrossfadeViewItem); } @@ -431,6 +568,11 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, } + /* XXX do not forward double clicks */ + + if (event->type == GDK_2BUTTON_PRESS) { + return false; + } /* proxy for the upper most regionview */ @@ -445,20 +587,25 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, if (atv->is_audio_track()) { - AudioPlaylist* pl = atv->get_diskstream()->playlist(); - Playlist::RegionList* rl = pl->regions_at (event_frame (event)); + boost::shared_ptr pl; + if ((pl = boost::dynamic_pointer_cast (atv->get_diskstream()->playlist())) != 0) { - if (!rl->empty()) { - DescendingRegionLayerSorter cmp; - rl->sort (cmp); + Playlist::RegionList* rl = pl->regions_at (event_frame (event)); - AudioRegionView* arv = atv->view->find_view (*(dynamic_cast (rl->front()))); + if (!rl->empty()) { + DescendingRegionLayerSorter cmp; + rl->sort (cmp); - /* proxy */ - - delete rl; + RegionView* rv = atv->view()->find_view (rl->front()); + + delete rl; + + /* proxy */ + + return canvas_region_view_event (event, rv->get_canvas_group(), rv); + } - return canvas_region_view_event (event, arv->get_canvas_group(), arv); + delete rl; } } } @@ -469,35 +616,27 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, bool Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp) { - ItemType type; - switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: clicked_control_point = cp; - clicked_trackview = &cp->line.trackview; - clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_axisview = &cp->line().trackview; + clicked_routeview = dynamic_cast(clicked_axisview); clicked_regionview = 0; break; - default: + case GDK_SCROLL_UP: break; - } - if (dynamic_cast (&cp->line) != 0) { - type = GainControlPointItem; - } else if (dynamic_cast (&cp->line) != 0) { - type = GainAutomationControlPointItem; - } else if (dynamic_cast (&cp->line) != 0) { - type = PanAutomationControlPointItem; - } else if (dynamic_cast (&cp->line) != 0) { - type = RedirectAutomationControlPointItem; - } else { - return false; + case GDK_SCROLL_DOWN: + break; + + default: + break; } - return typed_event (item, event, type); + return typed_event (item, event, ControlPointItem); } bool @@ -507,14 +646,8 @@ Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, Automation if (dynamic_cast (al) != 0) { type = GainLineItem; - } else if (dynamic_cast (al) != 0) { - type = GainAutomationLineItem; - } else if (dynamic_cast (al) != 0) { - type = PanAutomationLineItem; - } else if (dynamic_cast (al) != 0) { - type = RedirectAutomationLineItem; } else { - return false; + type = AutomationLineItem; } return typed_event (item, event, type); @@ -622,32 +755,36 @@ Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* it bool -Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, AudioRegionView* rv) +Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv) { bool ret = false; + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &clicked_regionview->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); - ret = button_press_handler (item, event, AudioRegionViewNameHighlight); + clicked_axisview = &clicked_regionview->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); + ret = button_press_handler (item, event, RegionViewNameHighlight); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, AudioRegionViewNameHighlight); + ret = button_release_handler (item, event, RegionViewNameHighlight); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event, AudioRegionViewNameHighlight); + ret = motion_handler (item, event, RegionViewNameHighlight); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, AudioRegionViewNameHighlight); + ret = enter_handler (item, event, RegionViewNameHighlight); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, AudioRegionViewNameHighlight); + ret = leave_handler (item, event, RegionViewNameHighlight); break; default: @@ -658,32 +795,36 @@ Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas:: } bool -Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView* rv) +Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv) { bool ret = false; + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: clicked_regionview = rv; clicked_control_point = 0; - clicked_trackview = &clicked_regionview->get_time_axis_view(); - clicked_audio_trackview = dynamic_cast(clicked_trackview); - ret = button_press_handler (item, event, AudioRegionViewName); + clicked_axisview = &clicked_regionview->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); + ret = button_press_handler (item, event, RegionViewName); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, AudioRegionViewName); + ret = button_release_handler (item, event, RegionViewName); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event, AudioRegionViewName); + ret = motion_handler (item, event, RegionViewName); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, AudioRegionViewName); + ret = enter_handler (item, event, RegionViewName); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, AudioRegionViewName); + ret = leave_handler (item, event, RegionViewName); break; default: @@ -717,6 +858,12 @@ Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* return typed_event (item, event, TransportMarkerBarItem); } +bool +Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item) +{ + return typed_event (item, event, CdMarkerBarItem); +} + bool Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* marker) { @@ -747,12 +894,6 @@ Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item) return typed_event (item, event, PlayheadCursorItem); } -bool -Editor::canvas_edit_cursor_event (GdkEvent *event, ArdourCanvas::Item* item) -{ - return typed_event (item, event, EditCursorItem); -} - bool Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item) {