From e1943ee56a83dcc7e7ae1a7ca24a3454e316f4db Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sun, 26 May 2024 13:29:43 +0800 Subject: [PATCH] Update create download task dialog --- lib/api/client.dart | 4 + lib/api/client.g.dart | 33 ++++++++ lib/dialog/new_download_task_page.dart | 111 ++++++++++++++++++++++++- lib/l10n/app_en.arb | 3 +- lib/l10n/app_zh.arb | 3 +- pubspec.yaml | 2 +- 6 files changed, 152 insertions(+), 4 deletions(-) diff --git a/lib/api/client.dart b/lib/api/client.dart index 8a05adc..b2c952f 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:cryptography/cryptography.dart'; import 'package:dio/dio.dart'; import 'package:eh_downloader_flutter/api/file.dart'; +import 'package:retrofit/dio.dart'; import 'package:retrofit/retrofit.dart'; import 'api_result.dart'; @@ -234,6 +235,9 @@ abstract class _EHApi { @Part(name: "type") String t = "download", @CancelRequest() CancelToken? cancel, }); + @GET('/task/download_cfg') + Future> getDefaultDownloadConfig( + {@CancelRequest() CancelToken? cancel}); } class EHApi extends __EHApi { diff --git a/lib/api/client.g.dart b/lib/api/client.g.dart index 4a958b7..0d0a7ac 100644 --- a/lib/api/client.g.dart +++ b/lib/api/client.g.dart @@ -1114,6 +1114,39 @@ class __EHApi implements _EHApi { return value; } + @override + Future> getDefaultDownloadConfig( + {CancelToken? cancel}) async { + final _extra = {}; + final queryParameters = {}; + queryParameters.removeWhere((k, v) => v == null); + final _headers = {}; + const Map? _data = null; + final _result = await _dio.fetch>( + _setStreamType>(Options( + method: 'GET', + headers: _headers, + extra: _extra, + ) + .compose( + _dio.options, + '/task/download_cfg', + queryParameters: queryParameters, + data: _data, + cancelToken: cancel, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + )))); + final value = ApiResult.fromJson( + _result.data!, + (json) => DownloadConfig.fromJson(json as Map), + ); + return value; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || diff --git a/lib/dialog/new_download_task_page.dart b/lib/dialog/new_download_task_page.dart index 9e226b3..4ba9a0a 100644 --- a/lib/dialog/new_download_task_page.dart +++ b/lib/dialog/new_download_task_page.dart @@ -1,4 +1,6 @@ import 'package:dio/dio.dart'; +import 'package:eh_downloader_flutter/api/task.dart'; +import 'package:eh_downloader_flutter/components/labeled_checkbox.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:go_router/go_router.dart'; @@ -26,8 +28,13 @@ class _NewDownloadTaskPage extends State { int? _gid; String? _token; CancelToken? _cancel; + CancelToken? _cancel2; bool _isCreating = false; bool _ok = false; + DownloadConfig? _cfg; + bool _useCfg = false; + DownloadConfig? _dftCfg; + bool _fetched = false; @override void initState() { @@ -48,6 +55,7 @@ class _NewDownloadTaskPage extends State { _gidController.dispose(); _tokenController.dispose(); _cancel?.cancel(); + _cancel2?.cancel(); super.dispose(); } @@ -67,7 +75,9 @@ class _NewDownloadTaskPage extends State { setState(() { _isCreating = true; }); - (await api.createDownloadTask(_gid!, _token!, cancel: _cancel)).unwrap(); + (await api.createDownloadTask(_gid!, _token!, + cfg: _useCfg ? _cfg : null, cancel: _cancel)) + .unwrap(); _ok = true; if (!_cancel!.isCancelled) { setState(() { @@ -84,6 +94,18 @@ class _NewDownloadTaskPage extends State { } } + Future fetchDefaultCfg() async { + _fetched = true; + try { + _cancel2 = CancelToken(); + _dftCfg = (await api.getDefaultDownloadConfig(cancel: _cancel2)).unwrap(); + } catch (e) { + if (!_cancel2!.isCancelled) { + _log.warning("Failed to fetch default download config:", e); + } + } + } + @override Widget build(BuildContext context) { tryInitApi(context); @@ -92,6 +114,7 @@ class _NewDownloadTaskPage extends State { context.canPop() ? context.pop() : context.go("/task_manager"); }); } + if (!_fetched) fetchDefaultCfg(); final i18n = AppLocalizations.of(context)!; final maxWidth = MediaQuery.of(context).size.width; return Container( @@ -173,6 +196,92 @@ class _NewDownloadTaskPage extends State { } }, )), + _buildWithVecticalPadding(LabeledCheckbox( + value: _useCfg, + onChanged: (value) { + if (value != null) { + setState(() { + _useCfg = value; + if (_useCfg && _cfg == null) { + if (_dftCfg != null) { + _cfg = + DownloadConfig.fromJson(_dftCfg!.toJson()); + } else { + _cfg = DownloadConfig(); + } + } + }); + } + }, + label: Text(i18n.overwriteDefaultConfig), + )), + _useCfg + ? _buildWithVecticalPadding(NumberFormField( + min: 1, + initialValue: _cfg!.maxDownloadImgCount, + decoration: InputDecoration( + border: const OutlineInputBorder(), + labelText: i18n.maxDownloadImgCount, + ), + onChanged: (s) { + setState(() { + _cfg!.maxDownloadImgCount = s; + }); + })) + : Container(), + _useCfg + ? _buildWithVecticalPadding(LabeledCheckbox( + value: _cfg!.mpv ?? false, + onChanged: (b) { + if (b != null) { + setState(() { + _cfg!.mpv = b; + }); + } + }, + label: Text(i18n.mpv))) + : Container(), + _useCfg + ? _buildWithVecticalPadding(LabeledCheckbox( + value: _cfg!.downloadOriginalImg ?? false, + onChanged: (b) { + if (b != null) { + setState(() { + _cfg!.downloadOriginalImg = b; + }); + } + }, + label: Text(i18n.downloadOriginalImg))) + : Container(), + _useCfg + ? _buildWithVecticalPadding(NumberFormField( + min: 1, + initialValue: _cfg!.maxRetryCount, + decoration: InputDecoration( + border: const OutlineInputBorder(), + labelText: i18n.maxRetryCount, + ), + onChanged: (s) { + if (s != null) { + setState(() { + _cfg!.maxRetryCount = s; + }); + } + }, + )) + : Container(), + _useCfg + ? _buildWithVecticalPadding(LabeledCheckbox( + value: _cfg!.removePreviousGallery ?? false, + onChanged: (b) { + if (b != null) { + setState(() { + _cfg!.removePreviousGallery = b; + }); + } + }, + label: Text(i18n.removePreviousGallery))) + : Container(), _buildWithVecticalPadding(ElevatedButton( onPressed: _gid != null && _token != null && diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index e87e93d..93f66a3 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -194,5 +194,6 @@ "uploader": "Uploader", "dlUseAvgSpeed": "Show average speed in task details.", "refresh": "Refresh", - "originalImg": "Original image" + "originalImg": "Original image", + "overwriteDefaultConfig": "Overwrite default config" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index bf51f96..63711b3 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -194,5 +194,6 @@ "uploader": "上传者", "dlUseAvgSpeed": "在任务详情中显示平均速度。", "refresh": "刷新", - "originalImg": "原图" + "originalImg": "原图", + "overwriteDefaultConfig": "覆盖默认设置" } diff --git a/pubspec.yaml b/pubspec.yaml index eb049dd..9d51878 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: image: ^4.0.17 infinite_scroll_pagination: ^4.0.0 intl: any - json_annotation: ^4.8.1 + json_annotation: ^4.9.0 keymap: ^0.0.92 logging: ^1.2.0 package_info_plus: ^8.0.0