Commit 4daaec1
Changed files (7)
lib
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'),