Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-31 12:30:03 +08:00
parent de3edcfa13
commit 273e5649c3
6 changed files with 127 additions and 113 deletions

View File

@@ -1,6 +1,5 @@
import 'package:PiliPalaX/common/widgets/image_save.dart'; import 'package:PiliPalaX/common/widgets/image_save.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.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 '../../http/search.dart'; import '../../http/search.dart';
@@ -42,18 +41,16 @@ class VideoCardH extends StatelessWidget {
try { try {
type = videoItem.type; type = videoItem.type;
} catch (_) {} } catch (_) {}
List<VideoCustomAction> actions =
VideoCustomActions(videoItem, context).actions;
final String heroTag = Utils.makeHeroTag(aid); final String heroTag = Utils.makeHeroTag(aid);
return Stack(children: [ return Stack(children: [
Semantics( Semantics(
label: Utils.videoItemSemantics(videoItem), label: Utils.videoItemSemantics(videoItem),
excludeSemantics: true, excludeSemantics: true,
customSemanticsActions: <CustomSemanticsAction, void Function()>{ // customSemanticsActions: <CustomSemanticsAction, void Function()>{
for (var item in actions) // for (var item in actions)
CustomSemanticsAction( // CustomSemanticsAction(
label: item.title.isEmpty ? 'label' : item.title): item.onTap!, // label: item.title.isEmpty ? 'label' : item.title): item.onTap!,
}, // },
child: InkWell( child: InkWell(
onLongPress: () { onLongPress: () {
if (onLongPress != null) { if (onLongPress != null) {
@@ -152,7 +149,7 @@ class VideoCardH extends StatelessWidget {
child: VideoPopupMenu( child: VideoPopupMenu(
size: 29, size: 29,
iconSize: 17, iconSize: 17,
actions: actions, videoItem: videoItem,
), ),
), ),
]); ]);

View File

@@ -110,7 +110,7 @@ class VideoCardHMemberVideo extends StatelessWidget {
child: VideoPopupMenu( child: VideoPopupMenu(
size: 29, size: 29,
iconSize: 17, iconSize: 17,
actions: VideoCustomActions(videoItem, context).actions, videoItem: videoItem,
), ),
), ),
], ],

View File

@@ -145,16 +145,14 @@ class VideoCardV extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String heroTag = Utils.makeHeroTag(videoItem.id); String heroTag = Utils.makeHeroTag(videoItem.id);
List<VideoCustomAction> actions =
VideoCustomActions(videoItem, context).actions;
return Stack(children: [ return Stack(children: [
Semantics( Semantics(
label: Utils.videoItemSemantics(videoItem), label: Utils.videoItemSemantics(videoItem),
excludeSemantics: true, excludeSemantics: true,
customSemanticsActions: <CustomSemanticsAction, void Function()>{ // customSemanticsActions: <CustomSemanticsAction, void Function()>{
for (var item in actions) // for (var item in actions)
CustomSemanticsAction(label: item.title): item.onTap!, // CustomSemanticsAction(label: item.title): item.onTap!,
}, // },
child: Card( child: Card(
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
margin: EdgeInsets.zero, margin: EdgeInsets.zero,
@@ -204,13 +202,14 @@ class VideoCardV extends StatelessWidget {
), ),
if (videoItem.goto == 'av') if (videoItem.goto == 'av')
Positioned( Positioned(
right: -5, right: -5,
bottom: -2, bottom: -2,
child: VideoPopupMenu( child: VideoPopupMenu(
size: 29, size: 29,
iconSize: 17, iconSize: 17,
actions: actions, videoItem: videoItem,
)), ),
),
]); ]);
} }

View File

@@ -270,14 +270,14 @@ class VideoCustomActions {
class VideoPopupMenu extends StatelessWidget { class VideoPopupMenu extends StatelessWidget {
final double? size; final double? size;
final double? iconSize; final double? iconSize;
final List<VideoCustomAction> actions;
final double menuItemHeight = 45; final double menuItemHeight = 45;
final dynamic videoItem;
const VideoPopupMenu({ const VideoPopupMenu({
super.key, super.key,
required this.size, required this.size,
required this.iconSize, required this.iconSize,
required this.actions, required this.videoItem,
}); });
@override @override
@@ -295,7 +295,8 @@ class VideoPopupMenu extends StatelessWidget {
), ),
position: PopupMenuPosition.under, position: PopupMenuPosition.under,
onSelected: (String type) {}, onSelected: (String type) {},
itemBuilder: (BuildContext context) => actions.map((e) { itemBuilder: (BuildContext context) =>
VideoCustomActions(videoItem, context).actions.map((e) {
return PopupMenuItem<String>( return PopupMenuItem<String>(
value: e.value, value: e.value,
height: menuItemHeight, height: menuItemHeight,

View File

@@ -26,7 +26,6 @@ class AnonymityInterceptor extends Interceptor {
Api.getSeasonDetailApi, Api.getSeasonDetailApi,
]; ];
@override @override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) { void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
if (MineController.anonymity) { if (MineController.anonymity) {
@@ -39,7 +38,7 @@ class AnonymityInterceptor extends Interceptor {
if (uri.lastIndexOf('/') >= index + i.length) continue; if (uri.lastIndexOf('/') >= index + i.length) continue;
//SmartDialog.showToast('触发无痕模式\n\n$i\n\n${options.uri}'); //SmartDialog.showToast('触发无痕模式\n\n$i\n\n${options.uri}');
options.headers[HttpHeaders.cookieHeader] = ""; options.headers[HttpHeaders.cookieHeader] = "";
if(options.data != null && options.data.csrf != null) { if (options.data != null && options.data.csrf != null) {
options.data.csrf = ""; options.data.csrf = "";
} }
break; break;

View File

@@ -99,95 +99,113 @@ class MineController extends GetxController {
anonymity = !anonymity; anonymity = !anonymity;
if (anonymity) { if (anonymity) {
SmartDialog.show( SmartDialog.show(
clickMaskDismiss: false, clickMaskDismiss: false,
usePenetrate: true, usePenetrate: true,
displayTime: const Duration(seconds: 2), displayTime: const Duration(seconds: 2),
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
builder: (context) { builder: (context) {
return ColoredBox( return ColoredBox(
color: Theme.of(context).colorScheme.primaryContainer, color: Theme.of(context).colorScheme.primaryContainer,
child: Padding( child: Padding(
padding: padding: EdgeInsets.only(
const EdgeInsets.symmetric(vertical: 15, horizontal: 20), top: 15,
child: left: 20,
Column(mainAxisSize: MainAxisSize.min, children: <Widget>[ right: 20,
Row( bottom: MediaQuery.paddingOf(context).bottom + 15,
children: <Widget>[ ),
Icon( child: Column(
MdiIcons.incognito, mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
children: <Widget>[
Icon(
MdiIcons.incognito,
),
const SizedBox(width: 10),
Text('已进入无痕模式',
style: Theme.of(context).textTheme.titleMedium)
],
),
const SizedBox(height: 10),
Text(
'搜索、观看视频/直播不携带身份信息(包含大会员)\n'
'不产生查询或播放记录\n'
'点赞等其它操作不受影响\n'
'(前往隐私设置了解详情)',
style: Theme.of(context).textTheme.bodySmall),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
TextButton(
onPressed: () {
SmartDialog.dismiss();
setting.put(SettingBoxKey.anonymity, true);
anonymity = true;
SmartDialog.showToast('已设为永久无痕模式');
},
child: Text(
'保存为永久',
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
),
)),
const SizedBox(width: 10),
TextButton(
onPressed: () {
SmartDialog.dismiss();
setting.put(SettingBoxKey.anonymity, false);
anonymity = true;
SmartDialog.showToast('已设为临时无痕模式');
},
child: Text(
'仅本次(默认)',
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
),
), ),
const SizedBox(width: 10), ),
Text('已进入无痕模式', ],
style: Theme.of(context).textTheme.titleMedium) ),
], ],
), ),
const SizedBox(height: 10), ),
Text( // duration: const Duration(seconds: 2),
'搜索、观看视频/直播不携带身份信息(包含大会员)\n' // showCloseIcon: true,
'不产生查询或播放记录\n' );
'点赞等其它操作不受影响\n' },
'(前往隐私设置了解详情)', );
style: Theme.of(context).textTheme.bodySmall),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
TextButton(
onPressed: () {
SmartDialog.dismiss();
setting.put(SettingBoxKey.anonymity, true);
anonymity = true;
SmartDialog.showToast('已设为永久无痕模式');
},
child: Text(
'保存为永久',
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
),
)),
const SizedBox(width: 10),
TextButton(
onPressed: () {
SmartDialog.dismiss();
setting.put(SettingBoxKey.anonymity, false);
anonymity = true;
SmartDialog.showToast('已设为临时无痕模式');
},
child: Text(
'仅本次(默认)',
style: TextStyle(
color: Theme.of(context).colorScheme.primary,
),
)),
]),
])),
// duration: const Duration(seconds: 2),
// showCloseIcon: true,
);
});
} else { } else {
setting.put(SettingBoxKey.anonymity, false); setting.put(SettingBoxKey.anonymity, false);
SmartDialog.show( SmartDialog.show(
clickMaskDismiss: false, clickMaskDismiss: false,
usePenetrate: true, usePenetrate: true,
displayTime: const Duration(seconds: 1), displayTime: const Duration(seconds: 1),
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
builder: (context) { builder: (context) {
return ColoredBox( return ColoredBox(
color: Theme.of(context).colorScheme.secondaryContainer, color: Theme.of(context).colorScheme.secondaryContainer,
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(vertical: 15, horizontal: 20), padding: EdgeInsets.only(
child: Row( top: 15,
mainAxisAlignment: MainAxisAlignment.start, left: 20,
children: [ right: 20,
Icon( bottom: MediaQuery.paddingOf(context).bottom + 15,
MdiIcons.incognitoOff, ),
), child: Row(
const SizedBox(width: 10), mainAxisAlignment: MainAxisAlignment.start,
Text('已退出无痕模式', children: [
style: Theme.of(context).textTheme.titleMedium), Icon(
], MdiIcons.incognitoOff,
))); ),
}); const SizedBox(width: 10),
Text('已退出无痕模式',
style: Theme.of(context).textTheme.titleMedium),
],
),
),
);
},
);
} }
} }