mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-21 23:10:40 +00:00
save & restore MeteringScreenLayoutConfig
This commit is contained in:
parent
a875a9c8a8
commit
82a6d70a7c
7 changed files with 53 additions and 22 deletions
|
@ -18,7 +18,7 @@ import 'environment.dart';
|
|||
import 'generated/l10n.dart';
|
||||
import 'providers/equipment_profile_provider.dart';
|
||||
import 'providers/ev_source_type_provider.dart';
|
||||
import 'providers/features_provider.dart';
|
||||
import 'providers/metering_screen_layout_provider.dart';
|
||||
import 'providers/theme_provider.dart';
|
||||
import 'screens/metering/flow_metering.dart';
|
||||
import 'screens/settings/flow_settings.dart';
|
||||
|
|
10
lib/data/models/metering_screen_layout_config.dart
Normal file
10
lib/data/models/metering_screen_layout_config.dart
Normal file
|
@ -0,0 +1,10 @@
|
|||
enum MeteringScreenLayoutFeature { extremeExposurePairs, filmPicker }
|
||||
|
||||
typedef MeteringScreenLayoutConfig = Map<MeteringScreenLayoutFeature, bool>;
|
||||
|
||||
extension MeteringScreenLayoutConfigJson on MeteringScreenLayoutConfig {
|
||||
static MeteringScreenLayoutConfig fromJson(Map<String, dynamic> data) => data.map(
|
||||
(key, value) => MapEntry(MeteringScreenLayoutFeature.values[int.parse(key)], value as bool));
|
||||
|
||||
Map<String, dynamic> toJson() => map((key, value) => MapEntry(key.index.toString(), value));
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:lightmeter/data/models/supported_locale.dart';
|
||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||
|
@ -5,6 +7,7 @@ import 'package:shared_preferences/shared_preferences.dart';
|
|||
|
||||
import 'models/ev_source_type.dart';
|
||||
import 'models/film.dart';
|
||||
import 'models/metering_screen_layout_config.dart';
|
||||
import 'models/theme_type.dart';
|
||||
|
||||
class UserPreferencesService {
|
||||
|
@ -14,6 +17,7 @@ class UserPreferencesService {
|
|||
static const _evSourceTypeKey = "evSourceType";
|
||||
static const _cameraEvCalibrationKey = "cameraEvCalibration";
|
||||
static const _lightSensorEvCalibrationKey = "lightSensorEvCalibration";
|
||||
static const _meteringScreenLayoutKey = "meteringScreenLayout";
|
||||
static const _filmKey = "film";
|
||||
|
||||
static const _caffeineKey = "caffeine";
|
||||
|
@ -80,6 +84,20 @@ class UserPreferencesService {
|
|||
bool get caffeine => _sharedPreferences.getBool(_caffeineKey) ?? false;
|
||||
set caffeine(bool value) => _sharedPreferences.setBool(_caffeineKey, value);
|
||||
|
||||
MeteringScreenLayoutConfig get meteringScreenLayout {
|
||||
final configJson = _sharedPreferences.getString(_meteringScreenLayoutKey);
|
||||
if (configJson != null) {
|
||||
return MeteringScreenLayoutConfigJson.fromJson(json.decode(configJson));
|
||||
} else {
|
||||
return {
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
};
|
||||
}
|
||||
}
|
||||
set meteringScreenLayout(MeteringScreenLayoutConfig value) =>
|
||||
_sharedPreferences.setString(_meteringScreenLayoutKey, json.encode(value.toJson()));
|
||||
|
||||
bool get haptics => _sharedPreferences.getBool(_hapticsKey) ?? true;
|
||||
set haptics(bool value) => _sharedPreferences.setBool(_hapticsKey, value);
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
enum MeteringScreenLayoutFeature { extremeExposurePairs, filmPicker }
|
||||
import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
|
||||
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class MeteringScreenLayoutProvider extends StatefulWidget {
|
||||
final Widget child;
|
||||
|
@ -16,52 +17,51 @@ class MeteringScreenLayoutProvider extends StatefulWidget {
|
|||
}
|
||||
|
||||
class MeteringScreenLayoutProviderState extends State<MeteringScreenLayoutProvider> {
|
||||
final Map<MeteringScreenLayoutFeature, bool> _features = {
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
};
|
||||
late final MeteringScreenLayoutConfig _config =
|
||||
context.read<UserPreferencesService>().meteringScreenLayout;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MeteringScreenLayout(
|
||||
features: Map<MeteringScreenLayoutFeature, bool>.from(_features),
|
||||
config: MeteringScreenLayoutConfig.from(_config),
|
||||
child: widget.child,
|
||||
);
|
||||
}
|
||||
|
||||
void updateFeatures(Map<MeteringScreenLayoutFeature, bool> features) {
|
||||
void updateFeatures(MeteringScreenLayoutConfig config) {
|
||||
setState(() {
|
||||
features.forEach((key, value) {
|
||||
_features.update(
|
||||
config.forEach((key, value) {
|
||||
_config.update(
|
||||
key,
|
||||
(_) => value,
|
||||
ifAbsent: () => value,
|
||||
);
|
||||
});
|
||||
});
|
||||
context.read<UserPreferencesService>().meteringScreenLayout = _config;
|
||||
}
|
||||
}
|
||||
|
||||
class MeteringScreenLayout extends InheritedModel<MeteringScreenLayoutFeature> {
|
||||
final Map<MeteringScreenLayoutFeature, bool> features;
|
||||
final MeteringScreenLayoutConfig config;
|
||||
|
||||
const MeteringScreenLayout({
|
||||
required this.features,
|
||||
required this.config,
|
||||
required super.child,
|
||||
super.key,
|
||||
});
|
||||
|
||||
static Map<MeteringScreenLayoutFeature, bool> of(BuildContext context, {bool listen = true}) {
|
||||
static MeteringScreenLayoutConfig of(BuildContext context, {bool listen = true}) {
|
||||
if (listen) {
|
||||
return context.dependOnInheritedWidgetOfExactType<MeteringScreenLayout>()!.features;
|
||||
return context.dependOnInheritedWidgetOfExactType<MeteringScreenLayout>()!.config;
|
||||
} else {
|
||||
return context.findAncestorWidgetOfExactType<MeteringScreenLayout>()!.features;
|
||||
return context.findAncestorWidgetOfExactType<MeteringScreenLayout>()!.config;
|
||||
}
|
||||
}
|
||||
|
||||
static bool featureStatusOf(BuildContext context, MeteringScreenLayoutFeature feature) {
|
||||
return InheritedModel.inheritFrom<MeteringScreenLayout>(context, aspect: feature)!
|
||||
.features[feature]!;
|
||||
.config[feature]!;
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -73,7 +73,7 @@ class MeteringScreenLayout extends InheritedModel<MeteringScreenLayoutFeature> {
|
|||
Set<MeteringScreenLayoutFeature> dependencies,
|
||||
) {
|
||||
for (final dependecy in dependencies) {
|
||||
if (oldWidget.features[dependecy] != features[dependecy]) {
|
||||
if (oldWidget.config[dependecy] != config[dependecy]) {
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -2,9 +2,10 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_bloc/flutter_bloc.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/features.dart';
|
||||
import 'package:lightmeter/platform_config.dart';
|
||||
import 'package:lightmeter/providers/features_provider.dart';
|
||||
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
||||
import 'package:lightmeter/res/dimens.dart';
|
||||
import 'package:lightmeter/screens/metering/components/camera_container/components/camera_view/widget_camera_view.dart';
|
||||
import 'package:lightmeter/screens/metering/components/camera_container/models/camera_error_type.dart';
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
import 'package:flutter/material.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/features.dart';
|
||||
import 'package:lightmeter/generated/l10n.dart';
|
||||
import 'package:lightmeter/providers/equipment_profile_provider.dart';
|
||||
import 'package:lightmeter/providers/features_provider.dart';
|
||||
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
||||
import 'package:lightmeter/res/dimens.dart';
|
||||
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
|
||||
|
||||
|
|
|
@ -1,6 +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/features_provider.dart';
|
||||
import 'package:lightmeter/providers/metering_screen_layout_provider.dart';
|
||||
import 'package:lightmeter/res/dimens.dart';
|
||||
|
||||
class MeteringScreenLayoutFeaturesDialog extends StatefulWidget {
|
||||
|
@ -13,7 +14,7 @@ class MeteringScreenLayoutFeaturesDialog extends StatefulWidget {
|
|||
|
||||
class _MeteringScreenLayoutFeaturesDialogState extends State<MeteringScreenLayoutFeaturesDialog> {
|
||||
late final _features =
|
||||
Map<MeteringScreenLayoutFeature, bool>.from(MeteringScreenLayout.of(context, listen: false));
|
||||
MeteringScreenLayoutConfig.from(MeteringScreenLayout.of(context, listen: false));
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
Loading…
Reference in a new issue