Commit 4cb7fb6

derdilla <derdilla06@gmail.com>
2023-07-29 16:26:04
always show the hidden fields on export screen
1 parent 8eb7737
Changed files (2)
lib
l10n
screens
lib/l10n/app_en.arb
@@ -290,7 +290,7 @@
   "@enterTimeFormatTxt1": {},
   "enterTimeFormatTxt2": "If you're curious about the complete list of valid formats, you can find them right here.",
   "@enterTimeFormatTxt2": {},
-  "enterTimeFormatTxt3": "Just a friendly reminder, using longer or shorter format Strings won't magically alter the width of the table columns, which might lead to some amusing line breaks and text not showing.",
+  "enterTimeFormatTxt3": "Just a friendly reminder, using longer or shorter format Strings won't magically alter the width of the table columns, which might lead to some awkward line breaks and text not showing.",
   "@enterTimeFormatTxt3": {},
   "enterTimeFormatTxt4": "default: \"yy-MM-dd HH:mm\"",
   "@enterTimeFormatTxt4": {},
@@ -343,5 +343,9 @@
   "custom": "Custom",
   "@custom": {},
   "drawRegressionLines": "Draw trend lines",
-  "drawRegressionLinesDesc": "Draws regression lines in graph. Only useful for large intervalls."
+  "@drawRegressionLines": {},
+  "drawRegressionLinesDesc": "Draws regression lines in graph. Only useful for large intervalls.",
+  "@drawRegressionLinesDesc": {},
+  "exportHiddenFields": "hidden fields",
+  "@exportHiddenFields": {}
 }
lib/screens/subsettings/export_import_screen.dart
@@ -125,14 +125,14 @@ class ExportFieldCustomisationSetting extends StatelessWidget {
 
 class CsvItemsOrderCreator extends StatelessWidget {
   const CsvItemsOrderCreator({super.key});
-
   @override
   Widget build(BuildContext context) {
     return Consumer<Settings>(builder: (context, settings, child) {
+      //settings.exportItems = ['timestampUnixMs', 'systolic', 'diastolic', 'pulse', 'notes'];
       return Container(
-        margin: const EdgeInsets.fromLTRB(45, 20, 10, 0),
+        margin: const EdgeInsets.all(25),
         padding: const EdgeInsets.all(20),
-        height: 320,
+        height: 420,
         decoration: BoxDecoration(
           border: Border.all(color: Theme.of(context).textTheme.labelLarge?.color ?? Colors.teal),
           borderRadius: const BorderRadius.all(Radius.circular(10)),
@@ -142,15 +142,48 @@ class CsvItemsOrderCreator extends StatelessWidget {
           physics: const NeverScrollableScrollPhysics(),
           shrinkWrap: true,
           onReorder: (oldIndex, newIndex) {
-            if (oldIndex < newIndex) {
+            /**
+             * We have a list of items that is structured like the following:
+             * [ exportItems.length, 1, exportAddableItems.length ]
+             *
+             * So oldIndex is either (0 <= oldIndex < exportItems.length) or
+             * ((exportItems.length + 1) <= oldIndex < (exportItems.length + 1 + exportAddableItems.length))
+             * newIndex is in the range (0 <= newIndex < (exportItems.length + 1 + exportAddableItems.length))
+             *
+             * In case the entry is moved upwards on the list the new position needs to have 1 subtracted because there
+             * is an entry missing above it now.
+             *
+             * If the newIndex is (0 <= newIndex < (exportItems.length + 1)) the Item got moved above the divider.
+             * The + 1 is needed to compensate for moving the item one position above the divider and thereby replacing
+             * its index.
+             */
+            var exportItems = settings.exportItems;
+            var exportAddableItems = settings.exportAddableItems;
+            if (oldIndex < newIndex) { // The
               newIndex -= 1;
             }
-            var exportItems = settings.exportItems;
-            final String item = exportItems.removeAt(oldIndex);
-            exportItems.insert(newIndex, item);
+
+            final String item;
+            if (0 <= oldIndex && oldIndex < exportItems.length) {
+              item = exportItems.removeAt(oldIndex);
+            } else if ((exportItems.length + 1) <= oldIndex && oldIndex < (exportItems.length + 1 + exportAddableItems.length)) {
+              item = exportAddableItems.removeAt(oldIndex - (exportItems.length + 1));
+            } else {
+              assert(false, 'oldIndex outside expected boundaries');
+              return;
+            }
+
+            if (newIndex < (exportItems.length + 1)) {
+              exportItems.insert(newIndex, item);
+            } else {
+              newIndex -= (exportItems.length + 1);
+              exportAddableItems.insert(newIndex, item);
+            }
 
             settings.exportItems = exportItems;
+            settings.exportAddableItems = exportAddableItems;
           },
+          /*
           footer: (settings.exportItems.length < 5) ? InkWell(
             onTap: () async {
               await showDialog(context: context,
@@ -198,32 +231,52 @@ class CsvItemsOrderCreator extends StatelessWidget {
               ),
             ),
           ) : null,
+           */
           children: <Widget>[
             for (int i = 0; i < settings.exportItems.length; i += 1)
-              SizedBox(
-                key: Key(settings.exportItems[i]),
-                child: Dismissible(
-                  key: Key('dism${settings.exportItems[i]}'),
-                  background: Container(color: Colors.red),
-                  onDismissed: (direction) {
-                    var exportItems = settings.exportItems;
-                    var exportAddableItems = settings.exportAddableItems;
-                    var removedItem = exportItems.removeAt(i);
-                    exportAddableItems.add(removedItem);
-                    settings.exportItems = exportItems;
-                    settings.exportAddableItems = exportAddableItems;
-                  },
-                  child: ListTile(
-                    title: Text(settings.exportItems[i]),
-                    trailing: const Icon(Icons.drag_handle),
-                  ),
-                ),
+              ListTile(
+                key: Key('l_${settings.exportItems[i]}'),
+                title: Text(settings.exportItems[i]),
+                trailing: const Icon(Icons.drag_handle),
+              ),
+            _buildListSectionDivider(context),
+            for (int i = 0; i < settings.exportAddableItems.length; i += 1)
+              ListTile(
+                key: Key('ul_${settings.exportAddableItems[i]}'),
+                title: Opacity(opacity: 0.7,child: Text(settings.exportAddableItems[i]),),
+                trailing: const Icon(Icons.drag_handle),
               ),
           ],
         ),
       );
     });
   }
+
+  Opacity _buildListSectionDivider(BuildContext context) {
+    return Opacity(
+      key: UniqueKey(),
+      opacity: 0.7,
+      child: Row(
+        children: <Widget>[
+          const Expanded(
+            child: Divider()
+          ),
+          Container(
+            padding: const EdgeInsets.all(10),
+            child: const Icon(Icons.arrow_downward)
+          ),
+          Text(AppLocalizations.of(context)!.exportHiddenFields),
+          Container(
+            padding: const EdgeInsets.all(10),
+            child: const Icon(Icons.arrow_downward)
+          ),
+          const Expanded(
+            child: Divider()
+          ),
+        ]
+      ),
+    );
+  }
 }
 
 class ExportImportButtons extends StatelessWidget {