mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-06-11 05:11:34 +08:00
tweaks (#1846)
* opt: live extra * opt: remove addPointer * opt: use ssd * opt: cache svg * opt: localToGlobal * opt: disabled icon * opt: onVideoDetailChange switch * fix --------- Co-authored-by: dom <githubaccount56556@proton.me>
This commit is contained in:
committed by
GitHub
parent
4a3d827f7a
commit
e707764f84
@@ -3,18 +3,16 @@ import 'dart:math';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
class DisabledIcon<T extends Widget> extends SingleChildRenderObjectWidget {
|
||||
class DisabledIcon extends SingleChildRenderObjectWidget {
|
||||
const DisabledIcon({
|
||||
super.key,
|
||||
required T child,
|
||||
required Widget super.child,
|
||||
this.disable = false,
|
||||
this.color,
|
||||
this.iconSize,
|
||||
double? lineLengthScale,
|
||||
StrokeCap? strokeCap,
|
||||
}) : lineLengthScale = lineLengthScale ?? 0.9,
|
||||
strokeCap = strokeCap ?? StrokeCap.butt,
|
||||
super(child: child);
|
||||
this.lineLengthScale = 0.9,
|
||||
this.strokeCap = .butt,
|
||||
});
|
||||
|
||||
final bool disable;
|
||||
final Color? color;
|
||||
@@ -48,12 +46,12 @@ class DisabledIcon<T extends Widget> extends SingleChildRenderObjectWidget {
|
||||
..disable = disable
|
||||
..iconSize =
|
||||
iconSize ??
|
||||
(child is Icon ? (child as Icon?)?.size : null) ??
|
||||
(child is Icon ? (child as Icon).size : null) ??
|
||||
iconTheme.size ??
|
||||
24.0
|
||||
..color =
|
||||
color ??
|
||||
(child is Icon ? (child as Icon?)?.color : null) ??
|
||||
(child is Icon ? (child as Icon).color : null) ??
|
||||
iconTheme.color!
|
||||
..strokeCap = strokeCap
|
||||
..lineLengthScale = lineLengthScale;
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart'
|
||||
show ImageGestureRecognizerMixin;
|
||||
import 'package:flutter/gestures.dart';
|
||||
|
||||
mixin ImageGestureRecognizerMixin on GestureRecognizer {
|
||||
int? _pointer;
|
||||
|
||||
@override
|
||||
void addPointer(PointerDownEvent event) {
|
||||
if (_pointer == event.pointer) {
|
||||
return;
|
||||
}
|
||||
_pointer = event.pointer;
|
||||
super.addPointer(event);
|
||||
}
|
||||
}
|
||||
|
||||
typedef IsBoundaryAllowed =
|
||||
bool Function(Offset? initialPosition, OffsetPair lastPosition);
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
import 'package:flutter/gestures.dart'
|
||||
show
|
||||
GestureRecognizer,
|
||||
TapGestureRecognizer,
|
||||
DoubleTapGestureRecognizer,
|
||||
PointerDownEvent;
|
||||
|
||||
mixin ImageGestureRecognizerMixin on GestureRecognizer {
|
||||
int? _pointer;
|
||||
|
||||
@override
|
||||
void addPointer(PointerDownEvent event) {
|
||||
if (_pointer == event.pointer) {
|
||||
return;
|
||||
}
|
||||
_pointer = event.pointer;
|
||||
super.addPointer(event);
|
||||
}
|
||||
}
|
||||
|
||||
class ImageTapGestureRecognizer extends TapGestureRecognizer
|
||||
with ImageGestureRecognizerMixin {
|
||||
ImageTapGestureRecognizer({
|
||||
super.debugOwner,
|
||||
super.supportedDevices,
|
||||
super.allowedButtonsFilter,
|
||||
super.preAcceptSlopTolerance,
|
||||
super.postAcceptSlopTolerance,
|
||||
});
|
||||
}
|
||||
|
||||
class ImageDoubleTapGestureRecognizer extends DoubleTapGestureRecognizer
|
||||
with ImageGestureRecognizerMixin {
|
||||
ImageDoubleTapGestureRecognizer({
|
||||
super.debugOwner,
|
||||
super.supportedDevices,
|
||||
super.allowedButtonsFilter,
|
||||
});
|
||||
}
|
||||
@@ -67,31 +67,6 @@ class CachedNetworkSVGImage extends StatefulWidget {
|
||||
@override
|
||||
State<CachedNetworkSVGImage> createState() => _CachedNetworkSVGImageState();
|
||||
|
||||
static Future<void> preCache(
|
||||
String imageUrl, {
|
||||
String? cacheKey,
|
||||
BaseCacheManager? cacheManager,
|
||||
}) {
|
||||
final key = cacheKey ?? _generateKeyFromUrl(imageUrl);
|
||||
cacheManager ??= DefaultCacheManager();
|
||||
return cacheManager.downloadFile(key);
|
||||
}
|
||||
|
||||
static Future<void> clearCacheForUrl(
|
||||
String imageUrl, {
|
||||
String? cacheKey,
|
||||
BaseCacheManager? cacheManager,
|
||||
}) {
|
||||
final key = cacheKey ?? _generateKeyFromUrl(imageUrl);
|
||||
cacheManager ??= DefaultCacheManager();
|
||||
return cacheManager.removeFile(key);
|
||||
}
|
||||
|
||||
static Future<void> clearCache({BaseCacheManager? cacheManager}) {
|
||||
cacheManager ??= DefaultCacheManager();
|
||||
return cacheManager.emptyCache();
|
||||
}
|
||||
|
||||
static String _generateKeyFromUrl(String url) => url.split('?').first;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ import 'dart:io' show File, Platform;
|
||||
import 'package:PiliPlus/common/widgets/colored_box_transition.dart';
|
||||
import 'package:PiliPlus/common/widgets/flutter/page/page_view.dart';
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/common/widgets/image_viewer/image.dart';
|
||||
import 'package:PiliPlus/common/widgets/image_viewer/loading_indicator.dart';
|
||||
import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart';
|
||||
@@ -81,8 +80,8 @@ class _GalleryViewerState extends State<GalleryViewer>
|
||||
|
||||
late final PageController _pageController;
|
||||
|
||||
late final ImageTapGestureRecognizer _tapGestureRecognizer;
|
||||
late final ImageDoubleTapGestureRecognizer _doubleTapGestureRecognizer;
|
||||
late final TapGestureRecognizer _tapGestureRecognizer;
|
||||
late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;
|
||||
late final ImageHorizontalDragGestureRecognizer
|
||||
_horizontalDragGestureRecognizer;
|
||||
late final LongPressGestureRecognizer _longPressGestureRecognizer;
|
||||
@@ -116,13 +115,13 @@ class _GalleryViewerState extends State<GalleryViewer>
|
||||
_pageController = PageController(initialPage: widget.initIndex);
|
||||
|
||||
final gestureSettings = MediaQuery.maybeGestureSettingsOf(Get.context!);
|
||||
_tapGestureRecognizer = ImageTapGestureRecognizer()
|
||||
_tapGestureRecognizer = TapGestureRecognizer()
|
||||
// ..onTap = _onTap
|
||||
..gestureSettings = gestureSettings;
|
||||
if (PlatformUtils.isDesktop) {
|
||||
_tapGestureRecognizer.onSecondaryTapUp = _showDesktopMenu;
|
||||
}
|
||||
_doubleTapGestureRecognizer = ImageDoubleTapGestureRecognizer()
|
||||
_doubleTapGestureRecognizer = DoubleTapGestureRecognizer()
|
||||
..onDoubleTap = () {}
|
||||
..gestureSettings = gestureSettings;
|
||||
_horizontalDragGestureRecognizer = ImageHorizontalDragGestureRecognizer();
|
||||
@@ -360,7 +359,6 @@ class _GalleryViewerState extends State<GalleryViewer>
|
||||
onDragStart: _onDragStart,
|
||||
onDragUpdate: _onDragUpdate,
|
||||
onDragEnd: _onDragEnd,
|
||||
tapGestureRecognizer: _tapGestureRecognizer,
|
||||
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
|
||||
horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer,
|
||||
onChangePage: _onChangePage,
|
||||
@@ -373,7 +371,6 @@ class _GalleryViewerState extends State<GalleryViewer>
|
||||
minScale: widget.minScale,
|
||||
maxScale: widget.maxScale,
|
||||
containerSize: _containerSize,
|
||||
tapGestureRecognizer: _tapGestureRecognizer,
|
||||
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
|
||||
horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer,
|
||||
onChangePage: _onChangePage,
|
||||
@@ -395,7 +392,6 @@ class _GalleryViewerState extends State<GalleryViewer>
|
||||
onDragStart: null,
|
||||
onDragUpdate: null,
|
||||
onDragEnd: null,
|
||||
tapGestureRecognizer: _tapGestureRecognizer,
|
||||
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
|
||||
horizontalDragGestureRecognizer:
|
||||
_horizontalDragGestureRecognizer,
|
||||
@@ -434,7 +430,6 @@ class _GalleryViewerState extends State<GalleryViewer>
|
||||
onDragStart: _onDragStart,
|
||||
onDragUpdate: _onDragUpdate,
|
||||
onDragEnd: _onDragEnd,
|
||||
tapGestureRecognizer: _tapGestureRecognizer,
|
||||
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
|
||||
horizontalDragGestureRecognizer:
|
||||
_horizontalDragGestureRecognizer,
|
||||
|
||||
@@ -7,9 +7,9 @@ import 'dart:math' as math;
|
||||
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter/semantics.dart';
|
||||
@@ -42,7 +42,6 @@ class Image extends StatefulWidget {
|
||||
required this.onDragStart,
|
||||
required this.onDragUpdate,
|
||||
required this.onDragEnd,
|
||||
required this.tapGestureRecognizer,
|
||||
required this.doubleTapGestureRecognizer,
|
||||
required this.horizontalDragGestureRecognizer,
|
||||
required this.onChangePage,
|
||||
@@ -81,7 +80,6 @@ class Image extends StatefulWidget {
|
||||
required this.onDragStart,
|
||||
required this.onDragUpdate,
|
||||
required this.onDragEnd,
|
||||
required this.tapGestureRecognizer,
|
||||
required this.doubleTapGestureRecognizer,
|
||||
required this.horizontalDragGestureRecognizer,
|
||||
required this.onChangePage,
|
||||
@@ -127,7 +125,6 @@ class Image extends StatefulWidget {
|
||||
required this.onDragStart,
|
||||
required this.onDragUpdate,
|
||||
required this.onDragEnd,
|
||||
required this.tapGestureRecognizer,
|
||||
required this.doubleTapGestureRecognizer,
|
||||
required this.horizontalDragGestureRecognizer,
|
||||
required this.onChangePage,
|
||||
@@ -176,7 +173,6 @@ class Image extends StatefulWidget {
|
||||
required this.onDragStart,
|
||||
required this.onDragUpdate,
|
||||
required this.onDragEnd,
|
||||
required this.tapGestureRecognizer,
|
||||
required this.doubleTapGestureRecognizer,
|
||||
required this.horizontalDragGestureRecognizer,
|
||||
required this.onChangePage,
|
||||
@@ -225,7 +221,6 @@ class Image extends StatefulWidget {
|
||||
required this.onDragStart,
|
||||
required this.onDragUpdate,
|
||||
required this.onDragEnd,
|
||||
required this.tapGestureRecognizer,
|
||||
required this.doubleTapGestureRecognizer,
|
||||
required this.horizontalDragGestureRecognizer,
|
||||
required this.onChangePage,
|
||||
@@ -285,8 +280,7 @@ class Image extends StatefulWidget {
|
||||
final ValueChanged<ScaleEndDetails>? onDragEnd;
|
||||
final ValueChanged<int>? onChangePage;
|
||||
|
||||
final ImageTapGestureRecognizer tapGestureRecognizer;
|
||||
final ImageDoubleTapGestureRecognizer doubleTapGestureRecognizer;
|
||||
final DoubleTapGestureRecognizer doubleTapGestureRecognizer;
|
||||
final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer;
|
||||
|
||||
@override
|
||||
@@ -630,7 +624,6 @@ class _ImageState extends State<Image> with WidgetsBindingObserver {
|
||||
onDragStart: widget.onDragStart,
|
||||
onDragUpdate: widget.onDragUpdate,
|
||||
onDragEnd: widget.onDragEnd,
|
||||
tapGestureRecognizer: widget.tapGestureRecognizer,
|
||||
doubleTapGestureRecognizer: widget.doubleTapGestureRecognizer,
|
||||
horizontalDragGestureRecognizer: widget.horizontalDragGestureRecognizer,
|
||||
onChangePage: widget.onChangePage,
|
||||
|
||||
@@ -20,7 +20,6 @@ import 'dart:math' as math;
|
||||
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart'
|
||||
show touchSlopH;
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart';
|
||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
@@ -44,7 +43,6 @@ class Viewer extends StatefulWidget {
|
||||
required this.onDragStart,
|
||||
required this.onDragUpdate,
|
||||
required this.onDragEnd,
|
||||
required this.tapGestureRecognizer,
|
||||
required this.doubleTapGestureRecognizer,
|
||||
required this.horizontalDragGestureRecognizer,
|
||||
required this.onChangePage,
|
||||
@@ -63,8 +61,7 @@ class Viewer extends StatefulWidget {
|
||||
final ValueChanged<ScaleEndDetails>? onDragEnd;
|
||||
final ValueChanged<int>? onChangePage;
|
||||
|
||||
final ImageTapGestureRecognizer tapGestureRecognizer;
|
||||
final ImageDoubleTapGestureRecognizer doubleTapGestureRecognizer;
|
||||
final DoubleTapGestureRecognizer doubleTapGestureRecognizer;
|
||||
final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer;
|
||||
|
||||
@override
|
||||
@@ -101,8 +98,7 @@ class _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {
|
||||
|
||||
late Size _imageSize;
|
||||
|
||||
late final ImageTapGestureRecognizer _tapGestureRecognizer;
|
||||
late final ImageDoubleTapGestureRecognizer _doubleTapGestureRecognizer;
|
||||
late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;
|
||||
late final ImageHorizontalDragGestureRecognizer
|
||||
_horizontalDragGestureRecognizer;
|
||||
late final ScaleGestureRecognizer _scaleGestureRecognizer;
|
||||
@@ -153,7 +149,6 @@ class _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {
|
||||
duration: const Duration(milliseconds: 300),
|
||||
)..addListener(_listener);
|
||||
|
||||
_tapGestureRecognizer = widget.tapGestureRecognizer;
|
||||
_doubleTapGestureRecognizer = widget.doubleTapGestureRecognizer;
|
||||
_horizontalDragGestureRecognizer = widget.horizontalDragGestureRecognizer;
|
||||
|
||||
@@ -419,11 +414,9 @@ class _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {
|
||||
|
||||
void _onPointerDown(PointerDownEvent event) {
|
||||
_scalePos = event.position;
|
||||
_tapGestureRecognizer.addPointer(event);
|
||||
_doubleTapGestureRecognizer
|
||||
..onDoubleTapDown = _onDoubleTapDown
|
||||
..onDoubleTap = _onDoubleTap
|
||||
..addPointer(event);
|
||||
..onDoubleTap = _onDoubleTap;
|
||||
_horizontalDragGestureRecognizer
|
||||
..isBoundaryAllowed = _isBoundaryAllowed
|
||||
..addPointer(event);
|
||||
|
||||
@@ -4,26 +4,23 @@ import 'package:PiliPlus/pages/danmaku/danmaku_model.dart';
|
||||
|
||||
class DanmakuMsg {
|
||||
final String name;
|
||||
final Object uid;
|
||||
final String text;
|
||||
final Map<String, BaseEmote>? emots;
|
||||
final BaseEmote? uemote;
|
||||
final LiveDanmaku extra;
|
||||
final Owner? reply;
|
||||
final LiveDanmaku extra;
|
||||
|
||||
const DanmakuMsg({
|
||||
required this.name,
|
||||
required this.uid,
|
||||
required this.text,
|
||||
this.emots,
|
||||
this.uemote,
|
||||
required this.extra,
|
||||
this.reply,
|
||||
required this.extra,
|
||||
});
|
||||
|
||||
factory DanmakuMsg.fromPrefetch(Map<String, dynamic> obj) {
|
||||
final user = obj['user'];
|
||||
final uid = user['uid'];
|
||||
BaseEmote? uemote;
|
||||
if ((obj['emoticon']?['emoticon_unique'] as String?)?.isNotEmpty == true) {
|
||||
uemote = BaseEmote.fromJson(obj['emoticon']);
|
||||
@@ -41,30 +38,28 @@ class DanmakuMsg {
|
||||
}
|
||||
return DanmakuMsg(
|
||||
name: user['base']['name'],
|
||||
uid: uid,
|
||||
text: obj['text'],
|
||||
emots: (obj['emots'] as Map<String, dynamic>?)?.map(
|
||||
(k, v) => MapEntry(k, BaseEmote.fromJson(v)),
|
||||
),
|
||||
uemote: uemote,
|
||||
reply: reply,
|
||||
extra: LiveDanmaku(
|
||||
id: obj['id_str'],
|
||||
mid: uid,
|
||||
mid: user['uid'],
|
||||
dmType: obj['dm_type'],
|
||||
ts: checkInfo['ts'],
|
||||
ct: checkInfo['ct'],
|
||||
),
|
||||
reply: reply,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => <String, dynamic>{
|
||||
'name': name,
|
||||
'uid': uid,
|
||||
'text': text,
|
||||
'emots': emots,
|
||||
'uemote': uemote?.toJson(),
|
||||
'emots': ?emots,
|
||||
'uemote': ?uemote?.toJson(),
|
||||
'reply': ?reply?.toJson(),
|
||||
'extra': extra.toJson(),
|
||||
'reply': reply?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -182,12 +182,12 @@ class LiveRoomController extends GetxController {
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
scrollController = ScrollController()..addListener(listener);
|
||||
final account = Accounts.heartbeat;
|
||||
final account = Accounts.main;
|
||||
isLogin = account.isLogin;
|
||||
mid = account.mid;
|
||||
queryLiveUrl();
|
||||
queryLiveInfoH5();
|
||||
if (isLogin && !Pref.historyPause) {
|
||||
if (Accounts.heartbeat.isLogin && !Pref.historyPause) {
|
||||
VideoHttp.roomEntryAction(roomId: roomId);
|
||||
}
|
||||
if (showSuperChat) {
|
||||
@@ -428,7 +428,7 @@ class LiveRoomController extends GetxController {
|
||||
LiveMessageStream(
|
||||
streamToken: info.token!,
|
||||
roomId: roomId,
|
||||
uid: mid,
|
||||
uid: Accounts.heartbeat.mid,
|
||||
servers: info.hostList!
|
||||
.map((host) => 'wss://${host.host}:${host.wssPort}/sub')
|
||||
.toList(),
|
||||
@@ -488,7 +488,6 @@ class LiveRoomController extends GetxController {
|
||||
addDm(
|
||||
DanmakuMsg(
|
||||
name: name,
|
||||
uid: uid,
|
||||
text: msg,
|
||||
emots: (extra['emots'] as Map<String, dynamic>?)?.map(
|
||||
(k, v) => MapEntry(k, BaseEmote.fromJson(v)),
|
||||
@@ -574,7 +573,7 @@ class LiveRoomController extends GetxController {
|
||||
}
|
||||
|
||||
Future<void> onLike() async {
|
||||
if (!Accounts.main.isLogin) {
|
||||
if (!isLogin) {
|
||||
likeClickTime.value = 0;
|
||||
return;
|
||||
}
|
||||
@@ -593,7 +592,7 @@ class LiveRoomController extends GetxController {
|
||||
}
|
||||
|
||||
void onSendDanmaku([bool fromEmote = false]) {
|
||||
if (!Accounts.main.isLogin) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
@@ -623,7 +622,7 @@ class LiveRoomController extends GetxController {
|
||||
}
|
||||
|
||||
void reportSC(SuperChatItem item) {
|
||||
if (!Accounts.main.isLogin) {
|
||||
if (!isLogin) {
|
||||
SmartDialog.showToast('账号未登录');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -714,7 +714,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
||||
..savedDanmaku = [
|
||||
RichTextItem.fromStart(
|
||||
'@${item.name} ',
|
||||
rawText: item.uid.toString(),
|
||||
rawText: item.extra.mid.toString(),
|
||||
type: .at,
|
||||
id: item.extra.id.toString(),
|
||||
),
|
||||
|
||||
@@ -8,7 +8,6 @@ import 'package:PiliPlus/models_new/live/live_superchat/item.dart';
|
||||
import 'package:PiliPlus/pages/live_room/controller.dart';
|
||||
import 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart';
|
||||
import 'package:PiliPlus/pages/video/widgets/header_control.dart';
|
||||
import 'package:PiliPlus/utils/accounts.dart';
|
||||
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:flutter/foundation.dart' show kDebugMode;
|
||||
@@ -82,7 +81,7 @@ class LiveRoomChatPanel extends StatelessWidget {
|
||||
color: nameColor,
|
||||
fontSize: 14,
|
||||
),
|
||||
recognizer: item.uid == 0
|
||||
recognizer: item.extra.mid == 0
|
||||
? null
|
||||
: (NoDeadlineTapGestureRecognizer()
|
||||
..onTapUp = (e) => _showMsgMenu(
|
||||
@@ -292,7 +291,11 @@ class LiveRoomChatPanel extends StatelessWidget {
|
||||
) {
|
||||
final dx = details.globalPosition.dx;
|
||||
final renderBox = itemContext.findRenderObject() as RenderBox;
|
||||
final dy = renderBox.localToGlobal(renderBox.size.bottomLeft(.zero)).dy;
|
||||
final dy =
|
||||
details.globalPosition.dy -
|
||||
details.localPosition.dy +
|
||||
renderBox.size.height -
|
||||
4; // padding
|
||||
final autoScroll =
|
||||
liveRoomController.autoScroll &&
|
||||
!liveRoomController.disableAutoScroll.value;
|
||||
@@ -321,7 +324,7 @@ class LiveRoomChatPanel extends StatelessWidget {
|
||||
),
|
||||
PopupMenuItem(
|
||||
height: 38,
|
||||
onTap: () => Get.toNamed('/member?mid=${item.uid}'),
|
||||
onTap: () => Get.toNamed('/member?mid=${item.extra.mid}'),
|
||||
child: const Text(
|
||||
'去TA的个人空间',
|
||||
style: TextStyle(fontSize: 13),
|
||||
@@ -338,9 +341,9 @@ class LiveRoomChatPanel extends StatelessWidget {
|
||||
PopupMenuItem(
|
||||
height: 38,
|
||||
onTap: () async {
|
||||
if (!Accounts.main.isLogin) return;
|
||||
if (!liveRoomController.isLogin) return;
|
||||
final res = await LiveHttp.liveShieldUser(
|
||||
uid: item.uid,
|
||||
uid: item.extra.mid,
|
||||
roomid: roomId,
|
||||
type: 1,
|
||||
);
|
||||
|
||||
@@ -25,9 +25,11 @@ import 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart';
|
||||
import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';
|
||||
import 'package:PiliPlus/pages/setting/widgets/slider_dialog.dart';
|
||||
import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';
|
||||
import 'package:PiliPlus/utils/extension/file_ext.dart';
|
||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
||||
import 'package:PiliPlus/utils/global_data.dart';
|
||||
import 'package:PiliPlus/utils/path_utils.dart';
|
||||
import 'package:PiliPlus/utils/platform_utils.dart';
|
||||
import 'package:PiliPlus/utils/storage.dart';
|
||||
import 'package:PiliPlus/utils/storage_key.dart';
|
||||
@@ -38,6 +40,7 @@ import 'package:flutter/services.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
List<SettingsModel> get styleSettings => [
|
||||
if (PlatformUtils.isDesktop) ...[
|
||||
@@ -56,16 +59,7 @@ List<SettingsModel> get styleSettings => [
|
||||
needReboot: true,
|
||||
),
|
||||
],
|
||||
if (Platform.isLinux)
|
||||
const SwitchModel(
|
||||
title: '使用SSD(Server-Side Decoration)',
|
||||
subtitle: '(Linux)强制使用Server-Side Decoration',
|
||||
leading: Icon(Icons.web_asset),
|
||||
setKey: SettingBoxKey.useSSD,
|
||||
defaultVal: false,
|
||||
needReboot: true,
|
||||
onChanged: GStorage.syncToDisk,
|
||||
),
|
||||
if (Platform.isLinux) _useSSDModel(),
|
||||
SwitchModel(
|
||||
title: '横屏适配',
|
||||
subtitle: '启用横屏布局与逻辑,平板、折叠屏等可开启;建议全屏方向设为【不改变当前方向】',
|
||||
@@ -920,3 +914,31 @@ Future<void> _showBarHideTypeDialog(
|
||||
setState();
|
||||
}
|
||||
}
|
||||
|
||||
NormalModel _useSSDModel() {
|
||||
final file = File(path.join(appSupportDirPath, 'use_ssd'));
|
||||
void onChanged(BuildContext context, VoidCallback setState) {
|
||||
(file.existsSync() ? file.tryDel() : file.create()).whenComplete(() {
|
||||
if (context.mounted) {
|
||||
setState();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return NormalModel(
|
||||
title: '使用SSD(Server-Side Decoration)',
|
||||
leading: const Icon(Icons.web_asset),
|
||||
onTap: onChanged,
|
||||
getTrailing: (theme) => Builder(
|
||||
builder: (context) => Transform.scale(
|
||||
scale: 0.8,
|
||||
alignment: .centerRight,
|
||||
child: Switch(
|
||||
value: file.existsSync(),
|
||||
onChanged: (_) =>
|
||||
onChanged(context, (context as Element).markNeedsBuild),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -45,19 +45,19 @@ class _PopupListTileState<T> extends State<PopupListTile<T>> {
|
||||
final _key = PlatformUtils.isDesktop ? null : GlobalKey();
|
||||
|
||||
void _showButtonMenu(TapUpDetails details, T value) {
|
||||
final box = context.findRenderObject() as RenderBox;
|
||||
final offset = box.localToGlobal(box.size.topLeft(.zero));
|
||||
final thisOffset = details.globalPosition - details.localPosition;
|
||||
final double dx;
|
||||
if (PlatformUtils.isDesktop) {
|
||||
dx = details.globalPosition.dx + 1;
|
||||
} else {
|
||||
final box = _key!.currentContext!.findRenderObject() as RenderBox;
|
||||
final offset = box.localToGlobal(box.size.topLeft(.zero));
|
||||
dx = offset.dx;
|
||||
final thisBox = context.findRenderObject() as RenderBox;
|
||||
final titleBox = _key!.currentContext!.findRenderObject() as RenderBox;
|
||||
final titleOffset = titleBox.localToGlobal(.zero, ancestor: thisBox);
|
||||
dx = thisOffset.dx + titleOffset.dx;
|
||||
}
|
||||
showMenu<T?>(
|
||||
context: context,
|
||||
position: RelativeRect.fromLTRB(dx, offset.dy + 5, dx, 0),
|
||||
position: RelativeRect.fromLTRB(dx, thisOffset.dy + 5, dx, 0),
|
||||
items: widget.itemBuilder(context),
|
||||
initialValue: value,
|
||||
requestFocus: false,
|
||||
|
||||
@@ -467,6 +467,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
|
||||
tooltip: '分段信息',
|
||||
icon: DisabledIcon(
|
||||
iconSize: 22,
|
||||
color: Colors.white,
|
||||
disable: !show,
|
||||
child: Transform.rotate(
|
||||
angle: math.pi / 2,
|
||||
|
||||
@@ -147,76 +147,78 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler {
|
||||
Uri getUri(String? cover) => Uri.parse(ImageUtils.safeThumbnailUrl(cover));
|
||||
|
||||
late final id = '$cid$herotag';
|
||||
MediaItem? mediaItem;
|
||||
if (data is VideoDetailData) {
|
||||
if ((data.pages?.length ?? 0) > 1) {
|
||||
final current = data.pages?.firstWhereOrNull(
|
||||
(element) => element.cid == cid,
|
||||
);
|
||||
final MediaItem mediaItem;
|
||||
switch (data) {
|
||||
case VideoDetailData(:final pages):
|
||||
if (pages != null && pages.length > 1) {
|
||||
final current = pages.firstWhereOrNull((e) => e.cid == cid);
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: current?.part ?? '',
|
||||
artist: data.owner?.name,
|
||||
duration: Duration(seconds: current?.duration ?? 0),
|
||||
artUri: getUri(data.pic),
|
||||
);
|
||||
} else {
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.title ?? '',
|
||||
artist: data.owner?.name,
|
||||
duration: Duration(seconds: data.duration ?? 0),
|
||||
artUri: getUri(data.pic),
|
||||
);
|
||||
}
|
||||
case EpisodeItem():
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: current?.part ?? '',
|
||||
artist: data.owner?.name,
|
||||
duration: Duration(seconds: current?.duration ?? 0),
|
||||
artUri: getUri(data.pic),
|
||||
title: data.showTitle ?? data.longTitle ?? data.title ?? '',
|
||||
artist: artist,
|
||||
duration: data.from == 'pugv'
|
||||
? Duration(seconds: data.duration ?? 0)
|
||||
: Duration(milliseconds: data.duration ?? 0),
|
||||
artUri: getUri(data.cover),
|
||||
);
|
||||
} else {
|
||||
case RoomInfoH5Data():
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.title ?? '',
|
||||
artist: data.owner?.name,
|
||||
title: data.roomInfo?.title ?? '',
|
||||
artist: data.anchorInfo?.baseInfo?.uname,
|
||||
artUri: getUri(data.roomInfo?.cover),
|
||||
isLive: true,
|
||||
);
|
||||
case Part():
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.part ?? '',
|
||||
artist: artist,
|
||||
duration: Duration(seconds: data.duration ?? 0),
|
||||
artUri: getUri(data.pic),
|
||||
artUri: getUri(cover),
|
||||
);
|
||||
}
|
||||
} else if (data is EpisodeItem) {
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.showTitle ?? data.longTitle ?? data.title ?? '',
|
||||
artist: artist,
|
||||
duration: data.from == 'pugv'
|
||||
? Duration(seconds: data.duration ?? 0)
|
||||
: Duration(milliseconds: data.duration ?? 0),
|
||||
artUri: getUri(data.cover),
|
||||
);
|
||||
} else if (data is RoomInfoH5Data) {
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.roomInfo?.title ?? '',
|
||||
artist: data.anchorInfo?.baseInfo?.uname,
|
||||
artUri: getUri(data.roomInfo?.cover),
|
||||
isLive: true,
|
||||
);
|
||||
} else if (data is Part) {
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.part ?? '',
|
||||
artist: artist,
|
||||
duration: Duration(seconds: data.duration ?? 0),
|
||||
artUri: getUri(cover),
|
||||
);
|
||||
} else if (data is DetailItem) {
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.arc.title,
|
||||
artist: data.owner.name,
|
||||
duration: Duration(seconds: data.arc.duration.toInt()),
|
||||
artUri: getUri(data.arc.cover),
|
||||
);
|
||||
} else if (data is BiliDownloadEntryInfo) {
|
||||
final coverFile = File(path.join(data.entryDirPath, PathUtils.coverName));
|
||||
final uri = coverFile.existsSync()
|
||||
? coverFile.absolute.uri
|
||||
: getUri(data.cover);
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.showTitle,
|
||||
artist: data.ownerName,
|
||||
duration: Duration(milliseconds: data.totalTimeMilli),
|
||||
artUri: uri,
|
||||
);
|
||||
case DetailItem(:final arc):
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: arc.title,
|
||||
artist: data.owner.name,
|
||||
duration: Duration(seconds: arc.duration.toInt()),
|
||||
artUri: getUri(arc.cover),
|
||||
);
|
||||
case BiliDownloadEntryInfo():
|
||||
final coverFile = File(
|
||||
path.join(data.entryDirPath, PathUtils.coverName),
|
||||
);
|
||||
final uri = coverFile.existsSync()
|
||||
? coverFile.absolute.uri
|
||||
: getUri(data.cover);
|
||||
mediaItem = MediaItem(
|
||||
id: id,
|
||||
title: data.showTitle,
|
||||
artist: data.ownerName,
|
||||
duration: Duration(milliseconds: data.totalTimeMilli),
|
||||
artUri: uri,
|
||||
);
|
||||
default:
|
||||
return;
|
||||
}
|
||||
if (mediaItem == null) return;
|
||||
// if (kDebugMode) debugPrint("exist: ${PlPlayerController.instanceExists()}");
|
||||
if (!PlPlayerController.instanceExists()) return;
|
||||
_item.add(mediaItem);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:PiliPlus/models/model_owner.dart';
|
||||
import 'package:PiliPlus/models/user/danmaku_rule_adapter.dart';
|
||||
@@ -62,11 +61,6 @@ abstract final class GStorage {
|
||||
]);
|
||||
}
|
||||
|
||||
static Future<File> syncToDisk([_]) {
|
||||
final jsonPath = path.join(appSupportDirPath, 'settings.json');
|
||||
return File(jsonPath).writeAsString(exportAllSettings());
|
||||
}
|
||||
|
||||
static String exportAllSettings() {
|
||||
return Utils.jsonEncoder.convert({
|
||||
setting.name: setting.toMap(),
|
||||
|
||||
@@ -157,8 +157,7 @@ abstract final class SettingBoxKey {
|
||||
showWindowTitleBar = 'showWindowTitleBar',
|
||||
desktopVolume = 'desktopVolume',
|
||||
showTrayIcon = 'showTrayIcon',
|
||||
uiScale = 'uiScale',
|
||||
useSSD = 'useSSD';
|
||||
uiScale = 'uiScale';
|
||||
|
||||
static const String subtitlePreferenceV2 = 'subtitlePreferenceV2',
|
||||
enableDragSubtitle = 'enableDragSubtitle',
|
||||
|
||||
@@ -914,9 +914,6 @@ abstract final class Pref {
|
||||
static bool get showWindowTitleBar =>
|
||||
_setting.get(SettingBoxKey.showWindowTitleBar, defaultValue: true);
|
||||
|
||||
static bool get useSSD =>
|
||||
_setting.get(SettingBoxKey.useSSD, defaultValue: false);
|
||||
|
||||
static double get desktopVolume =>
|
||||
_setting.get(SettingBoxKey.desktopVolume, defaultValue: 1.0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user