From 0205df0b2e8e2f25e149fbf08042cf568e6cee78 Mon Sep 17 00:00:00 2001 From: Filipe Moreira Date: Mon, 9 Nov 2026 09:56:19 -0300 Subject: [PATCH] fix: keep the settings this version doesn't know when saving config.json is shared with the Legacy build (1.6.2's interfaces, published next to 1.7.0), which has two settings this version dropped (uiMode, tourDone). Saving used to discard them, so going back to Legacy showed its tour again and forgot the interface picked there. AppConfig now keeps unknown members (JsonExtensionData) and BuildConfig hands them back. Co-Authored-By: Claude Fable 5.1 --- CHANGELOG.en-US.md | 2 ++ CHANGELOG.md | 2 ++ src/ConsoleMode/Models/Models.cs | 6 ++++++ src/ConsoleMode/ViewModels/MainViewModel.cs | 1 + tests/ConsoleMode.Tests/AppConfigTests.cs | 23 +++++++++++++++++++++ 5 files changed, 34 insertions(+) diff --git a/CHANGELOG.en-US.md b/CHANGELOG.en-US.md index 25a4fa8..304fc47 100644 --- a/CHANGELOG.en-US.md +++ b/CHANGELOG.en-US.md @@ -3,6 +3,8 @@ English (US) release notes, mirroring CHANGELOG.md (Brazilian Portuguese). Before publishing a version, add a `## [VERSION]` section to **both** files: the workflow publishes the section matching the tag from each one and fails if either is missing. ## [Unreleased] +### Fixes +- Settings: `config.json` keeps the settings this version doesn't know instead of dropping them on save. It is what lets you switch between the current version and **Legacy** (the old interface, published next to 1.7.0) without losing anything on either side. (#201) ## [1.7.0-beta.4] ### What's new diff --git a/CHANGELOG.md b/CHANGELOG.md index 2660de3..cd322a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ Notas em português do Brasil; a versão em inglês (Estados Unidos) fica em `CHANGELOG.en-US.md`. Antes de publicar uma versão, adicione uma seção `## [VERSÃO]` com o changelog daquela versão **nos dois arquivos**. O workflow publica as duas seções correspondentes à tag na mesma release e falha se faltar alguma. ## [Unreleased] +### Correções +- Ajustes: o `config.json` guarda de volta os ajustes que esta versão não conhece em vez de descartá-los ao salvar. É o que deixa trocar entre a versão atual e a **Legacy** (a interface antiga, publicada junto da 1.7.0) sem perder nada dos dois lados. (#201) ## [1.7.0-beta.4] ### Novidades diff --git a/src/ConsoleMode/Models/Models.cs b/src/ConsoleMode/Models/Models.cs index 9c74c26..e2facbd 100644 --- a/src/ConsoleMode/Models/Models.cs +++ b/src/ConsoleMode/Models/Models.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using System.Text.Json.Serialization; using ConsoleMode.Services; @@ -7,6 +8,11 @@ public sealed class AppConfig { /// 2 = monitor fields hold ; 0/1 = GDI names (\\.\DISPLAYn). public int Version { get; set; } + /// + /// Settings this version doesn't have: the Legacy build's (which interface it shows, its tour) or a newer + /// version's. Kept as they came and saved back, so switching between builds loses nothing on either side. + /// + [JsonExtensionData] public Dictionary? OtherSettings { get; set; } /// Empty until the user (or the installer) picks one; the app then follows Windows. public string AppLanguage { get; set; } = ""; public string FocusMonitor { get; set; } = ""; diff --git a/src/ConsoleMode/ViewModels/MainViewModel.cs b/src/ConsoleMode/ViewModels/MainViewModel.cs index 069accb..c2557cc 100644 --- a/src/ConsoleMode/ViewModels/MainViewModel.cs +++ b/src/ConsoleMode/ViewModels/MainViewModel.cs @@ -875,6 +875,7 @@ private AppConfig BuildConfig() var auto = audioId == ConsoleEngine.AudioOnConnectId; var config = new AppConfig { + OtherSettings = _loadedConfig.OtherSettings, AppLanguage = SelectedLanguage?.Value ?? LocalizationService.Language, // Listing failed: keep the saved screens instead of wiping them. FocusMonitor = _loadedConfig.FocusMonitor, diff --git a/tests/ConsoleMode.Tests/AppConfigTests.cs b/tests/ConsoleMode.Tests/AppConfigTests.cs index 2509402..aadc6a5 100644 --- a/tests/ConsoleMode.Tests/AppConfigTests.cs +++ b/tests/ConsoleMode.Tests/AppConfigTests.cs @@ -6,6 +6,29 @@ namespace ConsoleMode.Tests; public class AppConfigTests { + // The Legacy build (1.6.2's interfaces) shares config.json and has settings this version dropped. + [Fact] + public void Settings_of_another_build_survive_a_save() + { + var options = new System.Text.Json.JsonSerializerOptions + { + PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase, + DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull + }; + var config = System.Text.Json.JsonSerializer.Deserialize( + """{ "version": 2, "uiMode": "desktop", "tourDone": true, "parkPointer": false }""", options)!; + Assert.False(config.ParkPointer); + + config.HdrEnable = true; + using var saved = System.Text.Json.JsonDocument.Parse(System.Text.Json.JsonSerializer.Serialize(config, options)); + Assert.Equal("desktop", saved.RootElement.GetProperty("uiMode").GetString()); + Assert.True(saved.RootElement.GetProperty("tourDone").GetBoolean()); + Assert.True(saved.RootElement.GetProperty("hdrEnable").GetBoolean()); + // Nothing extra in a config of its own. + Assert.Null(new AppConfig().OtherSettings); + Assert.DoesNotContain("otherSettings", System.Text.Json.JsonSerializer.Serialize(new AppConfig(), options)); + } + [Fact] public void Copy_for_a_session_swaps_only_the_monitor_fields() {