Files
YAEP/composeApp/src/commonMain/kotlin/App.kt
2024-06-19 23:53:42 +02:00

163 lines
5.4 KiB
Kotlin

import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material3.OutlinedCard
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.unit.dp
import domain.Grid
import domain.HorizontalClue
import domain.ItemClass
import domain.NeighbourClue
import domain.OrderClue
import domain.SameRowClue
import domain.TripletClue
import domain.generateGame
import org.jetbrains.compose.resources.painterResource
import ui.DrawItem
import ui.Selector
import yaep.composeapp.generated.resources.Res
import yaep.composeapp.generated.resources.neighbour
import yaep.composeapp.generated.resources.order
@Composable
fun App(modifier: Modifier = Modifier) {
val game = generateGame()
Row(modifier = modifier) {
PuzzleGrid(modifier = Modifier.weight(1f), game.grid)
PuzzleClues(modifier = Modifier.weight(1f), game.horizontalClues, game.verticalClues)
}
}
@Composable
fun PuzzleGrid(
modifier: Modifier = Modifier,
grid: Grid
) {
Column(modifier = modifier) {
for (row in grid.rows) {
Row(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
) {
for (item in row) {
Selector(
modifier = Modifier
.padding(4.dp)
.weight(1f),
category = row.category,
options = item.options,
selectedItem = item.selection,
onSelectItem = { item.selection = it }
)
}
}
}
}
}
@Composable
fun PuzzleClues(
modifier: Modifier = Modifier,
horizontalClues: List<HorizontalClue>,
verticalClues: List<SameRowClue<ItemClass<*>>>
) {
Column(modifier = modifier) {
LazyVerticalGrid(
modifier = Modifier.fillMaxWidth().weight(1f),
columns = GridCells.Adaptive(32.dp)
) {
for (clue in horizontalClues.filter { it.isActive }) {
item {
HorizontalClue(
modifier = Modifier.clickable { clue.isActive = false },
clue = clue
)
}
}
for (clue in horizontalClues.filter { !it.isActive }) {
item {
HorizontalClue(
modifier = Modifier
.alpha(0.5f)
.clickable { clue.isActive = true },
clue = clue
)
}
}
}
LazyVerticalGrid(
modifier = Modifier.fillMaxWidth().weight(1f),
columns = GridCells.Adaptive(32.dp)
) {
for (clue in verticalClues.filter { it.isActive }) {
item {
VerticalClue(
modifier = Modifier.clickable { clue.isActive = false },
clue = clue
)
}
}
for (clue in verticalClues.filter { !it.isActive }) {
item {
VerticalClue(
modifier = Modifier
.alpha(0.5f)
.clickable { clue.isActive = true },
clue = clue
)
}
}
}
}
}
@Composable
fun HorizontalClue(modifier: Modifier = Modifier, clue: HorizontalClue) {
Column {
when (clue) {
is NeighbourClue<*> -> {
DrawItem(modifier = Modifier.weight(1f), clue.a)
OutlinedCard(modifier = modifier.aspectRatio(1f).weight(1f)) {
Image(
painter = painterResource(Res.drawable.neighbour),
contentDescription = null
)
}
DrawItem(modifier = Modifier.weight(1f), clue.b)
}
is OrderClue<*> -> {
DrawItem(modifier = Modifier.weight(1f), clue.left)
OutlinedCard(modifier = modifier.aspectRatio(1f).weight(1f)) {
Image(painter = painterResource(Res.drawable.order), contentDescription = null)
}
DrawItem(modifier = Modifier.weight(1f), clue.right)
}
is TripletClue<*> -> {
DrawItem(modifier = Modifier.weight(1f), clue.a)
DrawItem(modifier = Modifier.weight(1f), clue.b)
DrawItem(modifier = Modifier.weight(1f), clue.c)
}
}
}
}
@Composable
fun VerticalClue(modifier: Modifier = Modifier, clue: SameRowClue<*>) {
Column(modifier = modifier) {
DrawItem(modifier = Modifier.weight(1f), clue.a)
DrawItem(modifier = Modifier.weight(1f), clue.b)
}
}