JJ_MKVMaker/lib/ui/reader/reader_ai.dart

42 lines
2.4 KiB
Dart

// 보기 화면 AI 모듈: 이 장 해상도 올리기 (121) · 품질 올리기 · AI 그림 바탕 (123)
//
// 약속
// - 입력: 화면의 [BuildContext] (닫혔는지 context.mounted 로 본다) · 앱 ([AppController] - 설정 · 서비스) · 그림 원본 · 장 번호
// - 출력: [upscaleReaderPage] 는 올린 그림으로 바꿔 볼 경로 (설정이 '올린 것으로 보기' 이고 이 기기의 그림 파일일 때만, 아니면 null).
// [readerAiSource] 는 AI 그림의 바탕이 될 이 기기의 그림 경로 (없으면 null)
// - 오류: 파일을 못 꺼내거나 취소하면 null. AI 창 (ai_upscale_ui) 의 오류 처리를 그대로 쓴다
// 원본 · ZIP 은 그대로 두고 새 파일로 저장한다. 다른 보기 화면도 다시 쓸 수 있다.
import 'package:flutter/widgets.dart';
import '../../app/app_controller.dart';
import '../../core/reader_sources.dart';
import '../../core/vfs.dart';
import '../ai_upscale_ui.dart';
/// [page] 장의 해상도를 올려 새 파일로 저장한다. 저장한 뒤 올린 것으로 계속 볼 경로 (설정) - 이 기기의 그림 파일 목록일 때만
Future<String?> upscaleReaderPage(BuildContext context, AppController c, ReaderSource src, int page) async {
final file = await readerPageFile(c, src, page);
if (file == null || !context.mounted) return null;
final saved = await upscaleOne(context, c, input: file.$1, nameFrom: file.$2, outDir: file.$3);
if (saved == null || !context.mounted) return null;
final s = src;
if (c.settings.aiUpAfter == 'upscaled' && s is ImageFilesSource && !isDav(s.paths[page])) return saved;
return null;
}
/// [page] 장의 품질을 올려 새 파일로 저장한다
Future<void> qualityReaderPage(BuildContext context, AppController c, ReaderSource src, int page) async {
final file = await readerPageFile(c, src, page);
if (file == null || !context.mounted) return;
await qualityUp(context, c, input: file.$1, nameFrom: file.$2, outDir: file.$3);
}
/// 지금 보는 그림 파일 (이 기기의 그림 파일일 때, AI 그림 컴포넌트가 켜져 있을 때). [hasPages] 볼 장이 있는지
String? readerAiSource(AppController c, ReaderSource src, int page, {required bool hasPages}) {
final s = src;
if (!c.settings.components.contains('aiimage') || s is! ImageFilesSource || !hasPages) return null;
final path = s.paths[page];
return isDav(path) ? null : path;
}