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.

531 lines
16 KiB

package com.gyf.csams.main.ui
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
3 years ago
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
3 years ago
import androidx.compose.foundation.layout.*
3 years ago
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
3 years ago
import androidx.compose.material.*
import androidx.compose.runtime.Composable
3 years ago
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.platform.LocalContext
3 years ago
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow
3 years ago
import androidx.compose.ui.tooling.preview.Preview
3 years ago
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
3 years ago
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.gyf.csams.Api
import com.gyf.csams.MainApi
3 years ago
import com.gyf.csams.R
import com.gyf.csams.activity.ui.ActivityDetailActivity
import com.gyf.csams.association.ui.AssociationActivity
import com.gyf.csams.association.ui.RegAssociationActivity
import com.gyf.csams.main.model.*
import com.gyf.csams.message.ui.MessageActivity
import com.gyf.csams.uikit.*
import com.gyf.csams.uikit.theme.CSAMSTheme
import com.gyf.csams.util.randomChinese
3 years ago
/**
* 主界面
*
*/
class MainActivity : ComponentActivity() {
lateinit var imageModel: ImageModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
imageModel = ImageModel(application = application, Api.buildUrl(MainApi.HotActivity))
setContent {
CSAMSTheme {
Body { nav, scaffoldState ->
NavHost(navController = nav, startDestination = MainMenu.Main.name) {
composable(MainMenu.Main.name) {
Main(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
composable(MainMenu.List.name) {
AssociationList(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
composable(MainMenu.Center.name) {
Center(navController = nav)
ShowSnackbar(scaffoldState = scaffoldState)
}
}
3 years ago
}
}
}
3 years ago
}
override fun onStart() {
super.onStart()
imageModel.start()
}
override fun onResume() {
super.onResume()
imageModel.start()
}
override fun onPause() {
super.onPause()
imageModel.cancel()
}
/**
* 个人中心
*
*/
@Composable
private fun Center(
model: CenterViewModel = viewModel(),
navController: NavHostController
) {
MainFrame(
background = { Background(image = BackgroundImage.Center, alpha = 0.5F) },
mainMenu = MainMenu.Center,
nav = navController
) {
val context = LocalContext.current
val info by model.info.observeAsState()
Column(
modifier = Modifier
.weight(0.3F)
.padding(10.dp),
) {
info?.let {
Row(
modifier = Modifier
.fillMaxWidth()
.weight(0.7F)
.border(width = 1.dp, color = MaterialTheme.colors.background),
horizontalArrangement = Arrangement.SpaceBetween
) {
Image(
painter = painterResource(
id = R.drawable.ic_launcher_foreground
),
contentDescription = null,
modifier = Modifier
.weight(0.4F)
.fillMaxHeight()
)
Column(
modifier = Modifier
.weight(0.4F)
.fillMaxHeight()
.border(width = 1.dp, color = MaterialTheme.colors.background),
verticalArrangement = Arrangement.SpaceEvenly,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = it.name)
Text(text = it.duty)
}
}
Spacer(modifier = Modifier.weight(0.05F))
Card(
backgroundColor = MaterialTheme.colors.background,
modifier = Modifier.weight(0.15F)
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Text(text = it.desc)
}
3 years ago
}
}
}
Column(
modifier = Modifier.weight(0.7F),
verticalArrangement = Arrangement.SpaceEvenly
) {
CenterMenuItem(text = model.myAssociationDesc) {
context.startActivity(Intent(context, AssociationActivity::class.java))
}
CenterMenuItem(text = model.myJoinActivity)
CenterMenuItem(text = model.myLikeActivity)
CenterMenuItem(text = model.myCollectActivity)
}
}
}
@Composable
private fun CenterMenuItem(text: String, onClick: () -> Unit = {}) {
Card(backgroundColor = MaterialTheme.colors.background) {
3 years ago
Row(
modifier = Modifier
.fillMaxWidth()
.clickable(onClick = onClick),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Spacer(modifier = Modifier)
Row {
Text(text = text)
}
Row {
Icon(
painter = painterResource(id = R.drawable.ic_arrow_right),
contentDescription = null,
modifier = Modifier.size(50.dp)
)
}
3 years ago
}
}
}
/**
* 主界面
*/
@Composable
private fun Main(navController: NavHostController) {
MainFrame(
background = { Background(image = BackgroundImage.Main) },
mainMenu = MainMenu.Main,
nav = navController
) {
Column(modifier = Modifier.weight(0.33F)) {
Notification()
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 15.dp),
verticalArrangement = Arrangement.SpaceEvenly
) {
MessageBoard()
ClubActivitiesTitle()
}
}
Column(modifier = Modifier.weight(0.66F)) {
PosterWithDesc()
}
3 years ago
}
}
/**
* 社团列表
*
* @param navController
*/
@Composable
private fun AssociationList(navController: NavHostController) {
MainFrame(
background = { Background(image = BackgroundImage.AssociationList) },
mainMenu = MainMenu.List,
nav = navController
) {
RegisterAssociation()
AssociationSearch()
AssociationListBody()
}
3 years ago
}
/**
* 注册社团按钮
*
*/
@Composable
private fun RegisterAssociation() {
val context = LocalContext.current
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp)
) {
IconButton(onClick = {
context.startActivity(Intent(context, RegAssociationActivity::class.java))
}) {
Icon(
painter = painterResource(id = R.drawable.ic_add_fill),
contentDescription = null,
modifier = Modifier.size(50.dp),
)
}
}
3 years ago
}
/**
* 社团列表
*
*/
@Composable
private fun AssociationListBody(
model: ListViewModel = viewModel(),
scaffoldModel: ScaffoldModel = viewModel()
) {
val associationList: MutableList<AssociationDto>? by model.associationDto.observeAsState()
val listState = rememberLazyListState()
LazyColumn(state = listState) {
associationList?.chunked(2)?.forEach {
item {
Row {
Spacer(modifier = Modifier.weight(0.1F))
3 years ago
Box(modifier = Modifier.weight(0.35F)) {
Association(associationDto = it[0])
3 years ago
}
Spacer(modifier = Modifier.weight(0.05F))
if (it.size == 2) {
Box(modifier = Modifier.weight(0.35F)) {
Association(associationDto = it[1])
}
} else {
Box(
modifier = Modifier
.weight(0.35F)
.border(width = 1.dp, color = MaterialTheme.colors.onBackground)
)
}
Spacer(modifier = Modifier.weight(0.1F))
3 years ago
}
Spacer(
modifier = Modifier
.fillMaxWidth()
.height(10.dp)
)
3 years ago
}
}
}
3 years ago
if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.associationListSize / 2 - 1) {
model.loadMore { scaffoldModel.update(message = it) }
}
3 years ago
}
@Composable
private fun Association(associationDto: AssociationDto) {
val context = LocalContext.current
Card(modifier = Modifier.clickable(onClick = {
context.startActivity(
Intent(
context,
AssociationActivity::class.java
)
)
})) {
Image(
painter = painterResource(id = R.drawable.association_list_border),
contentDescription = null
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
Text(text = associationDto.name)
}
3 years ago
}
}
/**
* 社团检索
*
*/
@Composable
private fun AssociationSearch(
model: ListViewModel = viewModel(),
scaffoldModel: ScaffoldModel = viewModel()
) {
Card(modifier = Modifier.padding(horizontal = 50.dp, vertical = 10.dp)) {
Column {
BaseTextField(
form = model.name,
singeLine = true,
modifier = Modifier.padding(horizontal = 10.dp)
)
BaseTextField(
form = model.desc,
singeLine = true,
modifier = Modifier.padding(horizontal = 10.dp)
)
Spacer(
modifier = Modifier.height(10.dp)
)
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier.fillMaxWidth()
) {
OutlinedButton(
onClick = { model.search { scaffoldModel.update(message = it) } },
modifier = Modifier.width(100.dp)
) {
Text(text = model.searchDesc)
}
3 years ago
}
Spacer(
modifier = Modifier.height(10.dp)
)
3 years ago
}
3 years ago
}
}
/**
* 通知
*
*/
@Composable
private fun Notification() {
val context = LocalContext.current
Row(
horizontalArrangement = Arrangement.End,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp)
) {
IconButton(onClick = {
context.startActivity(Intent(context, MessageActivity::class.java))
}) {
Icon(
painter = painterResource(id = R.drawable.ic_notification),
contentDescription = null
)
}
3 years ago
}
3 years ago
}
/**
* 留言板
*
*/
@Composable
private fun MessageBoard(
modifier: Modifier = Modifier,
model: MarqueeViewModel = viewModel(),
mainViewModel: MainViewModel = viewModel()
) {
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
3 years ago
IconButton(onClick = { mainViewModel.openDialog() }) {
Icon(
painter = painterResource(id = R.drawable.ic_comments),
contentDescription = null,
)
}
SendComment(model = mainViewModel)
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier
.fillMaxWidth()
) {
Marquee(model = model) { model, value ->
MarqueeText(
model = model,
offset = value
)
}
}
}
}
}
/**
* 活动标题
*
*/
@Composable
private fun ClubActivitiesTitle(modifier: Modifier = Modifier) {
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
3 years ago
Row(
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically
3 years ago
) {
Text(
text = "超级课程表X滴滴出行-了不起的社团",
style = MaterialTheme.typography.h6,
overflow = TextOverflow.Ellipsis,
maxLines = 1
)
3 years ago
}
}
}
/**
* 带介绍活动海报
*
*/
@Composable
private fun PosterWithDesc() {
val context = LocalContext.current as MainActivity
Carousel(imageBitmap = context.imageModel.image) {
Column(modifier = Modifier.clickable(onClick = {
context.startActivity(Intent(context, ActivityDetailActivity::class.java))
})) {
Poster(
modifier = Modifier
.weight(0.6F)
.fillMaxWidth()
)
DescCard(
modifier = Modifier
.weight(0.4F)
.fillMaxWidth(),
content = randomChinese(500)
)
}
3 years ago
}
}
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
CSAMSTheme {
Text(text = "666")
3 years ago
}
}
}
3 years ago
3 years ago