add game searching

This commit is contained in:
Emmanuel Hansen 2023-08-05 13:21:21 +00:00
parent 8f8f9e996a
commit 0bf93ef754

View File

@ -21,6 +21,7 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
@ -47,7 +48,6 @@ import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -68,6 +68,7 @@ import org.ryujinx.android.R
import org.ryujinx.android.viewmodels.GameModel import org.ryujinx.android.viewmodels.GameModel
import org.ryujinx.android.viewmodels.HomeViewModel import org.ryujinx.android.viewmodels.HomeViewModel
import java.io.File import java.io.File
import java.util.Locale
import kotlin.math.roundToInt import kotlin.math.roundToInt
class HomeViews { class HomeViews {
@ -76,7 +77,11 @@ class HomeViews {
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun MainTopBar(navController: NavHostController) { fun MainTopBar(
navController: NavHostController,
query: MutableState<String>,
refresh: MutableState<Boolean>
) {
val topBarSize = remember { val topBarSize = remember {
mutableStateOf(0) mutableStateOf(0)
} }
@ -87,15 +92,17 @@ class HomeViews {
TopAppBar( TopAppBar(
modifier = Modifier modifier = Modifier
.zIndex(1f) .zIndex(1f)
.padding(top = 16.dp) .padding(top = 8.dp)
.onSizeChanged { .onSizeChanged {
topBarSize.value = it.height topBarSize.value = it.height
}, },
title = { title = {
DockedSearchBar( DockedSearchBar(
shape = SearchBarDefaults.inputFieldShape, shape = SearchBarDefaults.inputFieldShape,
query = "", query = query.value,
onQueryChange = {}, onQueryChange = {
query.value = it
},
onSearch = {}, onSearch = {},
active = false, active = false,
onActiveChange = {}, onActiveChange = {},
@ -113,6 +120,16 @@ class HomeViews {
} }
}, },
actions = { actions = {
IconButton(
onClick = {
refresh.value = true
}
) {
Icon(
Icons.Filled.Refresh,
contentDescription = "Refresh"
)
}
IconButton( IconButton(
onClick = { onClick = {
showOptionsPopup.value = true showOptionsPopup.value = true
@ -126,15 +143,17 @@ class HomeViews {
} }
) )
Box { Box {
if(showOptionsPopup.value) if (showOptionsPopup.value) {
{
AlertDialog( AlertDialog(
modifier = Modifier.padding(top = (topBarSize.value / Resources.getSystem().displayMetrics.density + 10).dp, modifier = Modifier.padding(
start = 16.dp, end = 16.dp), top = (topBarSize.value / Resources.getSystem().displayMetrics.density + 10).dp,
start = 16.dp, end = 16.dp
),
onDismissRequest = { onDismissRequest = {
showOptionsPopup.value = false showOptionsPopup.value = false
}) { }) {
val dialogWindowProvider = LocalView.current.parent as DialogWindowProvider val dialogWindowProvider =
LocalView.current.parent as DialogWindowProvider
dialogWindowProvider.window.setGravity(Gravity.TOP) dialogWindowProvider.window.setGravity(Gravity.TOP)
Surface( Surface(
modifier = Modifier modifier = Modifier
@ -145,19 +164,23 @@ class HomeViews {
tonalElevation = AlertDialogDefaults.TonalElevation tonalElevation = AlertDialogDefaults.TonalElevation
) { ) {
Column { Column {
TextButton(onClick = { TextButton(
navController.navigate("settings") onClick = {
}, modifier = Modifier navController.navigate("settings")
.fillMaxWidth() },
.align(Alignment.Start), modifier = Modifier
.fillMaxWidth()
.align(Alignment.Start),
) { ) {
Icon( Icon(
Icons.Filled.Settings, Icons.Filled.Settings,
contentDescription = "Settings" contentDescription = "Settings"
) )
Text(text = "Settings", modifier = Modifier Text(
.padding(16.dp) text = "Settings", modifier = Modifier
.align(Alignment.CenterVertically)) .padding(16.dp)
.align(Alignment.CenterVertically)
)
} }
} }
} }
@ -171,15 +194,19 @@ class HomeViews {
@Composable @Composable
fun Home(viewModel: HomeViewModel = HomeViewModel(), navController: NavHostController? = null) { fun Home(viewModel: HomeViewModel = HomeViewModel(), navController: NavHostController? = null) {
val sheetState = rememberModalBottomSheetState() val sheetState = rememberModalBottomSheetState()
val scope = rememberCoroutineScope()
val showBottomSheet = remember { mutableStateOf(false) } val showBottomSheet = remember { mutableStateOf(false) }
val showLoading = remember { mutableStateOf(false) } val showLoading = remember { mutableStateOf(false) }
val query = remember {
mutableStateOf("")
}
val refresh = remember {
mutableStateOf(true)
}
Scaffold( Scaffold(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
topBar = { topBar = {
navController?.apply { navController?.apply {
MainTopBar(navController) MainTopBar(navController, query, refresh)
} }
}, },
floatingActionButtonPosition = FabPosition.End, floatingActionButtonPosition = FabPosition.End,
@ -200,11 +227,18 @@ class HomeViews {
val list = remember { val list = remember {
mutableStateListOf<GameModel>() mutableStateListOf<GameModel>()
} }
viewModel.setViewList(list)
if(refresh.value) {
viewModel.setViewList(list)
refresh.value = false
}
LazyColumn(Modifier.fillMaxSize()) { LazyColumn(Modifier.fillMaxSize()) {
items(list) { items(list) {
it.titleName?.apply { it.titleName?.apply {
if (this.isNotEmpty()) if (this.isNotEmpty() && (query.value.trim().isEmpty() || this.lowercase(
Locale.getDefault()
)
.contains(query.value)))
GameItem(it, viewModel, showBottomSheet, showLoading) GameItem(it, viewModel, showBottomSheet, showLoading)
} }
} }
@ -357,8 +391,7 @@ class HomeViews {
) )
viewModel.mainViewModel?.navController?.navigate("game") viewModel.mainViewModel?.navController?.navigate("game")
} }
} } else {
else {
gameModel.close() gameModel.close()
} }
showLoading.value = false showLoading.value = false