feat: add configurable operator appearance and layout

This commit is contained in:
2026-07-23 11:14:10 +09:00
parent cf117de144
commit f43483533a
34 changed files with 5942 additions and 740 deletions

View File

@@ -102,10 +102,35 @@ public sealed class LegacyOperatorSettingsNativeContractTests
StringComparison.Ordinal);
Assert.Contains("LegacySetOperatorNavigationExpandedIntent", Playout,
StringComparison.Ordinal);
Assert.Contains("LegacySetOperatorAppearanceIntent", Playout,
StringComparison.Ordinal);
Assert.Contains("ReconcileRejectedOperatorSettingsIntent(", process,
StringComparison.Ordinal);
}
[Fact]
public void AppearanceIntentIsPersistedRoutedAndProjectedAsOneClosedUpdate()
{
Assert.Contains(
"case LegacySetOperatorAppearanceIntent appearance:",
Settings,
StringComparison.Ordinal);
Assert.Contains("ColorTheme = appearance.ColorTheme", Settings,
StringComparison.Ordinal);
Assert.Contains("ViewMode = appearance.ViewMode", Settings,
StringComparison.Ordinal);
Assert.Contains("StartWorkspace = appearance.StartWorkspace", Settings,
StringComparison.Ordinal);
Assert.Contains("_operatorSettings.ColorTheme", Settings,
StringComparison.Ordinal);
Assert.Contains("_operatorSettings.ViewMode", Settings,
StringComparison.Ordinal);
Assert.Contains("_operatorSettings.StartWorkspace", Settings,
StringComparison.Ordinal);
Assert.Contains("LegacySetOperatorAppearanceIntent", Window,
StringComparison.Ordinal);
}
[Fact]
public void SettingsStateIsProjectedWithoutPublishingFullNativePaths()
{
@@ -132,6 +157,28 @@ public sealed class LegacyOperatorSettingsNativeContractTests
StringComparison.Ordinal);
}
[Fact]
public void SettingsUsesConciseRoutineStatusCopy()
{
var cancelledPicker = Slice(
Settings,
"if (selected is null)",
"cancellationToken.ThrowIfCancellationRequested();");
Assert.DoesNotContain(
"SetOperatorSettingsMessage",
cancelledPicker,
StringComparison.Ordinal);
Assert.Contains("\"저장됨\"", Settings, StringComparison.Ordinal);
Assert.Contains("\"저장됨 · 재시작 필요\"", Settings, StringComparison.Ordinal);
Assert.Contains("\"초기화됨 · 재시작 필요\"", Settings, StringComparison.Ordinal);
Assert.Contains("\"앱 기본값\"", Settings, StringComparison.Ordinal);
Assert.Contains("\"자동\"", Settings, StringComparison.Ordinal);
Assert.Contains("\"사용 가능\"", Settings, StringComparison.Ordinal);
Assert.DoesNotContain("외부 영상", Settings, StringComparison.Ordinal);
Assert.DoesNotContain("핵심 자산 확인됨", Settings, StringComparison.Ordinal);
}
private static string Slice(string value, string start, string end)
{
var startIndex = RequiredIndex(value, start);