fix: stabilize grid column count when alpha bar shows
This commit is contained in:
@@ -1248,7 +1248,7 @@ class _LibraryBrowseTabState extends BaseLibraryTabState<PlexMetadata, LibraryBr
|
||||
static const double _gridTopPaddingPhone = _chipsBarHeight;
|
||||
|
||||
/// Width of the alpha jump bar widget
|
||||
static const double _alphaJumpBarWidth = 28.0;
|
||||
static const double _alphaJumpBarWidth = 20.0;
|
||||
|
||||
/// Builds either a sliver list or sliver grid based on the view mode
|
||||
Widget _buildItemsSliver(BuildContext context, SettingsProvider settingsProvider) {
|
||||
@@ -1277,12 +1277,18 @@ class _LibraryBrowseTabState extends BaseLibraryTabState<PlexMetadata, LibraryBr
|
||||
// Use 16:9 aspect ratio when browsing episodes with episode thumbnail mode
|
||||
final useWideRatio =
|
||||
_selectedGrouping == 'episodes' && settingsProvider.episodePosterMode == EpisodePosterMode.episodeThumbnail;
|
||||
final maxExtent = GridSizeCalculator.getMaxCrossAxisExtent(context, settingsProvider.libraryDensity);
|
||||
final baseMaxExtent = GridSizeCalculator.getMaxCrossAxisExtent(context, settingsProvider.libraryDensity);
|
||||
final effectiveMaxExtent = useWideRatio ? baseMaxExtent * 1.8 : baseMaxExtent;
|
||||
final hasAlphaBarReservation = rightPadding > 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<PlexMetadata, LibraryBr
|
||||
context: context,
|
||||
density: settingsProvider.libraryDensity,
|
||||
useWideAspectRatio: useWideRatio,
|
||||
maxCrossAxisExtentOverride: hasAlphaBarReservation ? constraints.crossAxisExtent / columnCount : null,
|
||||
),
|
||||
itemCount: itemCount,
|
||||
itemBuilder: (context, index) => _buildMediaCardItem(
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user