65 lines
3.1 KiB
Dart
65 lines
3.1 KiB
Dart
/// 약속: 탐색기 메뉴 · 두 번째 실행 · 알림에서 온 요청 ([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<void> handleLaunchRequest(LaunchRequest req, AppController controller, GlobalKey<NavigatorState> 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<void>.delayed(const Duration(milliseconds: 100));
|
|
}
|
|
final nav = navigatorKey.currentState;
|
|
if (nav != null) unawaited(nav.push(MaterialPageRoute<void>(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<void>.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);
|
|
}
|
|
}
|
|
}
|