From f2d9e331b400ca5a1947b499283aaef0ef93f7f9 Mon Sep 17 00:00:00 2001 From: ericek111 Date: Thu, 10 Sep 2026 13:58:12 +0000 Subject: [PATCH] Give each operator his windows back The program stored an operator's window positions but never used them at startup: the entry window was not placed and no window was reopened. It now restores the whole screen both at startup and on a change of operator: the windows that operator had open, where he had them, and the ones he did not have closed. The second radio's entry window no longer saves the layout. It has none of the other windows open, so saving from it dropped every window the first one had. Ctrl+O gets six buttons for the operators last at the radio, newest first. One click changes to that operator. The recordings folder is no longer asked for. It is `Wav/` under the data folder, which is where N1MM plays them from, so `StoredOperator.WavPath` is gone. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_0157i7PiZyqBkquxS9A6FTdQ --- src/Nonemm.App/Configuration/Settings.cs | 6 ++ .../Configuration/StoredOperator.cs | 5 -- src/Nonemm.App/Dialogs/OperatorDialog.axaml | 9 +-- .../Dialogs/OperatorDialog.axaml.cs | 52 ++++++++----- .../Windows/EntryWindow.Operators.cs | 76 ++++++++++++++----- src/Nonemm.App/Windows/EntryWindow.axaml.cs | 1 + tests/Nonemm.App.Tests/SettingsTests.cs | 18 ++++- 7 files changed, 114 insertions(+), 53 deletions(-) diff --git a/src/Nonemm.App/Configuration/Settings.cs b/src/Nonemm.App/Configuration/Settings.cs index df4498c..335f900 100644 --- a/src/Nonemm.App/Configuration/Settings.cs +++ b/src/Nonemm.App/Configuration/Settings.cs @@ -253,6 +253,12 @@ public sealed record Settings /// Whoever is at the radio now, or empty at a station with one operator. public string CurrentOperator { get; init; } = ""; + /// The operators who were last at the radio, newest first. `Operators` is + /// kept in the order they took it, so the end of the list is the most + /// recent. + public IEnumerable RecentOperators(int count) => + Operators.Reverse().Take(count); + /// The digital window's twenty-four macro buttons, in the same /// `label,message` lines as a function key file. Empty means the built-in /// set. diff --git a/src/Nonemm.App/Configuration/StoredOperator.cs b/src/Nonemm.App/Configuration/StoredOperator.cs index e4ef4f3..96b23ef 100644 --- a/src/Nonemm.App/Configuration/StoredOperator.cs +++ b/src/Nonemm.App/Configuration/StoredOperator.cs @@ -12,10 +12,5 @@ public sealed record StoredOperator /// until he changes them. public string Theme { get; init; } = ""; - /// The folder this operator's recordings are in. A voice keyer plays the - /// recordings of whoever is at the microphone, so the path is the - /// operator's rather than the station's. - public string WavPath { get; init; } = ""; - public IReadOnlyList Windows { get; init; } = []; } diff --git a/src/Nonemm.App/Dialogs/OperatorDialog.axaml b/src/Nonemm.App/Dialogs/OperatorDialog.axaml index 5475446..7cbe8ae 100644 --- a/src/Nonemm.App/Dialogs/OperatorDialog.axaml +++ b/src/Nonemm.App/Dialogs/OperatorDialog.axaml @@ -20,19 +20,14 @@ Click="OnCancel" IsCancel="True" /> - + + - - - -