diff --git a/assets/l10n/en.json b/assets/l10n/en.json index ce8dc41..54ccedd 100644 --- a/assets/l10n/en.json +++ b/assets/l10n/en.json @@ -1342,10 +1342,10 @@ "옵션": "Options", "옵션을 저장했습니다": "Options saved", "완료": "Done", + "완료 시 자동 동영상 추가": "Auto-add videos when done", "완료 정리": "Clear completed", "완료: 성공 {0} / 전체 {1}": "Done: {0} succeeded / {1} total", "완료: 성공 {0} · 취소 {1} · 실패 {2} / 전체 {3}": "Done: {0} succeeded · {1} cancelled · {2} failed / {3} total", - "완료시 자동 동영상추가": "Auto-add videos when done", "외부": "External", "외부 브라우저": "External browser", "외부 브라우저로 열기": "Open in external browser", diff --git a/assets/l10n/ja.json b/assets/l10n/ja.json index 98e5438..1688616 100644 --- a/assets/l10n/ja.json +++ b/assets/l10n/ja.json @@ -1342,10 +1342,10 @@ "옵션": "オプション", "옵션을 저장했습니다": "オプションを保存しました", "완료": "完了", + "완료 시 자동 동영상 추가": "完了時に動画を自動追加", "완료 정리": "完了を整理", "완료: 성공 {0} / 전체 {1}": "完了: 成功 {0} / 全体 {1}", "완료: 성공 {0} · 취소 {1} · 실패 {2} / 전체 {3}": "完了: 成功 {0} · 取消 {1} · 失敗 {2} / 全 {3}", - "완료시 자동 동영상추가": "完了時に動画を自動追加", "외부": "外部", "외부 브라우저": "外部ブラウザー", "외부 브라우저로 열기": "外部ブラウザーで開く", diff --git a/assets/l10n/zh-Hans.json b/assets/l10n/zh-Hans.json index 8b5b828..7e2da39 100644 --- a/assets/l10n/zh-Hans.json +++ b/assets/l10n/zh-Hans.json @@ -1342,10 +1342,10 @@ "옵션": "选项", "옵션을 저장했습니다": "已保存选项", "완료": "完成", + "완료 시 자동 동영상 추가": "完成后自动添加视频", "완료 정리": "清理已完成", "완료: 성공 {0} / 전체 {1}": "完成: 成功 {0} / 共 {1}", "완료: 성공 {0} · 취소 {1} · 실패 {2} / 전체 {3}": "完成:成功 {0} · 取消 {1} · 失败 {2} / 共 {3}", - "완료시 자동 동영상추가": "完成后自动添加视频", "외부": "外部", "외부 브라우저": "外部浏览器", "외부 브라우저로 열기": "在外部浏览器中打开", diff --git a/lib/app/download_manager.dart b/lib/app/download_manager.dart index 7faedc0..8eedaab 100644 --- a/lib/app/download_manager.dart +++ b/lib/app/download_manager.dart @@ -38,7 +38,7 @@ class DownloadManager extends ChangeNotifier { /// 받은 동영상을 편집 목록(MKV 만들기)에 넣는 함수 (새로 넣은 개수를 돌려줌). 앱이 연결해 준다. Future Function(List files)? addToEditList; - /// "완료시 자동 동영상추가" 를 켜고 끄는 함수 (설정에 저장). 앱이 연결해 준다. + /// "완료 시 자동 동영상 추가" 를 켜고 끄는 함수 (설정에 저장). 앱이 연결해 준다. Future Function(bool on)? setAutoAdd; /// 설정이 바뀌었을 때 화면 갱신 diff --git a/lib/ui/downloads_page.dart b/lib/ui/downloads_page.dart index 8667423..7591601 100644 --- a/lib/ui/downloads_page.dart +++ b/lib/ui/downloads_page.dart @@ -119,11 +119,12 @@ class _DownloadsPageState extends State { Container( color: JjColors.bg, padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - child: Row(children: [ + // 246: 좁으면 (폰 가로 등) 버튼들을 다음 줄로 - 예전에는 옆으로 미는 줄이라 앞쪽 글이 잘려 "전체 선택" 옆에 겹쳐 보였다 + child: Wrap(alignment: WrapAlignment.spaceBetween, crossAxisAlignment: WrapCrossAlignment.center, children: [ InkWell( borderRadius: BorderRadius.circular(4), onTap: d.tasks.isEmpty ? null : () => allSel ? d.selectNone() : d.selectAll(), - child: Row(children: [ + child: Row(mainAxisSize: MainAxisSize.min, children: [ Checkbox( value: allSel ? true : (hasSel ? null : false), tristate: true, @@ -136,12 +137,7 @@ class _DownloadsPageState extends State { ), ]), ), - // 좁으면 옆으로 밀어 볼 수 있게 (오른쪽 끝부터 보임) - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - reverse: true, - child: Row(children: [ + Wrap(alignment: WrapAlignment.end, crossAxisAlignment: WrapCrossAlignment.center, children: [ if (d.addToEditList != null) ...[ _btn(Icons.playlist_add, tr('동영상 추가'), hasSel && d.selectedVideoFiles.isNotEmpty ? () => _addToEditList(context) : null), @@ -160,7 +156,7 @@ class _DownloadsPageState extends State { ), Padding( padding: EdgeInsets.only(right: 8), - child: Text(tr('완료시 자동 동영상추가'), style: TextStyle(fontSize: 12)), + child: Text(tr('완료 시 자동 동영상 추가'), style: TextStyle(fontSize: 12)), ), ]), ), @@ -175,9 +171,7 @@ class _DownloadsPageState extends State { const SizedBox(width: 12), _btn(Icons.cleaning_services_outlined, tr('완료 정리'), d.tasks.any((t) => !t.unfinished) ? d.cleanupFinished : null), - ]), - ), - ), + ]), ]), ), const Divider(height: 1), diff --git a/lib/ui/settings_page.dart b/lib/ui/settings_page.dart index a0e657f..4fc0500 100644 --- a/lib/ui/settings_page.dart +++ b/lib/ui/settings_page.dart @@ -762,7 +762,7 @@ class _SettingsPageState extends State { SwitchListTile( value: s.addFinishedDownloads, onChanged: (v) => c.updateSettings((x) => x.addFinishedDownloads = v), - title: Text(tr('완료시 자동 동영상추가')), + title: Text(tr('완료 시 자동 동영상 추가')), subtitle: Text(tr('다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)')), ), SettingTile( diff --git a/test/batch_test.dart b/test/batch_test.dart index d8c8627..3ee15dd 100644 --- a/test/batch_test.dart +++ b/test/batch_test.dart @@ -374,7 +374,7 @@ void main() { d.dispose(); }); - testWidgets('다운로드 화면: "완료시 자동 동영상추가" 체크 → 설정 변경, 목록에서 빼기', (tester) async { + testWidgets('다운로드 화면: "완료 시 자동 동영상 추가" 체크 → 설정 변경, 목록에서 빼기', (tester) async { tester.view.physicalSize = const Size(1500, 900); tester.view.devicePixelRatio = 1; addTearDown(tester.view.reset); @@ -391,7 +391,7 @@ void main() { Checkbox box() => tester.widget( find.descendant(of: find.byTooltip(RegExp('MKV 만들기의 동영상 목록에 자동으로')), matching: find.byType(Checkbox))); expect(box().value, isFalse); - await tester.tap(find.text('완료시 자동 동영상추가')); + await tester.tap(find.text('완료 시 자동 동영상 추가')); await tester.pump(); expect(s.addFinishedDownloads, isTrue); expect(box().value, isTrue); @@ -404,6 +404,29 @@ void main() { d.dispose(); }); + testWidgets('246: 폰 가로 (약 800×411) 다운로드 화면 - 버튼 줄의 글이 잘리거나 "전체 선택" 과 겹치지 않는다', (tester) async { + tester.view.physicalSize = const Size(800, 411); + tester.view.devicePixelRatio = 1; + addTearDown(tester.view.reset); + final s = AppSettings(); + final d = DownloadManager(backends: [_Backend()], settings: () => s, readClipboard: () async => null); + addTearDown(d.dispose); + d.addToEditList = (files) async => files.length; + d.setAutoAdd = (on) async => s.addFinishedDownloads = on; + d.addPage('https://vimeo.com/1')!.title = '영상'; + await tester.pumpWidget(MaterialApp(home: DownloadsPage(d: d))); + await tester.pump(); + expect(tester.takeException(), isNull); + final all = tester.getRect(find.text('전체 선택')); + final auto = tester.getRect(find.text('완료 시 자동 동영상 추가')); + expect(auto.overlaps(all), isFalse, reason: '$auto · $all'); + expect([auto.left >= 0, auto.right <= 800], [true, true], reason: '화면 안에 다 보임 $auto'); + for (final t in ['일시정지', '재개', '다운로드 취소', '삭제', '완료 정리']) { + final r = tester.getRect(find.text(t).first); + expect([r.left >= 0, r.right <= 800], [true, true], reason: '$t $r'); + } + }); + testWidgets('환경 설정 · 종료 버튼: 모든 화면에서 같은 자리', (tester) async { tester.view.physicalSize = const Size(1500, 900); tester.view.devicePixelRatio = 1;