Commit 8820aa6

derdilla <derdilla06@gmail.com>
2023-08-29 17:10:56
add new Measurement list concept
1 parent dc418ea
Changed files (4)
lib/components/measurement_list/measurement_list.dart
@@ -0,0 +1,21 @@
+import 'package:blood_pressure_app/components/measurement_list/measurement_list_entry.dart';
+import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:flutter/material.dart';
+
+class MeasurementList extends StatelessWidget {
+  final List<BloodPressureRecord> entries;
+  
+  const MeasurementList({super.key, required this.entries});
+
+  @override
+  Widget build(BuildContext context) {
+    return ListView.builder(
+      itemCount: entries.length,
+      //separatorBuilder: (context, idx) => const Divider(),
+      itemBuilder: (context, idx) => MeasurementListRow(
+        record: entries[idx]
+      ),
+    );
+  }
+
+}
\ No newline at end of file
lib/components/measurement_list/measurement_list_entry.dart
@@ -0,0 +1,86 @@
+import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/settings_store.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:intl/intl.dart';
+import 'package:provider/provider.dart';
+
+// TODO: finish
+class MeasurementListRow extends StatelessWidget {
+  final BloodPressureRecord record;
+
+  const MeasurementListRow({super.key, required this.record});
+
+  @override
+  Widget build(BuildContext context) {
+    return Consumer<Settings>(
+      builder: (context, settings, child) {
+        final formatter = DateFormat(settings.dateFormatString);
+        return ExpansionTile(
+          // Leading color possible
+          title: buildRow(formatter),
+          childrenPadding: EdgeInsets.only(bottom: 10),
+          children: [
+            Row(
+              children: [
+                Text(formatter.format(record.creationTime), textAlign: TextAlign.right,),
+                const Spacer(),
+                const MeasurementItemMenu()
+              ],
+            ),
+           if (record.notes.isNotEmpty)
+             Align(
+               alignment: Alignment.centerLeft,
+               child: Text(record.notes),
+             )
+          ],
+        );
+      },
+    );
+  }
+
+  Row buildRow(DateFormat formatter) {
+    return Row(
+      children: [
+        Expanded(
+          flex: 3,
+          child: Text(record.systolic.toString()),
+        ),
+        Expanded(
+          flex: 3,
+          child: Text(record.diastolic.toString()),
+        ),
+        Expanded(
+          flex: 3,
+          child: Text(record.pulse.toString()),
+        ),
+      ]
+    );
+  }
+}
+
+class MeasurementItemMenu extends StatelessWidget {
+  const MeasurementItemMenu({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    final localizations = AppLocalizations.of(context)!;
+    return PopupMenuButton<MeasurementItemMenuOption>( // TODO: implement
+      itemBuilder: (context) => [
+        PopupMenuItem<MeasurementItemMenuOption>(
+          value: MeasurementItemMenuOption.edit,
+          child: Text(localizations.edit),
+        ),
+        PopupMenuItem<MeasurementItemMenuOption>(
+          value: MeasurementItemMenuOption.delete,
+          child: Text(localizations.delete),
+        ),
+      ],
+    );
+  }
+}
+
+enum MeasurementItemMenuOption {
+  edit,
+  delete
+}
\ No newline at end of file
lib/model/blood_pressure.dart
@@ -107,6 +107,10 @@ class BloodPressureRecord {
   final int? diastolic;
   final int? pulse;
   final String notes;
+  //TODO: when adding a color / needle pin for entries:
+  // - the whole row in the table can be with that bg color
+  // - add lots of test to make sure this doesn't break records
+  // - maybe even store independently
 
   BloodPressureRecord(DateTime creationTime, this.systolic, this.diastolic, this.pulse, this.notes) {
     this.creationTime = creationTime;
lib/screens/home.dart
@@ -1,5 +1,6 @@
+import 'package:blood_pressure_app/components/consistent_future_builder.dart';
 import 'package:blood_pressure_app/components/measurement_graph.dart';
-import 'package:blood_pressure_app/components/measurement_list.dart';
+import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:blood_pressure_app/screens/add_measurement.dart';
 import 'package:blood_pressure_app/screens/settings.dart';
@@ -9,6 +10,8 @@ import 'package:flutter/scheduler.dart';
 import 'package:flutter/services.dart';
 import 'package:provider/provider.dart';
 
+import '../components/measurement_list/measurement_list.dart';
+
 /// The only use of this variable is to avoid loading the AddMeasurementPage twice,
 /// when startWithAddMeasurementPage is active
 bool _appStart = true;
@@ -46,7 +49,25 @@ class AppHome extends StatelessWidget {
             padding: padding,
             child: Column(children: [
               const MeasurementGraph(),
-              Expanded(flex: 50, child: MeasurementList(context)),
+              Expanded(
+                flex: 50,
+                child: Consumer<BloodPressureModel>(
+                  builder: (context, model, child) {
+                    return Consumer<Settings>(
+                      builder: (context, settings, child) {
+                        return ConsistentFutureBuilder(
+                            future: model.getInTimeRange(settings.displayDataStart, settings.displayDataEnd),
+                            onData: (context, data) {
+                              return MeasurementList(
+                                  entries: data
+                              );
+                            }
+                        );
+                      },
+                    );
+                  },
+                )
+              ),
             ]),
           ),
         );