Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-10-12 17:05:52 +08:00
parent e4a960ecf9
commit 931fcb6f8f
18 changed files with 150 additions and 78 deletions

View File

@@ -13,6 +13,9 @@ import 'package:PiliPlus/pages/fav_sort/view.dart';
import 'package:PiliPlus/services/account_service.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:flutter/services.dart' show ValueChanged;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
@@ -85,7 +88,14 @@ class FavDetailController
AccountService accountService = Get.find<AccountService>();
late final RxBool isPlayAll = true.obs;
late double dx = 0;
late final RxBool isPlayAll = Pref.enablePlayAll.obs;
void setIsPlayAll(bool isPlayAll) {
if (this.isPlayAll.value == isPlayAll) return;
this.isPlayAll.value = isPlayAll;
GStorage.setting.put(SettingBoxKey.enablePlayAll, isPlayAll);
}
@override
void onInit() {

View File

@@ -58,31 +58,42 @@ class _FavDetailPageState extends State<FavDetailPage> with GridMixin {
},
child: Scaffold(
resizeToAvoidBottomInset: false,
floatingActionButton: Obx(
() => _favDetailController.folderInfo.value.mediaCount > 0
? AnimatedSlide(
offset: _favDetailController.isPlayAll.value
? Offset.zero
: const Offset(0.75, 0),
duration: const Duration(milliseconds: 120),
child: GestureDetector(
onHorizontalDragUpdate: (details) =>
_favDetailController.isPlayAll.value =
details.delta.dx < 0,
child: FloatingActionButton.extended(
onPressed: () {
if (_favDetailController.isPlayAll.value) {
_favDetailController.toViewPlayAll();
} else {
_favDetailController.isPlayAll.value = true;
}
},
label: const Text('播放全部'),
icon: const Icon(Icons.playlist_play),
floatingActionButtonLocation: const CustomFabLocation(),
floatingActionButton: Padding(
padding: const EdgeInsets.only(
right: kFloatingActionButtonMargin,
),
child: Obx(
() => _favDetailController.folderInfo.value.mediaCount > 0
? AnimatedSlide(
offset: _favDetailController.isPlayAll.value
? Offset.zero
: const Offset(0.75, 0),
duration: const Duration(milliseconds: 120),
child: GestureDetector(
onHorizontalDragDown: (details) =>
_favDetailController.dx =
details.localPosition.dx,
onHorizontalDragStart: (details) =>
_favDetailController.setIsPlayAll(
details.localPosition.dx <
_favDetailController.dx,
),
child: FloatingActionButton.extended(
onPressed: () {
if (_favDetailController.isPlayAll.value) {
_favDetailController.toViewPlayAll();
} else {
_favDetailController.setIsPlayAll(true);
}
},
label: const Text('播放全部'),
icon: const Icon(Icons.playlist_play),
),
),
),
)
: const SizedBox.shrink(),
)
: const SizedBox.shrink(),
),
),
body: refreshIndicator(
onRefresh: _favDetailController.onRefresh,
@@ -509,3 +520,18 @@ class _FavDetailPageState extends State<FavDetailPage> with GridMixin {
};
}
}
class CustomFabLocation extends StandardFabLocation with FabFloatOffsetY {
const CustomFabLocation();
@override
double getOffsetX(
ScaffoldPrelayoutGeometry scaffoldGeometry,
double adjustment,
) {
return scaffoldGeometry.scaffoldSize.width -
scaffoldGeometry.minInsets.right -
scaffoldGeometry.floatingActionButtonSize.width +
adjustment;
}
}