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