Generate SSD edit dialog from typed Jerboa

ober

eef5a52efc8f9ce171b63219bfee1d96f09a67e0

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 93a7382..c3f6ec7 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4896,6 +4896,7 @@
                 mainActivityDeleteGroup
                 mainActivityDeleteSelectedGroup
                 mainActivityShowApproveDialog
+                mainActivityShowGroupEditDialog mainActivityEditSelectedGroup
                 mainActivityApproveArea
                 mainActivityAppendAreaToGroupAction
                 mainActivityShowAppendDialog
@@ -5262,6 +5263,14 @@
         (extern (autoCompleteTextRaw
                   (view : AutoCompleteTextView)) : Editable
           (kotlin-member-get text))
+        (extern (autoCompleteSetTextRaw
+                  (view : AutoCompleteTextView)
+                  (text : String)
+                  (filter : Bool)) : Unit
+          (kotlin-member-call setText))
+        (extern (autoCompleteSelectAllRaw
+                  (view : AutoCompleteTextView)) : Unit
+          (kotlin-member-call selectAll))
         (extern (editableToString (value : Editable)) : String
           (kotlin-member-call toString))
         (extern (autoCompleteVisibilitySet
@@ -7294,6 +7303,122 @@
                         boxType
                         (mainActivityDisplayHeightPixels activity)
                         (mainActivityDialogSoftInputMode)))))))))
+        (def (mainActivityShowGroupEditDialog
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : (Nullable SsdSession))
+               (group : SsdGroup)
+               (boxTypeDisplays : (List String))
+               (confirmHaptic : Int32)
+               (rejectHaptic : Int32)) : Unit
+          (if (sessionMissing session)
+            (begin)
+            (let ((loadedSession (ssdSessionOrEmpty session))
+                  (typeDisplay
+                    (boxTypesDisplayFromActivity
+                      activity
+                      (SsdGroup-boxTypeId group))))
+              (let ((layout (mainActivityDialogColumn activity))
+                    (label
+                      (mainActivityTextInputWithText
+                        activity
+                        "Label"
+                        (resolvedLabelForBoxTypeFromActivity
+                          activity
+                          (SsdGroup-label group)
+                          typeDisplay
+                          (SsdGroup-boxTypeId group))
+                        #t))
+                    (boxType
+                      (mainActivityBoxTypeInputWithText
+                        activity
+                        boxTypeDisplays
+                        "Box type id/name"
+                        typeDisplay))
+                    (firingArc
+                      (mainActivityFiringArcInputWithText
+                        activity
+                        (firingArcDisplaysValue)
+                        (SsdGroup-firingArc group)))
+                    (count
+                      (mainActivityNumberInput
+                        activity
+                        "Count"
+                        (groupCountText group))))
+                (begin
+                  (mainActivityAddApproveDialogInputs
+                    layout
+                    label
+                    boxType
+                    firingArc
+                    count)
+                  (autoCompleteInstallBoxTypeDialogBehavior
+                    activity
+                    label
+                    boxType
+                    firingArc
+                    (SsdGroup-boxTypeId group))
+                  (let ((dialog
+                          (alertDialogBuilderShowRaw
+                            (alertDialogBuilderSetPositiveAction
+                              (alertDialogBuilderSetNeutralAction
+                                (alertDialogBuilderSetCancelAction
+                                  (alertDialogBuilderSetLinearLayoutViewRaw
+                                    (alertDialogBuilderSetTitleRaw
+                                      (alertDialogBuilderForActivityRaw activity)
+                                      (editDialogTitle group))
+                                    layout))
+                                "Delete"
+                                (lambda () (begin)))
+                              "Save"
+                              (lambda () (begin))))))
+                    (begin
+                      (mainActivityInstallEditDialogButtons
+                        activity
+                        dialog
+                        loadedSession
+                        group
+                        label
+                        boxType
+                        firingArc
+                        count
+                        view
+                        store
+                        confirmHaptic
+                        rejectHaptic)
+                      (autoCompleteSelectAllRaw boxType)
+                      (mainActivityFocusBoxTypeDropdown
+                        dialog
+                        boxType
+                        (mainActivityDisplayHeightPixels activity)
+                        (mainActivityDialogSoftInputMode)))))))))
+        (def (mainActivityEditSelectedGroup
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (store : TruthStore)
+               (session : (Nullable SsdSession))
+               (selectedGroupId : (Nullable String))
+               (boxTypeDisplays : (List String))
+               (confirmHaptic : Int32)
+               (rejectHaptic : Int32)) : Unit
+          (let ((group
+                  (mainActivitySelectedGroup
+                    activity
+                    view
+                    session
+                    selectedGroupId)))
+            (if (ssdGroupMissing group)
+              (begin)
+              (mainActivityShowGroupEditDialog
+                activity
+                view
+                store
+                session
+                (ssdGroupOrEmpty group)
+                boxTypeDisplays
+                confirmHaptic
+                rejectHaptic))))
         (def (mainActivityDetectCurrentForceWithState
                (activity : MainActivity)) : Unit
           (mainActivityDetectCurrentRaw
@@ -7910,6 +8035,18 @@
               (editTextHintSetRaw input hint)
               (editTextInputTypeSetRaw input (inputTypeClassText))
               input)))
+        (def (mainActivityTextInputWithText
+               (activity : MainActivity)
+               (hint : String)
+               (text : String)
+               (selectAll : Bool)) : EditText
+          (let ((input (mainActivityTextInput activity hint)))
+            (begin
+              (editTextSetTextRaw input text)
+              (if selectAll
+                (editTextSelectAllRaw input)
+                (begin))
+              input)))
         (def (mainActivityBoxTypeInputWithHint
                (activity : MainActivity)
                (displays : (List String))
@@ -7918,6 +8055,23 @@
             (begin
               (autoCompleteHintSetRaw input hint)
               input)))
+        (def (mainActivityBoxTypeInputWithText
+               (activity : MainActivity)
+               (displays : (List String))
+               (hint : String)
+               (text : String)) : AutoCompleteTextView
+          (let ((input (mainActivityBoxTypeInputWithHint activity displays hint)))
+            (begin
+              (autoCompleteSetTextRaw input text #f)
+              input)))
+        (def (mainActivityFiringArcInputWithText
+               (activity : MainActivity)
+               (displays : (List String))
+               (text : String)) : AutoCompleteTextView
+          (let ((input (mainActivityFiringArcInput activity displays)))
+            (begin
+              (autoCompleteSetTextRaw input text #f)
+              input)))
         (def (mainActivityDialogColumn
                (activity : MainActivity)) : LinearLayout
           (let ((layout (linearLayoutForActivity activity)))
@@ -11020,7 +11174,7 @@
 	       "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
 	       "                mainActivityButton(this@MainActivity, \"Prev\", ButtonKind.NAV) { mainActivitySelectRelativeGroup(this@MainActivity, reviewView, currentSession, selectedGroupId, -1, HapticFeedbackConstants.CLOCK_TICK) },"
 	       "                mainActivityButton(this@MainActivity, \"Next\", ButtonKind.PRIMARY) { mainActivitySelectRelativeGroup(this@MainActivity, reviewView, currentSession, selectedGroupId, 1, HapticFeedbackConstants.CLOCK_TICK) },"
-	       "                mainActivityButton(this@MainActivity, \"Edit\") { editSelectedGroup() },"
+	       "                mainActivityButton(this@MainActivity, \"Edit\") { mainActivityEditSelectedGroup(this@MainActivity, reviewView, truthStore, currentSession, selectedGroupId, boxTypeDisplays, HapticFeedbackConstants.CONFIRM, HapticFeedbackConstants.REJECT) },"
 	       "            ))"
 	       "            addView(mainActivityActionRow(this@MainActivity, LinearLayout.HORIZONTAL, Gravity.CENTER_VERTICAL,"
 	       "                mainActivityButton(this@MainActivity, \"Approve\", ButtonKind.ACCENT) { mainActivityApproveSelectedGroup(this@MainActivity, reviewView, truthStore, currentSession, selectedGroupId, HapticFeedbackConstants.CONFIRM) },"
@@ -11102,12 +11256,6 @@
        "        )"
        "    }"
        ""
-       "    private fun editSelectedGroup() {"
-       "        val group = mainActivitySelectedGroup(this, reviewView, currentSession, selectedGroupId)"
-       "        if (ssdGroupMissing(group)) return"
-       "        showGroupEditDialog(ssdGroupOrEmpty(group))"
-       "    }"
-       ""
        "    internal fun renderCurrentPage() {"
        "        if (!pdfUriLoaded(pdfUri)) return"
        "        val uri = uriOrEmpty(pdfUri)"
@@ -11162,62 +11310,6 @@
        "        )"
        "    }"
        ""
-       "    private fun showGroupEditDialog(group: SsdGroup) {"
-       "        if (sessionMissing(currentSession)) return"
-       "        val session = ssdSessionOrEmpty(currentSession)"
-       "        val layout = LinearLayout(this).apply {"
-       "            orientation = LinearLayout.VERTICAL"
-       "            setPadding(32, 16, 32, 8)"
-       "        }"
-       "        val label = EditText(this).apply {"
-       "            hint = \"Label\""
-       "            inputType = InputType.TYPE_CLASS_TEXT"
-       "            val typeDisplay = boxTypesDisplayAndroid(this@MainActivity, group.boxTypeId)"
-       "            setText(resolvedLabelForBoxTypeAndroid(this@MainActivity, group.label, typeDisplay, group.boxTypeId))"
-       "            selectAll()"
-       "        }"
-       "        val boxType = mainActivityBoxTypeInput(this, boxTypeDisplays).apply {"
-       "            hint = \"Box type id/name\""
-       "            setText(boxTypesDisplayAndroid(this@MainActivity, group.boxTypeId), false)"
-       "        }"
-       "        val firingArc = mainActivityFiringArcInput(this, firingArcDisplays).apply {"
-       "            setText(group.firingArc, false)"
-       "        }"
-       "        val count = EditText(this).apply {"
-       "            hint = \"Count\""
-       "            inputType = InputType.TYPE_CLASS_NUMBER"
-       "            setText(groupCountText(group))"
-       "        }"
-       "        layout.addView(label)"
-       "        layout.addView(boxType)"
-       "        layout.addView(firingArc)"
-       "        layout.addView(count)"
-       "        autoCompleteInstallBoxTypeDialogBehavior(this, label, boxType, firingArc, group.boxTypeId)"
-       "        val dialog = AlertDialog.Builder(this)"
-       "            .setTitle(editDialogTitle(group))"
-       "            .setView(layout)"
-       "            .setNegativeButton(\"Cancel\", null)"
-       "            .setNeutralButton(\"Delete\", null)"
-       "            .setPositiveButton(\"Save\", null)"
-       "            .show()"
-       "        mainActivityInstallEditDialogButtons("
-       "            this,"
-       "            dialog,"
-       "            session,"
-       "            group,"
-       "            label,"
-       "            boxType,"
-       "            firingArc,"
-       "            count,"
-       "            reviewView,"
-       "            truthStore,"
-       "            HapticFeedbackConstants.CONFIRM,"
-       "            HapticFeedbackConstants.REJECT"
-       "        )"
-       "        boxType.selectAll()"
-       "        mainActivityFocusBoxTypeDropdown(dialog, boxType, resources.displayMetrics.heightPixels, android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)"
-       "    }"
-       ""
        "    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {"
        "        super.onActivityResult(requestCode, resultCode, data)"
        "        if (activityResultRejected(resultCode, RESULT_OK)) return"