Commit ca94c47

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-10-07 16:04:16
add widget disabling
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent af431ee
Changed files (3)
lib
components
model
screens
lib/components/diabled.dart
@@ -0,0 +1,32 @@
+
+import 'package:flutter/material.dart';
+
+/// A widget that visually indicates that it's subtree is disabled and block interaction with it.
+class Disabled extends StatelessWidget {
+  /// Create a widget that visually indicates that it's subtree is disabled and blocks interaction with it.
+  ///
+  /// If [disabled] is true the [child]s opacity gets reduced and interaction gets disabled. This widget has no effect
+  /// when [disabled] is false.
+  const Disabled({required this.child, this.disabled = true, this.ignoring = true, super.key});
+
+  final Widget child;
+  /// Whether this widget has an effect.
+  final bool disabled;
+  /// Whether interaction is blocked.
+  final bool ignoring;
+
+  @override
+  Widget build(BuildContext context) {
+    if (disabled) {
+      return Opacity(
+        opacity: ignoring ? 0.8 : 0.7,
+        child: IgnorePointer(
+          ignoring: ignoring,
+          child: child,
+        )
+      );
+    }
+    return child;
+  }
+
+}
\ No newline at end of file
lib/model/export_import.dart
@@ -265,11 +265,11 @@ class Exporter {
       this.settings, this.exportSettings, this.csvExportSettings, this.pdfExportSettings);
   factory Exporter.load(BuildContext context, Iterable<BloodPressureRecord> data, ExportConfigurationModel exportColumnsConfig) {
 
-    final settings = Provider.of<Settings>(context);
-    final exportSettings = Provider.of<ExportSettings>(context);
-    final csvExportSettings = Provider.of<CsvExportSettings>(context);
-    final pdfExportSettings = Provider.of<PdfExportSettings>(context);
-    final model = Provider.of<BloodPressureModel>(context);
+    final settings = Provider.of<Settings>(context, listen: false);
+    final exportSettings = Provider.of<ExportSettings>(context, listen: false);
+    final csvExportSettings = Provider.of<CsvExportSettings>(context, listen: false);
+    final pdfExportSettings = Provider.of<PdfExportSettings>(context, listen: false);
+    final model = Provider.of<BloodPressureModel>(context, listen: false);
     final localizations = AppLocalizations.of(context)!;
     final theme = Theme.of(context);
     final messenger = ScaffoldMessenger.of(context);
lib/screens/subsettings/export_import_screen.dart
@@ -1,4 +1,5 @@
 import 'package:blood_pressure_app/components/consistent_future_builder.dart';
+import 'package:blood_pressure_app/components/diabled.dart';
 import 'package:blood_pressure_app/components/display_interval_picker.dart';
 import 'package:blood_pressure_app/components/export_item_order.dart';
 import 'package:blood_pressure_app/components/settings_widgets.dart';
@@ -35,11 +36,9 @@ class ExportImportScreen extends StatelessWidget {
               const SizedBox(
                 height: 15,
               ),
-              Opacity(
-                opacity: (settings.exportFormat == ExportFormat.db) ? 0.7 : 1,
-                child: IgnorePointer(
-                    ignoring: (settings.exportFormat == ExportFormat.db),
-                    child: const IntervalPicker(type: IntervallStoreManagerLocation.exportPage,)),
+              Disabled(
+                disabled: settings.exportFormat == ExportFormat.db,
+                child: const IntervalPicker(type: IntervallStoreManagerLocation.exportPage,),
               ),
               SettingsTile(
                   title: Text(localizations.exportDir),
@@ -277,9 +276,10 @@ class ExportImportButtons extends StatelessWidget {
                 child: MaterialButton(
                   height: 60,
                   child: Text(localizations.import),
-                  onPressed: () async => 
+                  onPressed: () async =>
                       Exporter.load(context, [], await ExportConfigurationModel.get(localizations)).import(),
-                )),
+                )
+            ),
           ],
         ),
       ),
@@ -303,37 +303,21 @@ class _ExportWarnBannerState extends State<ExportWarnBanner> {
     return Consumer<Settings>(builder: (context, settings, child) =>
       Consumer<ExportSettings>(builder: (context, exportSettings, child) =>
         Consumer<CsvExportSettings>(builder: (context, csvExportSettings, child) =>
-          Consumer<PdfExportSettings>(builder: (context, pdfExportSettings, child) {
-            return ConsistentFutureBuilder(
+          Consumer<PdfExportSettings>(builder: (context, pdfExportSettings, child) =>
+            ConsistentFutureBuilder(
               future: ExportConfigurationModel.get(localizations),
               onData: (context, configurationModel) {
                 String? message;
-                final exportCustomEntries = (exportSettings.exportFormat == ExportFormat.csv)
-                    ? csvExportSettings.exportCustomFields : pdfExportSettings.exportCustomFields;
                 final CustomFieldsSettings fieldSettings = (exportSettings.exportFormat == ExportFormat.csv
                     ? csvExportSettings : pdfExportSettings) as CustomFieldsSettings;
-                final exportFormats = configurationModel
-                    .getActiveExportColumns(exportSettings.exportFormat, fieldSettings)
-                    .map((e) => e.parsableFormat);
-                var missingAttributes = {
-                  RowDataFieldType.timestamp,
-                  RowDataFieldType.sys,
-                  RowDataFieldType.dia,
-                  RowDataFieldType.pul,
-                  RowDataFieldType.notes,
-                  RowDataFieldType.color
-                };
-                missingAttributes.removeWhere((e) => exportFormats.contains(e));
+
+                final missingAttributes = _getMissingAttributes(exportSettings, fieldSettings, configurationModel);
                 if (ExportFormat.db == exportSettings.exportFormat) {
                   // When exporting as database no wrong configuration is possible
-                } else if (_showWarnBanner && ((ExportFormat.pdf == exportSettings.exportFormat) ||
-                    csvExportSettings.exportHeadline == false ||
-                    exportCustomEntries &&
-                        missingAttributes.contains(RowDataFieldType.timestamp) ||
-                    ![',', '|'].contains(csvExportSettings.fieldDelimiter) ||
-                    !['"', '\''].contains(csvExportSettings.textDelimiter))) {
+                } else if (_showWarnBanner && _isExportable(exportSettings, csvExportSettings,
+                    fieldSettings.exportCustomFields, missingAttributes)) {
                   message = localizations.exportWarnConfigNotImportable;
-                } else if (_showWarnBanner && exportCustomEntries && missingAttributes.isNotEmpty) {
+                } else if (_showWarnBanner && fieldSettings.exportCustomFields && missingAttributes.isNotEmpty) {
                   message = localizations.exportWarnNotEveryFieldExported(
                       missingAttributes.length, missingAttributes.join(', '));
                 }
@@ -353,10 +337,35 @@ class _ExportWarnBannerState extends State<ExportWarnBanner> {
                       ]);
                 }
                 return const SizedBox.shrink();
-              });
-          })
+              }))
         )
       )
     );
   }
 }
+
+bool _isExportable(ExportSettings exportSettings, CsvExportSettings csvExportSettings, bool exportCustomEntries, Set<RowDataFieldType> missingAttributes) {
+  return ((ExportFormat.pdf == exportSettings.exportFormat) ||
+      csvExportSettings.exportHeadline == false ||
+      exportCustomEntries &&
+          missingAttributes.contains(RowDataFieldType.timestamp) ||
+      ![',', '|'].contains(csvExportSettings.fieldDelimiter) ||
+      !['"', '\''].contains(csvExportSettings.textDelimiter));
+}
+
+Set<RowDataFieldType> _getMissingAttributes(ExportSettings exportSettings, CustomFieldsSettings fieldSettings,
+    ExportConfigurationModel configurationModel) {
+  final exportFormats = configurationModel
+      .getActiveExportColumns(exportSettings.exportFormat, fieldSettings)
+      .map((e) => e.parsableFormat);
+  var missingAttributes = {
+    RowDataFieldType.timestamp,
+    RowDataFieldType.sys,
+    RowDataFieldType.dia,
+    RowDataFieldType.pul,
+    RowDataFieldType.notes,
+    RowDataFieldType.color
+  };
+  missingAttributes.removeWhere((e) => exportFormats.contains(e));
+  return missingAttributes;
+}