opt pgc index

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-09-06 12:17:33 +08:00
parent 5bf09b98f4
commit a74cbe215e
6 changed files with 109 additions and 85 deletions

View File

@@ -1,5 +1,4 @@
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/filter.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/order.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/sort.dart';
class PgcIndexConditionData {
List<PgcConditionFilter>? filter;

View File

@@ -1,18 +0,0 @@
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/value.dart';
class PgcConditionFilter {
String? field;
String? name;
List<PgcConditionValue>? values;
PgcConditionFilter({this.field, this.name, this.values});
factory PgcConditionFilter.fromJson(Map<String, dynamic> json) =>
PgcConditionFilter(
field: json['field'] as String?,
name: json['name'] as String?,
values: (json['values'] as List<dynamic>?)
?.map((e) => PgcConditionValue.fromJson(e as Map<String, dynamic>))
.toList(),
);
}

View File

@@ -1,14 +0,0 @@
class PgcConditionOrder {
String? field;
String? name;
String? sort;
PgcConditionOrder({this.field, this.name, this.sort});
factory PgcConditionOrder.fromJson(Map<String, dynamic> json) =>
PgcConditionOrder(
field: json['field'] as String?,
name: json['name'] as String?,
sort: json['sort'] as String?,
);
}

View File

@@ -0,0 +1,39 @@
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/value.dart';
class PgcCondition {
String? field;
String? name;
PgcCondition({
this.field,
this.name,
});
}
class PgcConditionFilter extends PgcCondition {
List<PgcConditionValue>? values;
PgcConditionFilter({super.field, super.name, this.values});
factory PgcConditionFilter.fromJson(Map<String, dynamic> json) =>
PgcConditionFilter(
field: json['field'] as String?,
name: json['name'] as String?,
values: (json['values'] as List<dynamic>?)
?.map((e) => PgcConditionValue.fromJson(e as Map<String, dynamic>))
.toList(),
);
}
class PgcConditionOrder extends PgcCondition {
String? sort;
PgcConditionOrder({super.field, super.name, this.sort});
factory PgcConditionOrder.fromJson(Map<String, dynamic> json) =>
PgcConditionOrder(
field: json['field'] as String?,
name: json['name'] as String?,
sort: json['sort'] as String?,
);
}

View File

@@ -1,7 +1,7 @@
import 'package:PiliPlus/http/pgc.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/pgc.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/data.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/filter.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/sort.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_result/data.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';
import 'package:PiliPlus/pages/common/common_list_controller.dart';

View File

@@ -4,7 +4,8 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
import 'package:PiliPlus/common/widgets/self_sized_horizontal_list.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/data.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/order.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/sort.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_condition/value.dart';
import 'package:PiliPlus/models_new/pgc/pgc_index_result/list.dart';
import 'package:PiliPlus/pages/pgc_index/controller.dart';
import 'package:PiliPlus/pages/pgc_index/widgets/pgc_card_v_pgc_index.dart';
@@ -71,8 +72,8 @@ class _PgcIndexPageState extends State<PgcIndexPage>
alignment: Alignment.topCenter,
duration: const Duration(milliseconds: 200),
child: count > 5
? Obx(() => _buildSortWidget(theme, count, response))
: _buildSortWidget(theme, count, response),
? Obx(() => _buildSortsWidget(theme, count, response))
: _buildSortsWidget(theme, count, response),
),
),
SliverPadding(
@@ -99,6 +100,64 @@ class _PgcIndexPageState extends State<PgcIndexPage>
}
Widget _buildSortWidget(
ThemeData theme,
int index,
PgcIndexConditionData data,
item,
) {
if (item case PgcConditionOrder e) {
return Obx(
() {
final isCurr = _ctr.indexParams['order'] == e.field;
return SearchText(
bgColor: isCurr
? theme.colorScheme.secondaryContainer
: Colors.transparent,
textColor: isCurr
? theme.colorScheme.onSecondaryContainer
: theme.colorScheme.onSurfaceVariant,
text: e.name!,
padding: const EdgeInsets.symmetric(
horizontal: 6,
vertical: 3,
),
onTap: (_) => _ctr
..indexParams['order'] = e.field
..onReload(),
);
},
);
}
if (item case PgcConditionValue e) {
final hasOrder = data.order?.isNotEmpty == true;
if (hasOrder) index -= 1;
final key = data.filter![index].field!;
return Obx(
() {
final isCurr = _ctr.indexParams[key] == e.keyword;
return SearchText(
bgColor: isCurr
? theme.colorScheme.secondaryContainer
: Colors.transparent,
textColor: isCurr
? theme.colorScheme.onSecondaryContainer
: theme.colorScheme.onSurfaceVariant,
text: e.name!,
padding: const EdgeInsets.symmetric(
horizontal: 6,
vertical: 3,
),
onTap: (_) => _ctr
..indexParams[key] = e.keyword
..onReload(),
);
},
);
}
throw UnsupportedError('${item.runtimeType}');
}
Widget _buildSortsWidget(
ThemeData theme,
int count,
PgcIndexConditionData data,
@@ -127,52 +186,11 @@ class _PgcIndexPageState extends State<PgcIndexPage>
gapSize: 12,
padding: const EdgeInsets.symmetric(horizontal: 12),
childBuilder: (childIndex) {
final e = item[childIndex];
return Obx(
() => SearchText(
bgColor:
(e is PgcConditionOrder
? _ctr.indexParams['order']
: _ctr.indexParams[data
.filter![data.order?.isNotEmpty ==
true
? index - 1
: index]
.field]) ==
(e is PgcConditionOrder ? e.field : e.keyword)
? theme.colorScheme.secondaryContainer
: Colors.transparent,
textColor:
(e is PgcConditionOrder
? _ctr.indexParams['order']
: _ctr.indexParams[data
.filter![data.order?.isNotEmpty ==
true
? index - 1
: index]
.field]) ==
(e is PgcConditionOrder ? e.field : e.keyword)
? theme.colorScheme.onSecondaryContainer
: theme.colorScheme.onSurfaceVariant,
text: e.name,
padding: const EdgeInsets.symmetric(
horizontal: 6,
vertical: 3,
),
onTap: (_) {
String name = e is PgcConditionOrder
? 'order'
: data
.filter![data.order?.isNotEmpty == true
? index - 1
: index]
.field!;
_ctr.indexParams[name] = (e is PgcConditionOrder
? e.field
: e.keyword);
_ctr.onReload();
},
),
return _buildSortWidget(
theme,
index,
data,
item[childIndex],
);
},
itemCount: item!.length,