diff --git a/app/src/main/java/com/example/login_v3/navigation/Main_Screen_tab.kt b/app/src/main/java/com/example/login_v3/navigation/Main_Screen_tab.kt index 717eae8..6438838 100644 --- a/app/src/main/java/com/example/login_v3/navigation/Main_Screen_tab.kt +++ b/app/src/main/java/com/example/login_v3/navigation/Main_Screen_tab.kt @@ -12,10 +12,15 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color @@ -32,10 +37,15 @@ import com.example.login_v3.home.setting.setting_detail_page.viewmodel.Theme_Vie import androidx.hilt.navigation.compose.hiltViewModel // 確保有引入 hiltViewModel +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController import com.example.login_v3.navigation.components.AppWallpaperBackground @Composable fun MainScreen_tab( + navController: NavHostController, // 注入 Theme_ViewModel 來讀取壁紙狀態 themeViewModel: Theme_ViewModel = hiltViewModel() ) { @@ -64,7 +74,10 @@ fun MainScreen_tab( .fillMaxWidth() .height(navHeight) ) { - nav_Wheel_display_block(screensViewModel = screensViewModel) + nav_Wheel_display_block( + navController = navController, + screensViewModel = screensViewModel + ) } Spacer(modifier = Modifier.height(gap)) } @@ -73,6 +86,7 @@ fun MainScreen_tab( } ) { innerPadding -> Screens_NavGraph( + navController = navController, paddingValues = innerPadding, screensViewModel = screensViewModel, bottomBarViewModel = bottomBarViewModel @@ -104,21 +118,47 @@ fun BottomBarAnimated( @Composable fun Screens_NavGraph( + navController: NavHostController, paddingValues: PaddingValues, screensViewModel: ScreensViewModel, bottomBarViewModel: BottomBarViewModel, ) { - //nav_wheel_selecting tab + val mainScreens = remember { listOf(Screen.Message, Screen.Server, Screen.MarketPlace, Screen.Setting) } + val pagerState = rememberPagerState(pageCount = { mainScreens.size }) val selectedScreen by screensViewModel.selected.collectAsState() + // 1. Sync ViewModel selection to Pager (Wheel -> Pager) + LaunchedEffect(selectedScreen) { + val targetPage = mainScreens.indexOf(selectedScreen) + if (targetPage != -1 && pagerState.currentPage != targetPage) { + pagerState.animateScrollToPage(targetPage) + } + } - when (selectedScreen) { - Screen.Message -> Tg_Message() - Screen.Server -> Tg_Server(viewModel = viewModel()) - Screen.MarketPlace -> Tg_MarketPlace() - Screen.Setting -> Tg_Setting( - bottomBarViewModel = bottomBarViewModel - ) + // 2. Sync Pager swipe to ViewModel (Pager -> Wheel) + LaunchedEffect(pagerState.currentPage) { + if (mainScreens[pagerState.currentPage] != screensViewModel.selected.value) { + screensViewModel.select(mainScreens[pagerState.currentPage]) + } + } + + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxSize(), + beyondViewportPageCount = 1, // Pre-load adjacent screens for smoothness + userScrollEnabled = true // Allow swiping between main tabs + ) { page -> + Box(modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + ) { + when (mainScreens[page]) { + Screen.Message -> Tg_Message() + Screen.Server -> Tg_Server(viewModel = viewModel()) + Screen.MarketPlace -> Tg_MarketPlace() + Screen.Setting -> Tg_Setting(bottomBarViewModel = bottomBarViewModel) + } + } } } diff --git a/app/src/main/java/com/example/login_v3/navigation/nav_Wheel_display.kt b/app/src/main/java/com/example/login_v3/navigation/nav_Wheel_display.kt index e8d01cf..f552e18 100644 --- a/app/src/main/java/com/example/login_v3/navigation/nav_Wheel_display.kt +++ b/app/src/main/java/com/example/login_v3/navigation/nav_Wheel_display.kt @@ -60,6 +60,7 @@ data class WheelItemData( @Composable fun nav_Wheel_display_block( + navController: NavHostController, screensViewModel: ScreensViewModel ) { var isPressed by remember { mutableStateOf(false) } @@ -97,7 +98,13 @@ fun nav_Wheel_display_block( ) { HorizontalWheelPicker( items = items, - onValueChange = { item -> screensViewModel.select(item.screen) }, + onValueChange = { item -> + if (screensViewModel.selected.value != item.screen) { + screensViewModel.select(item.screen) + // Note: Navigation is now handled by the Pager in MainScreen_tab + // which observes the screensViewModel.selected state. + } + }, onInteractionChanged = { isPressed = it } ) } diff --git a/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt b/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt index 307d0c0..15d27d1 100644 --- a/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt +++ b/app/src/main/java/com/example/login_v3/navigation/nav_controller.kt @@ -12,6 +12,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController import com.example.login_v3.auth.login.LoginScreen import com.example.login_v3.auth.Login_or_Reg_page import com.example.login_v3.auth.SwitchAccount.AccountSwitchScreen @@ -26,6 +28,7 @@ fun AppNavGraph( appViewModel: AppViewModel = hiltViewModel() ) { val currentScreen by appViewModel.currentScreen.collectAsState() + val navController = rememberNavController() when (currentScreen) { @@ -79,7 +82,7 @@ fun AppNavGraph( onLogout = { appViewModel.onLogout() } ) - AppScreen.ScreensTab -> MainScreen_tab() + AppScreen.ScreensTab -> MainScreen_tab(navController = navController) AppScreen.AccountSwitch -> { BackHandler {