JJ_MKVMaker/lib/startup/second_window.dart

51 lines
2.6 KiB
Dart

/// 약속: 탐색기에서 연 동영상의 새 재생 창 (Windows). 설정은 읽기만 하고 저장하지 않으며, 동영상 목록은 원래 창과 같은 파일로 맞춘다.
library;
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path/path.dart' as p;
import 'package:window_manager/window_manager.dart';
import '../app/app_controller.dart';
import '../app/net_guard.dart';
import '../ui/master_prompt.dart';
import '../app/settings.dart';
import '../platform/windows/single_instance.dart';
import '../platform/windows/window_memory.dart';
import '../services/platform_services.dart';
import '../ui/player_page.dart';
import '../app/i18n_controller.dart';
import '../main.dart';
/// 탐색기에서 연 동영상의 새 창: 바로 재생하고, ← 로 나오면 같은 동영상 목록의 MKV 화면.
/// 트레이 · 단축키 · 다운로드 · 브라우저는 원래 창이 맡는다. 닫으면 이 창만 끝난다.
/// 동영상 목록은 원래 창과 같은 파일을 보므로 어느 창에서 넣거나 지워도 서로 맞춰진다.
/// 설정은 읽기만 한다 (원래 창의 설정 파일을 덮어쓰지 않도록 저장하지 않음).
Future<void> runSecondWindow(List<String> files, String dataDir) async {
HttpOverrides.global = JjHttpOverrides(); // DNS 강제: HttpClient 를 만들기 전에 (main 과 같은 까닭)
await windowManager.ensureInitialized();
await windowManager.setTitle(appTitle);
await WindowMemory(p.join(dataDir, 'window.json'), 'second').restoreAndWatch();
final controller = AppController(PlatformServices.create());
await controller.init();
await setupNetwork(controller, dataDir, second: true);
// 화면 언어 (환경 설정 > 화면 언어)
i18n.init(controller, dataDir);
await i18n.apply(controller.settings.display.language, save: false);
final store = SettingsStore();
controller.settings = await store.load();
final navigatorKey = GlobalKey<NavigatorState>();
// 124: 이 창도 저장된 비밀번호 (WebDAV 재생) 를 쓰기 전에 마스터를 묻는다 (풀린 상태는 창마다)
await setupMasterLock(controller, secrets: store.secrets);
attachMasterPrompt(navigatorKey);
runApp(JjMkvMakerApp(controller: controller, navigatorKey: navigatorKey, onExit: endProcessNow));
WidgetsBinding.instance.addPostFrameCallback((_) async {
await controller.shareVideoList(p.join(dataDir, 'videos.json'));
unawaited(controller.addVideos(files, allowOutputFolder: true));
final ctx = navigatorKey.currentContext;
if (ctx != null && ctx.mounted) await playFiles(ctx, controller, files);
});
}