From 7dc3f22c66b9b2ca317c2f97bea7a9ad4e40d0c7 Mon Sep 17 00:00:00 2001 From: Vadim Date: Sun, 13 Aug 2023 21:14:12 +0200 Subject: [PATCH] Moved `MeteringScreenLayoutProvider` functionality to `UserPreferencesProvider` --- lib/providers.dart | 11 +-- .../metering_screen_layout_provider.dart | 60 ------------ lib/providers/user_preferences_provider.dart | 93 +++++++++++++++---- .../camera_preview/widget_camera_preview.dart | 4 +- .../widget_container_camera.dart | 6 +- .../widget_container_readings.dart | 6 +- lib/screens/metering/screen_metering.dart | 2 +- ...ialog_metering_screen_layout_features.dart | 6 +- 8 files changed, 90 insertions(+), 98 deletions(-) delete mode 100644 lib/providers/metering_screen_layout_provider.dart diff --git a/lib/providers.dart b/lib/providers.dart index 51c551d..ff957ae 100644 --- a/lib/providers.dart +++ b/lib/providers.dart @@ -6,10 +6,9 @@ import 'package:lightmeter/data/permissions_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/data/volume_events_service.dart'; import 'package:lightmeter/environment.dart'; -import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; import 'package:lightmeter/providers/service_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:platform/platform.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -37,11 +36,9 @@ class LightmeterProviders extends StatelessWidget { userPreferencesService: UserPreferencesService(snapshot.data![0] as SharedPreferences), volumeEventsService: const VolumeEventsService(LocalPlatform()), child: UserPreferencesProvider( - child: MeteringScreenLayoutProvider( - child: EquipmentProfileProvider( - child: Builder( - builder: (context) => builder(context, true), - ), + child: EquipmentProfileProvider( + child: Builder( + builder: (context) => builder(context, true), ), ), ), diff --git a/lib/providers/metering_screen_layout_provider.dart b/lib/providers/metering_screen_layout_provider.dart deleted file mode 100644 index 2f24bc5..0000000 --- a/lib/providers/metering_screen_layout_provider.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/providers/service_provider.dart'; -import 'package:lightmeter/utils/inherited_generics.dart'; - -class MeteringScreenLayoutProvider extends StatefulWidget { - final Widget child; - - const MeteringScreenLayoutProvider({required this.child, super.key}); - - static MeteringScreenLayoutProviderState of(BuildContext context) { - return context.findAncestorStateOfType()!; - } - - @override - State createState() => MeteringScreenLayoutProviderState(); -} - -class MeteringScreenLayoutProviderState extends State { - late final MeteringScreenLayoutConfig _config = - ServiceProvider.userPreferencesServiceOf(context).meteringScreenLayout; - - @override - Widget build(BuildContext context) { - return InheritedModelBase( - data: MeteringScreenLayoutConfig.from(_config), - child: widget.child, - ); - } - - void updateFeatures(MeteringScreenLayoutConfig config) { - setState(() { - config.forEach((key, value) { - _config.update( - key, - (_) => value, - ifAbsent: () => value, - ); - }); - }); - ServiceProvider.userPreferencesServiceOf(context).meteringScreenLayout = _config; - } -} - -typedef _MeteringScreenLayoutModel = InheritedModelBase; - -extension MeteringScreenLayout on InheritedModelBase { - static MeteringScreenLayoutConfig of(BuildContext context, {bool listen = true}) { - if (listen) { - return context.dependOnInheritedWidgetOfExactType<_MeteringScreenLayoutModel>()!.data; - } else { - return context.findAncestorWidgetOfExactType<_MeteringScreenLayoutModel>()!.data; - } - } - - static bool featureOf(BuildContext context, MeteringScreenLayoutFeature aspect) { - return InheritedModel.inheritFrom<_MeteringScreenLayoutModel>(context, aspect: aspect)! - .data[aspect]!; - } -} diff --git a/lib/providers/user_preferences_provider.dart b/lib/providers/user_preferences_provider.dart index f9d847f..65f54a8 100644 --- a/lib/providers/user_preferences_provider.dart +++ b/lib/providers/user_preferences_provider.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:lightmeter/data/models/dynamic_colors_state.dart'; import 'package:lightmeter/data/models/ev_source_type.dart'; +import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/supported_locale.dart'; import 'package:lightmeter/data/models/theme_type.dart'; import 'package:lightmeter/data/shared_prefs_service.dart'; @@ -10,16 +11,6 @@ import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/service_provider.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; -enum _ListenableAspect { - brightness, - dynamicColorState, - evSourceType, - locale, - primaryColor, - stopType, - themeType, -} - class UserPreferencesProvider extends StatefulWidget { final Widget child; @@ -45,6 +36,15 @@ class UserPreferencesProvider extends StatefulWidget { return _inheritFrom(context, _ListenableAspect.locale).locale; } + static MeteringScreenLayoutConfig meteringScreenConfigOf(BuildContext context) { + return context.findAncestorWidgetOfExactType<_MeteringScreenLayoutModel>()!.data; + } + + static bool meteringScreenFeatureOf(BuildContext context, MeteringScreenLayoutFeature feature) { + return InheritedModel.inheritFrom<_MeteringScreenLayoutModel>(context, aspect: feature)! + .data[feature]!; + } + static Color primaryColorOf(BuildContext context) { return _inheritFrom(context, _ListenableAspect.primaryColor).primaryColor; } @@ -57,9 +57,11 @@ class UserPreferencesProvider extends StatefulWidget { return _inheritFrom(context, _ListenableAspect.themeType).themeType; } - static _UserPreferencesProviderModel _inheritFrom( - BuildContext context, _ListenableAspect aspect) { - return InheritedModel.inheritFrom<_UserPreferencesProviderModel>(context, aspect: aspect)!; + static _EnumsModel _inheritFrom( + BuildContext context, + _ListenableAspect aspect, + ) { + return InheritedModel.inheritFrom<_EnumsModel>(context, aspect: aspect)!; } @override @@ -73,6 +75,8 @@ class _UserPreferencesProviderState extends State late bool dynamicColor = userPreferencesService.dynamicColor; late EvSourceType evSourceType; + late final MeteringScreenLayoutConfig meteringScreenLayout = + ServiceProvider.userPreferencesServiceOf(context).meteringScreenLayout; late Color primaryColor = userPreferencesService.primaryColor; late StopType stopType = userPreferencesService.stopType; late SupportedLocale locale = userPreferencesService.locale; @@ -120,7 +124,7 @@ class _UserPreferencesProviderState extends State dynamicPrimaryColor = null; state = DynamicColorState.unavailable; } - return _UserPreferencesProviderModel( + return _EnumsModel( brightness: _themeBrightness, dynamicColorState: state, evSourceType: evSourceType, @@ -128,7 +132,10 @@ class _UserPreferencesProviderState extends State primaryColor: dynamicPrimaryColor ?? primaryColor, stopType: stopType, themeType: themeType, - child: widget.child, + child: _MeteringScreenLayoutModel( + data: meteringScreenLayout, + child: widget.child, + ), ); }, ); @@ -165,6 +172,19 @@ class _UserPreferencesProviderState extends State }); } + void setMeteringScreenLayout(MeteringScreenLayoutConfig config) { + setState(() { + config.forEach((key, value) { + meteringScreenLayout.update( + key, + (_) => value, + ifAbsent: () => value, + ); + }); + }); + ServiceProvider.userPreferencesServiceOf(context).meteringScreenLayout = meteringScreenLayout; + } + void setPrimaryColor(Color primaryColor) { setState(() { this.primaryColor = primaryColor; @@ -198,7 +218,17 @@ class _UserPreferencesProviderState extends State } } -class _UserPreferencesProviderModel extends InheritedModel<_ListenableAspect> { +enum _ListenableAspect { + brightness, + dynamicColorState, + evSourceType, + locale, + primaryColor, + stopType, + themeType, +} + +class _EnumsModel extends InheritedModel<_ListenableAspect> { final Brightness brightness; final DynamicColorState dynamicColorState; final EvSourceType evSourceType; @@ -207,7 +237,7 @@ class _UserPreferencesProviderModel extends InheritedModel<_ListenableAspect> { final StopType stopType; final ThemeType themeType; - const _UserPreferencesProviderModel({ + const _EnumsModel({ required this.brightness, required this.dynamicColorState, required this.evSourceType, @@ -219,7 +249,7 @@ class _UserPreferencesProviderModel extends InheritedModel<_ListenableAspect> { }); @override - bool updateShouldNotify(_UserPreferencesProviderModel oldWidget) { + bool updateShouldNotify(_EnumsModel oldWidget) { return brightness != oldWidget.brightness || dynamicColorState != oldWidget.dynamicColorState || evSourceType != oldWidget.evSourceType || @@ -231,7 +261,7 @@ class _UserPreferencesProviderModel extends InheritedModel<_ListenableAspect> { @override bool updateShouldNotifyDependent( - _UserPreferencesProviderModel oldWidget, + _EnumsModel oldWidget, Set<_ListenableAspect> dependencies, ) { return (brightness != oldWidget.brightness && @@ -247,3 +277,28 @@ class _UserPreferencesProviderModel extends InheritedModel<_ListenableAspect> { (themeType != oldWidget.themeType && dependencies.contains(_ListenableAspect.themeType)); } } + +class _MeteringScreenLayoutModel extends InheritedModel { + final Map data; + + const _MeteringScreenLayoutModel({ + required this.data, + required super.child, + }); + + @override + bool updateShouldNotify(_MeteringScreenLayoutModel oldWidget) => oldWidget.data != data; + + @override + bool updateShouldNotifyDependent( + _MeteringScreenLayoutModel oldWidget, + Set dependencies, + ) { + for (final dependecy in dependencies) { + if (oldWidget.data[dependecy] != data[dependecy]) { + return true; + } + } + return false; + } +} diff --git a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart index 288c678..ecfcb42 100644 --- a/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart +++ b/lib/screens/metering/components/camera_container/components/camera_preview/widget_camera_preview.dart @@ -2,7 +2,7 @@ import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/platform_config.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/camera_view/widget_camera_view.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_preview/components/camera_view_placeholder/widget_placeholder_camera_view.dart'; @@ -38,7 +38,7 @@ class _CameraPreviewState extends State { alignment: Alignment.bottomCenter, children: [ CameraView(controller: widget.controller!), - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.histogram, )) diff --git a/lib/screens/metering/components/camera_container/widget_container_camera.dart b/lib/screens/metering/components/camera_container/widget_container_camera.dart index e42991c..c510bc8 100644 --- a/lib/screens/metering/components/camera_container/widget_container_camera.dart +++ b/lib/screens/metering/components/camera_container/widget_container_camera.dart @@ -7,7 +7,7 @@ import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/features.dart'; import 'package:lightmeter/platform_config.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/camera_container/bloc_container_camera.dart'; import 'package:lightmeter/screens/metering/components/camera_container/components/camera_controls/widget_camera_controls.dart'; @@ -114,14 +114,14 @@ class CameraContainer extends StatelessWidget { enabledFeaturesHeight += Dimens.readingContainerSingleValueHeight; enabledFeaturesHeight += Dimens.paddingS; } - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.extremeExposurePairs, )) { enabledFeaturesHeight += Dimens.readingContainerDoubleValueHeight; enabledFeaturesHeight += Dimens.paddingS; } - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.filmPicker, )) { diff --git a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart index 0893305..efa6c30 100644 --- a/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart +++ b/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart @@ -5,7 +5,7 @@ import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/features.dart'; import 'package:lightmeter/generated/l10n.dart'; import 'package:lightmeter/providers/equipment_profile_provider.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/animated_dialog_picker/widget_picker_dialog_animated.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/reading_value_container/widget_container_reading_value.dart'; @@ -43,7 +43,7 @@ class ReadingsContainer extends StatelessWidget { const _EquipmentProfilePicker(), const _InnerPadding(), ], - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.extremeExposurePairs, )) ...[ @@ -61,7 +61,7 @@ class ReadingsContainer extends StatelessWidget { ), const _InnerPadding(), ], - if (MeteringScreenLayout.featureOf( + if (UserPreferencesProvider.meteringScreenFeatureOf( context, MeteringScreenLayoutFeature.filmPicker, )) ...[ diff --git a/lib/screens/metering/screen_metering.dart b/lib/screens/metering/screen_metering.dart index 0520551..ae7ac13 100644 --- a/lib/screens/metering/screen_metering.dart +++ b/lib/screens/metering/screen_metering.dart @@ -6,8 +6,8 @@ import 'package:lightmeter/data/models/ev_source_type.dart'; import 'package:lightmeter/data/models/exposure_pair.dart'; import 'package:lightmeter/data/models/film.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; -import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/providers/service_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/screens/metering/bloc_metering.dart'; import 'package:lightmeter/screens/metering/components/bottom_controls/provider_bottom_controls.dart'; import 'package:lightmeter/screens/metering/components/camera_container/provider_container_camera.dart'; diff --git a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart index d43f011..c60abab 100644 --- a/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart +++ b/lib/screens/settings/components/metering/components/metering_screen_layout/components/meterins_screen_layout_features_dialog/widget_dialog_metering_screen_layout_features.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/generated/l10n.dart'; -import 'package:lightmeter/providers/metering_screen_layout_provider.dart'; +import 'package:lightmeter/providers/user_preferences_provider.dart'; import 'package:lightmeter/res/dimens.dart'; class MeteringScreenLayoutFeaturesDialog extends StatefulWidget { @@ -14,7 +14,7 @@ class MeteringScreenLayoutFeaturesDialog extends StatefulWidget { class _MeteringScreenLayoutFeaturesDialogState extends State { late final _features = - MeteringScreenLayoutConfig.from(MeteringScreenLayout.of(context, listen: false)); + MeteringScreenLayoutConfig.from(UserPreferencesProvider.meteringScreenConfigOf(context)); @override Widget build(BuildContext context) { @@ -56,7 +56,7 @@ class _MeteringScreenLayoutFeaturesDialogState extends State