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 { 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: [ AutoCompleteDropdownButton( 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( 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(), ], ), ), ), ); } }