mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-21 15:00:40 +00:00
Compare commits
3 commits
f6a0fc2f52
...
7633f3fd27
Author | SHA1 | Date | |
---|---|---|---|
|
7633f3fd27 | ||
|
b42ad01b7c | ||
|
93d8d46bf0 |
5 changed files with 85 additions and 37 deletions
|
@ -1,11 +1,17 @@
|
|||
enum MeteringScreenLayoutFeature { equipmentProfiles, extremeExposurePairs, filmPicker }
|
||||
enum MeteringScreenLayoutFeature {
|
||||
extremeExposurePairs,
|
||||
filmPicker,
|
||||
equipmentProfiles,
|
||||
}
|
||||
|
||||
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),
|
||||
);
|
||||
static MeteringScreenLayoutConfig fromJson(Map<String, dynamic> data) =>
|
||||
<MeteringScreenLayoutFeature, bool>{
|
||||
for (final f in MeteringScreenLayoutFeature.values)
|
||||
f: data[f.index.toString()] as bool? ?? true
|
||||
};
|
||||
|
||||
Map<String, dynamic> toJson() => map((key, value) => MapEntry(key.index.toString(), value));
|
||||
}
|
||||
|
|
|
@ -77,11 +77,21 @@ class _InheritedListeners extends StatelessWidget {
|
|||
context.read<MeteringBloc>().add(EquipmentProfileChangedEvent(value));
|
||||
},
|
||||
child: InheritedModelAspectListener<MeteringScreenLayoutFeature, bool>(
|
||||
aspect: MeteringScreenLayoutFeature.filmPicker,
|
||||
aspect: MeteringScreenLayoutFeature.equipmentProfiles,
|
||||
onDidChangeDependencies: (value) {
|
||||
if (!value) context.read<MeteringBloc>().add(const FilmChangedEvent(Film.other()));
|
||||
if (!value) {
|
||||
EquipmentProfileProvider.of(context).setProfile(context.get<EquipmentProfiles>().first);
|
||||
}
|
||||
},
|
||||
child: child,
|
||||
child: InheritedModelAspectListener<MeteringScreenLayoutFeature, bool>(
|
||||
aspect: MeteringScreenLayoutFeature.filmPicker,
|
||||
onDidChangeDependencies: (value) {
|
||||
if (!value) {
|
||||
context.read<MeteringBloc>().add(const FilmChangedEvent(Film.other()));
|
||||
}
|
||||
},
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -33,18 +33,9 @@ class _MeteringScreenLayoutFeaturesDialogState extends State<MeteringScreenLayou
|
|||
child: Text(S.of(context).meteringScreenLayoutHint),
|
||||
),
|
||||
const SizedBox(height: Dimens.grid16),
|
||||
...MeteringScreenLayoutFeature.values.map(
|
||||
(f) => SwitchListTile(
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: Dimens.dialogTitlePadding.left),
|
||||
title: Text(_toStringLocalized(context, f)),
|
||||
value: _features[f]!,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_features.update(f, (_) => value);
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
_featureListTile(MeteringScreenLayoutFeature.equipmentProfiles),
|
||||
_featureListTile(MeteringScreenLayoutFeature.extremeExposurePairs),
|
||||
_featureListTile(MeteringScreenLayoutFeature.filmPicker),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
@ -65,6 +56,19 @@ class _MeteringScreenLayoutFeaturesDialogState extends State<MeteringScreenLayou
|
|||
);
|
||||
}
|
||||
|
||||
Widget _featureListTile(MeteringScreenLayoutFeature f) {
|
||||
return SwitchListTile(
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: Dimens.dialogTitlePadding.left),
|
||||
title: Text(_toStringLocalized(context, f)),
|
||||
value: _features[f]!,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
_features.update(f, (_) => value);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
String _toStringLocalized(BuildContext context, MeteringScreenLayoutFeature feature) {
|
||||
switch (feature) {
|
||||
case MeteringScreenLayoutFeature.equipmentProfiles:
|
||||
|
|
|
@ -2,30 +2,56 @@ import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
|
|||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('fromJson', () {
|
||||
expect(
|
||||
MeteringScreenLayoutConfigJson.fromJson({'0': true, '1': true}),
|
||||
{
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
},
|
||||
);
|
||||
expect(
|
||||
MeteringScreenLayoutConfigJson.fromJson({'0': false, '1': false}),
|
||||
{
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: false,
|
||||
MeteringScreenLayoutFeature.filmPicker: false,
|
||||
},
|
||||
);
|
||||
});
|
||||
group(
|
||||
'fromJson()',
|
||||
() {
|
||||
test('All keys', () {
|
||||
expect(
|
||||
MeteringScreenLayoutConfigJson.fromJson(
|
||||
{
|
||||
'0': true,
|
||||
'1': true,
|
||||
'2': true,
|
||||
},
|
||||
),
|
||||
{
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
MeteringScreenLayoutFeature.equipmentProfiles: true,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('toJson', () {
|
||||
test('Legacy (no equipment profiles)', () {
|
||||
expect(
|
||||
MeteringScreenLayoutConfigJson.fromJson(
|
||||
{
|
||||
'0': true,
|
||||
'1': true,
|
||||
},
|
||||
),
|
||||
{
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
MeteringScreenLayoutFeature.equipmentProfiles: true,
|
||||
},
|
||||
);
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
test('toJson()', () {
|
||||
expect(
|
||||
{
|
||||
MeteringScreenLayoutFeature.equipmentProfiles: true,
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
}.toJson(),
|
||||
{'0': true, '1': true},
|
||||
{
|
||||
'2': true,
|
||||
'0': true,
|
||||
'1': true,
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -193,6 +193,7 @@ void main() {
|
|||
{
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: true,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
MeteringScreenLayoutFeature.equipmentProfiles: true,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
@ -206,6 +207,7 @@ void main() {
|
|||
{
|
||||
MeteringScreenLayoutFeature.extremeExposurePairs: false,
|
||||
MeteringScreenLayoutFeature.filmPicker: true,
|
||||
MeteringScreenLayoutFeature.equipmentProfiles: true,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue