Commit 6eb3668

derdilla <derdilla06@gmail.com>
2023-07-31 15:35:36
add permanent storage for export formats
1 parent 547609b
Changed files (2)
lib/model/blood_pressure.dart
@@ -31,9 +31,7 @@ class BloodPressureModel extends ChangeNotifier {
   // factory method, to allow for async constructor
   static Future<BloodPressureModel> create({String? dbPath, bool isFullPath = false}) async {
     if (Platform.isWindows || Platform.isLinux) {
-      // Initialize FFI
       sqfliteFfiInit();
-      // Change the default factory
       databaseFactory = databaseFactoryFfi;
     }
 
lib/model/export_options.dart
@@ -1,10 +1,54 @@
+import 'dart:collection';
+
 import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:function_tree/function_tree.dart';
 import 'package:intl/intl.dart';
+import 'package:path/path.dart';
+import 'package:sqflite/sqflite.dart';
 
 class ExportConfigurationModel {
-  List<ExportColumn> getDefaultFormates(Settings settings) => [
+  static ExportConfigurationModel? _instance;
+
+  final Settings settings;
+  final AppLocalizations localizations;
+  late final Database _database;
+  
+  final List<ExportColumn> _availableFormats = [];
+
+  ExportConfigurationModel._create(this.settings, this.localizations);
+  Future<void> _asyncInit(String? dbPath, bool isFullPath) async {
+    dbPath ??= await getDatabasesPath();
+    if (dbPath != inMemoryDatabasePath && !isFullPath) {
+      dbPath = join(dbPath, 'config.db');
+    }
+
+    _database = await openDatabase(
+      dbPath,
+      onCreate: (db, version) {
+        return db.execute(
+            'CREATE TABLE exportStrings(internalColumnName STRING PRIMARY KEY, columnTitle STRING, formatPattern STRING)');
+      },
+      version: 1,
+    );
+
+    final existingDbEntries = await _database.rawQuery('SELECT * FROM exportStrings');
+    for (final e in existingDbEntries) {
+      _availableFormats.add(ExportColumn(internalColumnName: e['internalColumnName'].toString(),
+          columnTitle: e['columnTitle'].toString(), formatPattern: e['formatPattern'].toString()));
+    }
+    _availableFormats.addAll(_getDefaultFormates());
+  }
+  static Future<ExportConfigurationModel> get(Settings settings, AppLocalizations localizations, {String? dbPath, bool isFullPath = false}) async {
+    if (_instance == null) {
+      _instance = ExportConfigurationModel._create(settings, localizations);
+      await _instance!._asyncInit(dbPath, isFullPath);
+    }
+    return _instance!;
+  }
+
+  List<ExportColumn> _getDefaultFormates() => [
     ExportColumn(internalColumnName: 'timestampUnixMs', columnTitle: 'Unix timestamp', formatPattern: r'$TIMESTAMP'),
     ExportColumn(internalColumnName: 'formattedTimestamp', columnTitle: 'Time', formatPattern: '\$FORMAT{\$TIMESTAMP,${settings.dateFormatString}}'),
     ExportColumn(internalColumnName: 'systolic', columnTitle: 'Systolic', formatPattern: r'$SYS'),
@@ -12,6 +56,17 @@ class ExportConfigurationModel {
     ExportColumn(internalColumnName: 'pulse', columnTitle: 'Pulse', formatPattern: r'$PUL'),
     ExportColumn(internalColumnName: 'notes', columnTitle: 'Notes', formatPattern: r'$NOTE'),
   ];
+
+  void add(ExportColumn format) {
+    _availableFormats.add(format);
+    _database.insert('exportStrings', {
+      'internalColumnName': format.internalColumnName,
+      'columnTitle': format.columnTitle,
+      'formatPattern': format.formatPattern
+    },);
+  }
+
+  UnmodifiableListView<ExportColumn> get availableFormats => UnmodifiableListView(_availableFormats);
 }
 
 class ExportColumn {
@@ -84,4 +139,9 @@ class ExportColumn {
 
     return fieldContents;
   }
+
+  @override
+  String toString() {
+    return 'ExportColumn{internalColumnName: $internalColumnName, columnTitle: $columnTitle, formatPattern: $formatPattern}';
+  }
 }
\ No newline at end of file