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

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)
}
}
}
}