From ebffcbb27c4e317a935ab984f3c3dfb713a2e95f Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 21 Aug 2020 15:57:11 +0900 Subject: [PATCH] settings: added coordinate format --- lib/model/settings.dart | 33 +++++++++++++++ lib/widgets/app_drawer.dart | 2 +- .../fullscreen/info/location_section.dart | 3 +- lib/widgets/fullscreen/overlay/bottom.dart | 4 +- lib/widgets/settings/coordinate_format.dart | 31 ++++++++++++++ lib/widgets/settings/launch_page.dart | 31 ++++++++++++++ lib/widgets/{ => settings}/settings_page.dart | 42 +++++-------------- 7 files changed, 110 insertions(+), 36 deletions(-) create mode 100644 lib/widgets/settings/coordinate_format.dart create mode 100644 lib/widgets/settings/launch_page.dart rename lib/widgets/{ => settings}/settings_page.dart (53%) diff --git a/lib/model/settings.dart b/lib/model/settings.dart index d7e326018..f6408fa3a 100644 --- a/lib/model/settings.dart +++ b/lib/model/settings.dart @@ -1,7 +1,9 @@ +import 'package:aves/utils/geo_utils.dart'; import 'package:aves/widgets/fullscreen/info/location_section.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tuple/tuple.dart'; import 'source/enums.dart'; @@ -25,6 +27,7 @@ class Settings { static const infoMapStyleKey = 'info_map_style'; static const infoMapZoomKey = 'info_map_zoom'; static const launchPageKey = 'launch_page'; + static const coordinateFormatKey = 'coordinates_format'; Future init() async { _prefs = await SharedPreferences.getInstance(); @@ -86,6 +89,10 @@ class Settings { set launchPage(LaunchPage newValue) => setAndNotify(launchPageKey, newValue.toString()); + CoordinateFormat get coordinateFormat => getEnumOrDefault(coordinateFormatKey, CoordinateFormat.dms, CoordinateFormat.values); + + set coordinateFormat(CoordinateFormat newValue) => setAndNotify(coordinateFormatKey, newValue.toString()); + // convenience methods // ignore: avoid_positional_boolean_parameters @@ -145,3 +152,29 @@ extension ExtraLaunchPage on LaunchPage { } } } + +enum CoordinateFormat { dms, decimal } + +extension ExtraCoordinateFormat on CoordinateFormat { + String get name { + switch (this) { + case CoordinateFormat.dms: + return 'DMS'; + case CoordinateFormat.decimal: + return 'Decimal degrees'; + default: + return toString(); + } + } + + String format(Tuple2 latLng) { + switch (this) { + case CoordinateFormat.dms: + return toDMS(latLng).join(', '); + case CoordinateFormat.decimal: + return [latLng.item1, latLng.item2].map((n) => n.toStringAsFixed(6)).join(', '); + default: + return toString(); + } + } +} diff --git a/lib/widgets/app_drawer.dart b/lib/widgets/app_drawer.dart index c24c77d01..d5cc898ce 100644 --- a/lib/widgets/app_drawer.dart +++ b/lib/widgets/app_drawer.dart @@ -18,7 +18,7 @@ import 'package:aves/widgets/common/aves_logo.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/debug_page.dart'; import 'package:aves/widgets/filter_grid_page.dart'; -import 'package:aves/widgets/settings_page.dart'; +import 'package:aves/widgets/settings/settings_page.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/fullscreen/info/location_section.dart b/lib/widgets/fullscreen/info/location_section.dart index 223735da6..d1cc15d2f 100644 --- a/lib/widgets/fullscreen/info/location_section.dart +++ b/lib/widgets/fullscreen/info/location_section.dart @@ -2,7 +2,6 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; -import 'package:aves/utils/geo_utils.dart'; import 'package:aves/widgets/common/aves_filter_chip.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/fullscreen/info/info_page.dart'; @@ -108,7 +107,7 @@ class _LocationSectionState extends State { style: settings.infoMapStyle, ), ), - if (entry.hasGps) InfoRowGroup({'Coordinates': toDMS(entry.latLng).join(', ')}), + if (entry.hasGps) InfoRowGroup({'Coordinates': settings.coordinateFormat.format(entry.latLng)}), if (location.isNotEmpty) InfoRowGroup({'Address': location}), if (filters.isNotEmpty) Padding( diff --git a/lib/widgets/fullscreen/overlay/bottom.dart b/lib/widgets/fullscreen/overlay/bottom.dart index 772c36b26..0cc39f525 100644 --- a/lib/widgets/fullscreen/overlay/bottom.dart +++ b/lib/widgets/fullscreen/overlay/bottom.dart @@ -3,9 +3,9 @@ import 'dart:ui'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_metadata.dart'; +import 'package:aves/model/settings.dart'; import 'package:aves/services/metadata_service.dart'; import 'package:aves/utils/constants.dart'; -import 'package:aves/utils/geo_utils.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/fullscreen/overlay/common.dart'; @@ -212,7 +212,7 @@ class _LocationRow extends AnimatedWidget { if (entry.isLocated) { location = entry.shortAddress; } else if (entry.hasGps) { - location = toDMS(entry.latLng).join(', '); + location = settings.coordinateFormat.format(entry.latLng); } return Row( children: [ diff --git a/lib/widgets/settings/coordinate_format.dart b/lib/widgets/settings/coordinate_format.dart new file mode 100644 index 000000000..47b0d93a2 --- /dev/null +++ b/lib/widgets/settings/coordinate_format.dart @@ -0,0 +1,31 @@ +import 'package:aves/model/settings.dart'; +import 'package:flutter/material.dart'; + +class CoordinateFormatSelector extends StatefulWidget { + @override + _CoordinateFormatSelectorState createState() => _CoordinateFormatSelectorState(); +} + +class _CoordinateFormatSelectorState extends State { + @override + Widget build(BuildContext context) { + return DropdownButton( + items: CoordinateFormat.values + .map((selected) => DropdownMenuItem( + value: selected, + child: Text( + selected.name, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + )) + .toList(), + value: settings.coordinateFormat, + onChanged: (selected) { + settings.coordinateFormat = selected; + setState(() {}); + }, + ); + } +} diff --git a/lib/widgets/settings/launch_page.dart b/lib/widgets/settings/launch_page.dart new file mode 100644 index 000000000..321f4bbbc --- /dev/null +++ b/lib/widgets/settings/launch_page.dart @@ -0,0 +1,31 @@ +import 'package:aves/model/settings.dart'; +import 'package:flutter/material.dart'; + +class LaunchPageSelector extends StatefulWidget { + @override + _LaunchPageSelectorState createState() => _LaunchPageSelectorState(); +} + +class _LaunchPageSelectorState extends State { + @override + Widget build(BuildContext context) { + return DropdownButton( + items: LaunchPage.values + .map((selected) => DropdownMenuItem( + value: selected, + child: Text( + selected.name, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + )) + .toList(), + value: settings.launchPage, + onChanged: (selected) { + settings.launchPage = selected; + setState(() {}); + }, + ); + } +} diff --git a/lib/widgets/settings_page.dart b/lib/widgets/settings/settings_page.dart similarity index 53% rename from lib/widgets/settings_page.dart rename to lib/widgets/settings/settings_page.dart index bd94b32f1..f1f8f5891 100644 --- a/lib/widgets/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -1,6 +1,7 @@ -import 'package:aves/model/settings.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/data_providers/media_query_data_provider.dart'; +import 'package:aves/widgets/settings/coordinate_format.dart'; +import 'package:aves/widgets/settings/launch_page.dart'; import 'package:flutter/material.dart'; class SettingsPage extends StatelessWidget { @@ -21,11 +22,19 @@ class SettingsPage extends StatelessWidget { Row( mainAxisSize: MainAxisSize.min, children: [ - Text('Launch Page:'), + Text('Launch page:'), SizedBox(width: 8), Flexible(child: LaunchPageSelector()), ], ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Coordinate format:'), + SizedBox(width: 8), + Flexible(child: CoordinateFormatSelector()), + ], + ), ], ), ), @@ -34,32 +43,3 @@ class SettingsPage extends StatelessWidget { ); } } - -class LaunchPageSelector extends StatefulWidget { - @override - _LaunchPageSelectorState createState() => _LaunchPageSelectorState(); -} - -class _LaunchPageSelectorState extends State { - @override - Widget build(BuildContext context) { - return DropdownButton( - items: LaunchPage.values - .map((selected) => DropdownMenuItem( - value: selected, - child: Text( - selected.name, - softWrap: false, - overflow: TextOverflow.fade, - maxLines: 1, - ), - )) - .toList(), - value: settings.launchPage, - onChanged: (selected) { - settings.launchPage = selected; - setState(() {}); - }, - ); - } -}