From d86d72212f29038626f0bb8f0f88a18967863682 Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 28 Jun 2023 13:21:00 +0800 Subject: [PATCH] Fix AdvancedSearch minrating textfield behaviour --- .../hippo/ehviewer/ui/main/AdvancedSearch.kt | 152 +++++++++--------- 1 file changed, 78 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt b/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt index 00e091f6e..7544c9ef4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/main/AdvancedSearch.kt @@ -13,6 +13,7 @@ import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -20,6 +21,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringArrayResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType @@ -29,86 +31,88 @@ import com.hippo.ehviewer.R fun SearchAdvanced( state: AdvancedSearchOption, onStateChanged: (AdvancedSearchOption) -> Unit, -) { - Column { - ProvideTextStyle(MaterialTheme.typography.bodyMedium) { - val adv = state.advanceSearch - fun checked(bit: Int) = adv and bit != 0 - fun AdvancedSearchOption.inv(checked: Boolean, bit: Int) = onStateChanged(copy(advanceSearch = if (!checked) advanceSearch xor bit else advanceSearch or bit)) - Row { - Row(modifier = Modifier.weight(1f)) { - Checkbox(checked = checked(AdvanceTable.SH), onCheckedChange = { state.inv(it, AdvanceTable.SH) }) - Text(text = stringResource(id = R.string.search_sh), modifier = Modifier.align(Alignment.CenterVertically)) - } - Row(modifier = Modifier.weight(1f)) { - Checkbox(checked = checked(AdvanceTable.STO), onCheckedChange = { state.inv(it, AdvanceTable.STO) }) - Text(text = stringResource(id = R.string.search_sto), modifier = Modifier.align(Alignment.CenterVertically)) - } +) = Column { + ProvideTextStyle(MaterialTheme.typography.bodyMedium) { + val adv = state.advanceSearch + fun checked(bit: Int) = adv and bit != 0 + fun AdvancedSearchOption.inv(checked: Boolean, bit: Int) = onStateChanged(copy(advanceSearch = if (!checked) advanceSearch xor bit else advanceSearch or bit)) + Row { + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.SH), onCheckedChange = { state.inv(it, AdvanceTable.SH) }) + Text(text = stringResource(id = R.string.search_sh), modifier = Modifier.align(Alignment.CenterVertically)) } - val minRatingItems = stringArrayResource(id = R.array.search_min_rating) - var expanded by remember { mutableStateOf(false) } - ExposedDropdownMenuBox( + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.STO), onCheckedChange = { state.inv(it, AdvanceTable.STO) }) + Text(text = stringResource(id = R.string.search_sto), modifier = Modifier.align(Alignment.CenterVertically)) + } + } + val minRatingItems = stringArrayResource(id = R.array.search_min_rating) + var expanded by remember { mutableStateOf(false) } + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = !expanded }, + ) { + val softwareKeyboardController = LocalSoftwareKeyboardController.current + SideEffect { + softwareKeyboardController?.hide() + } + OutlinedTextField( + modifier = Modifier.menuAnchor(), + readOnly = true, + value = minRatingItems[state.minRating], + onValueChange = {}, + label = { Text(stringResource(id = R.string.search_sr)) }, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors(), + ) + ExposedDropdownMenu( expanded = expanded, - onExpandedChange = { expanded = !expanded }, + onDismissRequest = { expanded = false }, ) { - OutlinedTextField( - modifier = Modifier.menuAnchor(), - readOnly = true, - value = minRatingItems[state.minRating], - onValueChange = {}, - label = { Text(stringResource(id = R.string.search_sr)) }, - trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, - colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors(), - ) - ExposedDropdownMenu( - expanded = expanded, - onDismissRequest = { expanded = false }, - ) { - minRatingItems.forEach { selectionOption -> - DropdownMenuItem( - text = { Text(selectionOption) }, - onClick = { - expanded = false - onStateChanged(state.copy(minRating = minRatingItems.indexOf(selectionOption))) - }, - contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding, - ) - } + minRatingItems.forEach { selectionOption -> + DropdownMenuItem( + text = { Text(selectionOption) }, + onClick = { + expanded = false + onStateChanged(state.copy(minRating = minRatingItems.indexOf(selectionOption))) + }, + contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding, + ) } } - Row { - var enabled by rememberSaveable { mutableStateOf(false) } - Checkbox(checked = enabled, onCheckedChange = { enabled = it }) - Text(text = stringResource(id = R.string.search_sp), modifier = Modifier.align(Alignment.CenterVertically)) - BasicTextField( - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), - value = if (enabled && state.fromPage != -1) state.fromPage.toString() else "", - onValueChange = { onStateChanged(state.copy(fromPage = it.toInt())) }, - enabled = enabled, - ) - Text(text = stringResource(id = R.string.search_sp_to), modifier = Modifier.align(Alignment.CenterVertically)) - BasicTextField( - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), - value = if (enabled && state.toPage != -1) state.toPage.toString() else "", - onValueChange = { onStateChanged(state.copy(toPage = it.toInt())) }, - enabled = enabled, - ) - Text(text = stringResource(id = R.string.search_sp_suffix), modifier = Modifier.align(Alignment.CenterVertically)) + } + Row { + var enabled by rememberSaveable { mutableStateOf(false) } + Checkbox(checked = enabled, onCheckedChange = { enabled = it }) + Text(text = stringResource(id = R.string.search_sp), modifier = Modifier.align(Alignment.CenterVertically)) + BasicTextField( + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + value = if (enabled && state.fromPage != -1) state.fromPage.toString() else "", + onValueChange = { onStateChanged(state.copy(fromPage = it.toInt())) }, + enabled = enabled, + ) + Text(text = stringResource(id = R.string.search_sp_to), modifier = Modifier.align(Alignment.CenterVertically)) + BasicTextField( + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + value = if (enabled && state.toPage != -1) state.toPage.toString() else "", + onValueChange = { onStateChanged(state.copy(toPage = it.toInt())) }, + enabled = enabled, + ) + Text(text = stringResource(id = R.string.search_sp_suffix), modifier = Modifier.align(Alignment.CenterVertically)) + } + Text(text = stringResource(id = R.string.search_sf)) + Row { + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.SFL), onCheckedChange = { state.inv(it, AdvanceTable.SFL) }) + Text(text = stringResource(id = R.string.search_sfl), modifier = Modifier.align(Alignment.CenterVertically)) } - Text(text = stringResource(id = R.string.search_sf)) - Row { - Row(modifier = Modifier.weight(1f)) { - Checkbox(checked = checked(AdvanceTable.SFL), onCheckedChange = { state.inv(it, AdvanceTable.SFL) }) - Text(text = stringResource(id = R.string.search_sfl), modifier = Modifier.align(Alignment.CenterVertically)) - } - Row(modifier = Modifier.weight(1f)) { - Checkbox(checked = checked(AdvanceTable.SFU), onCheckedChange = { state.inv(it, AdvanceTable.SFU) }) - Text(text = stringResource(id = R.string.search_sfu), modifier = Modifier.align(Alignment.CenterVertically)) - } - Row(modifier = Modifier.weight(1f)) { - Checkbox(checked = checked(AdvanceTable.SFT), onCheckedChange = { state.inv(it, AdvanceTable.SFT) }) - Text(text = stringResource(id = R.string.search_sft), modifier = Modifier.align(Alignment.CenterVertically)) - } + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.SFU), onCheckedChange = { state.inv(it, AdvanceTable.SFU) }) + Text(text = stringResource(id = R.string.search_sfu), modifier = Modifier.align(Alignment.CenterVertically)) + } + Row(modifier = Modifier.weight(1f)) { + Checkbox(checked = checked(AdvanceTable.SFT), onCheckedChange = { state.inv(it, AdvanceTable.SFT) }) + Text(text = stringResource(id = R.string.search_sft), modifier = Modifier.align(Alignment.CenterVertically)) } } }