collection/albums/countries/tags: fixed tile size on settings change

This commit is contained in:
Thibault Deckers 2021-07-05 18:12:30 +09:00
parent b704d72c9d
commit a2ddae372b
7 changed files with 40 additions and 20 deletions

View file

@ -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();
}
}

View file

@ -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();
}

View file

@ -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(

View file

@ -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;

View file

@ -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(

View file

@ -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) {

View file

@ -53,8 +53,8 @@ class _EntryGoogleMapState extends State<EntryGoogleMap> {
@override
void dispose() {
super.dispose();
_controller?.dispose();
super.dispose();
}
@override