From b021c4d89353e09165b895b2f8822f8902fd0a86 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 16 Aug 2019 19:53:17 +0900 Subject: [PATCH] settings: added info map zoom --- lib/main.dart | 4 +- lib/model/settings.dart | 72 +++++++++++++++++++ .../fullscreen/info/location_section.dart | 6 +- pubspec.lock | 7 ++ pubspec.yaml | 1 + 5 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 lib/model/settings.dart diff --git a/lib/main.dart b/lib/main.dart index b1f4b6ffa..0f3b91016 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,12 +2,14 @@ import 'package:aves/model/image_collection.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_file_service.dart'; import 'package:aves/model/metadata_db.dart'; +import 'package:aves/model/settings.dart'; import 'package:aves/widgets/album/all_collection_page.dart'; import 'package:aves/widgets/common/fake_app_bar.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -void main() { +void main() async { + await settings.init(); runApp(AvesApp()); } diff --git a/lib/model/settings.dart b/lib/model/settings.dart new file mode 100644 index 000000000..66329fa13 --- /dev/null +++ b/lib/model/settings.dart @@ -0,0 +1,72 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +final Settings settings = Settings._private(); + +typedef void SettingsCallback(String key, dynamic oldValue, dynamic newValue); + +class Settings { + static SharedPreferences prefs; + + ObserverList _listeners = ObserverList(); + + Settings._private(); + + // preferences + static const infoMapZoomKey = 'info_map_zoom'; + + init() async { + prefs = await SharedPreferences.getInstance(); + } + + void addListener(SettingsCallback listener) => _listeners.add(listener); + + void removeListener(SettingsCallback listener) => _listeners.remove(listener); + + void notifyListeners(String key, dynamic oldValue, dynamic newValue) { + debugPrint('$runtimeType notifyListeners key=$key, old=$oldValue, new=$newValue'); + if (_listeners != null) { + final List localListeners = _listeners.toList(); + for (SettingsCallback listener in localListeners) { + try { + if (_listeners.contains(listener)) { + listener(key, oldValue, newValue); + } + } catch (exception, stack) { + debugPrint('$runtimeType failed to notify listeners with exception=$exception\n$stack'); + } + } + } + } + + double get infoMapZoom => prefs.getDouble(infoMapZoomKey) ?? 12; + + set infoMapZoom(double newValue) => setAndNotify(infoMapZoomKey, newValue); + + // convenience methods + + bool getBoolOrDefault(String key, bool defaultValue) => prefs.getKeys().contains(key) ? prefs.getBool(key) : defaultValue; + + setAndNotify(String key, dynamic newValue) { + var oldValue = prefs.get(key); + if (newValue == null) { + prefs.remove(key); + } else if (newValue is String) { + oldValue = prefs.getString(key); + prefs.setString(key, newValue); + } else if (newValue is int) { + oldValue = prefs.getInt(key); + prefs.setInt(key, newValue); + } else if (newValue is double) { + oldValue = prefs.getDouble(key); + prefs.setDouble(key, newValue); + } else if (newValue is bool) { + oldValue = prefs.getBool(key); + prefs.setBool(key, newValue); + } + if (oldValue != newValue) { + notifyListeners(key, oldValue, newValue); + } + } +} diff --git a/lib/widgets/fullscreen/info/location_section.dart b/lib/widgets/fullscreen/info/location_section.dart index 49ba142f3..fc2188713 100644 --- a/lib/widgets/fullscreen/info/location_section.dart +++ b/lib/widgets/fullscreen/info/location_section.dart @@ -1,4 +1,5 @@ import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/settings.dart'; import 'package:aves/utils/android_app_service.dart'; import 'package:aves/widgets/fullscreen/info/info_page.dart'; import 'package:flutter/material.dart'; @@ -24,8 +25,7 @@ class LocationSection extends AnimatedWidget { entry.latLng.item2, ), geoUri: entry.geoUri, - // TODO TLAD read preferences/zoom - initialZoom: 12, + initialZoom: settings.infoMapZoom, ), if (entry.isLocated) Padding( @@ -113,7 +113,7 @@ class ImageMapState extends State with AutomaticKeepAliveClientMixin { } zoomBy(double amount) { - // TODO TLAD update preferences/zoom + settings.infoMapZoom += amount; controller.animateCamera(CameraUpdate.zoomBy(amount)); } diff --git a/pubspec.lock b/pubspec.lock index 449686678..a06bc68a1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -144,6 +144,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.5" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.3+4" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 5b0921dda..f44345c97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,6 +29,7 @@ dependencies: path: photo_view: screen: + shared_preferences: sqflite: transparent_image: tuple: