Commit 4cb7fb6
Changed files (2)
lib
l10n
screens
subsettings
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 {