m3_lightmeter/lib/screens/metering/components/shared/readings_container/widget_container_readings.dart

186 lines
5.6 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/exposure_pair.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/providers/equipment_profile_provider.dart';
2023-03-21 18:22:14 +00:00
import 'package:lightmeter/res/dimens.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
import 'components/animated_dialog_picker/widget_picker_dialog_animated.dart';
import 'components/reading_value_container/widget_container_reading_value.dart';
/// Contains a column of fastest & slowest exposure pairs + a row of ISO and ND pickers
class ReadingsContainer extends StatelessWidget {
final ExposurePair? fastest;
final ExposurePair? slowest;
final List<IsoValue> isoValues;
final IsoValue iso;
final List<NdValue> ndValues;
final NdValue nd;
final ValueChanged<IsoValue> onIsoChanged;
final ValueChanged<NdValue> onNdChanged;
const ReadingsContainer({
required this.fastest,
required this.slowest,
required this.isoValues,
required this.iso,
required this.ndValues,
required this.nd,
required this.onIsoChanged,
required this.onNdChanged,
super.key,
});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
2023-03-23 20:23:26 +00:00
if (EquipmentProfiles.of(context).isNotEmpty) ...[
2023-03-21 18:22:14 +00:00
_EquipmentProfilePicker(
2023-03-23 20:23:26 +00:00
selectedValue: EquipmentProfile.of(context),
values: EquipmentProfiles.of(context),
2023-03-23 20:12:14 +00:00
onChanged: EquipmentProfileProvider.of(context).setProfile,
),
const _InnerPadding(),
],
ReadingValueContainer(
values: [
ReadingValue(
label: S.of(context).fastestExposurePair,
value: fastest != null ? fastest!.toString() : '-',
),
ReadingValue(
label: S.of(context).slowestExposurePair,
value: fastest != null ? slowest!.toString() : '-',
),
],
),
const _InnerPadding(),
Row(
children: [
Expanded(
2023-03-21 18:22:14 +00:00
child: _IsoValuePicker(
selectedValue: iso,
values: isoValues,
onChanged: onIsoChanged,
),
),
const _InnerPadding(),
Expanded(
2023-03-21 18:22:14 +00:00
child: _NdValuePicker(
selectedValue: nd,
values: ndValues,
onChanged: onNdChanged,
),
),
],
),
],
);
}
}
class _InnerPadding extends SizedBox {
const _InnerPadding() : super(height: Dimens.grid8, width: Dimens.grid8);
}
2023-03-21 18:22:14 +00:00
class _EquipmentProfilePicker extends StatelessWidget {
final List<EquipmentProfileData> values;
final EquipmentProfileData selectedValue;
final ValueChanged<EquipmentProfileData> onChanged;
const _EquipmentProfilePicker({
required this.selectedValue,
required this.values,
required this.onChanged,
});
@override
Widget build(BuildContext context) {
return AnimatedDialogPicker<EquipmentProfileData>(
title: S.of(context).equipmentProfiles,
selectedValue: selectedValue,
values: values,
2023-03-23 05:05:28 +00:00
itemTitleBuilder: (_, value) => Text(value.id.isEmpty ? S.of(context).none : value.name),
2023-03-21 18:22:14 +00:00
onChanged: onChanged,
closedChild: ReadingValueContainer.singleValue(
value: ReadingValue(
label: S.of(context).equipmentProfiles,
2023-03-23 05:05:28 +00:00
value: selectedValue.id.isEmpty ? S.of(context).none : selectedValue.name,
2023-03-21 18:22:14 +00:00
),
),
);
}
}
class _IsoValuePicker extends StatelessWidget {
final List<IsoValue> values;
final IsoValue selectedValue;
final ValueChanged<IsoValue> onChanged;
2023-03-21 18:22:14 +00:00
const _IsoValuePicker({
required this.selectedValue,
required this.values,
required this.onChanged,
});
@override
Widget build(BuildContext context) {
return AnimatedDialogPicker<IsoValue>(
title: S.of(context).iso,
subtitle: S.of(context).filmSpeed,
selectedValue: selectedValue,
values: values,
itemTitleBuilder: (_, value) => Text(value.value.toString()),
// using ascending order, because increase in film speed rises EV
itemTrailingBuilder: (selected, value) => value.value != selected.value
? Text(S.of(context).evValue(selected.toStringDifference(value)))
: null,
onChanged: onChanged,
closedChild: ReadingValueContainer.singleValue(
value: ReadingValue(
label: S.of(context).iso,
value: selectedValue.value.toString(),
),
),
);
}
}
2023-03-21 18:22:14 +00:00
class _NdValuePicker extends StatelessWidget {
final List<NdValue> values;
final NdValue selectedValue;
final ValueChanged<NdValue> onChanged;
2023-03-21 18:22:14 +00:00
const _NdValuePicker({
required this.selectedValue,
required this.values,
required this.onChanged,
});
@override
Widget build(BuildContext context) {
return AnimatedDialogPicker<NdValue>(
title: S.of(context).nd,
subtitle: S.of(context).ndFilterFactor,
selectedValue: selectedValue,
values: values,
itemTitleBuilder: (_, value) => Text(
value.value == 0 ? S.of(context).none : value.value.toString(),
),
// using descending order, because ND filter darkens image & lowers EV
itemTrailingBuilder: (selected, value) => value.value != selected.value
? Text(S.of(context).evValue(value.toStringDifference(selected)))
: null,
onChanged: onChanged,
closedChild: ReadingValueContainer.singleValue(
value: ReadingValue(
label: S.of(context).nd,
value: selectedValue.value.toString(),
),
),
);
}
}