mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-08 01:20:27 +00:00
fix: hide completed task folder action on mobile and web
This commit is contained in:
1 parent
2e8672273c
commit
d393d27ec7
3 files changed
+103
-36
No files matched your search
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart' show Colors, Icons;
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' as shad;
|
||||
|
||||
import '../../../../../core/window/app_window_chrome.dart';
|
||||
import '../../../../../shared/theme/app_design_tokens.dart';
|
||||
import '../../../../../shared/theme/app_palette.dart';
|
||||
import '../../../domain/task_record.dart';
|
||||
@@ -237,7 +238,10 @@ class _ProgressContent extends StatelessWidget {
|
||||
TaskStatus.downloading => [(Icons.pause, onPause), (Icons.close, onDelete)],
|
||||
TaskStatus.paused => [(Icons.play_arrow, onResume), (Icons.close, onDelete)],
|
||||
TaskStatus.failed => [(Icons.refresh, onResume), (Icons.delete_outline, onDelete)],
|
||||
TaskStatus.completed => [(Icons.folder_open_outlined, null), (Icons.delete_outline, onDelete)],
|
||||
TaskStatus.completed => [
|
||||
if (AppWindowChrome.isDesktopWindow) (Icons.folder_open_outlined, null),
|
||||
(Icons.delete_outline, onDelete),
|
||||
],
|
||||
};
|
||||
|
||||
return actions
|
||||
@@ -306,7 +310,10 @@ class _CompletedContent extends StatelessWidget {
|
||||
TaskStatus.downloading => [(Icons.pause, null), (Icons.close, onDelete)],
|
||||
TaskStatus.paused => [(Icons.play_arrow, null), (Icons.close, onDelete)],
|
||||
TaskStatus.failed => [(Icons.refresh, null), (Icons.delete_outline, onDelete)],
|
||||
TaskStatus.completed => [(Icons.folder_open_outlined, onReveal), (Icons.delete_outline, onDelete)],
|
||||
TaskStatus.completed => [
|
||||
if (AppWindowChrome.isDesktopWindow) (Icons.folder_open_outlined, onReveal),
|
||||
(Icons.delete_outline, onDelete),
|
||||
],
|
||||
};
|
||||
|
||||
return actions
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart' show Colors, Icons;
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:shadcn_flutter/shadcn_flutter.dart' as shad;
|
||||
|
||||
import '../../../../../core/window/app_window_chrome.dart';
|
||||
import '../../../../../shared/theme/app_design_tokens.dart';
|
||||
import '../../../../../shared/theme/app_palette.dart';
|
||||
import '../../../domain/task_record.dart';
|
||||
@@ -171,7 +172,10 @@ class _TaskCardMobileState extends State<TaskCardMobile> {
|
||||
TaskStatus.downloading => [(Icons.pause, widget.onPause), (Icons.close, widget.onDelete)],
|
||||
TaskStatus.paused => [(Icons.play_arrow, widget.onResume), (Icons.close, widget.onDelete)],
|
||||
TaskStatus.failed => [(Icons.refresh, widget.onResume), (Icons.delete_outline, widget.onDelete)],
|
||||
TaskStatus.completed => [(Icons.folder_open_outlined, widget.onReveal), (Icons.delete_outline, widget.onDelete)],
|
||||
TaskStatus.completed => [
|
||||
if (AppWindowChrome.isDesktopWindow) (Icons.folder_open_outlined, widget.onReveal),
|
||||
(Icons.delete_outline, widget.onDelete),
|
||||
],
|
||||
};
|
||||
|
||||
return actions
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart' show TargetPlatform, defaultTargetPlatform, debugDefaultTargetPlatformOverride;
|
||||
import 'package:flutter/foundation.dart'
|
||||
show TargetPlatform, defaultTargetPlatform, debugDefaultTargetPlatformOverride, kIsWeb;
|
||||
import 'package:flutter/material.dart' show Icons, Scrollbar;
|
||||
import 'package:flutter/gestures.dart' show PointerDeviceKind, kDoubleTapMinTime, kSecondaryMouseButton;
|
||||
import 'package:flutter/rendering.dart' show RenderParagraph;
|
||||
@@ -5065,45 +5066,100 @@ void main() {
|
||||
expect(openedCount, 0);
|
||||
});
|
||||
|
||||
testWidgets('completed task double click opens while folder action reveals', (WidgetTester tester) async {
|
||||
await _setTestSize(tester, const Size(1024, 220));
|
||||
var openedCount = 0;
|
||||
var revealedCount = 0;
|
||||
for (final width in [390.0, 1024.0]) {
|
||||
testWidgets(
|
||||
'completed card actions respect platform at width $width',
|
||||
(tester) async {
|
||||
await _setTestSize(tester, Size(width, 220));
|
||||
var deleted = 0;
|
||||
var revealed = 0;
|
||||
await tester.pumpWidget(
|
||||
shad.ShadcnApp(
|
||||
theme: AppTheme.light(),
|
||||
materialTheme: AppTheme.materialLight(),
|
||||
home: Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: TaskCard(
|
||||
task: _taskRecord(id: 'platform-actions', name: 'done.zip', status: TaskStatus.completed),
|
||||
selected: false,
|
||||
batchMode: false,
|
||||
selectedInBatch: false,
|
||||
onPressed: () {},
|
||||
onToggleBatch: () {},
|
||||
onDelete: () => deleted++,
|
||||
onReveal: () => revealed++,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
final desktop =
|
||||
!kIsWeb &&
|
||||
{TargetPlatform.windows, TargetPlatform.macOS, TargetPlatform.linux}.contains(defaultTargetPlatform);
|
||||
expect(find.byIcon(Icons.folder_open_outlined), desktop ? findsOneWidget : findsNothing);
|
||||
expect(find.byIcon(Icons.delete_outline), findsOneWidget);
|
||||
if (desktop) {
|
||||
await tester.tap(find.byIcon(Icons.folder_open_outlined));
|
||||
expect(revealed, 1);
|
||||
}
|
||||
await tester.tap(find.byIcon(Icons.delete_outline));
|
||||
expect(deleted, 1);
|
||||
expect(tester.takeException(), isNull);
|
||||
},
|
||||
variant: TargetPlatformVariant({
|
||||
TargetPlatform.android,
|
||||
TargetPlatform.iOS,
|
||||
TargetPlatform.windows,
|
||||
TargetPlatform.macOS,
|
||||
TargetPlatform.linux,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
await tester.pumpWidget(
|
||||
shad.ShadcnApp(
|
||||
theme: AppTheme.light(),
|
||||
materialTheme: AppTheme.materialLight(),
|
||||
home: Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: TaskCard(
|
||||
task: _taskRecord(id: 'completed-actions', name: 'completed.zip', status: TaskStatus.completed),
|
||||
selected: false,
|
||||
batchMode: false,
|
||||
selectedInBatch: false,
|
||||
onPressed: () {},
|
||||
onToggleBatch: () {},
|
||||
onOpen: () => openedCount++,
|
||||
onReveal: () => revealedCount++,
|
||||
testWidgets(
|
||||
'completed task double click opens while folder action reveals',
|
||||
(WidgetTester tester) async {
|
||||
await _setTestSize(tester, const Size(1024, 220));
|
||||
var openedCount = 0;
|
||||
var revealedCount = 0;
|
||||
|
||||
await tester.pumpWidget(
|
||||
shad.ShadcnApp(
|
||||
theme: AppTheme.light(),
|
||||
materialTheme: AppTheme.materialLight(),
|
||||
home: Padding(
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: TaskCard(
|
||||
task: _taskRecord(id: 'completed-actions', name: 'completed.zip', status: TaskStatus.completed),
|
||||
selected: false,
|
||||
batchMode: false,
|
||||
selectedInBatch: false,
|
||||
onPressed: () {},
|
||||
onToggleBatch: () {},
|
||||
onOpen: () => openedCount++,
|
||||
onReveal: () => revealedCount++,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
);
|
||||
|
||||
await tester.tap(find.text('completed.zip'));
|
||||
await tester.pump(kDoubleTapMinTime);
|
||||
await tester.tap(find.text('completed.zip'));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('completed.zip'));
|
||||
await tester.pump(kDoubleTapMinTime);
|
||||
await tester.tap(find.text('completed.zip'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(openedCount, 1);
|
||||
expect(revealedCount, 0);
|
||||
expect(openedCount, 1);
|
||||
expect(revealedCount, 0);
|
||||
|
||||
await tester.tap(find.byIcon(Icons.folder_open_outlined));
|
||||
await tester.pump();
|
||||
await tester.tap(find.byIcon(Icons.folder_open_outlined));
|
||||
await tester.pump();
|
||||
|
||||
expect(openedCount, 1);
|
||||
expect(revealedCount, 1);
|
||||
});
|
||||
expect(openedCount, 1);
|
||||
expect(revealedCount, 1);
|
||||
},
|
||||
variant: TargetPlatformVariant.only(TargetPlatform.macOS),
|
||||
skip: kIsWeb,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _setTestSize(WidgetTester tester, Size size) async {
|
||||
|
||||
Reference in new issue
Block a user