collection/albums/countries/tags: fixed tile size on settings change
This commit is contained in:
parent
b704d72c9d
commit
a2ddae372b
7 changed files with 40 additions and 20 deletions
|
@ -189,9 +189,7 @@ class Settings extends ChangeNotifier {
|
|||
|
||||
double getTileExtent(String routeName) => _prefs!.getDouble(tileExtentPrefixKey + routeName) ?? 0;
|
||||
|
||||
// do not notify, as tile extents are only used internally by `TileExtentController`
|
||||
// and should not trigger rebuilding by change notification
|
||||
void setTileExtent(String routeName, double newValue) => setAndNotify(tileExtentPrefixKey + routeName, newValue, notify: false);
|
||||
void setTileExtent(String routeName, double newValue) => setAndNotify(tileExtentPrefixKey + routeName, newValue);
|
||||
|
||||
// collection
|
||||
|
||||
|
@ -362,7 +360,7 @@ class Settings extends ChangeNotifier {
|
|||
return _prefs!.getStringList(key)?.map((s) => values.firstWhereOrNull((v) => v.toString() == s)).where((v) => v != null).cast<T>().toList() ?? defaultValue;
|
||||
}
|
||||
|
||||
void setAndNotify(String key, dynamic newValue, {bool notify = true}) {
|
||||
void setAndNotify(String key, dynamic newValue) {
|
||||
var oldValue = _prefs!.get(key);
|
||||
if (newValue == null) {
|
||||
_prefs!.remove(key);
|
||||
|
@ -382,7 +380,7 @@ class Settings extends ChangeNotifier {
|
|||
oldValue = _prefs!.getBool(key);
|
||||
_prefs!.setBool(key, newValue);
|
||||
}
|
||||
if (oldValue != newValue && notify) {
|
||||
if (oldValue != newValue) {
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin {
|
|||
..forEach((sub) => sub.cancel())
|
||||
..clear();
|
||||
favourites.removeListener(_onFavouritesChanged);
|
||||
settings.addListener(_onSettingsChanged);
|
||||
settings.removeListener(_onSettingsChanged);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
|
|
@ -48,6 +48,12 @@ class CollectionGrid extends StatefulWidget {
|
|||
class _CollectionGridState extends State<CollectionGrid> {
|
||||
TileExtentController? _tileExtentController;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tileExtentController?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_tileExtentController ??= TileExtentController(
|
||||
|
|
|
@ -10,6 +10,7 @@ class TileExtentController {
|
|||
final double spacing, extentMin, extentMax;
|
||||
final ValueNotifier<double> extentNotifier = ValueNotifier(0);
|
||||
|
||||
late double userPreferredExtent;
|
||||
Size _viewportSize = Size.zero;
|
||||
|
||||
Size get viewportSize => _viewportSize;
|
||||
|
@ -21,7 +22,20 @@ class TileExtentController {
|
|||
required this.extentMin,
|
||||
this.extentMax = 300,
|
||||
required this.spacing,
|
||||
});
|
||||
}) {
|
||||
userPreferredExtent = settings.getTileExtent(settingsRouteKey);
|
||||
settings.addListener(_onSettingsChanged);
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
settings.removeListener(_onSettingsChanged);
|
||||
}
|
||||
|
||||
void _onSettingsChanged() {
|
||||
if (userPreferredExtent != settings.getTileExtent(settingsRouteKey)) {
|
||||
_update();
|
||||
}
|
||||
}
|
||||
|
||||
void setViewportSize(Size viewportSize) {
|
||||
// sanitize screen size (useful when reloading while screen is off, reporting a 0,0 size)
|
||||
|
@ -35,22 +49,18 @@ class TileExtentController {
|
|||
}
|
||||
}
|
||||
|
||||
double setUserPreferredExtent(double userPreferredExtent) => _update(userPreferredExtent: userPreferredExtent);
|
||||
double setUserPreferredExtent(double extent) => _update(userPreferredExtent: extent.roundToDouble());
|
||||
|
||||
double _update({double userPreferredExtent = 0}) {
|
||||
final oldUserPreferredExtent = settings.getTileExtent(settingsRouteKey);
|
||||
final currentExtent = extentNotifier.value;
|
||||
final targetExtent = userPreferredExtent > 0
|
||||
? userPreferredExtent
|
||||
: oldUserPreferredExtent > 0
|
||||
? oldUserPreferredExtent
|
||||
: currentExtent;
|
||||
double _update({double? userPreferredExtent}) {
|
||||
final preferredExtent = userPreferredExtent ?? settings.getTileExtent(settingsRouteKey);
|
||||
final targetExtent = preferredExtent > 0 ? preferredExtent : extentNotifier.value;
|
||||
|
||||
final columnCount = _effectiveColumnCountForExtent(targetExtent);
|
||||
final newExtent = _extentForColumnCount(columnCount);
|
||||
|
||||
if (userPreferredExtent > 0 || oldUserPreferredExtent == 0) {
|
||||
settings.setTileExtent(settingsRouteKey, newExtent);
|
||||
if (this.userPreferredExtent != preferredExtent) {
|
||||
this.userPreferredExtent = preferredExtent;
|
||||
settings.setTileExtent(settingsRouteKey, preferredExtent);
|
||||
}
|
||||
if (extentNotifier.value != newExtent) {
|
||||
extentNotifier.value = newExtent;
|
||||
|
|
|
@ -133,6 +133,12 @@ class FilterGrid<T extends CollectionFilter> extends StatefulWidget {
|
|||
class _FilterGridState<T extends CollectionFilter> extends State<FilterGrid<T>> {
|
||||
TileExtentController? _tileExtentController;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_tileExtentController?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_tileExtentController ??= TileExtentController(
|
||||
|
|
|
@ -37,12 +37,12 @@ class _SearchPageState extends State<SearchPage> {
|
|||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
widget.delegate.queryTextController.removeListener(_onQueryChanged);
|
||||
widget.animation.removeStatusListener(_onAnimationStatusChanged);
|
||||
widget.delegate.currentBodyNotifier.removeListener(_onSearchBodyChanged);
|
||||
widget.delegate.focusNode = null;
|
||||
_focusNode.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _onAnimationStatusChanged(AnimationStatus status) {
|
||||
|
|
|
@ -53,8 +53,8 @@ class _EntryGoogleMapState extends State<EntryGoogleMap> {
|
|||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_controller?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
Loading…
Reference in a new issue