49 lines
2.0 KiB
Dart
49 lines
2.0 KiB
Dart
/// 약속: MKV 목록의 동영상을 이동 버튼 폴더로 옮긴다 (확인 · 결과 알림).
|
|
library;
|
|
|
|
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:path/path.dart' as p;
|
|
|
|
import '../../app/app_controller.dart';
|
|
import '../../core/models.dart';
|
|
import '../../app/settings.dart' show MoveTarget;
|
|
import '../folder_picker.dart';
|
|
import '../confirm_dialog.dart';
|
|
import '../../l10n/tr.dart';
|
|
|
|
/// 동영상을 이동 버튼의 폴더로 옮긴다 (세부 정보의 이동 버튼 · 세 번 누르기). [target] 이 없으면 첫 번째 버튼,
|
|
/// 이동 버튼이 하나도 없으면 폴더를 골라 하나 만든다 (표시 이름은 폴더 이름).
|
|
/// [confirm]: 옮기기 전에 묻는다 (세 번 누르기 - 47)
|
|
Future<void> moveToTarget(BuildContext context, AppController c, List<VideoItem> videos,
|
|
{MoveTarget? target, bool confirm = false}) async {
|
|
if (videos.isEmpty) return;
|
|
final messenger = ScaffoldMessenger.maybeOf(context);
|
|
var t = target ?? c.settings.mkv.moveTargets.firstOrNull;
|
|
if (t == null) {
|
|
final d = await pickFolder(context, tr('이동 폴더 (환경 설정에서 바꿀 수 있음)'));
|
|
if (d == null) return;
|
|
t = MoveTarget(p.basename(d).isEmpty ? tr('이동') : p.basename(d), d);
|
|
final add = t;
|
|
await c.updateSettings((x) => x.mkv.moveTargets = [...x.mkv.moveTargets, add]);
|
|
} else if (confirm && context.mounted) {
|
|
final ok = await confirmAction(
|
|
context,
|
|
title: tr('파일 옮기기'),
|
|
body: '${trf('"{0}" 을(를) "{1}" 폴더로 옮길까요?', [videos.length == 1 ? videos.single.fileName : trf('{0}개', [videos.length]), t.name])}'
|
|
'\n${t.dir}\n\n${tr('(동영상을 세 번 누르면 옮깁니다)')}',
|
|
ok: tr('옮기기'),
|
|
danger: false,
|
|
);
|
|
if (!ok) return;
|
|
}
|
|
final (moved, errors) = await c.moveVideos(videos, t.dir);
|
|
messenger?.showSnackBar(SnackBar(
|
|
content: Text([
|
|
if (moved > 0) trf('{0}개를 옮겼습니다 → {1} ({2})', [moved, t.name, t.dir]),
|
|
...errors,
|
|
].join('\n')),
|
|
));
|
|
}
|