using System; using System.Text.Json; using System.Text.Json.Nodes; namespace UbisamBase.Core.Settings; /// /// UiSettingsService.json 에서 한 항목만 읽고 고쳐 쓴다(MergeHub 11차 F-4). /// /// 아래 탭 줄 접기는 누를 때마다 바로 기억해야 한다. 그런데 는 /// 지금 메모리의 값을 통째로 쓰므로, 설정 화면에서 바꾸고 아직 [저장] 하지 않은 테마 · 배율까지 함께 저장된다. /// 그래서 파일의 다른 값(모르는 항목 포함)은 그대로 두고 이 항목만 바꾼다. /// public static class UiSettingsFile { public const string NavCollapsedKey = "NavCollapsed"; private static readonly JsonSerializerOptions Indented = new() { WriteIndented = true }; /// 아래 탭 줄을 접어 둔 상태인지. 항목이 없거나 글이 망가졌으면 펼침(false). public static bool ReadNavCollapsed(string? json) { try { return Parse(json) is JsonObject obj && obj[NavCollapsedKey] is JsonValue value && value.TryGetValue(out bool collapsed) && collapsed; } catch (Exception e) when (e is JsonException || e is InvalidOperationException || e is FormatException) { return false; } } /// /// 접기 항목만 바꾼 글. 글이 없거나 망가졌으면 그 항목만 든 새 글 - 망가진 파일은 어차피 /// 가 무시하고 기본값을 쓴다. /// public static string WithNavCollapsed(string? json, bool collapsed) { JsonObject obj; try { obj = Parse(json) as JsonObject ?? new JsonObject(); } catch (JsonException) { obj = new JsonObject(); } obj[NavCollapsedKey] = collapsed; return obj.ToJsonString(Indented); } private static JsonNode? Parse(string? json) { if (string.IsNullOrWhiteSpace(json)) return null; return JsonNode.Parse(json!.TrimStart('')); } }