|
|
@@ -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()
|
|
|
) {
|