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 903e02a..351ac22 100644 --- a/lib/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart @@ -12,8 +12,15 @@ class LogbookPhotoEditBloc extends Bloc _onEquipmentProfileChanged(LogbookPhotoEquipmentProfileChangedEvent event, Emitter emit) async { - _newPhoto = _newPhoto.copyWith(equipmentProfileId: Optional(event.equipmentProfileId)); + final equipmentProfile = event.equipmentProfile; + Optional? apertureValue; + if (state.equipmentProfile is PinholeEquipmentProfile && + (equipmentProfile == null || equipmentProfile is EquipmentProfile)) { + apertureValue = const Optional(null); + } else if (equipmentProfile is PinholeEquipmentProfile) { + apertureValue = Optional(ApertureValue(equipmentProfile.aperture, StopType.full)); + } + _newPhoto = _newPhoto.copyWith( + apertureValue: apertureValue, + equipmentProfileId: Optional(equipmentProfile?.id), + ); emit( state.copyWith( - equipmentProfileId: Optional(event.equipmentProfileId), + aperture: apertureValue, + equipmentProfile: Optional(event.equipmentProfile), canSave: _canSave(), ), ); diff --git a/lib/screens/logbook_photo_edit/components/picker_list_tile/widget_list_tile_picker.dart b/lib/screens/logbook_photo_edit/components/picker_list_tile/widget_list_tile_picker.dart index e184b8d..41e5aa5 100644 --- a/lib/screens/logbook_photo_edit/components/picker_list_tile/widget_list_tile_picker.dart +++ b/lib/screens/logbook_photo_edit/components/picker_list_tile/widget_list_tile_picker.dart @@ -9,7 +9,7 @@ class PickerListTile extends StatelessWidget { final T? selectedValue; final List values; final String Function(T) titleAdapter; - final ValueChanged> onChanged; + final ValueChanged>? onChanged; const PickerListTile({ required this.icon, @@ -27,27 +27,29 @@ class PickerListTile extends StatelessWidget { leading: Icon(icon), title: Text(title), trailing: Text(_titleAdapter(context, selectedValue)), - onTap: () { - showDialog>( - context: context, - builder: (_) => DialogPicker>( - icon: icon, - title: title, - selectedValue: Optional(selectedValue), - values: [ - /// `const Optional(null)` for some reason is not equal to a non-const `Optional(null)` - // ignore: prefer_const_constructors - Optional(null), - ...values.toSet().map((e) => Optional(e)), - ], - titleAdapter: (context, value) => _titleAdapter(context, value.value), - ), - ).then((value) { - if (value != null) { - onChanged(value); - } - }); - }, + onTap: onChanged != null + ? () { + showDialog>( + context: context, + builder: (_) => DialogPicker>( + icon: icon, + title: title, + selectedValue: Optional(selectedValue), + values: [ + /// `const Optional(null)` for some reason is not equal to a non-const `Optional(null)` + // ignore: prefer_const_constructors + Optional(null), + ...values.toSet().map((e) => Optional(e)), + ], + titleAdapter: (context, value) => _titleAdapter(context, value.value), + ), + ).then((value) { + if (value != null) { + onChanged!(value); + } + }); + } + : null, ); } 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 918bba6..1e75f58 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 String? equipmentProfileId; + final IEquipmentProfile? equipmentProfile; - const LogbookPhotoEquipmentProfileChangedEvent(this.equipmentProfileId); + const LogbookPhotoEquipmentProfileChangedEvent(this.equipmentProfile); } class LogbookPhotoFilmChangedEvent extends LogbookPhotoEditEvent { diff --git a/lib/screens/logbook_photo_edit/flow_logbook_photo_edit.dart b/lib/screens/logbook_photo_edit/flow_logbook_photo_edit.dart index de0189b..44fd5e9 100644 --- a/lib/screens/logbook_photo_edit/flow_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/flow_logbook_photo_edit.dart @@ -1,5 +1,7 @@ +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:lightmeter/providers/equipment_profile_provider.dart'; import 'package:lightmeter/providers/logbook_photos_provider.dart'; import 'package:lightmeter/screens/logbook_photo_edit/bloc_logbook_photo_edit.dart'; import 'package:lightmeter/screens/logbook_photo_edit/screen_logbook_photo_edit.dart'; @@ -25,6 +27,7 @@ class LogbookPhotoEditFlow extends StatelessWidget { create: (_) => LogbookPhotoEditBloc( LogbookPhotosProvider.of(context), args.photo, + EquipmentProfiles.of(context).firstWhereOrNull((e) => e.id == args.photo.equipmentProfileId), ), child: const LogbookPhotoEditScreen(), ); 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 4ac775d..b86a7bf 100644 --- a/lib/screens/logbook_photo_edit/screen_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/screen_logbook_photo_edit.dart @@ -224,15 +224,17 @@ class _AperturePickerListTile extends StatelessWidget { Widget build(BuildContext context) { return BlocBuilder( buildWhen: (previous, current) => previous.aperture != current.aperture, - builder: (context, state) => PickerListTile( + builder: (context, state) => PickerListTile( icon: Icons.camera_outlined, title: S.of(context).apertureValue, values: ApertureValue.values, selectedValue: state.aperture, titleAdapter: (value) => value.toString(), - onChanged: (value) { - context.read().add(LogbookPhotoApertureChangedEvent(value.value)); - }, + onChanged: state.equipmentProfile is PinholeEquipmentProfile + ? null + : (value) { + context.read().add(LogbookPhotoApertureChangedEvent(value.value)); + }, ), ); } @@ -265,15 +267,15 @@ class _EquipmentProfilePickerListTile extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( - buildWhen: (previous, current) => previous.equipmentProfileId != current.equipmentProfileId, + buildWhen: (previous, current) => previous.equipmentProfile != current.equipmentProfile, builder: (context, state) => PickerListTile( icon: Icons.camera_alt_outlined, title: S.of(context).equipmentProfile, values: EquipmentProfiles.of(context).skip(1).toList(growable: false), - selectedValue: EquipmentProfiles.of(context).firstWhereOrNull((e) => e.id == state.equipmentProfileId), + selectedValue: state.equipmentProfile, titleAdapter: (value) => value.name, onChanged: (value) { - context.read().add(LogbookPhotoEquipmentProfileChangedEvent(value.value?.id)); + context.read().add(LogbookPhotoEquipmentProfileChangedEvent(value.value)); }, ), ); diff --git a/lib/screens/logbook_photo_edit/state_logbook_photo_edit.dart b/lib/screens/logbook_photo_edit/state_logbook_photo_edit.dart index c70f936..fbacfd3 100644 --- a/lib/screens/logbook_photo_edit/state_logbook_photo_edit.dart +++ b/lib/screens/logbook_photo_edit/state_logbook_photo_edit.dart @@ -10,7 +10,7 @@ class LogbookPhotoEditState { final Coordinates? coordinates; final ApertureValue? aperture; final ShutterSpeedValue? shutterSpeed; - final String? equipmentProfileId; + final IEquipmentProfile? equipmentProfile; final String? filmId; final String? note; final bool canSave; @@ -26,7 +26,7 @@ class LogbookPhotoEditState { this.coordinates, this.aperture, this.shutterSpeed, - this.equipmentProfileId, + this.equipmentProfile, this.filmId, this.note, required this.canSave, @@ -37,7 +37,7 @@ class LogbookPhotoEditState { String? name, Optional? aperture, Optional? shutterSpeed, - Optional? equipmentProfileId, + Optional? equipmentProfile, Optional? filmId, String? note, bool? canSave, @@ -52,7 +52,7 @@ class LogbookPhotoEditState { nd: nd, aperture: aperture != null ? aperture.value : this.aperture, shutterSpeed: shutterSpeed != null ? shutterSpeed.value : this.shutterSpeed, - equipmentProfileId: equipmentProfileId != null ? equipmentProfileId.value : this.equipmentProfileId, + equipmentProfile: equipmentProfile != null ? equipmentProfile.value : this.equipmentProfile, filmId: filmId != null ? filmId.value : this.filmId, note: note ?? this.note, canSave: canSave ?? this.canSave, diff --git a/lib/screens/settings/components/shared/dialog_picker/widget_dialog_picker.dart b/lib/screens/settings/components/shared/dialog_picker/widget_dialog_picker.dart index afcd4d3..cd29825 100644 --- a/lib/screens/settings/components/shared/dialog_picker/widget_dialog_picker.dart +++ b/lib/screens/settings/components/shared/dialog_picker/widget_dialog_picker.dart @@ -26,6 +26,7 @@ class DialogPicker extends StatefulWidget { class _DialogPickerState extends State> { late T _selected = widget.selectedValue; final ScrollController _scrollController = ScrollController(); + bool _hasSelection = false; @override void initState() { @@ -34,6 +35,7 @@ class _DialogPickerState extends State> { final selectedIndex = widget.values.indexOf(_selected); if (selectedIndex >= 0) { _scrollController.jumpTo((Dimens.grid56 * selectedIndex).clamp(0, _scrollController.position.maxScrollExtent)); + _hasSelection = true; } }); } @@ -93,7 +95,7 @@ class _DialogPickerState extends State> { child: Text(S.of(context).cancel), ), TextButton( - onPressed: () => Navigator.of(context).pop(_selected), + onPressed: _hasSelection ? () => Navigator.of(context).pop(_selected) : null, child: Text(S.of(context).select), ), ],