/// <summary> /// Get the currently hovered element. /// </summary> private BaseElement GetHoveredElement() { List <BaseElement> blockers = this.GetAllElements(true).Where(element => element.Blocker).ToList(); List <BaseElement> hoveredElements = this.GetAllElements(true) .Where(element => element.GetBounds().Contains(MouseInfo.Position)) .ToList(); hoveredElements.Reverse(); // Ensures that elements rendered last are selected first when priorities are equal if (hoveredElements.Count <= 0) { return(null); } BaseElement result = hoveredElements.OrderByDescending(element => element.Priority).First(); if (!blockers.Any()) { return(result); } // Get the highest priority blocker and check whether the hovered element is that blocker or any of it's children BaseElement topBlocker = blockers.OrderByDescending(element => element.Priority).First(); if (!topBlocker.BuildFlattenedSubTree(true).Contains(result)) { result = null; } return(result); }