48 보충: 탐색기를 처음 열면 고른 항목 없음 · 같은 이름 처리 기본값을 환경 설정으로
- 처음 열 때 지금 폴더를 고르지 않는다 (열자마자 폴더 통째가 복사 · 이동 대상이 되지 않게). 바로 [복사] 하면 "복사할 항목을 고르세요" - 환경 설정 > 파일 탐색기 > 같은 이름이 있을 때: 묻기 (처음 값) · 늘 이름 바꾸기 · 늘 덮어쓰기 · 늘 건너뛰기. 늘 … 이면 확인 창에 고르는 칸 없이 "환경 설정대로 …" 한 줄 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>묶음3
parent
7d76af382d
commit
f01fe96151
|
|
@ -381,6 +381,7 @@
|
|||
"같은 시리즈 (번호만 다른 파일)": "Same series (files that differ only by number)",
|
||||
"같은 이름이 이미 있습니다: {0}": "Already exists with the same name: {0}",
|
||||
"같은 이름이 있는지 확인하는 중 …": "Checking for items with the same name …",
|
||||
"같은 이름이 있을 때": "When a file with the same name exists",
|
||||
"같은 이름이라 건너뜀: {0}": "Skipped (same name): {0}",
|
||||
"같은 조건으로 다시 (시드 그대로)": "Again with the same settings (same seed)",
|
||||
"같은 폴더의 모든 동영상": "All videos in the same folder",
|
||||
|
|
@ -392,6 +393,7 @@
|
|||
"거꾸로": "Reverse",
|
||||
"건너뛰기": "Skip",
|
||||
"건너뜀 (출력 폴더의 파일): {0}": "Skipped (file in the output folder): {0}",
|
||||
"건너뜁니다": "skips it",
|
||||
"검색": "Search",
|
||||
"검색 지우기": "Clear search",
|
||||
"검정": "Black",
|
||||
|
|
@ -540,7 +542,10 @@
|
|||
"누르고 있으면 조정 전": "Hold to see before",
|
||||
"누르기": "Tap",
|
||||
"누르면 일정 바꾸기": "Tap to change the schedule",
|
||||
"늘 건너뛰기": "Always skip",
|
||||
"늘 덮어쓰기": "Always overwrite",
|
||||
"늘 받아서 열기": "Always download and open",
|
||||
"늘 이름 바꾸기": "Always keep both (rename)",
|
||||
"늘 주소로 열기": "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)",
|
||||
|
|
@ -631,6 +636,7 @@
|
|||
"더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "When JJ_MKVMaker is chosen by double-click · default app (the right-click menu stays)",
|
||||
"더한 언어 (AI 자동 번역)": "Added language (AI auto-translated)",
|
||||
"덮어쓰기 (원래 파일은 없어집니다)": "Overwrite (the existing file is replaced)",
|
||||
"덮어씁니다": "overwrites it",
|
||||
"덴마크어": "Danish",
|
||||
"독일어": "German",
|
||||
"돌아가기": "Go back",
|
||||
|
|
@ -775,6 +781,7 @@
|
|||
"무한": "Unlimited",
|
||||
"문서 미리보기": "Document preview",
|
||||
"문자셋 경고": "Charset warning",
|
||||
"묻기": "Ask",
|
||||
"물어보지 않기": "Never ask",
|
||||
"미리 볼 수 없습니다: {0}": "Cannot preview: {0}",
|
||||
"미리보기: 목록에서 동영상을 고르세요": "Preview: choose a video in the list",
|
||||
|
|
@ -872,6 +879,7 @@
|
|||
"복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "{0} copy/move tasks have not finished. Exiting stops them, and the file being copied is removed so no incomplete file is left.",
|
||||
"복사 · 이동 중입니다": "Copying · moving in progress",
|
||||
"복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "Copy · move works with two panes (Pane layout > Two panes).",
|
||||
"복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)": "If the destination folder already has the same name (built-in method · WebDAV)",
|
||||
"복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "Choose items to copy · move (tap, or mark with the circle on the right).",
|
||||
"복사 끝 ({0}): {1}개 → {2}": "Copy done ({0}): {1} → {2}",
|
||||
"복사 모니터링": "Copy monitor",
|
||||
|
|
@ -1342,6 +1350,7 @@
|
|||
"이름 변경": "Rename",
|
||||
"이름을 바꿀 수 없습니다: {0}": "Cannot rename: {0}",
|
||||
"이름을 바꿀 항목 하나를 고르세요.": "Choose one item to rename.",
|
||||
"이름을 바꿉니다": "renames it",
|
||||
"이미 그리는 중입니다": "Already drawing",
|
||||
"이미 동영상 목록에 있습니다 ({0}개).": "Already in the video list ({0}).",
|
||||
"이미 목록에 있는 동영상입니다 ({0}개).": "These videos are already in the list ({0}).",
|
||||
|
|
@ -1850,6 +1859,7 @@
|
|||
"확장자별 재생 프로그램": "Player per file extension",
|
||||
"환경 설정": "Settings",
|
||||
"환경 설정 열기": "Open settings",
|
||||
"환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)": "As set in Settings, it {0} (Settings > File explorer > When a file with the same name exists)",
|
||||
"환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "Enter the master password to open settings. It won't be asked again until the app is closed.",
|
||||
"회전": "Rotation",
|
||||
"회전 없음": "No rotation",
|
||||
|
|
|
|||
|
|
@ -381,6 +381,7 @@
|
|||
"같은 시리즈 (번호만 다른 파일)": "同じシリーズ(番号だけ違うファイル)",
|
||||
"같은 이름이 이미 있습니다: {0}": "同じ名前が既にあります: {0}",
|
||||
"같은 이름이 있는지 확인하는 중 …": "同じ名前があるか確認中 …",
|
||||
"같은 이름이 있을 때": "同じ名前があるとき",
|
||||
"같은 이름이라 건너뜀: {0}": "同じ名前のためスキップ: {0}",
|
||||
"같은 조건으로 다시 (시드 그대로)": "同じ条件でもう一度 (シードはそのまま)",
|
||||
"같은 폴더의 모든 동영상": "同じフォルダーのすべての動画",
|
||||
|
|
@ -392,6 +393,7 @@
|
|||
"거꾸로": "逆順",
|
||||
"건너뛰기": "スキップ",
|
||||
"건너뜀 (출력 폴더의 파일): {0}": "スキップ(出力フォルダーのファイル): {0}",
|
||||
"건너뜁니다": "スキップします",
|
||||
"검색": "検索",
|
||||
"검색 지우기": "検索をクリア",
|
||||
"검정": "黒",
|
||||
|
|
@ -540,7 +542,10 @@
|
|||
"누르고 있으면 조정 전": "押している間は調整前",
|
||||
"누르기": "タップ",
|
||||
"누르면 일정 바꾸기": "タップで予定を変更",
|
||||
"늘 건너뛰기": "常にスキップ",
|
||||
"늘 덮어쓰기": "常に上書き",
|
||||
"늘 받아서 열기": "常にダウンロードして開く",
|
||||
"늘 이름 바꾸기": "常に名前を変える",
|
||||
"늘 주소로 열기": "常にアドレスで開く",
|
||||
"다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "ダウンロードが終わり次第 MKV 作成の動画リストに入れ、ダウンロードリストからは外します(ダウンロード画面のチェックボックスと同じ)",
|
||||
"다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "ダウンロードが終わると MKV 作成の動画リストに自動で入れ、このダウンロードリストからは外します(ダウンロードしたファイルはそのまま)",
|
||||
|
|
@ -631,6 +636,7 @@
|
|||
"더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "ダブルクリック・既定のアプリで JJ_MKVMaker を選んだとき(右クリックメニューはそのまま)",
|
||||
"더한 언어 (AI 자동 번역)": "追加した言語(AI 自動翻訳)",
|
||||
"덮어쓰기 (원래 파일은 없어집니다)": "上書き (元のファイルは消えます)",
|
||||
"덮어씁니다": "上書きします",
|
||||
"덴마크어": "デンマーク語",
|
||||
"독일어": "ドイツ語",
|
||||
"돌아가기": "戻る",
|
||||
|
|
@ -775,6 +781,7 @@
|
|||
"무한": "無制限",
|
||||
"문서 미리보기": "文書プレビュー",
|
||||
"문자셋 경고": "文字コードの警告",
|
||||
"묻기": "確認する",
|
||||
"물어보지 않기": "尋ねない",
|
||||
"미리 볼 수 없습니다: {0}": "プレビューできません: {0}",
|
||||
"미리보기: 목록에서 동영상을 고르세요": "プレビュー: リストで動画を選んでください",
|
||||
|
|
@ -872,6 +879,7 @@
|
|||
"복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "コピー・移動 {0} 件がまだ終わっていません。終了すると止まり、コピー中のファイルは未完成のまま残らないよう削除します。",
|
||||
"복사 · 이동 중입니다": "コピー・移動中です",
|
||||
"복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "コピー · 移動は 2 ペインで使います (ペインの配置 > 2 ペイン)。",
|
||||
"복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)": "コピー・移動先のフォルダーに同じ名前がある場合 (現在の方式・WebDAV)",
|
||||
"복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "コピー · 移動する項目を選んでください (タップ、または右の丸でマーク)。",
|
||||
"복사 끝 ({0}): {1}개 → {2}": "コピー完了 ({0}): {1} 件 → {2}",
|
||||
"복사 모니터링": "コピーのモニタリング",
|
||||
|
|
@ -1342,6 +1350,7 @@
|
|||
"이름 변경": "名前の変更",
|
||||
"이름을 바꿀 수 없습니다: {0}": "名前を変更できません: {0}",
|
||||
"이름을 바꿀 항목 하나를 고르세요.": "名前を変更する項目を 1 つ選んでください。",
|
||||
"이름을 바꿉니다": "名前を変えます",
|
||||
"이미 그리는 중입니다": "すでに描画中です",
|
||||
"이미 동영상 목록에 있습니다 ({0}개).": "既に動画リストにあります({0}個)。",
|
||||
"이미 목록에 있는 동영상입니다 ({0}개).": "既にリストにある動画です({0}個)。",
|
||||
|
|
@ -1850,6 +1859,7 @@
|
|||
"확장자별 재생 프로그램": "拡張子ごとの再生プログラム",
|
||||
"환경 설정": "環境設定",
|
||||
"환경 설정 열기": "環境設定を開く",
|
||||
"환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)": "設定どおり{0} (環境設定 > ファイルエクスプローラー > 同じ名前があるとき)",
|
||||
"환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "環境設定を開くにはマスターパスワードを入力してください。アプリを終了するまで再度尋ねません。",
|
||||
"회전": "回転",
|
||||
"회전 없음": "回転なし",
|
||||
|
|
|
|||
|
|
@ -381,6 +381,7 @@
|
|||
"같은 시리즈 (번호만 다른 파일)": "同一系列(仅编号不同的文件)",
|
||||
"같은 이름이 이미 있습니다: {0}": "已存在同名项目: {0}",
|
||||
"같은 이름이 있는지 확인하는 중 …": "正在检查是否有同名项目 …",
|
||||
"같은 이름이 있을 때": "存在同名项目时",
|
||||
"같은 이름이라 건너뜀: {0}": "因同名已跳过: {0}",
|
||||
"같은 조건으로 다시 (시드 그대로)": "以相同条件再来一次 (种子不变)",
|
||||
"같은 폴더의 모든 동영상": "同一文件夹中的所有视频",
|
||||
|
|
@ -392,6 +393,7 @@
|
|||
"거꾸로": "倒序",
|
||||
"건너뛰기": "跳过",
|
||||
"건너뜀 (출력 폴더의 파일): {0}": "已跳过(输出文件夹中的文件): {0}",
|
||||
"건너뜁니다": "跳过",
|
||||
"검색": "搜索",
|
||||
"검색 지우기": "清除搜索",
|
||||
"검정": "黑色",
|
||||
|
|
@ -540,7 +542,10 @@
|
|||
"누르고 있으면 조정 전": "按住查看调整前",
|
||||
"누르기": "点按",
|
||||
"누르면 일정 바꾸기": "点按以更改计划",
|
||||
"늘 건너뛰기": "总是跳过",
|
||||
"늘 덮어쓰기": "总是覆盖",
|
||||
"늘 받아서 열기": "始终下载后打开",
|
||||
"늘 이름 바꾸기": "总是重命名",
|
||||
"늘 주소로 열기": "始终按地址打开",
|
||||
"다 받는 대로 MKV 만들기의 동영상 목록에 넣고, 다운로드 목록에서는 뺍니다 (다운로드 화면의 체크 상자와 같음)": "下载完成后立即放入制作 MKV 的视频列表,并从下载列表移除(与下载界面的复选框相同)",
|
||||
"다 받으면 MKV 만들기의 동영상 목록에 자동으로 넣고, 이 다운로드 목록에서는 뺍니다 (받은 파일은 그대로)": "下载完成后自动加入制作 MKV 的视频列表,并从此下载列表移除(已下载的文件保留)",
|
||||
|
|
@ -631,6 +636,7 @@
|
|||
"더블클릭 · 연결 프로그램으로 JJ_MKVMaker 를 골랐을 때 (오른쪽 클릭 메뉴는 그대로)": "双击 · 默认打开方式选择 JJ_MKVMaker 时(右键菜单不变)",
|
||||
"더한 언어 (AI 자동 번역)": "已添加的语言(AI 自动翻译)",
|
||||
"덮어쓰기 (원래 파일은 없어집니다)": "覆盖 (原文件将被替换)",
|
||||
"덮어씁니다": "覆盖",
|
||||
"덴마크어": "丹麦语",
|
||||
"독일어": "德语",
|
||||
"돌아가기": "返回",
|
||||
|
|
@ -775,6 +781,7 @@
|
|||
"무한": "无限制",
|
||||
"문서 미리보기": "文档预览",
|
||||
"문자셋 경고": "字符集警告",
|
||||
"묻기": "询问",
|
||||
"물어보지 않기": "不询问",
|
||||
"미리 볼 수 없습니다: {0}": "无法预览: {0}",
|
||||
"미리보기: 목록에서 동영상을 고르세요": "预览: 请在列表中选择视频",
|
||||
|
|
@ -872,6 +879,7 @@
|
|||
"복사 · 이동 {0}개가 아직 끝나지 않았습니다. 끝내면 멈추고, 복사하던 파일은 완성되지 않은 채로 남지 않게 지웁니다.": "{0} 个复制 · 移动尚未完成。退出会停止它们,并删除正在复制的文件,以免留下不完整的文件。",
|
||||
"복사 · 이동 중입니다": "正在复制 · 移动",
|
||||
"복사 · 이동은 두 창에서 씁니다 (창 배치 > 두 창).": "复制 · 移动需在双窗格中使用 (窗格布局 > 双窗格)。",
|
||||
"복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)": "目标文件夹中已有同名项目时 (当前方式 · WebDAV)",
|
||||
"복사 · 이동할 항목을 고르세요 (누르거나 오른쪽 동그라미로 표시).": "请选择要复制 · 移动的项目 (点按,或用右侧圆圈标记)。",
|
||||
"복사 끝 ({0}): {1}개 → {2}": "复制完成 ({0}): {1} 个 → {2}",
|
||||
"복사 모니터링": "复制监控",
|
||||
|
|
@ -1342,6 +1350,7 @@
|
|||
"이름 변경": "重命名",
|
||||
"이름을 바꿀 수 없습니다: {0}": "无法重命名: {0}",
|
||||
"이름을 바꿀 항목 하나를 고르세요.": "请选择一个要重命名的项目。",
|
||||
"이름을 바꿉니다": "重命名",
|
||||
"이미 그리는 중입니다": "已在绘制中",
|
||||
"이미 동영상 목록에 있습니다 ({0}개).": "已在视频列表中({0} 个)。",
|
||||
"이미 목록에 있는 동영상입니다 ({0}개).": "这些视频已在列表中({0} 个)。",
|
||||
|
|
@ -1850,6 +1859,7 @@
|
|||
"확장자별 재생 프로그램": "按扩展名设置播放程序",
|
||||
"환경 설정": "设置",
|
||||
"환경 설정 열기": "打开设置",
|
||||
"환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)": "按设置{0} (设置 > 文件资源管理器 > 存在同名项目时)",
|
||||
"환경 설정을 열려면 마스터 비밀번호를 넣으세요. 앱을 끌 때까지 다시 묻지 않습니다.": "要打开设置,请输入主密码。在关闭应用前不会再次询问。",
|
||||
"회전": "旋转",
|
||||
"회전 없음": "不旋转",
|
||||
|
|
|
|||
|
|
@ -345,6 +345,9 @@ class AppSettings {
|
|||
/// 파일 탐색기의 복사 · 이동 방법: 'builtin' 현재 방식 (기본) · 'robocopy' (Windows). 파일만 고를 때 / 폴더가 들어 있을 때.
|
||||
/// rsync 는 Rsync 화면에서 따로 (파일 탐색기에서는 쓰지 않음)
|
||||
String copyMethodFile = 'builtin';
|
||||
|
||||
/// 48: 복사 · 이동할 때 받는 폴더에 같은 이름이 있으면 'ask' (확인 창에서 고름, 처음 값) · 'rename' · 'overwrite' · 'skip'
|
||||
String copyConflict = 'ask';
|
||||
String copyMethodFolder = 'builtin';
|
||||
String rsyncOptions = '-avPog';
|
||||
String robocopyOptions = '/E /COPY:DAT /DCOPY:T /R:2 /W:2';
|
||||
|
|
@ -628,6 +631,7 @@ class AppSettings {
|
|||
'explorerShowHidden': explorerShowHidden,
|
||||
'explorerPaths': explorerPaths,
|
||||
'copyMethodFile': copyMethodFile,
|
||||
'copyConflict': copyConflict,
|
||||
'copyMethodFolder': copyMethodFolder,
|
||||
'rsyncPaths': rsyncPaths,
|
||||
'components': components,
|
||||
|
|
@ -809,6 +813,7 @@ class AppSettings {
|
|||
..explorerShowHidden = j['explorerShowHidden'] as bool? ?? false
|
||||
..explorerPaths = [for (final x in (j['explorerPaths'] as List?) ?? const []) '$x']
|
||||
..copyMethodFile = _method(j['copyMethodFile'])
|
||||
..copyConflict = const ['rename', 'overwrite', 'skip'].contains(j['copyConflict']) ? j['copyConflict'] as String : 'ask'
|
||||
..copyMethodFolder = _method(j['copyMethodFolder'])
|
||||
..rsyncPaths = [for (final x in (j['rsyncPaths'] as List?) ?? const []) '$x']
|
||||
..components = j['components'] is List
|
||||
|
|
|
|||
|
|
@ -121,6 +121,21 @@ class _CopySyncSettingsState extends State<CopySyncSettings> {
|
|||
_options(tr('robocopy 옵션'), tr('예: /E /COPY:DAT /DCOPY:T /R:2 /W:2. 이동은 /MOVE 를 자동으로 붙임'), s.robocopyOptions,
|
||||
defaultRobocopyOptions, (x, v) => x.robocopyOptions = v),
|
||||
],
|
||||
// 48: 같은 이름이 있을 때 (앱이 직접 복사 · 이동할 때, robocopy · rsync 는 그 프로그램의 규칙)
|
||||
SettingTile(
|
||||
title: Text(tr('같은 이름이 있을 때')),
|
||||
subtitle: Text(tr('복사 · 이동할 폴더에 같은 이름이 있으면 (현재 방식 · WebDAV)')),
|
||||
trailing: DropdownButton<String>(
|
||||
value: const ['ask', 'rename', 'overwrite', 'skip'].contains(s.copyConflict) ? s.copyConflict : 'ask',
|
||||
items: [
|
||||
DropdownMenuItem(value: 'ask', child: Text(tr('묻기'))),
|
||||
DropdownMenuItem(value: 'rename', child: Text(tr('늘 이름 바꾸기'))),
|
||||
DropdownMenuItem(value: 'overwrite', child: Text(tr('늘 덮어쓰기'))),
|
||||
DropdownMenuItem(value: 'skip', child: Text(tr('늘 건너뛰기'))),
|
||||
],
|
||||
onChanged: (v) => c.updateSettings((x) => x.copyConflict = v ?? 'ask'),
|
||||
),
|
||||
),
|
||||
SettingTile(
|
||||
title: Text(tr('속도 제한 (KB/s)')),
|
||||
subtitle: Text(tr('0 = 제한 없음. 모든 방법에 적용: rsync --bwlimit, 현재 방식은 앱이 조절, robocopy 는 /IPG 로 비슷하게. '
|
||||
|
|
|
|||
|
|
@ -280,7 +280,8 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
_panes[i]
|
||||
..root = _volumeOf(wants[i])
|
||||
..current = wants[i]
|
||||
..focused = wants[i];
|
||||
// 48 보충 (관리자): 처음 열면 아무것도 고르지 않은 상태 - 열자마자 폴더 통째가 복사 · 이동 대상이 되지 않게
|
||||
..focused = null;
|
||||
}
|
||||
if (!mounted) return;
|
||||
setState(() => _ready = true);
|
||||
|
|
@ -293,7 +294,7 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
}
|
||||
for (var i = 0; i < 2; i++) {
|
||||
final pane = _panes[i];
|
||||
unawaited(_goTo(pane, wants[i], remember: false).then((_) => _reveal(pane, pane.current)));
|
||||
unawaited(_goTo(pane, wants[i], remember: false, focus: false).then((_) => _reveal(pane, pane.current)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -586,7 +587,7 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
|
||||
/// 그 폴더로: 저장 장치부터 그 폴더까지 펼치고 지금 폴더로 정한다
|
||||
/// [fresh]: 경로 입력 · 찾기 · 내역으로 갈 때 - 그 폴더를 새로 읽는다 (앱 밖에서 바뀐 것까지 보이게, 122)
|
||||
Future<void> _goTo(_Pane pane, String dir, {bool remember = true, bool fresh = false}) async {
|
||||
Future<void> _goTo(_Pane pane, String dir, {bool remember = true, bool fresh = false, bool focus = true}) async {
|
||||
// 124 · 128: 사용자가 WebDAV 로 간 것이면 마스터 창을 한 번 취소했어도 다시 묻는다 (켤 때 되살리는 것은 [remember] 없음)
|
||||
if (remember && isDav(dir)) await SecretGate.pass(force: true);
|
||||
if (!mounted) return;
|
||||
|
|
@ -607,9 +608,8 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
await _load(pane, x, force: true);
|
||||
}
|
||||
}
|
||||
pane
|
||||
..current = dir
|
||||
..focused = dir;
|
||||
pane.current = dir;
|
||||
if (focus) pane.focused = dir;
|
||||
pane.changed();
|
||||
if (pane.listScroll.hasClients) pane.listScroll.jumpTo(0);
|
||||
_reveal(pane, dir);
|
||||
|
|
@ -1494,7 +1494,14 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
// 확인 창은 바로 띄우고, 같은 이름은 창 안에서 뒤에서 찾는다 (느린 네트워크 · WebDAV 폴더라도 창이 늦게 뜨지 않게).
|
||||
// 다 찾기 전에 누르면 이름 바꾸기 (원래 파일을 건드리지 않는 쪽)
|
||||
final clashesFuture = builtin ? _findClashes(sources, dest) : Future.value(const <String>[]);
|
||||
var conflict = NameConflict.rename;
|
||||
// 48: 환경 설정 "같은 이름이 있을 때" 가 늘 하는 것이면 묻지 않고 그대로 (확인 창에 알림만)
|
||||
final always = switch (c.settings.copyConflict) {
|
||||
'rename' => NameConflict.rename,
|
||||
'overwrite' => NameConflict.overwrite,
|
||||
'skip' => NameConflict.skip,
|
||||
_ => null,
|
||||
};
|
||||
var conflict = always ?? NameConflict.rename;
|
||||
final go = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
|
|
@ -1522,6 +1529,17 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
const SizedBox(height: 12),
|
||||
Text(trf('같은 이름이 이미 있습니다: {0}', [_namesOf(clashes)]),
|
||||
style: const TextStyle(color: Colors.orangeAccent)),
|
||||
if (always != null)
|
||||
Text(
|
||||
trf('환경 설정대로 {0} (환경 설정 > 파일 탐색기 > 같은 이름이 있을 때)', [
|
||||
switch (always) {
|
||||
NameConflict.rename => tr('이름을 바꿉니다'),
|
||||
NameConflict.overwrite => tr('덮어씁니다'),
|
||||
NameConflict.skip => tr('건너뜁니다'),
|
||||
}
|
||||
]),
|
||||
style: const TextStyle(fontSize: 12))
|
||||
else
|
||||
RadioGroup<NameConflict>(
|
||||
groupValue: conflict,
|
||||
onChanged: (x) => setInner(() => conflict = x ?? conflict),
|
||||
|
|
|
|||
|
|
@ -83,6 +83,28 @@ void main() {
|
|||
expect(File(p.join(right, 'doc (2).txt')).existsSync(), isFalse);
|
||||
});
|
||||
|
||||
testWidgets('48 보충: 환경 설정이 "늘 덮어쓰기" 면 묻지 않고 (확인 창에 알림만) 덮어쓴다', (tester) async {
|
||||
c.settings.copyConflict = 'overwrite';
|
||||
await startCopy(tester);
|
||||
expect(find.text('덮어쓰기 (원래 파일은 없어집니다)'), findsNothing, reason: '고르는 칸 없음');
|
||||
expect(find.textContaining('환경 설정대로 덮어씁니다'), findsOneWidget);
|
||||
await confirm(tester);
|
||||
expect(File(p.join(right, 'doc.txt')).readAsStringSync(), 'new');
|
||||
});
|
||||
|
||||
testWidgets('48 보충: 처음 열면 아무것도 고르지 않은 상태 - 바로 [복사] 를 누르면 "복사할 항목을 고르세요" (폴더 통째로 복사하지 않음)', (tester) async {
|
||||
tester.view.physicalSize = const Size(1600, 900);
|
||||
tester.view.devicePixelRatio = 1;
|
||||
addTearDown(tester.view.reset);
|
||||
await tester.runAsync(() => tester.pumpWidget(MaterialApp(home: ExplorerPage(c: c))));
|
||||
await settle(tester, () => find.text('doc.txt').evaluate().length >= 2);
|
||||
await tester.runAsync(() => tester.tap(find.text('복사').first));
|
||||
await tester.pump();
|
||||
expect(find.widgetWithText(FilledButton, '복사'), findsNothing, reason: '확인 창이 뜨지 않음');
|
||||
expect(find.textContaining('복사할 항목을 고르세요'), findsOneWidget);
|
||||
expect(Directory(p.join(right, 'left')).existsSync(), isFalse);
|
||||
});
|
||||
|
||||
testWidgets('48: 건너뛰기를 고르면 그대로 두고 건너뛴 것을 알린다', (tester) async {
|
||||
await startCopy(tester);
|
||||
await tester.tap(find.text('건너뛰기'));
|
||||
|
|
|
|||
Loading…
Reference in New Issue