diff options
author | Carl Hetherington <carl@carlh.net> | 2009-09-02 23:55:09 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2009-09-02 23:55:09 +0000 |
commit | 36357106277408b8aaefbbdc12f6585f2dbe00cd (patch) | |
tree | 6f2d1be82ea86a5bce15d8b51df88ad53299af45 | |
parent | e745eb695283f209da7f47fa4c43d511fef1de12 (diff) |
Handle mouse events over crossfades properly (or better) when in stacked region mode.
git-svn-id: svn://localhost/ardour2/branches/3.0@5623 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/editor_canvas_events.cc | 61 |
1 files changed, 48 insertions, 13 deletions
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 95620030a9..a95278f70d 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -574,7 +574,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, return false; } - /* proxy for the upper most regionview */ + /* proxy for an underlying regionview */ /* XXX really need to check if we are in the name highlight, and proxy to that when required. @@ -589,21 +589,56 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, boost::shared_ptr<AudioPlaylist> pl; if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->get_diskstream()->playlist())) != 0) { - + Playlist::RegionList* rl = pl->regions_at (event_frame (event)); - if (!rl->empty()) { - DescendingRegionLayerSorter cmp; - rl->sort (cmp); - - RegionView* rv = atv->view()->find_view (rl->front()); - - delete rl; - - /* proxy */ + + if (atv->layer_display() == Overlaid) { + + /* we're in overlaid mode; proxy to the uppermost region view */ + + DescendingRegionLayerSorter cmp; + rl->sort (cmp); + + RegionView* rv = atv->view()->find_view (rl->front()); + + delete rl; + + /* proxy */ + return canvas_region_view_event (event, rv->get_canvas_group(), rv); + + } else { - return canvas_region_view_event (event, rv->get_canvas_group(), rv); - } + /* 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 */ + + /* 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 */ + double const c = atv->view()->child_height (); + layer_t const l = pl->top_layer () + 1 - (cy / c); + + /* hence region */ + Playlist::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; } |