dm-padding message-10
This commit is contained in:
parent
47fb10d4e4
commit
fd6de1796f
3 changed files with 61 additions and 11 deletions
|
|
@ -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
|
}
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue