Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-05-18 12:02:54 +08:00
parent 344e2eb29c
commit 4acb4d4879
13 changed files with 25 additions and 280 deletions

View File

@@ -4,7 +4,6 @@ import 'dart:io' show Platform, File;
import 'dart:typed_data' show Uint8List;
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/dialog/report.dart';
import 'package:PiliPlus/common/widgets/marquee.dart';
@@ -51,7 +50,6 @@ import 'package:PiliPlus/utils/storage_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:PiliPlus/utils/video_utils.dart';
import 'package:battery_plus/battery_plus.dart';
import 'package:canvas_danmaku/canvas_danmaku.dart';
import 'package:collection/collection.dart';
import 'package:dio/dio.dart';
import 'package:easy_debounce/easy_throttle.dart';
@@ -613,15 +611,6 @@ class HeaderControlState extends State<HeaderControl>
descPosType: .subtitle,
descFontSize: 12,
),
ListTile(
dense: true,
onTap: () {
Get.back();
showDanmakuPool();
},
leading: const Icon(CustomIcons.dm_on, size: 20),
title: const Text('弹幕列表', style: titleStyle),
),
ListTile(
dense: true,
onTap: () {
@@ -1496,142 +1485,6 @@ class HeaderControlState extends State<HeaderControl>
)?.whenComplete(plPlayerController.putSubtitleSettings);
}
void showDanmakuPool() {
final ctr = plPlayerController.danmakuController;
if (ctr == null) return;
showBottomSheet((context, setState) {
final theme = Theme.of(context);
return Container(
margin: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: theme.colorScheme.surface,
borderRadius: const BorderRadius.all(Radius.circular(12)),
),
child: Column(
children: [
Container(
height: 45,
padding: const EdgeInsets.symmetric(horizontal: 14),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: theme.colorScheme.outline.withValues(alpha: 0.1),
),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const Text('弹幕列表'),
iconButton(
onPressed: () => setState(() {}),
icon: const Icon(Icons.refresh),
),
],
),
),
Expanded(
child: Material(
type: .transparency,
clipBehavior: .hardEdge,
borderRadius: const BorderRadius.vertical(
bottom: Radius.circular(12),
),
child: CustomScrollView(
slivers: [
?_buildDanmakuList(ctr.staticDanmaku.nonNulls.toList()),
?_buildDanmakuList(
ctr.scrollDanmaku.expand((e) => e).toList(),
),
?_buildDanmakuList(ctr.specialDanmaku.toList()),
const SliverToBoxAdapter(child: SizedBox(height: 12)),
],
),
),
),
],
),
);
});
}
Widget? _buildDanmakuList(List<DanmakuItem<DanmakuExtra>> list) {
if (list.isEmpty) return null;
return SliverList.builder(
itemCount: list.length,
itemBuilder: (context, index) {
final item = list[index];
final extra = item.content.extra! as VideoDanmaku;
return ListTile(
dense: true,
contentPadding: const EdgeInsets.symmetric(horizontal: 14),
onLongPress: () => Utils.copyText(item.content.text),
title: Text(
item.content.text,
style: const TextStyle(fontSize: 14),
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Builder(
builder: (context) => Stack(
clipBehavior: Clip.none,
children: [
iconButton(
onPressed: () async {
if (await HeaderControl.likeDanmaku(
extra,
plPlayerController.cid!,
) &&
context.mounted) {
(context as Element).markNeedsBuild();
}
},
icon: extra.isLike
? const Icon(CustomIcons.player_dm_tip_like_solid)
: const Icon(CustomIcons.player_dm_tip_like),
),
if (extra.like > 0)
Positioned(
left: 24.5,
top: 1.5,
child: Text(
extra.like.toString(),
style: const TextStyle(
fontSize: 10.5,
letterSpacing: 0,
// fontWeight: FontWeight.bold,
),
),
),
],
),
),
if (item.content.selfSend)
iconButton(
onPressed: () => HeaderControl.deleteDanmaku(
extra.id,
plPlayerController.cid!,
).then((_) => item.expired = true),
icon: const Icon(CustomIcons.player_dm_tip_recall),
)
else
iconButton(
onPressed: () => HeaderControl.reportDanmaku(
context,
extra: extra,
ctr: plPlayerController,
),
icon: const Icon(CustomIcons.player_dm_tip_back),
),
],
),
);
},
);
}
late final isFileSource = videoDetailCtr.isFileSource;
@override
@@ -1779,7 +1632,7 @@ class HeaderControlState extends State<HeaderControl>
);
}),
if (!isFileSource) ...[
if (!isFSOrPip) ...[
if (!isFSOrPip)
if (videoDetailCtr.isUgc)
SizedBox(
width: btnWidth,
@@ -1795,21 +1648,6 @@ class HeaderControlState extends State<HeaderControl>
),
),
),
SizedBox(
width: btnWidth,
height: btnHeight,
child: IconButton(
tooltip: '投屏',
style: btnStyle,
onPressed: videoDetailCtr.onCast,
icon: const Icon(
Icons.cast,
size: 19,
color: Colors.white,
),
),
),
],
if (plPlayerController.enableSponsorBlock)
SizedBox(
width: btnWidth,