From cba094dbab1970c38bed93013090b4130d86e439 Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Mon, 12 Oct 2026 07:59:21 +0900 Subject: [PATCH] =?UTF-8?q?WIP=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A4=84=EC=9D=B4=20=EC=9E=90=EB=8F=99=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EB=B9=A0=EC=A7=88=20=EB=95=8C=20=EC=9D=B4=EC=9C=A0?= =?UTF-8?q?=20=EC=95=8C=EB=A6=BC=20=C2=B7=20[=EB=B3=B4=EA=B8=B0]=20(931=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=ED=8C=90=EB=8B=A8)=20(=EA=B2=80?= =?UTF-8?q?=ED=86=A0=20=EB=8C=80=EA=B8=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- assets/l10n/en.json | 2 ++ assets/l10n/ja.json | 2 ++ assets/l10n/zh-Hans.json | 2 ++ lib/main.dart | 11 +++++----- lib/ui/added_to_mkv_notice.dart | 29 ++++++++++++++++++++++++++ test/added_to_mkv_notice_test.dart | 33 ++++++++++++++++++++++++++++++ 6 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 lib/ui/added_to_mkv_notice.dart create mode 100644 test/added_to_mkv_notice_test.dart diff --git a/assets/l10n/en.json b/assets/l10n/en.json index aa7eb5d..453c38c 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -749,6 +749,8 @@ "늘 주소로 열기": "Always open by address", "다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "As soon as they finish, put them in the Make MKV video list and remove them from the download list (same as the checkbox on the download screen)", "다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "When finished, automatically add to the Make MKV video list and remove from this download list (the downloaded file stays)", + "다 받은 {0} 은 이미 MKV 목록에 있어 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)": "{0} is already in the MKV list, so it was removed from the download list (the file is kept)", + "다 받은 {0} 을 MKV 목록에 넣고 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)": "Added {0} to the MKV list and removed it from the download list (the file is kept)", "다른 곳에서 지웠거나 옮겼을 수 있습니다. 위 폴더로 가 보세요.": "It may have been deleted or moved elsewhere. Try the parent folder.", "다른 버전 ({0}) 을 쓰다가 v{1} 로 돌아왔습니다. 그 버전은 이 버전의 설정 일부를 모를 수 있습니다.\nv{1} 를 마지막으로 쓸 때 보관해 둔 설정 (동영상 목록 · 즐겨찾기 포함) 으로 되돌릴까요?": "You came back to v{1} after using another version ({0}). That version may not know some of this version's settings.\nRestore the settings kept when you last used v{1} (including the video list and bookmarks)?", "다른 버전 고르기": "Choose another version", diff --git a/assets/l10n/ja.json b/assets/l10n/ja.json index 22b2467..52215e4 100644 --- a/assets/l10n/ja.json +++ b/assets/l10n/ja.json @@ -749,6 +749,8 @@ "늘 주소로 열기": "常にアドレスで開く", "다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "ダウンロードが終わり次第 MKV 作成の動画リストに入れ、ダウンロードリストからは外します(ダウンロード画面のチェックボックスと同じ)", "다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "ダウンロードが終わると MKV 作成の動画リストに自動で入れ、このダウンロードリストからは外します(ダウンロードしたファイルはそのまま)", + "다 받은 {0} 은 이미 MKV 목록에 있어 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)": "ダウンロードした {0} はすでに MKV 一覧にあるため、ダウンロード一覧から外しました (ファイルはそのまま)", + "다 받은 {0} 을 MKV 목록에 넣고 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)": "ダウンロードした {0} を MKV 一覧に入れ、ダウンロード一覧から外しました (ファイルはそのまま)", "다른 곳에서 지웠거나 옮겼을 수 있습니다. 위 폴더로 가 보세요.": "別の場所で削除・移動された可能性があります。上のフォルダーへ移動してみてください。", "다른 버전 ({0}) 을 쓰다가 v{1} 로 돌아왔습니다. 그 버전은 이 버전의 설정 일부를 모를 수 있습니다.\nv{1} 를 마지막으로 쓸 때 보관해 둔 설정 (동영상 목록 · 즐겨찾기 포함) 으로 되돌릴까요?": "別のバージョン ({0}) を使ったあと v{1} に戻りました。そのバージョンはこのバージョンの設定の一部を知らない可能性があります。\nv{1} を最後に使ったときに保管した設定 (動画リスト · ブックマークを含む) に戻しますか?", "다른 버전 고르기": "別のバージョンを選ぶ", diff --git a/assets/l10n/zh-Hans.json b/assets/l10n/zh-Hans.json index 828a651..7625acc 100644 --- a/assets/l10n/zh-Hans.json +++ b/assets/l10n/zh-Hans.json @@ -749,6 +749,8 @@ "늘 주소로 열기": "始终按地址打开", "다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "下载完成后立即放入制作 MKV 的视频列表,并从下载列表移除(与下载界面的复选框相同)", "다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "下载完成后自动加入制作 MKV 的视频列表,并从此下载列表移除(已下载的文件保留)", + "다 받은 {0} 은 이미 MKV 목록에 있어 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)": "下载完成的 {0} 已在 MKV 列表中,已从下载列表移除(文件保留)", + "다 받은 {0} 을 MKV 목록에 넣고 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)": "已将下载完成的 {0} 加入 MKV 列表并从下载列表移除(文件保留)", "다른 곳에서 지웠거나 옮겼을 수 있습니다. 위 폴더로 가 보세요.": "可能已在别处被删除或移动。请返回上级文件夹。", "다른 버전 ({0}) 을 쓰다가 v{1} 로 돌아왔습니다. 그 버전은 이 버전의 설정 일부를 모를 수 있습니다.\nv{1} 를 마지막으로 쓸 때 보관해 둔 설정 (동영상 목록 · 즐겨찾기 포함) 으로 되돌릴까요?": "使用其他版本 ({0}) 后回到了 v{1}。该版本可能不认识此版本的部分设置。\n要恢复最后一次使用 v{1} 时保存的设置 (包括视频列表 · 书签) 吗?", "다른 버전 고르기": "选择其他版本", diff --git a/lib/main.dart b/lib/main.dart index fbb90c0..91f7e86 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,6 +19,7 @@ import 'app/component_store.dart'; import 'app/net_guard.dart'; import 'app/tor_service.dart'; import 'app/web_proxy.dart'; +import 'ui/added_to_mkv_notice.dart'; import 'ui/settings_problem.dart'; import 'ui/exit_guard.dart' show confirmStopCopies; import 'app/copy_center.dart'; @@ -295,9 +296,8 @@ Future main(List args) async { final n = await controller.addDownloaded(files); // MKV 만들기 목록으로 넘어갔으므로 다운로드 목록에서는 뺀다 (받은 파일은 그대로) downloads.dropFromList(t); - if (n > 0) { - messengerKey.currentState?.showSnackBar(SnackBar(content: Text(trf('동영상 목록에 추가: {0}', [t.title])))); - } + // 줄이 사라진 이유와 [보기] (MKV 화면 · 그 동영상) + showAddedToMkvNotice(messengerKey, navigatorKey, controller, title: t.title, files: files, added: n); }); downloads.setAutoAdd = (on) async { await controller.updateSettings((x) => x.addFinishedDownloads = on); @@ -609,9 +609,8 @@ Future runAndroid(String dataDir) async { if (files.isEmpty) return; final n = await controller.addDownloaded(files); downloads.dropFromList(t); - if (n > 0) { - messengerKey.currentState?.showSnackBar(SnackBar(content: Text(trf('동영상 목록에 추가: {0}', [t.title])))); - } + // 줄이 사라진 이유와 [보기] (MKV 화면 · 그 동영상) + showAddedToMkvNotice(messengerKey, navigatorKey, controller, title: t.title, files: files, added: n); }); downloads.setAutoAdd = (on) async { await controller.updateSettings((x) => x.addFinishedDownloads = on); diff --git a/lib/ui/added_to_mkv_notice.dart b/lib/ui/added_to_mkv_notice.dart new file mode 100644 index 0000000..c397287 --- /dev/null +++ b/lib/ui/added_to_mkv_notice.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; + +import '../app/app_controller.dart'; +import '../core/file_ops.dart' show samePath; +import '../l10n/tr.dart'; + +/// "완료 시 자동 동영상 추가" 로 다 받은 동영상을 MKV 목록에 넣고 다운로드 목록에서 뺐을 때의 알림. +/// 줄이 갑자기 사라져 "다운로드 (0)" 이 된 이유를 알 수 있게 [보기] (MKV 화면 · 그 동영상) 를 함께 (관리자 판단, 931) +void showAddedToMkvNotice(GlobalKey messenger, GlobalKey navigator, + AppController c, {required String title, required List files, required int added}) { + final m = messenger.currentState; + if (m == null) return; + m.showSnackBar(SnackBar( + duration: const Duration(seconds: 8), + showCloseIcon: true, + content: Text(added > 0 + ? trf('다 받은 {0} 을 MKV 목록에 넣고 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)', [title]) + : trf('다 받은 {0} 은 이미 MKV 목록에 있어 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)', [title])), + action: SnackBarAction( + label: tr('보기'), + onPressed: () { + // MKV 화면 (맨 처음 화면) 으로 가서 그 동영상을 보이게 + navigator.currentState?.popUntil((r) => r.isFirst); + final v = c.videos.where((x) => files.any((f) => samePath(f, x.path))).firstOrNull; + if (v != null) c.select(v); + }, + ), + )); +} diff --git a/test/added_to_mkv_notice_test.dart b/test/added_to_mkv_notice_test.dart new file mode 100644 index 0000000..726251c --- /dev/null +++ b/test/added_to_mkv_notice_test.dart @@ -0,0 +1,33 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:jj_mkvmaker/app/app_controller.dart'; +import 'package:jj_mkvmaker/core/models.dart'; +import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart'; +import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart'; +import 'package:jj_mkvmaker/services/platform_services.dart'; +import 'package:jj_mkvmaker/ui/added_to_mkv_notice.dart'; + +/// 다운로드 줄이 "완료 시 자동 동영상 추가" 로 빠질 때 이유를 알리고 [보기] (931 관리자 판단) +void main() { + testWidgets('다 받은 동영상을 MKV 목록에 넣고 뺐다고 알림 · [보기] 는 MKV 화면의 그 동영상', (tester) async { + final nav = GlobalKey(), messenger = GlobalKey(); + final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())); + final a = VideoItem(r'D:\dl\a.mp4'), b = VideoItem(r'D:\dl\받은 영상.mp4'); + c.videos.addAll([a, b]); + c.selected = a; + await tester.pumpWidget(MaterialApp( + navigatorKey: nav, scaffoldMessengerKey: messenger, home: const Scaffold(body: Text('MKV')))); + unawaited(nav.currentState!.push(MaterialPageRoute(builder: (_) => const Scaffold(body: Text('다운로드 화면'))))); + await tester.pumpAndSettle(); + showAddedToMkvNotice(messenger, nav, c, title: '받은 영상', files: [r'D:\dl\받은 영상.mp4'], added: 1); + await tester.pump(const Duration(milliseconds: 800)); + await tester.pump(const Duration(seconds: 1)); // 알림이 다 올라올 때까지 + expect(find.text('다 받은 받은 영상 을 MKV 목록에 넣고 다운로드 목록에서 뺐습니다 (받은 파일은 그대로)'), findsOneWidget); + await tester.tap(find.byType(SnackBarAction).hitTestable()); // 화면마다 Scaffold 가 있어 보이는 쪽 + await tester.pumpAndSettle(); + expect(find.text('다운로드 화면'), findsNothing, reason: 'MKV 화면 (맨 처음) 으로'); + expect(c.selected, b, reason: '그 동영상을 보이게'); + }); +}