private bool NotifyMouseExitVisitor(Panel p, MouseEventArgs e) { Point test = new Point(e.X, e.Y); bool update = false; foreach(Mark m in p.Children) { if(m is Panel) { update = NotifyMouseExitVisitor(m as Panel, e) || update; } if(m.hovered) { if (!m.hitTest(test, p.ToScreen())) { update = m.MouseExit(p.ToScreen().untransform(test)) || update; m.hovered = false; } } } return update; }
public List<Tuple<Mark, Transform, RectangleF, double>> DrawVisitor(Panel p, RectangleF clip, double order) { List<Tuple<Mark, Transform, RectangleF, double>> result = new List<Tuple<Mark, Transform, RectangleF, double>>(); foreach (Mark m in p.Children) { if (m is Panel) { RectangleF r = m.bounds(p.ToScreen()); r.Width += 1; r.Height += 1; r.Intersect(clip); result.AddRange(DrawVisitor(m as Panel, (m as Panel).Clip ? r : clip, /*order + */m.Order)); } result.Add(new Tuple<Mark, Transform, RectangleF, double>(m, p.ToScreen(), clip, /*order + */m.Order)); } return result; }
private bool NotifyMouseEnterVisitor(Panel p, MouseEventArgs e) { bool update = false; Point test = new Point(e.X, e.Y); foreach (Mark m in p.Children) { if (m is Panel) { if(!(m as Panel).Clip || (m as Panel).bounds(p.ToScreen()).Contains(test)) update = NotifyMouseEnterVisitor(m as Panel, e) || update; } if (!m.hovered) { if (m.hitTest(test, p.ToScreen())) { update = m.MouseEnter(p.ToScreen().untransform(test)) || update; m.hovered = true; } } if (m.hovered) { update = m.MouseOver(p.ToScreen().untransform(test)) || update; } } return update; }