Commit 30122be

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-12-30 17:29:17
allow intake deletion
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent af423af
Changed files (3)
lib/components/measurement_list/intake_list_entry.dart
@@ -1,24 +1,52 @@
+import 'dart:async';
+
 import 'package:blood_pressure_app/model/blood_pressure/medicine/medicine_intake.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:flutter/material.dart';
 import 'package:intl/intl.dart';
 
+import 'measurement_list_entry.dart';
+
 /// Medicine intake to display in a list.
 class IntakeListEntry extends StatelessWidget {
   const IntakeListEntry({super.key,
     required this.settings,
     required this.intake,
+    this.delete,
   });
 
   final Settings settings;
 
   final MedicineIntake intake;
 
+  /// Function to delete this intake.
+  ///
+  /// Gets called after the delete button has been pressed and the deletion got
+  /// confirmed.
+  /// When null no deletion button is displayed.
+  final FutureOr<void> Function()? delete;
+
   @override
   Widget build(BuildContext context) => ListTile(
     title: Text(intake.medicine.designation),
     subtitle: Text(DateFormat(settings.dateFormatString).format(intake.timestamp)),
-    trailing: Text(intake.dosis.toString()),
+    trailing: Row(
+      mainAxisSize: MainAxisSize.min,
+      children: [
+        Text(intake.dosis.toString()),
+        if (delete != null)
+          IconButton(
+            onPressed: () async {
+              bool confirmedDeletion = true;
+              if (settings.confirmDeletion) {
+                confirmedDeletion = await showConfirmDeletionDialoge(context);
+              }
+              if (confirmedDeletion) delete!();
+            },
+            icon: const Icon(Icons.delete)
+          ), // TODO: show in graph
+      ],
+    ),
     leading: const Icon(Icons.medication),
     iconColor: intake.medicine.color,
   );
lib/components/measurement_list/measurement_list.dart
@@ -1,10 +1,12 @@
 import 'package:blood_pressure_app/components/measurement_list/intake_list_entry.dart';
 import 'package:blood_pressure_app/components/measurement_list/measurement_list_entry.dart';
+import 'package:blood_pressure_app/model/blood_pressure/medicine/intake_history.dart';
 import 'package:blood_pressure_app/model/blood_pressure/medicine/medicine_intake.dart';
 import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
 
 class MeasurementList extends StatelessWidget {
   const MeasurementList({super.key,
@@ -94,6 +96,11 @@ class MeasurementList extends StatelessWidget {
                 return IntakeListEntry(
                   intake: entries[idx],
                   settings: settings,
+                  delete: () {
+                    // TODO: move out of model
+                    final history = Provider.of<IntakeHistory>(context, listen: false);
+                    history.deleteIntake(entries[idx]);
+                  },
                 );
               }
 
lib/components/measurement_list/measurement_list_entry.dart
@@ -88,27 +88,12 @@ class MeasurementListRow extends StatelessWidget {
   void _deleteEntry(Settings settings, BuildContext context, AppLocalizations localizations) async {
     final model = Provider.of<BloodPressureModel>(context, listen: false);
     final messanger = ScaffoldMessenger.of(context);
-    bool confirmedDeletion = false;
+    bool confirmedDeletion = true;
     if (settings.confirmDeletion) {
-      confirmedDeletion = await showDialog<bool>(context: context,
-          builder: (context) => AlertDialog(
-            title: Text(AppLocalizations.of(context)!.confirmDelete),
-            content: Text(AppLocalizations.of(context)!.confirmDeleteDesc),
-            actions: [
-              ElevatedButton(
-                  onPressed: () => Navigator.of(context).pop(false),
-                  child: Text(AppLocalizations.of(context)!.btnCancel)),
-              ElevatedButton(
-                  onPressed: () => Navigator.of(context).pop(true),
-                  child: Text(AppLocalizations.of(context)!.btnConfirm)),
-            ],
-          )
-      ) ?? false;
-    } else {
-      confirmedDeletion = true;
+      confirmedDeletion = await showConfirmDeletionDialoge(context);
     }
 
-    if (confirmedDeletion) {
+    if (confirmedDeletion) { // TODO: move out of model
       model.delete(record.creationTime);
       messanger.removeCurrentSnackBar();
       messanger.showSnackBar(SnackBar(
@@ -122,3 +107,22 @@ class MeasurementListRow extends StatelessWidget {
     }
   }
 }
+
+Future<bool> showConfirmDeletionDialoge(BuildContext context) async {
+  return await showDialog<bool>(context: context,
+    builder: (context) => AlertDialog(
+      title: Text(AppLocalizations.of(context)!.confirmDelete),
+      content: Text(AppLocalizations.of(context)!.confirmDeleteDesc),
+      actions: [
+        ElevatedButton(
+          onPressed: () => Navigator.of(context).pop(false),
+          child: Text(AppLocalizations.of(context)!.btnCancel)
+        ),
+        ElevatedButton(
+          onPressed: () => Navigator.of(context).pop(true),
+          child: Text(AppLocalizations.of(context)!.btnConfirm)
+        ),
+      ],
+    )
+  ) ?? false;
+}