From a2547f1e8d00b32c5bef057e9e34f83c904b42da Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 31 Jul 2024 18:44:15 +0800 Subject: [PATCH] Update page range filter limit --- .../hippo/ehviewer/ui/main/SearchFilter.kt | 29 ++++++++++++------- .../com/hippo/ehviewer/ui/tools/Dialog.kt | 18 +++++++----- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt index 27014fbff..f064d2d61 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/main/SearchFilter.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow @@ -152,23 +153,27 @@ fun SearchFilter( val (from, to) = dialogState.awaitResult( initial = advancedOption.fromPage to advancedOption.toPage, title = R.string.key_pages, - invalidator = { (min, _max) -> - // 0 means max pages not filled, though +inf - val max = if (_max == 0) Int.MAX_VALUE else _max - if (min != 0) { - ensure(max - min >= 20) { pageErr2 } - } else { - ensure(max >= 10) { pageErr1 } + invalidator = { (min, max) -> + if (max != 0) { + if (min != 0) { + ensure(min <= (max / 2).coerceAtMost(max - 20)) { pageErr2 } + } else { + ensure(max >= 10) { pageErr1 } + } } }, ) { error -> Column(horizontalAlignment = Alignment.CenterHorizontally) { - Row(verticalAlignment = Alignment.CenterVertically) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly, + ) { OutlinedTextField( keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), value = expectedValue.first.takeIf { it > 0 }?.toString().orEmpty(), onValueChange = { - expectedValue = expectedValue.copy(first = it.toIntOrDefault(0).coerceAtLeast(0)) + expectedValue = expectedValue.copy(first = it.toIntOrDefault(0).coerceIn(0, 1000)) }, modifier = Modifier.width(112.dp).padding(16.dp), singleLine = true, @@ -179,7 +184,7 @@ fun SearchFilter( keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), value = expectedValue.second.takeIf { it > 0 }?.toString().orEmpty(), onValueChange = { - expectedValue = expectedValue.copy(second = it.toIntOrDefault(0).coerceAtLeast(0)) + expectedValue = expectedValue.copy(second = it.toIntOrDefault(0).coerceIn(0, 2000)) }, modifier = Modifier.width(112.dp).padding(16.dp), singleLine = true, @@ -189,7 +194,9 @@ fun SearchFilter( } if (error != null) { ListItem( - headlineContent = { Text(text = error) }, + headlineContent = { + Text(text = error, style = MaterialTheme.typography.bodySmall) + }, leadingContent = { Icon(imageVector = Icons.Default.Info, contentDescription = null) }, diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt index df915ec6e..984c1a62a 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -52,12 +52,14 @@ import androidx.compose.material3.TimePicker import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.compositionLocalOf 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 +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -79,6 +81,7 @@ import com.jamal.composeprefs3.ui.ifNotNullThen import com.jamal.composeprefs3.ui.ifTrueThen import kotlin.coroutines.resume import kotlinx.coroutines.CancellableContinuation +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine @@ -116,7 +119,6 @@ class DialogState { invalidator: (suspend Raise.(R) -> Unit)? = null, block: @Composable DialogScope.(String?) -> Unit, ): R = dialog { cont -> - val coroutineScope = rememberCoroutineScope() val state = remember(cont) { mutableStateOf(initial) } var errorMsg by remember(cont) { mutableStateOf(null) } val impl = remember(cont) { @@ -124,17 +126,19 @@ class DialogState { override var expectedValue by state } } + if (invalidator != null) { + LaunchedEffect(state) { + snapshotFlow { state.value }.collectLatest { + errorMsg = either { invalidator(it) }.leftOrNull() + } + } + } AlertDialog( onDismissRequest = { cont.cancel() }, confirmButton = { TextButton(onClick = { - if (invalidator == null) { + if (invalidator == null || errorMsg == null) { cont.resume(state.value) - } else { - coroutineScope.launch { - errorMsg = either { invalidator(state.value) }.leftOrNull() - errorMsg ?: cont.resume(state.value) - } } }) { Text(text = stringResource(id = android.R.string.ok)) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index ccd5c5139..529818f72 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -72,7 +72,7 @@ 最低评分 到 页数最大值至少为 10 - 页数范围差至少为 20 + 页数范围过窄 禁用排除项: 语言 上传者 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ad1bf075c..e9c3a943a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -110,7 +110,7 @@ Minimum Rating to The page range maximum cannot be below 10 - The page range must be at least 20 + The page range is too narrow Disable default filters for: