Explorar o código

fix: 在首页时点击首页展开切换书源集菜单

HapeLee hai 3 meses
pai
achega
cfe71ef564

+ 20 - 5
app/src/main/java/io/legado/app/ui/main/MainScreen.kt

@@ -90,10 +90,6 @@ import io.legado.app.ui.theme.ThemeResolver
 import io.legado.app.ui.widget.components.AppScaffold
 import io.legado.app.ui.widget.components.FloatingBottomBar
 import io.legado.app.ui.widget.components.FloatingBottomBarItem
-import top.yukonga.miuix.kmp.basic.NavigationRail as MiuixNavigationRail
-import top.yukonga.miuix.kmp.basic.NavigationRailItem as MiuixNavigationRailItem
-import top.yukonga.miuix.kmp.basic.NavigationRailValue
-import top.yukonga.miuix.kmp.basic.rememberNavigationRailState
 import io.legado.app.ui.widget.components.GlassDefaults
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcons
@@ -112,6 +108,10 @@ import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import org.koin.androidx.compose.koinViewModel
+import top.yukonga.miuix.kmp.basic.NavigationRailValue
+import top.yukonga.miuix.kmp.basic.rememberNavigationRailState
+import top.yukonga.miuix.kmp.basic.NavigationRail as MiuixNavigationRail
+import top.yukonga.miuix.kmp.basic.NavigationRailItem as MiuixNavigationRailItem
 
 @OptIn(
     ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class,
@@ -214,11 +214,20 @@ fun MainScreen(
         orientation = Orientation.Horizontal,
     )
     var bookshelfScrollToTopRequest by remember { mutableLongStateOf(0L) }
+    var homeSourceSetMenuRequest by remember { mutableLongStateOf(0L) }
     fun requestBookshelfScrollToTop() {
         bookshelfScrollToTopRequest++
     }
 
     fun handleMainDestinationClick(index: Int, destination: MainDestination) {
+        if (
+            destination == MainDestination.Home &&
+            pagerState.currentPage == index &&
+            pagerState.targetPage == index
+        ) {
+            homeSourceSetMenuRequest++
+            return
+        }
         if (
             destination == MainDestination.Bookshelf &&
             pagerState.currentPage == index &&
@@ -293,7 +302,12 @@ fun MainScreen(
                                             Modifier.combinedClickable(
                                                 interactionSource = remember { MutableInteractionSource() },
                                                 indication = null,
-                                                onClick = { handleMainDestinationClick(index, destination) },
+                                                onClick = {
+                                                    handleMainDestinationClick(
+                                                        index,
+                                                        destination
+                                                    )
+                                                },
                                                 onLongClick = {
                                                     haptic.performHapticFeedback(HapticFeedbackType.LongPress)
                                                     showGroupMenu = true
@@ -493,6 +507,7 @@ fun MainScreen(
                         CompositionLocalProvider(LocalLifecycleOwner provides pageLifecycleOwner) {
                             when (destination) {
                             MainDestination.Home -> HomeRouteScreen(
+                                showSourceSetMenuRequest = homeSourceSetMenuRequest,
                                 onOpenBook = { book ->
                                     context.startActivityForBook(book)
                                 },

+ 47 - 0
app/src/main/java/io/legado/app/ui/main/home/HomeScreen.kt

@@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.itemsIndexed
 import androidx.compose.foundation.pager.HorizontalPager
@@ -56,6 +57,7 @@ import androidx.compose.runtime.derivedStateOf
 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
@@ -107,6 +109,7 @@ import io.legado.app.ui.widget.components.book.SearchBookPreviewSheet
 import io.legado.app.ui.widget.components.button.series.MediumTonalButton
 import io.legado.app.ui.widget.components.button.series.SmallTonalButton
 import io.legado.app.ui.widget.components.card.GlassCard
+import io.legado.app.ui.widget.components.card.SelectionItemCard
 import io.legado.app.ui.widget.components.card.TextCard
 import io.legado.app.ui.widget.components.icon.AppIcon
 import io.legado.app.ui.widget.components.icon.AppIcons
@@ -126,6 +129,7 @@ import io.legado.app.utils.takePersistablePermissionSafely
 import io.legado.app.utils.toastOnUi
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.launch
 import org.koin.androidx.compose.koinViewModel
 import java.text.DateFormat
 import java.util.Date
@@ -133,6 +137,7 @@ import kotlin.math.roundToInt
 
 @Composable
 fun HomeRouteScreen(
+    showSourceSetMenuRequest: Long = 0L,
     onOpenBook: (Book) -> Unit,
     onNavigateToBookInfo: (
         name: String?,
@@ -331,6 +336,7 @@ fun HomeRouteScreen(
     }
 
     HomeScreen(
+        showSourceSetMenuRequest = showSourceSetMenuRequest,
         state = state,
         homepageState = homepageState,
         homepageFeedActions = feedActions,
@@ -377,6 +383,7 @@ fun HomeRouteScreen(
 )
 @Composable
 fun HomeScreen(
+    showSourceSetMenuRequest: Long = 0L,
     state: HomeUiState,
     homepageState: HomepageUiState,
     homepageFeedActions: HomepageFeedActions,
@@ -391,6 +398,7 @@ fun HomeScreen(
     animatedVisibilityScope: AnimatedVisibilityScope? = null,
 ) {
     val scrollBehavior = GlassTopAppBarDefaults.defaultScrollBehavior()
+    val scope = rememberCoroutineScope()
     val context = LocalContext.current
 
     val selectedSets = remember(homepageState.manageState.sets) {
@@ -401,12 +409,19 @@ fun HomeScreen(
     })
 
     var showPageMenu by remember { mutableStateOf(false) }
+    var showSourceSetSheet by remember { mutableStateOf(false) }
     var errorMessage by remember { mutableStateOf<String?>(null) }
 
     val currentPageSourceName by remember(selectedSets, pagerState) {
         derivedStateOf { selectedSets.getOrNull(pagerState.currentPage)?.sourceName }
     }
 
+    LaunchedEffect(showSourceSetMenuRequest) {
+        if (showSourceSetMenuRequest > 0L && selectedSets.isNotEmpty()) {
+            showSourceSetSheet = true
+        }
+    }
+
     LaunchedEffect(pagerState) {
         snapshotFlow { pagerState.currentPage }
             .distinctUntilChanged()
@@ -593,6 +608,36 @@ fun HomeScreen(
             visibleSections = state.visibleSections,
             onIntent = onIntent,
         )
+        AppModalBottomSheet(
+            show = showSourceSetSheet,
+            onDismissRequest = { showSourceSetSheet = false },
+            title = stringResource(R.string.homepage_select_items),
+        ) {
+            LazyColumn(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .heightIn(max = 480.dp),
+                verticalArrangement = Arrangement.spacedBy(8.dp),
+            ) {
+                itemsIndexed(
+                    items = selectedSets,
+                    key = { _, source -> source.sourceUrl },
+                ) { index, source ->
+                    SelectionItemCard(
+                        title = source.sourceName,
+                        isSelected = index == pagerState.currentPage,
+                        inSelectionMode = true,
+                        containerColor = LegadoTheme.colorScheme.onSheetContent,
+                        onToggleSelection = {
+                            showSourceSetSheet = false
+                            scope.launch {
+                                pagerState.animateScrollToPage(index)
+                            }
+                        },
+                    )
+                }
+            }
+        }
         AppAlertDialog(
             data = errorMessage,
             onDismissRequest = { errorMessage = null },
@@ -1381,11 +1426,13 @@ private fun HomeSheets(
 private fun AppModalBottomSheet(
     show: Boolean,
     onDismissRequest: () -> Unit,
+    title: String? = null,
     content: @Composable () -> Unit,
 ) {
     io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet(
         show = show,
         onDismissRequest = onDismissRequest,
+        title = title,
     ) {
         content()
     }