5internal static class WidgetInputRouterRegistry
7 private static readonly
object _syncRoot =
new();
9 private static readonly Dictionary<RenderSurfaceHostBase, WidgetInputRouter> _routers =
new(ReferenceEqualityComparer.Instance);
11 internal static void Attach(RenderSurfaceHostBase renderSurfaceHost, WidgetInputRouter router)
13 ArgumentNullException.ThrowIfNull(renderSurfaceHost);
14 ArgumentNullException.ThrowIfNull(router);
18 if (_routers.TryGetValue(renderSurfaceHost, out WidgetInputRouter? existing) &&
19 !ReferenceEquals(existing, router))
21 throw new InvalidOperationException(
"A widget input router is already attached to this render surface host.");
24 _routers[renderSurfaceHost] = router;
28 internal static void Detach(RenderSurfaceHostBase renderSurfaceHost, WidgetInputRouter router)
32 if (_routers.TryGetValue(renderSurfaceHost, out WidgetInputRouter? existing) &&
33 ReferenceEquals(existing, router))
35 _routers.Remove(renderSurfaceHost);
40 internal static bool TryRegister(WidgetBase widget)
42 ArgumentNullException.ThrowIfNull(widget);
44 WidgetInputRouter? router = GetRouter(widget);
49 router.Register(widget);
53 internal static bool TryBringToFront(WidgetBase widget)
55 ArgumentNullException.ThrowIfNull(widget);
57 WidgetInputRouter? router = GetRouter(widget);
62 router.Register(widget);
63 router.BringToFront(widget);
68 internal static bool TryFocus(WidgetBase widget)
70 ArgumentNullException.ThrowIfNull(widget);
72 WidgetInputRouter? router = GetRouter(widget);
81 internal static void NotifyHidden(WidgetBase widget)
83 GetRouter(widget)?.NotifyWidgetHidden(widget);
86 internal static void NotifyInputDisabled(WidgetBase widget)
88 GetRouter(widget)?.NotifyWidgetInputDisabled(widget);
91 internal static void NotifyPointerInputDisabled(WidgetBase widget)
93 GetRouter(widget)?.NotifyWidgetPointerInputDisabled(widget);
96 internal static void NotifyKeyboardFocusDisabled(WidgetBase widget)
98 GetRouter(widget)?.NotifyWidgetKeyboardFocusDisabled(widget);
101 internal static WidgetBase? GetFocusedWidget(WidgetBase widget) => GetRouter(widget)?.FocusedWidget;
103 internal static void RestoreFocus(WidgetBase widget, WidgetBase? previous)
105 var router = GetRouter(widget);
106 router?.ClearFocus();
107 router?.Focus(previous);
110 private static WidgetInputRouter? GetRouter(WidgetBase widget)
112 ArgumentNullException.ThrowIfNull(widget);
116 _routers.TryGetValue(widget.RenderSurfaceHost, out WidgetInputRouter? router);