PokeDex/composeApp/build/generated/compose/resourceGenerator/kotlin/HomeScreen.kt

226 lines
10 KiB
Kotlin
Raw Normal View History

2024-04-12 11:48:41 +02:00
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
2024-04-17 12:00:53 +02:00
import androidx.compose.foundation.layout.Row
2024-04-12 11:48:41 +02:00
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
2024-04-16 14:54:24 +02:00
import androidx.compose.foundation.layout.fillMaxWidth
2024-04-12 11:48:41 +02:00
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
2024-04-17 12:00:53 +02:00
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
2024-04-17 10:19:25 +02:00
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
2024-04-16 14:54:24 +02:00
import androidx.compose.material.OutlinedTextField
2024-04-12 11:48:41 +02:00
import androidx.compose.material.Text
2024-04-17 10:19:25 +02:00
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
2024-04-17 12:00:53 +02:00
import androidx.compose.material.icons.filled.Settings
2024-04-12 11:48:41 +02:00
import androidx.compose.runtime.Composable
2024-04-16 14:54:24 +02:00
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
2024-04-12 11:48:41 +02:00
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.CornerRadius
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import io.kamel.image.KamelImage
import io.kamel.image.asyncPainterResource
2024-04-16 14:54:24 +02:00
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
2024-04-12 11:48:41 +02:00
import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.resources.painterResource
2024-04-16 14:54:24 +02:00
import java.util.Locale
2024-04-12 11:48:41 +02:00
2024-04-17 12:00:53 +02:00
class HomeScreen : Screen {
2024-04-12 11:48:41 +02:00
@OptIn(ExperimentalResourceApi::class)
@Composable
override fun Content() {
val orange = Color(0xFFffa500)
val navigator = LocalNavigator.currentOrThrow
2024-04-16 14:54:24 +02:00
val coroutineScope = rememberCoroutineScope()
var searchQuery by remember { mutableStateOf("") }
2024-04-17 10:40:43 +02:00
val yellow = Color(0xFFFFD700)
2024-04-17 11:35:55 +02:00
var placeholder by remember { mutableStateOf("") }
2024-04-17 12:00:53 +02:00
var currentFilter by remember { mutableStateOf("") }
var isFilterOpen by remember { mutableStateOf(false) }
val filterOptions = listOf(
"all",
"normal",
"fire",
"water",
"electric",
"grass",
"ice",
"fighting",
"poison",
"ground",
"flying",
"psychic",
"bug",
"rock",
"ghost",
"dragon",
"dark",
"steel",
"fairy"
)
2024-04-17 10:40:43 +02:00
Column(
2024-04-17 13:11:02 +02:00
modifier = Modifier.fillMaxSize().background(color = orange),
2024-04-17 10:40:43 +02:00
horizontalAlignment = Alignment.CenterHorizontally
) {
2024-04-17 13:11:02 +02:00
OutlinedTextField(value = searchQuery,
2024-04-17 11:35:55 +02:00
onValueChange = { newName -> searchQuery = newName; placeholder = "" },
2024-04-17 13:11:02 +02:00
modifier = Modifier.fillMaxWidth(0.8f).padding(horizontal = 16.dp)
.padding(top = 16.dp).background(color = Color.White),
2024-04-17 10:19:25 +02:00
trailingIcon = {
2024-04-17 12:00:53 +02:00
Row() {
2024-04-17 13:11:02 +02:00
IconButton(onClick = {
if (searchQuery.length >= 3 && PokemonNames.names.any { name ->
name.contains(
searchQuery.lowercase(
Locale.getDefault()
2024-04-17 12:00:53 +02:00
)
2024-04-17 13:11:02 +02:00
)
}) {
coroutineScope.launch {
withContext(Dispatchers.IO) {
println("Searching for pokemon, query: $searchQuery")
val names: List<String> =
PokemonNames.names.filter { name ->
name.contains(
searchQuery.lowercase(
Locale.getDefault()
2024-04-17 12:00:53 +02:00
)
2024-04-17 13:11:02 +02:00
)
2024-04-17 12:00:53 +02:00
}
2024-04-17 13:11:02 +02:00
var newMap = arrayListOf<Pokemon>()
names.forEach { name ->
loadPokemonDataFromName(name)?.let {
newMap.add(it)
2024-04-17 10:19:25 +02:00
}
}
2024-04-17 13:11:02 +02:00
println("currentFilter: $currentFilter")
if (!currentFilter.equals("all")) {
newMap = newMap.filter { pokemon ->
pokemon.type == currentFilter
} as ArrayList<Pokemon>
}
println(names)
println(newMap)
if (newMap.isNotEmpty()) {
println("Updating map")
pokemap = newMap;
} else {
searchQuery = ""
placeholder =
"No results for this filter: $currentFilter"
}
2024-04-17 10:19:25 +02:00
}
}
2024-04-17 13:11:02 +02:00
} else {
searchQuery = ""
placeholder = "No results, make sure to use more than 2 letters."
2024-04-17 10:19:25 +02:00
}
2024-04-17 13:11:02 +02:00
}) {
2024-04-17 12:00:53 +02:00
Icon(Icons.Default.Search, contentDescription = "Search")
}
2024-04-17 13:11:02 +02:00
IconButton(onClick = {
isFilterOpen = !isFilterOpen
}) {
2024-04-17 12:00:53 +02:00
Icon(Icons.Default.Settings, contentDescription = "Filter")
2024-04-17 10:19:25 +02:00
}
}
},
colors = TextFieldDefaults.outlinedTextFieldColors(
2024-04-17 10:40:43 +02:00
focusedBorderColor = yellow,
unfocusedBorderColor = yellow,
textColor = Color.Black,
cursorColor = orange,
focusedLabelColor = orange,
unfocusedLabelColor = orange,
2024-04-17 11:35:55 +02:00
),
2024-04-17 13:11:02 +02:00
placeholder = { Text(placeholder) })
2024-04-17 10:40:43 +02:00
Spacer(modifier = Modifier.height(16.dp))
2024-04-17 10:19:25 +02:00
//Grid
2024-04-12 11:48:41 +02:00
LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 256.dp),
) {
items(pokemap.size) { index ->
Box(modifier = Modifier.size(256.dp).padding(5.dp)) {
2024-04-17 13:11:02 +02:00
Canvas(modifier = Modifier.matchParentSize()
.clickable { navigator.push(DetailScreen(pokemap[index])) }) {
2024-04-12 11:48:41 +02:00
drawRoundRect(
color = Color.White,
topLeft = Offset(0f, 0f),
size = Size(size.width, size.height),
cornerRadius = CornerRadius(20f, 20f),
)
}
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
KamelImage(
resource = asyncPainterResource(pokemap[index].imageUrl),
modifier = Modifier.size(128.dp),
contentDescription = "",
alignment = Alignment.Center
)
}
Column(
modifier = Modifier.fillMaxSize().padding(vertical = 8.dp),
verticalArrangement = Arrangement.Bottom,
horizontalAlignment = Alignment.CenterHorizontally
) {
val type: String = pokemap[index].type
Box(modifier = Modifier.size(32.dp)) {
Image(
painterResource(
pokemonTypeDrawableMap[type]!!
), contentDescription = null
)
}
Spacer(modifier = Modifier.height(8.dp))
Text(
text = pokemap[index].name,
textAlign = TextAlign.Center,
color = Color.Black,
fontWeight = FontWeight.Bold
)
}
}
}
}
2024-04-17 13:11:02 +02:00
DropdownMenu(expanded = isFilterOpen, onDismissRequest = { isFilterOpen = false }) {
2024-04-17 12:00:53 +02:00
filterOptions.forEach { option ->
DropdownMenuItem(onClick = { currentFilter = option; isFilterOpen = false }) {
Text(option)
}
}
}
2024-04-12 11:48:41 +02:00
}
}
}