Commit 9efb8c5
Changed files (9)
app
lib
data_util
features
settings
model
app/lib/data_util/display_interval_picker.dart → app/lib/data_util/interval_picker.dart
@@ -63,8 +63,8 @@ class IntervalPicker extends StatelessWidget {
}
},
items: [
- for (final e in TimeStep.options)
- DropdownMenuItem(value: e, child: Text(e.getName(loc))),
+ for (final TimeStep e in TimeStep.values)
+ DropdownMenuItem(value: e, child: Text(e.localize(loc))),
]
),
),
app/lib/features/settings/export_import_screen.dart
@@ -1,5 +1,5 @@
import 'package:blood_pressure_app/components/disabled.dart';
-import 'package:blood_pressure_app/data_util/display_interval_picker.dart';
+import 'package:blood_pressure_app/data_util/interval_picker.dart';
import 'package:blood_pressure_app/features/export_import/active_field_customization.dart';
import 'package:blood_pressure_app/features/export_import/export_button_bar.dart';
import 'package:blood_pressure_app/features/export_import/export_warn_banner.dart';
app/lib/model/export_import/import_field_type.dart
@@ -23,23 +23,14 @@ enum RowDataFieldType {
/// Guarantees [List<(String medicineDesignation, double dosisMg)>] is returned.
intakes;
- /// Selection of a displayable string from [localizations].
- String localize(AppLocalizations localizations) {
- switch(this) {
- case RowDataFieldType.timestamp:
- return localizations.timestamp;
- case RowDataFieldType.sys:
- return localizations.sysLong;
- case RowDataFieldType.dia:
- return localizations.diaLong;
- case pul:
- return localizations.pulLong;
- case RowDataFieldType.notes:
- return localizations.notes;
- case RowDataFieldType.color:
- return localizations.color;
- case RowDataFieldType.intakes:
- return localizations.intakes;
- }
- }
+ /// Select the matching string from [localizations].
+ String localize(AppLocalizations localizations) => switch(this) {
+ timestamp => localizations.timestamp,
+ sys => localizations.sysLong,
+ dia => localizations.diaLong,
+ pul => localizations.pulLong,
+ notes => localizations.notes,
+ color => localizations.color,
+ intakes => localizations.intakes,
+ };
}
app/lib/model/export_import/record_formatter.dart
@@ -42,37 +42,37 @@ class ScriptedFormatter implements Formatter {
@override
(RowDataFieldType, dynamic)? decode(String formattedRecord) {
if (restoreAbleType == null) return null;
-
final text = formattedRecord.substring(_padLeft!, formattedRecord.length - _padRight!);
- final value = (){switch(restoreAbleType!) {
- case RowDataFieldType.timestamp:
- final num = int.tryParse(text);
- if (num != null) return DateTime.fromMillisecondsSinceEpoch(num);
- return null;
- case RowDataFieldType.sys:
- case RowDataFieldType.dia:
- case RowDataFieldType.pul:
- return int.tryParse(text);
- case RowDataFieldType.notes:
- return text;
- case RowDataFieldType.color:
- final num = int.tryParse(text);
- if (num != null) return num;
- try {
- return MeasurementNeedlePin.fromMap(jsonDecode(text)).color.value;
- } on FormatException {
- return null;
- } on TypeError {
- return null;
- }
- case RowDataFieldType.intakes:
- return NativeColumn.intakes.decode(text);
- }}();
+ final value = switch(restoreAbleType!) {
+ RowDataFieldType.timestamp => _decodeTimestamp(text),
+ RowDataFieldType.sys || RowDataFieldType.dia || RowDataFieldType.pul => int.tryParse(text),
+ RowDataFieldType.notes => text,
+ RowDataFieldType.color => _decodeColor(text),
+ RowDataFieldType.intakes => NativeColumn.intakes.decode(text),
+ };
if (value != null) return (restoreAbleType!, value);
return null;
}
+ DateTime? _decodeTimestamp(String text) {
+ final num = int.tryParse(text);
+ if (num != null) return DateTime.fromMillisecondsSinceEpoch(num);
+ return null;
+ }
+
+ int? _decodeColor(String text) {
+ final num = int.tryParse(text);
+ if (num != null) return num;
+ try {
+ return MeasurementNeedlePin.fromMap(jsonDecode(text)).color.value;
+ } on FormatException {
+ return null;
+ } on TypeError {
+ return null;
+ }
+ }
+
@override
String encode(BloodPressureRecord record, Note note, List<MedicineIntake> intakes) {
var fieldContents = pattern;
app/lib/model/storage/convert_util.dart
@@ -92,22 +92,12 @@ class ConvertUtil {
}
/// Try to recreate the theme mode stored as a integer.
- static ThemeMode? parseThemeMode(dynamic value) {
- final int? intValue = ConvertUtil.parseInt(value);
- switch(intValue) {
- case null:
- return null;
- case 0:
- return ThemeMode.system;
- case 1:
- return ThemeMode.dark;
- case 2:
- return ThemeMode.light;
- default:
- assert(false);
- return null;
- }
- }
+ static ThemeMode? parseThemeMode(value) => switch(ConvertUtil.parseInt(value)) {
+ 0 => ThemeMode.system,
+ 1 => ThemeMode.dark,
+ 2 => ThemeMode.light,
+ _ => null,
+ };
/// Does its best attempt at parsing a time in arbitrary format.
static DateTime? parseTime(dynamic time) {
app/lib/model/storage/export_columns_store.dart
@@ -14,10 +14,8 @@ class ExportColumnsManager extends ChangeNotifier {
switch (c['t']) {
case 0:
manager.addOrUpdate(UserColumn.explicit(c['id'], c['csvTitle'], c['formatString']));
- break;
case 1:
manager.addOrUpdate(TimeColumn.explicit(c['id'], c['csvTitle'], c['formatPattern']));
- break;
default:
assert(false, 'Unexpected column type ${c['t']}.');
}
app/lib/model/storage/intervall_store.dart
@@ -68,54 +68,38 @@ class IntervallStorage extends ChangeNotifier {
void moveDataRangeByStep(int directionalStep) {
final oldStart = currentRange.start;
final oldEnd = currentRange.end;
- switch (stepSize) {
- case TimeStep.day:
- currentRange = DateRange(
- start: oldStart.add(Duration(days: directionalStep)),
- end: oldEnd.add(Duration(days: directionalStep)),
- );
- break;
- case TimeStep.week:
- case TimeStep.last7Days:
- currentRange = DateRange(
- start: oldStart.add(Duration(days: directionalStep * 7)),
- end: oldEnd.add(Duration(days: directionalStep * 7)),
- );
- break;
- case TimeStep.month:
- currentRange = DateRange(
- // No fitting Duration: wraps correctly according to doc
- start: oldStart.copyWith(month: oldStart.month + directionalStep),
- end: oldEnd.copyWith(month: oldEnd.month + directionalStep),
- );
- break;
- case TimeStep.year:
- currentRange = DateRange(
- // No fitting Duration: wraps correctly according to doc
- start: oldStart.copyWith(year: oldStart.year + directionalStep),
- end: oldEnd.copyWith(year: oldEnd.year + directionalStep),
- );
- break;
- case TimeStep.lifetime:
- currentRange = DateRange(
- start: DateTime.fromMillisecondsSinceEpoch(1),
- end: DateTime.now().copyWith(hour: 23, minute: 59, second: 59),
- );
- break;
- case TimeStep.last30Days:
- currentRange = DateRange(
- start: oldStart.add(Duration(days: directionalStep * 30)),
- end: oldEnd.add(Duration(days: directionalStep * 30)),
- );
- break;
- case TimeStep.custom:
- final step = oldEnd.difference(oldStart) * directionalStep;
- currentRange = DateRange(
- start: oldStart.add(step),
- end: oldEnd.add(step),
- );
- break;
- }
+ currentRange = switch (stepSize) {
+ TimeStep.day => DateRange(
+ start: oldStart.add(Duration(days: directionalStep)),
+ end: oldEnd.add(Duration(days: directionalStep)),
+ ),
+ TimeStep.week || TimeStep.last7Days => DateRange(
+ start: oldStart.add(Duration(days: directionalStep * 7)),
+ end: oldEnd.add(Duration(days: directionalStep * 7)),
+ ),
+ TimeStep.month => DateRange(
+ // No fitting Duration: wraps correctly according to doc
+ start: oldStart.copyWith(month: oldStart.month + directionalStep),
+ end: oldEnd.copyWith(month: oldEnd.month + directionalStep),
+ ),
+ TimeStep.year => DateRange(
+ // No fitting Duration: wraps correctly according to doc
+ start: oldStart.copyWith(year: oldStart.year + directionalStep),
+ end: oldEnd.copyWith(year: oldEnd.year + directionalStep),
+ ),
+ TimeStep.lifetime => DateRange(
+ start: DateTime.fromMillisecondsSinceEpoch(1),
+ end: DateTime.now().copyWith(hour: 23, minute: 59, second: 59),
+ ),
+ TimeStep.last30Days => DateRange(
+ start: oldStart.add(Duration(days: directionalStep * 30)),
+ end: oldEnd.add(Duration(days: directionalStep * 30)),
+ ),
+ TimeStep.custom => DateRange(
+ start: oldStart.add(oldEnd.difference(oldStart) * directionalStep),
+ end: oldEnd.add(oldEnd.difference(oldStart) * directionalStep),
+ ),
+ };
}
DateRange _getMostRecentDisplayIntervall() {
@@ -168,74 +152,43 @@ enum TimeStep {
/// Recreate a TimeStep from a number created with [TimeStep.serialize].
factory TimeStep.deserialize(value) {
final int? intValue = ConvertUtil.parseInt(value);
- if (intValue == null) return TimeStep.last7Days;
-
- switch (intValue) {
- case 0:
- return TimeStep.day;
- case 1:
- return TimeStep.month;
- case 2:
- return TimeStep.year;
- case 3:
- return TimeStep.lifetime;
- case 4:
- return TimeStep.week;
- case 5:
- return TimeStep.last7Days;
- case 6:
- return TimeStep.last30Days;
- case 7:
- return TimeStep.custom;
- default:
- assert(false);
- return TimeStep.last7Days;
- }
+ assert(intValue == null || intValue >= 0 && intValue <= 7);
+ return switch (intValue) {
+ null => TimeStep.last7Days,
+ 0 => TimeStep.day,
+ 1 => TimeStep.month,
+ 2 => TimeStep.year,
+ 3 => TimeStep.lifetime,
+ 4 => TimeStep.week,
+ 5 => TimeStep.last7Days,
+ 6 => TimeStep.last30Days,
+ 7 => TimeStep.custom,
+ _ => TimeStep.last7Days,
+ };
}
- static const options = [TimeStep.day, TimeStep.week, TimeStep.month, TimeStep.year, TimeStep.lifetime, TimeStep.last7Days, TimeStep.last30Days, TimeStep.custom];
-
- String getName(AppLocalizations localizations) {
- switch (this) {
- case TimeStep.day:
- return localizations.day;
- case TimeStep.month:
- return localizations.month;
- case TimeStep.year:
- return localizations.year;
- case TimeStep.lifetime:
- return localizations.lifetime;
- case TimeStep.week:
- return localizations.week;
- case TimeStep.last7Days:
- return localizations.last7Days;
- case TimeStep.last30Days:
- return localizations.last30Days;
- case TimeStep.custom:
- return localizations.custom;
- }
- }
+ /// Select a displayable string from [localizations].
+ String localize(AppLocalizations localizations) => switch (this) {
+ TimeStep.day => localizations.day,
+ TimeStep.month => localizations.month,
+ TimeStep.year => localizations.year,
+ TimeStep.lifetime => localizations.lifetime,
+ TimeStep.week => localizations.week,
+ TimeStep.last7Days => localizations.last7Days,
+ TimeStep.last30Days => localizations.last30Days,
+ TimeStep.custom => localizations.custom,
+ };
- int serialize() {
- switch (this) {
- case TimeStep.day:
- return 0;
- case TimeStep.month:
- return 1;
- case TimeStep.year:
- return 2;
- case TimeStep.lifetime:
- return 3;
- case TimeStep.week:
- return 4;
- case TimeStep.last7Days:
- return 5;
- case TimeStep.last30Days:
- return 6;
- case TimeStep.custom:
- return 7;
- }
- }
+ int serialize() =>switch (this) {
+ TimeStep.day => 0,
+ TimeStep.month => 1,
+ TimeStep.year => 2,
+ TimeStep.lifetime => 3,
+ TimeStep.week => 4,
+ TimeStep.last7Days => 5,
+ TimeStep.last30Days => 6,
+ TimeStep.custom => 7,
+ };
}
/// Class that stores the interval objects that are needed in the app and provides named access to them.
app/lib/screens/home_screen.dart
@@ -1,8 +1,8 @@
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/interval_picker.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';
app/lib/screens/statistics_screen.dart
@@ -1,5 +1,5 @@
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/interval_picker.dart';
import 'package:blood_pressure_app/features/statistics/blood_pressure_distribution.dart';
import 'package:blood_pressure_app/model/blood_pressure_analyzer.dart';
import 'package:blood_pressure_app/model/storage/intervall_store.dart';