/// 약속: 탐색기 메뉴 · 두 번째 실행 · 알림에서 온 요청 ([LaunchRequest]) 을 처리한다 (Windows). /// 창을 보이고, 첫 화면이 뜰 때까지 (최대 10초) 기다린 뒤 - 재생 · AI 자막 · 실시간 동기화 화면 · 목록에 넣기 (설정에 따라 재생). /// 어느 쪽이든 동영상은 MKV 화면의 목록에 들어간다. library; import 'dart:async'; import 'package:flutter/material.dart'; import 'package:path/path.dart' as p; import '../app/app_controller.dart'; import '../core/playlist.dart'; import '../ui/ai_dialog.dart'; import '../ui/player_page.dart' show playFiles; import '../ui/monitor_page.dart' show MonitorPage; Future handleLaunchRequest(LaunchRequest req, AppController controller, GlobalKey navigatorKey) async { await controller.services.shell.show(); // 99: 동기화가 멈췄다는 알림을 누름 → 실시간 동기화 화면 if (req.action == LaunchAction.lsync) { for (var i = 0; i < 100 && navigatorKey.currentState == null; i++) { await Future.delayed(const Duration(milliseconds: 100)); } final nav = navigatorKey.currentState; if (nav != null) unawaited(nav.push(MaterialPageRoute(builder: (_) => MonitorPage(c: controller, initialTab: 1)))); return; } if (req.files.isEmpty) return; // 프로그램을 파일과 함께 처음 켠 경우: 첫 화면이 뜰 때까지 (최대 10초) 기다린다 for (var i = 0; i < 100 && navigatorKey.currentContext == null; i++) { await Future.delayed(const Duration(milliseconds: 100)); } final ctx = navigatorKey.currentContext; if (ctx == null || !ctx.mounted) return; switch (req.action) { case LaunchAction.play: // 재생한 동영상도 MKV 화면의 목록에 넣는다 unawaited(controller.addVideos(req.files.where(isVideoFile).toList(), allowOutputFolder: true)); await playFiles(ctx, controller, req.files); case LaunchAction.subtitle: await controller.addVideos(req.files.where(isVideoFile).toList(), allowOutputFolder: true); final targets = controller.videos.where((v) => req.files.any((f) => p.equals(f, v.path))).toList(); if (targets.isNotEmpty && ctx.mounted) { controller.select(targets.first); await showAiDialog(ctx, controller, targets.first, targets: targets); } case LaunchAction.lsync: break; // 위에서 처리 case LaunchAction.add: // 탐색기 더블클릭 · 연결 프로그램: 설정에 따라 재생 또는 편집 목록에 추가 final videos = req.files.where(isVideoFile).toList(); if (videos.isEmpty) return; // 어느 쪽이든 MKV 화면의 목록에는 들어간다 final added = controller.addVideos(videos, allowOutputFolder: true); if (controller.settings.playback.openFileAction == 'add') { await added; final first = controller.videos.where((v) => videos.any((f) => p.equals(f, v.path))).firstOrNull; if (first != null) controller.select(first); } else { unawaited(added); await playFiles(ctx, controller, videos); } } }