데스크톱 T3 잔여 완성 + 스타일 폴리시: 도메인 라우팅(WorkspaceRoutingRules 자동 워크스페이스 전환), 탭 아카이브(TabArchive 영속·팔레트 복구), 페이지 액션(흑백/세피아 필터), 노트 패널(NotesStore+플라이아웃), 컴팩트 모드(크롬 숨김+엣지 호버). 스타일: 한국어 폰트 폴백, 암시 폰트 통일, 다크 툴팁, 텍스트 대비 상향. UpdateNavState dispose 가드. 164/164 GREEN + 실창 스크린샷 검증

This commit is contained in:
Yun Chan 2026-08-16 08:46:54 +09:00
parent 04ff0ff93d
commit f380518919
12 changed files with 594 additions and 24 deletions

View file

@ -0,0 +1,63 @@
using System.Text.Json;
namespace VideoDownloader.Browser;
public sealed record NoteItem(string Id, string Title, string Body, DateTime CreatedAt);
/// <summary>T3-12: 노트 패널 저장소 — 마크다운 텍스트 노트 추가·검색·삭제, JSON 영속.</summary>
public sealed class NotesStore
{
private readonly string _path;
private readonly object _gate = new();
private List<NoteItem> _items;
public NotesStore(string path)
{
_path = path;
try
{
if (File.Exists(path))
_items = JsonSerializer.Deserialize<List<NoteItem>>(File.ReadAllText(path)) ?? new();
}
catch { }
_items ??= new List<NoteItem>();
}
public string Add(string title, string body)
{
var note = new NoteItem(Guid.NewGuid().ToString("N"), title, body, DateTime.Now);
lock (_gate)
{
_items.Insert(0, note);
try
{
Directory.CreateDirectory(Path.GetDirectoryName(_path)!);
File.WriteAllText(_path, JsonSerializer.Serialize(_items));
}
catch { }
}
return note.Id;
}
public List<NoteItem> List()
{
lock (_gate) return _items.ToList();
}
public List<NoteItem> Search(string query)
{
var q = query?.Trim() ?? "";
return List().Where(n => q.Length == 0 ||
n.Title.Contains(q, StringComparison.OrdinalIgnoreCase) ||
n.Body.Contains(q, StringComparison.OrdinalIgnoreCase)).ToList();
}
public void Delete(string id)
{
lock (_gate)
{
_items.RemoveAll(n => n.Id == id);
try { File.WriteAllText(_path, JsonSerializer.Serialize(_items)); } catch { }
}
}
}