diff --git a/src/Nonemm.App/Dialogs/DigitalDialog.axaml b/src/Nonemm.App/Dialogs/DigitalDialog.axaml
index 02d0c24..63032a7 100644
--- a/src/Nonemm.App/Dialogs/DigitalDialog.axaml
+++ b/src/Nonemm.App/Dialogs/DigitalDialog.axaml
@@ -1,7 +1,7 @@
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Nonemm.App/Dialogs/DigitalDialog.axaml.cs b/src/Nonemm.App/Dialogs/DigitalDialog.axaml.cs
index 900f523..f747613 100644
--- a/src/Nonemm.App/Dialogs/DigitalDialog.axaml.cs
+++ b/src/Nonemm.App/Dialogs/DigitalDialog.axaml.cs
@@ -1,35 +1,237 @@
using System.Globalization;
+using System.Text;
using Avalonia.Controls;
+using Avalonia.Controls.Primitives;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using Nonemm.App.Configuration;
+using Nonemm.App.Windows;
using Nonemm.Digital;
+using Nonemm.Session;
namespace Nonemm.App.Dialogs;
-/// Where the digital engine is and how it is started. It closes with the
-/// settings, or with null when nothing is to be changed.
+/// The tabs of the digital setup window, for the callers that open it on one.
+public static class DigitalDialogTabs
+{
+ public const int General = 0;
+
+ public const int Engine = 1;
+
+ public const int Messages = 2;
+}
+
+/// N1MM's digital setup window: how the receive pane and the grab list behave,
+/// where the engine is and how it is started, and the twenty-four message
+/// buttons. It closes with the settings, or with null when nothing is to be
+/// changed.
public sealed partial class DigitalDialog : Window
{
+ private const int MacroColumns = 8;
+
private static readonly string[] WindowSizes = ["Normal", "Small", "Medium1", "Medium2"];
- private readonly Settings settings;
+ /// The macros the message buttons take, for the list beside the message
+ /// text. They are the ones the entry window's function keys expand.
+ private static readonly string[] Macros =
+ [
+ "{TX}", "{RX}", "{ENTER}", "{MYCALL}", "{CALL}", "{EXCH}", "{SENTRST}", "{SENTRSTCUT}",
+ "{SERIAL}", "{NAME}", "{NAMEANDSPACE}", "{GRID}", "{GRIDSQUARE}", "{OPERATOR}",
+ "{LASTCALL}", "{PREVNR}", "{FREQ}", "{FREQROUND}", "{TIME2}", "{TIMESTAMP}",
+ "{GRAB}", "{LOG}", "{LOGTHENPOP}", "{WIPE}", "{RUN}", "{S&P}", "{SPACE}", "{SPOTME}",
+ "{EXCHSENT}", "{STOPTX}", "{END}",
+ ];
- public DigitalDialog(Settings settings)
+ private readonly Settings settings;
+ private readonly List