Commit ed090f7

derdilla <derdilla06@gmail.com>
2023-05-20 09:09:59
add settings for manual blood pressure ranges
1 parent b570f5e
Changed files (2)
lib
lib/components/settings_widgets.dart
@@ -239,7 +239,7 @@ class _SliderSettingsTileState extends State<SliderSettingsTile> {
   }
 }
 
-class InputSettingsTile extends StatelessWidget {
+class InputSettingsTile extends StatefulWidget {
   final Widget title;
   final Widget? leading;
   final Widget? description;
@@ -248,40 +248,57 @@ class InputSettingsTile extends StatelessWidget {
   final double inputWidth;
   final String? initialValue;
   final InputDecoration? decoration;
-  final String? Function(String?)? validator;
+  final void Function(String?)? onEditingComplete;
   final TextInputType? keyboardType;
   final List<TextInputFormatter>? inputFormatters;
 
-  const InputSettingsTile({super.key, required this.title, required this.inputWidth, this.leading, this.description, this.disabled = false, this.initialValue, this.decoration, this.validator, this.keyboardType, this.inputFormatters});
+  const InputSettingsTile({super.key, required this.title, required this.inputWidth, this.leading, this.description, this.disabled = false, this.initialValue, this.decoration, this.onEditingComplete, this.keyboardType, this.inputFormatters});
+
+  @override
+  State<StatefulWidget> createState() => _InputSettingsTileState();
+}
+
+class _InputSettingsTileState extends State<InputSettingsTile> {
+  late String _value;
+  
+  @override
+  void initState() {
+    super.initState();
+    _value = widget.initialValue ?? "";
+  }
 
   @override
   Widget build(BuildContext context) {
     final focusNode = FocusNode();
 
     return SettingsTile(
-      title: title,
-      description: description,
+      title: widget.title,
+      description: widget.description,
+      leading: widget.leading,
+      disabled: widget.disabled,
       onPressed: (context) {
         focusNode.requestFocus();
       },
       trailing: Row(
         children: [
           SizedBox(
-            width: inputWidth,
+            width: widget.inputWidth,
             child: TextFormField(
-              initialValue: initialValue,
-              decoration: decoration,
-              validator: validator,
-              keyboardType: keyboardType,
-              inputFormatters: inputFormatters,
+              initialValue: widget.initialValue,
+              decoration: widget.decoration,
+              onChanged: (value) {
+                _value = value;
+              },
+              onEditingComplete: () => widget.onEditingComplete!(_value),
+              onTapOutside: (e) => widget.onEditingComplete!(_value),
+              keyboardType: widget.keyboardType,
+              inputFormatters: widget.inputFormatters,
               focusNode: focusNode,
             ),
           ),
           const SizedBox(width: 20,),
         ],
       ),
-      leading: leading,
-      disabled: disabled,
     );
   }
 }
lib/screens/settings.dart
@@ -3,6 +3,7 @@ import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:blood_pressure_app/screens/enter_timeformat.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
 import 'package:provider/provider.dart';
 import 'package:url_launcher/url_launcher.dart';
 
@@ -98,13 +99,95 @@ class SettingsPage extends StatelessWidget {
                   ),
                 ]
               ),
+              SettingsSection(
+                  title: const Text('behavior'),
+                  children: [
+                    InputSettingsTile(
+                      title: const Text('age'),
+                      description: const Text('determines warn values'),
+                      leading: const Icon(Icons.manage_accounts_outlined),
+                      keyboardType: TextInputType.number,
+                      inputFormatters: [
+                        FilteringTextInputFormatter.digitsOnly
+                      ],
+                      initialValue: settings.age.toString(),
+                      onEditingComplete: (String? value) {
+                        if (value == null || value.isEmpty
+                            || (int.tryParse(value) == null)) {
+                          return;
+                        }
+                        settings.age = int.tryParse(value) as int; // no error possible as per above's condition
+                      },
+                      decoration: const InputDecoration(
+                          hintText: 'age'
+                      ),
+                      inputWidth: 80,
+                      disabled: false,
+                      // although no function provided, when overriding warn values,
+                      // this field intentionally doesn't get disabled, as this
+                      // would cause unexpected jumps in layout
+                    ),
+                    SwitchSettingsTile(
+                      initialValue: settings.overrideWarnValues,
+                      onToggle: (value) {
+                        settings.overrideWarnValues = value;
+                      },
+                      leading: const Icon(Icons.tune),
+                      title: const Text('override warn values'),
+                    ),
+                    InputSettingsTile(
+                      title: const Text('systolic warn'),
+                      leading: const Icon(Icons.settings_applications_outlined),
+                      keyboardType: TextInputType.number,
+                      inputFormatters: [
+                        FilteringTextInputFormatter.digitsOnly
+                      ],
+                      initialValue: settings.sysWarn.toString(),
+                      onEditingComplete: (String? value) {
+                        if (value == null || value.isEmpty
+                            || (double.tryParse(value) == null)) {
+                          return;
+                        }
+                        // no error possible as per above's condition
+                        settings.sysWarn = double.tryParse(value) as double;
+                      },
+                      decoration: const InputDecoration(
+                          hintText: 'systolic warn'
+                      ),
+                      inputWidth: 120,
+                      disabled: !settings.overrideWarnValues,
+                    ),
+                    InputSettingsTile(
+                      title: const Text('diastolic warn'),
+                      leading: const Icon(Icons.settings_applications_outlined),
+                      keyboardType: TextInputType.number,
+                      inputFormatters: [
+                        FilteringTextInputFormatter.digitsOnly
+                      ],
+                      initialValue: settings.diaWarn.toString(),
+                      onEditingComplete: (String? value) {
+                        if (value == null || value.isEmpty
+                            || (double.tryParse(value) == null)) {
+                          return;
+                        }
+                        // no error possible as per above's condition
+                        settings.diaWarn = double.tryParse(value) as double;
+                      },
+                      decoration: const InputDecoration(
+                          hintText: 'diastolic warn'
+                      ),
+                      inputWidth: 120,
+                      disabled: !settings.overrideWarnValues,
+                    ),
+                  ]
+              ),
               SettingsSection(
                 title: const Text('data'),
                 children: [
                   SwitchSettingsTile(
                       initialValue: settings.useExportCompatability,
                       title: const Text('compatability export'),
-                      description: const Text('sets export mime type to text instead of csv'),
+                      description: const Text('sets export mime type to text'),
                       leading: const Icon(Icons.support),
                       onToggle: (value) {
                         settings.useExportCompatability = value;