summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-09-02 23:55:09 +0000
committerCarl Hetherington <carl@carlh.net>2009-09-02 23:55:09 +0000
commit36357106277408b8aaefbbdc12f6585f2dbe00cd (patch)
tree6f2d1be82ea86a5bce15d8b51df88ad53299af45
parente745eb695283f209da7f47fa4c43d511fef1de12 (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.cc61
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;
}