From 45e7f0dfc218b37bb694f16ae0ef964a3ede00bb Mon Sep 17 00:00:00 2001 From: nyne Date: Sun, 3 Nov 2024 15:49:34 +0800 Subject: [PATCH] add download threads setting --- assets/translation.json | 6 +++-- lib/foundation/appdata.dart | 1 + lib/network/download.dart | 3 ++- lib/pages/settings/network.dart | 41 +++++++++++++++++++-------------- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/assets/translation.json b/assets/translation.json index 796bab9..d7a25c1 100644 --- a/assets/translation.json +++ b/assets/translation.json @@ -155,7 +155,8 @@ "Start": "开始", "Export App Data": "导出应用数据", "Import App Data": "导入应用数据", - "Export": "导出" + "Export": "导出", + "Download Threads": "下载线程数" }, "zh_TW": { "Home": "首頁", @@ -313,6 +314,7 @@ "Start": "開始", "Export App Data": "匯出應用數據", "Import App Data": "匯入應用數據", - "Export": "匯出" + "Export": "匯出", + "Download Threads": "下載線程數" } } \ No newline at end of file diff --git a/lib/foundation/appdata.dart b/lib/foundation/appdata.dart index a81f42e..e071ef7 100644 --- a/lib/foundation/appdata.dart +++ b/lib/foundation/appdata.dart @@ -110,6 +110,7 @@ class _Settings with ChangeNotifier { 'enablePageAnimation': true, 'language': 'system', // system, zh-CN, zh-TW, en-US 'cacheSize': 2048, // in MB + 'downloadThreads': 5, }; operator [](String key) { diff --git a/lib/network/download.dart b/lib/network/download.dart index 052a8c0..f0c3748 100644 --- a/lib/network/download.dart +++ b/lib/network/download.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter/widgets.dart' show ChangeNotifier; +import 'package:venera/foundation/appdata.dart'; import 'package:venera/foundation/comic_source/comic_source.dart'; import 'package:venera/foundation/comic_type.dart'; import 'package:venera/foundation/local.dart'; @@ -155,7 +156,7 @@ class ImagesDownloadTask extends DownloadTask with _TransferSpeedMixin { var tasks = {}; - int get _maxConcurrentTasks => 5; + int get _maxConcurrentTasks => (appdata.settings["downloadThreads"] as num).toInt(); void _scheduleTasks() { var images = _images![_images!.keys.elementAt(_chapter)]!; diff --git a/lib/pages/settings/network.dart b/lib/pages/settings/network.dart index 0cc2545..21042ea 100644 --- a/lib/pages/settings/network.dart +++ b/lib/pages/settings/network.dart @@ -17,6 +17,13 @@ class _NetworkSettingsState extends State { title: "Proxy".tl, builder: () => const _ProxySettingView(), ).toSliver(), + _SliderSetting( + title: "Download Threads".tl, + settingsIndex: 'downloadThreads', + interval: 1, + min: 1, + max: 16, + ).toSliver(), ], ); } @@ -42,50 +49,50 @@ class _ProxySettingViewState extends State<_ProxySettingView> { // USERNAME:PASSWORD@HOST:PORT String toProxyStr() { - if(type == 'direct') { + if (type == 'direct') { return 'direct'; - } else if(type == 'system') { + } else if (type == 'system') { return 'system'; } var res = ''; - if(username.isNotEmpty) { + if (username.isNotEmpty) { res += username; - if(password.isNotEmpty) { + if (password.isNotEmpty) { res += ':$password'; } res += '@'; } res += host; - if(port.isNotEmpty) { + if (port.isNotEmpty) { res += ':$port'; } return res; } void parseProxyString(String proxy) { - if(proxy == 'direct') { + if (proxy == 'direct') { type = 'direct'; return; - } else if(proxy == 'system') { + } else if (proxy == 'system') { type = 'system'; return; } type = 'manual'; var parts = proxy.split('@'); - if(parts.length == 2) { + if (parts.length == 2) { var auth = parts[0].split(':'); - if(auth.length == 2) { + if (auth.length == 2) { username = auth[0]; password = auth[1]; } parts = parts[1].split(':'); - if(parts.length == 2) { + if (parts.length == 2) { host = parts[0]; port = parts[1]; } } else { parts = proxy.split(':'); - if(parts.length == 2) { + if (parts.length == 2) { host = parts[0]; port = parts[1]; } @@ -140,7 +147,7 @@ class _ProxySettingViewState extends State<_ProxySettingView> { }); }, ), - if(type == 'manual') buildManualProxy(), + if (type == 'manual') buildManualProxy(), ], ), ), @@ -164,7 +171,7 @@ class _ProxySettingViewState extends State<_ProxySettingView> { host = v; }, validator: (v) { - if(v?.isEmpty ?? false) { + if (v?.isEmpty ?? false) { return "Host cannot be empty".tl; } return null; @@ -181,10 +188,10 @@ class _ProxySettingViewState extends State<_ProxySettingView> { port = v; }, validator: (v) { - if(v?.isEmpty ?? true) { + if (v?.isEmpty ?? true) { return null; } - if(int.tryParse(v!) == null) { + if (int.tryParse(v!) == null) { return "Port must be a number".tl; } return null; @@ -201,7 +208,7 @@ class _ProxySettingViewState extends State<_ProxySettingView> { username = v; }, validator: (v) { - if((v?.isEmpty ?? false) && password.isNotEmpty) { + if ((v?.isEmpty ?? false) && password.isNotEmpty) { return "Username cannot be empty".tl; } return null; @@ -221,7 +228,7 @@ class _ProxySettingViewState extends State<_ProxySettingView> { const SizedBox(height: 16), FilledButton( onPressed: () { - if(formKey.currentState?.validate() ?? false) { + if (formKey.currentState?.validate() ?? false) { appdata.settings['proxy'] = toProxyStr(); appdata.saveData(); App.rootContext.pop();