You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
4.3 KiB
194 lines
4.3 KiB
package com.gyf.lib.uikit
|
|
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.material.*
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.navigation.NavHostController
|
|
|
|
import androidx.navigation.compose.rememberNavController
|
|
import com.gyf.lib.uikit.theme.CSAMSTheme
|
|
|
|
|
|
interface MenuEnum {
|
|
val name: String
|
|
}
|
|
|
|
interface BottomBarMenu : MenuEnum {
|
|
val selectedIcon: Int
|
|
val unSelectedIcon: Int
|
|
fun allMenu(): Array<out BottomBarMenu>
|
|
}
|
|
|
|
|
|
/**
|
|
* 导航界面框架
|
|
*
|
|
* @param background 背景
|
|
* @param mainMenu 菜单
|
|
* @param nav 导航
|
|
* @param body 内容
|
|
*/
|
|
@Composable
|
|
fun <T : BottomBarMenu> MainColumnFrame(
|
|
background: @Composable () -> Unit,
|
|
mainMenu: T,
|
|
nav: NavHostController,
|
|
body: @Composable ColumnScope.() -> Unit
|
|
) {
|
|
Box(modifier = Modifier.fillMaxSize()) {
|
|
background()
|
|
Column {
|
|
Column(modifier = Modifier.weight(0.9F), content = body)
|
|
MainBottomAppBar(
|
|
menu = mainMenu,
|
|
nav = nav
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 界面框架
|
|
*
|
|
* @param background
|
|
* @param body
|
|
*/
|
|
@Composable
|
|
fun MainColumnFrame(
|
|
background: @Composable () -> Unit,
|
|
body: @Composable ColumnScope.() -> Unit
|
|
) {
|
|
Box(modifier = Modifier.fillMaxSize()) {
|
|
background()
|
|
Column(content = body)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 界面框架
|
|
*
|
|
* @param background
|
|
* @param body
|
|
*/
|
|
@Composable
|
|
fun MainBoxFrame(
|
|
contentAlignment: Alignment = Alignment.TopStart,
|
|
background: @Composable () -> Unit,
|
|
body: @Composable BoxScope.() -> Unit
|
|
) {
|
|
Box(
|
|
modifier = Modifier.fillMaxSize(),
|
|
contentAlignment = contentAlignment
|
|
) {
|
|
background()
|
|
body()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 底部菜单按钮
|
|
*
|
|
* @param _menu
|
|
* @param menu
|
|
* @param modifier
|
|
* @param onClick
|
|
*/
|
|
@Composable
|
|
fun <T : BottomBarMenu> MenuIconButton(
|
|
_menu: T,
|
|
menu: T,
|
|
modifier: Modifier = Modifier,
|
|
onClick: () -> Unit
|
|
) {
|
|
Row(
|
|
modifier = modifier, horizontalArrangement = Arrangement.Center
|
|
) {
|
|
IconButton(onClick = onClick) {
|
|
Icon(
|
|
painter = painterResource(id = if (_menu == menu) menu.selectedIcon else menu.unSelectedIcon),
|
|
contentDescription = null
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 主界面底部菜单
|
|
*
|
|
* @param menu
|
|
* @param nav
|
|
* @param modifier
|
|
*/
|
|
@Composable
|
|
fun <T : BottomBarMenu> MainBottomAppBar(
|
|
menu: T,
|
|
nav: NavHostController,
|
|
modifier: Modifier = Modifier
|
|
) {
|
|
BottomAppBar(backgroundColor = MaterialTheme.colors.background, modifier = modifier) {
|
|
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) {
|
|
menu.allMenu().forEach {
|
|
MenuIconButton(_menu = menu, menu = it,
|
|
onClick = { nav.navigate(it.name) })
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
*
|
|
*
|
|
* @param content
|
|
*/
|
|
@Composable
|
|
fun BodyS(content: @Composable () -> Unit) {
|
|
CSAMSTheme {
|
|
Surface(color = MaterialTheme.colors.background) {
|
|
val scaffoldState = rememberScaffoldState()
|
|
|
|
Scaffold(scaffoldState = scaffoldState) {
|
|
content()
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 带底部导航的界面框架
|
|
*
|
|
* @param content
|
|
*/
|
|
@Composable
|
|
fun Body(content: @Composable (nav: NavHostController) -> Unit) {
|
|
CSAMSTheme {
|
|
Surface(color = MaterialTheme.colors.background) {
|
|
val navController = rememberNavController()
|
|
val scaffoldState = rememberScaffoldState()
|
|
|
|
Scaffold(scaffoldState = scaffoldState) {
|
|
content(nav = navController)
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
fun TestBody(content: @Composable (nav: NavHostController, scaffoldState: ScaffoldState) -> Unit) {
|
|
CSAMSTheme {
|
|
Surface(color = MaterialTheme.colors.background) {
|
|
val navController = rememberNavController()
|
|
val scaffoldState = rememberScaffoldState()
|
|
|
|
Scaffold(scaffoldState = scaffoldState) {
|
|
content(nav = navController, scaffoldState = scaffoldState)
|
|
}
|
|
}
|
|
}
|
|
} |