Gondwana Game Engine Development (master) - 2.6.1
Gondwana is a cross-platform 2.5D game and rendering engine written in C#/.NET 8. It provides fine-grained control over rendering, timing, and scene composition, with built-in support for parallax, z-ordering, pixel overhang, collision detection, and particle effects. Gondwana targets desktop and web platforms using SkiaSharp for graphics and pluggable audio backends for desktop and browser targets.
Loading...
Searching...
No Matches
WidgetInputRouterRegistry.cs
2
3namespace Gondwana.Widgets;
4
5internal static class WidgetInputRouterRegistry
6{
7 private static readonly object _syncRoot = new();
8
9 private static readonly Dictionary<RenderSurfaceHostBase, WidgetInputRouter> _routers = new(ReferenceEqualityComparer.Instance);
10
11 internal static void Attach(RenderSurfaceHostBase renderSurfaceHost, WidgetInputRouter router)
12 {
13 ArgumentNullException.ThrowIfNull(renderSurfaceHost);
14 ArgumentNullException.ThrowIfNull(router);
15
16 lock (_syncRoot)
17 {
18 if (_routers.TryGetValue(renderSurfaceHost, out WidgetInputRouter? existing) &&
19 !ReferenceEquals(existing, router))
20 {
21 throw new InvalidOperationException("A widget input router is already attached to this render surface host.");
22 }
23
24 _routers[renderSurfaceHost] = router;
25 }
26 }
27
28 internal static void Detach(RenderSurfaceHostBase renderSurfaceHost, WidgetInputRouter router)
29 {
30 lock (_syncRoot)
31 {
32 if (_routers.TryGetValue(renderSurfaceHost, out WidgetInputRouter? existing) &&
33 ReferenceEquals(existing, router))
34 {
35 _routers.Remove(renderSurfaceHost);
36 }
37 }
38 }
39
40 internal static bool TryRegister(WidgetBase widget)
41 {
42 ArgumentNullException.ThrowIfNull(widget);
43
44 WidgetInputRouter? router = GetRouter(widget);
45
46 if (router is null)
47 return false;
48
49 router.Register(widget);
50 return true;
51 }
52
53 internal static bool TryBringToFront(WidgetBase widget)
54 {
55 ArgumentNullException.ThrowIfNull(widget);
56
57 WidgetInputRouter? router = GetRouter(widget);
58
59 if (router is null)
60 return false;
61
62 router.Register(widget);
63 router.BringToFront(widget);
64
65 return true;
66 }
67
68 internal static bool TryFocus(WidgetBase widget)
69 {
70 ArgumentNullException.ThrowIfNull(widget);
71
72 WidgetInputRouter? router = GetRouter(widget);
73
74 if (router is null)
75 return false;
76
77 router.Focus(widget);
78 return true;
79 }
80
81 internal static void NotifyHidden(WidgetBase widget)
82 {
83 GetRouter(widget)?.NotifyWidgetHidden(widget);
84 }
85
86 internal static void NotifyInputDisabled(WidgetBase widget)
87 {
88 GetRouter(widget)?.NotifyWidgetInputDisabled(widget);
89 }
90
91 internal static void NotifyPointerInputDisabled(WidgetBase widget)
92 {
93 GetRouter(widget)?.NotifyWidgetPointerInputDisabled(widget);
94 }
95
96 internal static void NotifyKeyboardFocusDisabled(WidgetBase widget)
97 {
98 GetRouter(widget)?.NotifyWidgetKeyboardFocusDisabled(widget);
99 }
100
101 internal static WidgetBase? GetFocusedWidget(WidgetBase widget) => GetRouter(widget)?.FocusedWidget;
102
103 internal static void RestoreFocus(WidgetBase widget, WidgetBase? previous)
104 {
105 var router = GetRouter(widget);
106 router?.ClearFocus();
107 router?.Focus(previous);
108 }
109
110 private static WidgetInputRouter? GetRouter(WidgetBase widget)
111 {
112 ArgumentNullException.ThrowIfNull(widget);
113
114 lock (_syncRoot)
115 {
116 _routers.TryGetValue(widget.RenderSurfaceHost, out WidgetInputRouter? router);
117 return router;
118 }
119 }
120}