show selected values count (wip)

This commit is contained in:
Vadim 2023-03-20 23:30:18 +03:00
parent 24646987ee
commit bf540e062a
5 changed files with 59 additions and 21 deletions

View file

@ -37,6 +37,17 @@
"equipment": "Equipment", "equipment": "Equipment",
"equipmentProfileName": "Equipment profile name", "equipmentProfileName": "Equipment profile name",
"equipmentProfileNameHint": "Praktica MTL5B", "equipmentProfileNameHint": "Praktica MTL5B",
"equipmentProfileValuesCount": "{count} values",
"@equipmentProfileValuesCount": {
"count": {
"min": {
"type": "int",
"format": "decimalPattern"
}
}
},
"equipmentProfileAllValues": "All",
"apertureValues": "Aperture values", "apertureValues": "Aperture values",
"apertureValuesFilterDescription": "Select the range of aperture values to display. This is usually determined by the lens you are using.", "apertureValuesFilterDescription": "Select the range of aperture values to display. This is usually determined by the lens you are using.",
"ndFilters": "ND filters", "ndFilters": "ND filters",

View file

@ -35,6 +35,9 @@ class EquipmentListTiles extends StatelessWidget {
title: S.of(context).isoValues, title: S.of(context).isoValues,
description: S.of(context).isoValuesFilterDescription, description: S.of(context).isoValuesFilterDescription,
values: isoValues, values: isoValues,
valuesCount: selectedIsoValues.length == isoValues.length
? S.of(context).equipmentProfileAllValues
: S.of(context).equipmentProfileValuesCount(selectedIsoValues.length),
selectedValues: selectedIsoValues, selectedValues: selectedIsoValues,
rangeSelect: false, rangeSelect: false,
onChanged: onIsoValuesSelecred, onChanged: onIsoValuesSelecred,
@ -44,6 +47,9 @@ class EquipmentListTiles extends StatelessWidget {
title: S.of(context).ndFilters, title: S.of(context).ndFilters,
description: S.of(context).ndFiltersFilterDescription, description: S.of(context).ndFiltersFilterDescription,
values: ndValues, values: ndValues,
valuesCount: selectedNdValues.length == ndValues.length
? S.of(context).equipmentProfileAllValues
: S.of(context).equipmentProfileValuesCount(selectedNdValues.length),
selectedValues: selectedNdValues, selectedValues: selectedNdValues,
rangeSelect: false, rangeSelect: false,
onChanged: onNdValuesSelected, onChanged: onNdValuesSelected,
@ -53,6 +59,9 @@ class EquipmentListTiles extends StatelessWidget {
title: S.of(context).apertureValues, title: S.of(context).apertureValues,
description: S.of(context).apertureValuesFilterDescription, description: S.of(context).apertureValuesFilterDescription,
values: apertureValues, values: apertureValues,
valuesCount: selectedApertureValues.length == apertureValues.length
? S.of(context).equipmentProfileAllValues
: S.of(context).equipmentProfileValuesCount(selectedApertureValues.length),
selectedValues: selectedApertureValues, selectedValues: selectedApertureValues,
rangeSelect: true, rangeSelect: true,
onChanged: onApertureValuesSelected, onChanged: onApertureValuesSelected,
@ -62,6 +71,9 @@ class EquipmentListTiles extends StatelessWidget {
title: S.of(context).shutterSpeedValues, title: S.of(context).shutterSpeedValues,
description: S.of(context).shutterSpeedValuesFilterDescription, description: S.of(context).shutterSpeedValuesFilterDescription,
values: shutterSpeedValues, values: shutterSpeedValues,
valuesCount: selectedShutterSpeedValues.length == shutterSpeedValues.length
? S.of(context).equipmentProfileAllValues
: S.of(context).equipmentProfileValuesCount(selectedShutterSpeedValues.length),
selectedValues: selectedShutterSpeedValues, selectedValues: selectedShutterSpeedValues,
rangeSelect: true, rangeSelect: true,
onChanged: onShutterSpeedValuesSelected, onChanged: onShutterSpeedValuesSelected,
@ -74,6 +86,7 @@ class EquipmentListTiles extends StatelessWidget {
class _EquipmentListTile<T extends PhotographyValue> extends StatelessWidget { class _EquipmentListTile<T extends PhotographyValue> extends StatelessWidget {
final IconData icon; final IconData icon;
final String title; final String title;
final String valuesCount;
final String description; final String description;
final List<T> selectedValues; final List<T> selectedValues;
final List<T> values; final List<T> values;
@ -83,6 +96,7 @@ class _EquipmentListTile<T extends PhotographyValue> extends StatelessWidget {
const _EquipmentListTile({ const _EquipmentListTile({
required this.icon, required this.icon,
required this.title, required this.title,
required this.valuesCount,
required this.description, required this.description,
required this.selectedValues, required this.selectedValues,
required this.values, required this.values,
@ -96,6 +110,7 @@ class _EquipmentListTile<T extends PhotographyValue> extends StatelessWidget {
return ListTile( return ListTile(
leading: Icon(icon), leading: Icon(icon),
title: Text(title), title: Text(title),
trailing: Text(valuesCount),
onTap: () { onTap: () {
showDialog( showDialog(
context: context, context: context,

View file

@ -1,18 +1,21 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
import 'components/equipment_list_tiles/widget_list_tiles_equipments.dart'; import 'components/equipment_list_tiles/widget_list_tiles_equipments.dart';
class EquipmentProfileContainer extends StatefulWidget { class EquipmentProfileContainer extends StatefulWidget {
final EquipmentProfileData data; final EquipmentProfileData data;
final VoidCallback onExpand; final ValueChanged<EquipmentProfileData> onUpdate;
final VoidCallback onDelete; final VoidCallback onDelete;
final VoidCallback onExpand;
const EquipmentProfileContainer({ const EquipmentProfileContainer({
required this.data, required this.data,
required this.onExpand, required this.onUpdate,
required this.onDelete, required this.onDelete,
required this.onExpand,
super.key, super.key,
}); });
@ -21,7 +24,7 @@ class EquipmentProfileContainer extends StatefulWidget {
} }
class EquipmentProfileContainerState extends State<EquipmentProfileContainer> { class EquipmentProfileContainerState extends State<EquipmentProfileContainer> {
final TextEditingController _nameController = TextEditingController(text: 'Default'); late final TextEditingController _nameController = TextEditingController(text: widget.data.name);
final FocusNode _fieldFocusNode = FocusNode(); final FocusNode _fieldFocusNode = FocusNode();
bool _expanded = false; bool _expanded = false;
@ -57,8 +60,8 @@ class EquipmentProfileContainerState extends State<EquipmentProfileContainer> {
focusNode: _fieldFocusNode, focusNode: _fieldFocusNode,
controller: _nameController, controller: _nameController,
onChanged: (value) {}, onChanged: (value) {},
decoration: const InputDecoration( decoration: InputDecoration(
hintText: 'Profile name', hintText: S.of(context).equipmentProfileNameHint,
border: InputBorder.none, border: InputBorder.none,
), ),
), ),

View file

@ -34,7 +34,7 @@ class _EquipmentProfileNameDialogState extends State<EquipmentProfileNameDialog>
valueListenable: _nameController, valueListenable: _nameController,
builder: (_, value, __) => TextButton( builder: (_, value, __) => TextButton(
onPressed: value.text.isNotEmpty onPressed: value.text.isNotEmpty
? () => Navigator.of(context).pop(value.text.isNotEmpty) ? () => Navigator.of(context).pop(value.text)
: null, : null,
child: Text(S.of(context).save), child: Text(S.of(context).save),
), ),

View file

@ -17,7 +17,6 @@ class _EquipmentProfileScreenState extends State<EquipmentProfileScreen> {
static const maxProfiles = 5; // replace with a constant from iap static const maxProfiles = 5; // replace with a constant from iap
late List<GlobalKey<EquipmentProfileContainerState>> profileContainersKeys = []; late List<GlobalKey<EquipmentProfileContainerState>> profileContainersKeys = [];
int get profilesCount => EquipmentProfiles.of(context)?.length ?? 0; int get profilesCount => EquipmentProfiles.of(context)?.length ?? 0;
@override @override
@ -56,30 +55,40 @@ class _EquipmentProfileScreenState extends State<EquipmentProfileScreen> {
key: profileContainersKeys[index], key: profileContainersKeys[index],
data: EquipmentProfiles.of(context)![index], data: EquipmentProfiles.of(context)![index],
onExpand: () => _keepExpandedAt(index), onExpand: () => _keepExpandedAt(index),
onDelete: () { onUpdate: _updateProfile,
EquipmentProfileProvider.of(context) onDelete: () => _removeProfileAt(index),
.deleteProfile(EquipmentProfiles.of(context)![index]);
profileContainersKeys.removeAt(index);
},
), ),
), ),
), ),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton: profilesCount < maxProfiles floatingActionButton: profilesCount < maxProfiles
? FloatingActionButton( ? FloatingActionButton(
onPressed: () { onPressed: _addProfile,
showDialog(context: context, builder: (_) => const EquipmentProfileNameDialog()) child: const Icon(Icons.add),
.then((value) { )
: null,
);
}
void _addProfile() {
showDialog<String>(
context: context,
builder: (_) => const EquipmentProfileNameDialog(),
).then((value) {
if (value != null) { if (value != null) {
EquipmentProfileProvider.of(context).addProfile(value); EquipmentProfileProvider.of(context).addProfile(value);
profileContainersKeys.add(GlobalKey<EquipmentProfileContainerState>()); profileContainersKeys.add(GlobalKey<EquipmentProfileContainerState>());
} }
}); });
}, }
child: const Icon(Icons.add),
) void _updateProfile(EquipmentProfileData data) {
: null, //
); }
void _removeProfileAt(int index) {
EquipmentProfileProvider.of(context).deleteProfile(EquipmentProfiles.of(context)![index]);
profileContainersKeys.removeAt(index);
} }
void _keepExpandedAt(int index) { void _keepExpandedAt(int index) {