Extract components

This commit is contained in:
Sebastian Seedorf
2021-11-19 21:46:04 +01:00
parent adff1fea0c
commit c07730587d
5 changed files with 103 additions and 75 deletions

View File

@@ -2,8 +2,6 @@ package de.sebse.fuplanner2.ui.details
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -20,6 +18,7 @@ import de.sebse.fuplanner2.database.Course
import de.sebse.fuplanner2.ui.details.components.AnnouncementItem import de.sebse.fuplanner2.ui.details.components.AnnouncementItem
import de.sebse.fuplanner2.ui.details.components.LecturerItem import de.sebse.fuplanner2.ui.details.components.LecturerItem
import de.sebse.fuplanner2.ui.details.components.QuickLinks import de.sebse.fuplanner2.ui.details.components.QuickLinks
import de.sebse.fuplanner2.ui.shared.Heading
import de.sebse.fuplanner2.ui.theme.AppTheme import de.sebse.fuplanner2.ui.theme.AppTheme
import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider
import de.sebse.fuplanner2.ui.tools.previews.CoursePreviewProvider import de.sebse.fuplanner2.ui.tools.previews.CoursePreviewProvider
@@ -49,24 +48,18 @@ fun CourseDetailsScreen(course: Course?, announcement: List<Announcement>?, id:
LazyColumn { LazyColumn {
item { item {
QuickLinks(courseId = id) QuickLinks(courseId = id)
Text( Heading(stringResource(R.string.lecturers))
text = stringResource(R.string.lecturers),
style = MaterialTheme.typography.h5
)
} }
items(course?.lecturers ?: listOf()) { items(course?.lecturers ?: listOf()) {
LecturerItem(lecturer = it, courseTitle = course?.title ?: "") LecturerItem(lecturer = it, courseTitle = course?.title ?: "")
} }
item { item {
Text( Heading(stringResource(R.string.announcements))
text = stringResource(R.string.announcements),
style = MaterialTheme.typography.h5
)
} }
items(items = announcements) { items(items = announcements) {
AnnouncementItem(it) AnnouncementItem(it)
} }
// TODO: Add latest announcements, current assignments, upcoming events // TODO: Add current assignments, upcoming events
} }
} }

View File

@@ -1,20 +1,15 @@
package de.sebse.fuplanner2.ui.details.components package de.sebse.fuplanner2.ui.details.components
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Card
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import de.sebse.fuplanner2.R
import de.sebse.fuplanner2.database.Announcement import de.sebse.fuplanner2.database.Announcement
import de.sebse.fuplanner2.ui.shared.FuCardColumn
import de.sebse.fuplanner2.ui.theme.AppTheme import de.sebse.fuplanner2.ui.theme.AppTheme
import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider
import de.sebse.fuplanner2.utils.toDateTimeString import de.sebse.fuplanner2.utils.toDateTimeString
@@ -26,26 +21,18 @@ fun AnnouncementItem(announcement: Announcement) {
@Composable @Composable
fun AnnouncementItem(announcement: Announcement, click: () -> Unit) { fun AnnouncementItem(announcement: Announcement, click: () -> Unit) {
Card( FuCardColumn(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .clickable(true, onClick = click)
.padding(dimensionResource(R.dimen.card_view_margin)),
elevation = dimensionResource(R.dimen.card_view_elevation)
) { ) {
Column( Text(
modifier = Modifier text = announcement.title ?: "Title",
.clickable(true, onClick = click) style = MaterialTheme.typography.h6
.padding(dimensionResource(R.dimen.card_view_padding)) )
) { Text(
Text( text = announcement.createdOn.toDateTimeString(LocalContext.current) ?: "",
text = announcement.title ?: "Title", style = MaterialTheme.typography.subtitle1
style = MaterialTheme.typography.h6 )
)
Text(
text = announcement.createdOn.toDateTimeString(LocalContext.current) ?: "",
style = MaterialTheme.typography.subtitle1
)
}
} }
} }

View File

@@ -5,24 +5,21 @@ import android.content.Intent
import android.net.Uri import android.net.Uri
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.Card
import androidx.compose.material.Icon import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.Email
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import de.sebse.fuplanner2.R import de.sebse.fuplanner2.R
import de.sebse.fuplanner2.database.Lecturer import de.sebse.fuplanner2.database.Lecturer
import de.sebse.fuplanner2.ui.shared.FuCardRow
import de.sebse.fuplanner2.ui.theme.AppTheme import de.sebse.fuplanner2.ui.theme.AppTheme
import de.sebse.fuplanner2.ui.tools.previews.LecturerPreviewProvider import de.sebse.fuplanner2.ui.tools.previews.LecturerPreviewProvider
@@ -38,47 +35,39 @@ fun LecturerItem(lecturer: Lecturer, courseTitle: String) {
@Composable @Composable
fun LecturerItem(lecturer: Lecturer, click: () -> Unit) { fun LecturerItem(lecturer: Lecturer, click: () -> Unit) {
Card( FuCardRow(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .clickable(true, onClick = click)
.padding(dimensionResource(R.dimen.card_view_margin)), .height(IntrinsicSize.Min)
elevation = dimensionResource(R.dimen.card_view_elevation)
) { ) {
Row( Column(
modifier = Modifier modifier = Modifier
.clickable(true, onClick = click) .weight(1f)
.padding(dimensionResource(R.dimen.card_view_padding)),
verticalAlignment = Alignment.CenterVertically
) { ) {
Column( val textDecor = if (lecturer.isResponsible) TextDecoration.Underline else null
Text(
text = stringResource(
R.string.full_name,
lecturer.firstName,
lecturer.lastName
),
textDecoration = textDecor,
style = MaterialTheme.typography.h6
)
Text(
text = lecturer.email,
style = MaterialTheme.typography.subtitle1
)
}
Column {
Icon(
Icons.Filled.Email,
contentDescription = stringResource(R.string.mail_icon),
tint = MaterialTheme.colors.secondary,
modifier = Modifier modifier = Modifier
.weight(1f) .fillMaxHeight()
) { .aspectRatio(1f, true)
val textDecor = if (lecturer.isResponsible) TextDecoration.Underline else null )
Text(
text = stringResource(
R.string.full_name,
lecturer.firstName,
lecturer.lastName
),
textDecoration = textDecor,
style = MaterialTheme.typography.h6
)
Text(
text = lecturer.email,
style = MaterialTheme.typography.subtitle1
)
}
Column {
Icon(
Icons.Filled.Email,
contentDescription = stringResource(R.string.mail_icon),
tint = MaterialTheme.colors.secondary,
modifier = Modifier
.height(70.dp)
.aspectRatio(1f, true)
)
}
} }
} }
} }

View File

@@ -0,0 +1,46 @@
package de.sebse.fuplanner2.ui.shared
import androidx.compose.foundation.layout.*
import androidx.compose.material.Card
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.dimensionResource
import de.sebse.fuplanner2.R
@Composable
fun FuCardColumn(
modifier: Modifier,
content :@Composable (ColumnScope.() -> Unit)
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(dimensionResource(R.dimen.card_view_margin)),
elevation = dimensionResource(R.dimen.card_view_elevation)
) {
Column(
modifier = modifier
.padding(dimensionResource(R.dimen.card_view_padding)),
content = content
)
}
}
@Composable
fun FuCardRow(
modifier: Modifier,
content :@Composable (RowScope.() -> Unit)
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(dimensionResource(R.dimen.card_view_margin)),
elevation = dimensionResource(R.dimen.card_view_elevation)
) {
Row (
modifier = modifier
.padding(dimensionResource(R.dimen.card_view_padding)),
content = content
)
}
}

View File

@@ -0,0 +1,13 @@
package de.sebse.fuplanner2.ui.shared
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
@Composable
fun Heading(text: String) {
Text(
text = text,
style = MaterialTheme.typography.h5
)
}