X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas_events.cc;h=71f5a9fb219f718bb4f315c1b9c7b81907c9bfdd;hb=b08d13706f9e98fc75a727822209942c00d8f1b3;hp=8d3d4cf55a11489f78241731a454ef1fefbfdf38;hpb=8932625869f181bc16833c9e9d253970656c180d;p=ardour.git diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 8d3d4cf55a..71f5a9fb21 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -47,6 +47,7 @@ #include "editor_drag.h" #include "midi_time_axis.h" #include "editor_regions.h" +#include "verbose_cursor.h" #include "i18n.h" @@ -61,7 +62,7 @@ using Gtkmm2ext::Keyboard; bool Editor::track_canvas_scroll (GdkEventScroll* ev) { - nframes64_t xdelta; + framepos_t xdelta; int direction = ev->direction; retry: @@ -83,7 +84,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) } } last_track_height_step_timestamp = get_microseconds(); - current_stepping_trackview->step_height (true); + current_stepping_trackview->step_height (false); return true; } else { scroll_tracks_up_line (); @@ -108,7 +109,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) } } last_track_height_step_timestamp = get_microseconds(); - current_stepping_trackview->step_height (false); + current_stepping_trackview->step_height (true); return true; } else { scroll_tracks_down_line (); @@ -127,10 +128,10 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) case GDK_SCROLL_RIGHT: xdelta = (current_page_frames() / 8); - if (max_frames - xdelta > leftmost_frame) { + if (max_framepos - xdelta > leftmost_frame) { reset_x_origin (leftmost_frame + xdelta); } else { - reset_x_origin (max_frames - current_page_frames()); + reset_x_origin (max_framepos - current_page_frames()); } break; @@ -178,9 +179,8 @@ Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/) bool Editor::track_canvas_motion (GdkEvent *ev) { - if (verbose_cursor_visible) { - 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); + if (_verbose_cursor->visible ()) { + _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10); } return false; @@ -212,6 +212,14 @@ Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type) ret = leave_handler (item, event, type); break; + case GDK_KEY_PRESS: + ret = key_press_handler (item, event, type); + break; + + case GDK_KEY_RELEASE: + ret = key_release_handler (item, event, type); + break; + default: break; } @@ -275,7 +283,7 @@ Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, Rou clicked_regionview = 0; clicked_control_point = 0; clicked_axisview = tv; - clicked_routeview = dynamic_cast(tv); + clicked_routeview = dynamic_cast(clicked_axisview); ret = button_press_handler (item, event, StreamItem); break; @@ -406,10 +414,12 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, FadeInHandleItem); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, FadeInHandleItem); break; @@ -485,10 +495,12 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, FadeOutHandleItem); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, FadeOutHandleItem); break; @@ -514,6 +526,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, case GDK_BUTTON_PRESS: clicked_crossfadeview = xfv; clicked_axisview = &clicked_crossfadeview->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); if (event->button.button == 3) { return button_press_handler (item, event, CrossfadeViewItem); } @@ -541,6 +554,8 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, /* XXX really need to check if we are in the name highlight, and proxy to that when required. + + XXX or in the trim rectangles */ TimeAxisView& tv (xfv->get_time_axis_view()); @@ -553,7 +568,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, boost::shared_ptr pl; if ((pl = boost::dynamic_pointer_cast (atv->track()->playlist())) != 0) { - Playlist::RegionList* rl = pl->regions_at (event_frame (event)); + boost::shared_ptr rl = pl->regions_at (event_frame (event)); if (!rl->empty()) { if (atv->layer_display() == Overlaid) { @@ -565,8 +580,6 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv = atv->view()->find_view (rl->front()); - delete rl; - /* proxy */ return canvas_region_view_event (event, rv->get_canvas_group(), rv); @@ -574,13 +587,30 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, /* we're in stacked mode; proxy to the region view under the mouse */ - /* XXX: FIXME: this is an evil hack; it assumes that any event for which - this proxy is being used has its GdkEvent laid out such that the y - member is in the same place as that for a GdkEventButton */ + double cx = 0; + double cy = 0; + switch (event->type) { + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + cx = event->button.x; + cy = event->button.y; + break; + case GDK_MOTION_NOTIFY: + cx = event->motion.x; + cy = event->motion.y; + break; + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: + cx = event->crossing.x; + cy = event->crossing.y; + break; + default: + /* XXX: this may be wrong for some events */ + cx = event->button.x; + cy = event->button.y; + } /* position of the event within the track */ - double cx = event->button.x; - double cy = event->button.y; atv->view()->canvas_item()->w2i (cx, cy); /* hence layer that we're over */ @@ -588,22 +618,19 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, layer_t const l = pl->top_layer () + 1 - (cy / c); /* hence region */ - Playlist::RegionList::iterator i = rl->begin(); + RegionList::iterator i = rl->begin(); while (i != rl->end() && (*i)->layer() != l) { ++i; } if (i != rl->end()) { RegionView* rv = atv->view()->find_view (*i); - delete rl; /* proxy */ return canvas_region_view_event (event, rv->get_canvas_group(), rv); } } } - - delete rl; } } } @@ -768,6 +795,14 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re perspective. XXX change this ?? */ + ItemType type; + + if (item->get_data ("isleft")) { + type = LeftFrameHandle; + } else { + type = RightFrameHandle; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -776,20 +811,22 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re clicked_control_point = 0; clicked_axisview = &clicked_regionview->get_time_axis_view(); clicked_routeview = dynamic_cast(clicked_axisview); - ret = button_press_handler (item, event, RegionViewNameHighlight); + ret = button_press_handler (item, event, type); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, RegionViewNameHighlight); + ret = button_release_handler (item, event, type); break; case GDK_MOTION_NOTIFY: ret = motion_handler (item, event); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, RegionViewNameHighlight); + set_entered_regionview (rv); + ret = enter_handler (item, event, type); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, RegionViewNameHighlight); + set_entered_regionview (0); + ret = leave_handler (item, event, type); break; default: @@ -823,13 +860,16 @@ Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas:: ret = button_release_handler (item, event, RegionViewNameHighlight); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event); + motion_handler (item, event); + ret = true; // force this to avoid progagating the event into the regionview break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, RegionViewNameHighlight); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, RegionViewNameHighlight); break; @@ -866,10 +906,12 @@ Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item ret = motion_handler (item, event); break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, RegionViewName); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, RegionViewName); break; @@ -880,6 +922,45 @@ Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item return ret; } +bool +Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*) +{ + bool ret = false; + + switch (event->type) { + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + clicked_regionview = 0; + clicked_control_point = 0; + clicked_axisview = 0; + clicked_routeview = 0; //dynamic_cast(clicked_axisview); + ret = button_press_handler (item, event, FeatureLineItem); + break; + + case GDK_BUTTON_RELEASE: + ret = button_release_handler (item, event, FeatureLineItem); + break; + + case GDK_MOTION_NOTIFY: + ret = motion_handler (item, event); + break; + + case GDK_ENTER_NOTIFY: + ret = enter_handler (item, event, FeatureLineItem); + break; + + case GDK_LEAVE_NOTIFY: + ret = leave_handler (item, event, FeatureLineItem); + break; + + default: + break; + } + + return ret; +} + bool Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/) { @@ -974,7 +1055,7 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, double px; double py; - nframes64_t const pos = event_frame (&event, &px, &py); + framepos_t const pos = event_frame (&event, &px, &py); std::pair const tv = trackview_by_y_position (py); if (tv.first == 0) { @@ -1001,8 +1082,8 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, return true; } - if (boost::dynamic_pointer_cast (region_copy) == 0 && - dynamic_cast (tv.first) != 0) { + if (boost::dynamic_pointer_cast (region_copy) != 0 && + dynamic_cast (tv.first) == 0) { /* MIDI -> non-MIDI */ return true; @@ -1015,3 +1096,45 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, return true; } + +bool +Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType) +{ + return false; +} + +bool +Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type) +{ + + bool handled = false; + + switch (type) { + case TempoMarkerItem: + switch (event->key.keyval) { + case GDK_Delete: + remove_tempo_marker (item); + handled = true; + break; + default: + break; + } + break; + + case MeterMarkerItem: + switch (event->key.keyval) { + case GDK_Delete: + remove_meter_marker (item); + handled = true; + break; + default: + break; + } + break; + + default: + break; + } + + return handled; +}