package com.gyf.csams.association.ui import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Image import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.PopupProperties import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import com.gyf.csams.R import com.gyf.csams.activity.ui.ActivityDetailActivity import com.gyf.csams.association.model.* import com.gyf.csams.uikit.* import com.gyf.csams.uikit.theme.CSAMSTheme import com.gyf.csams.util.randomChinese import com.orhanobut.logger.Logger /** * 社团界面 * */ class AssociationActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { CSAMSTheme { Body { nav, scaffoldState -> val context = LocalContext.current as AssociationActivity val model: AssociationViewModel = viewModel() val currentMenuName: AssociationMenu by model.currentMenu.observeAsState( AssociationMenu.startMenu ) val intent = Intent(context, ExamActivity::class.java) val expanded by model.expanded.observeAsState(false) Column { Logger.i("expanded=$expanded") TextTopAppBar(nav = nav, currentMenuName = currentMenuName.menuName, menuNames = AssociationMenu.values(), iconMenu = { model.switchType() }) { Row { DropdownMenu( expanded = expanded, onDismissRequest = { /*TODO*/ }, // offset = DpOffset.Zero.copy(x=50.dp), properties = PopupProperties() ) { DropdownMenuItem(onClick = { model.close() }) { Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "申请活动") Icon( painter = painterResource(id = R.drawable.ic_add_fill), contentDescription = null ) } } DropdownMenuItem(onClick = { intent.apply { putExtra( ExamActivityType::name.name, ExamActivityType.SET_EXAM ) } context.startActivity(intent) model.close() }) { Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "设置题库") Icon( painter = painterResource(id = R.drawable.ic_editor), contentDescription = null ) } } DropdownMenuItem(onClick = { context.startActivity( Intent( context, ReNameActivity::class.java ) ) model.close() }) { Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "社团命名") Icon( painter = painterResource(id = R.drawable.ic_exchange_rate), contentDescription = null ) } } DropdownMenuItem(onClick = { intent.apply { putExtra( ExamActivityType::name.name, ExamActivityType.JOIN_Association ) } context.startActivity(intent) model.close() }) { Row(verticalAlignment = Alignment.CenterVertically) { Text(text = "申请入团") Icon( painter = painterResource(id = R.drawable.ic_add_account), contentDescription = null ) } } DropdownMenuItem(onClick = { model.close() }) { Row(verticalAlignment = Alignment.CenterVertically) { Icon( painter = painterResource(id = R.drawable.ic_arrow_up), contentDescription = null, modifier = Modifier .height(30.dp) .fillMaxWidth() ) } } } } } NavHost( navController = nav, startDestination = AssociationMenu.startMenu.name ) { composable(AssociationMenu.Member.name) { model.clickMenu(AssociationMenu.Member) Member() ShowSnackbar(scaffoldState = scaffoldState) } composable(AssociationMenu.Main.name) { model.clickMenu(AssociationMenu.Main) Main() ShowSnackbar(scaffoldState = scaffoldState) } composable(AssociationMenu.ActivityList.name) { model.clickMenu(AssociationMenu.ActivityList) AssociationList() ShowSnackbar(scaffoldState = scaffoldState) } } } } } } } /** * 社团成员 * */ @Composable private fun Member() { MainFrame(background = { Background(image = BackgroundImage.AssociationMain) }) { val searchWeight = 0.2F Search( modifier = Modifier .fillMaxWidth() .weight(searchWeight) ) MemberList( modifier = Modifier .fillMaxWidth() .weight(1 - searchWeight) ) } } /** * 检索成员 * */ @Composable private fun Search( modifier: Modifier = Modifier, model: MemberViewModel = viewModel(), scaffoldModel: ScaffoldModel = viewModel() ) { Column(modifier = modifier.fillMaxSize()) { Spacer(modifier = Modifier.weight(0.5F)) Row( modifier = Modifier .fillMaxWidth() .weight(0.5F), verticalAlignment = Alignment.CenterVertically ) { val textFieldWeight = 0.4F val buttonWeight = 0.2F val spaceWeight = (1 - textFieldWeight - buttonWeight) / 3 Spacer(modifier = Modifier.weight((spaceWeight))) BaseTextField( modifier = Modifier.weight(textFieldWeight), form = model.name, singeLine = true ) Spacer(modifier = Modifier.weight(spaceWeight)) OutlinedButton( onClick = { model.search { scaffoldModel.update(message = it) } }, modifier = Modifier.weight(buttonWeight) ) { Text(text = model.search) } Spacer(modifier = Modifier.weight(spaceWeight)) } } } /** * 成员列表 * */ @Composable private fun MemberList( modifier: Modifier = Modifier, model: MemberViewModel = viewModel(), scaffoldModel: ScaffoldModel = viewModel() ) { val list: MutableList? by model.memberList.observeAsState() val listState = rememberLazyListState() LazyColumn(state = listState, modifier = modifier) { list?.forEach { item { Column { Spacer(modifier = Modifier.height(10.dp)) Row { val weight = 1F / 3 Spacer(modifier = Modifier.weight(weight)) Card( modifier = Modifier.weight(weight), backgroundColor = MaterialTheme.colors.background ) { Text(text = it.name) } Spacer(modifier = Modifier.weight(weight)) } Spacer(modifier = Modifier.height(10.dp)) Divider(color = MaterialTheme.colors.background) } } } item { Row( horizontalArrangement = Arrangement.Center, modifier = Modifier.fillMaxWidth() ) { IconButton(onClick = { model.loadMore { scaffoldModel.update(message = it) } }) { Icon( painter = painterResource(id = R.drawable.ic_arrow_down), contentDescription = null ) } } } } } /** * 社团主页 * */ @Composable private fun Main() { MainFrame(background = { Background(image = BackgroundImage.AssociationMain, alpha = 0.7F) }) { val nameW = 0.1F val cardW = 0.66F * 0.4F Name( modifier = Modifier .fillMaxWidth() .weight(nameW) ) DescCard( modifier = Modifier .weight(cardW) .fillMaxWidth(), content = randomChinese(500) ) Commander( modifier = Modifier.weight(cardW) ) Showcase(modifier = Modifier.weight(1F - nameW - cardW - cardW)) } } /** * 社团名字 * * @param modifier */ @Composable private fun Name(modifier: Modifier) { Box(modifier = modifier) { Image( painter = painterResource(id = R.drawable.association_name_border), contentDescription = null, contentScale = ContentScale.FillBounds, modifier = Modifier.fillMaxSize() ) Column { Spacer(modifier = Modifier.weight(1.7F / 3)) Row( modifier = Modifier .fillMaxWidth() .weight(1F / 3), horizontalArrangement = Arrangement.Center ) { Text(text = "社团名字") } Spacer(modifier = Modifier.weight(0.3F / 3)) } } } /** * 团长名字 * * @param modifier */ @Composable private fun Commander(modifier: Modifier) { Box(modifier = modifier, contentAlignment = Alignment.Center) { Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { Image( painter = painterResource(id = R.drawable.persion_name_border), contentDescription = null ) } Text(text = "团长") } } /** * 风采展示区 * * @param modifier */ @Composable private fun Showcase(modifier: Modifier) { Box(modifier = modifier, contentAlignment = Alignment.Center) { Image( painter = painterResource(id = R.drawable.showcase_border), contentDescription = null, modifier = Modifier.fillMaxSize() ) Image( painter = painterResource(id = R.drawable.ic_launcher_foreground), contentDescription = null ) } } /** * 活动列表 * */ @Composable private fun AssociationList() { MainFrame(background = { Background( image = BackgroundImage.AssociationMain, alpha = 07F ) }) { val onGoWeight = 0.3F OngoingActivity( modifier = Modifier .weight(onGoWeight) .fillMaxWidth() ) HistoryActivityList( modifier = Modifier .fillMaxWidth() .weight(1 - onGoWeight) .border(width = 1.dp, color = MaterialTheme.colors.onBackground) ) } } /** * 进行中的活动 * */ @Composable private fun OngoingActivity( modifier: Modifier = Modifier, model: OngoingActViewModel = viewModel() ) { val context = LocalContext.current val act by model.act.observeAsState() // TODO 解决Build Warnning Logger.i("$act") Row(modifier = modifier.clickable(onClick = { context.startActivity(Intent(context, ActivityDetailActivity::class.java)) }), horizontalArrangement = Arrangement.Center) { val weight = 0.5F val spaceWeight = (1 - 0.5F) / 2 Spacer(modifier = Modifier.weight(spaceWeight)) Poster(modifier = Modifier.weight(weight)) Spacer(modifier = Modifier.weight(spaceWeight)) } } /** * 历史活动列表 * * @param modifier */ @Composable private fun HistoryActivityList( modifier: Modifier, model: HistoryActViewModel = viewModel(), scaffoldModel: ScaffoldModel = viewModel() ) { val listState = rememberLazyListState() val list by model.data.observeAsState() LazyColumn(state = listState, modifier = modifier) { list?.chunked(2)?.forEach { item { Row(modifier = Modifier.fillMaxWidth()) { HistoryActivity(modifier = Modifier.weight(0.4F), it[0]) Spacer(modifier = Modifier.weight(0.2F)) if (it.size == 2) HistoryActivity(modifier = Modifier.weight(0.4F), it[1]) else Box(modifier = Modifier.weight(0.4F)) } Spacer(modifier = Modifier.height(10.dp)) Divider(color = MaterialTheme.colors.background) } } } if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.initSize / 2 - 1) { model.loadMore { scaffoldModel.update(message = it) } } } /** * 历史活动 * * @param modifier */ @Composable private fun HistoryActivity(modifier: Modifier, historyActVo: HistoryActVo) { val context = LocalContext.current Box(modifier = modifier.clickable(onClick = { context.startActivity(Intent(context, ActivityDetailActivity::class.java)) }), contentAlignment = Alignment.Center) { Image( painter = painterResource(id = R.drawable.history_activity_border), contentDescription = null, modifier = Modifier.fillMaxSize() ) Image( painter = painterResource(id = R.drawable.ic_launcher_foreground), contentDescription = null, modifier = Modifier.fillMaxSize() ) Text(text = historyActVo.name) } } @Preview @Composable fun NamePreview() { Divider(color = MaterialTheme.colors.background) } }