sort profiles alphabetically

This commit is contained in:
Vadim 2025-09-04 20:32:11 +02:00
parent 2fcda9bf24
commit 88702942d3

View file

@ -34,14 +34,10 @@ class EquipmentProfilesProvider extends StatefulWidget {
} }
class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> { class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
final TogglableMap<EquipmentProfile> _customProfiles = {}; final TogglableMap<IEquipmentProfile> _profiles = {};
final TogglableMap<PinholeEquipmentProfile> _pinholeCustomProfiles = {};
String _selectedId = ''; String _selectedId = '';
IEquipmentProfile get _selectedProfile => IEquipmentProfile get _selectedProfile => _profiles[_selectedId]?.value ?? EquipmentProfilesProvider.defaultProfile;
_customProfiles[_selectedId]?.value ??
_pinholeCustomProfiles[_selectedId]?.value ??
EquipmentProfilesProvider.defaultProfile;
@override @override
void initState() { void initState() {
@ -52,8 +48,7 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return EquipmentProfiles( return EquipmentProfiles(
profiles: context.isPro ? _customProfiles : {}, profiles: context.isPro ? _profiles : {},
pinholeProfiles: context.isPro ? _pinholeCustomProfiles : {},
selected: context.isPro ? _selectedProfile : EquipmentProfilesProvider.defaultProfile, selected: context.isPro ? _selectedProfile : EquipmentProfilesProvider.defaultProfile,
child: widget.child, child: widget.child,
); );
@ -61,8 +56,10 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
Future<void> _init() async { Future<void> _init() async {
_selectedId = widget.storageService.selectedEquipmentProfileId; _selectedId = widget.storageService.selectedEquipmentProfileId;
_customProfiles.addAll(await widget.storageService.getEquipmentProfiles()); _profiles
_pinholeCustomProfiles.addAll(await widget.storageService.getPinholeEquipmentProfiles()); ..addAll(await widget.storageService.getEquipmentProfiles())
..addAll(await widget.storageService.getPinholeEquipmentProfiles());
_sortProfiles();
_discardSelectedIfNotIncluded(); _discardSelectedIfNotIncluded();
if (mounted) setState(() {}); if (mounted) setState(() {});
widget.onInitialized?.call(); widget.onInitialized?.call();
@ -72,18 +69,18 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
switch (profile) { switch (profile) {
case final PinholeEquipmentProfile profile: case final PinholeEquipmentProfile profile:
await widget.storageService.addPinholeEquipmentProfile(profile); await widget.storageService.addPinholeEquipmentProfile(profile);
_pinholeCustomProfiles[profile.id] = (value: profile, isUsed: true);
case final EquipmentProfile profile: case final EquipmentProfile profile:
await widget.storageService.addEquipmentProfile(profile); await widget.storageService.addEquipmentProfile(profile);
_customProfiles[profile.id] = (value: profile, isUsed: true);
} }
_profiles[profile.id] = (value: profile, isUsed: true);
_sortProfiles();
setState(() {}); setState(() {});
} }
Future<void> updateProfile(IEquipmentProfile profile) async { Future<void> updateProfile(IEquipmentProfile profile) async {
switch (profile) { switch (profile) {
case final PinholeEquipmentProfile profile: case final PinholeEquipmentProfile profile:
final oldProfile = _pinholeCustomProfiles[profile.id]!.value; final oldProfile = _profiles[profile.id]!.value as PinholeEquipmentProfile;
await widget.storageService.updatePinholeEquipmentProfile( await widget.storageService.updatePinholeEquipmentProfile(
id: profile.id, id: profile.id,
name: profile.name, name: profile.name,
@ -93,9 +90,8 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom), lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom),
exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset), exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset),
); );
_pinholeCustomProfiles[profile.id] = (value: profile, isUsed: _pinholeCustomProfiles[profile.id]!.isUsed);
case final EquipmentProfile profile: case final EquipmentProfile profile:
final oldProfile = _customProfiles[profile.id]!.value; final oldProfile = _profiles[profile.id]!.value as EquipmentProfile;
await widget.storageService.updateEquipmentProfile( await widget.storageService.updateEquipmentProfile(
id: profile.id, id: profile.id,
name: oldProfile.name.changedOrNull(profile.name), name: oldProfile.name.changedOrNull(profile.name),
@ -106,8 +102,10 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom), lensZoom: oldProfile.lensZoom.changedOrNull(profile.lensZoom),
exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset), exposureOffset: oldProfile.exposureOffset.changedOrNull(profile.exposureOffset),
); );
_customProfiles[profile.id] = (value: profile, isUsed: _customProfiles[profile.id]!.isUsed);
} }
final bool shouldSort = _profiles[profile.id]!.value.name != profile.name;
_profiles[profile.id] = (value: profile, isUsed: _profiles[profile.id]!.isUsed);
if (shouldSort) _sortProfiles();
setState(() {}); setState(() {});
} }
@ -119,11 +117,10 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
switch (profile) { switch (profile) {
case final PinholeEquipmentProfile profile: case final PinholeEquipmentProfile profile:
await widget.storageService.deletePinholeEquipmentProfile(profile.id); await widget.storageService.deletePinholeEquipmentProfile(profile.id);
_pinholeCustomProfiles.remove(profile.id);
case final EquipmentProfile profile: case final EquipmentProfile profile:
await widget.storageService.deleteEquipmentProfile(profile.id); await widget.storageService.deleteEquipmentProfile(profile.id);
_customProfiles.remove(profile.id);
} }
_profiles.remove(profile.id);
_discardSelectedIfNotIncluded(); _discardSelectedIfNotIncluded();
setState(() {}); setState(() {});
} }
@ -138,12 +135,9 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
} }
Future<void> toggleProfile(String id, bool enabled) async { Future<void> toggleProfile(String id, bool enabled) async {
if (_customProfiles.containsKey(id)) { if (_profiles.containsKey(id)) {
_customProfiles[id] = (value: _customProfiles[id]!.value, isUsed: enabled); _profiles[id] = (value: _profiles[id]!.value, isUsed: enabled);
await widget.storageService.updateEquipmentProfile(id: id, 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 { } else {
return; return;
} }
@ -155,12 +149,19 @@ class EquipmentProfilesProviderState extends State<EquipmentProfilesProvider> {
if (_selectedId == EquipmentProfilesProvider.defaultProfile.id) { if (_selectedId == EquipmentProfilesProvider.defaultProfile.id) {
return; return;
} }
final isSelectedUsed = _customProfiles[_selectedId]?.isUsed ?? _pinholeCustomProfiles[_selectedId]?.isUsed ?? false; final isSelectedUsed = _profiles[_selectedId]?.isUsed ?? false;
if (!isSelectedUsed) { if (!isSelectedUsed) {
_selectedId = EquipmentProfilesProvider.defaultProfile.id; _selectedId = EquipmentProfilesProvider.defaultProfile.id;
widget.storageService.selectedEquipmentProfileId = _selectedId; widget.storageService.selectedEquipmentProfileId = _selectedId;
} }
} }
void _sortProfiles() {
final sortedByName = _profiles.values.toList(growable: false)
..sort((a, b) => a.value.name.toLowerCase().compareTo(b.value.name.toLowerCase()));
_profiles.clear();
_profiles.addEntries(sortedByName.map((e) => MapEntry(e.value.id, e)));
}
} }
enum _EquipmentProfilesModelAspect { enum _EquipmentProfilesModelAspect {
@ -170,13 +171,11 @@ enum _EquipmentProfilesModelAspect {
} }
class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> { class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> {
final TogglableMap<EquipmentProfile> profiles; final TogglableMap<IEquipmentProfile> profiles;
final TogglableMap<PinholeEquipmentProfile> pinholeProfiles;
final IEquipmentProfile selected; final IEquipmentProfile selected;
const EquipmentProfiles({ const EquipmentProfiles({
required this.profiles, required this.profiles,
required this.pinholeProfiles,
required this.selected, required this.selected,
required super.child, required super.child,
}); });
@ -189,7 +188,6 @@ class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> {
[ [
EquipmentProfilesProvider.defaultProfile, EquipmentProfilesProvider.defaultProfile,
...model.profiles.values.map((p) => p.value), ...model.profiles.values.map((p) => p.value),
...model.pinholeProfiles.values.map((p) => p.value),
], ],
); );
} }
@ -201,7 +199,6 @@ class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> {
[ [
EquipmentProfilesProvider.defaultProfile, EquipmentProfilesProvider.defaultProfile,
...model.profiles.values.where((p) => p.isUsed).map((p) => p.value), ...model.profiles.values.where((p) => p.isUsed).map((p) => p.value),
...model.pinholeProfiles.values.where((p) => p.isUsed).map((p) => p.value),
], ],
); );
} }
@ -219,8 +216,7 @@ class EquipmentProfiles extends InheritedModel<_EquipmentProfilesModelAspect> {
return (dependencies.contains(_EquipmentProfilesModelAspect.selected) && oldWidget.selected != selected) || return (dependencies.contains(_EquipmentProfilesModelAspect.selected) && oldWidget.selected != selected) ||
((dependencies.contains(_EquipmentProfilesModelAspect.profiles) || ((dependencies.contains(_EquipmentProfilesModelAspect.profiles) ||
dependencies.contains(_EquipmentProfilesModelAspect.profilesInUse)) && dependencies.contains(_EquipmentProfilesModelAspect.profilesInUse)) &&
(const DeepCollectionEquality().equals(oldWidget.profiles, profiles) || const DeepCollectionEquality().equals(oldWidget.profiles, profiles));
const DeepCollectionEquality().equals(oldWidget.pinholeProfiles, pinholeProfiles)));
} }
} }