main
 1import 'package:blood_pressure_app/components/color_picker.dart';
 2import 'package:blood_pressure_app/components/input_dialoge.dart';
 3import 'package:blood_pressure_app/model/horizontal_graph_line.dart';
 4import 'package:blood_pressure_app/model/storage/settings_store.dart';
 5import 'package:flutter/material.dart';
 6import 'package:blood_pressure_app/l10n/app_localizations.dart';
 7import 'package:provider/provider.dart';
 8
 9class GraphMarkingsScreen extends StatelessWidget {
10  const GraphMarkingsScreen({super.key});
11
12  // TODO: consider adding fullscreen dialoge for adding markings (like medicine)
13  @override
14  Widget build(BuildContext context) {
15    final localizations = AppLocalizations.of(context)!;
16     // IMPORTANT: When adding more option, like vertical lines, add navigation bar
17    return Scaffold(
18      appBar: AppBar(
19        forceMaterialTransparency: true,
20      ),
21      body: Center(child: Consumer<Settings>(
22        builder: (context, settings, child) {
23          final lines = settings.horizontalGraphLines.toList();
24          return ListView.builder(
25            itemCount: lines.length + 2, // support first and last row
26            itemBuilder: (context, i) {
27              if(i == 0) { // first row
28                return Container(
29                  padding: const EdgeInsets.all(10),
30                  child: DefaultTextStyle.merge(
31                    child: Text(localizations.horizontalLines),
32                    style: Theme.of(context).textTheme.headlineLarge,
33                  ),
34                );
35              }
36              if (i > lines.length) { // last row
37                return ListTile(
38                  leading: const Icon(Icons.add),
39                  title: Text(localizations.addLine),
40                  onTap: () async {
41                    final color = await showColorPickerDialog(context);
42                    if (!context.mounted) return;
43                    final height = await showNumberInputDialoge(context, hintText: localizations.linePositionY);
44
45                    if (color == null || height == null) return;
46                    lines.add(HorizontalGraphLine(color, height.round()));
47                    settings.horizontalGraphLines = lines;
48                  },
49                );
50              }
51              return ListTile(
52                leading: Container(
53                  width: 40.0,
54                  height: 40.0,
55                  decoration: BoxDecoration(
56                    color: lines[i-1].color,
57                    shape: BoxShape.circle,
58                  ),
59                ),
60                title: Text(lines[i-1].height.toString()),
61                trailing: IconButton(
62                  icon: const Icon(Icons.delete),
63                  onPressed: () {
64                    lines.removeAt(i-1);
65                    settings.horizontalGraphLines = lines;
66                  },
67                ),
68              );
69            },
70          );
71        },),
72      ),
73    );
74  }
75}