Commit 8820aa6
Changed files (4)
lib
components
measurement_list
model
screens
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
+ );
+ }
+ );
+ },
+ );
+ },
+ )
+ ),
]),
),
);