// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex { using System; using System.Collections.Generic; using System.Linq; public static class VisualExtensions { public static IEnumerable GetVisualAncestors(this IVisual visual) { Contract.Requires(visual != null); visual = visual.VisualParent; while (visual != null) { yield return visual; visual = visual.VisualParent; } } public static IEnumerable GetSelfAndVisualAncestors(this IVisual visual) { yield return visual; foreach (var ancestor in visual.GetVisualAncestors()) { yield return ancestor; } } public static IVisual GetVisualAt(this IVisual visual, Point p) { Contract.Requires(visual != null); return visual.GetVisualsAt(p).FirstOrDefault(); } public static IEnumerable GetVisualsAt(this IVisual visual, Point p) { Contract.Requires(visual != null); if (visual.Bounds.Contains(p)) { p -= visual.Bounds.Position; if (visual.VisualChildren.Any()) { foreach (IVisual child in visual.VisualChildren) { foreach (IVisual v in child.GetVisualsAt(p)) { yield return v; } } } yield return visual; } } public static IEnumerable GetVisualChildren(this IVisual visual) { return visual.VisualChildren; } public static IEnumerable GetVisualDescendents(this IVisual visual) { foreach (IVisual child in visual.VisualChildren) { yield return child; foreach (IVisual descendent in child.GetVisualDescendents()) { yield return descendent; } } } public static IVisual GetVisualParent(this IVisual visual) { return visual.VisualParent; } public static T GetVisualParent(this IVisual visual) where T : class { return visual.VisualParent as T; } public static IEnumerable GetVisualSiblings(this IVisual visual) { IVisual parent = visual.VisualParent; if (parent != null) { foreach (IVisual sibling in parent.VisualChildren) { yield return sibling; } } } } }