From 29b4365b7436c8432b9053f81ddf375023bb3e71 Mon Sep 17 00:00:00 2001 From: RyuJongJin <266630912+RyuJongJin@users.noreply.github.com> Date: Sun, 18 Oct 2026 04:47:12 +0900 Subject: [PATCH] =?UTF-8?q?WIP=20=EC=95=95=EC=B6=95=20=EC=95=88=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=A0=95=EB=A6=AC:=20=ED=8E=BC=EC=B9=9C?= =?UTF-8?q?=20=EC=95=95=EC=B6=95=20=EC=95=88=EC=9D=98=20=EA=B2=83=EC=97=90?= =?UTF-8?q?=EB=8A=94=20[ZIP=20=EC=9C=BC=EB=A1=9C=20=EB=AC=B6=EA=B8=B0]=20?= =?UTF-8?q?=C2=B7=20[Wi-Fi=20=EB=A1=9C=20=EA=B3=B5=EC=9C=A0]=20=C2=B7=20[P?= =?UTF-8?q?DF=20=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EA=B8=B0]=20=EB=A5=BC=20?= =?UTF-8?q?=EC=88=A8=EA=B9=80=20(=EA=B2=80=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 관리자 지시 (10/18, 데이터 검토에서 찾은 것): 펼친 압축 안의 항목은 실제 파일이 아니라 위 셋을 눌러도 없는 경로라 오류만 났다 (데이터는 다치지 않음). → 누른 것이나 표시한 것 중 하나라도 압축 안이면 그 셋을 메뉴에서 뺀다. 압축 밖은 그대로. 시험: explorer_test X-plore 16 통과 (f 에 덧붙임: 압축 안 폴더 메뉴에 ZIP · Wi-Fi 없음 · 밖의 폴더에는 ZIP 있음), analyze 문제 없음. Co-Authored-By: Claude Opus 5.5 --- lib/ui/explorer_page.dart | 8 +++++--- test/explorer_test.dart | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/ui/explorer_page.dart b/lib/ui/explorer_page.dart index 68f6c80..32399c7 100644 --- a/lib/ui/explorer_page.dart +++ b/lib/ui/explorer_page.dart @@ -1910,6 +1910,8 @@ class _ExplorerPageState extends State { // 77: 누른 것이 표시한 것 중 하나면 표시한 것 모두에 (복사 · 이동 · 삭제 · 공유 · 경로 복사) final targets = _isMarked(pane, e.path) && pane.marked.length > 1 ? pane.marked.toList() : [e.path]; final many = targets.length > 1; + // 데이터 검토 (10/18): 펼친 압축 안의 것은 실제 파일이 아니다 - 그것으로 새 파일을 만들거나 내놓는 항목 (ZIP 묶기 · Wi-Fi 공유 · PDF) 은 숨긴다 + final inArchive = targets.any(_insideArchive) || _insideArchive(e.path); // 25: Rsync 화면은 폴더만 보이므로 폴더에 맞는 것만 (고르기 · 열기 · 이름 변경 · 삭제 · 정보) final items = widget.rsync ? <(String, IconData, String)>[ @@ -1931,11 +1933,11 @@ class _ExplorerPageState extends State { if (!e.isDir) ('quickLook', Icons.preview_outlined, tr('미리 보기')), // 86: 압축 풀기 (ZIP · 7z · RAR) · ZIP 으로 묶기 (표시한 것 모두) if (!e.isDir && archiveKindOf(e.path) != null) ('extract', Icons.unarchive_outlined, tr('압축 풀기')), - if (!dav) ('zip', Icons.archive_outlined, many ? trf('{0}개 ZIP 으로 묶기', [targets.length]) : tr('ZIP 으로 묶기')), + if (!dav && !inArchive) ('zip', Icons.archive_outlined, many ? trf('{0}개 ZIP 으로 묶기', [targets.length]) : tr('ZIP 으로 묶기')), // 87: 저장 공간 분석 (이 폴더 아래의 큰 폴더 · 큰 파일) if (e.isDir) ('storage', Icons.pie_chart_outline, tr('저장 공간 분석')), // 89: 이 폴더를 Wi-Fi 로 공유 (이 기기의 폴더만) - if (e.isDir && !dav && !widget.rsync) ('wifiShare', Icons.wifi_tethering, tr('Wi-Fi 로 공유')), + if (e.isDir && !dav && !widget.rsync && !inArchive) ('wifiShare', Icons.wifi_tethering, tr('Wi-Fi 로 공유')), // 80: 이 폴더 크기를 지금 계산 (설정이 "안 함" 이어도) if (e.isDir) ('folderSize', Icons.data_usage, _sizes.busy(e.path) ? tr('폴더 크기 계산 멈추기') : tr('폴더 크기 계산')), // X-plore P3: 폴더 속성 (안의 파일 · 폴더 수 · 크기 · 만든 · 바뀐 때) · 파일 해시 (MD5 · SHA-256) - 이 기기의 것만 (원격은 다 받아야 해서 뺌) @@ -1952,7 +1954,7 @@ class _ExplorerPageState extends State { if (!e.isDir) ('openWith', Icons.open_in_new, tr('다른 앱으로 열기')), if (!e.isDir && !video) ('openDefault', Icons.launch, tr('기본 앱으로 열기')), if (video && !dav) ('addMkv', Icons.playlist_add, tr('MKV 목록에 추가')), - if (viewer && images.isNotEmpty) + if (viewer && images.isNotEmpty && !inArchive) ('toPdf', Icons.picture_as_pdf_outlined, images.length == 1 ? tr('PDF 로 만들기') : trf('그림 {0}장을 PDF 로 만들기', [images.length])), ('select', Icons.check_circle_outline, tr('선택')), diff --git a/test/explorer_test.dart b/test/explorer_test.dart index afa53ca..d70bf15 100644 --- a/test/explorer_test.dart +++ b/test/explorer_test.dart @@ -344,6 +344,18 @@ void main() { expect(find.byType(TextField), findsNothing, reason: '이름 묻는 창 없음'); ScaffoldMessenger.of(tester.element(find.byType(ExplorerPage))).clearSnackBars(); await tester.pump(const Duration(seconds: 1)); + // 데이터 검토 (10/18): 압축 안의 것 메뉴에는 [ZIP 으로 묶기] · [Wi-Fi 로 공유] 가 없다 (실제 파일이 아니라서). 압축 밖은 그대로 + await tester.longPress(find.text('a')); + await calm(tester); + expect(find.text('ZIP 으로 묶기'), findsNothing); + expect(find.text('Wi-Fi 로 공유'), findsNothing); + await tester.tapAt(const Offset(5, 5)); + await calm(tester); + await tester.longPress(find.text('sub')); + await calm(tester); + expect(find.text('ZIP 으로 묶기'), findsOneWidget); + await tester.tapAt(const Offset(5, 5)); + await calm(tester); }); testWidgets('X-plore g · h: 폴더 메뉴 [격자로 보기] (길게 = 그 자리로) · 파일 메뉴 [글 뷰어로 보기]', (tester) async {