diff --git a/IoListTestingWindow.ClockSyncUx.cs b/IoListTestingWindow.ClockSyncUx.cs
index 2ca060789..7b265d1a2 100644
--- a/IoListTestingWindow.ClockSyncUx.cs
+++ b/IoListTestingWindow.ClockSyncUx.cs
@@ -40,9 +40,9 @@ private void ClockSyncUx_Loaded(object sender, RoutedEventArgs e)
Margin = new Thickness(0, 0, 8, 0),
Padding = new Thickness(2, 0, 2, 0),
FontSize = 11.2,
- FontWeight = FontWeights.SemiBold,
+ FontWeight = FontWeights.Medium,
Foreground = TryFindResource("Ink") as Brush ?? Brushes.DimGray,
- Text = "Global SNTP",
+ Text = "SNTP · —",
ToolTip = "Global SNTP is controlled from the ARSAS header. It is not owned by FAT and continues running when the FAT window closes while the global server toggle remains enabled."
};
@@ -54,7 +54,7 @@ private void ClockSyncUx_Loaded(object sender, RoutedEventArgs e)
FontSize = 10.4,
FontWeight = FontWeights.Medium,
Foreground = TryFindResource("MutedInk") as Brush ?? Brushes.SlateGray,
- Text = "SNTP: waiting"
+ Text = "Clock · waiting"
};
_clockSyncGlobalStatusText = globalStatus;
@@ -104,25 +104,22 @@ private void RefreshClockSyncEvidence(SntpClockServiceSnapshot snapshot)
SntpClockTransportMode.UdpSocket => "UDP",
_ => "—"
};
- var localAddress = snapshot.Binding?.LocalAddress.ToString();
- _clockSyncGlobalStatusText.Text = !enabled
- ? "Global SNTP · Off"
- : snapshot.State == SntpClockServiceState.Serving
- ? $"Global SNTP · {localAddress ?? "Active"}"
- : "Global SNTP · Enabled";
+ _clockSyncGlobalStatusText.Text = enabled
+ ? "SNTP · ON"
+ : "SNTP · OFF";
_clockSyncEvidenceText.Text = !enabled
- ? "SNTP: off"
+ ? "Clock · idle"
: snapshot.State switch
{
SntpClockServiceState.Serving =>
- $"{transport} · B {snapshot.BroadcastCount} · Req {snapshot.ClientRequestCount} · Reply {snapshot.ReplyCount} · sync not proven",
- SntpClockServiceState.Starting => "SNTP: starting…",
- SntpClockServiceState.Stopped => "SNTP: waiting for connected IED",
- SntpClockServiceState.PortUnavailable => "SNTP: unavailable",
- SntpClockServiceState.Faulted => "SNTP: fault",
- _ => $"SNTP: {snapshot.State}"
+ $"{transport} · B {snapshot.BroadcastCount} · Req {snapshot.ClientRequestCount} · Rep {snapshot.ReplyCount}",
+ SntpClockServiceState.Starting => "Clock · starting…",
+ SntpClockServiceState.Stopped => "Clock · waiting",
+ SntpClockServiceState.PortUnavailable => "Clock · unavailable",
+ SntpClockServiceState.Faulted => "Clock · fault",
+ _ => $"Clock · {snapshot.State}"
};
var toolTip = BuildClockSyncEvidenceToolTip(snapshot, transport, enabled);
@@ -164,4 +161,4 @@ private void ClockSyncUx_Closed(object? sender, EventArgs e)
_clockSyncSnapshotOwner.ClockSyncSnapshotChanged -= ClockSyncSnapshotChanged;
_clockSyncSnapshotOwner = null;
}
-}
+}
\ No newline at end of file
diff --git a/IoListTestingWindow.P0BenchUx.cs b/IoListTestingWindow.P0BenchUx.cs
index 04d69babc..788f8420c 100644
--- a/IoListTestingWindow.P0BenchUx.cs
+++ b/IoListTestingWindow.P0BenchUx.cs
@@ -58,6 +58,7 @@ private void ApplyP0BenchUx()
{
ConfigureP0StableFatColumns();
ConfigureP0AdaptiveHeaderActions();
+ ConfigureP2CompactHeader();
}
private void ConfigureP0StableFatColumns()
@@ -206,4 +207,4 @@ public object Convert(object value, Type targetType, object parameter, CultureIn
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> Binding.DoNothing;
-}
+}
\ No newline at end of file
diff --git a/IoListTestingWindow.P2CompactHeader.cs b/IoListTestingWindow.P2CompactHeader.cs
new file mode 100644
index 000000000..9d899819c
--- /dev/null
+++ b/IoListTestingWindow.P2CompactHeader.cs
@@ -0,0 +1,67 @@
+using System.Windows;
+using System.Windows.Controls;
+
+namespace ArIED61850Tester;
+
+///
+/// P2 bench-facing header compaction.
+///
+/// P0 already separates operational actions from evidence/status actions. P2 only tightens
+/// that existing hierarchy so the FAT header remains readable on normal engineering laptop
+/// widths. Full evidence detail stays in the existing tooltips; protocol, evidence and grid
+/// behavior are intentionally untouched.
+///
+public partial class IoListTestingWindow
+{
+ private void ConfigureP2CompactHeader()
+ {
+ if (_p0PrimaryHeaderActions == null || _p0SecondaryHeaderActions == null)
+ return;
+
+ _p0PrimaryHeaderActions.Margin = new Thickness(0);
+ _p0SecondaryHeaderActions.Margin = new Thickness(0, 3, 0, 0);
+
+ foreach (var button in _p0PrimaryHeaderActions.Children.OfType