mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-26 09:20:45 +00:00
Compare commits
No commits in common. "429c0a53a21438f061555d22e00f2b9ac489d59f" and "bf3c8aa7c7396238ae01a43ed6619c83b506e093" have entirely different histories.
429c0a53a2
...
bf3c8aa7c7
4 changed files with 42 additions and 71 deletions
|
@ -68,8 +68,8 @@ class _DialogRangePickerState<T extends PhotographyValue> extends State<DialogRa
|
||||||
divisions: widget.values.length - 1,
|
divisions: widget.values.length - 1,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
setState(() {
|
setState(() {
|
||||||
_start = value.start.round();
|
_start = value.start.toInt();
|
||||||
_end = value.end.round();
|
_end = value.end.toInt();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
@ -143,14 +143,11 @@ class EquipmentProfileContainerState extends State<EquipmentProfileContainer>
|
||||||
widget.onExpand();
|
widget.onExpand();
|
||||||
_controller.forward();
|
_controller.forward();
|
||||||
SchedulerBinding.instance.addPostFrameCallback((_) {
|
SchedulerBinding.instance.addPostFrameCallback((_) {
|
||||||
Future.delayed(_controller.duration!).then((_) {
|
|
||||||
Scrollable.ensureVisible(
|
Scrollable.ensureVisible(
|
||||||
context,
|
context,
|
||||||
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd,
|
alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd,
|
||||||
duration: _controller.duration!,
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void collapse() {
|
void collapse() {
|
||||||
|
|
|
@ -17,13 +17,17 @@ class EquipmentProfilesScreen extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
|
class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
|
||||||
final Map<String, GlobalKey<EquipmentProfileContainerState>> keysMap = {};
|
static const maxProfiles = 5 + 1; // replace with a constant from iap
|
||||||
int get profilesCount => keysMap.length;
|
|
||||||
|
late List<GlobalKey<EquipmentProfileContainerState>> profileContainersKeys = [];
|
||||||
|
int get profilesCount => EquipmentProfiles.of(context).length;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
_updateProfilesKeys();
|
profileContainersKeys = EquipmentProfiles.of(context)
|
||||||
|
.map((e) => GlobalKey<EquipmentProfileContainerState>(debugLabel: e.id))
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -31,6 +35,7 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
|
||||||
return SliverScreen(
|
return SliverScreen(
|
||||||
title: S.of(context).equipmentProfiles,
|
title: S.of(context).equipmentProfiles,
|
||||||
appBarActions: [
|
appBarActions: [
|
||||||
|
if (profilesCount < maxProfiles)
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: _addProfile,
|
onPressed: _addProfile,
|
||||||
icon: const Icon(Icons.add),
|
icon: const Icon(Icons.add),
|
||||||
|
@ -50,14 +55,8 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
|
||||||
: [
|
: [
|
||||||
SliverList(
|
SliverList(
|
||||||
delegate: SliverChildBuilderDelegate(
|
delegate: SliverChildBuilderDelegate(
|
||||||
(context, index) {
|
(context, index) => index > 0 // skip default
|
||||||
if (index == 0) {
|
? Padding(
|
||||||
// skip default profile
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
|
|
||||||
final profile = EquipmentProfiles.of(context)[index];
|
|
||||||
return Padding(
|
|
||||||
padding: EdgeInsets.fromLTRB(
|
padding: EdgeInsets.fromLTRB(
|
||||||
Dimens.paddingM,
|
Dimens.paddingM,
|
||||||
index == 0 ? Dimens.paddingM : 0,
|
index == 0 ? Dimens.paddingM : 0,
|
||||||
|
@ -65,15 +64,15 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
|
||||||
Dimens.paddingM,
|
Dimens.paddingM,
|
||||||
),
|
),
|
||||||
child: EquipmentProfileContainer(
|
child: EquipmentProfileContainer(
|
||||||
key: keysMap[profile.id],
|
key: profileContainersKeys[index],
|
||||||
data: profile,
|
data: EquipmentProfiles.of(context)[index],
|
||||||
onExpand: () => _keepExpandedAt(index),
|
onExpand: () => _keepExpandedAt(index),
|
||||||
onUpdate: _updateProfileAt,
|
onUpdate: (profileData) => _updateProfileAt(profileData, index),
|
||||||
onDelete: () => _removeProfileAt(profile),
|
onDelete: () => _removeProfileAt(index),
|
||||||
),
|
),
|
||||||
);
|
)
|
||||||
},
|
: const SizedBox.shrink(),
|
||||||
childCount: EquipmentProfiles.of(context).length,
|
childCount: profilesCount,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SliverToBoxAdapter(child: SizedBox(height: MediaQuery.paddingOf(context).bottom)),
|
SliverToBoxAdapter(child: SizedBox(height: MediaQuery.paddingOf(context).bottom)),
|
||||||
|
@ -92,47 +91,22 @@ class _EquipmentProfilesScreenState extends State<EquipmentProfilesScreen> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void _updateProfileAt(EquipmentProfile data) {
|
void _updateProfileAt(EquipmentProfile data, int index) {
|
||||||
EquipmentProfileProvider.of(context).updateProdile(data);
|
EquipmentProfileProvider.of(context).updateProdile(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _removeProfileAt(EquipmentProfile data) {
|
void _removeProfileAt(int index) {
|
||||||
EquipmentProfileProvider.of(context).deleteProfile(data);
|
EquipmentProfileProvider.of(context).deleteProfile(EquipmentProfiles.of(context)[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _keepExpandedAt(int index) {
|
void _keepExpandedAt(int index) {
|
||||||
keysMap.values.toList().getRange(0, index).forEach((element) {
|
profileContainersKeys.getRange(0, index).forEach((element) {
|
||||||
element.currentState?.collapse();
|
element.currentState?.collapse();
|
||||||
});
|
});
|
||||||
keysMap.values.toList().getRange(index + 1, profilesCount).forEach((element) {
|
profileContainersKeys.getRange(index + 1, profilesCount).forEach((element) {
|
||||||
element.currentState?.collapse();
|
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 {
|
class _EquipmentProfilesListPlaceholder extends StatelessWidget {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
name: lightmeter
|
name: lightmeter
|
||||||
description: Lightmeter app inspired by Material 3 design system.
|
description: Lightmeter app inspired by Material 3 design system.
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
version: 0.14.0+39
|
version: 0.13.2+38
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=3.0.0 <4.0.0"
|
sdk: ">=3.0.0 <4.0.0"
|
||||||
|
|
Loading…
Reference in a new issue