fav order

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-07-21 17:45:07 +08:00
parent 042a7df7f3
commit 8a62f5bbee
7 changed files with 74 additions and 9 deletions

View File

@@ -2,6 +2,7 @@ import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/api.dart';
import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/init.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/fav_order_type.dart';
import 'package:PiliPlus/models_new/fav/fav_article/data.dart'; import 'package:PiliPlus/models_new/fav/fav_article/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/data.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/data.dart';
@@ -48,13 +49,14 @@ class FavHttp {
} }
} }
static Future<LoadingState<FavDetailData>> userFavFolderDetail( static Future<LoadingState<FavDetailData>> userFavFolderDetail({
{required int mediaId, required int mediaId,
required int pn, required int pn,
required int ps, required int ps,
String keyword = '', String keyword = '',
String order = 'mtime', FavOrderType order = FavOrderType.mtime,
int type = 0}) async { int type = 0,
}) async {
var res = await Request().get( var res = await Request().get(
Api.favResourceList, Api.favResourceList,
queryParameters: { queryParameters: {
@@ -62,7 +64,7 @@ class FavHttp {
'pn': pn, 'pn': pn,
'ps': ps, 'ps': ps,
'keyword': keyword, 'keyword': keyword,
'order': order, 'order': order.name,
'type': type, 'type': type,
'tid': 0, 'tid': 0,
'platform': 'web' 'platform': 'web'

View File

@@ -0,0 +1,10 @@
enum FavOrderType {
mtime('最近收藏'),
view('最多播放'),
pubtime('最近投稿'),
;
final String label;
const FavOrderType(this.label);
}

View File

@@ -12,6 +12,8 @@ abstract class CommonSearchPageState<S extends CommonSearchPage, R, T>
extends State<S> { extends State<S> {
CommonSearchController<R, T> get controller; CommonSearchController<R, T> get controller;
List<Widget>? extraActions;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@@ -23,7 +25,8 @@ abstract class CommonSearchPageState<S extends CommonSearchPage, R, T>
onPressed: controller.onRefresh, onPressed: controller.onRefresh,
icon: const Icon(Icons.search_outlined, size: 22), icon: const Icon(Icons.search_outlined, size: 22),
), ),
const SizedBox(width: 10) ...?extraActions,
const SizedBox(width: 10),
], ],
title: TextField( title: TextField(
autofocus: true, autofocus: true,

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/fav_order_type.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
@@ -19,6 +20,7 @@ class FavDetailController
late String heroTag; late String heroTag;
final Rx<FavFolderInfo> folderInfo = FavFolderInfo().obs; final Rx<FavFolderInfo> folderInfo = FavFolderInfo().obs;
final Rx<bool?> isOwner = Rx<bool?>(null); final Rx<bool?> isOwner = Rx<bool?>(null);
final Rx<FavOrderType> order = FavOrderType.mtime.obs;
AccountService accountService = Get.find<AccountService>(); AccountService accountService = Get.find<AccountService>();
@@ -84,6 +86,7 @@ class FavDetailController
pn: page, pn: page,
ps: 20, ps: 20,
mediaId: mediaId, mediaId: mediaId,
order: order.value,
); );
void onDelChecked(BuildContext context) { void onDelChecked(BuildContext context) {

View File

@@ -7,6 +7,7 @@ import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/fav_order_type.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/list.dart';
@@ -160,6 +161,24 @@ class _FavDetailPageState extends State<FavDetailPage> {
icon: const Icon(Icons.share), icon: const Icon(Icons.share),
); );
}), }),
Obx(
() {
return PopupMenuButton<FavOrderType>(
icon: const Icon(Icons.sort),
initialValue: _favDetailController.order.value,
tooltip: '排序方式',
onSelected: (value) => _favDetailController
..order.value = value
..onReload(),
itemBuilder: (context) => FavOrderType.values
.map((e) => PopupMenuItem(
value: e,
child: Text(e.label),
))
.toList(),
);
},
),
PopupMenuButton( PopupMenuButton(
icon: const Icon(Icons.more_vert), icon: const Icon(Icons.more_vert),
itemBuilder: (context) { itemBuilder: (context) {

View File

@@ -1,5 +1,6 @@
import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/fav.dart';
import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/common/fav_order_type.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/pages/common/common_search_controller.dart'; import 'package:PiliPlus/pages/common/common_search_controller.dart';
@@ -14,6 +15,8 @@ class FavSearchController
dynamic count = Get.arguments['count']; dynamic count = Get.arguments['count'];
dynamic title = Get.arguments['title']; dynamic title = Get.arguments['title'];
final Rx<FavOrderType> order = FavOrderType.mtime.obs;
@override @override
Future<LoadingState<FavDetailData>> customGetData() => Future<LoadingState<FavDetailData>> customGetData() =>
FavHttp.userFavFolderDetail( FavHttp.userFavFolderDetail(
@@ -22,6 +25,7 @@ class FavSearchController
mediaId: mediaId, mediaId: mediaId,
keyword: editController.text, keyword: editController.text,
type: type, type: type,
order: order.value,
); );
@override @override

View File

@@ -1,3 +1,4 @@
import 'package:PiliPlus/models/common/fav_order_type.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/data.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/data.dart';
import 'package:PiliPlus/models_new/fav/fav_detail/media.dart'; import 'package:PiliPlus/models_new/fav/fav_detail/media.dart';
import 'package:PiliPlus/pages/common/common_search_page.dart'; import 'package:PiliPlus/pages/common/common_search_page.dart';
@@ -24,6 +25,29 @@ class _FavSearchPageState extends CommonSearchPageState<FavSearchPage,
tag: Utils.generateRandomString(8), tag: Utils.generateRandomString(8),
); );
@override
List<Widget>? get extraActions => [
Obx(
() {
return PopupMenuButton<FavOrderType>(
icon: const Icon(Icons.sort),
requestFocus: false,
initialValue: controller.order.value,
tooltip: '排序方式',
onSelected: (value) => controller
..order.value = value
..onReload(),
itemBuilder: (context) => FavOrderType.values
.map((e) => PopupMenuItem(
value: e,
child: Text(e.label),
))
.toList(),
);
},
),
];
@override @override
Widget buildList(List<FavDetailItemModel> list) { Widget buildList(List<FavDetailItemModel> list) {
return SliverGrid( return SliverGrid(