mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2025-03-12 05:10:41 +00:00
Moved MeteringScreenLayoutProvider
functionality to UserPreferencesProvider
This commit is contained in:
parent
a8aabcc5b8
commit
7dc3f22c66
8 changed files with 90 additions and 98 deletions
|
@ -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),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -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<MeteringScreenLayoutProviderState>()!;
|
||||
}
|
||||
|
||||
@override
|
||||
State<MeteringScreenLayoutProvider> createState() => MeteringScreenLayoutProviderState();
|
||||
}
|
||||
|
||||
class MeteringScreenLayoutProviderState extends State<MeteringScreenLayoutProvider> {
|
||||
late final MeteringScreenLayoutConfig _config =
|
||||
ServiceProvider.userPreferencesServiceOf(context).meteringScreenLayout;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InheritedModelBase<MeteringScreenLayoutFeature, bool>(
|
||||
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<MeteringScreenLayoutFeature, bool>;
|
||||
|
||||
extension MeteringScreenLayout on InheritedModelBase<MeteringScreenLayoutFeature, bool> {
|
||||
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]!;
|
||||
}
|
||||
}
|
|
@ -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<UserPreferencesProvider>
|
|||
|
||||
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<UserPreferencesProvider>
|
|||
dynamicPrimaryColor = null;
|
||||
state = DynamicColorState.unavailable;
|
||||
}
|
||||
return _UserPreferencesProviderModel(
|
||||
return _EnumsModel(
|
||||
brightness: _themeBrightness,
|
||||
dynamicColorState: state,
|
||||
evSourceType: evSourceType,
|
||||
|
@ -128,7 +132,10 @@ class _UserPreferencesProviderState extends State<UserPreferencesProvider>
|
|||
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<UserPreferencesProvider>
|
|||
});
|
||||
}
|
||||
|
||||
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<UserPreferencesProvider>
|
|||
}
|
||||
}
|
||||
|
||||
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<MeteringScreenLayoutFeature> {
|
||||
final Map<MeteringScreenLayoutFeature, bool> data;
|
||||
|
||||
const _MeteringScreenLayoutModel({
|
||||
required this.data,
|
||||
required super.child,
|
||||
});
|
||||
|
||||
@override
|
||||
bool updateShouldNotify(_MeteringScreenLayoutModel oldWidget) => oldWidget.data != data;
|
||||
|
||||
@override
|
||||
bool updateShouldNotifyDependent(
|
||||
_MeteringScreenLayoutModel oldWidget,
|
||||
Set<MeteringScreenLayoutFeature> dependencies,
|
||||
) {
|
||||
for (final dependecy in dependencies) {
|
||||
if (oldWidget.data[dependecy] != data[dependecy]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<CameraPreview> {
|
|||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
CameraView(controller: widget.controller!),
|
||||
if (MeteringScreenLayout.featureOf(
|
||||
if (UserPreferencesProvider.meteringScreenFeatureOf(
|
||||
context,
|
||||
MeteringScreenLayoutFeature.histogram,
|
||||
))
|
||||
|
|
|
@ -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,
|
||||
)) {
|
||||
|
|
|
@ -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,
|
||||
)) ...[
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<MeteringScreenLayoutFeaturesDialog> {
|
||||
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<MeteringScreenLayou
|
|||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
MeteringScreenLayoutProvider.of(context).updateFeatures(_features);
|
||||
UserPreferencesProvider.of(context).setMeteringScreenLayout(_features);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: Text(S.of(context).save),
|
||||
|
|
Loading…
Reference in a new issue