diff --git a/src/GamerGuardian/UI/SettingsWindow.xaml b/src/GamerGuardian/UI/SettingsWindow.xaml index 4f80ba7..ceecb1b 100644 --- a/src/GamerGuardian/UI/SettingsWindow.xaml +++ b/src/GamerGuardian/UI/SettingsWindow.xaml @@ -43,6 +43,10 @@ + @@ -246,6 +250,10 @@ + @@ -316,6 +324,10 @@ + @@ -412,6 +424,10 @@ + @@ -516,6 +532,10 @@ + + @@ -780,6 +804,10 @@ + @@ -824,6 +852,9 @@ + diff --git a/src/GamerGuardian/UI/SettingsWindow.xaml.cs b/src/GamerGuardian/UI/SettingsWindow.xaml.cs index e37fa99..9dd4a7b 100644 --- a/src/GamerGuardian/UI/SettingsWindow.xaml.cs +++ b/src/GamerGuardian/UI/SettingsWindow.xaml.cs @@ -787,6 +787,10 @@ private void LoadGlobals() var active = SafeRunGuid(PowerPlanMonitor.GetActivePlan); var activeName = active is not null && planNames.TryGetValue(active.Value, out var name) ? name : "unknown"; PowerPlanCurrentText.Text = $"Current: {activeName}"; + var planRec = SettingDocsCatalog.Get("powerplan")?.Recommended; + PowerPlanRecommendedText.Text = string.IsNullOrWhiteSpace(planRec) ? string.Empty : $"Recommended: {planRec}"; + PowerPlanRecommendedText.Visibility = string.IsNullOrEmpty(PowerPlanRecommendedText.Text) + ? Visibility.Collapsed : Visibility.Visible; PowerPlanMonitorCheck.IsChecked = g.PowerPlan.Monitor; PowerPlanAutoApplyCheck.IsChecked = g.PowerPlan.AutoApply; @@ -1666,6 +1670,23 @@ public sealed class GlobalToggleRow : INotifyPropertyChanged public Visibility LearnMoreVisibility => string.IsNullOrEmpty(LearnMoreContent) ? Visibility.Collapsed : Visibility.Visible; + /// + /// GamerGuardian's recommended value for this setting, pulled from the + /// per-setting docs catalog. Shown alongside Current/Default so the user can + /// see the suggested target at a glance. Empty (and hidden) when the setting + /// has no documented recommendation. + /// + public string RecommendedText + { + get + { + var rec = SettingDocsCatalog.Get(SettingId)?.Recommended; + return string.IsNullOrWhiteSpace(rec) ? string.Empty : $"Recommended: {rec}"; + } + } + public Visibility RecommendedTextVisibility => + string.IsNullOrEmpty(RecommendedText) ? Visibility.Collapsed : Visibility.Visible; + public bool Monitor { get => _pref.Monitor; @@ -1763,6 +1784,22 @@ public sealed class ServiceRow : INotifyPropertyChanged public Visibility LearnMoreVisibility => string.IsNullOrEmpty(LearnMoreContent) ? Visibility.Collapsed : Visibility.Visible; + /// + /// GamerGuardian's recommended startup state for this service, pulled from the + /// per-setting docs catalog. Shown alongside Current/Default. Empty (and + /// hidden) when the service has no documented recommendation. + /// + public string RecommendedText + { + get + { + var rec = SettingDocsCatalog.Get(SettingId)?.Recommended; + return string.IsNullOrWhiteSpace(rec) ? string.Empty : $"Recommended: {rec}"; + } + } + public Visibility RecommendedTextVisibility => + string.IsNullOrEmpty(RecommendedText) ? Visibility.Collapsed : Visibility.Visible; + public bool Monitor { get => _pref.Monitor; diff --git a/tests/GamerGuardian.Tests/SettingDocsTests.cs b/tests/GamerGuardian.Tests/SettingDocsTests.cs index 47a0adc..7c431a9 100644 --- a/tests/GamerGuardian.Tests/SettingDocsTests.cs +++ b/tests/GamerGuardian.Tests/SettingDocsTests.cs @@ -103,4 +103,26 @@ public void VerifyCommandFor_DoSvc_QueriesPolicyValue() // sc qc would query the Services hive; the policy verify shouldn't. Assert.DoesNotContain("sc qc", cmd); } + + [Fact] + public void Catalog_EveryEntry_HasRecommendation() + { + // The Settings UI shows "Recommended: {x}" next to Current/Default for + // every documented setting (GlobalToggleRow / ServiceRow.RecommendedText). + // A blank Recommended would render an empty/hidden line, so guard against + // any catalog entry shipping without one. + foreach (var d in SettingDocsCatalog.All) + Assert.False(string.IsNullOrWhiteSpace(d.Recommended), + $"no Recommended for {d.SettingId}"); + } + + [Fact] + public void Catalog_Get_ResolvesRecommendation_ForToggleAndServiceIds() + { + // RecommendedText is built from SettingDocsCatalog.Get(SettingId).Recommended. + // Spot-check the id shapes the toggle/service rows actually pass. + Assert.False(string.IsNullOrWhiteSpace(SettingDocsCatalog.Get("ai.copilot")?.Recommended)); + Assert.False(string.IsNullOrWhiteSpace(SettingDocsCatalog.Get("service:DiagTrack")?.Recommended)); + Assert.False(string.IsNullOrWhiteSpace(SettingDocsCatalog.Get("powerplan")?.Recommended)); + } }