+
+void
+AudioPlot::search (map<int, PointList> const & search, wxMouseEvent const & ev, double& min_dist, Point& min_point) const
+{
+ for (map<int, PointList>::const_iterator i = search.begin(); i != search.end(); ++i) {
+ BOOST_FOREACH (Point const & j, i->second) {
+ double const dist = pow(ev.GetX() - j.draw.x, 2) + pow(ev.GetY() - j.draw.y, 2);
+ if (dist < min_dist) {
+ min_dist = dist;
+ min_point = j;
+ }
+ }
+ }
+}
+
+void
+AudioPlot::mouse_moved (wxMouseEvent& ev)
+{
+ double min_dist = DBL_MAX;
+ Point min_point;
+
+ search (_rms, ev, min_dist, min_point);
+ search (_peak, ev, min_dist, min_point);
+
+ _cursor = optional<Point> ();
+
+ if (min_dist < DBL_MAX) {
+ wxRect before (min_point.draw.x - _cursor_size / 2, min_point.draw.y - _cursor_size / 2, _cursor_size, _cursor_size);
+ GetParent()->Refresh (true, &before);
+ _cursor = min_point;
+ wxRect after (min_point.draw.x - _cursor_size / 2, min_point.draw.y - _cursor_size / 2, _cursor_size, _cursor_size);
+ GetParent()->Refresh (true, &after);
+ Cursor (min_point.time, min_point.db);
+ }
+}
+
+void
+AudioPlot::mouse_leave (wxMouseEvent &)
+{
+ _cursor = optional<Point> ();
+ Refresh ();
+ Cursor (optional<DCPTime>(), optional<float>());
+}