Add the Info window, following N1MM's source

The window shows the operator, the call-frame spot, country, bearing and
sun lines, the WWV line and a message area. It draws both rate graphs
against the goals and shows the QSO timer (seven modes), the band timer,
the band-change count and the Run/Mult box.

Goals use N1MM's `dhh goal` file format and its Import Goals rules,
including statistics and CSV files. Logic that does not need the UI is in
Nonemm.Contests (Goals, QsoTimer, RateBars) and Nonemm.Session
(InfoLines), with tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 15:43:09 +00:00
co-authored by Claude Sonnet 5.5
parent 7a728af469
commit 012b0cdc8b
26 changed files with 2055 additions and 0 deletions
@@ -480,6 +480,11 @@ public sealed partial class EntryWindow
private void OnShowGrayline(object? sender, RoutedEventArgs e) =>
Show(() => new GraylineWindow(session));
/// N1MM's info window: the operator, the station in the call box, the rate
/// graphs and the contest timers.
private void OnShowInfo(object? sender, RoutedEventArgs e) =>
Show(() => new InfoWindow(session));
private void OnShowTelnet(object? sender, RoutedEventArgs e) => Show(() => new TelnetWindow(session, Tune));
private void OnShowVoiceKeyer(object? sender, RoutedEventArgs e) =>