Files
plezy/lib/widgets/media_grid_delegate.dart
T

50 lines
2.1 KiB
Dart
Raw Normal View History

2025-12-07 15:00:28 +01:00
import 'package:flutter/material.dart';
import '../utils/grid_size_calculator.dart';
2025-12-13 00:16:50 +01:00
import '../utils/layout_constants.dart';
2025-12-07 15:00:28 +01:00
/// Shared grid delegate configuration for media item grids
/// Maintains consistent spacing (2/3.3 aspect ratio, 0 spacing) across all media grids
class MediaGridDelegate {
/// Creates a standard grid delegate for media items
///
/// Uses [GridSizeCalculator.getMaxCrossAxisExtent] by default.
2025-12-13 00:16:50 +01:00
/// Set [usePaddingAware] to true to use [GridSizeCalculator.getMaxCrossAxisExtentWithPadding] instead.
2026-01-08 14:42:49 +01:00
/// 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.
2025-12-07 15:00:28 +01:00
static SliverGridDelegateWithMaxCrossAxisExtent createDelegate({
required BuildContext context,
2026-04-03 17:03:52 +02:00
required int density,
2025-12-07 15:00:28 +01:00
bool usePaddingAware = false,
double horizontalPadding = 16,
2026-01-08 14:42:49 +01:00
bool useWideAspectRatio = false,
double? maxCrossAxisExtentOverride,
2025-12-07 15:00:28 +01:00
}) {
2026-01-08 14:42:49 +01:00
final aspectRatio = useWideAspectRatio
? GridLayoutConstants.episodeGridCellAspectRatio
: GridLayoutConstants.posterAspectRatio;
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;
}
2026-01-08 14:42:49 +01:00
}
2025-12-07 15:00:28 +01:00
return SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: maxCrossAxisExtent,
2026-01-08 14:42:49 +01:00
childAspectRatio: aspectRatio,
2025-12-13 00:16:50 +01:00
crossAxisSpacing: GridLayoutConstants.crossAxisSpacing,
mainAxisSpacing: GridLayoutConstants.mainAxisSpacing,
2025-12-07 15:00:28 +01:00
);
}
}