WIP X-plore d: 설정 "펼친 폴더를 다시 누르면 접기" (처음 값 끔 - 189 그대로) (검토 대기)
15 비교표 P1 d. X-plore 는 폴더를 다시 누르면 접는다. 189 (관리자 지시) 는 이름으로 접지 않게 해 두었으므로 설정으로만 넣는다. 켜면 펼쳐 둔 지금 폴더를 다시 누를 때 접고, 두 번 누르기의 두 번째 (짧은 사이) 는 접지 않는다 (목록이 움직이지 않게). 내 판단: 처음 값 끔 (189 와 부딪힘). 시험: explorer_test "X-plore d", 189 시험 그대로 통과. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>xplore_p3
parent
f9cd5f98c9
commit
0ce26e9124
|
|
@ -351,6 +351,7 @@
|
|||
"Windows 에서만 쓸 수 있습니다. 이 기기에서는 문서를 다른 앱으로 엽니다.": "Available on Windows only. On this device, documents open in another app.",
|
||||
"Windows 오류 0x{0}": "Windows error 0x{0}",
|
||||
"Windows 탐색기": "Windows Explorer",
|
||||
"X-plore 처럼. 끄면 접기 · 펼치기는 › 화살표로만 (두 번 눌러도 목록이 움직이지 않음)": "Like X-plore. When off, folders collapse and expand only with the › arrow (the list doesn't move on a double tap)",
|
||||
"YouTube · 토렌트 다운로드 목록": "YouTube · torrent download list",
|
||||
"YouTube → yt-dlp, 마그넷 · .torrent → aria2 (완료 후 올려 주기 안 함)": "YouTube → yt-dlp, magnet · .torrent → aria2 (no seeding after completion)",
|
||||
"YouTube 가 로봇 확인을 요구합니다. 환경 설정 > 다운로드 > YouTube 쿠키 에서 브라우저(Firefox 권장) 또는 cookies.txt 를 지정한 뒤 다시 받으세요.": "YouTube is asking for a robot check. In Settings > Downloads > YouTube cookies, choose a browser (Firefox recommended) or a cookies.txt, then download again.",
|
||||
|
|
@ -2361,6 +2362,7 @@
|
|||
"편집 목록에 있음": "In the edit list",
|
||||
"편집 목록에 추가": "Add to the edit list",
|
||||
"편집 목록에 추가 (MKV 만들기 대상)": "Add to the edit list (Make MKV target)",
|
||||
"펼친 폴더를 다시 누르면 접기": "Tap an open folder again to collapse",
|
||||
"평일 9~18시": "Weekdays 9-18",
|
||||
"포르투갈어": "Portuguese",
|
||||
"포함된 구성 요소와 라이선스 (GPL · LGPL 원문 포함)": "Included components and licenses (with full GPL · LGPL texts)",
|
||||
|
|
|
|||
|
|
@ -351,6 +351,7 @@
|
|||
"Windows 에서만 쓸 수 있습니다. 이 기기에서는 문서를 다른 앱으로 엽니다.": "Windows でのみ使えます。この端末では文書を他のアプリで開きます。",
|
||||
"Windows 오류 0x{0}": "Windows エラー 0x{0}",
|
||||
"Windows 탐색기": "Windows エクスプローラー",
|
||||
"X-plore 처럼. 끄면 접기 · 펼치기는 › 화살표로만 (두 번 눌러도 목록이 움직이지 않음)": "X-plore のように。オフのときは › 矢印でのみ開閉します (2 回押しても一覧は動きません)",
|
||||
"YouTube · 토렌트 다운로드 목록": "YouTube・トレント ダウンロード一覧",
|
||||
"YouTube → yt-dlp, 마그넷 · .torrent → aria2 (완료 후 올려 주기 안 함)": "YouTube → yt-dlp、マグネット・.torrent → aria2(完了後のアップロードなし)",
|
||||
"YouTube 가 로봇 확인을 요구합니다. 환경 설정 > 다운로드 > YouTube 쿠키 에서 브라우저(Firefox 권장) 또는 cookies.txt 를 지정한 뒤 다시 받으세요.": "YouTube がロボット確認を求めています。環境設定 > ダウンロード > YouTube クッキー でブラウザー(Firefox 推奨)または cookies.txt を指定してから、もう一度ダウンロードしてください。",
|
||||
|
|
@ -2361,6 +2362,7 @@
|
|||
"편집 목록에 있음": "編集リストにあり",
|
||||
"편집 목록에 추가": "編集リストに追加",
|
||||
"편집 목록에 추가 (MKV 만들기 대상)": "編集リストに追加(MKV 作成の対象)",
|
||||
"펼친 폴더를 다시 누르면 접기": "開いたフォルダーをもう一度押すと閉じる",
|
||||
"평일 9~18시": "平日 9~18 時",
|
||||
"포르투갈어": "ポルトガル語",
|
||||
"포함된 구성 요소와 라이선스 (GPL · LGPL 원문 포함)": "含まれるコンポーネントとライセンス (GPL・LGPL 全文を含む)",
|
||||
|
|
|
|||
|
|
@ -351,6 +351,7 @@
|
|||
"Windows 에서만 쓸 수 있습니다. 이 기기에서는 문서를 다른 앱으로 엽니다.": "仅限 Windows。在本设备上会用其他应用打开文档。",
|
||||
"Windows 오류 0x{0}": "Windows 错误 0x{0}",
|
||||
"Windows 탐색기": "Windows 资源管理器",
|
||||
"X-plore 처럼. 끄면 접기 · 펼치기는 › 화살표로만 (두 번 눌러도 목록이 움직이지 않음)": "像 X-plore 一样。关闭时仅用 › 箭头折叠 · 展开 (双击时列表不会移动)",
|
||||
"YouTube · 토렌트 다운로드 목록": "YouTube · 种子下载列表",
|
||||
"YouTube → yt-dlp, 마그넷 · .torrent → aria2 (완료 후 올려 주기 안 함)": "YouTube → yt-dlp,磁力链接 · .torrent → aria2(完成后不做种)",
|
||||
"YouTube 가 로봇 확인을 요구합니다. 환경 설정 > 다운로드 > YouTube 쿠키 에서 브라우저(Firefox 권장) 또는 cookies.txt 를 지정한 뒤 다시 받으세요.": "YouTube 要求进行机器人验证。请在 设置 > 下载 > YouTube Cookie 中指定浏览器(推荐 Firefox)或 cookies.txt 后重新下载。",
|
||||
|
|
@ -2361,6 +2362,7 @@
|
|||
"편집 목록에 있음": "已在编辑列表中",
|
||||
"편집 목록에 추가": "加入编辑列表",
|
||||
"편집 목록에 추가 (MKV 만들기 대상)": "加入编辑列表(制作 MKV 的对象)",
|
||||
"펼친 폴더를 다시 누르면 접기": "再次点按已展开的文件夹可折叠",
|
||||
"평일 9~18시": "工作日 9~18 点",
|
||||
"포르투갈어": "葡萄牙语",
|
||||
"포함된 구성 요소와 라이선스 (GPL · LGPL 원문 포함)": "包含的组件和许可证 (含 GPL · LGPL 全文)",
|
||||
|
|
|
|||
|
|
@ -398,6 +398,10 @@ class AppSettings {
|
|||
/// 'other' 숨은 다른 창의 폴더로 바로 (X-plore 처럼, 위에 "갈 곳" 줄). 예전 동작과 달라 처음 값은 그대로 (관리자 결정)
|
||||
String explorerOnePaneCopy = 'clip';
|
||||
|
||||
/// X-plore 비교 d: 펼쳐 둔 지금 폴더를 다시 누르면 접기 (X-plore 처럼). 처음 값 끔 - 189 (관리자 지시: 이름으로는 접지 않아
|
||||
/// 다시 · 두 번 눌러도 아래 줄이 움직이지 않게) 와 부딪혀 설정으로만. 켜도 두 번 누르기의 두 번째는 접지 않는다
|
||||
bool explorerRetapCollapse = false;
|
||||
|
||||
/// 누르기: 'select' 한 번 = 선택 · 두 번 = 열기 (기본) / 'open' 한 번 = 바로 열기.
|
||||
/// 길게 누르기 · 오른쪽 클릭은 늘 기능 메뉴.
|
||||
String explorerClick = Platform.isAndroid ? 'open' : 'select';
|
||||
|
|
@ -750,6 +754,7 @@ class AppSettings {
|
|||
'torNoticeSeen': torNoticeSeen,
|
||||
'explorerLayout': explorerLayout,
|
||||
'explorerOnePaneCopy': explorerOnePaneCopy,
|
||||
'explorerRetapCollapse': explorerRetapCollapse,
|
||||
'explorerClick': explorerClick,
|
||||
// 예전 기본값 (두 창 · 한 번 누르면 선택) 은 사용자가 고른 값이 아니므로 한 번 새 기본값으로 옮긴다
|
||||
'explorerV2': true,
|
||||
|
|
@ -960,6 +965,7 @@ class AppSettings {
|
|||
..torNoticeSeen = j['torNoticeSeen'] == true
|
||||
// 'auto' = 넓은 화면은 두 창, 좁은 화면 (폰 세로) 은 한 창. 예전 기본 'dual' 은 한 번 'auto' 로
|
||||
..explorerOnePaneCopy = j['explorerOnePaneCopy'] == 'other' ? 'other' : 'clip'
|
||||
..explorerRetapCollapse = j['explorerRetapCollapse'] == true
|
||||
..explorerLayout = const ['single', 'split', 'auto'].contains(j['explorerLayout'])
|
||||
? j['explorerLayout'] as String
|
||||
: j['explorerLayout'] == 'dual' && j['explorerV2'] == true
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'dart:io';
|
|||
|
||||
import 'package:crypto/crypto.dart';
|
||||
import 'package:flutter/foundation.dart' show defaultTargetPlatform;
|
||||
import 'package:flutter/gestures.dart' show kBackMouseButton, kForwardMouseButton, PointerDeviceKind, PointerScrollEvent;
|
||||
import 'package:flutter/gestures.dart' show kBackMouseButton, kDoubleTapTimeout, kForwardMouseButton, PointerDeviceKind, PointerScrollEvent;
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
|
|
@ -1018,6 +1018,9 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
/// - 폴더: 바로 펼치기 · 접기 (트리), 들어가기 (오른쪽 파일 목록)
|
||||
/// - 파일: 누르기 설정이 "선택" 이면 고르기만 (두 번 누르면 실행), "바로 실행" 이면 실행
|
||||
/// Ctrl 을 누른 채면 선택 모드로 고르기. 목록의 ".." 은 늘 상위 폴더로.
|
||||
/// X-plore 비교 d: 마지막으로 누른 폴더 · 시각 (두 번 누르기의 두 번째를 가리려고)
|
||||
(String, DateTime)? _lastFolderTap;
|
||||
|
||||
Future<void> _onTap(_Pane pane, _Row row, {bool list = false}) async {
|
||||
final e = row.entry;
|
||||
setState(() => _active = _panes.indexOf(pane));
|
||||
|
|
@ -1040,6 +1043,17 @@ class _ExplorerPageState extends State<ExplorerPage> {
|
|||
await _toggleMark(pane, e);
|
||||
return;
|
||||
}
|
||||
// X-plore 비교 d: 펼쳐 둔 지금 폴더를 다시 누르면 접기 (설정). 두 번 누르기의 두 번째 (짧은 사이) 는 접지 않는다
|
||||
if (e.isDir && !list && c.settings.explorerRetapCollapse) {
|
||||
final now = DateTime.now();
|
||||
final last = _lastFolderTap;
|
||||
_lastFolderTap = (e.path, now);
|
||||
final again = last != null && samePath(last.$1, e.path) && now.difference(last.$2) < kDoubleTapTimeout * 2;
|
||||
if (!again && pane.expanded.contains(e.path) && samePath(pane.current, e.path)) {
|
||||
await _toggle(pane, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (e.isDir || !_selectMode) return _onOpen(pane, row, list: list);
|
||||
pane.focused = e.path;
|
||||
if (!list) pane.current = vDirname(e.path);
|
||||
|
|
|
|||
|
|
@ -838,6 +838,13 @@ class _SettingsPageState extends State<SettingsPage> {
|
|||
onChanged: (v) => c.updateSettings((x) => x.explorerLayout = v!),
|
||||
),
|
||||
),
|
||||
// X-plore 비교 d: 지금 폴더를 다시 누르면 접기
|
||||
SwitchListTile(
|
||||
title: Text(tr('펼친 폴더를 다시 누르면 접기')),
|
||||
subtitle: Text(tr('X-plore 처럼. 끄면 접기 · 펼치기는 › 화살표로만 (두 번 눌러도 목록이 움직이지 않음)')),
|
||||
value: s.explorerRetapCollapse,
|
||||
onChanged: (v) => c.updateSettings((x) => x.explorerRetapCollapse = v),
|
||||
),
|
||||
// X-plore 비교 a: 한 창일 때 복사 · 이동이 갈 곳
|
||||
SettingTile(
|
||||
title: Text(tr('한 창일 때 복사 · 이동')),
|
||||
|
|
|
|||
|
|
@ -176,6 +176,23 @@ void main() {
|
|||
expect(File(p.join(left, 'doc.txt')).existsSync(), isTrue);
|
||||
});
|
||||
|
||||
testWidgets('X-plore d: 설정 "다시 누르면 접기" - 펼친 지금 폴더를 다시 누르면 접힘 · 두 번 누르기의 두 번째는 접지 않음 (처음 값 끔)', (tester) async {
|
||||
expect(AppSettings().explorerRetapCollapse, isFalse, reason: '189 그대로');
|
||||
c.settings.explorerRetapCollapse = true;
|
||||
await open(tester);
|
||||
await act(tester, () => tester.tap(find.text('sub')));
|
||||
await settle(tester, () => find.text('inner.txt').evaluate().isNotEmpty);
|
||||
// 곧바로 한 번 더 (두 번 누르기) - 접지 않음
|
||||
await act(tester, () => tester.tap(find.text('sub')));
|
||||
await settle(tester, () => false, rounds: 5);
|
||||
expect(find.text('inner.txt'), findsOneWidget, reason: '두 번 누르기의 두 번째');
|
||||
// 조금 뒤 다시 누름 - 접힘
|
||||
await tester.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 800)));
|
||||
await act(tester, () => tester.tap(find.text('sub')));
|
||||
await settle(tester, () => find.text('inner.txt').evaluate().isEmpty);
|
||||
expect(find.text('inner.txt'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('178 보충: 설정의 원본 지우기 옵션은 복사 창에서 빠진 까닭을 알린다 (이동 창에는 없음)', (tester) async {
|
||||
c.settings
|
||||
..copyMethodFile = 'robocopy'
|
||||
|
|
|
|||
Loading…
Reference in New Issue