#987 viewer: fixed snack bar bottom margin

This commit is contained in:
Thibault Deckers 2024-04-18 23:25:35 +02:00
parent 66713cb663
commit 8776a3cc44
4 changed files with 15 additions and 14 deletions

View file

@ -21,12 +21,15 @@ import 'package:provider/provider.dart';
enum FeedbackType { info, warn }
typedef MarginComputer = EdgeInsets Function(BuildContext context);
mixin FeedbackMixin {
static final ValueNotifier<EdgeInsets?> snackBarMarginOverrideNotifier = ValueNotifier(null);
static final ValueNotifier<MarginComputer?> snackBarMarginOverrideNotifier = ValueNotifier(null);
static EdgeInsets snackBarMarginDefault(BuildContext context) {
final mq = context.read<MediaQueryData>();
return EdgeInsets.only(bottom: max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom));
return EdgeInsets.only(
bottom: context.select<MediaQueryData, double>((mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom)),
);
}
void dismissFeedback(BuildContext context) => ScaffoldMessenger.of(context).hideCurrentSnackBar();
@ -69,11 +72,12 @@ mixin FeedbackMixin {
notificationOverlayEntry = showOverlayNotification(
(context) => SafeArea(
bottom: false,
child: ValueListenableBuilder<EdgeInsets?>(
child: ValueListenableBuilder<MarginComputer?>(
valueListenable: snackBarMarginOverrideNotifier,
builder: (context, margin, child) {
builder: (context, marginComputer, child) {
final margin = (marginComputer ?? snackBarMarginDefault).call(context);
return AnimatedPadding(
padding: margin ?? snackBarMarginDefault(context),
padding: margin,
duration: ADurations.pageTransitionAnimation,
child: child,
);

View file

@ -24,10 +24,6 @@ class EntryViewerPage extends StatefulWidget {
@override
State<EntryViewerPage> createState() => _EntryViewerPageState();
static EdgeInsets snackBarMargin(BuildContext context) {
return EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context));
}
static Color getBackground(BuildContext context) => Theme.of(context).isDark ? Colors.black : Colors.white;
}

View file

@ -312,11 +312,13 @@ class _EntryViewerStackState extends State<EntryViewerStack> with EntryViewContr
void didPushNext() => _resetSnackBarMargin();
void _overrideSnackBarMargin() {
MarginComputer marginComputer;
if (isViewingImage) {
FeedbackMixin.snackBarMarginOverrideNotifier.value = EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context));
marginComputer = (context) => EdgeInsets.only(bottom: ViewerBottomOverlay.actionSafeHeight(context));
} else {
FeedbackMixin.snackBarMarginOverrideNotifier.value = FeedbackMixin.snackBarMarginDefault(context);
marginComputer = FeedbackMixin.snackBarMarginDefault;
}
FeedbackMixin.snackBarMarginOverrideNotifier.value = marginComputer;
}
void _resetSnackBarMargin() => FeedbackMixin.snackBarMarginOverrideNotifier.value = null;

View file

@ -46,8 +46,7 @@ class ViewerBottomOverlay extends StatefulWidget {
State<StatefulWidget> createState() => _ViewerBottomOverlayState();
static double actionSafeHeight(BuildContext context) {
final mq = context.read<MediaQueryData>();
final mqPaddingBottom = max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom);
final mqPaddingBottom = context.select<MediaQueryData, double>((mq) => max(mq.effectiveBottomPadding, mq.systemGestureInsets.bottom));
final buttonHeight = ViewerButtons.preferredHeight(context);
final thumbnailHeight = (settings.showOverlayThumbnailPreview ? ViewerThumbnailPreview.preferredHeight : 0);
return mqPaddingBottom + buttonHeight + thumbnailHeight;