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.
394 lines
12 KiB
394 lines
12 KiB
package com.gyf.csams.main.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.foundation.shape.RoundedCornerShape
|
|
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.platform.LocalContext
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.compose.ui.text.style.TextOverflow
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
import androidx.navigation.NavHostController
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import com.gyf.csams.R
|
|
import com.gyf.csams.association.ui.AssociationActivity
|
|
import com.gyf.csams.association.ui.RegAssociationActivity
|
|
import com.gyf.csams.main.model.*
|
|
import com.gyf.csams.uikit.*
|
|
import com.gyf.csams.uikit.theme.CSAMSTheme
|
|
|
|
|
|
/**
|
|
* 主界面
|
|
*
|
|
*/
|
|
class MainActivity : ComponentActivity() {
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
|
|
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)
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 个人中心
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun Center(model:CenterViewModel= viewModel(), scaffoldModel: ScaffoldModel= viewModel(), navController: NavHostController){
|
|
MainFrame(background = { Background(image = BackgroundImage.center,alpha = 0.5F) }, mainMenu = MainMenu.Center, nav = navController) {
|
|
Column(modifier = Modifier
|
|
.weight(0.33F)
|
|
.fillMaxWidth(),verticalArrangement = Arrangement.Bottom) {
|
|
Card(backgroundColor = MaterialTheme.colors.background) {
|
|
val context= LocalContext.current
|
|
Row(modifier = Modifier
|
|
.fillMaxWidth()
|
|
.clickable(onClick = {
|
|
context.startActivity(Intent(context, AssociationActivity::class.java))
|
|
}),verticalAlignment = Alignment.CenterVertically) {
|
|
Spacer(modifier = Modifier.weight(0.33F))
|
|
Row(modifier = Modifier.weight(0.33F),horizontalArrangement = Arrangement.Center) {
|
|
Text(text = model.myAssociationDesc)
|
|
}
|
|
Row(modifier = Modifier.weight(0.33F),horizontalArrangement = Arrangement.End) {
|
|
Icon(
|
|
painter = painterResource(id = R.drawable.ic_arrow_right),
|
|
contentDescription = null,
|
|
modifier = Modifier.size(50.dp)
|
|
)
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
Spacer(modifier = Modifier
|
|
.weight(0.66F)
|
|
.fillMaxWidth())
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 主界面
|
|
*/
|
|
@Composable
|
|
private fun Main(navController: NavHostController) {
|
|
MainFrame(background = { Background(image = BackgroundImage.main) }, mainMenu = MainMenu.Main, nav = navController) {
|
|
Column(modifier = Modifier.weight(0.33F)) {
|
|
Notification()
|
|
MessageBoard()
|
|
Spacer(modifier = Modifier.height(10.dp))
|
|
ClubActivitiesTitle()
|
|
Spacer(modifier = Modifier.height(10.dp))
|
|
}
|
|
Column(modifier = Modifier.weight(0.66F)) {
|
|
PosterWithDesc()
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 社团列表
|
|
*
|
|
* @param navController
|
|
*/
|
|
@Composable
|
|
private fun AssociationList(navController: NavHostController) {
|
|
MainFrame(
|
|
background = { Background(image = BackgroundImage.list) },
|
|
mainMenu = MainMenu.List,
|
|
nav = navController
|
|
) {
|
|
RegisterAssociation()
|
|
AssociationSearch()
|
|
AssociationListBody()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 注册社团按钮
|
|
*
|
|
*/
|
|
@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),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 社团列表
|
|
*
|
|
*/
|
|
@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))
|
|
Box(modifier = Modifier.weight(0.35F)) {
|
|
Association(associationDto = it[0])
|
|
}
|
|
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))
|
|
}
|
|
Spacer(modifier = Modifier
|
|
.fillMaxWidth()
|
|
.height(10.dp))
|
|
}
|
|
}
|
|
}
|
|
|
|
if(listState.layoutInfo.totalItemsCount-listState.firstVisibleItemIndex==model.associationListSize/2-1){
|
|
model.loadMore { scaffoldModel.update(message=it) }
|
|
}
|
|
}
|
|
|
|
@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)
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 社团检索
|
|
*
|
|
*/
|
|
@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)
|
|
}
|
|
}
|
|
Spacer(
|
|
modifier = Modifier.height(10.dp)
|
|
)
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 通知
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun Notification(mainViewModel: MainViewModel= viewModel(),scaffoldModel: ScaffoldModel= viewModel()) {
|
|
Row(
|
|
horizontalArrangement = Arrangement.End,
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(10.dp)
|
|
) {
|
|
IconButton(onClick = {
|
|
mainViewModel.openNotification { scaffoldModel.update(message=it) }
|
|
}) {
|
|
Icon(
|
|
painter = painterResource(id = R.drawable.ic_notification),
|
|
contentDescription = null
|
|
)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 圆角矩形边框
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun MyBorder(content: @Composable BoxScope.() -> Unit) {
|
|
Box(modifier = Modifier.padding(horizontal = 15.dp)) {
|
|
Box(
|
|
modifier = Modifier
|
|
.border(
|
|
width = 1.dp,
|
|
color = MaterialTheme.colors.onBackground,
|
|
shape = RoundedCornerShape(size = 20.dp)
|
|
),
|
|
) {
|
|
content()
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 留言板
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun MessageBoard(model: MarqueeViewModel = viewModel(),mainViewModel:MainViewModel= viewModel(),scaffoldModel: ScaffoldModel= viewModel()) {
|
|
MyBorder {
|
|
Row(
|
|
verticalAlignment = Alignment.CenterVertically
|
|
) {
|
|
|
|
|
|
IconButton(onClick = { mainViewModel.sendMessage { scaffoldModel.update(message=it) } }) {
|
|
Icon(
|
|
painter = painterResource(id = R.drawable.ic_comments),
|
|
contentDescription = null,
|
|
)
|
|
}
|
|
Row(
|
|
horizontalArrangement = Arrangement.Center,
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
) {
|
|
Marquee(model = model) { model, value ->
|
|
MarqueeText(
|
|
model = model,
|
|
offset = value
|
|
)
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 活动标题
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun ClubActivitiesTitle() {
|
|
MyBorder {
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.height(50.dp),
|
|
horizontalArrangement = Arrangement.Center,
|
|
verticalAlignment = Alignment.CenterVertically
|
|
) {
|
|
Text(
|
|
text = "超级课程表X滴滴出行-了不起的社团",
|
|
style = MaterialTheme.typography.h6,
|
|
overflow = TextOverflow.Ellipsis,
|
|
maxLines = 1
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 带介绍活动海报
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun PosterWithDesc(model: CarouselViewModel = viewModel()) {
|
|
Carousel(model = model) {
|
|
Column {
|
|
Poster(modifier = Modifier
|
|
.weight(0.6F)
|
|
.fillMaxWidth(),id = it)
|
|
DescCard(
|
|
modifier = Modifier
|
|
.weight(0.4F)
|
|
.fillMaxWidth()
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@Preview(showBackground = true)
|
|
@Composable
|
|
fun DefaultPreview() {
|
|
CSAMSTheme {
|
|
Text(text = "666")
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|