From 488d30e28e96ba8de19f62972b96e48e5d8b2134 Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Wed, 3 Sep 2025 21:11:04 +0200 Subject: [PATCH] save nd filters for pinhole profile --- lib/providers/equipment_profile_provider.dart | 105 ++++++++++++------ .../bloc_equipment_profile_edit.dart | 12 ++ .../event_equipment_profile_edit.dart | 2 +- .../screen_equipment_profile_edit.dart | 37 +++--- .../screen_equipment_profiles.dart | 1 + .../bloc_logbook_photo_edit.dart | 4 +- .../event_logbook_photo_edit.dart | 4 +- .../screen_logbook_photo_edit.dart | 2 +- .../event_communication_metering.dart | 2 +- .../state_communication_metering.dart | 2 +- .../widget_picker_equipment_profiles.dart | 4 +- lib/screens/metering/event_metering.dart | 2 +- .../utils/listener_equipment_profiles.dart | 2 +- ...dget_list_tile_metering_screen_layout.dart | 2 +- 14 files changed, 113 insertions(+), 68 deletions(-) diff --git a/lib/providers/equipment_profile_provider.dart b/lib/providers/equipment_profile_provider.dart index f0b51e4..7cf4904 100644 --- a/lib/providers/equipment_profile_provider.dart +++ b/lib/providers/equipment_profile_provider.dart @@ -35,6 +35,7 @@ class EquipmentProfilesProvider extends StatefulWidget { class EquipmentProfilesProviderState extends State { final TogglableMap _customProfiles = {}; + final TogglableMap _pinholeCustomProfiles = {}; String _selectedId = ''; EquipmentProfile get _selectedProfile => @@ -50,6 +51,7 @@ class EquipmentProfilesProviderState extends State { Widget build(BuildContext context) { return EquipmentProfiles( profiles: context.isPro ? _customProfiles : {}, + pinholeProfiles: context.isPro ? _pinholeCustomProfiles : {}, selected: context.isPro ? _selectedProfile : EquipmentProfilesProvider.defaultProfile, child: widget.child, ); @@ -58,60 +60,90 @@ class EquipmentProfilesProviderState extends State { Future _init() async { _selectedId = widget.storageService.selectedEquipmentProfileId; _customProfiles.addAll(await widget.storageService.getEquipmentProfiles()); + _pinholeCustomProfiles.addAll(await widget.storageService.getPinholeEquipmentProfiles()); _discardSelectedIfNotIncluded(); if (mounted) setState(() {}); widget.onInitialized?.call(); } - Future addProfile(EquipmentProfile profile) async { - await widget.storageService.addEquipmentProfile(profile); - _customProfiles[profile.id] = (value: profile, isUsed: true); + Future addProfile(IEquipmentProfile profile) async { + switch (profile) { + case final PinholeEquipmentProfile profile: + await widget.storageService.addPinholeEquipmentProfile(profile); + _pinholeCustomProfiles[profile.id] = (value: profile, isUsed: true); + case final EquipmentProfile profile: + await widget.storageService.addEquipmentProfile(profile); + _customProfiles[profile.id] = (value: profile, isUsed: true); + } setState(() {}); } - Future updateProfile(EquipmentProfile profile) async { - final oldProfile = _customProfiles[profile.id]!.value; - await widget.storageService.updateEquipmentProfile( - id: profile.id, - name: oldProfile.name.changedOrNull(profile.name), - apertureValues: oldProfile.apertureValues.changedOrNull(profile.apertureValues), - shutterSpeedValues: oldProfile.shutterSpeedValues.changedOrNull(profile.shutterSpeedValues), - isoValues: oldProfile.isoValues.changedOrNull(profile.isoValues), - ndValues: oldProfile.ndValues.changedOrNull(profile.ndValues), - lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom), - exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset), - ); - _customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed); + Future updateProfile(IEquipmentProfile profile) async { + switch (profile) { + case final PinholeEquipmentProfile profile: + final oldProfile = _pinholeCustomProfiles[profile.id]!.value; + await widget.storageService.updatePinholeEquipmentProfile( + id: profile.id, + name: profile.name, + aperture: oldProfile.aperture.changedOrNull(profile.aperture), + isoValues: oldProfile.isoValues.changedOrNull(profile.isoValues), + lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom), + exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset), + ); + _pinholeCustomProfiles[profile.id] = (value: profile, isUsed: _pinholeCustomProfiles[profile.id]!.isUsed); + case final EquipmentProfile profile: + final oldProfile = _customProfiles[profile.id]!.value; + await widget.storageService.updateEquipmentProfile( + id: profile.id, + name: oldProfile.name.changedOrNull(profile.name), + apertureValues: oldProfile.apertureValues.changedOrNull(profile.apertureValues), + shutterSpeedValues: oldProfile.shutterSpeedValues.changedOrNull(profile.shutterSpeedValues), + isoValues: oldProfile.isoValues.changedOrNull(profile.isoValues), + ndValues: oldProfile.ndValues.changedOrNull(profile.ndValues), + lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom), + exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset), + ); + _customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed); + } setState(() {}); } - Future deleteProfile(EquipmentProfile profile) async { - await widget.storageService.deleteEquipmentProfile(profile.id); + Future deleteProfile(IEquipmentProfile profile) async { if (profile.id == _selectedId) { _selectedId = EquipmentProfilesProvider.defaultProfile.id; widget.storageService.selectedEquipmentProfileId = EquipmentProfilesProvider.defaultProfile.id; } - _customProfiles.remove(profile.id); + switch (profile) { + case final PinholeEquipmentProfile profile: + await widget.storageService.deletePinholeEquipmentProfile(profile.id); + _pinholeCustomProfiles.remove(profile.id); + case final EquipmentProfile profile: + await widget.storageService.deleteEquipmentProfile(profile.id); + _customProfiles.remove(profile.id); + } _discardSelectedIfNotIncluded(); setState(() {}); } - void selectProfile(EquipmentProfile data) { - if (_selectedId != data.id) { + void selectProfile(String id) { + if (_selectedId != id) { setState(() { - _selectedId = data.id; + _selectedId = id; }); widget.storageService.selectedEquipmentProfileId = _selectedProfile.id; } } - Future toggleProfile(EquipmentProfile profile, bool enabled) async { - if (_customProfiles.containsKey(profile.id)) { - _customProfiles[profile.id] = (value: profile, isUsed: enabled); + Future toggleProfile(String id, bool enabled) async { + if (_customProfiles.containsKey(id)) { + _customProfiles[id] = (value: _customProfiles[id]!.value, isUsed: enabled); + await widget.storageService.updateEquipmentProfile(id: id, isUsed: enabled); + } else if (_pinholeCustomProfiles.containsKey(id)) { + _pinholeCustomProfiles[id] = (value: _pinholeCustomProfiles[id]!.value, isUsed: enabled); + await widget.storageService.updatePinholeEquipmentProfile(id: id, isUsed: enabled); } else { return; } - await widget.storageService.updateEquipmentProfile(id: profile.id, isUsed: enabled); _discardSelectedIfNotIncluded(); setState(() {}); } @@ -120,7 +152,7 @@ class EquipmentProfilesProviderState extends State { if (_selectedId == EquipmentProfilesProvider.defaultProfile.id) { return; } - final isSelectedUsed = _customProfiles[_selectedId]?.isUsed ?? false; + final isSelectedUsed = _customProfiles[_selectedId]?.isUsed ?? _pinholeCustomProfiles[_selectedId]?.isUsed ?? false; if (!isSelectedUsed) { _selectedId = EquipmentProfilesProvider.defaultProfile.id; widget.storageService.selectedEquipmentProfileId = _selectedId; @@ -136,38 +168,42 @@ enum _EquipmentProfilesModelAspect { class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> { final TogglableMap profiles; - final EquipmentProfile selected; + final TogglableMap pinholeProfiles; + final IEquipmentProfile selected; const EquipmentProfiles({ required this.profiles, + required this.pinholeProfiles, required this.selected, required super.child, }); /// _default + profiles create by the user - static List of(BuildContext context) { + static List of(BuildContext context) { final model = InheritedModel.inheritFrom(context, aspect: _EquipmentProfilesModelAspect.profiles)!; - return List.from( + return List.from( [ EquipmentProfilesProvider.defaultProfile, ...model.profiles.values.map((p) => p.value), + ...model.pinholeProfiles.values.map((p) => p.value), ], ); } - static List inUseOf(BuildContext context) { + static List inUseOf(BuildContext context) { final model = InheritedModel.inheritFrom(context, aspect: _EquipmentProfilesModelAspect.profilesInUse)!; - return List.from( + return List.from( [ EquipmentProfilesProvider.defaultProfile, ...model.profiles.values.where((p) => p.isUsed).map((p) => p.value), + ...model.pinholeProfiles.values.where((p) => p.isUsed).map((p) => p.value), ], ); } - static EquipmentProfile selectedOf(BuildContext context) { + static IEquipmentProfile selectedOf(BuildContext context) { return InheritedModel.inheritFrom(context, aspect: _EquipmentProfilesModelAspect.selected)! .selected; } @@ -180,7 +216,8 @@ class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> { return (dependencies.contains(_EquipmentProfilesModelAspect.selected) && oldWidget.selected != selected) || ((dependencies.contains(_EquipmentProfilesModelAspect.profiles) || dependencies.contains(_EquipmentProfilesModelAspect.profilesInUse)) && - const DeepCollectionEquality().equals(oldWidget.profiles, profiles)); + (const DeepCollectionEquality().equals(oldWidget.profiles, profiles) || + const DeepCollectionEquality().equals(oldWidget.pinholeProfiles, pinholeProfiles))); } } diff --git a/lib/screens/equipment_profile_edit/bloc_equipment_profile_edit.dart b/lib/screens/equipment_profile_edit/bloc_equipment_profile_edit.dart index 9907bee..37b4594 100644 --- a/lib/screens/equipment_profile_edit/bloc_equipment_profile_edit.dart +++ b/lib/screens/equipment_profile_edit/bloc_equipment_profile_edit.dart @@ -165,6 +165,10 @@ class PinholeEquipmentProfileEditBloc extends IEquipmentProfileEditBloc _onApertureValuesChanged(EquipmentProfileApertureValuesChangedEvent event, Emitter emit) async { //emitProfile(state.profile.copyWith(apertureValues: event.apertureValues), emit); } + Future _onIsoValuesChanged(EquipmentProfileIsoValuesChangedEvent event, Emitter emit) async { + emitProfile(state.profile.copyWith(isoValues: event.isoValues), emit); + } + + Future _onNdValuesChanged(EquipmentProfileNdValuesChangedEvent event, Emitter emit) async { + emitProfile(state.profile.copyWith(ndValues: event.ndValues), emit); + } Future _onLensZoomChanged(EquipmentProfileLensZoomChangedEvent event, Emitter emit) async { emitProfile(state.profile.copyWith(lensZoom: event.lensZoom), emit); diff --git a/lib/screens/equipment_profile_edit/event_equipment_profile_edit.dart b/lib/screens/equipment_profile_edit/event_equipment_profile_edit.dart index 691b745..83fc685 100644 --- a/lib/screens/equipment_profile_edit/event_equipment_profile_edit.dart +++ b/lib/screens/equipment_profile_edit/event_equipment_profile_edit.dart @@ -16,7 +16,7 @@ class EquipmentProfileIsoValuesChangedEvent extends const EquipmentProfileIsoValuesChangedEvent(this.isoValues); } -class EquipmentProfileNdValuesChangedEvent extends IEquipmentProfileEditEvent { +class EquipmentProfileNdValuesChangedEvent extends IEquipmentProfileEditEvent { final List ndValues; const EquipmentProfileNdValuesChangedEvent(this.ndValues); diff --git a/lib/screens/equipment_profile_edit/screen_equipment_profile_edit.dart b/lib/screens/equipment_profile_edit/screen_equipment_profile_edit.dart index 1eaa252..ea4e5c7 100644 --- a/lib/screens/equipment_profile_edit/screen_equipment_profile_edit.dart +++ b/lib/screens/equipment_profile_edit/screen_equipment_profile_edit.dart @@ -103,24 +103,19 @@ class _EquipmentProfileEditScreenState extends Stat child: Opacity( opacity: state.isLoading ? Dimens.disabledOpacity : Dimens.enabledOpacity, child: Column( - children: switch (state.profile) { - EquipmentProfile() => [ - _NameFieldBuilder(), - _ApertureValuesListTileBuilder(), - _ShutterSpeedValuesListTileBuilder(), - _IsoValuesListTileBuilder(), - _NdValuesListTileBuilder(), - _LensZoomListTileBuilder(), - _ExposureOffsetListTileBuilder(), - ], - PinholeEquipmentProfile() => [ - _NameFieldBuilder(), - // TODO: Add aperture value list tile for pinhole equipment profile - _IsoValuesListTileBuilder(), - _LensZoomListTileBuilder(), - _ExposureOffsetListTileBuilder(), - ], - }, + children: [ + _NameFieldBuilder(), + if (state.profile is PinholeEquipmentProfile) + const SizedBox.shrink() + else ...[ + const _ApertureValuesListTileBuilder(), + const _ShutterSpeedValuesListTileBuilder(), + ], + _IsoValuesListTileBuilder(), + _NdValuesListTileBuilder(), + _LensZoomListTileBuilder(), + _ExposureOffsetListTileBuilder(), + ], ), ), ), @@ -185,12 +180,12 @@ class _IsoValuesListTileBuilder extends StatelessWi } } -class _NdValuesListTileBuilder extends StatelessWidget { +class _NdValuesListTileBuilder extends StatelessWidget { const _NdValuesListTileBuilder(); @override Widget build(BuildContext context) { - return BlocBuilder>( + return BlocBuilder, EquipmentProfileEditState>( builder: (context, state) => FilterListTile( icon: Icons.filter_b_and_w_outlined, title: S.of(context).ndFilters, @@ -198,7 +193,7 @@ class _NdValuesListTileBuilder extends StatelessWidget { values: NdValue.values, selectedValues: state.profile.ndValues, onChanged: (value) { - context.read().add(EquipmentProfileNdValuesChangedEvent(value)); + context.read>().add(EquipmentProfileNdValuesChangedEvent(value)); }, ), ); diff --git a/lib/screens/equipment_profiles/screen_equipment_profiles.dart b/lib/screens/equipment_profiles/screen_equipment_profiles.dart index 99e5f93..1784a41 100644 --- a/lib/screens/equipment_profiles/screen_equipment_profiles.dart +++ b/lib/screens/equipment_profiles/screen_equipment_profiles.dart @@ -76,6 +76,7 @@ class _EquipmentProfilesScreenState extends State with name: EquipmentProfilesProvider.defaultProfile.name, aperture: 22, isoValues: EquipmentProfilesProvider.defaultProfile.isoValues, + ndValues: EquipmentProfilesProvider.defaultProfile.ndValues, ), ), }, diff --git a/lib/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart b/lib/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart index 1f1a1f8..903e02a 100644 --- a/lib/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart @@ -74,10 +74,10 @@ class LogbookPhotoEditBloc extends Bloc _onEquipmentProfileChanged(LogbookPhotoEquipmentProfileChangedEvent event, Emitter emit) async { - _newPhoto = _newPhoto.copyWith(equipmentProfileId: Optional(event.equipmentProfile?.id)); + _newPhoto = _newPhoto.copyWith(equipmentProfileId: Optional(event.equipmentProfileId)); emit( state.copyWith( - equipmentProfileId: Optional(event.equipmentProfile?.id), + equipmentProfileId: Optional(event.equipmentProfileId), canSave: _canSave(), ), ); diff --git a/lib/screens/logbook_photo_edit/event_logbook_photo_edit.dart b/lib/screens/logbook_photo_edit/event_logbook_photo_edit.dart index e5c5ff8..918bba6 100644 --- a/lib/screens/logbook_photo_edit/event_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/event_logbook_photo_edit.dart @@ -23,9 +23,9 @@ class LogbookPhotoNoteChangedEvent extends LogbookPhotoEditEvent { } class LogbookPhotoEquipmentProfileChangedEvent extends LogbookPhotoEditEvent { - final EquipmentProfile? equipmentProfile; + final String? equipmentProfileId; - const LogbookPhotoEquipmentProfileChangedEvent(this.equipmentProfile); + const LogbookPhotoEquipmentProfileChangedEvent(this.equipmentProfileId); } class LogbookPhotoFilmChangedEvent extends LogbookPhotoEditEvent { diff --git a/lib/screens/logbook_photo_edit/screen_logbook_photo_edit.dart b/lib/screens/logbook_photo_edit/screen_logbook_photo_edit.dart index 13c4e56..4ac775d 100644 --- a/lib/screens/logbook_photo_edit/screen_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/screen_logbook_photo_edit.dart @@ -273,7 +273,7 @@ class _EquipmentProfilePickerListTile extends StatelessWidget { selectedValue: EquipmentProfiles.of(context).firstWhereOrNull((e) => e.id == state.equipmentProfileId), titleAdapter: (value) => value.name, onChanged: (value) { - context.read().add(LogbookPhotoEquipmentProfileChangedEvent(value.value)); + context.read().add(LogbookPhotoEquipmentProfileChangedEvent(value.value?.id)); }, ), ); diff --git a/lib/screens/metering/communication/event_communication_metering.dart b/lib/screens/metering/communication/event_communication_metering.dart index 439bb13..50242ea 100644 --- a/lib/screens/metering/communication/event_communication_metering.dart +++ b/lib/screens/metering/communication/event_communication_metering.dart @@ -19,7 +19,7 @@ class MeasureEvent extends ScreenEvent { } class EquipmentProfileChangedEvent extends ScreenEvent { - final EquipmentProfile profile; + final IEquipmentProfile profile; const EquipmentProfileChangedEvent(this.profile); } diff --git a/lib/screens/metering/communication/state_communication_metering.dart b/lib/screens/metering/communication/state_communication_metering.dart index f208a2c..b688407 100644 --- a/lib/screens/metering/communication/state_communication_metering.dart +++ b/lib/screens/metering/communication/state_communication_metering.dart @@ -21,7 +21,7 @@ class MeasureState extends SourceState { } class EquipmentProfileChangedState extends SourceState { - final EquipmentProfile profile; + final IEquipmentProfile profile; const EquipmentProfileChangedState(this.profile); } diff --git a/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart b/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart index 65a73b5..6709614 100644 --- a/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart +++ b/lib/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart @@ -10,13 +10,13 @@ class EquipmentProfilePicker extends StatelessWidget { @override Widget build(BuildContext context) { - return AnimatedDialogPicker( + return AnimatedDialogPicker( icon: Icons.camera_alt_outlined, title: S.of(context).equipmentProfile, selectedValue: EquipmentProfiles.selectedOf(context), values: EquipmentProfiles.inUseOf(context), itemTitleBuilder: (_, value) => Text(value.id.isEmpty ? S.of(context).none : value.name), - onChanged: EquipmentProfilesProvider.of(context).selectProfile, + onChanged: (profile) => EquipmentProfilesProvider.of(context).selectProfile(profile.id), closedChild: ReadingValueContainer.singleValue( value: ReadingValue( label: S.of(context).equipmentProfile, diff --git a/lib/screens/metering/event_metering.dart b/lib/screens/metering/event_metering.dart index f6f8120..de4c023 100644 --- a/lib/screens/metering/event_metering.dart +++ b/lib/screens/metering/event_metering.dart @@ -5,7 +5,7 @@ sealed class MeteringEvent { } class EquipmentProfileChangedEvent extends MeteringEvent { - final EquipmentProfile equipmentProfileData; + final IEquipmentProfile equipmentProfileData; const EquipmentProfileChangedEvent(this.equipmentProfileData); } diff --git a/lib/screens/metering/utils/listener_equipment_profiles.dart b/lib/screens/metering/utils/listener_equipment_profiles.dart index ec604ce..6e4cc29 100644 --- a/lib/screens/metering/utils/listener_equipment_profiles.dart +++ b/lib/screens/metering/utils/listener_equipment_profiles.dart @@ -3,7 +3,7 @@ import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileListener extends StatefulWidget { - final ValueChanged onDidChangeDependencies; + final ValueChanged onDidChangeDependencies; final Widget child; const EquipmentProfileListener({ diff --git a/lib/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart b/lib/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart index 0898541..05f37a2 100644 --- a/lib/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart +++ b/lib/screens/settings/components/metering/components/metering_screen_layout/widget_list_tile_metering_screen_layout.dart @@ -34,7 +34,7 @@ class MeteringScreenLayoutListTile extends StatelessWidget { .toList(growable: false), onSave: (value) { if (!value[MeteringScreenLayoutFeature.equipmentProfiles]!) { - EquipmentProfilesProvider.of(context).selectProfile(EquipmentProfiles.of(context).first); + EquipmentProfilesProvider.of(context).selectProfile(EquipmentProfiles.of(context).first.id); } if (!value[MeteringScreenLayoutFeature.filmPicker]!) { FilmsProvider.of(context).selectFilm(const FilmStub());