52 lines
1.5 KiB
Dart
52 lines
1.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import '../services/settings_service.dart';
|
|
|
|
/// Calculates the max cross-axis extent for grid items, accounting for outer padding.
|
|
double getMaxCrossAxisExtentWithPadding(
|
|
BuildContext context,
|
|
LibraryDensity density,
|
|
double horizontalPadding,
|
|
) {
|
|
final screenWidth = MediaQuery.of(context).size.width;
|
|
final availableWidth = screenWidth - horizontalPadding;
|
|
|
|
if (screenWidth >= 900) {
|
|
// Wide screens (desktop/large tablet landscape): Responsive division
|
|
double divisor;
|
|
double maxItemWidth;
|
|
|
|
switch (density) {
|
|
case LibraryDensity.comfortable:
|
|
divisor = 6.5;
|
|
maxItemWidth = 280;
|
|
break;
|
|
case LibraryDensity.normal:
|
|
divisor = 8.0;
|
|
maxItemWidth = 200;
|
|
break;
|
|
case LibraryDensity.compact:
|
|
divisor = 10.0;
|
|
maxItemWidth = 160;
|
|
break;
|
|
}
|
|
|
|
return (availableWidth / divisor).clamp(0, maxItemWidth);
|
|
} else if (screenWidth >= 600) {
|
|
// Medium screens (tablets): Fixed 4-5-6 items
|
|
int targetItemCount = switch (density) {
|
|
LibraryDensity.comfortable => 4,
|
|
LibraryDensity.normal => 5,
|
|
LibraryDensity.compact => 6,
|
|
};
|
|
return availableWidth / targetItemCount;
|
|
} else {
|
|
// Small screens (phones): Fixed 2-3-4 items
|
|
int targetItemCount = switch (density) {
|
|
LibraryDensity.comfortable => 2,
|
|
LibraryDensity.normal => 3,
|
|
LibraryDensity.compact => 4,
|
|
};
|
|
return availableWidth / targetItemCount;
|
|
}
|
|
}
|