Add UI basics
This commit is contained in:
parent
b33a478704
commit
3d3a263855
3 changed files with 202 additions and 0 deletions
|
@ -0,0 +1,62 @@
|
||||||
|
package be.ugent.sel.studeez.common.composable
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.material.FloatingActionButton
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.IconButton
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Add
|
||||||
|
import androidx.compose.material.icons.filled.Check
|
||||||
|
import androidx.compose.material.icons.filled.DateRange
|
||||||
|
import androidx.compose.material.icons.filled.Person
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import be.ugent.sel.studeez.ui.theme.StudeezTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CollapsedAddButton() {
|
||||||
|
FloatingActionButton(
|
||||||
|
onClick = { /* TODO popup add options */ }
|
||||||
|
) {
|
||||||
|
Icon(imageVector = Icons.Default.Add, contentDescription = "fab")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun ExpandedAddButton() {
|
||||||
|
Row() {
|
||||||
|
IconButton(onClick = { /* TODO Go to next step */ }) {
|
||||||
|
Column (horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Icon(imageVector = Icons.Default.Check, contentDescription = "Task")
|
||||||
|
Text(text = "Task")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IconButton(onClick = { /* TODO Go to next step */ }) {
|
||||||
|
Column (horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Icon(imageVector = Icons.Default.Person, contentDescription = "Friend")
|
||||||
|
Text(text = "Friend")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IconButton(onClick = { /* TODO Go to next step */ }) {
|
||||||
|
Column (horizontalAlignment = Alignment.CenterHorizontally) {
|
||||||
|
Icon(imageVector = Icons.Default.DateRange, contentDescription = "Session")
|
||||||
|
Text(text = "Session")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun CollapsedAddButtonPreview() {
|
||||||
|
StudeezTheme { CollapsedAddButton() }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun ExpandedAddButtonPreview() {
|
||||||
|
StudeezTheme { ExpandedAddButton() }
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package be.ugent.sel.studeez.common.composable
|
||||||
|
|
||||||
|
import androidx.compose.material.BottomNavigation
|
||||||
|
import androidx.compose.material.BottomNavigationItem
|
||||||
|
import androidx.compose.material.Icon
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Check
|
||||||
|
import androidx.compose.material.icons.filled.List
|
||||||
|
import androidx.compose.material.icons.filled.Person
|
||||||
|
import androidx.compose.material.icons.outlined.DateRange
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import be.ugent.sel.studeez.ui.theme.StudeezTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun NavigationBar() {
|
||||||
|
// TODO Pass functions and new screens.
|
||||||
|
// TODO Pass which screen is selected.
|
||||||
|
// TODO Disabled -> HIGH/MEDIUM_EMPHASIS if the page is implemented
|
||||||
|
BottomNavigation(
|
||||||
|
elevation = 10.dp
|
||||||
|
) {
|
||||||
|
BottomNavigationItem(
|
||||||
|
icon = { Icon(imageVector = Icons.Default.List, "Home") },
|
||||||
|
label = { Text(text = "Home") },
|
||||||
|
selected = false, // TODO
|
||||||
|
onClick = { /* TODO */ }
|
||||||
|
)
|
||||||
|
|
||||||
|
BottomNavigationItem(
|
||||||
|
icon = { Icon(imageVector = Icons.Default.Check, "Tasks") },
|
||||||
|
label = { Text(text = "Tasks") },
|
||||||
|
selected = false, // TODO
|
||||||
|
onClick = { /* TODO */ }
|
||||||
|
)
|
||||||
|
|
||||||
|
// Hack to space the entries in the navigation bar, make space for fab
|
||||||
|
BottomNavigationItem(icon = {}, onClick = {}, selected = false)
|
||||||
|
|
||||||
|
BottomNavigationItem(
|
||||||
|
icon = { Icon(imageVector = Icons.Outlined.DateRange, "Sessions") },
|
||||||
|
label = { Text(text = "Sessions") },
|
||||||
|
selected = false, // TODO
|
||||||
|
onClick = { /* TODO */ }
|
||||||
|
)
|
||||||
|
|
||||||
|
BottomNavigationItem(
|
||||||
|
icon = { Icon(imageVector = Icons.Default.Person, "Profile") },
|
||||||
|
label = { Text(text = "Profile") },
|
||||||
|
selected = false, // TODO
|
||||||
|
onClick = { /* TODO */ }
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun NavigationBarPreview() {
|
||||||
|
StudeezTheme { NavigationBar() }
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package be.ugent.sel.studeez.common.composable
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.material.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Menu
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import be.ugent.sel.studeez.ui.theme.StudeezTheme
|
||||||
|
|
||||||
|
// TODO Add option for button in top right corner as extra button
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
// Contains floatingActionButton and bottom bar, used in the main four screens.
|
||||||
|
fun PrimaryScreenToolbar(
|
||||||
|
title: String,
|
||||||
|
content: (PaddingValues) -> Unit
|
||||||
|
) {
|
||||||
|
Scaffold(
|
||||||
|
// Everything at the top of the screen
|
||||||
|
topBar = { TopAppBar(
|
||||||
|
title = { Text(text = title) },
|
||||||
|
navigationIcon = {
|
||||||
|
IconButton(onClick = { /* TODO open sidemenu */ }) {
|
||||||
|
Icon(imageVector = Icons.Default.Menu, contentDescription = "Menu")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) },
|
||||||
|
|
||||||
|
// Everything at the bottom of the screen
|
||||||
|
bottomBar = { NavigationBar() }, // TODO Pass arguments so that the current tab etc can be shown
|
||||||
|
floatingActionButtonPosition = FabPosition.Center,
|
||||||
|
isFloatingActionButtonDocked = true,
|
||||||
|
floatingActionButton = { CollapsedAddButton() }
|
||||||
|
) { paddingValues ->
|
||||||
|
content(paddingValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
// Does not contain floatingActionButton and bottom bar, used in all the other screens
|
||||||
|
fun SecondaryScreenToolbar(
|
||||||
|
title: String,
|
||||||
|
content: (PaddingValues) -> Unit
|
||||||
|
) {
|
||||||
|
Scaffold(
|
||||||
|
// Everything at the top of the screen
|
||||||
|
topBar = { TopAppBar(
|
||||||
|
title = { Text(text = title) },
|
||||||
|
navigationIcon = {
|
||||||
|
IconButton(onClick = { /* TODO open sidemenu */ }) {
|
||||||
|
Icon(imageVector = Icons.Default.Menu, contentDescription = "Menu")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) },
|
||||||
|
) { paddingValues ->
|
||||||
|
content(paddingValues)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun PrimaryScreenToolbarPreview() {
|
||||||
|
StudeezTheme { PrimaryScreenToolbar(
|
||||||
|
"Preview screen",
|
||||||
|
{}
|
||||||
|
) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun SecondaryScreenToolbarPreview() {
|
||||||
|
StudeezTheme { SecondaryScreenToolbar(
|
||||||
|
"Preview screen",
|
||||||
|
{}
|
||||||
|
)}
|
||||||
|
}
|
Reference in a new issue