From 2eff9f8e2f78a8eaa2ff9ebb8da468956f7fc515 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Tue, 21 Nov 2023 15:10:06 +0100 Subject: [PATCH] Add the search feature inside the character sheet. --- .../screens/character/CharacterSheetScreen.kt | 84 +++++++++++++------ app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt index 439ea2f..2ac73a0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt @@ -6,8 +6,6 @@ import android.content.res.Configuration import androidx.activity.compose.BackHandler import androidx.annotation.StringRes import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column @@ -24,12 +22,15 @@ import androidx.compose.material.ModalBottomSheetLayout import androidx.compose.material.ModalBottomSheetState import androidx.compose.material.ModalBottomSheetValue import androidx.compose.material.icons.Icons +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.pullrefresh.PullRefreshState import androidx.compose.material.pullrefresh.pullRefresh import androidx.compose.material.pullrefresh.rememberPullRefreshState import androidx.compose.material.rememberModalBottomSheetState -import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -40,7 +41,6 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Tab import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar -import androidx.compose.material3.minimumInteractiveComponentSize import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.State @@ -53,7 +53,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider @@ -67,6 +66,7 @@ import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog import com.pixelized.rplexicon.ui.composable.error.HandleFetchError import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost +import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch import com.pixelized.rplexicon.ui.screens.character.CharacterTabUio.Action import com.pixelized.rplexicon.ui.screens.character.CharacterTabUio.Alteration import com.pixelized.rplexicon.ui.screens.character.CharacterTabUio.Inventory @@ -131,10 +131,11 @@ fun CharacterSheetScreen( ) val refresh = rememberPullRefreshState( refreshing = false, - onRefresh = { scope.launch { viewModel.update(force = true) } }, + onRefresh = { scope.launch { viewModel.update(force = true, full = false) } }, ) val tabs = rememberHeaderTabsState() val pagerState = rememberPagerState { tabs.value.size } + val isMenuExpended = remember { mutableStateOf(false) } Surface( modifier = Modifier.fillMaxSize(), @@ -144,6 +145,7 @@ fun CharacterSheetScreen( pagerState = pagerState, sheetState = sheetState, refreshState = refresh, + isMenuExpended = isMenuExpended, name = viewModel.character, tabs = tabs, header = headerViewModel.header, @@ -160,8 +162,14 @@ fun CharacterSheetScreen( }, onDeathSuccess = headerViewModel::onDeathSuccess, onDeathFailure = headerViewModel::onDeathFailure, - onRefresh = { - scope.launch { viewModel.update(force = true) } + onMenuRequest = { isMenuExpended.value = it }, + onSearch = { + screen.navigateToSearch( + enableLexicon = true, + enableQuests = true, + enableLocations = true, + enableSpells = true, + ) }, onFullRefresh = { scope.launch { viewModel.update(force = true, full = true) } @@ -241,7 +249,9 @@ private fun CharacterSheetContent( pagerState: PagerState, sheetState: ModalBottomSheetState, refreshState: PullRefreshState, - onRefresh: () -> Unit, + isMenuExpended: State, + onMenuRequest: (Boolean) -> Unit, + onSearch: () -> Unit, onFullRefresh: () -> Unit, name: String, tabs: State>, @@ -274,21 +284,45 @@ private fun CharacterSheetContent( } }, actions = { - Box( - modifier = Modifier - .minimumInteractiveComponentSize() - .combinedClickable( - onClick = onRefresh, - onLongClick = onFullRefresh, - role = Role.Button, - interactionSource = remember { MutableInteractionSource() }, - indication = rememberRipple(bounded = false) - ), - contentAlignment = Alignment.Center - ) { + IconButton(onClick = { onMenuRequest(!isMenuExpended.value) }) { Icon( - imageVector = Icons.Default.Refresh, - contentDescription = null, + imageVector = Icons.Filled.MoreVert, + contentDescription = "More", + ) + } + DropdownMenu( + expanded = isMenuExpended.value, + onDismissRequest = { onMenuRequest(false) }, + ) { + DropdownMenuItem( + leadingIcon = { + Icon( + imageVector = Icons.Default.Search, + contentDescription = null, + ) + }, + text = { + Text(text = stringResource(id = R.string.search_field_title)) + }, + onClick = { + onMenuRequest(false) + onSearch() + }, + ) + DropdownMenuItem( + leadingIcon = { + Icon( + imageVector = Icons.Default.Refresh, + contentDescription = null, + ) + }, + text = { + Text(text = stringResource(id = R.string.character_sheet_refresh_label)) + }, + onClick = { + onMenuRequest(false) + onFullRefresh() + }, ) } }, @@ -456,9 +490,11 @@ private fun CharacterScreenPreview( name = "Brulkhai", header = rememberCharacterHeaderStatePreview(), tabs = rememberHeaderPreview(), + isMenuExpended = remember { mutableStateOf(false) }, + onMenuRequest = { }, onBack = { }, onTab = { }, - onRefresh = { }, + onSearch = { }, onFullRefresh = { }, loader = { }, onHitPoint = { }, diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c33a1b2..e096099 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -78,6 +78,7 @@ Destinations : Illustrations : + Rafraichir Talents Inventaire Altérations diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 009f0d2..6fc5d9c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,6 +86,7 @@ Destinations: Illustrations: + Refresh Proficiencies Inventory Alterations