mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
opt: unread msg
Closes #122 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -17,6 +17,7 @@ import 'package:PiliPlus/pages/main/controller.dart';
|
||||
import 'package:PiliPlus/pages/member/new/controller.dart';
|
||||
import 'package:PiliPlus/pages/mine/controller.dart';
|
||||
import 'package:PiliPlus/pages/setting/pages/color_select.dart';
|
||||
import 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart';
|
||||
import 'package:PiliPlus/pages/setting/widgets/normal_item.dart';
|
||||
import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';
|
||||
import 'package:PiliPlus/pages/setting/widgets/slide_dialog.dart';
|
||||
@@ -286,12 +287,12 @@ List<SettingsModel> get styleSettings => [
|
||||
SettingsModel(
|
||||
settingsType: SettingsType.normal,
|
||||
onTap: (setState) async {
|
||||
MsgUnReadType? result = await showDialog(
|
||||
List<MsgUnReadType>? result = await showDialog(
|
||||
context: Get.context!,
|
||||
builder: (context) {
|
||||
return SelectDialog<MsgUnReadType>(
|
||||
return MultiSelectDialog<MsgUnReadType>(
|
||||
title: '消息未读类型',
|
||||
value: GStorage.msgUnReadType,
|
||||
initValues: GStorage.msgUnReadTypeV2,
|
||||
values: MsgUnReadType.values.map((e) {
|
||||
return {'title': e.title, 'value': e};
|
||||
}).toList(),
|
||||
@@ -299,9 +300,10 @@ List<SettingsModel> get styleSettings => [
|
||||
},
|
||||
);
|
||||
if (result != null) {
|
||||
GStorage.setting.put(SettingBoxKey.msgUnReadType, result.index);
|
||||
GStorage.setting.put(SettingBoxKey.msgUnReadTypeV2,
|
||||
result.map((item) => item.index).toList()..sort());
|
||||
MainController mainController = Get.put(MainController());
|
||||
mainController.msgUnReadType = MsgUnReadType.values[result.index];
|
||||
mainController.msgUnReadTypes = result;
|
||||
if (mainController.msgBadgeMode != DynamicBadgeMode.hidden) {
|
||||
mainController.queryUnreadMsg();
|
||||
}
|
||||
@@ -311,7 +313,8 @@ List<SettingsModel> get styleSettings => [
|
||||
},
|
||||
title: '消息未读类型',
|
||||
leading: const Icon(Icons.notifications_active_outlined),
|
||||
getSubtitle: () => '当前消息类型:${GStorage.msgUnReadType.title}',
|
||||
getSubtitle: () =>
|
||||
'当前消息类型:${GStorage.msgUnReadTypeV2.map((item) => item.title).join('、')}',
|
||||
),
|
||||
SettingsModel(
|
||||
settingsType: SettingsType.sw1tch,
|
||||
|
||||
87
lib/pages/setting/widgets/multi_select_dialog.dart
Normal file
87
lib/pages/setting/widgets/multi_select_dialog.dart
Normal file
@@ -0,0 +1,87 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class MultiSelectDialog<T> extends StatefulWidget {
|
||||
final List<T> initValues;
|
||||
final String title;
|
||||
final List<dynamic> values;
|
||||
|
||||
const MultiSelectDialog({
|
||||
super.key,
|
||||
required this.initValues,
|
||||
required this.values,
|
||||
required this.title,
|
||||
});
|
||||
|
||||
@override
|
||||
State<MultiSelectDialog<T>> createState() => _MultiSelectDialogState<T>();
|
||||
}
|
||||
|
||||
class _MultiSelectDialogState<T> extends State<MultiSelectDialog<T>> {
|
||||
late Set<T> _tempValues;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_tempValues = widget.initValues.toSet();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
clipBehavior: Clip.hardEdge,
|
||||
title: Text(
|
||||
widget.title,
|
||||
style: TextStyle(fontSize: 18),
|
||||
),
|
||||
contentPadding: const EdgeInsets.only(top: 12),
|
||||
content: StatefulBuilder(builder: (context, StateSetter setState) {
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: List.generate(
|
||||
widget.values.length,
|
||||
(index) {
|
||||
bool isChecked =
|
||||
_tempValues.contains(widget.values[index]['value']);
|
||||
return CheckboxListTile(
|
||||
dense: true,
|
||||
value: isChecked,
|
||||
controlAffinity: ListTileControlAffinity.leading,
|
||||
title: Text(
|
||||
widget.values[index]['title'],
|
||||
style: Theme.of(context).textTheme.titleMedium!,
|
||||
),
|
||||
onChanged: (value) {
|
||||
if (isChecked) {
|
||||
_tempValues.remove(widget.values[index]['value']);
|
||||
} else {
|
||||
_tempValues.add(widget.values[index]['value']);
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
actionsPadding: EdgeInsets.only(left: 16, right: 16, bottom: 12),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: Get.back,
|
||||
child: Text(
|
||||
'取消',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.outline,
|
||||
),
|
||||
),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () => Get.back(result: _tempValues.toList()),
|
||||
child: const Text('确定'),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -93,8 +93,6 @@ class _SelectDialogState<T> extends State<SelectDialog<T>> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
TextStyle titleStyle = Theme.of(context).textTheme.titleMedium!;
|
||||
|
||||
return AlertDialog(
|
||||
clipBehavior: Clip.hardEdge,
|
||||
title: Text(
|
||||
@@ -111,7 +109,10 @@ class _SelectDialogState<T> extends State<SelectDialog<T>> {
|
||||
(index) => RadioListTile(
|
||||
dense: true,
|
||||
value: widget.values[index]['value'],
|
||||
title: Text(widget.values[index]['title'], style: titleStyle),
|
||||
title: Text(
|
||||
widget.values[index]['title'],
|
||||
style: Theme.of(context).textTheme.titleMedium!,
|
||||
),
|
||||
subtitle: widget.title == 'CDN 设置' && cdnSpeedTest
|
||||
? Text(
|
||||
_cdnResList[index] is double
|
||||
|
||||
Reference in New Issue
Block a user