From 98d4fcc52ad606b1ca09cbf55ea1d3cd7dc616ea Mon Sep 17 00:00:00 2001
From: Ashish Yadav <48384865+criticalAY@users.noreply.github.com>
Date: Thu, 30 Jan 2025 02:54:30 +0530
Subject: [PATCH] enhancement: improve reposition field dialog
---
.../java/com/ichi2/anki/ModelFieldEditor.kt | 103 ++++++++++--------
.../src/main/res/values/17-model-manager.xml | 2 -
2 files changed, 58 insertions(+), 47 deletions(-)
diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ModelFieldEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ModelFieldEditor.kt
index 85829becb86a..32c52cfab191 100644
--- a/AnkiDroid/src/main/java/com/ichi2/anki/ModelFieldEditor.kt
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/ModelFieldEditor.kt
@@ -29,6 +29,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import com.google.android.material.snackbar.Snackbar
+import com.ichi2.anki.CollectionManager.TR
import com.ichi2.anki.CollectionManager.withCol
import com.ichi2.anki.dialogs.ConfirmationDialog
import com.ichi2.anki.dialogs.LocaleSelectionDialog
@@ -45,6 +46,8 @@ import com.ichi2.libanki.NotetypeJson
import com.ichi2.libanki.exception.ConfirmModSchemaException
import com.ichi2.ui.FixedEditText
import com.ichi2.utils.customView
+import com.ichi2.utils.getInputField
+import com.ichi2.utils.input
import com.ichi2.utils.negativeButton
import com.ichi2.utils.positiveButton
import com.ichi2.utils.show
@@ -339,56 +342,66 @@ class ModelFieldEditor :
}
}
- /*
- * Allows the user to select a number less than the number of fields in the current model to
- * reposition the current field to
- * Processing time is scales with number of items
+ /**
+ * Displays a dialog to allow the user to reposition a field within a list.
*/
private fun repositionFieldDialog() {
- fieldNameInput = FixedEditText(this).apply { focusWithKeyboard() }
- fieldNameInput?.let { fieldNameInput ->
- fieldNameInput.setRawInputType(InputType.TYPE_CLASS_NUMBER)
- AlertDialog.Builder(this).show {
- customView(view = fieldNameInput, paddingStart = 64, paddingEnd = 64, paddingTop = 32)
- title(text = String.format(resources.getString(R.string.model_field_editor_reposition), 1, fieldsLabels.size))
- positiveButton(R.string.dialog_ok) {
- val newPosition = fieldNameInput.text.toString()
- val pos: Int =
- try {
- newPosition.toInt()
- } catch (n: NumberFormatException) {
- Timber.w(n)
- fieldNameInput.error = resources.getString(R.string.toast_out_of_range)
- return@positiveButton
- }
- if (pos < 1 || pos > fieldsLabels.size) {
- fieldNameInput.error = resources.getString(R.string.toast_out_of_range)
- } else {
- // Input is valid, now attempt to modify
- try {
- getColUnsafe.modSchema()
- repositionField(pos - 1)
- } catch (e: ConfirmModSchemaException) {
- e.log()
+ /**
+ * Shows an input dialog for selecting a new position.
+ *
+ * @param numberOfTemplates The total number of available positions.
+ * @param result A lambda function that receives the validated new position as an integer.
+ */
+ fun showDialog(
+ numberOfTemplates: Int,
+ result: (Int) -> Unit,
+ ) {
+ AlertDialog
+ .Builder(this)
+ .show {
+ positiveButton(R.string.dialog_ok) {
+ val input = (it as AlertDialog).getInputField()
+ result(input.text.toString().toInt())
+ }
+ negativeButton(R.string.dialog_cancel)
+ setMessage(TR.fieldsNewPosition1(numberOfTemplates))
+ setView(R.layout.dialog_generic_text_input)
+ }.input(
+ prefill = (currentPos + 1).toString(),
+ inputType = InputType.TYPE_CLASS_NUMBER,
+ displayKeyboard = true,
+ waitForPositiveButton = false,
+ ) { dialog, text: CharSequence ->
+ val number = text.toString().toIntOrNull()
+ dialog.positiveButton.isEnabled = number != null && number in 1..numberOfTemplates
+ }
+ }
- // Handle mod schema confirmation
- val c = ConfirmationDialog()
- c.setArgs(resources.getString(R.string.full_sync_confirmation))
- val confirm =
- Runnable {
- try {
- getColUnsafe.modSchemaNoCheck()
- repositionField(pos - 1)
- } catch (e1: JSONException) {
- throw RuntimeException(e1)
- }
- }
- c.setConfirm(confirm)
- this@ModelFieldEditor.showDialogFragment(c)
+ // handle repositioning
+ showDialog(fieldsLabels.size) { newPosition ->
+ if (newPosition == currentPos + 1) return@showDialog
+
+ Timber.i("Repositioning field from %d to %d", currentPos, newPosition)
+ try {
+ getColUnsafe.modSchema()
+ repositionField(newPosition - 1)
+ } catch (e: ConfirmModSchemaException) {
+ e.log()
+
+ // Handle mod schema confirmation
+ val c = ConfirmationDialog()
+ c.setArgs(resources.getString(R.string.full_sync_confirmation))
+ val confirm =
+ Runnable {
+ try {
+ getColUnsafe.modSchemaNoCheck()
+ repositionField(newPosition - 1)
+ } catch (e1: JSONException) {
+ throw RuntimeException(e1)
}
}
- }
- negativeButton(R.string.dialog_cancel)
+ c.setConfirm(confirm)
+ this@ModelFieldEditor.showDialogFragment(c)
}
}
}
diff --git a/AnkiDroid/src/main/res/values/17-model-manager.xml b/AnkiDroid/src/main/res/values/17-model-manager.xml
index 74d003777247..0b79d46a20f5 100644
--- a/AnkiDroid/src/main/res/values/17-model-manager.xml
+++ b/AnkiDroid/src/main/res/values/17-model-manager.xml
@@ -11,7 +11,6 @@
Note types must have at least one field
You must enter a name
Field name already used
- You must enter a valid value
@@ -46,7 +45,6 @@
Rename field
Set keyboard language hint
Reposition field
- Reposition field (enter a value %1$d–%2$d)
Remember last input when adding
Updating fields
Sort by this field