import 'settings_group.dart'; /// 약속 (설정 A): 환경 설정 > 보기 화면 (그림 · 만화 · PDF · 문서) - 자기 키 (이름 · 처음 값 · 읽기 · 쓰기) 를 스스로 갖는다. /// 설정 하나를 더할 때는 이 파일만 고친다. 저장 파일의 키 이름은 예전 그대로 (평평한 키) class ReaderSettings implements SettingsGroup { /// 보기: 'page' 한 쪽 맞추기 · 'width' 좌우 맞추기 (세로로 밀어 봄) String fit = 'page'; /// 보기: 오른쪽에서 왼쪽으로 넘김 (일본 만화) bool rtl = false; /// 보기: 밝기 (-0.7 어둡게 ~ 0.7 밝게) double brightness = 0; /// 30 · 101: 보기 화면에서 위 · 아래 시스템 막대 (시계 · 알림 · 뒤로) 를 그대로 보이기 (기본: 보임 - 기기의 평소 동작, 화면 가득은 버튼 · 설정으로) bool systemBars = true; /// 117: 보기 화면 "계속 보기" 간격 (초, 1 ~ 60) int autoSeconds = 3; /// X-plore 맞추기 (관리자 지시 10/20): 그림 보기 화면 아래 갤러리 줄 (썸네일, 누르면 그 장으로). 처음 끔 bool gallery = false; /// X-plore 맞추기 (관리자 지시 10/20): 보기 화면에서 볼륨 키로 넘기기 (아래 = 다음 장, 위 = 이전 장, Android). 처음 끔. /// 보기 화면에서만 가로챈다 (동영상 · 다른 화면의 볼륨은 그대로) bool volumeKeys = false; /// 119: 한 장에 두 쪽이 붙은 그림을 반씩 나눠 보기 - 'auto' 가로가 세로보다 긴 그림만 · 'on' 늘 · 'off' 안 함 String split = 'auto'; /// ZIP · CBZ 를 두 번 누르면 안의 그림을 만화처럼 보기 (끄면 목록). 기본은 목록 (사용자 지시) bool zipComic = false; @override void write(Map j, {required bool plainSecrets}) { j['readerFit'] = fit; j['readerRtl'] = rtl; j['readerBrightness'] = brightness; j['readerSystemBars'] = systemBars; j['readerAutoSeconds'] = autoSeconds; j['readerGallery'] = gallery; j['readerVolumeKeys'] = volumeKeys; j['readerSplit'] = split; j['zipComic'] = zipComic; // 예전 기본값 (만화 보기 켜짐) 은 지시와 반대였으므로 한 번 꺼진 상태 (목록) 로 j['zipComicV2'] = true; } @override void read(Map j) { fit = j['readerFit'] == 'width' ? 'width' : 'page'; rtl = j['readerRtl'] as bool? ?? false; brightness = ((j['readerBrightness'] as num?)?.toDouble() ?? 0).clamp(-0.7, 0.7); systemBars = j['readerSystemBars'] != false; autoSeconds = ((j['readerAutoSeconds'] as num?)?.toInt() ?? 3).clamp(1, 60); gallery = j['readerGallery'] as bool? ?? false; volumeKeys = j['readerVolumeKeys'] as bool? ?? false; split = const ['auto', 'on', 'off'].contains(j['readerSplit']) ? j['readerSplit'] as String : 'auto'; zipComic = j['zipComic'] == true && j['zipComicV2'] == true; } }