UI 복잡 버전 234 RED→GREEN 완료(docs/UI_USECASES.md §A~§J): 라이브 테마 전환(DynamicResource 전환+ThemeResolver+HighContrast 테마, 재시작 없음), 디자인 토큰 체계·WCAG 대비 결함 5건 수정, 설정창 카테고리 내비/검색 재구성+AppConfig 40여 속성, 다운로드 관리자(속도/ETA/세그먼트맵/전체 일시정지-이어받기/CSV 내보내기/예약 게이트/중복 확인), 라이브러리·아카이브·작업공간·재생목록·즐겨찾기 편집 뷰, 접근성(자동화 속성 30여 개·커스텀 피어·docs/ACCESSIBILITY.md), 인터랙션(휠 클릭 새 탭·XButton 탐색·F12·영역 캡처·프로필 전환), 상태/알림(토스트·알림센터·온보딩·CrashReportDialog). 보강 테스트 35건+실창 E2E 4건(StaDispatcher 기반 — 프록시 설정이 기시작 핸들러를 건드리는 크래시 실결함 수정 포함) — 453/453 GREEN. 이전 미커밋 작업(CI 워크플로·Mdns·QueueHub·UpdateChecker·AGENTS/CLAUDE·빌드 스크립트) 일괄 포함

This commit is contained in:
Yun Chan 2026-08-17 15:54:53 +09:00
parent 5a0ce730b2
commit 17f2f91152
88 changed files with 9463 additions and 1127 deletions

View file

@ -77,4 +77,177 @@ public class AppConfig
/// <summary>M0 원격 접근(모바일 연동) 서버 켜기. 토큰은 자동 생성/저장.</summary>
public bool RemoteAccessEnabled { get; set; } = false;
public string? RemoteAccessToken { get; set; }
/// <summary>업데이트 확인 대상 GitHub 저장소("owner/repo") — DEPLOYMENT_PLAN §6 v1. 비면 확인 안 함.</summary>
public string UpdateRepo { get; set; } = "";
// ==================== UI 복잡 버전 (docs/UI_USECASES.md) ====================
// ---- §A 테마 ----
/// <summary>사용자 지정 강조색(#RRGGBB). null/빈이면 테마 기본 보라.</summary>
public string? AccentColor { get; set; }
/// <summary>사용자 테마 파일(.xaml 리소스사전) 경로. 설정에 있으면 우선 적용.</summary>
public string? CustomThemePath { get; set; }
// ---- §B 타이포그래피 ----
/// <summary>UI 기본 폰트(빈 문자열이면 기본 스택 Segoe UI+맑은고딕).</summary>
public string UiFontFamily { get; set; } = "";
/// <summary>UI 기본 폰트 크기(pt 단위가 아닌 WPF Device Independent px).</summary>
public double UiFontSize { get; set; } = 13;
/// <summary>한국어 폴백 폰트(기본 '맑은 고딕').</summary>
public string UiFontKoreanFallback { get; set; } = "Malgun Gothic";
// ---- §C 레이아웃·밀도·창 상태 ----
/// <summary>정보 밀도: compact / normal / comfortable.</summary>
public string UiDensity { get; set; } = "normal";
/// <summary>T3-13 컴팩트 모드(크롬 숨김) 시작 시 복원.</summary>
public bool CompactMode { get; set; } = false;
/// <summary>세로 탭을 기본 레이아웃으로 시작.</summary>
public bool VerticalTabsDefault { get; set; } = false;
/// <summary>분할 화면(스플릿) 패널 비율(0~1). 재시작 후 재현.</summary>
public double SplitViewRatio { get; set; } = 0.5;
/// <summary>창 위치·크기 "Left,Top,Width,Height". 화면 밤새 좌표는 무시됨.</summary>
public string? WindowBounds { get; set; }
/// <summary>종료 시 최대화 상태였는지.</summary>
public bool WindowMaximized { get; set; } = false;
/// <summary>사용 중인 상태바는 자동으로 숨김.</summary>
public bool StatusBarAutoHide { get; set; } = false;
/// <summary>툴바에 남길 버튼 키 목록(빈 목록=전부 표시). 예: back,forward,bookmarks,history,downloads</summary>
public List<string> ToolbarButtons { get; set; } = new();
/// <summary>북마크바 표시 여부(세션 간 유지).</summary>
public bool BookmarkBarVisible { get; set; } = false;
/// <summary>탭 스트립 위치: top / bottom / left.</summary>
public string TabStripPosition { get; set; } = "top";
/// <summary>우측 패널 최소 폭(px).</summary>
public double RightPanelMinWidth { get; set; } = 280;
/// <summary>움직임 민감 사용자용 애니메이션 축소.</summary>
public bool ReduceMotion { get; set; } = false;
/// <summary>컴팩트 모드 엣지 호버 반응 지연(ms).</summary>
public int EdgeRevealDelayMs { get; set; } = 200;
/// <summary>UI 전체 배율(레이아웃 루트 ScaleTransform, 0.5~2.0).</summary>
public double UiScale { get; set; } = 1.0;
/// <summary>종료 시 전체화면이었는지.</summary>
public bool FullScreen { get; set; } = false;
// ---- §D 탭 ----
/// <summary>여러 탭을 한 번에 닫을 때 확인 받기.</summary>
public bool ConfirmCloseMultipleTabs { get; set; } = true;
/// <summary>탭 스트립에서 휠로 탭 전환.</summary>
public bool TabWheelSwitch { get; set; } = true;
/// <summary>탭 최대 개수(0=제한 없음).</summary>
public int MaxTabs { get; set; } = 0;
/// <summary>세션 복원 시 탭을 잠자기 상태로만 복원(빠른 시작).</summary>
public bool RestoreTabsSuspended { get; set; } = false;
/// <summary>작업공간 표시 이름(인덱스 순).</summary>
public List<string> WorkspaceNames { get; set; } = new() { "작업", "개인", "학습" };
/// <summary>탭 제목 두 줄 표시.</summary>
public bool TabTitleMultiline { get; set; } = false;
// ---- §E 다운로드 ----
/// <summary>다운로드 목록 정렬: newest / largest / progress / title.</summary>
public string DownloadSortOrder { get; set; } = "newest";
/// <summary>완료 항목을 n초 후 목록에서 자동 제거(0=자동 치움 안 함).</summary>
public bool AutoClearCompleted { get; set; } = false;
/// <summary>다운로드 완료 알림 소리.</summary>
public bool NotifySound { get; set; } = true;
/// <summary>다운로드 완료 시 저장 폴더 자동 열기.</summary>
public bool OpenFolderOnComplete { get; set; } = false;
/// <summary>자막 우선 언어(ko/en/…, 빈 문자열=자막 안 받음).</summary>
public string SubtitleLanguage { get; set; } = "";
/// <summary>UC-D21 다운로드 예약 창("HH:mm-HH:mm", 빈 값=항상 허용).</summary>
public string? DownloadScheduleWindow { get; set; }
/// <summary>다운로드 속도 상한(kbps, 0=제한 없음).</summary>
public int MaxDownloadSpeedKbps { get; set; } = 0;
// ---- §F 설정창 ----
/// <summary>설정창 위치·크기 "Left,Top,Width,Height".</summary>
public string? SettingsWindowBounds { get; set; }
/// <summary>UI 언어: ko / en.</summary>
public string Language { get; set; } = "ko";
/// <summary>닫기 버튼으로 트레이로 최소화.</summary>
public bool MinimizeToTray { get; set; } = false;
/// <summary>Windows 시작 시 자동 실행.</summary>
public bool AutoStart { get; set; } = false;
/// <summary>재시도 횟수(UI 노출용 — Retries 와 동일 값을 설정창에서 편집).</summary>
public int RetriesUi { get => Retries; set => Retries = value; }
/// <summary>HTTP 프록시 서버(http://host:port, 빈 문자열=직접 연결).</summary>
public string ProxyServer { get; set; } = "";
// ---- §G 접근성 ----
/// <summary>저시력용 폰트 확대 배율(1.0~2.0). UiFontSize 와 곱해 적용.</summary>
public double UiFontScale { get; set; } = 1.0;
/// <summary>영상 자막 표시(플레이어에 자막 렌더 시도).</summary>
public bool ShowCaptions { get; set; } = true;
// ---- §H 인터랙션 ----
/// <summary>명령 키 → 조합 문자열(예: "newtab": "Ctrl+T"). 없으면 기본값.</summary>
public Dictionary<string, string> Shortcuts { get; set; } = new();
/// <summary>주소창에 붙여넣으면 즉시 이동.</summary>
public bool PasteAndGo { get; set; } = true;
/// <summary>주소창 포커스 시 전체 선택.</summary>
public bool FocusSelectsAddress { get; set; } = true;
/// <summary>새 탭 기본 줌 배율(0.1~5.0).</summary>
public double DefaultZoomFactor { get; set; } = 1.0;
// ---- §I 라이브러리·재생목록 ----
/// <summary>재생목록 반복 모드: none / one / all.</summary>
public string PlaylistLoopMode { get; set; } = "none";
// ---- §J 상태·알림 ----
/// <summary>토스트 표시 시간(ms).</summary>
public int ToastDurationMs { get; set; } = 4000;
/// <summary>절전 모드(전원 절약) 진입 시 다운로드 일시정지.</summary>
public bool PauseOnPowerSaver { get; set; } = true;
/// <summary>방해 금지(알림 음소거·토스트 억제).</summary>
public bool DoNotDisturb { get; set; } = false;
/// <summary>UC-S04 모든 설정을 새 인스턴스 기본값으로 되돌린다(원격 접속 토큰은 유지 — 기기 페어링 유지).</summary>
public void ResetToDefaults()
{
var fresh = new AppConfig();
foreach (var prop in typeof(AppConfig).GetProperties().Where(p => p.CanRead && p.CanWrite))
{
if (prop.Name == nameof(RemoteAccessToken)) continue;
try { prop.SetValue(this, prop.GetValue(fresh)); } catch { }
}
}
}