Commit 1d85b52

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-08-20 13:48:55
integrate new measurement graph in home page
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent c609f26
Changed files (3)
app
app/lib/features/statistics/measurement_graph.dart
@@ -266,17 +266,17 @@ class MeasurementGraph extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) => SizedBox(
-      height: height,
-      child: Padding(
-        padding: const EdgeInsets.only(right: 16, left: 6, top: 22),
-        child: Column(
-          children: [
-            _LineChart(height: height - 100),
-            const IntervalPicker(type: IntervallStoreManagerLocation.mainPage,),
-          ],
-        ),
+    height: height,
+    child: Padding(
+      padding: const EdgeInsets.only(right: 16, left: 6, top: 22),
+      child: Column(
+        children: [
+          _LineChart(height: height - 100),
+          const IntervalPicker(type: IntervallStoreManagerLocation.mainPage,),
+        ],
       ),
-    );
+    ),
+  );
 }
 
 extension _Sum<T> on List<T> {
app/lib/features/statistics/value_graph.dart
@@ -6,52 +6,11 @@ import 'package:blood_pressure_app/model/storage/storage.dart';
 import 'package:blood_pressure_app/screens/loading_screen.dart';
 import 'package:collection/collection.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:health_data_store/health_data_store.dart';
 import 'package:intl/intl.dart';
+import 'package:provider/provider.dart';
 
-void main() => runApp(Tmp());
-
-class Tmp extends StatelessWidget {
-  const Tmp({super.key});
-
-  @override
-  Widget build(BuildContext context) => MaterialApp(
-    theme: ThemeData.dark(),
-    home: Scaffold(
-      appBar: AppBar(),
-      body: ClipRect(
-        child: SizedBox(
-          height: 256,
-          width: 1000,
-          child: BloodPressureValueGraph(
-            settings: Settings(
-              animationSpeed: 1000,
-              drawRegressionLines: true,
-              horizontalGraphLines: [
-                HorizontalGraphLine(Colors.blue, 117),
-                HorizontalGraphLine(Colors.red, 35)
-              ],
-            ),
-            records: [
-              BloodPressureRecord(time: DateTime(2000), sys: Pressure.mmHg(123), dia: Pressure.mmHg(80) , pul: 40),
-              BloodPressureRecord(time: DateTime(2001), sys: Pressure.mmHg(140), pul: 77),
-              BloodPressureRecord(time: DateTime(2001, 6), dia: Pressure.mmHg(111)),
-              BloodPressureRecord(time: DateTime(2002), sys: Pressure.mmHg(100)),
-              BloodPressureRecord(time: DateTime(2002, 2), pul: 60,),
-              BloodPressureRecord(time: DateTime(2003), sys: Pressure.mmHg(123), dia: Pressure.mmHg(93)),
-              BloodPressureRecord(time: DateTime(2003, 2), pul: 140,),
-            ],
-            colors: [
-              /*Note(time: DateTime(2000), note: 'no color'),
-              Note(time: DateTime(2001), color: Colors.teal.value),
-              Note(time: DateTime(2003, 2), color: Colors.purple.value),*/
-            ]
-          ),
-        ),
-      ),
-    ),
-  );
-}
 
 /// A graph of [BloodPressureRecord] values.
 ///
@@ -59,14 +18,10 @@ class Tmp extends StatelessWidget {
 /// to put all data on one graph
 class BloodPressureValueGraph extends StatelessWidget {
   /// Create a new graph of [BloodPressureRecord] values.
-  BloodPressureValueGraph({super.key,
-    required this.settings,
+  const BloodPressureValueGraph({super.key, // TODO: intakes ??
     required this.records,
     required this.colors,
-  }): assert(records.sysGraph().length >= 2
-      || records.diaGraph().length >= 2
-      || records.pulGraph().length >= 2),
-    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
+  });
 
   /// Data to draw lines and determine decorations from.
   ///
@@ -76,27 +31,37 @@ class BloodPressureValueGraph extends StatelessWidget {
   /// Notes that should render as colored lines if present.
   final List<Note> colors;
 
-  /// Settings to determine style and behavior.
-  final Settings settings;
-
   @override
-  Widget build(BuildContext context) => Padding(
-    padding: const EdgeInsets.only(top: 4.0),
-    child: TweenAnimationBuilder(
-      tween: Tween(begin: 0.0, end: 1.0),
-      duration: Duration(milliseconds: 8 * settings.animationSpeed),
-      builder: (BuildContext context, double value, Widget? child) => CustomPaint(
-        painter: _ValueGraphPainter(
-          brightness: Theme.of(context).brightness,
-          settings: settings,
-          labelStyle: Theme.of(context).textTheme.bodySmall ?? TextStyle(),
-          records: records,
-          colors: colors,
-          progress: value,
+  Widget build(BuildContext context) {
+    if (records.sysGraph().length <= 2
+      || records.diaGraph().length <= 2
+      || records.pulGraph().length <= 2) {
+      return Center(
+        child: Text(AppLocalizations.of(context)!.errNotEnoughDataToGraph),
+      );
+    }
+    final r = records.toList();
+    r.sort((a, b) => a.time.compareTo(b.time));
+    final settings = context.watch<Settings>();
+    return Padding(
+      padding: const EdgeInsets.only(top: 4.0),
+      child: TweenAnimationBuilder(
+        tween: Tween(begin: 0.0, end: 1.0),
+        curve: Curves.slowMiddle,
+        duration: Duration(milliseconds: settings.animationSpeed),
+        builder: (BuildContext context, double value, Widget? child) => CustomPaint(
+          painter: _ValueGraphPainter(
+            brightness: Theme.of(context).brightness,
+            settings: settings,
+            labelStyle: Theme.of(context).textTheme.bodySmall ?? TextStyle(),
+            records: r,
+            colors: colors,
+            progress: value,
+          ),
         ),
       ),
-    ),
-  );
+    );
+  }
 }
 
 class _ValueGraphPainter extends CustomPainter {
@@ -187,8 +152,8 @@ class _ValueGraphPainter extends CustomPainter {
       final duration = range.duration ~/ bottomLabelCount;
       format = (){
         switch (duration) {
-          case < const Duration(hours: 8):
-            return DateFormat('H:m');
+          case < const Duration(hours: 4):
+            return DateFormat('H:m EEE');
           case < const Duration(days: 1):
             return DateFormat('EEE');
           case < const Duration(days: 5):
app/lib/screens/home_screen.dart
@@ -1,9 +1,13 @@
+import 'dart:collection';
+
 import 'package:blood_pressure_app/data_util/blood_pressure_builder.dart';
+import 'package:blood_pressure_app/data_util/display_interval_picker.dart';
 import 'package:blood_pressure_app/data_util/entry_context.dart';
 import 'package:blood_pressure_app/data_util/repository_builder.dart';
 import 'package:blood_pressure_app/features/measurement_list/compact_measurement_list.dart';
 import 'package:blood_pressure_app/features/measurement_list/measurement_list.dart';
 import 'package:blood_pressure_app/features/statistics/measurement_graph.dart';
+import 'package:blood_pressure_app/features/statistics/value_graph.dart';
 import 'package:blood_pressure_app/model/storage/intervall_store.dart';
 import 'package:blood_pressure_app/model/storage/settings_store.dart';
 import 'package:blood_pressure_app/screens/settings_screen.dart';
@@ -48,10 +52,33 @@ class AppHome extends StatelessWidget {
             padding: const EdgeInsets.only(top: 20),
             child: Consumer<IntervallStoreManager>(builder: (context, intervalls, child) =>
               Column(children: [
-                /*MeasurementListRow(
-                  settings: Settings(), data: (BloodPressureRecord(time: DateTime(2023),
-                  sys:Pressure.mmHg(1), dia: Pressure.mmHg(2), pul: 3), Note(time: DateTime(2023), note: 'testTxt',), [])),*/
-                const MeasurementGraph(),
+                SizedBox(
+                  height: 290,
+                  child: Padding(
+                    padding: const EdgeInsets.only(right: 16, left: 6, top: 22),
+                    child: Column(
+                      children: [
+                        SizedBox(
+                          height: 190,
+                          width: MediaQuery.of(context).size.width,
+                          child: RepositoryBuilder<Note, NoteRepository>(
+                            rangeType: IntervallStoreManagerLocation.mainPage,
+                            onData: (context, List<Note> notes) => BloodPressureBuilder(
+                              rangeType: IntervallStoreManagerLocation.mainPage,
+                              onData: (BuildContext context, UnmodifiableListView<BloodPressureRecord> records) => BloodPressureValueGraph(
+                                records: records,
+                                colors: notes,
+                              ),
+                            ),
+                          ),
+                        ),
+                        const IntervalPicker(
+                          type: IntervallStoreManagerLocation.mainPage,
+                        ),
+                      ],
+                    ),
+                  ),
+                ),
                 Expanded(
                   child: BloodPressureBuilder(
                     rangeType: IntervallStoreManagerLocation.mainPage,