feat: remember delete task option (#542)

This commit is contained in:
Levi authored and GitHub committed 2024-05-17 18:43:21 +08:00
1 parent a89c55b5c4
commit 0583e4aaa6
11 files changed
+120 -42

No files matched your search

@@ -17,6 +17,7 @@ class DownloaderConfig {
factory DownloaderConfig.fromJson(Map<String, dynamic> json) =>
_$DownloaderConfigFromJson(json);
Map<String, dynamic> toJson() => _$DownloaderConfigToJson(this);
}
@@ -29,6 +30,7 @@ class ProtocolConfig {
factory ProtocolConfig.fromJson(Map<String, dynamic>? json) =>
json == null ? ProtocolConfig() : _$ProtocolConfigFromJson(json);
Map<String, dynamic> toJson() => _$ProtocolConfigToJson(this);
}
@@ -47,6 +49,7 @@ class HttpConfig {
factory HttpConfig.fromJson(Map<String, dynamic> json) =>
_$HttpConfigFromJson(json);
Map<String, dynamic> toJson() => _$HttpConfigToJson(this);
}
@@ -59,19 +62,27 @@ class BtConfig {
factory BtConfig.fromJson(Map<String, dynamic> json) =>
_$BtConfigFromJson(json);
Map<String, dynamic> toJson() => _$BtConfigToJson(this);
}
@JsonSerializable(explicitToJson: true)
class ExtraConfig {
String themeMode = '';
String locale = '';
String themeMode;
String locale;
bool lastDeleteTaskKeep;
ExtraConfigBt bt = ExtraConfigBt();
ExtraConfig();
ExtraConfig({
this.themeMode = '',
this.locale = '',
this.lastDeleteTaskKeep = false,
});
factory ExtraConfig.fromJson(Map<String, dynamic>? json) =>
json == null ? ExtraConfig() : _$ExtraConfigFromJson(json);
Map<String, dynamic> toJson() => _$ExtraConfigToJson(this);
}
@@ -112,5 +123,6 @@ class ExtraConfigBt {
factory ExtraConfigBt.fromJson(Map<String, dynamic> json) =>
_$ExtraConfigBtFromJson(json);
Map<String, dynamic> toJson() => _$ExtraConfigBtToJson(this);
}
@@ -9,7 +9,7 @@ part of 'downloader_config.dart';
DownloaderConfig _$DownloaderConfigFromJson(Map<String, dynamic> json) =>
DownloaderConfig(
downloadDir: json['downloadDir'] as String? ?? '',
maxRunning: (json['maxRunning'] as num?)?.toInt() ?? 0,
maxRunning: json['maxRunning'] as int? ?? 0,
)
..protocolConfig = ProtocolConfig.fromJson(
json['protocolConfig'] as Map<String, dynamic>?)
@@ -39,7 +39,7 @@ Map<String, dynamic> _$ProtocolConfigToJson(ProtocolConfig instance) =>
HttpConfig _$HttpConfigFromJson(Map<String, dynamic> json) => HttpConfig(
userAgent: json['userAgent'] as String? ??
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
connections: (json['connections'] as num?)?.toInt() ?? 16,
connections: json['connections'] as int? ?? 16,
useServerCtime: json['useServerCtime'] as bool? ?? false,
);
@@ -51,7 +51,7 @@ Map<String, dynamic> _$HttpConfigToJson(HttpConfig instance) =>
};
BtConfig _$BtConfigFromJson(Map<String, dynamic> json) => BtConfig()
..listenPort = (json['listenPort'] as num).toInt()
..listenPort = json['listenPort'] as int
..trackers =
(json['trackers'] as List<dynamic>).map((e) => e as String).toList();
@@ -60,15 +60,17 @@ Map<String, dynamic> _$BtConfigToJson(BtConfig instance) => <String, dynamic>{
'trackers': instance.trackers,
};
ExtraConfig _$ExtraConfigFromJson(Map<String, dynamic> json) => ExtraConfig()
..themeMode = json['themeMode'] as String
..locale = json['locale'] as String
..bt = ExtraConfigBt.fromJson(json['bt'] as Map<String, dynamic>);
ExtraConfig _$ExtraConfigFromJson(Map<String, dynamic> json) => ExtraConfig(
themeMode: json['themeMode'] as String? ?? '',
locale: json['locale'] as String? ?? '',
lastDeleteTaskKeep: json['lastDeleteTaskKeep'] as bool? ?? false,
)..bt = ExtraConfigBt.fromJson(json['bt'] as Map<String, dynamic>);
Map<String, dynamic> _$ExtraConfigToJson(ExtraConfig instance) =>
<String, dynamic>{
'themeMode': instance.themeMode,
'locale': instance.locale,
'lastDeleteTaskKeep': instance.lastDeleteTaskKeep,
'bt': instance.bt.toJson(),
};
+2 -2
View File
@@ -10,7 +10,7 @@ Options _$OptionsFromJson(Map<String, dynamic> json) => Options(
name: json['name'] as String,
path: json['path'] as String,
selectFiles: (json['selectFiles'] as List<dynamic>?)
?.map((e) => (e as num).toInt())
?.map((e) => e as int)
.toList() ??
const [],
extra: json['extra'],
@@ -35,7 +35,7 @@ Map<String, dynamic> _$OptionsToJson(Options instance) {
OptsExtraHttp _$OptsExtraHttpFromJson(Map<String, dynamic> json) =>
OptsExtraHttp()
..connections = (json['connections'] as num).toInt()
..connections = json['connections'] as int
..autoTorrent = json['autoTorrent'] as bool;
Map<String, dynamic> _$OptsExtraHttpToJson(OptsExtraHttp instance) =>
+2 -2
View File
@@ -8,7 +8,7 @@ part of 'resource.dart';
Resource _$ResourceFromJson(Map<String, dynamic> json) => Resource(
name: json['name'] as String? ?? "",
size: (json['size'] as num?)?.toInt() ?? 0,
size: json['size'] as int? ?? 0,
range: json['range'] as bool? ?? false,
files: (json['files'] as List<dynamic>)
.map((e) => FileInfo.fromJson(e as Map<String, dynamic>))
@@ -27,7 +27,7 @@ Map<String, dynamic> _$ResourceToJson(Resource instance) => <String, dynamic>{
FileInfo _$FileInfoFromJson(Map<String, dynamic> json) => FileInfo(
path: json['path'] as String? ?? "",
name: json['name'] as String,
size: (json['size'] as num?)?.toInt() ?? 0,
size: json['size'] as int? ?? 0,
req: json['req'] == null
? null
: Request.fromJson(json['req'] as Map<String, dynamic>),
+1 -1
View File
@@ -11,7 +11,7 @@ Result<T> _$ResultFromJson<T>(
T Function(Object? json) fromJsonT,
) =>
Result<T>(
code: (json['code'] as num).toInt(),
code: json['code'] as int,
msg: json['msg'] as String?,
data: _$nullableGenericFromJson(json['data'], fromJsonT),
);
+3 -3
View File
@@ -34,9 +34,9 @@ const _$StatusEnumMap = {
};
Progress _$ProgressFromJson(Map<String, dynamic> json) => Progress(
used: (json['used'] as num).toInt(),
speed: (json['speed'] as num).toInt(),
downloaded: (json['downloaded'] as num).toInt(),
used: json['used'] as int,
speed: json['speed'] as int,
downloaded: json['downloaded'] as int,
);
Map<String, dynamic> _$ProgressToJson(Progress instance) => <String, dynamic>{
@@ -338,7 +338,7 @@ class AppController extends GetxController with WindowListener, TrayListener {
try {
downloaderConfig.value = await getConfig();
} catch (e) {
logger.w("load downloader config fail", e);
logger.w("load downloader config fail", e, StackTrace.current);
downloaderConfig.value = DownloaderConfig();
}
await _initDownloaderConfig();
@@ -17,6 +17,7 @@ import '../../../../util/input_formatter.dart';
import '../../../../util/message.dart';
import '../../../../util/util.dart';
import '../../../routes/app_pages.dart';
import '../../../views/compact_checkbox.dart';
import '../../../views/directory_selector.dart';
import '../../../views/file_list_view.dart';
import '../../app/controllers/app_controller.dart';
@@ -321,23 +322,13 @@ class CreateView extends GetView<CreateController> {
Row(
mainAxisSize: MainAxisSize.min,
children: [
TextButton(
onPressed: () {
controller.directDownload.value =
!controller.directDownload.value;
},
child: Row(children: [
Obx(() => Checkbox(
value:
controller.directDownload.value,
onChanged: (bool? value) {
controller.directDownload.value =
value ?? false;
},
)),
Text('directDownload'.tr),
]),
),
CompactCheckbox(
label: 'directDownload'.tr,
value: controller.directDownload.value,
onChanged: (bool? value) {
controller.directDownload.value =
value ?? false;
}),
TextButton(
onPressed: () {
controller.showAdvanced.value =
@@ -415,7 +406,7 @@ class CreateView extends GetView<CreateController> {
}
}
/*
/*
Check if is direct download, there has two ways to direct download
1. Direct download option is checked
2. Muli line urls
@@ -12,6 +12,7 @@ import '../../util/file_icon.dart';
import '../../util/icons.dart';
import '../../util/message.dart';
import '../../util/util.dart';
import '../modules/app/controllers/app_controller.dart';
import '../routes/app_pages.dart';
class BuildTaskListView extends GetView {
@@ -73,7 +74,7 @@ class BuildTaskListView extends GetView {
}
Future<void> showDeleteDialog(String id) {
final keep = true.obs;
final appController = Get.find<AppController>();
final context = Get.context!;
@@ -83,11 +84,14 @@ class BuildTaskListView extends GetView {
builder: (_) => AlertDialog(
title: Text('deleteTask'.tr),
content: Obx(() => CheckboxListTile(
value: keep.value,
value: appController
.downloaderConfig.value.extra.lastDeleteTaskKeep,
title: Text('deleteTaskTip'.tr,
style: context.textTheme.bodyLarge),
onChanged: (v) {
keep.value = v!;
appController.downloaderConfig.update((val) {
val!.extra.lastDeleteTaskKeep = v!;
});
})),
actions: [
TextButton(
@@ -101,7 +105,10 @@ class BuildTaskListView extends GetView {
),
onPressed: () async {
try {
await deleteTask(id, !keep.value);
final force = !appController
.downloaderConfig.value.extra.lastDeleteTaskKeep;
await appController.saveConfig();
await deleteTask(id, force);
Get.back();
} catch (e) {
showErrorMessage(e);
@@ -0,0 +1,66 @@
import 'package:flutter/material.dart';
class CompactCheckbox extends StatefulWidget {
final String label;
final bool value;
final ValueChanged<bool?>? onChanged;
final double? scale;
final TextStyle? textStyle;
const CompactCheckbox({
super.key,
required this.label,
required this.value,
this.onChanged,
this.scale,
this.textStyle,
});
@override
State<CompactCheckbox> createState() => _CompactCheckboxState();
}
class _CompactCheckboxState extends State<CompactCheckbox> {
late bool _value;
@override
void initState() {
super.initState();
_value = widget.value;
}
valueChanged(bool? value) {
setState(() {
_value = value!;
});
widget.onChanged?.call(_value);
}
@override
Widget build(BuildContext context) {
final checkbox = Checkbox(
value: _value,
onChanged: valueChanged,
);
return TextButton(
onPressed: () {
valueChanged(!_value);
},
child: Row(
children: [
widget.scale == null
? checkbox
: Transform.scale(
scale: widget.scale,
child: checkbox,
),
Text(
widget.label,
style: widget.textStyle,
),
],
),
);
}
}
@@ -11,7 +11,7 @@ StartConfig _$StartConfigFromJson(Map<String, dynamic> json) => StartConfig()
..address = json['address'] as String
..storage = json['storage'] as String
..storageDir = json['storageDir'] as String
..refreshInterval = (json['refreshInterval'] as num).toInt()
..refreshInterval = json['refreshInterval'] as int
..apiToken = json['apiToken'] as String;
Map<String, dynamic> _$StartConfigToJson(StartConfig instance) =>