diameter/lib/settings.dart

202 lines
7.2 KiB
Dart

import 'package:diameter/components/dialogs.dart';
import 'package:diameter/components/dropdown.dart';
import 'package:diameter/components/forms.dart';
import 'package:diameter/models/settings.dart';
import 'package:diameter/navigation.dart';
import 'package:flutter/material.dart';
class SettingsScreen extends StatefulWidget {
static const String routeName = '/settings';
const SettingsScreen({Key? key}) : super(key: key);
@override
_SettingsScreenState createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen> {
late Settings _settings;
late bool _onlyDisplayActiveGlucoseMeasurement;
late bool _displayBothGlucoseMeasurementsInDetailView;
late bool _displayBothGlucoseMeasurementsInListView;
@override
void initState() {
super.initState();
reload();
}
void onReset() {
Settings.reset();
reload(message: 'Settings have been reset to default');
}
void saveSettings() {
Settings.put(Settings(
id: _settings.id,
nutritionMeasurement: _settings.nutritionMeasurement,
glucoseDisplayMode: _settings.glucoseDisplayMode,
glucoseMeasurement: _settings.glucoseMeasurement,
dateFormat: _settings.dateFormat,
longDateFormat: _settings.longDateFormat,
timeFormat: _settings.timeFormat,
longTimeFormat: _settings.longTimeFormat,
showConfirmationDialogOnCancel: _settings.showConfirmationDialogOnCancel,
showConfirmationDialogOnDelete: _settings.showConfirmationDialogOnDelete,
showConfirmationDialogOnStopEvent:
_settings.showConfirmationDialogOnStopEvent,
lowGlucoseMgPerDl: _settings.lowGlucoseMgPerDl,
moderateGlucoseMgPerDl: _settings.moderateGlucoseMgPerDl,
highGlucoseMgPerDl: _settings.highGlucoseMgPerDl,
lowGlucoseMmolPerL: _settings.lowGlucoseMmolPerL,
moderateGlucoseMmolPerL: _settings.moderateGlucoseMmolPerL,
highGlucoseMmolPerDl: _settings.highGlucoseMmolPerDl,
));
reload(message: 'Settings updated');
}
void reload({String? message}) {
setState(() {
_settings = Settings.get();
});
setState(() {
_onlyDisplayActiveGlucoseMeasurement =
_settings.glucoseDisplayMode == GlucoseDisplayMode.activeOnly;
_displayBothGlucoseMeasurementsInDetailView =
_settings.glucoseDisplayMode == GlucoseDisplayMode.both ||
_settings.glucoseDisplayMode == GlucoseDisplayMode.bothForDetail;
_displayBothGlucoseMeasurementsInListView =
_settings.glucoseDisplayMode == GlucoseDisplayMode.both ||
_settings.glucoseDisplayMode == GlucoseDisplayMode.bothForList;
});
setState(() {
if (message != null) {
var snackBar = SnackBar(
content: Text(message),
duration: const Duration(seconds: 2),
);
ScaffoldMessenger.of(context)
..removeCurrentSnackBar()
..showSnackBar(snackBar);
}
});
}
void handleResetAction() async {
Dialogs.showConfirmationDialog(
context: context,
onConfirm: onReset,
message: 'Are you sure you want to reset all settings?',
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Application Settings'),
),
drawer: const Navigation(currentLocation: SettingsScreen.routeName),
body: SingleChildScrollView(
child: Column(
children: <Widget>[
AutoCompleteDropdownButton<String>(
selectedItem: nutritionMeasurementLabels[
_settings.nutritionMeasurement.index],
label: 'Preferred Nutrition Measurement',
items: nutritionMeasurementLabels,
onChanged: (value) {
if (value != null) {
_settings.nutritionMeasurement = NutritionMeasurement.values
.elementAt(nutritionMeasurementLabels.indexOf(value));
saveSettings();
}
},
),
AutoCompleteDropdownButton<String>(
selectedItem:
glucoseMeasurementLabels[_settings.glucoseMeasurement.index],
label: 'Preferred Glucose Measurement',
items: glucoseMeasurementLabels,
onChanged: (value) {
if (value != null) {
_settings.glucoseMeasurement = GlucoseMeasurement.values
.elementAt(glucoseMeasurementLabels.indexOf(value));
saveSettings();
}
},
),
BooleanFormField(
value: _onlyDisplayActiveGlucoseMeasurement,
label: 'only display active glucose measurement',
onChanged: (_) {
GlucoseDisplayMode mode = _settings.glucoseDisplayMode ==
GlucoseDisplayMode.activeOnly
? GlucoseDisplayMode.both
: GlucoseDisplayMode.activeOnly;
_settings.glucoseDisplayMode = mode;
saveSettings();
},
),
BooleanFormField(
value: _displayBothGlucoseMeasurementsInDetailView,
enabled:
!_onlyDisplayActiveGlucoseMeasurement,
label: 'display both glucose measurements in detail view',
onChanged: (_) {
GlucoseDisplayMode mode =
_settings.glucoseDisplayMode == GlucoseDisplayMode.both
? GlucoseDisplayMode.bothForList
: _settings.glucoseDisplayMode ==
GlucoseDisplayMode.bothForList
? GlucoseDisplayMode.both
: GlucoseDisplayMode.activeOnly;
_settings.glucoseDisplayMode = mode;
saveSettings();
},
),
BooleanFormField(
value: _displayBothGlucoseMeasurementsInListView,
enabled:
!_onlyDisplayActiveGlucoseMeasurement,
label: 'display both glucose measurements in list view',
onChanged: (_) {
GlucoseDisplayMode mode =
_settings.glucoseDisplayMode == GlucoseDisplayMode.both
? GlucoseDisplayMode.bothForDetail
: _settings.glucoseDisplayMode ==
GlucoseDisplayMode.bothForDetail
? GlucoseDisplayMode.both
: GlucoseDisplayMode.activeOnly;
_settings.glucoseDisplayMode = mode;
saveSettings();
},
),
],
),
),
bottomNavigationBar: BottomAppBar(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Row(
children: [
ElevatedButton.icon(
onPressed: handleResetAction,
icon: const Icon(
Icons.settings_backup_restore,
size: 18.0,
),
label: const Text('RESET ALL'),
),
const Spacer(),
],
),
),
),
);
}
}