settings: added info map zoom
This commit is contained in:
parent
dce5a30dca
commit
b021c4d893
5 changed files with 86 additions and 4 deletions
|
@ -2,12 +2,14 @@ import 'package:aves/model/image_collection.dart';
|
||||||
import 'package:aves/model/image_entry.dart';
|
import 'package:aves/model/image_entry.dart';
|
||||||
import 'package:aves/model/image_file_service.dart';
|
import 'package:aves/model/image_file_service.dart';
|
||||||
import 'package:aves/model/metadata_db.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/album/all_collection_page.dart';
|
||||||
import 'package:aves/widgets/common/fake_app_bar.dart';
|
import 'package:aves/widgets/common/fake_app_bar.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
void main() {
|
void main() async {
|
||||||
|
await settings.init();
|
||||||
runApp(AvesApp());
|
runApp(AvesApp());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
72
lib/model/settings.dart
Normal file
72
lib/model/settings.dart
Normal file
|
@ -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<SettingsCallback> _listeners = ObserverList<SettingsCallback>();
|
||||||
|
|
||||||
|
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<SettingsCallback> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:aves/model/image_entry.dart';
|
import 'package:aves/model/image_entry.dart';
|
||||||
|
import 'package:aves/model/settings.dart';
|
||||||
import 'package:aves/utils/android_app_service.dart';
|
import 'package:aves/utils/android_app_service.dart';
|
||||||
import 'package:aves/widgets/fullscreen/info/info_page.dart';
|
import 'package:aves/widgets/fullscreen/info/info_page.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -24,8 +25,7 @@ class LocationSection extends AnimatedWidget {
|
||||||
entry.latLng.item2,
|
entry.latLng.item2,
|
||||||
),
|
),
|
||||||
geoUri: entry.geoUri,
|
geoUri: entry.geoUri,
|
||||||
// TODO TLAD read preferences/zoom
|
initialZoom: settings.infoMapZoom,
|
||||||
initialZoom: 12,
|
|
||||||
),
|
),
|
||||||
if (entry.isLocated)
|
if (entry.isLocated)
|
||||||
Padding(
|
Padding(
|
||||||
|
@ -113,7 +113,7 @@ class ImageMapState extends State<ImageMap> with AutomaticKeepAliveClientMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
zoomBy(double amount) {
|
zoomBy(double amount) {
|
||||||
// TODO TLAD update preferences/zoom
|
settings.infoMapZoom += amount;
|
||||||
controller.animateCamera(CameraUpdate.zoomBy(amount));
|
controller.animateCamera(CameraUpdate.zoomBy(amount));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.0.5"
|
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:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
|
@ -29,6 +29,7 @@ dependencies:
|
||||||
path:
|
path:
|
||||||
photo_view:
|
photo_view:
|
||||||
screen:
|
screen:
|
||||||
|
shared_preferences:
|
||||||
sqflite:
|
sqflite:
|
||||||
transparent_image:
|
transparent_image:
|
||||||
tuple:
|
tuple:
|
||||||
|
|
Loading…
Reference in a new issue