dm-padding message-10

This commit is contained in:
eric 2026-07-09 15:52:32 +08:00
parent 47fb10d4e4
commit fd6de1796f
3 changed files with 61 additions and 11 deletions

View file

@ -12,10 +12,15 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset 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.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color 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.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 import com.example.login_v3.navigation.components.AppWallpaperBackground
@Composable @Composable
fun MainScreen_tab( fun MainScreen_tab(
navController: NavHostController,
// 注入 Theme_ViewModel 來讀取壁紙狀態 // 注入 Theme_ViewModel 來讀取壁紙狀態
themeViewModel: Theme_ViewModel = hiltViewModel() themeViewModel: Theme_ViewModel = hiltViewModel()
) { ) {
@ -64,7 +74,10 @@ fun MainScreen_tab(
.fillMaxWidth() .fillMaxWidth()
.height(navHeight) .height(navHeight)
) { ) {
nav_Wheel_display_block(screensViewModel = screensViewModel) nav_Wheel_display_block(
navController = navController,
screensViewModel = screensViewModel
)
} }
Spacer(modifier = Modifier.height(gap)) Spacer(modifier = Modifier.height(gap))
} }
@ -73,6 +86,7 @@ fun MainScreen_tab(
} }
) { innerPadding -> ) { innerPadding ->
Screens_NavGraph( Screens_NavGraph(
navController = navController,
paddingValues = innerPadding, paddingValues = innerPadding,
screensViewModel = screensViewModel, screensViewModel = screensViewModel,
bottomBarViewModel = bottomBarViewModel bottomBarViewModel = bottomBarViewModel
@ -104,21 +118,47 @@ fun BottomBarAnimated(
@Composable @Composable
fun Screens_NavGraph( fun Screens_NavGraph(
navController: NavHostController,
paddingValues: PaddingValues, paddingValues: PaddingValues,
screensViewModel: ScreensViewModel, screensViewModel: ScreensViewModel,
bottomBarViewModel: BottomBarViewModel, 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() 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) { // 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.Message -> Tg_Message()
Screen.Server -> Tg_Server(viewModel = viewModel()) Screen.Server -> Tg_Server(viewModel = viewModel())
Screen.MarketPlace -> Tg_MarketPlace() Screen.MarketPlace -> Tg_MarketPlace()
Screen.Setting -> Tg_Setting( Screen.Setting -> Tg_Setting(bottomBarViewModel = bottomBarViewModel)
bottomBarViewModel = bottomBarViewModel }
) }
} }
} }

View file

@ -60,6 +60,7 @@ data class WheelItemData(
@Composable @Composable
fun nav_Wheel_display_block( fun nav_Wheel_display_block(
navController: NavHostController,
screensViewModel: ScreensViewModel screensViewModel: ScreensViewModel
) { ) {
var isPressed by remember { mutableStateOf(false) } var isPressed by remember { mutableStateOf(false) }
@ -97,7 +98,13 @@ fun nav_Wheel_display_block(
) { ) {
HorizontalWheelPicker( HorizontalWheelPicker(
items = items, 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 } onInteractionChanged = { isPressed = it }
) )
} }

View file

@ -12,6 +12,8 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel 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.LoginScreen
import com.example.login_v3.auth.Login_or_Reg_page import com.example.login_v3.auth.Login_or_Reg_page
import com.example.login_v3.auth.SwitchAccount.AccountSwitchScreen import com.example.login_v3.auth.SwitchAccount.AccountSwitchScreen
@ -26,6 +28,7 @@ fun AppNavGraph(
appViewModel: AppViewModel = hiltViewModel() appViewModel: AppViewModel = hiltViewModel()
) { ) {
val currentScreen by appViewModel.currentScreen.collectAsState() val currentScreen by appViewModel.currentScreen.collectAsState()
val navController = rememberNavController()
when (currentScreen) { when (currentScreen) {
@ -79,7 +82,7 @@ fun AppNavGraph(
onLogout = { appViewModel.onLogout() } onLogout = { appViewModel.onLogout() }
) )
AppScreen.ScreensTab -> MainScreen_tab() AppScreen.ScreensTab -> MainScreen_tab(navController = navController)
AppScreen.AccountSwitch -> { AppScreen.AccountSwitch -> {
BackHandler { BackHandler {