Маленький рефакторинг и сделан экран настроек

This commit is contained in:
2023-04-07 01:09:16 +03:00
parent 1e775f1628
commit feb7fb6749
13 changed files with 422 additions and 89 deletions
+3
View File
@@ -83,4 +83,7 @@ dependencies {
// The compose calendar library // The compose calendar library
implementation 'com.kizitonwose.calendar:compose:2.1.1' implementation 'com.kizitonwose.calendar:compose:2.1.1'
implementation "io.coil-kt:coil-compose:2.2.0"
} }
@@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.width
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material.ripple.rememberRipple
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Paint import androidx.compose.ui.graphics.Paint
@@ -109,18 +110,17 @@ fun Modifier.drawColoredShadow(
} }
} else this } else this
@Composable
fun Modifier.mainClickable( fun Modifier.mainClickable(
radius: Dp = Dp.Unspecified, radius: Dp = Dp.Unspecified,
onClick: () -> Unit onClick: () -> Unit
) = this.clickable( ) = composed { this.clickable(
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple( indication = rememberRipple(
radius = radius, radius = radius,
color = dark color = dark
), ),
onClick = onClick onClick = onClick
) ) }
@Composable @Composable
fun rememberFirstMostVisibleMonth( fun rememberFirstMostVisibleMonth(
@@ -16,10 +16,7 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.google.accompanist.navigation.animation.AnimatedNavHost import com.google.accompanist.navigation.animation.AnimatedNavHost
import com.google.accompanist.navigation.animation.rememberAnimatedNavController import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import ru.megboyzz.dnevnik.screens.HomeWorkScreen import ru.megboyzz.dnevnik.screens.*
import ru.megboyzz.dnevnik.screens.LoginScreen
import ru.megboyzz.dnevnik.screens.MarksScreen
import ru.megboyzz.dnevnik.screens.ScheduleScreen
sealed class BaseNavRote(open val route: String) sealed class BaseNavRote(open val route: String)
@@ -50,6 +47,6 @@ fun AppNavHost(){
composable(AppNavRoute.Marks.route) { MarksScreen(navController, scaffoldState) } composable(AppNavRoute.Marks.route) { MarksScreen(navController, scaffoldState) }
composable(AppNavRoute.Schedule.route) { ScheduleScreen(navController, scaffoldState) } composable(AppNavRoute.Schedule.route) { ScheduleScreen(navController, scaffoldState) }
composable(AppNavRoute.HomeWorks.route) { HomeWorkScreen(navController, scaffoldState) } composable(AppNavRoute.HomeWorks.route) { HomeWorkScreen(navController, scaffoldState) }
composable(AppNavRoute.Settings.route) { } composable(AppNavRoute.Settings.route) { SettingsScreen(navController, scaffoldState) }
} }
} }
@@ -6,7 +6,7 @@ import androidx.navigation.NavController
import ru.megboyzz.dnevnik.AsPainter import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.screens.ui.MainScaffold import ru.megboyzz.dnevnik.screens.ui.main.MainScaffold
@Composable @Composable
fun HomeWorkScreen( fun HomeWorkScreen(
@@ -7,7 +7,7 @@ import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.navigation.MarksSubScreenNavHost import ru.megboyzz.dnevnik.navigation.MarksSubScreenNavHost
import ru.megboyzz.dnevnik.screens.ui.MainScaffold import ru.megboyzz.dnevnik.screens.ui.main.MainScaffold
@Composable @Composable
fun MarksScreen( fun MarksScreen(
@@ -6,7 +6,7 @@ import androidx.navigation.NavController
import ru.megboyzz.dnevnik.AsPainter import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.screens.ui.MainScaffold import ru.megboyzz.dnevnik.screens.ui.main.MainScaffold
@Composable @Composable
fun ScheduleScreen( fun ScheduleScreen(
@@ -1,2 +1,216 @@
package ru.megboyzz.dnevnik.screens package ru.megboyzz.dnevnik.screens
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import ru.megboyzz.dnevnik.*
import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.screens.ui.UnderlinedText
import ru.megboyzz.dnevnik.screens.ui.main.SettingsScaffold
import ru.megboyzz.dnevnik.ui.theme.H2
@Composable
fun SettingsScreen(
navController: NavController,
scaffoldState: ScaffoldState
) {
SettingsScaffold(
onLeave = {
//navController.navigate()
},
scaffoldState = scaffoldState,
navController = navController
) {
var enabled by remember {
mutableStateOf(false)
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(20.dp)
){
SettingsCategory(title = R.string.settings_category_accont.AsString()) {
SettingsBaseAccountHeader(
name = "Киц Михаил",
studentClass = "11-А"
)
}
SettingsCategory(title = R.string.settings_category_application.AsString()) {
SettingsMenuItem(
title = R.string.title_choose_icons.AsString(),
icon = R.drawable.ic_choose_icons.AsPainter(),
onClick = {}
)
SettingsMenuSwitch(
title = R.string.title_enable_notif.AsString(),
enabled = enabled,
onChange = {
enabled =! it
}
)
}
Spacer(modifier = Modifier.weight(1f))
SettingsCategory(title = R.string.settings_category_author.AsString()) {
SettingsMenuItem(
title = R.string.settings_category_author.AsString(),
icon = R.drawable.ic_author.AsPainter()
) {
}
}
}
}
}
@Composable
fun SettingsCategory(
title: String,
content: @Composable () -> Unit
) {
Column{
UnderlinedText(title)
SpacerHeight(height = 10.dp)
Column { content.invoke() }
}
}
@Composable
fun SettingsBaseMenuItem(
title: String,
onClick: () -> Unit,
leadingContent: @Composable () -> Unit
) {
Row(
modifier = Modifier.mainClickable { onClick.invoke() },
horizontalArrangement = Arrangement.spacedBy(5.dp),
verticalAlignment = Alignment.CenterVertically
){
leadingContent.invoke()
Text(
text = title,
style = H2,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.fillMaxWidth()
)
}
}
@Composable
fun SettingsMenuItem(
title: String,
icon: Painter,
onClick: () -> Unit
) {
SettingsBaseMenuItem(
title = title,
onClick = onClick
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.size(48.dp)
) {
Icon(
painter = icon,
contentDescription = "",
)
}
}
}
@Composable
fun SettingsMenuSwitch(
title: String,
enabled: Boolean,
onChange: (Boolean) -> Unit
) {
SettingsBaseMenuItem(
title = title,
onClick = { onChange.invoke(enabled) }
) {
Switch(checked = enabled, onCheckedChange = { onChange.invoke(enabled) })
}
}
@Composable
fun SettingsMenuCheckBox(
title: String,
enabled: Boolean,
onChange: (Boolean) -> Unit
) {
SettingsBaseMenuItem(
title = title,
onClick = { onChange.invoke(enabled) }
) {
Checkbox(checked = enabled, onCheckedChange = { onChange.invoke(enabled) })
}
}
@Composable
fun SettingsBaseAccountHeader(
name: String,
studentClass: String,
) {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(5.dp)
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.size(32.dp)
){
Image(
painter = R.drawable.ic_author.AsPainter(),
contentDescription = ""
)
}
Column(
verticalArrangement = Arrangement.spacedBy(5.dp)
) {
Text(
text = name,
style = H2
)
Text(
text = studentClass,
style = H2
)
}
}
}
@@ -33,6 +33,7 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.* import androidx.compose.ui.unit.*
import androidx.compose.ui.window.DialogProperties
import ru.megboyzz.dnevnik.* import ru.megboyzz.dnevnik.*
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.ui.theme.* import ru.megboyzz.dnevnik.ui.theme.*
@@ -559,3 +560,8 @@ fun MessageAlertInWork() {
} }
} }
@Composable
fun AlertBox() {
//DialogProperties().
}
@@ -12,16 +12,28 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Save
import androidx.compose.material.icons.filled.SouthEast
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import androidx.navigation.compose.rememberNavController
import com.google.accompanist.navigation.animation.rememberAnimatedNavController import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import com.kizitonwose.calendar.core.daysOfWeek import com.kizitonwose.calendar.core.daysOfWeek
import ru.megboyzz.dnevnik.screens.SettingsCategory
import ru.megboyzz.dnevnik.screens.SettingsMenuSwitch
import ru.megboyzz.dnevnik.screens.SettingsMenuItem
import ru.megboyzz.dnevnik.screens.SettingsScreen
import ru.megboyzz.dnevnik.screens.ui.* import ru.megboyzz.dnevnik.screens.ui.*
import ru.megboyzz.dnevnik.screens.ui.calendar.NiceCalendar import ru.megboyzz.dnevnik.screens.ui.calendar.NiceCalendar
import ru.megboyzz.dnevnik.screens.ui.main.SettingsScaffold
import ru.megboyzz.dnevnik.screens.ui.piechart.PieChart import ru.megboyzz.dnevnik.screens.ui.piechart.PieChart
import ru.megboyzz.dnevnik.screens.ui.piechart.PieChartCard import ru.megboyzz.dnevnik.screens.ui.piechart.PieChartCard
import ru.megboyzz.dnevnik.screens.ui.piechart.PieChartData import ru.megboyzz.dnevnik.screens.ui.piechart.PieChartData
@@ -30,6 +42,7 @@ import ru.megboyzz.dnevnik.screens.ui.schedule.BaseScheduleCard
import ru.megboyzz.dnevnik.screens.ui.schedule.BaseScheduleShield import ru.megboyzz.dnevnik.screens.ui.schedule.BaseScheduleShield
import ru.megboyzz.dnevnik.screens.ui.schedule.CallData import ru.megboyzz.dnevnik.screens.ui.schedule.CallData
import ru.megboyzz.dnevnik.ui.theme.mainBlue import ru.megboyzz.dnevnik.ui.theme.mainBlue
import ru.megboyzz.dnevnik.ui.theme.mainBlur
import ru.megboyzz.dnevnik.ui.theme.white import ru.megboyzz.dnevnik.ui.theme.white
import java.time.LocalDate import java.time.LocalDate
import java.time.YearMonth import java.time.YearMonth
@@ -354,3 +367,41 @@ fun ScheduleCallsPrev() {
BaseScheduleCallsCard(callsList = calls) BaseScheduleCallsCard(callsList = calls)
} }
@Preview
@Composable
fun ScaffoldTest() {
val scaffoldState = rememberScaffoldState()
val navController = rememberNavController()
SettingsScaffold(
onLeave = { /*TODO*/ },
scaffoldState = scaffoldState,
navController = navController
) {
}
}
@Preview
@Composable
fun SettingsTest() {
SettingsScreen(navController = rememberNavController(), scaffoldState = rememberScaffoldState())
}
@Preview
@Composable
fun Test1() {
AlertDialog(
onDismissRequest = { /*TODO*/ },
text = {
Text(text = "hehe")
},
buttons = {
Text(text = "hehe")
}
)
}
@@ -1,78 +0,0 @@
package ru.megboyzz.dnevnik.screens.ui
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
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.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.SpacerWidth
import ru.megboyzz.dnevnik.ui.theme.mainBlue
import ru.megboyzz.dnevnik.ui.theme.white
@Composable
fun MainScaffold(
icon: Painter,
title: String,
/* TODO viewModel */
navController: NavController,
scaffoldState: ScaffoldState,
content: (@Composable (it: PaddingValues) -> Unit),
) {
val scope = rememberCoroutineScope()
Scaffold(
scaffoldState = scaffoldState,
topBar = {
TopAppBar(
backgroundColor = mainBlue,
contentColor = Color.White
) {
IconButton(
onClick = {
val drawerState = scaffoldState.drawerState
scope.launch {
if (drawerState.isClosed)
drawerState.open()
else
drawerState.close()
}
}
) {
Icon(
imageVector = Icons.Filled.Menu,
contentDescription = "menu",
tint = white
)
}
SpacerWidth(width = 5.dp)
Text(
text = title,
fontSize = 16.sp,
color = white
)
Spacer(Modifier.weight(1f))
Box(Modifier.padding(15.dp, 15.dp)) {
Image(painter = icon, contentDescription = "icon")
}
}
},
content = content,
drawerBackgroundColor = mainBlue,
drawerContentColor = white,
drawerShape = drawerShape,
drawerContent = { DrawerContent(navController, scaffoldState) },
bottomBar = { BottomBar(navController) }
)
}
@@ -0,0 +1,130 @@
package ru.megboyzz.dnevnik.screens.ui.main
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.SpacerWidth
import ru.megboyzz.dnevnik.screens.ui.BottomBar
import ru.megboyzz.dnevnik.screens.ui.DrawerContent
import ru.megboyzz.dnevnik.screens.ui.drawerShape
import ru.megboyzz.dnevnik.ui.theme.mainBlue
import ru.megboyzz.dnevnik.ui.theme.white
import ru.megboyzz.dnevnik.R
@Composable
fun MainScaffold(
icon: Painter,
title: String,
/* TODO viewModel */
navController: NavController,
scaffoldState: ScaffoldState,
content: (@Composable (it: PaddingValues) -> Unit),
) {
val scope = rememberCoroutineScope()
BaseScaffold(
leadingIcon = Icons.Filled.Menu,
trailingIcon = icon,
onLeadingIconClick = {
val drawerState = scaffoldState.drawerState
scope.launch {
if (drawerState.isClosed)
drawerState.open()
else
drawerState.close()
}
},
title = title,
navController = navController,
scaffoldState = scaffoldState,
bottomBar = { BottomBar(navController) },
content = content
)
}
@Composable
fun BaseScaffold(
leadingIcon: ImageVector,
trailingIcon: Painter?,
onLeadingIconClick: () -> Unit,
title: String,
navController: NavController,
scaffoldState: ScaffoldState,
bottomBar: @Composable () -> Unit,
content: (@Composable (it: PaddingValues) -> Unit),
) {
Scaffold(
scaffoldState = scaffoldState,
topBar = {
TopAppBar(
backgroundColor = mainBlue,
contentColor = Color.White
) {
IconButton(onClick = onLeadingIconClick) {
Icon(
imageVector = leadingIcon,
contentDescription = "",
tint = white
)
}
SpacerWidth(width = 5.dp)
Text(
text = title,
fontSize = 16.sp,
color = white
)
if(trailingIcon != null) {
Spacer(Modifier.weight(1f))
Box(Modifier.padding(15.dp, 15.dp)) {
Image(painter = trailingIcon, contentDescription = "icon")
}
}
}
},
content = content,
drawerBackgroundColor = mainBlue,
drawerContentColor = white,
drawerShape = drawerShape,
drawerContent = { DrawerContent(navController, scaffoldState) },
bottomBar = bottomBar
)
}
@Composable
fun SettingsScaffold(
onLeave: () -> Unit,
scaffoldState: ScaffoldState,
navController: NavController,
content: @Composable (PaddingValues) -> Unit
) {
BaseScaffold(
leadingIcon = Icons.Filled.ArrowBack,
trailingIcon = R.drawable.ic_settings.AsPainter(),
onLeadingIconClick = onLeave,
title = R.string.title_settings.AsString(),
navController = navController,
scaffoldState = scaffoldState,
bottomBar = {},
content = content
)
}
@@ -66,4 +66,9 @@
<string name="title_result_mark">Result</string> <string name="title_result_mark">Result</string>
<string name="title_average_mark">Average</string> <string name="title_average_mark">Average</string>
<string name="title_deadline">Deadline:</string> <string name="title_deadline">Deadline:</string>
<string name="settings_category_accont">Account</string>
<string name="settings_category_application">Application</string>
<string name="settings_category_author">Author</string>
<string name="title_choose_icons">" Select the icons for subjects"</string>
<string name="title_enable_notif">Enable notify</string>
</resources> </resources>
+5
View File
@@ -65,4 +65,9 @@
<string name="title_result_mark">Итог</string> <string name="title_result_mark">Итог</string>
<string name="title_average_mark">Ср. балл</string> <string name="title_average_mark">Ср. балл</string>
<string name="title_deadline">Выполнить до:</string> <string name="title_deadline">Выполнить до:</string>
<string name="settings_category_accont">Акканут</string>
<string name="settings_category_application">Приложение</string>
<string name="settings_category_author">Автор</string>
<string name="title_choose_icons">Выбрать иконки для предметов</string>
<string name="title_enable_notif">Включить уведомления о новых оценках</string>
</resources> </resources>