mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
feat: use canvas_danmaku
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -10,6 +10,7 @@ import 'package:PiliPalaX/http/danmaku.dart';
|
||||
import 'package:PiliPalaX/http/init.dart';
|
||||
import 'package:PiliPalaX/models/video/play/subtitle.dart';
|
||||
import 'package:PiliPalaX/utils/extension.dart';
|
||||
import 'package:canvas_danmaku/models/danmaku_content_item.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:floating/floating.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -27,7 +28,6 @@ import 'package:PiliPalaX/utils/storage.dart';
|
||||
import 'package:PiliPalaX/utils/utils.dart';
|
||||
import 'package:PiliPalaX/utils/video_utils.dart';
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
import 'package:ns_danmaku/models/danmaku_item.dart';
|
||||
|
||||
import '../../../utils/id_utils.dart';
|
||||
import 'widgets/header_control.dart';
|
||||
@@ -733,16 +733,13 @@ class VideoDetailController extends GetxController
|
||||
SmartDialog.showToast('发送成功');
|
||||
// 发送成功,自动预览该弹幕,避免重新请求
|
||||
// TODO: 暂停状态下预览弹幕仍会移动与计时,可考虑添加到dmSegList或其他方式实现
|
||||
plPlayerController.danmakuController?.addItems([
|
||||
DanmakuItem(
|
||||
msg,
|
||||
color: Colors.white,
|
||||
time: plPlayerController
|
||||
.position.value.inMilliseconds,
|
||||
type: DanmakuItemType.scroll,
|
||||
isSend: true,
|
||||
)
|
||||
]);
|
||||
plPlayerController.danmakuController
|
||||
?.addDanmaku(DanmakuContentItem(
|
||||
msg,
|
||||
color: Colors.white,
|
||||
type: DanmakuItemType.scroll,
|
||||
selfSend: true,
|
||||
));
|
||||
Get.back();
|
||||
} else {
|
||||
SmartDialog.showToast('发送失败,错误信息为${res['msg']}');
|
||||
|
||||
@@ -349,10 +349,11 @@ class ReplyItem extends StatelessWidget {
|
||||
onReply?.call();
|
||||
},
|
||||
child: Row(children: [
|
||||
Icon(Icons.reply,
|
||||
size: 18,
|
||||
color:
|
||||
Theme.of(context).colorScheme.outline.withOpacity(0.8)),
|
||||
Icon(
|
||||
Icons.reply,
|
||||
size: 18,
|
||||
color: Theme.of(context).colorScheme.outline.withOpacity(0.8),
|
||||
),
|
||||
const SizedBox(width: 3),
|
||||
Text(
|
||||
'回复',
|
||||
@@ -459,7 +460,7 @@ class ReplyItem extends StatelessWidget {
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onSurface
|
||||
.withOpacity(0.8),
|
||||
.withOpacity(0.85),
|
||||
height: 1.6),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 2,
|
||||
@@ -468,10 +469,7 @@ class ReplyItem extends StatelessWidget {
|
||||
TextSpan(
|
||||
text: '${replies![i].member!.uname}',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.primary
|
||||
.withOpacity(0.8),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
@@ -538,17 +536,15 @@ class ReplyItem extends StatelessWidget {
|
||||
TextSpan(
|
||||
text: 'UP主等人 ',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onSurface
|
||||
.withOpacity(0.8))),
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onSurface
|
||||
.withOpacity(0.85),
|
||||
)),
|
||||
TextSpan(
|
||||
text: replyControl!.entryText!,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.primary
|
||||
.withOpacity(0.8),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
)
|
||||
],
|
||||
@@ -686,7 +682,7 @@ class ReplyItem extends StatelessWidget {
|
||||
TextSpan(
|
||||
text: matchStr,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0.8),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
|
||||
@@ -346,10 +346,11 @@ class ReplyItemGrpc extends StatelessWidget {
|
||||
onReply?.call();
|
||||
},
|
||||
child: Row(children: [
|
||||
Icon(Icons.reply,
|
||||
size: 18,
|
||||
color:
|
||||
Theme.of(context).colorScheme.outline.withOpacity(0.8)),
|
||||
Icon(
|
||||
Icons.reply,
|
||||
size: 18,
|
||||
color: Theme.of(context).colorScheme.outline.withOpacity(0.8),
|
||||
),
|
||||
const SizedBox(width: 3),
|
||||
Text(
|
||||
'回复',
|
||||
@@ -475,7 +476,7 @@ class ReplyItemGrpc extends StatelessWidget {
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onSurface
|
||||
.withOpacity(0.8),
|
||||
.withOpacity(0.85),
|
||||
height: 1.6),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 2,
|
||||
@@ -484,10 +485,7 @@ class ReplyItemGrpc extends StatelessWidget {
|
||||
TextSpan(
|
||||
text: replyItem.replies[i].member.name,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.primary
|
||||
.withOpacity(0.8),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
@@ -555,19 +553,18 @@ class ReplyItemGrpc extends StatelessWidget {
|
||||
children: [
|
||||
if (replyItem.replyControl.upReply)
|
||||
TextSpan(
|
||||
text: 'UP主等人 ',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onSurface
|
||||
.withOpacity(0.8))),
|
||||
text: 'UP主等人 ',
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.onSurface
|
||||
.withOpacity(0.85),
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: replyItem.replyControl.subReplyEntryText,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.primary
|
||||
.withOpacity(0.8),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
)
|
||||
],
|
||||
@@ -709,7 +706,7 @@ class ReplyItemGrpc extends StatelessWidget {
|
||||
TextSpan(
|
||||
text: matchStr,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.primary.withOpacity(0.8),
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () {
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:io';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:PiliPalaX/utils/id_utils.dart';
|
||||
import 'package:canvas_danmaku/canvas_danmaku.dart';
|
||||
import 'package:floating/floating.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
@@ -12,7 +13,6 @@ import 'package:get/get.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
import 'package:ns_danmaku/ns_danmaku.dart';
|
||||
import 'package:PiliPalaX/http/user.dart';
|
||||
import 'package:PiliPalaX/models/video/play/quality.dart';
|
||||
import 'package:PiliPalaX/models/video/play/url.dart';
|
||||
@@ -997,13 +997,6 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
danmakuWeight;
|
||||
widget.controller!.putDanmakuSettings();
|
||||
setState(() {});
|
||||
// try {
|
||||
// final DanmakuOption currentOption =
|
||||
// danmakuController.option;
|
||||
// final DanmakuOption updatedOption =
|
||||
// currentOption.copyWith(strokeWidth: val);
|
||||
// danmakuController.updateOption(updatedOption);
|
||||
// } catch (_) {}
|
||||
},
|
||||
),
|
||||
),
|
||||
@@ -1028,16 +1021,14 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
widget.controller?.putDanmakuSettings();
|
||||
setState(() {});
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(
|
||||
hideTop: blockTypes.contains(5),
|
||||
hideBottom: blockTypes.contains(4),
|
||||
hideScroll: blockTypes.contains(2),
|
||||
// 添加或修改其他需要修改的选项属性
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option.copyWith(
|
||||
hideTop: blockTypes.contains(5),
|
||||
hideBottom: blockTypes.contains(4),
|
||||
hideScroll: blockTypes.contains(2),
|
||||
// 添加或修改其他需要修改的选项属性
|
||||
),
|
||||
);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
} catch (_) {}
|
||||
},
|
||||
text: i['label'],
|
||||
@@ -1061,11 +1052,10 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
widget.controller?.putDanmakuSettings();
|
||||
setState(() {});
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(area: i['value']);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option
|
||||
.copyWith(area: i['value']),
|
||||
);
|
||||
} catch (_) {}
|
||||
},
|
||||
text: i['label'],
|
||||
@@ -1105,11 +1095,9 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
widget.controller?.putDanmakuSettings();
|
||||
setState(() {});
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(opacity: val);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option.copyWith(opacity: val),
|
||||
);
|
||||
} catch (_) {}
|
||||
},
|
||||
),
|
||||
@@ -1144,11 +1132,10 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
widget.controller?.putDanmakuSettings();
|
||||
setState(() {});
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(fontWeight: fontWeight);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option
|
||||
.copyWith(fontWeight: fontWeight),
|
||||
);
|
||||
} catch (_) {}
|
||||
},
|
||||
),
|
||||
@@ -1183,11 +1170,10 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
widget.controller?.putDanmakuSettings();
|
||||
setState(() {});
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(strokeWidth: val);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option
|
||||
.copyWith(strokeWidth: val),
|
||||
);
|
||||
} catch (_) {}
|
||||
},
|
||||
),
|
||||
@@ -1223,13 +1209,11 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
setState(() {});
|
||||
if (widget.controller?.isFullScreen.value == false) {
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(
|
||||
fontSize: (15 * fontSizeVal).toDouble(),
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option.copyWith(
|
||||
fontSize: (15 * fontSizeVal).toDouble(),
|
||||
),
|
||||
);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
} catch (_) {}
|
||||
}
|
||||
},
|
||||
@@ -1266,13 +1250,11 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
setState(() {});
|
||||
if (widget.controller?.isFullScreen.value == true) {
|
||||
try {
|
||||
final DanmakuOption currentOption =
|
||||
danmakuController.option;
|
||||
final DanmakuOption updatedOption =
|
||||
currentOption.copyWith(
|
||||
fontSize: (15 * fontSizeFSVal).toDouble(),
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option.copyWith(
|
||||
fontSize: (15 * fontSizeFSVal).toDouble(),
|
||||
),
|
||||
);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
} catch (_) {}
|
||||
}
|
||||
},
|
||||
@@ -1380,11 +1362,11 @@ class _HeaderControlState extends State<HeaderControl> {
|
||||
widget.controller?.putDanmakuSettings();
|
||||
setState(() {});
|
||||
try {
|
||||
final DanmakuOption updatedOption =
|
||||
danmakuController.option.copyWith(
|
||||
duration: danmakuDurationVal /
|
||||
widget.controller!.playbackSpeed);
|
||||
danmakuController.updateOption(updatedOption);
|
||||
danmakuController.updateOption(
|
||||
danmakuController.option.copyWith(
|
||||
duration: danmakuDurationVal ~/
|
||||
widget.controller!.playbackSpeed),
|
||||
);
|
||||
} catch (_) {}
|
||||
},
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user