mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-05-02 08:09:47 +08:00
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
class StatDatas {
|
|
||||||
StatDatas();
|
|
||||||
|
|
||||||
factory StatDatas.fromJson(Map<String, dynamic> json) {
|
|
||||||
// TODO: implement fromJson
|
|
||||||
throw UnimplementedError('StatDatas.fromJson($json) is not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
// TODO: implement toJson
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
class AvatarLayer {
|
|
||||||
AvatarLayer();
|
|
||||||
|
|
||||||
factory AvatarLayer.fromJson(Map<String, dynamic> json) {
|
|
||||||
// TODO: implement fromJson
|
|
||||||
throw UnimplementedError('AvatarLayer.fromJson($json) is not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
// TODO: implement toJson
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
class FansEffect {
|
|
||||||
FansEffect();
|
|
||||||
|
|
||||||
factory FansEffect.fromJson(Map<String, dynamic> json) {
|
|
||||||
// TODO: implement fromJson
|
|
||||||
throw UnimplementedError('FansEffect.fromJson($json) is not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
// TODO: implement toJson
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
class Profession {
|
|
||||||
Profession();
|
|
||||||
|
|
||||||
factory Profession.fromJson(Map<String, dynamic> json) {
|
|
||||||
// TODO: implement fromJson
|
|
||||||
throw UnimplementedError('Profession.fromJson($json) is not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
// TODO: implement toJson
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
class School {
|
|
||||||
School();
|
|
||||||
|
|
||||||
factory School.fromJson(Map<String, dynamic> json) {
|
|
||||||
// TODO: implement fromJson
|
|
||||||
throw UnimplementedError('School.fromJson($json) is not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
// TODO: implement toJson
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import 'package:json_annotation/json_annotation.dart';
|
|
||||||
|
|
||||||
import 'avatar_layer.dart';
|
|
||||||
|
|
||||||
part 'tags.g.dart';
|
|
||||||
|
|
||||||
@JsonSerializable()
|
|
||||||
class Tags {
|
|
||||||
@JsonKey(name: 'AVATAR_LAYER')
|
|
||||||
AvatarLayer? avatarLayer;
|
|
||||||
|
|
||||||
Tags({this.avatarLayer});
|
|
||||||
|
|
||||||
factory Tags.fromJson(Map<String, dynamic> json) => _$TagsFromJson(json);
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$TagsToJson(this);
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
||||||
|
|
||||||
part of 'tags.dart';
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// JsonSerializableGenerator
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
Tags _$TagsFromJson(Map<String, dynamic> json) => Tags(
|
|
||||||
avatarLayer: json['AVATAR_LAYER'] == null
|
|
||||||
? null
|
|
||||||
: AvatarLayer.fromJson(json['AVATAR_LAYER'] as Map<String, dynamic>),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$TagsToJson(Tags instance) => <String, dynamic>{
|
|
||||||
'AVATAR_LAYER': instance.avatarLayer,
|
|
||||||
};
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
class ThreePoint {
|
|
||||||
ThreePoint();
|
|
||||||
|
|
||||||
factory ThreePoint.fromJson(Map<String, dynamic> json) {
|
|
||||||
// TODO: implement fromJson
|
|
||||||
throw UnimplementedError('ThreePoint.fromJson($json) is not implemented');
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
|
||||||
// TODO: implement toJson
|
|
||||||
throw UnimplementedError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
68
lib/pages/danmaku_block/controller.dart
Normal file
68
lib/pages/danmaku_block/controller.dart
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
import 'package:PiliPlus/http/danmaku_block.dart';
|
||||||
|
import 'package:PiliPlus/models/user/danmaku_block.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
class DanmakuBlockController extends GetxController
|
||||||
|
with GetTickerProviderStateMixin {
|
||||||
|
final ruleTypes = RxMap<int, Map<int, String>>({0: {}, 1: {}, 2: {}});
|
||||||
|
late TabController tabController;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onInit() {
|
||||||
|
super.onInit();
|
||||||
|
tabController = TabController(length: 3, vsync: this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onClose() {
|
||||||
|
tabController.dispose();
|
||||||
|
super.onClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> queryDanmakuFilter() async {
|
||||||
|
SmartDialog.showLoading(msg: '正在同步弹幕屏蔽规则……');
|
||||||
|
var result = await DanmakuFilterHttp.danmakuFilter();
|
||||||
|
SmartDialog.dismiss();
|
||||||
|
if (result['status']) {
|
||||||
|
if (result['data']?.rule != null) {
|
||||||
|
final List<SimpleRule> filter = result['data']?.rule;
|
||||||
|
for (var rule in filter) {
|
||||||
|
ruleTypes[rule.type]![rule.id] = rule.filter;
|
||||||
|
}
|
||||||
|
ruleTypes.refresh();
|
||||||
|
}
|
||||||
|
SmartDialog.showToast(result['data'].toast);
|
||||||
|
} else {
|
||||||
|
SmartDialog.showToast(result['msg']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> danmakuFilterDel(int type, int id) async {
|
||||||
|
SmartDialog.showLoading(msg: '正在删除弹幕屏蔽规则……');
|
||||||
|
var result = await DanmakuFilterHttp.danmakuFilterDel(ids: id);
|
||||||
|
SmartDialog.dismiss();
|
||||||
|
if (result['status']) {
|
||||||
|
ruleTypes[type]!.remove(id);
|
||||||
|
ruleTypes.refresh();
|
||||||
|
}
|
||||||
|
SmartDialog.showToast(result['msg']);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> danmakuFilterAdd(
|
||||||
|
{required String filter, required int type}) async {
|
||||||
|
SmartDialog.showLoading(msg: '正在添加弹幕屏蔽规则……');
|
||||||
|
var result =
|
||||||
|
await DanmakuFilterHttp.danmakuFilterAdd(filter: filter, type: type);
|
||||||
|
SmartDialog.dismiss();
|
||||||
|
if (result['status']) {
|
||||||
|
SimpleRule rule = result['data'];
|
||||||
|
ruleTypes[type]![rule.id] = rule.filter;
|
||||||
|
ruleTypes.refresh();
|
||||||
|
SmartDialog.showToast('添加成功');
|
||||||
|
} else {
|
||||||
|
SmartDialog.showToast(result['msg']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
import 'package:PiliPlus/models/user/danmaku_rule.dart';
|
import 'package:PiliPlus/models/user/danmaku_rule.dart';
|
||||||
|
import 'package:PiliPlus/pages/danmaku_block/controller.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:PiliPlus/utils/storage.dart';
|
import 'package:PiliPlus/utils/storage.dart';
|
||||||
|
|
||||||
import '../../http/danmaku_block.dart';
|
|
||||||
import '../../models/user/danmaku_block.dart';
|
|
||||||
import '../../plugin/pl_player/controller.dart';
|
import '../../plugin/pl_player/controller.dart';
|
||||||
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
|
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
|
||||||
|
|
||||||
@@ -146,66 +145,3 @@ class _DanmakuBlockPageState extends State<DanmakuBlockPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DanmakuBlockController extends GetxController
|
|
||||||
with GetTickerProviderStateMixin {
|
|
||||||
final ruleTypes = RxMap<int, Map<int, String>>({0: {}, 1: {}, 2: {}});
|
|
||||||
late TabController tabController;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void onInit() {
|
|
||||||
super.onInit();
|
|
||||||
tabController = TabController(length: 3, vsync: this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void onClose() {
|
|
||||||
tabController.dispose();
|
|
||||||
super.onClose();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> queryDanmakuFilter() async {
|
|
||||||
SmartDialog.showLoading(msg: '正在同步弹幕屏蔽规则……');
|
|
||||||
var result = await DanmakuFilterHttp.danmakuFilter();
|
|
||||||
SmartDialog.dismiss();
|
|
||||||
if (result['status']) {
|
|
||||||
if (result['data']?.rule != null) {
|
|
||||||
final List<SimpleRule> filter = result['data']?.rule;
|
|
||||||
for (var rule in filter) {
|
|
||||||
ruleTypes[rule.type]![rule.id] = rule.filter;
|
|
||||||
}
|
|
||||||
ruleTypes.refresh();
|
|
||||||
}
|
|
||||||
SmartDialog.showToast(result['data'].toast);
|
|
||||||
} else {
|
|
||||||
SmartDialog.showToast(result['msg']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> danmakuFilterDel(int type, int id) async {
|
|
||||||
SmartDialog.showLoading(msg: '正在删除弹幕屏蔽规则……');
|
|
||||||
var result = await DanmakuFilterHttp.danmakuFilterDel(ids: id);
|
|
||||||
SmartDialog.dismiss();
|
|
||||||
if (result['status']) {
|
|
||||||
ruleTypes[type]!.remove(id);
|
|
||||||
ruleTypes.refresh();
|
|
||||||
}
|
|
||||||
SmartDialog.showToast(result['msg']);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> danmakuFilterAdd(
|
|
||||||
{required String filter, required int type}) async {
|
|
||||||
SmartDialog.showLoading(msg: '正在添加弹幕屏蔽规则……');
|
|
||||||
var result =
|
|
||||||
await DanmakuFilterHttp.danmakuFilterAdd(filter: filter, type: type);
|
|
||||||
SmartDialog.dismiss();
|
|
||||||
if (result['status']) {
|
|
||||||
SimpleRule rule = result['data'];
|
|
||||||
ruleTypes[type]![rule.id] = rule.filter;
|
|
||||||
ruleTypes.refresh();
|
|
||||||
SmartDialog.showToast('添加成功');
|
|
||||||
} else {
|
|
||||||
SmartDialog.showToast(result['msg']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'package:PiliPlus/common/widgets/image_save.dart';
|
import 'package:PiliPlus/common/widgets/image_save.dart';
|
||||||
|
import 'package:PiliPlus/models/user/fav_folder.dart';
|
||||||
import 'package:PiliPlus/utils/utils.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:PiliPlus/common/constants.dart';
|
import 'package:PiliPlus/common/constants.dart';
|
||||||
@@ -6,7 +7,7 @@ import 'package:PiliPlus/common/widgets/network_img_layer.dart';
|
|||||||
|
|
||||||
class FavItem extends StatelessWidget {
|
class FavItem extends StatelessWidget {
|
||||||
final String heroTag;
|
final String heroTag;
|
||||||
final dynamic favFolderItem;
|
final FavFolderItemData favFolderItem;
|
||||||
final VoidCallback? onTap;
|
final VoidCallback? onTap;
|
||||||
final VoidCallback? onLongPress;
|
final VoidCallback? onLongPress;
|
||||||
|
|
||||||
@@ -40,14 +41,12 @@ class FavItem extends StatelessWidget {
|
|||||||
aspectRatio: StyleString.aspectRatio,
|
aspectRatio: StyleString.aspectRatio,
|
||||||
child: LayoutBuilder(
|
child: LayoutBuilder(
|
||||||
builder: (context, boxConstraints) {
|
builder: (context, boxConstraints) {
|
||||||
double maxWidth = boxConstraints.maxWidth;
|
|
||||||
double maxHeight = boxConstraints.maxHeight;
|
|
||||||
return Hero(
|
return Hero(
|
||||||
tag: heroTag,
|
tag: heroTag,
|
||||||
child: NetworkImgLayer(
|
child: NetworkImgLayer(
|
||||||
src: favFolderItem.cover,
|
src: favFolderItem.cover,
|
||||||
width: maxWidth,
|
width: boxConstraints.maxWidth,
|
||||||
height: maxHeight,
|
height: boxConstraints.maxHeight,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import 'package:PiliPlus/common/widgets/image_save.dart';
|
|||||||
import 'package:PiliPlus/common/widgets/video_progress_indicator.dart';
|
import 'package:PiliPlus/common/widgets/video_progress_indicator.dart';
|
||||||
import 'package:PiliPlus/models/user/history.dart';
|
import 'package:PiliPlus/models/user/history.dart';
|
||||||
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
|
import 'package:PiliPlus/pages/common/multi_select_controller.dart';
|
||||||
import 'package:PiliPlus/pages/fav_search/controller.dart';
|
|
||||||
import 'package:PiliPlus/pages/history/base_controller.dart';
|
import 'package:PiliPlus/pages/history/base_controller.dart';
|
||||||
import 'package:PiliPlus/utils/extension.dart';
|
import 'package:PiliPlus/utils/extension.dart';
|
||||||
import 'package:PiliPlus/utils/page_utils.dart';
|
import 'package:PiliPlus/utils/page_utils.dart';
|
||||||
@@ -41,12 +40,12 @@ class HistoryItem extends StatelessWidget {
|
|||||||
String bvid = videoItem.history.bvid ?? IdUtils.av2bv(aid);
|
String bvid = videoItem.history.bvid ?? IdUtils.av2bv(aid);
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
if ((ctr is MultiSelectController || ctr is HistoryBaseController) &&
|
if (ctr is MultiSelectController || ctr is HistoryBaseController) {
|
||||||
ctr!.enableMultiSelect.value) {
|
if (ctr.enableMultiSelect.value) {
|
||||||
feedBack();
|
|
||||||
onChoose?.call();
|
onChoose?.call();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (videoItem.history.business?.contains('article') == true) {
|
if (videoItem.history.business?.contains('article') == true) {
|
||||||
PageUtils.toDupNamed(
|
PageUtils.toDupNamed(
|
||||||
'/htmlRender',
|
'/htmlRender',
|
||||||
@@ -105,18 +104,18 @@ class HistoryItem extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
if (ctr is FavSearchController) {
|
if (ctr is MultiSelectController || ctr is HistoryBaseController) {
|
||||||
|
if (!ctr.enableMultiSelect.value) {
|
||||||
|
ctr.enableMultiSelect.value = true;
|
||||||
|
onChoose?.call();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
imageSaveDialog(
|
imageSaveDialog(
|
||||||
context: context,
|
context: context,
|
||||||
title: videoItem.title,
|
title: videoItem.title,
|
||||||
cover: videoItem.cover,
|
cover: videoItem.cover,
|
||||||
);
|
);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!ctr!.enableMultiSelect.value) {
|
|
||||||
ctr!.enableMultiSelect.value = true;
|
|
||||||
onChoose?.call();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ class _HotPageState extends CommonPageState<HotPage, HotController>
|
|||||||
}) {
|
}) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
|
behavior: HitTestBehavior.opaque,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import 'package:PiliPlus/pages/setting/pages/logs.dart';
|
|||||||
|
|
||||||
import '../pages/about/index.dart';
|
import '../pages/about/index.dart';
|
||||||
import '../pages/blacklist/view.dart';
|
import '../pages/blacklist/view.dart';
|
||||||
import '../pages/danmaku_block/index.dart';
|
import '../pages/danmaku_block/view.dart';
|
||||||
import '../pages/dynamics/detail/index.dart';
|
import '../pages/dynamics/detail/index.dart';
|
||||||
import '../pages/dynamics/index.dart';
|
import '../pages/dynamics/index.dart';
|
||||||
import '../pages/fan/index.dart';
|
import '../pages/fan/index.dart';
|
||||||
|
|||||||
Reference in New Issue
Block a user