Add keyboard control (WIP, broken)

This commit is contained in:
Christian Basler
2025-11-13 21:40:53 +01:00
committed by Christian Basler
parent 1665ff1609
commit a58710d43e
2 changed files with 15 additions and 4 deletions

View File

@@ -62,10 +62,10 @@ fun App(
PuzzleGrid( PuzzleGrid(
modifier = Modifier modifier = Modifier
.focus(focusable), .focus(focusable),
remember { focusable.createChild(Key.DirectionDown, Key.DirectionUp) }, selectDirectly = selectDirectly,
selectionManager = selectionManager,
grid = game.grid, grid = game.grid,
spacing = spacing, spacing = spacing,
selectDirectly = selectDirectly,
onUpdate = { onUpdate = {
horizontalClues.forEach { it.update(game.grid) } horizontalClues.forEach { it.update(game.grid) }
verticalClues.forEach { it.update(game.grid) } verticalClues.forEach { it.update(game.grid) }

View File

@@ -1,5 +1,6 @@
package ch.dissem.yaep.ui.common package ch.dissem.yaep.ui.common
import SelectionManager
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@@ -12,6 +13,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ch.dissem.yaep.domain.GameCell import ch.dissem.yaep.domain.GameCell
@@ -19,11 +21,13 @@ import ch.dissem.yaep.domain.GameRow
import ch.dissem.yaep.domain.Grid import ch.dissem.yaep.domain.Grid
import ch.dissem.yaep.domain.Item import ch.dissem.yaep.domain.Item
import ch.dissem.yaep.domain.ItemClass import ch.dissem.yaep.domain.ItemClass
import focus
@Composable @Composable
fun PuzzleGrid( fun PuzzleGrid(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
selectDirectly: Boolean, selectDirectly: Boolean,
selectionManager: SelectionManager,
spacing: Dp = 8.dp, spacing: Dp = 8.dp,
grid: Grid, grid: Grid,
onUpdate: () -> Unit onUpdate: () -> Unit
@@ -36,7 +40,8 @@ fun PuzzleGrid(
onSnapshot = { grid.snapshot() }, onSnapshot = { grid.snapshot() },
onUndo = { grid.undo() }, onUndo = { grid.undo() },
spacing = spacing, spacing = spacing,
selectDirectly = selectDirectly selectDirectly = selectDirectly,
selectionManager = selectionManager
) )
} }
} }
@@ -49,15 +54,20 @@ private fun PuzzleRow(
onSnapshot: () -> Unit, onSnapshot: () -> Unit,
onUndo: () -> Boolean, onUndo: () -> Boolean,
spacing: Dp, spacing: Dp,
selectDirectly: Boolean selectDirectly: Boolean,
selectionManager: SelectionManager
) { ) {
val focusableRow = remember { selectionManager.add() }
Row( Row(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.wrapContentHeight() .wrapContentHeight()
) { ) {
val allOptions = row.options val allOptions = row.options
val columnSelectionManager =
remember { focusableRow.createChild(Key.DirectionRight, Key.DirectionLeft) }
for (cell in row) { for (cell in row) {
val focusableItem = remember { columnSelectionManager.add() }
var selection by remember(cell) { mutableStateOf(cell.selection) } var selection by remember(cell) { mutableStateOf(cell.selection) }
val options = remember(cell) { val options = remember(cell) {
allOptions.map { Toggleable(it, cell.options.contains(it)) } allOptions.map { Toggleable(it, cell.options.contains(it)) }
@@ -73,6 +83,7 @@ private fun PuzzleRow(
} }
Selector( Selector(
modifier = Modifier modifier = Modifier
.focus(focusableItem)
.padding(spacing) .padding(spacing)
.weight(1f), .weight(1f),
spacing, spacing,