Equipment profiles issues (#112)

* Fixed equipment profiles sections collapsing

* Fixed range picker dialog

* Refined equipment profiles sections handling
This commit is contained in:
Vadim 2023-09-02 22:29:35 +02:00 committed by GitHub
parent bf3c8aa7c7
commit f39177919c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 41 deletions

View file

@ -68,8 +68,8 @@ class _DialogRangePickerState<T extends PhotographyValue> extends State<DialogRa
divisions: widget.values.length - 1,
onChanged: (value) {
setState(() {
_start = value.start.toInt();
_end = value.end.toInt();
_start = value.start.round();
_end = value.end.round();
});
},
),

View file

@ -143,11 +143,14 @@ class EquipmentProfileContainerState extends State<EquipmentProfileContainer>
widget.onExpand();
_controller.forward();
SchedulerBinding.instance.addPostFrameCallback((_) {
Future.delayed(_controller.duration!).then((_) {
Scrollable.ensureVisible(
context,
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd,
duration: _controller.duration!,
);
});
});
}
void collapse() {

View file

@ -17,17 +17,13 @@ class EquipmentProfilesScreen extends StatefulWidget {
}
class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
static const maxProfiles = 5 + 1; // replace with a constant from iap
late List<GlobalKey<EquipmentProfileContainerState>> profileContainersKeys = [];
int get profilesCount => EquipmentProfiles.of(context).length;
final Map<String, GlobalKey<EquipmentProfileContainerState>> keysMap = {};
int get profilesCount => keysMap.length;
@override
void didChangeDependencies() {
super.didChangeDependencies();
profileContainersKeys = EquipmentProfiles.of(context)
.map((e) => GlobalKey<EquipmentProfileContainerState>(debugLabel: e.id))
.toList();
_updateProfilesKeys();
}
@override
@ -35,7 +31,6 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
return SliverScreen(
title: S.of(context).equipmentProfiles,
appBarActions: [
if (profilesCount < maxProfiles)
IconButton(
onPressed: _addProfile,
icon: const Icon(Icons.add),
@ -55,8 +50,14 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
: [
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => index > 0 // skip default
? Padding(
(context, index) {
if (index == 0) {
// skip default profile
return const SizedBox.shrink();
}
final profile = EquipmentProfiles.of(context)[index];
return Padding(
padding: EdgeInsets.fromLTRB(
Dimens.paddingM,
index == 0 ? Dimens.paddingM : 0,
@ -64,15 +65,15 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
Dimens.paddingM,
),
child: EquipmentProfileContainer(
key: profileContainersKeys[index],
data: EquipmentProfiles.of(context)[index],
key: keysMap[profile.id],
data: profile,
onExpand: () => _keepExpandedAt(index),
onUpdate: (profileData) => _updateProfileAt(profileData, index),
onDelete: () => _removeProfileAt(index),
onUpdate: _updateProfileAt,
onDelete: () => _removeProfileAt(profile),
),
)
: const SizedBox.shrink(),
childCount: profilesCount,
);
},
childCount: EquipmentProfiles.of(context).length,
),
),
SliverToBoxAdapter(child: SizedBox(height: MediaQuery.paddingOf(context).bottom)),
@ -91,22 +92,47 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
});
}
void _updateProfileAt(EquipmentProfile data, int index) {
void _updateProfileAt(EquipmentProfile data) {
EquipmentProfileProvider.of(context).updateProdile(data);
}
void _removeProfileAt(int index) {
EquipmentProfileProvider.of(context).deleteProfile(EquipmentProfiles.of(context)[index]);
void _removeProfileAt(EquipmentProfile data) {
EquipmentProfileProvider.of(context).deleteProfile(data);
}
void _keepExpandedAt(int index) {
profileContainersKeys.getRange(0, index).forEach((element) {
keysMap.values.toList().getRange(0, index).forEach((element) {
element.currentState?.collapse();
});
profileContainersKeys.getRange(index + 1, profilesCount).forEach((element) {
keysMap.values.toList().getRange(index + 1, profilesCount).forEach((element) {
element.currentState?.collapse();
});
}
void _updateProfilesKeys() {
final profiles = EquipmentProfiles.of(context);
if (profiles.length > keysMap.length) {
// profile added
final List<String> idsToAdd = [];
for (final profile in profiles) {
if (!keysMap.keys.contains(profile.id)) idsToAdd.add(profile.id);
}
for (final id in idsToAdd) {
keysMap[id] = GlobalKey<EquipmentProfileContainerState>(debugLabel: id);
}
idsToAdd.clear();
} else if (profiles.length < keysMap.length) {
// profile deleted
final List<String> idsToDelete = [];
for (final id in keysMap.keys) {
if (!profiles.any((p) => p.id == id)) idsToDelete.add(id);
}
idsToDelete.forEach(keysMap.remove);
idsToDelete.clear();
} else {
// profile updated, no need to updated keys
}
}
}
class _EquipmentProfilesListPlaceholder extends StatelessWidget {