Commit 4daaec1

derdilla <derdilla06@gmail.com>
2023-06-16 22:21:26
add export page with advanced settings
1 parent 0e4d797
lib/l10n/app_de.arb
@@ -77,8 +77,13 @@
   "data": "Daten",
   "exportImport": "Exportieren / Importieren",
   "exportFormat": "Exportformat",
-  "csv": "csv",
-  "pdf": "pdf",
+  "exportMimeType": "Export MIME typ",
+  "csv": "CSV",
+  "pdf": "PDF",
+  "text": "Text",
+  "other": "Anderes",
+  "fieldDelimiter": "Feld separator",
+  "textDelimiter": "Textbegrenzung",
   "useExportCompatability": "Kompatibler Export",
   "useExportCompatabilityDesc": "Signalisiert Export als Text",
   "export": "Exportieren",
lib/l10n/app_en.arb
@@ -77,8 +77,13 @@
   "data": "data",
   "exportImport": "export / import",
   "exportFormat": "export format",
-  "csv": "csv",
-  "pdf": "pdf",
+  "exportMimeType": "export MIME type",
+  "csv": "CSV",
+  "pdf": "PDF",
+  "text": "text",
+  "other": "other",
+  "fieldDelimiter": "field delimiter",
+  "textDelimiter": "text delimiter",
   "useExportCompatability": "compatability export",
   "useExportCompatabilityDesc": "sets export mime type to text",
   "export": "export",
lib/model/export_import.dart
@@ -1,17 +1,12 @@
 
-import 'dart:typed_data';
-
 import 'package:intl/intl.dart';
 
-import 'blood_pressure.dart';
-
 class CSVExportSettings {
   final DateFormat dateFormatter;
   final String? fieldDelimiter;
   final String? textDelimiter;
-  final String? textEndDelimiter;
 
-  CSVExportSettings(this.dateFormatter, this.fieldDelimiter, this.textDelimiter, this.textEndDelimiter);
+  CSVExportSettings(this.dateFormatter, this.fieldDelimiter, this.textDelimiter);
 }
 
 class ExportFormat {
lib/model/ram_only_implementations.dart
@@ -1,6 +1,7 @@
 import 'dart:collection';
 
 import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/export_import.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
 import 'package:flutter/material.dart';
 
@@ -113,6 +114,7 @@ class RamSettings extends ChangeNotifier implements Settings {
   bool _useExportCompatability = false;
   bool _validateInputs = true;
   int _graphTitlesCount = 5;
+  ExportFormat _exportFormat = ExportFormat.csv;
 
   RamSettings() {
     _accentColor = createMaterialColor(0xFF009688);
@@ -333,6 +335,15 @@ class RamSettings extends ChangeNotifier implements Settings {
     notifyListeners();
   }
 
+  @override
+  ExportFormat get exportFormat => _exportFormat;
+
+  @override
+  set exportFormat(ExportFormat value) {
+    _exportFormat = value;
+    notifyListeners();
+  }
+
   @override
   void changeStepSize(int value) {
     graphStepSize = value;
lib/model/settings_store.dart
@@ -1,5 +1,6 @@
 import 'package:blood_pressure_app/model/blood_pressure.dart';
 import 'package:blood_pressure_app/model/export_import.dart';
+import 'package:file_saver/file_saver.dart' show MimeType;
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:shared_preferences/shared_preferences.dart';
@@ -176,15 +177,6 @@ class Settings extends ChangeNotifier {
     notifyListeners();
   }
 
-  bool get useExportCompatability {
-    return _prefs.getBool('useExportCompatability') ?? false;
-  }
-
-  set useExportCompatability(bool useExportCompatability) {
-    _prefs.setBool('useExportCompatability', useExportCompatability);
-    notifyListeners();
-  }
-
   double get iconSize {
     return _prefs.getInt('iconSize')?.toDouble() ?? 30;
   }
@@ -284,10 +276,66 @@ class Settings extends ChangeNotifier {
   ExportFormat get exportFormat {
     return ExportFormat(_prefs.getInt('exportFormat') ?? 0);
   }
+  
   set exportFormat(ExportFormat format) {
     _prefs.setInt('exportFormat', format.code);
     notifyListeners();
   }
+  
+  String get csvFieldDelimiter {
+    return _prefs.getString('csvFieldDelimiter') ?? ',';
+  }
+  
+  set csvFieldDelimiter(String value) {
+    _prefs.setString('csvFieldDelimiter', value);
+    notifyListeners();
+  }
+
+  String get csvTextDelimiter {
+    return _prefs.getString('csvTextDelimiter') ?? '"';
+  }
+
+  set csvTextDelimiter(String value) {
+    _prefs.setString('csvTextDelimiter', value);
+    notifyListeners();
+  }
+
+  MimeType get exportMimeType {
+    switch (_prefs.getInt('exportMimeType') ?? 0) {
+      case 0:
+        return MimeType.csv;
+      case 1:
+        return MimeType.text;
+      case 2:
+        return MimeType.pdf;
+      case 3:
+        return MimeType.other;
+      default:
+        throw UnimplementedError();
+    }
+  }
+  set exportMimeType(MimeType value) {
+    switch (value) {
+      case MimeType.csv:
+        _prefs.setInt('exportMimeType', 0);
+        break;
+      case MimeType.text:
+        _prefs.setInt('exportMimeType', 1);
+        break;
+      case MimeType.pdf:
+        _prefs.setInt('exportMimeType', 2);
+        break;
+      case MimeType.other:
+        _prefs.setInt('exportMimeType', 3);
+        break;
+      default:
+        throw UnimplementedError();
+    }
+    notifyListeners();
+  }
+
+
+
 }
 
 class TimeStep {
lib/screens/subsettings/export_import_screen.dart
@@ -2,6 +2,7 @@
 import 'package:blood_pressure_app/components/settings_widgets.dart';
 import 'package:blood_pressure_app/model/export_import.dart';
 import 'package:blood_pressure_app/model/settings_store.dart';
+import 'package:file_saver/file_saver.dart' show MimeType;
 import 'package:flutter/material.dart';
 import 'package:flutter_gen/gen_l10n/app_localizations.dart';
 import 'package:provider/provider.dart';
@@ -12,17 +13,56 @@ class ExportImportScreen extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
-      appBar: AppBar(title: Text(AppLocalizations.of(context)!.exportImport),),
+      appBar: AppBar(
+        title: Text(AppLocalizations.of(context)!.exportImport),
+        backgroundColor: Theme.of(context).primaryColor,
+      ),
       body: Consumer<Settings>(builder: (context, settings, child) {
         List<Widget> modeSpecificSettings = [];
         if (settings.exportFormat == ExportFormat.csv) {
-          modeSpecificSettings = [];
+          modeSpecificSettings = [
+            InputSettingsTile(
+              title: Text(AppLocalizations.of(context)!.fieldDelimiter),
+              inputWidth: 40,
+              initialValue: settings.csvFieldDelimiter,
+              onEditingComplete: (value) {
+                if (value != null) {
+                  settings.csvFieldDelimiter = value;
+                }
+              },
+            ),
+            InputSettingsTile(
+              title: Text(AppLocalizations.of(context)!.textDelimiter),
+              inputWidth: 40,
+              initialValue: settings.csvTextDelimiter,
+              onEditingComplete: (value) {
+                if (value != null) {
+                  settings.csvTextDelimiter = value;
+                }
+              },
+            )
+          ];
         }
 
         List<Widget> options = [
+          DropDownSettingsTile<MimeType>(
+            key: const Key('exportMimeType'),
+            title: Text(AppLocalizations.of(context)!.exportMimeType),
+            value: settings.exportMimeType,
+            items: [
+              DropdownMenuItem(value: MimeType.csv, child: Text(AppLocalizations.of(context)!.csv)),
+              DropdownMenuItem(value: MimeType.text, child: Text(AppLocalizations.of(context)!.text)),
+              DropdownMenuItem(value: MimeType.pdf, child: Text(AppLocalizations.of(context)!.pdf)),
+              DropdownMenuItem(value: MimeType.other, child: Text(AppLocalizations.of(context)!.other)),
+            ],
+            onChanged: (MimeType? value) {
+              if (value != null) {
+                settings.exportMimeType = value;
+              }
+            },
+          ),
           DropDownSettingsTile<ExportFormat>(
             key: const Key('exportFormat'),
-            leading: const Icon(Icons.error),
             title: Text(AppLocalizations.of(context)!.exportFormat),
             value: settings.exportFormat,
             items: [
lib/screens/settings.dart
@@ -2,6 +2,7 @@ import 'package:blood_pressure_app/components/settings_widgets.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/subsettings/enter_timeformat.dart';
+import 'package:blood_pressure_app/screens/subsettings/export_import_screen.dart';
 import 'package:blood_pressure_app/screens/subsettings/warn_about.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
@@ -243,15 +244,16 @@ class SettingsPage extends StatelessWidget {
             SettingsSection(
               title: Text(AppLocalizations.of(context)!.data),
               children: [
-                SwitchSettingsTile(
-                    key: const Key('useExportCompatability'),
-                    initialValue: settings.useExportCompatability,
-                    title: Text(AppLocalizations.of(context)!.useExportCompatability),
-                    description: Text(AppLocalizations.of(context)!.useExportCompatabilityDesc),
-                    leading: const Icon(Icons.support),
-                    onToggle: (value) {
-                      settings.useExportCompatability = value;
-                    }),
+                SettingsTile(
+                    title: const Text('EXPORT'),
+                    trailing: const Icon(Icons.arrow_forward_ios),
+                    onPressed: (context) {
+                      Navigator.push(
+                        context,
+                        MaterialPageRoute(builder: (context) => const ExportImportScreen()),
+                      );
+                    }
+                ),
                 SettingsTile(
                   key: const Key('export'),
                   title: Text(AppLocalizations.of(context)!.export),
@@ -264,7 +266,7 @@ class SettingsPage extends StatelessWidget {
                       ScaffoldMessenger.of(context)
                           .showSnackBar(SnackBar(content: Text(AppLocalizations.of(context)!.error(msg))));
                     }
-                  }, exportAsText: settings.useExportCompatability),
+                  }, exportAsText: false),
                 ),
                 SettingsTile(
                   key: const Key('import'),