add download threads setting

This commit is contained in:
2024-11-03 15:49:34 +08:00
parent 28913adc86
commit 45e7f0dfc2
4 changed files with 31 additions and 20 deletions

View File

@@ -155,7 +155,8 @@
"Start": "开始", "Start": "开始",
"Export App Data": "导出应用数据", "Export App Data": "导出应用数据",
"Import App Data": "导入应用数据", "Import App Data": "导入应用数据",
"Export": "导出" "Export": "导出",
"Download Threads": "下载线程数"
}, },
"zh_TW": { "zh_TW": {
"Home": "首頁", "Home": "首頁",
@@ -313,6 +314,7 @@
"Start": "開始", "Start": "開始",
"Export App Data": "匯出應用數據", "Export App Data": "匯出應用數據",
"Import App Data": "匯入應用數據", "Import App Data": "匯入應用數據",
"Export": "匯出" "Export": "匯出",
"Download Threads": "下載線程數"
} }
} }

View File

@@ -110,6 +110,7 @@ class _Settings with ChangeNotifier {
'enablePageAnimation': true, 'enablePageAnimation': true,
'language': 'system', // system, zh-CN, zh-TW, en-US 'language': 'system', // system, zh-CN, zh-TW, en-US
'cacheSize': 2048, // in MB 'cacheSize': 2048, // in MB
'downloadThreads': 5,
}; };
operator [](String key) { operator [](String key) {

View File

@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/widgets.dart' show ChangeNotifier; 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_source/comic_source.dart';
import 'package:venera/foundation/comic_type.dart'; import 'package:venera/foundation/comic_type.dart';
import 'package:venera/foundation/local.dart'; import 'package:venera/foundation/local.dart';
@@ -155,7 +156,7 @@ class ImagesDownloadTask extends DownloadTask with _TransferSpeedMixin {
var tasks = <int, _ImageDownloadWrapper>{}; var tasks = <int, _ImageDownloadWrapper>{};
int get _maxConcurrentTasks => 5; int get _maxConcurrentTasks => (appdata.settings["downloadThreads"] as num).toInt();
void _scheduleTasks() { void _scheduleTasks() {
var images = _images![_images!.keys.elementAt(_chapter)]!; var images = _images![_images!.keys.elementAt(_chapter)]!;

View File

@@ -17,6 +17,13 @@ class _NetworkSettingsState extends State<NetworkSettings> {
title: "Proxy".tl, title: "Proxy".tl,
builder: () => const _ProxySettingView(), builder: () => const _ProxySettingView(),
).toSliver(), ).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 // USERNAME:PASSWORD@HOST:PORT
String toProxyStr() { String toProxyStr() {
if(type == 'direct') { if (type == 'direct') {
return 'direct'; return 'direct';
} else if(type == 'system') { } else if (type == 'system') {
return 'system'; return 'system';
} }
var res = ''; var res = '';
if(username.isNotEmpty) { if (username.isNotEmpty) {
res += username; res += username;
if(password.isNotEmpty) { if (password.isNotEmpty) {
res += ':$password'; res += ':$password';
} }
res += '@'; res += '@';
} }
res += host; res += host;
if(port.isNotEmpty) { if (port.isNotEmpty) {
res += ':$port'; res += ':$port';
} }
return res; return res;
} }
void parseProxyString(String proxy) { void parseProxyString(String proxy) {
if(proxy == 'direct') { if (proxy == 'direct') {
type = 'direct'; type = 'direct';
return; return;
} else if(proxy == 'system') { } else if (proxy == 'system') {
type = 'system'; type = 'system';
return; return;
} }
type = 'manual'; type = 'manual';
var parts = proxy.split('@'); var parts = proxy.split('@');
if(parts.length == 2) { if (parts.length == 2) {
var auth = parts[0].split(':'); var auth = parts[0].split(':');
if(auth.length == 2) { if (auth.length == 2) {
username = auth[0]; username = auth[0];
password = auth[1]; password = auth[1];
} }
parts = parts[1].split(':'); parts = parts[1].split(':');
if(parts.length == 2) { if (parts.length == 2) {
host = parts[0]; host = parts[0];
port = parts[1]; port = parts[1];
} }
} else { } else {
parts = proxy.split(':'); parts = proxy.split(':');
if(parts.length == 2) { if (parts.length == 2) {
host = parts[0]; host = parts[0];
port = parts[1]; 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; host = v;
}, },
validator: (v) { validator: (v) {
if(v?.isEmpty ?? false) { if (v?.isEmpty ?? false) {
return "Host cannot be empty".tl; return "Host cannot be empty".tl;
} }
return null; return null;
@@ -181,10 +188,10 @@ class _ProxySettingViewState extends State<_ProxySettingView> {
port = v; port = v;
}, },
validator: (v) { validator: (v) {
if(v?.isEmpty ?? true) { if (v?.isEmpty ?? true) {
return null; return null;
} }
if(int.tryParse(v!) == null) { if (int.tryParse(v!) == null) {
return "Port must be a number".tl; return "Port must be a number".tl;
} }
return null; return null;
@@ -201,7 +208,7 @@ class _ProxySettingViewState extends State<_ProxySettingView> {
username = v; username = v;
}, },
validator: (v) { validator: (v) {
if((v?.isEmpty ?? false) && password.isNotEmpty) { if ((v?.isEmpty ?? false) && password.isNotEmpty) {
return "Username cannot be empty".tl; return "Username cannot be empty".tl;
} }
return null; return null;
@@ -221,7 +228,7 @@ class _ProxySettingViewState extends State<_ProxySettingView> {
const SizedBox(height: 16), const SizedBox(height: 16),
FilledButton( FilledButton(
onPressed: () { onPressed: () {
if(formKey.currentState?.validate() ?? false) { if (formKey.currentState?.validate() ?? false) {
appdata.settings['proxy'] = toProxyStr(); appdata.settings['proxy'] = toProxyStr();
appdata.saveData(); appdata.saveData();
App.rootContext.pop(); App.rootContext.pop();