Ver Fonte

feat: 优化

HapeLee há 3 meses atrás
pai
commit
8eac1c5e3e

+ 28 - 0
app/src/main/java/io/legado/app/ui/config/themeConfig/MainNavigationSettingsSheet.kt

@@ -24,6 +24,7 @@ import io.legado.app.ui.main.MainDestination
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.widget.components.card.ReorderableSelectionItem
 import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
+import io.legado.app.ui.widget.components.settingItem.ClickableSettingItem
 import io.legado.app.ui.widget.components.settingItem.CompactDropdownSettingItem
 import io.legado.app.utils.move
 import sh.calvin.reorderable.rememberReorderableLazyListState
@@ -36,7 +37,10 @@ fun MainNavigationSettingsSheet(
     onSetVisible: (String, Boolean) -> Unit,
     onSetOrder: (String) -> Unit,
     onSetDefault: (String) -> Unit,
+    onRequestNavigationIcon: (String) -> Unit,
+    onClearNavigationIcon: (String) -> Unit,
 ) {
+    var showNavigationIcons by remember(show) { mutableStateOf(false) }
     var navigationItems by remember(show) {
         mutableStateOf(MainDestination.ordered(settings.mainNavigationOrder))
     }
@@ -95,6 +99,22 @@ fun MainNavigationSettingsSheet(
                 entryValues = visibleItems.map { it.route }.toTypedArray(),
                 onValueChange = onSetDefault,
             )
+            val customIconCount = listOf(
+                settings.navIconHome,
+                settings.navIconBookshelf,
+                settings.navIconExplore,
+                settings.navIconRss,
+                settings.navIconMy,
+            ).count { it.isNotEmpty() }
+            ClickableSettingItem(
+                title = stringResource(R.string.theme_config_nav_icons),
+                description = if (customIconCount > 0) {
+                    stringResource(R.string.theme_config_nav_icons_custom_count, customIconCount)
+                } else {
+                    stringResource(R.string.theme_config_nav_icons_default)
+                },
+                onClick = { showNavigationIcons = true },
+            )
             Spacer(modifier = Modifier.padding(bottom = 4.dp))
             LazyColumn(
                 state = navigationListState,
@@ -149,4 +169,12 @@ fun MainNavigationSettingsSheet(
             }
         }
     }
+
+    NavIconManageSheet(
+        show = showNavigationIcons,
+        settings = settings,
+        onDismissRequest = { showNavigationIcons = false },
+        onSelectIcon = onRequestNavigationIcon,
+        onClearIcon = onClearNavigationIcon,
+    )
 }

+ 35 - 18
app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt

@@ -2,8 +2,8 @@
 
 import android.content.Context
 import android.content.Intent
-import androidx.activity.compose.LocalActivity
 import androidx.activity.compose.BackHandler
+import androidx.activity.compose.LocalActivity
 import androidx.compose.animation.AnimatedContentTransitionScope
 import androidx.compose.animation.core.FastOutSlowInEasing
 import androidx.compose.animation.core.LinearOutSlowInEasing
@@ -15,6 +15,8 @@ import androidx.compose.animation.togetherWith
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalFocusManager
+import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.navigation3.runtime.NavKey
 import androidx.navigation3.runtime.entryProvider
 import androidx.navigation3.runtime.rememberNavBackStack
@@ -45,6 +47,13 @@ class ReplaceRuleActivity : BaseComposeActivity() {
     override fun Content() {
             val configuration = LocalAppUiConfiguration.current
             val context = LocalActivity.current
+        val focusManager = LocalFocusManager.current
+        val keyboardController = LocalSoftwareKeyboardController.current
+        fun leaveScreen(action: () -> Unit) {
+            focusManager.clearFocus(force = true)
+            keyboardController?.hide()
+            action()
+        }
             val startRouteJson = intent.getStringExtra(EXTRA_START_ROUTE)
             val backStack = rememberNavBackStack(
                 remember(startRouteJson) {
@@ -129,16 +138,18 @@ class ReplaceRuleActivity : BaseComposeActivity() {
                     ))
                 },
                 onBack = {
-                    if (backStack.size > 1) {
-                        backStack.removeLastOrNull()
-                    } else {
-                        finish()
+                    leaveScreen {
+                        if (backStack.size > 1) {
+                            backStack.removeLastOrNull()
+                        } else {
+                            finish()
+                        }
                     }
                 },
                 entryProvider = entryProvider {
                     entry<ReplaceRuleRoute> {
                         ReplaceRuleRouteScreen(
-                            onBackClick = { finish() },
+                            onBackClick = { leaveScreen { finish() } },
                             onNavigateToEdit = { route -> backStack.add(route) }
                         )
                     }
@@ -151,17 +162,21 @@ class ReplaceRuleActivity : BaseComposeActivity() {
                         ReplaceEditRouteScreen(
                             viewModel = viewModel,
                             onBack = {
-                                if (backStack.size > 1) {
-                                    backStack.removeLastOrNull()
-                                } else {
-                                    finish()
+                                leaveScreen {
+                                    if (backStack.size > 1) {
+                                        backStack.removeLastOrNull()
+                                    } else {
+                                        finish()
+                                    }
                                 }
                             },
                             onSaveSuccess = {
-                                if (backStack.size > 1) {
-                                    backStack.removeLastOrNull()
-                                } else {
-                                    finish()
+                                leaveScreen {
+                                    if (backStack.size > 1) {
+                                        backStack.removeLastOrNull()
+                                    } else {
+                                        finish()
+                                    }
                                 }
                             }
                         )
@@ -169,10 +184,12 @@ class ReplaceRuleActivity : BaseComposeActivity() {
                 }
             )
             BackHandler(enabled = !configuration.appShell.predictiveBackEnabled) {
-                if (backStack.size > 1) {
-                    backStack.removeLastOrNull()
-                } else {
-                    finish()
+                leaveScreen {
+                    if (backStack.size > 1) {
+                        backStack.removeLastOrNull()
+                    } else {
+                        finish()
+                    }
                 }
             }
     }

+ 20 - 5
app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditScreen.kt

@@ -35,6 +35,7 @@ import androidx.compose.material3.ExposedDropdownMenuBox
 import androidx.compose.material3.ExposedDropdownMenuDefaults
 import androidx.compose.material3.animateFloatingActionButton
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
@@ -47,12 +48,14 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.onFocusChanged
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.nestedscroll.nestedScroll
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.zIndex
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import io.legado.app.R
 import io.legado.app.ui.theme.LegadoTheme
 import io.legado.app.ui.widget.components.AppFloatingActionButton
@@ -69,11 +72,9 @@ import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar
 import io.legado.app.ui.widget.components.topbar.GlassTopAppBarDefaults
 import io.legado.app.ui.widget.components.topbar.TopBarActionButton
 import io.legado.app.ui.widget.components.topbar.TopBarNavigationButton
-import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import kotlinx.coroutines.flow.Flow
+import io.legado.app.utils.toastOnUi
 import kotlinx.coroutines.flow.collectLatest
 import org.koin.androidx.compose.koinViewModel
-import io.legado.app.utils.toastOnUi
 
 @Composable
 fun keyboardAsState(): State<Boolean> {
@@ -118,8 +119,16 @@ fun ReplaceEditScreen(
     var showMenu by remember { mutableStateOf(false) }
     val isKeyboardVisible by keyboardAsState()
     val focusManager = LocalFocusManager.current
+    val keyboardController = LocalSoftwareKeyboardController.current
+    DisposableEffect(Unit) {
+        onDispose {
+            focusManager.clearFocus(force = true)
+            keyboardController?.hide()
+        }
+    }
     val onSave = {
         focusManager.clearFocus(force = true)
+        keyboardController?.hide()
         onIntent(ReplaceEditIntent.Save)
     }
 
@@ -130,7 +139,13 @@ fun ReplaceEditScreen(
             GlassMediumFlexibleTopAppBar(
                 title = stringResource(if (state.id > 0) R.string.edit_replace_rule else R.string.add_replace_rule),
                 navigationIcon = {
-                    TopBarNavigationButton(onClick = onBack)
+                    TopBarNavigationButton(
+                        onClick = {
+                            focusManager.clearFocus(force = true)
+                            keyboardController?.hide()
+                            onBack()
+                        }
+                    )
                 },
                 actions = {
                     AnimatedVisibility(