Skip to content

Commit 544831c

Browse files
sebgodclaude
andcommitted
Migrate Planner + FitsViewer callbacks to signal bus (Phase 3)
- PlannerTab: replace OnBuildSchedule with BuildScheduleSignal - FitsViewer: replace OnExit/OnToggleFullscreen/OnPlateSolve with RequestExitSignal/ToggleFullscreenSignal/PlateSolveSignal - VkImageRenderer: zero callback properties remaining - Add signal types to GuiSignals.cs All action callbacks now flow through the signal bus. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 171d99d commit 544831c

File tree

5 files changed

+25
-24
lines changed

5 files changed

+25
-24
lines changed

src/TianWen.UI.Abstractions/GuiSignals.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,12 @@ namespace TianWen.UI.Abstractions;
1919

2020
/// <summary>Update profile data (filter config, OTA props, etc.).</summary>
2121
public readonly record struct UpdateProfileSignal(ProfileData Data);
22+
23+
/// <summary>Build the observation schedule from pinned targets.</summary>
24+
public readonly record struct BuildScheduleSignal;
25+
26+
/// <summary>Toggle fullscreen mode.</summary>
27+
public readonly record struct ToggleFullscreenSignal;
28+
29+
/// <summary>Request plate solving the current image.</summary>
30+
public readonly record struct PlateSolveSignal;

src/TianWen.UI.FitsViewer/Program.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,10 @@
8282
var ctx = VulkanContext.Create(sdlWindow.Instance, sdlWindow.Surface, (uint)pixW, (uint)pixH);
8383
var renderer = new VkRenderer(ctx, (uint)pixW, (uint)pixH);
8484

85+
var bus = new SignalBus();
8586
var imageRenderer = new VkImageRenderer(renderer, (uint)pixW, (uint)pixH)
8687
{
88+
Bus = bus,
8789
DpiScale = sdlWindow.DisplayScale,
8890
CelestialObjectDB = celestialObjectDB
8991
};
@@ -150,24 +152,24 @@
150152

151153
OnPostFrame = () =>
152154
{
155+
bus.ProcessPending();
153156
state.NeedsRedraw = false;
154157
}
155158
};
156159

157-
// Wire app-level callbacks that need loop/window references
158-
imageRenderer.OnExit = () => loop.Stop();
159-
imageRenderer.OnToggleFullscreen = () => sdlWindow.ToggleFullscreen();
160-
imageRenderer.OnPlateSolve = () =>
160+
// Signal subscriptions for app-level actions
161+
bus.Subscribe<RequestExitSignal>(_ => loop.Stop());
162+
bus.Subscribe<ToggleFullscreenSignal>(_ => sdlWindow.ToggleFullscreen());
163+
bus.Subscribe<PlateSolveSignal>(_ =>
161164
{
162165
if (document is not null && !state.IsPlateSolving && !document.IsPlateSolved)
163166
{
164167
var factory = sp.GetRequiredService<TianWen.Lib.Astrometry.PlateSolve.IPlateSolverFactory>();
165168
backgroundTask = ViewerActions.PlateSolveAsync(document, state, factory, cts.Token);
166169
}
167-
return Task.CompletedTask;
168-
};
170+
});
169171

170-
// OnKeyDown wired separately — imageRenderer.HandleKeyDown handles F11 via OnToggleFullscreen
172+
// OnKeyDown wired separately — imageRenderer.HandleKeyDown handles F11 via signal bus
171173
loop.OnKeyDown = (inputKey, inputModifier) =>
172174
{
173175
imageRenderer.HandleKeyDown(inputKey, inputModifier);

src/TianWen.UI.Gui/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@
102102
});
103103
Task? plannerTask = null;
104104

105-
// Wire tab callbacks that need DI/profile access
106-
guiRenderer.PlannerTab.OnBuildSchedule = () =>
105+
// Signal subscription for building the schedule
106+
bus.Subscribe<BuildScheduleSignal>(signal =>
107107
{
108108
if (appState.ActiveProfile is null) return;
109109
var transform = TransformFactory.FromProfile(appState.ActiveProfile, external.TimeProvider, out _);
@@ -125,7 +125,7 @@
125125
availableFilters: availableFilters is { Count: > 0 } ? availableFilters : null,
126126
opticalDesign: opticalDesign);
127127
}
128-
};
128+
});
129129

130130
if (appState.ActiveProfile is not null)
131131
{

src/TianWen.UI.Gui/VkPlannerTab.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ public sealed class VkPlannerTab : VkTabBase
5353
/// <summary>Reference to the planner state from the last Render call.</summary>
5454
private PlannerState? _state;
5555

56-
/// <summary>Callback for building the schedule (needs profile/transform). Set by the host.</summary>
57-
public Action? OnBuildSchedule { get; set; }
5856

5957
// Layout rects computed during Render, used by hit testing
6058
private RectF32 _targetListRect;
@@ -616,7 +614,7 @@ public override bool HandleKeyDown(InputKey key, InputModifier modifiers)
616614
return true;
617615

618616
case InputKey.S:
619-
OnBuildSchedule?.Invoke();
617+
PostSignal(new BuildScheduleSignal());
620618
return true;
621619

622620
default:

src/TianWen.UI.Shared/VkImageRenderer.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,6 @@ public sealed class VkImageRenderer : PixelWidgetBase<VulkanContext>, IDisposabl
4242
/// <summary>Reference to the document from the last Render call.</summary>
4343
private AstroImageDocument? _document;
4444

45-
/// <summary>Callback for plate solving (needs DI). Set by the host.</summary>
46-
public Func<Task>? OnPlateSolve { get; set; }
47-
48-
/// <summary>Callback for app exit. Set by the host.</summary>
49-
public Action? OnExit { get; set; }
50-
51-
/// <summary>Callback for fullscreen toggle. Set by the host.</summary>
52-
public Action? OnToggleFullscreen { get; set; }
5345

5446
/// <summary>
5547
/// DPI scale factor. Set from framebuffer size / window size ratio.
@@ -1537,10 +1529,10 @@ public override bool HandleKeyDown(InputKey key, InputModifier modifiers)
15371529
switch (key)
15381530
{
15391531
case InputKey.Escape:
1540-
OnExit?.Invoke();
1532+
PostSignal(new RequestExitSignal());
15411533
return true;
15421534
case InputKey.F11:
1543-
OnToggleFullscreen?.Invoke();
1535+
PostSignal(new ToggleFullscreenSignal());
15441536
return true;
15451537
case InputKey.T:
15461538
ViewerActions.ToggleStretch(state);
@@ -1593,7 +1585,7 @@ public override bool HandleKeyDown(InputKey key, InputModifier modifiers)
15931585
}
15941586
return true;
15951587
case InputKey.P:
1596-
OnPlateSolve?.Invoke();
1588+
PostSignal(new PlateSolveSignal());
15971589
return true;
15981590
case InputKey.F:
15991591
ViewerActions.ZoomToFit(state);

0 commit comments

Comments
 (0)