Move SSD review view state updates to typed Kotlin

ober

ad953773555369d7b0ec0aa3143f7a8bab7b1aac

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 3fc4ec2..43d49a5 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4640,7 +4640,9 @@
                 sessionMissing
                 viewportStatePresent viewportStateOrEmpty
                 hasReplacementLabel missingReplacementLabel hasResolvedLabel
-                reviewViewSelectGroupId
+                reviewViewSelectGroupId reviewViewSetSelectMode
+                reviewViewSetSsdAreaFromSession reviewViewShowSession
+                reviewViewClearSessionState
                 ssdBrowserResumeReady focusChangeShouldShowDropdown
                 dialogReadyToShowDropdown focusedDialogReadyToShowDropdown
                 permissionResultGranted downloadAccessBeforeRuntimePermissions
@@ -4687,6 +4689,7 @@
                 touchPointerOuterRadius touchPointerInnerRadius hitGroupPad)
         (type Int32)
         (type Float32)
+        (type FloatArray)
         (type Char)
         (type File)
         (type Cursor)
@@ -4738,6 +4741,18 @@
         (extern (reviewViewSelectedGroupIdSet (view : SsdReviewView)
                                               (id : (Nullable String))) : Unit
           (kotlin-member-set selectedGroupId))
+        (extern (reviewViewSelectModeSet (view : SsdReviewView)
+                                         (enabled : Bool)) : Unit
+          (kotlin-member-set selectMode))
+        (extern (reviewViewSnapSelectionToCellsSet (view : SsdReviewView)
+                                                   (enabled : Bool)) : Unit
+          (kotlin-member-set snapSelectionToCells))
+        (extern (reviewViewSessionSet (view : SsdReviewView)
+                                      (session : (Nullable SsdSession))) : Unit
+          (kotlin-member-set session))
+        (extern (reviewViewSsdAreaSet (view : SsdReviewView)
+                                      (area : (Nullable FloatArray))) : Unit
+          (kotlin-member-set ssdArea))
         (def (normalizeFiringArc (value : String)) : String
           (string-uppercase (string-trim value)))
         (def (normalizeLabel (value : String)) : String
@@ -5217,6 +5232,26 @@
         (def (reviewViewSelectGroupId (view : SsdReviewView)
                                       (id : (Nullable String))) : Unit
           (reviewViewSelectedGroupIdSet view id))
+        (def (reviewViewSetSelectMode (view : SsdReviewView)
+                                      (enabled : Bool)
+                                      (snapToCells : Bool)) : Unit
+          (begin
+            (reviewViewSnapSelectionToCellsSet view snapToCells)
+            (reviewViewSelectModeSet view enabled)))
+        (def (reviewViewSetSsdAreaFromSession (view : SsdReviewView)
+                                              (session : SsdSession)) : Unit
+          (reviewViewSsdAreaSet view (SsdSession-ssdArea session)))
+        (def (reviewViewShowSession (view : SsdReviewView)
+                                    (session : SsdSession)) : Unit
+          (begin
+            (reviewViewSessionSet view (nullable-some session))
+            (reviewViewSelectGroupId view (nullable-none String))
+            (reviewViewSetSsdAreaFromSession view session)))
+        (def (reviewViewClearSessionState (view : SsdReviewView)) : Unit
+          (begin
+            (reviewViewSessionSet view (nullable-none SsdSession))
+            (reviewViewSelectGroupId view (nullable-none String))
+            (reviewViewSsdAreaSet view (nullable-none FloatArray))))
         (def (shouldCaptureViewport (includeViewport : Bool)) : Bool
           includeViewport)
         (def (viewportForSave (view : SsdReviewView)
@@ -6999,18 +7034,15 @@
 	       "        if (selectModeDisabled(enabled)) {"
 	       "            appendMode = false"
 	       "            ssdAreaMode = false"
-	       "            reviewView.snapSelectionToCells = true"
-	       "        } else if (ssdAreaModeInactive(ssdAreaMode)) {"
-	       "            reviewView.snapSelectionToCells = true"
 	       "        }"
-	       "        reviewView.selectMode = enabled"
+	       "        reviewViewSetSelectMode(reviewView, enabled, !ssdAreaMode)"
 	       "        setStatus(selectModeStatus(ssdAreaMode, appendMode, reviewView.selectMode))"
        "    }"
        ""
 	       "    private fun finishSelectInteraction() {"
 	       "        appendMode = false"
 	       "        ssdAreaMode = false"
-	       "        reviewView.snapSelectionToCells = true"
+	       "        reviewViewSetSelectMode(reviewView, false, true)"
 	       "        reviewView.clearInteractionState()"
 	       "    }"
        ""
@@ -7026,15 +7058,14 @@
        "        val group = ssdSessionFindGroupById(session, selectedGroupId)"
        "        if (ssdGroupMissing(group)) {"
        "            appendMode = false"
-       "            reviewView.selectMode = false"
+       "            reviewViewSetSelectMode(reviewView, false, true)"
        "            setStatus(\"Select an existing group first, then tap Append\")"
        "            return"
-	       "        }"
-       "        val appendGroup = ssdGroupOrEmpty(group)"
+       "        }"
+	       "        val appendGroup = ssdGroupOrEmpty(group)"
 	       "        appendMode = true"
 	       "        ssdAreaMode = false"
-	       "        reviewView.snapSelectionToCells = true"
-	       "        reviewView.selectMode = true"
+	       "        reviewViewSetSelectMode(reviewView, true, true)"
 	       "        reviewViewSelectGroupId(reviewView, appendGroup.id)"
 	       "        setStatus(appendModeStatus(appendGroup))"
 	       "    }"
@@ -7043,8 +7074,7 @@
 	       "        if (sessionMissing(currentSession)) return"
 	       "        appendMode = false"
 	       "        ssdAreaMode = true"
-	       "        reviewView.snapSelectionToCells = false"
-	       "        reviewView.selectMode = true"
+	       "        reviewViewSetSelectMode(reviewView, true, false)"
 	       "        reviewViewSelectGroupId(reviewView, selectedGroupId)"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK)"
 	       "        setStatus(\"SSD area mode: drag around the ship SSD; tags outside that area will be removed\")"
@@ -7091,7 +7121,7 @@
        "        val outsideCount = ssdSessionSsdAreaOutsideCount(session)"
        "        val removed = ssdSessionPruneGroupsOutsideSsdArea(session)"
 	       "        selectedGroupId = ssdSessionSelectedGroupId(session, selectedGroupId)"
-	       "        reviewView.ssdArea = session.ssdArea"
+	       "        reviewViewSetSsdAreaFromSession(reviewView, session)"
 	       "        reviewViewSelectGroupId(reviewView, selectedGroupId)"
 	       "        truthStore.appendEvent(\"ssd_area_set\", session, ssdAreaSetDetails(removed, beforeGroups, outsideCount))"
 	       "        reviewView.performHapticFeedback(HapticFeedbackConstants.CONFIRM)"
@@ -7175,9 +7205,7 @@
        "                    currentSession = null"
        "                    selectedGroupId = null"
 	       "                    reviewView.bitmap = bitmap"
-	       "                    reviewView.session = null"
-	       "                    reviewViewSelectGroupId(reviewView, null)"
-	       "                    reviewView.ssdArea = null"
+	       "                    reviewViewClearSessionState(reviewView)"
        "                    restoreViewportAfterLayout(restoredViewport)"
 	       "                    setStatus(renderedLoadingTruthStatus(renderPdfName, renderPageIndex, renderPageCount))"
        "                    detectCurrent("
@@ -7238,9 +7266,7 @@
        "                        if (isStaleLoad(expectedGeneration, uri, expectedPageIndex)) return@runOnUiThread"
        "                        currentSession = session"
        "                        selectedGroupId = null"
-	       "                        reviewView.session = session"
-	       "                        reviewViewSelectGroupId(reviewView, null)"
-	       "                        reviewView.ssdArea = session.ssdArea"
+	       "                        reviewViewShowSession(reviewView, session)"
 	       "                        setStatus(sessionCountsStatus(session, \", replayed cached truth\"))"
 	       "                        logDetectResult(\"cached-truth\", session, \"local-truth\")"
        "                    }"
@@ -7288,9 +7314,7 @@
        "                    if (isStaleLoad(expectedGeneration, uri, expectedPageIndex)) return@runOnUiThread"
        "                    currentSession = session"
        "                    selectedGroupId = null"
-	       "                    reviewView.session = session"
-	       "                    reviewViewSelectGroupId(reviewView, null)"
-	       "                    reviewView.ssdArea = session.ssdArea"
+	       "                    reviewViewShowSession(reviewView, session)"
        "                    val truthNote = detectionTruthNoteFor(existingTruth)"
        "                    val ocrNote = detectionOcrNote(ocrGuesses, session.ocrWords.size)"
        "                    val learnedNote = detectionLearnedNote(learnedGuesses)"
@@ -7333,9 +7357,7 @@
        "                if (isStaleLoad(generation, uri, page)) return@runOnUiThread"
        "                currentSession = merged"
        "                selectedGroupId = null"
-       "                reviewView.session = merged"
-       "                reviewViewSelectGroupId(reviewView, null)"
-       "                reviewView.ssdArea = merged.ssdArea"
+       "                reviewViewShowSession(reviewView, merged)"
        "                reviewView.invalidate()"
        "                setStatus(sessionCountsStatus(merged, \", pulled remote truth\"))"
        "                logDetectResult(\"remote-truth\", merged, \"remote-truth\")"
@@ -7427,7 +7449,7 @@
        "        val group = ssdSessionFindGroupById(session, selectedGroupId)"
        "        if (ssdGroupMissing(group)) {"
        "            appendMode = false"
-       "            reviewView.selectMode = false"
+       "            reviewViewSetSelectMode(reviewView, false, true)"
        "            setStatus(appendCanceledNoGroupStatus())"
        "            return"
        "        }"
@@ -7444,7 +7466,7 @@
        "            .setView(count)"
        "            .setNegativeButton(\"Cancel\") { _, _ ->"
        "                appendMode = false"
-       "                reviewView.selectMode = false"
+       "                reviewViewSetSelectMode(reviewView, false, true)"
        "                setStatus(appendCanceledStatus())"
        "            }"
        "            .setPositiveButton(\"Append\", null)"