From 8a0038fa7f4603abe272b0742c46cfea3b8214e4 Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Mon, 5 Jan 2026 01:46:42 +0800 Subject: [PATCH] =?UTF-8?q?[=E4=BF=AE=E5=A4=8D]=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BA=86=E5=9C=A8=E6=9B=BF=E6=8D=A2=E5=87=80=E5=8C=96=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=97=B6=EF=BC=8C=E9=80=89=E6=8B=A9=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=88=86=E7=BB=84=E5=90=8E=E5=88=A0=E9=99=A4=E8=AF=A5?= =?UTF-8?q?=E5=88=86=E7=BB=84=E5=AF=BC=E8=87=B4=E7=9A=84=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/replace/ReplaceRuleScreen.kt | 102 ++++++++++++++++-- 1 file changed, 91 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleScreen.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleScreen.kt index e705bee5f..e11d42343 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleScreen.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleScreen.kt @@ -18,21 +18,83 @@ import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.gestures.detectDragGestures import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material.icons.filled.* -import androidx.compose.material3.* +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Checkbox +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi +import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.FloatingToolbarDefaults.ScreenOffset import androidx.compose.material3.HorizontalDivider -import androidx.compose.runtime.* +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.ListItem +import androidx.compose.material3.ListItemDefaults +import androidx.compose.material3.LoadingIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MediumFlexibleTopAppBar +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.PlainTooltip +import androidx.compose.material3.PrimaryScrollableTabRow +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SheetState +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.material3.Switch +import androidx.compose.material3.Tab +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TooltipAnchorPosition +import androidx.compose.material3.TooltipBox +import androidx.compose.material3.TooltipDefaults +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.animateFloatingActionButton +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.material3.rememberTooltipState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment -import androidx.compose.ui.Alignment.Companion import androidx.compose.ui.Modifier import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color @@ -58,7 +120,6 @@ import io.legado.app.ui.replace.edit.ReplaceEditActivity import io.legado.app.ui.widget.components.ActionItem import io.legado.app.ui.widget.components.AnimatedText import io.legado.app.ui.widget.components.EmptyMessageView -import io.legado.app.ui.widget.components.lazylist.FastScrollLazyColumn import io.legado.app.ui.widget.components.SearchBarSection import io.legado.app.ui.widget.components.SelectionBottomBar import io.legado.app.ui.widget.components.exportComponents.FilePickerSheet @@ -66,6 +127,7 @@ import io.legado.app.ui.widget.components.exportComponents.FilePickerSheetMode import io.legado.app.ui.widget.components.importComponents.BaseImportUiState import io.legado.app.ui.widget.components.importComponents.BatchImportDialog import io.legado.app.ui.widget.components.importComponents.SourceInputDialog +import io.legado.app.ui.widget.components.lazylist.FastScrollLazyColumn import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel @@ -261,6 +323,14 @@ fun ReplaceRuleScreen( } } + LaunchedEffect(groups) { + val maxIndex = groups.size + if (selectedTabIndex > maxIndex) { + selectedTabIndex = 0 + viewModel.setSearchKey("") + } + } + if (showGroupManageSheet) { GroupManageBottomSheet( groups = groups, @@ -330,7 +400,7 @@ fun ReplaceRuleScreen( snackbarHost = { SnackbarHost(snackbarHostState) }, topBar = { Column { - MediumTopAppBar( + MediumFlexibleTopAppBar( title = { val titleText = remember(isUploading, inSelectionMode, selectedRuleIds, rules) { when { @@ -434,10 +504,13 @@ fun ReplaceRuleScreen( placeholder = stringResource(id = R.string.replace_purify_search) ) } + val allString = stringResource(R.string.all) + val tabItems = remember(groups, allString) { listOf(allString) + groups } AnimatedVisibility(visible = groups.isNotEmpty()) { PrimaryScrollableTabRow( - selectedTabIndex = selectedTabIndex, + selectedTabIndex = selectedTabIndex.coerceAtMost(tabItems.size - 1) + .coerceAtLeast(0), edgePadding = 0.dp, divider = {}, ) { @@ -532,10 +605,14 @@ fun ReplaceRuleScreen( if (canReorder) { Modifier.longPressDraggableHandle( onDragStarted = { - hapticFeedback.performHapticFeedback(HapticFeedbackType.GestureThresholdActivate) + hapticFeedback.performHapticFeedback( + HapticFeedbackType.GestureThresholdActivate + ) }, onDragStopped = { - hapticFeedback.performHapticFeedback(HapticFeedbackType.GestureEnd) + hapticFeedback.performHapticFeedback( + HapticFeedbackType.GestureEnd + ) }, interactionSource = remember { MutableInteractionSource() } ) @@ -582,7 +659,10 @@ fun ReplaceRuleScreen( AnimatedVisibility( visible = inSelectionMode, modifier = - Modifier.align(Alignment.BottomCenter).offset(y = -ScreenOffset).zIndex(1f), + Modifier + .align(Alignment.BottomCenter) + .offset(y = -ScreenOffset) + .zIndex(1f), enter = slideInVertically { it } + fadeIn(), exit = slideOutVertically { it } + fadeOut() ) {