// ----------------------------------------------------------------------- // // Copyright 2014 MIT Licence. See licence.md for more information. // // ----------------------------------------------------------------------- namespace Perspex { using System; using System.Collections.Generic; using System.Linq; using Perspex.Controls; using Perspex.Styling; public static class VisualExtensions { public static IEnumerable GetVisual(this IVisual visual, Func selector) { Selector sel = selector(new Selector()); IEnumerable visuals = Enumerable.Repeat(visual, 1).Concat(visual.GetVisualDescendents()); foreach (IStyleable v in visuals.OfType()) { using (StyleActivator activator = sel.GetActivator(v)) { if (activator.CurrentValue) { yield return (IVisual)v; } } } } public static T GetVisualAncestor(this IVisual visual) where T : class { Contract.Requires(visual != null); visual = visual.VisualParent; while (visual != null) { if (visual is T) { return (T)visual; } else { visual = visual.VisualParent; } } return null; } public static T GetVisualAncestorOrSelf(this IVisual visual) where T : class { Contract.Requires(visual != null); return (visual as T) ?? visual.GetVisualAncestor(); } public static IEnumerable GetVisualAncestors(this IVisual visual) { visual = visual.VisualParent; while (visual != null) { yield return visual; visual = visual.VisualParent; } } public static IEnumerable GetVisualAncestorsAndSelf(this IVisual visual) { yield return visual; visual = visual.VisualParent; while (visual != null) { yield return visual; visual = visual.VisualParent; } } public static IVisual GetVisualAt(this IVisual visual, Point p) { Contract.Requires(visual != null); return visual.GetVisualsAt(p).LastOrDefault(); } public static IEnumerable GetVisualsAt(this IVisual visual, Point p) { Contract.Requires(visual != null); if (visual.Bounds.Contains(p)) { yield return visual; p -= visual.Bounds.Position; if (visual.VisualChildren.Any()) { foreach (IVisual child in visual.VisualChildren) { foreach (IVisual v in child.GetVisualsAt(p)) { yield return v; } } } } } 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 IEnumerable GetVisualSiblings(this IVisual visual) { IVisual parent = visual.VisualParent; if (parent != null) { foreach (T sibling in parent.VisualChildren.OfType()) { if ((IVisual)sibling != visual) { yield return sibling; } } } } } }