Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2026-01-02 14:41:04 +08:00
parent 041af37bb0
commit b2da99e334
7 changed files with 73 additions and 138 deletions

View File

@@ -1289,16 +1289,16 @@ class HeaderControlState extends State<HeaderControl>
);
}
double get subtitleFontScale => plPlayerController.subtitleFontScale;
double get subtitleFontScaleFS => plPlayerController.subtitleFontScaleFS;
int get subtitlePaddingH => plPlayerController.subtitlePaddingH;
int get subtitlePaddingB => plPlayerController.subtitlePaddingB;
double get subtitleBgOpacity => plPlayerController.subtitleBgOpacity;
double get subtitleStrokeWidth => plPlayerController.subtitleStrokeWidth;
int get subtitleFontWeight => plPlayerController.subtitleFontWeight;
/// 字幕设置
void showSetSubtitle() {
double subtitleFontScale = plPlayerController.subtitleFontScale;
double subtitleFontScaleFS = plPlayerController.subtitleFontScaleFS;
int subtitlePaddingH = plPlayerController.subtitlePaddingH;
int subtitlePaddingB = plPlayerController.subtitlePaddingB;
double subtitleBgOpacity = plPlayerController.subtitleBgOpacity;
double subtitleStrokeWidth = plPlayerController.subtitleStrokeWidth;
int subtitleFontWeight = plPlayerController.subtitleFontWeight;
showBottomSheet(
padding: isFullScreen ? 70 : null,
(context, setState) {
@@ -1314,57 +1314,50 @@ class HeaderControlState extends State<HeaderControl>
);
void updateStrokeWidth(double val) {
subtitleStrokeWidth = val;
plPlayerController
..subtitleStrokeWidth = subtitleStrokeWidth
..subtitleStrokeWidth = val
..updateSubtitleStyle();
setState(() {});
}
void updateOpacity(double val) {
subtitleBgOpacity = val.toPrecision(2);
plPlayerController
..subtitleBgOpacity = subtitleBgOpacity
..subtitleBgOpacity = val.toPrecision(2)
..updateSubtitleStyle();
setState(() {});
}
void updateBottomPadding(double val) {
subtitlePaddingB = val.round();
plPlayerController
..subtitlePaddingB = subtitlePaddingB
..subtitlePaddingB = val.round()
..updateSubtitleStyle();
setState(() {});
}
void updateHorizontalPadding(double val) {
subtitlePaddingH = val.round();
plPlayerController
..subtitlePaddingH = subtitlePaddingH
..subtitlePaddingH = val.round()
..updateSubtitleStyle();
setState(() {});
}
void updateFontScaleFS(double val) {
subtitleFontScaleFS = val;
plPlayerController
..subtitleFontScaleFS = subtitleFontScaleFS
..subtitleFontScaleFS = val
..updateSubtitleStyle();
setState(() {});
}
void updateFontScale(double val) {
subtitleFontScale = val;
plPlayerController
..subtitleFontScale = subtitleFontScale
..subtitleFontScale = val
..updateSubtitleStyle();
setState(() {});
}
void updateFontWeight(double val) {
subtitleFontWeight = val.toInt();
plPlayerController
..subtitleFontWeight = subtitleFontWeight
..subtitleFontWeight = val.toInt()
..updateSubtitleStyle();
setState(() {});
}
@@ -1391,12 +1384,7 @@ class HeaderControlState extends State<HeaderControl>
Text(
'字体大小 ${(subtitleFontScale * 100).toStringAsFixed(1)}%',
),
resetBtn(
theme,
'100.0%',
() => updateFontScale(1.0),
isDanmaku: false,
),
resetBtn(theme, '100.0%', () => updateFontScale(1.0)),
],
),
Padding(
@@ -1416,8 +1404,6 @@ class HeaderControlState extends State<HeaderControl>
label:
'${(subtitleFontScale * 100).toStringAsFixed(1)}%',
onChanged: updateFontScale,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings(),
),
),
),
@@ -1427,12 +1413,7 @@ class HeaderControlState extends State<HeaderControl>
Text(
'全屏字体大小 ${(subtitleFontScaleFS * 100).toStringAsFixed(1)}%',
),
resetBtn(
theme,
'150.0%',
() => updateFontScaleFS(1.5),
isDanmaku: false,
),
resetBtn(theme, '150.0%', () => updateFontScaleFS(1.5)),
],
),
Padding(
@@ -1452,8 +1433,6 @@ class HeaderControlState extends State<HeaderControl>
label:
'${(subtitleFontScaleFS * 100).toStringAsFixed(1)}%',
onChanged: updateFontScaleFS,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings,
),
),
),
@@ -1461,12 +1440,7 @@ class HeaderControlState extends State<HeaderControl>
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('字体粗细 ${subtitleFontWeight + 1}(可能无法精确调节)'),
resetBtn(
theme,
6,
() => updateFontWeight(5),
isDanmaku: false,
),
resetBtn(theme, 6, () => updateFontWeight(5)),
],
),
Padding(
@@ -1485,8 +1459,6 @@ class HeaderControlState extends State<HeaderControl>
divisions: 8,
label: '${subtitleFontWeight + 1}',
onChanged: updateFontWeight,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings(),
),
),
),
@@ -1494,12 +1466,7 @@ class HeaderControlState extends State<HeaderControl>
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('描边粗细 $subtitleStrokeWidth'),
resetBtn(
theme,
2.0,
() => updateStrokeWidth(2.0),
isDanmaku: false,
),
resetBtn(theme, 2.0, () => updateStrokeWidth(2.0)),
],
),
Padding(
@@ -1518,8 +1485,6 @@ class HeaderControlState extends State<HeaderControl>
divisions: 10,
label: '$subtitleStrokeWidth',
onChanged: updateStrokeWidth,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings(),
),
),
),
@@ -1527,12 +1492,7 @@ class HeaderControlState extends State<HeaderControl>
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('左右边距 $subtitlePaddingH'),
resetBtn(
theme,
24,
() => updateHorizontalPadding(24),
isDanmaku: false,
),
resetBtn(theme, 24, () => updateHorizontalPadding(24)),
],
),
Padding(
@@ -1551,8 +1511,6 @@ class HeaderControlState extends State<HeaderControl>
divisions: 100,
label: '$subtitlePaddingH',
onChanged: updateHorizontalPadding,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings(),
),
),
),
@@ -1560,12 +1518,7 @@ class HeaderControlState extends State<HeaderControl>
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('底部边距 $subtitlePaddingB'),
resetBtn(
theme,
24,
() => updateBottomPadding(24),
isDanmaku: false,
),
resetBtn(theme, 24, () => updateBottomPadding(24)),
],
),
Padding(
@@ -1584,8 +1537,6 @@ class HeaderControlState extends State<HeaderControl>
divisions: 200,
label: '$subtitlePaddingB',
onChanged: updateBottomPadding,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings(),
),
),
),
@@ -1593,12 +1544,7 @@ class HeaderControlState extends State<HeaderControl>
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('背景不透明度 ${(subtitleBgOpacity * 100).toInt()}%'),
resetBtn(
theme,
'67%',
() => updateOpacity(0.67),
isDanmaku: false,
),
resetBtn(theme, '67%', () => updateOpacity(0.67)),
],
),
Padding(
@@ -1615,8 +1561,6 @@ class HeaderControlState extends State<HeaderControl>
max: 1,
value: subtitleBgOpacity,
onChanged: updateOpacity,
onChangeEnd: (_) =>
plPlayerController.putSubtitleSettings(),
),
),
),
@@ -1626,7 +1570,7 @@ class HeaderControlState extends State<HeaderControl>
),
);
},
);
)?.whenComplete(plPlayerController.putSubtitleSettings);
}
void showDanmakuPool() {

View File

@@ -4,8 +4,6 @@ import 'package:PiliPlus/plugin/pl_player/controller.dart';
import 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
@@ -33,21 +31,11 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
);
}
Widget resetBtn(
ThemeData theme,
Object def,
VoidCallback onPressed, {
bool isDanmaku = true,
}) {
Widget resetBtn(ThemeData theme, Object def, VoidCallback onPressed) {
return iconButton(
tooltip: '默认值: $def',
icon: const Icon(Icons.refresh),
onPressed: () {
onPressed();
if (!isDanmaku) {
plPlayerController.putSubtitleSettings();
}
},
onPressed: onPressed,
iconColor: theme.colorScheme.outline,
size: 24,
iconSize: 24,
@@ -55,7 +43,7 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
}
/// 弹幕功能
Future<void> showSetDanmaku({bool isLive = false}) async {
void showSetDanmaku({bool isLive = false}) {
// 屏蔽类型
const blockTypesList = [
(value: 2, label: '滚动'),
@@ -69,7 +57,7 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
final isFullScreen = this.isFullScreen;
await showBottomSheet(
showBottomSheet(
(context, setState) {
final theme = Theme.of(context);
@@ -147,7 +135,7 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
}
void updateDanmakuWeight(double val) {
plPlayerController.danmakuWeight = val.toInt();
DanmakuOptions.danmakuWeight = val.toInt();
setState(() {});
}
@@ -184,7 +172,7 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
Row(
mainAxisAlignment: .spaceBetween,
children: [
Text('智能云屏蔽 ${plPlayerController.danmakuWeight}'),
Text('智能云屏蔽 ${DanmakuOptions.danmakuWeight}'),
TextButton(
style: TextButton.styleFrom(
padding: EdgeInsets.zero,
@@ -215,14 +203,10 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
child: Slider(
min: 0,
max: 10,
value: plPlayerController.danmakuWeight.toDouble(),
value: DanmakuOptions.danmakuWeight.toDouble(),
divisions: 10,
label: '${plPlayerController.danmakuWeight}',
label: DanmakuOptions.danmakuWeight.toString(),
onChanged: updateDanmakuWeight,
onChangeEnd: (val) => GStorage.setting.put(
SettingBoxKey.danmakuWeight,
val.toInt(),
),
),
),
),
@@ -255,30 +239,30 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
spacing: 10,
children: [
ActionRowLineItem(
selectStatus: DanmakuOptions.massiveMode,
selectStatus: DanmakuOptions.danmakuMassiveMode,
onTap: () {
DanmakuOptions.massiveMode =
!DanmakuOptions.massiveMode;
DanmakuOptions.danmakuMassiveMode =
!DanmakuOptions.danmakuMassiveMode;
setState(() {});
setOptions();
},
text: '海量弹幕',
),
ActionRowLineItem(
selectStatus: DanmakuOptions.static2Scroll,
selectStatus: DanmakuOptions.danmakuStatic2Scroll,
onTap: () {
DanmakuOptions.static2Scroll =
!DanmakuOptions.static2Scroll;
DanmakuOptions.danmakuStatic2Scroll =
!DanmakuOptions.danmakuStatic2Scroll;
setState(() {});
setOptions();
},
text: '固定转滚动',
),
ActionRowLineItem(
selectStatus: DanmakuOptions.scrollFixedVelocity,
selectStatus: DanmakuOptions.danmakuFixedV,
onTap: () {
DanmakuOptions.scrollFixedVelocity =
!DanmakuOptions.scrollFixedVelocity;
DanmakuOptions.danmakuFixedV =
!DanmakuOptions.danmakuFixedV;
setState(() {});
setOptions();
},
@@ -534,9 +518,9 @@ mixin HeaderMixin<T extends StatefulWidget> on State<T> {
),
);
},
)?.whenComplete(
() => DanmakuOptions.save(plPlayerController.danmakuOpacity.value),
);
await DanmakuOptions.save();
}
}