Generate SSD selection interaction from typed Jerboa

ober

e1dda1c4aedc64be2c529c0b06d88fbde2e5a7a4

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 576c6dd..6ceb7d9 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -9797,6 +9797,39 @@
                  (resourcesDisplayMetrics
                    (contextResources context))))))))
 
+    (typed-kotlin-file "com/sfb/ssdreview/MainActivityInteraction.kt"
+      (typed-library (com sfb ssdreview)
+        (export mainActivityApplySelectMode mainActivityFinishSelectInteraction)
+        (type MainActivity)
+        (type SsdReviewView)
+        (extern (mainActivitySetStatusRaw
+                  (activity : MainActivity)
+                  (text : String)) : Unit
+          (kotlin-member-call setStatus))
+        (def (mainActivityApplySelectMode
+               (activity : MainActivity)
+               (view : SsdReviewView)
+               (ssdAreaMode : Bool)
+               (appendMode : Bool)
+               (enabled : Bool)) : Unit
+          (begin
+            (if (selectModeDisabled enabled)
+              (mainActivityClearInteractionModes activity view)
+              (begin))
+            (reviewViewSetSelectMode view enabled (not ssdAreaMode))
+            (mainActivitySetStatusRaw
+              activity
+              (selectModeStatus
+                ssdAreaMode
+                appendMode
+                (reviewViewSelectMode view)))))
+        (def (mainActivityFinishSelectInteraction
+               (activity : MainActivity)
+               (view : SsdReviewView)) : Unit
+          (begin
+            (mainActivityClearInteractionModes activity view)
+            (reviewViewClearInteractionState view)))))
+
     (kotlin-file-lines "com/sfb/ssdreview/MainActivity.kt"
       (
        "package com.sfb.ssdreview"
@@ -9923,8 +9956,8 @@
 	       "                button(\"Next Page\") { changePage(1) },"
 	       "            ))"
 	       "            addView(actionRow("
-	       "                button(\"Pan\", ButtonKind.NEUTRAL) { setSelectMode(false) },"
-	       "                button(\"Select Area\", ButtonKind.PRIMARY) { setSelectMode(true) },"
+	       "                button(\"Pan\", ButtonKind.NEUTRAL) { mainActivityApplySelectMode(this@MainActivity, reviewView, ssdAreaMode, appendMode, false) },"
+	       "                button(\"Select Area\", ButtonKind.PRIMARY) { mainActivityApplySelectMode(this@MainActivity, reviewView, ssdAreaMode, appendMode, true) },"
 	       "                button(\"Add\", ButtonKind.ACCENT) { startAppendMode() },"
 	       "            ))"
 	       "            addView(actionRow("
@@ -10082,19 +10115,6 @@
        "        renderCurrentPage()"
        "    }"
        ""
-	       "    private fun setSelectMode(enabled: Boolean) {"
-	       "        if (selectModeDisabled(enabled)) {"
-	       "            mainActivityClearInteractionModes(this, reviewView)"
-	       "        }"
-	       "        reviewViewSetSelectMode(reviewView, enabled, !ssdAreaMode)"
-	       "        setStatus(selectModeStatus(ssdAreaMode, appendMode, reviewViewSelectMode(reviewView)))"
-       "    }"
-       ""
-	       "    private fun finishSelectInteraction() {"
-	       "        mainActivityClearInteractionModes(this, reviewView)"
-	       "        reviewViewClearInteractionState(reviewView)"
-	       "    }"
-       ""
        "    internal fun restoreViewportAfterLayout(viewport: ViewportState?) {"
        "        reviewViewRestoreViewportAfterLayout(reviewView, viewport)"
        "    }"
@@ -10148,7 +10168,7 @@
 	       "        val session = ssdSessionOrEmpty(currentSession)"
        "        val area = ssdSessionBoundedSsdArea(session, rect)"
        "        if (ssdAreaSelectionTooSmall(area)) {"
-       "            finishSelectInteraction()"
+       "            mainActivityFinishSelectInteraction(this, reviewView)"
        "            setStatus(ssdAreaIgnoredTooSmallStatus())"
        "            return"
        "        }"
@@ -10351,7 +10371,7 @@
        "    ) {"
        "        val truth = ssdSessionToTruthJson(session)"
        "        val viewport = reviewViewCaptureViewportForSave(reviewView)"
-       "        finishSelectInteraction()"
+        "        mainActivityFinishSelectInteraction(this, reviewView)"
        "        restoreViewportAfterLayout(viewport)"
        "        setStatus(savingStatus)"
        "        mainActivitySaveTruthSnapshotAsync(this, truthStore, truth, viewport, savedStatus, afterSaved)"
@@ -10371,7 +10391,7 @@
        "        val cleanLabel = manualGroupLabel(resolvedLabelForBoxTypeAndroid(this, label, boxType, \"\"), resolvedBoxTypeNameOr(resolvedType, \"\"), \"\")"
        "        val group = mainActivityAddApprovedAreaGroup(this, reviewView, session, rect, detectedIds, cleanLabel, resolvedBoxTypeIdOr(resolvedType, boxType), firingArc, count)"
        "        truthStoreAppendGroupApproved(truthStore, session)"
-       "        finishSelectInteraction()"
+        "        mainActivityFinishSelectInteraction(this, reviewView)"
        "        reviewViewPerformHapticAndInvalidate(reviewView, HapticFeedbackConstants.CONFIRM)"
        "        saveSessionAsync("
        "            session,"
@@ -10385,7 +10405,7 @@
        "        val session = ssdSessionOrEmpty(currentSession)"
        "        if (ssdSessionGroupMissing(session, group)) return"
        "        val added = mainActivityAppendAreaToGroup(this, reviewView, session, rect, detectedIds, group, count)"
-       "        finishSelectInteraction()"
+        "        mainActivityFinishSelectInteraction(this, reviewView)"
        "        truthStoreAppendGroupAppended(truthStore, session)"
        "        reviewViewPerformHapticAndInvalidate(reviewView, HapticFeedbackConstants.CONFIRM)"
        "        saveSessionAsync("