From b316e9aae3ac7ee8837b2f6738bf487b21b2730f Mon Sep 17 00:00:00 2001 From: ngfchl Date: Sat, 18 Jul 2026 11:48:34 +0800 Subject: [PATCH] feat: control fast transfer queue --- lib/pages/workspace_tools_page.dart | 56 +++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/lib/pages/workspace_tools_page.dart b/lib/pages/workspace_tools_page.dart index ee10790..ba631ee 100644 --- a/lib/pages/workspace_tools_page.dart +++ b/lib/pages/workspace_tools_page.dart @@ -481,6 +481,8 @@ class _FastTransferTool extends ConsumerStatefulWidget { class _FastTransferToolState extends ConsumerState<_FastTransferTool> { final _json = TextEditingController(); bool _running = false; + bool _paused = false; + bool _cancelRequested = false; bool _createDirectories = true; bool _skipExisting = true; String _result = ''; @@ -523,6 +525,8 @@ class _FastTransferToolState extends ConsumerState<_FastTransferTool> { } setState(() { _running = true; + _paused = false; + _cancelRequested = false; _result = ''; }); await StorageManager.set(StorageKeys.fastTransferSession, { @@ -546,7 +550,11 @@ class _FastTransferToolState extends ConsumerState<_FastTransferTool> { .clamp(1, 20); try { Future worker() async { - while (nextIndex < entries.length) { + while (nextIndex < entries.length && !_cancelRequested) { + while (_paused && !_cancelRequested) { + await Future.delayed(const Duration(milliseconds: 150)); + } + if (_cancelRequested) return; final entry = entries[nextIndex++]; try { final targetID = await _resolveTargetDirectory( @@ -590,11 +598,17 @@ class _FastTransferToolState extends ConsumerState<_FastTransferTool> { await Future.wait(List.generate(concurrency, (_) => worker())); await ref.read(fileProvider.notifier).loadFiles(); if (mounted) { - setState(() => _result = '秒传完成:成功 $completed,失败 $failed'); + setState( + () => _result = _cancelRequested + ? '秒传已终止:成功 $completed,失败 $failed,待处理 ${entries.length - completed - failed}' + : '秒传完成:成功 $completed,失败 $failed', + ); } await StorageManager.set(StorageKeys.fastTransferSession, { 'entries': entries.map((entry) => entry.toJson()).toList(), - 'result': '秒传完成:成功 $completed,失败 $failed', + 'result': _cancelRequested + ? '秒传已终止:成功 $completed,失败 $failed' + : '秒传完成:成功 $completed,失败 $failed', }); } catch (error) { if (mounted) { @@ -715,14 +729,34 @@ class _FastTransferToolState extends ConsumerState<_FastTransferTool> { _ToolSection( title: '导入秒传 JSON', description: '支持递归解析包含 name、size、gcid(或 gcId)的 JSON。任务将写入当前目录。', - trailing: ShadButton( - onPressed: _running ? null : _submit, - leading: Icon( - _running ? Icons.hourglass_top_rounded : Icons.bolt_rounded, - size: 16, - ), - child: Text(_running ? '提交中' : '开始秒传'), - ), + trailing: _running + ? Row( + mainAxisSize: MainAxisSize.min, + children: [ + ShadButton.outline( + onPressed: () => setState(() => _paused = !_paused), + leading: Icon( + _paused + ? Icons.play_arrow_rounded + : Icons.pause_rounded, + size: 16, + ), + child: Text(_paused ? '继续' : '暂停'), + ), + const SizedBox(width: 8), + ShadButton.destructive( + onPressed: () => + setState(() => _cancelRequested = true), + leading: const Icon(Icons.stop_rounded, size: 16), + child: const Text('终止'), + ), + ], + ) + : ShadButton( + onPressed: _submit, + leading: const Icon(Icons.bolt_rounded, size: 16), + child: const Text('开始秒传'), + ), child: Padding( padding: const EdgeInsets.only(top: 12), child: Column(