From 1da35e6c45b3c565481ce1b572b389badb64762c Mon Sep 17 00:00:00 2001 From: ericek111 Date: Tue, 1 Sep 2026 00:03:13 +0000 Subject: [PATCH] Keep the digital window's N1MM settings The settings N1MM keeps for its digital interface: how many message buttons to show, which of the two window scroll types to use, hover mode, the callsign pause routines, what a callsign is checked against before it is highlighted, which files that check reads, whether the grab list is cleared on a CQ or a QSY, what happens to AFC and the mark tone on a run to S&P change, and whether the receive pane is copied to a text file. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01RoGtneMQaz4M9w7Kk49AVD --- src/Nonemm.App/Configuration/Settings.cs | 68 ++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/Nonemm.App/Configuration/Settings.cs b/src/Nonemm.App/Configuration/Settings.cs index aaeedf1..ebf6b96 100644 --- a/src/Nonemm.App/Configuration/Settings.cs +++ b/src/Nonemm.App/Configuration/Settings.cs @@ -258,6 +258,74 @@ public sealed record Settings /// N1MM caps the receive pane's font at 14 points. public int DigitalFontSize { get; init; } = 12; + /// How many macro buttons the digital window shows. N1MM offers 0, 8, 16 + /// or 24. + public int DigitalMessageButtons { get; init; } = 24; + + /// N1MM's window scroll type. False keeps text where it was printed and + /// underlines the line being printed to; true scrolls old text off the top. + public bool DigitalScrolling { get; init; } = true; + + /// A click on a callsign is followed by a space, so the cursor moves to + /// the exchange the way it does after a grab. + public bool DigitalClickSendsSpace { get; init; } + + /// The pointer alone puts a callsign in the entry window, without a click. + /// N1MM's hover mode. + public bool DigitalHoverMode { get; init; } + + /// The pointer resting on a callsign stops the pane until it moves off or + /// the call is clicked. N1MM's RX window callsign pause routines. + public bool DigitalPauseOnCallsign { get; init; } + + /// What a callsign is checked against before it is highlighted and put in + /// the grab list: `generic` takes anything shaped like a call, `resources` + /// takes only calls in the files ticked below, and `both` takes anything + /// but marks in yellow what the files do not hold. + public string DigitalHighlightRoutine { get; init; } = "generic"; + + public bool DigitalUseMasterScp { get; init; } = true; + + public bool DigitalUseCallHistory { get; init; } + + public bool DigitalUseTelnetCalls { get; init; } + + public bool DigitalUseLoggedCalls { get; init; } + + /// Look for a known call inside a run of noise, not only between spaces. + public bool DigitalSearchGarbage { get; init; } + + /// Only calls in Master.scp or already worked this contest go in the grab + /// list. + public bool DigitalGrabKnownOnly { get; init; } + + public bool DigitalClearGrabOnCq { get; init; } + + public bool DigitalClearGrabOnQsy { get; init; } + + /// Send MMTTY's ham default when the operator leaves run for search and + /// pounce, which puts the mark tone back. + public bool DigitalHamDefaultOnSearch { get; init; } + + /// Turn AFC off on the same change, so the receiver stops following a + /// drifting signal away from the transmit frequency. + public bool DigitalAfcOffOnSearch { get; init; } + + /// Turn AFC on when a CQ goes out, which pulls in a caller who is off + /// frequency. + public bool DigitalAfcOnCq { get; init; } + + /// The window title carries the radio's dial frequency rather than the + /// dial frequency with the audio tone added to it. + public bool DigitalRadioFrequencyInTitle { get; init; } + + /// Raise the digital window with the entry window it belongs to. + public bool DigitalBringToForeground { get; init; } + + /// Write what the receive pane prints to a date-stamped file in + /// `ExportFiles`, the way N1MM does. + public bool DigitalOutputToTextFile { get; init; } + /// A file shipped beside the program. MMTTY and the bridge are distributed /// with Nonemm, so the paths are filled in already; a file that is not /// there leaves the setting empty and the operator browses for it.