diff --git a/lib/screens/libraries/tabs/library_browse_tab.dart b/lib/screens/libraries/tabs/library_browse_tab.dart index 6a56b411..72ba2c90 100644 --- a/lib/screens/libraries/tabs/library_browse_tab.dart +++ b/lib/screens/libraries/tabs/library_browse_tab.dart @@ -1248,7 +1248,7 @@ class _LibraryBrowseTabState extends BaseLibraryTabState 8.0; return SliverPadding( padding: EdgeInsets.fromLTRB(8, topPadding, rightPadding, 8), sliver: SliverLayoutBuilder( builder: (context, constraints) { - final columnCount = GridSizeCalculator.getColumnCount(constraints.crossAxisExtent, maxExtent); + // Compute column count from the width the grid would have without the alpha + // bar's reservation, so toggling the bar doesn't repack the grid into one + // fewer column and blow up poster size. + final baselineWidth = constraints.crossAxisExtent + (rightPadding - 8.0); + final columnCount = GridSizeCalculator.getColumnCount(baselineWidth, effectiveMaxExtent); // Cache grid metrics for alpha jump bar scroll calculations _lastCrossAxisExtent = constraints.crossAxisExtent; _currentColumnCount = columnCount; @@ -1291,6 +1297,7 @@ class _LibraryBrowseTabState extends BaseLibraryTabState _buildMediaCardItem( diff --git a/lib/widgets/media_grid_delegate.dart b/lib/widgets/media_grid_delegate.dart index 90645ddc..2fecfdd1 100644 --- a/lib/widgets/media_grid_delegate.dart +++ b/lib/widgets/media_grid_delegate.dart @@ -10,25 +10,33 @@ class MediaGridDelegate { /// Uses [GridSizeCalculator.getMaxCrossAxisExtent] by default. /// Set [usePaddingAware] to true to use [GridSizeCalculator.getMaxCrossAxisExtentWithPadding] instead. /// Set [useWideAspectRatio] to true to use 16:9 aspect ratio for episode thumbnails. + /// Pass [maxCrossAxisExtentOverride] to bypass the calculator and the wide-aspect multiplier — + /// the caller is then responsible for providing a fully-resolved per-cell width. static SliverGridDelegateWithMaxCrossAxisExtent createDelegate({ required BuildContext context, required int density, bool usePaddingAware = false, double horizontalPadding = 16, bool useWideAspectRatio = false, + double? maxCrossAxisExtentOverride, }) { - var maxCrossAxisExtent = usePaddingAware - ? GridSizeCalculator.getMaxCrossAxisExtentWithPadding(context, density, horizontalPadding) - : GridSizeCalculator.getMaxCrossAxisExtent(context, density); - final aspectRatio = useWideAspectRatio ? GridLayoutConstants.episodeGridCellAspectRatio : GridLayoutConstants.posterAspectRatio; - // For wide aspect ratio (16:9), increase max extent so items are larger - // and there are fewer per row (roughly 1.8x wider to maintain similar visual area) - if (useWideAspectRatio) { - maxCrossAxisExtent *= 1.8; + double maxCrossAxisExtent; + if (maxCrossAxisExtentOverride != null) { + maxCrossAxisExtent = maxCrossAxisExtentOverride; + } else { + maxCrossAxisExtent = usePaddingAware + ? GridSizeCalculator.getMaxCrossAxisExtentWithPadding(context, density, horizontalPadding) + : GridSizeCalculator.getMaxCrossAxisExtent(context, density); + + // For wide aspect ratio (16:9), increase max extent so items are larger + // and there are fewer per row (roughly 1.8x wider to maintain similar visual area) + if (useWideAspectRatio) { + maxCrossAxisExtent *= 1.8; + } } return SliverGridDelegateWithMaxCrossAxisExtent(