import 'dart:io'; import 'settings_group.dart'; /// 약속 (설정 A): 환경 설정 > 실행 · 종료 · 업데이트 - 자기 키 (이름 · 처음 값 · 읽기 · 쓰기) 를 스스로 갖는다. /// 설정 하나를 더할 때는 이 파일만 고친다. 저장 파일의 키 이름은 예전 그대로 (평평한 키) class RunSettings implements SettingsGroup { /// 최소화하면 작업 표시줄 대신 트레이로 bool minimizeToTray = true; /// 종료 (창 X · 종료 버튼) 를 눌렀을 때: /// 'background' 창만 숨기고 다운로드 · 변환 계속 / 'quit' 묻지 않고 모두 종료 / 'ask' 매번 고르기 String closeAction = 'background'; /// 창 보이기 단축키 (예: Ctrl+Shift+X) String showHotkey = 'Ctrl+Shift+X'; /// 99 (Windows): 시작 메뉴에 등록 - 알림이 JJ_MKVMaker 로 보이고 눌러서 열린다 bool startMenuShortcut = true; /// 백그라운드로 실행 (Android): 켜면 ← 로 닫거나 최근 앱에서 밀어도 동기화 · MKV 만들기 · 다운로드를 계속한다 (알림에 표시). /// 끄면 지금처럼 닫을 때 끝난다. Windows 는 [closeAction] 'background' 가 같은 뜻 ([backgroundRun]). bool inBackground = true; /// 시작할 때 새 버전 확인 (하루 한 번) bool autoCheckUpdates = true; String lastUpdateCheck = ''; /// [lastUpdateCheck] 를 한 버전 (같은 설정 파일을 쓰는 다른 버전이 확인했으면 다시 확인) String lastUpdateCheckVersion = ''; /// 마지막으로 이 설정을 쓴 (실행한) 버전. 예전 버전은 이 항목을 몰라 저장하면서 지운다 → /// 돌아온 버전이 자기 것이 아니면 보관해 둔 그 버전의 설정을 되살릴지 묻는다 (VersionSnapshot) String lastRunVersion = ''; /// P0 (Android 되돌리기): 받은 AI 모델을 공용 폴더에 옮겨 두었다가 되살릴지. '' = 남은 공간이 모델의 2배 이상이면 켬 · 'on' · 'off' String rollbackKeepModels = ''; /// "이 버전 건너뛰기" 한 버전 String skippedVersion = ''; /// 백그라운드로 실행 (설정 화면의 체크 하나). Windows: 창 ✕ 를 누르면 트레이로 (끄면 종료), Android: [inBackground] bool get backgroundRun => Platform.isWindows ? closeAction == 'background' : inBackground; set backgroundRun(bool v) { if (Platform.isWindows) { closeAction = v ? 'background' : 'quit'; } else { inBackground = v; } } @override void write(Map j, {required bool plainSecrets}) { j['minimizeToTray'] = minimizeToTray; j['closeAction'] = closeAction; j['showHotkey'] = showHotkey; j['runInBackground'] = inBackground; j['startMenuShortcut'] = startMenuShortcut; j['autoCheckUpdates'] = autoCheckUpdates; j['lastUpdateCheck'] = lastUpdateCheck; j['lastUpdateCheckVersion'] = lastUpdateCheckVersion; j['lastRunVersion'] = lastRunVersion; j['rollbackKeepModels'] = rollbackKeepModels; j['skippedVersion'] = skippedVersion; j['backgroundV2'] = true; } @override void read(Map j) { minimizeToTray = j['minimizeToTray'] as bool? ?? true; closeAction = const ['background', 'quit', 'ask'].contains(j['closeAction']) ? j['closeAction'] as String : 'background'; showHotkey = j['showHotkey'] as String? ?? 'Ctrl+Shift+X'; startMenuShortcut = j['startMenuShortcut'] != false; // 사용자 결정 (10/8): 기본 켜짐. 예전 기본 (꺼짐) 은 한 번 켜짐으로 inBackground = j['backgroundV2'] == true ? j['runInBackground'] != false : true; autoCheckUpdates = j['autoCheckUpdates'] as bool? ?? true; lastUpdateCheck = j['lastUpdateCheck'] as String? ?? ''; lastUpdateCheckVersion = j['lastUpdateCheckVersion'] as String? ?? ''; lastRunVersion = j['lastRunVersion'] as String? ?? ''; rollbackKeepModels = const ['on', 'off'].contains(j['rollbackKeepModels']) ? j['rollbackKeepModels'] as String : ''; skippedVersion = j['skippedVersion'] as String? ?? ''; } }