diff --git a/iap/pubspec.yaml b/iap/pubspec.yaml index 540ff00..542fcb6 100644 --- a/iap/pubspec.yaml +++ b/iap/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: m3_lightmeter_resources: git: url: "https://github.com/vodemn/m3_lightmeter_resources" - ref: v2.1.0 + ref: v2.2.0 shared_preferences: dev_dependencies: @@ -20,5 +20,10 @@ dev_dependencies: sdk: flutter flutter_lints: ^2.0.0 + +dependency_overrides: + m3_lightmeter_resources: + path: /Users/vodemn/Documents/GitHub/Vodemn/m3_lightmeter_resources + flutter: uses-material-design: true diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 92ee6a8..7da223b 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -23,6 +23,7 @@ "cancel": "Abbrechen", "select": "Auswählen", "save": "Speichern", + "saveNewPhotos": "Neue Fotos speichern", "settings": "Einstellungen", "metering": "Messung", "fractionalStops": "Zwischenstufen", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 875e1ee..99d15dc 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -23,6 +23,7 @@ "cancel": "Cancel", "select": "Select", "save": "Save", + "saveNewPhotos": "Save new photos", "settings": "Settings", "metering": "Metering", "fractionalStops": "Fractional stops", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index ee35dff..1d83c6b 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -23,6 +23,7 @@ "cancel": "Annuler", "select": "Sélectionner", "save": "Enregistrer", + "saveNewPhotos": "Enregistrer les nouvelles photos", "settings": "Paramètres", "metering": "Mesure", "fractionalStops": "Arrêts fractionnaires", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 05b8062..a2daaf6 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -23,6 +23,7 @@ "cancel": "Отменить", "select": "Выбрать", "save": "Сохранить", + "saveNewPhotos": "Сохранять новые фото", "settings": "Настройки", "metering": "Измерения", "fractionalStops": "Дробные значения", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 795c078..2fad783 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -23,6 +23,7 @@ "cancel": "取消", "select": "选择", "save": "保存", + "saveNewPhotos": "保存新照片", "settings": "设置", "metering": "测量", "fractionalStops": "EV 步进值", diff --git a/lib/providers/logbook_photos_provider.dart b/lib/providers/logbook_photos_provider.dart index d1c83f4..b26a107 100644 --- a/lib/providers/logbook_photos_provider.dart +++ b/lib/providers/logbook_photos_provider.dart @@ -30,6 +30,7 @@ class LogbookPhotosProvider extends StatefulWidget { class LogbookPhotosProviderState extends State { final Map _photos = {}; + bool _isEnabled = true; @override void initState() { @@ -41,10 +42,17 @@ class LogbookPhotosProviderState extends State { Widget build(BuildContext context) { return LogbookPhotos( photos: context.isPro ? _photos.values.toList(growable: false) : [], + isEnabled: _isEnabled, child: widget.child, ); } + void saveLogbookPhotos(bool save) { + setState(() { + _isEnabled = save; + }); + } + Future _init() async { _photos.addAll( Map.fromIterable( @@ -62,8 +70,7 @@ class LogbookPhotosProviderState extends State { required int iso, required int nd, }) async { - if (context.isPro) { - // Get coordinates from geolocation service + if (context.isPro && _isEnabled) { final geolocationService = ServicesProvider.of(context).geolocationService; final coordinates = await geolocationService.getCurrentPosition(); @@ -76,7 +83,7 @@ class LogbookPhotosProviderState extends State { nd: nd, coordinates: coordinates, ); - await widget.storageService.addPhoto(photo); + //await widget.storageService.addPhoto(photo); _photos[photo.id] = photo; setState(() {}); } else { @@ -106,21 +113,45 @@ class LogbookPhotosProviderState extends State { } } -class LogbookPhotos extends InheritedWidget { +enum _LogbookPhotosModelAspect { photosList, isEnabled } + +class LogbookPhotos extends InheritedModel<_LogbookPhotosModelAspect> { final List photos; + final bool isEnabled; const LogbookPhotos({ required this.photos, + required this.isEnabled, required super.child, }); - static List of(BuildContext context, {bool listen = false}) { + static List of(BuildContext context, {bool listen = true}) { return (listen - ? context.dependOnInheritedWidgetOfExactType() + ? InheritedModel.inheritFrom(context, aspect: _LogbookPhotosModelAspect.photosList) : context.getInheritedWidgetOfExactType())! .photos; } + static bool isEnabledOf(BuildContext context, {bool listen = true}) { + return (listen + ? InheritedModel.inheritFrom(context, aspect: _LogbookPhotosModelAspect.isEnabled) + : context.getInheritedWidgetOfExactType())! + .isEnabled; + } + @override - bool updateShouldNotify(LogbookPhotos oldWidget) => !const DeepCollectionEquality().equals(oldWidget.photos, photos); + bool updateShouldNotify(LogbookPhotos oldWidget) => + !const DeepCollectionEquality().equals(oldWidget.photos, photos) || oldWidget.isEnabled != isEnabled; + + @override + bool updateShouldNotifyDependent(LogbookPhotos oldWidget, Set<_LogbookPhotosModelAspect> aspects) { + if (aspects.contains(_LogbookPhotosModelAspect.photosList) && + !const DeepCollectionEquality().equals(oldWidget.photos, photos)) { + return true; + } + if (aspects.contains(_LogbookPhotosModelAspect.isEnabled) && oldWidget.isEnabled != isEnabled) { + return true; + } + return false; + } } diff --git a/lib/screens/logbook/screen_logbook.dart b/lib/screens/logbook/screen_logbook.dart index b478b3e..ae99e65 100644 --- a/lib/screens/logbook/screen_logbook.dart +++ b/lib/screens/logbook/screen_logbook.dart @@ -5,8 +5,8 @@ import 'package:lightmeter/platform_config.dart'; import 'package:lightmeter/providers/logbook_photos_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/logbook/components/grid_tile/widget_grid_tile_logbook_photo.dart'; -import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; import 'package:lightmeter/screens/shared/icon_placeholder/widget_icon_placeholder.dart'; +import 'package:lightmeter/screens/shared/sliver_screen/screen_sliver.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class LogbookScreen extends StatefulWidget { @@ -22,8 +22,22 @@ class _LogbookScreenState extends State with SingleTickerProvider return SliverScreen( title: Text(S.of(context).logbook), slivers: [ + SliverToBoxAdapter( + child: Card( + margin: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: Dimens.paddingM), + child: SwitchListTile( + secondary: const Icon(Icons.book_outlined), + title: Text(S.of(context).saveNewPhotos), + value: LogbookPhotos.isEnabledOf(context), + onChanged: LogbookPhotosProvider.of(context).saveLogbookPhotos, + ), + ), + ), + ), _PicturesGridBuilder( - values: LogbookPhotos.of(context, listen: true), + values: LogbookPhotos.of(context), onEdit: _editProfile, ), SliverToBoxAdapter( @@ -66,7 +80,7 @@ class _PicturesGridBuilder extends StatelessWidget { ); } return SliverPadding( - padding: const EdgeInsets.symmetric(horizontal: Dimens.paddingM), + padding: const EdgeInsets.all(Dimens.paddingM), sliver: SliverGrid( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: