diff --git a/app/build.gradle b/app/build.gradle index 7998b29..cc56949 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -83,4 +83,7 @@ dependencies { // The compose calendar library implementation 'com.kizitonwose.calendar:compose:2.1.1' + + implementation "io.coil-kt:coil-compose:2.2.0" + } \ No newline at end of file diff --git a/app/src/main/java/ru/megboyzz/dnevnik/Utils.kt b/app/src/main/java/ru/megboyzz/dnevnik/Utils.kt index da6d396..48f9ee4 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/Utils.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/Utils.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.composed import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Paint @@ -109,18 +110,17 @@ fun Modifier.drawColoredShadow( } } else this -@Composable fun Modifier.mainClickable( radius: Dp = Dp.Unspecified, onClick: () -> Unit -) = this.clickable( +) = composed { this.clickable( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple( radius = radius, color = dark ), onClick = onClick -) +) } @Composable fun rememberFirstMostVisibleMonth( diff --git a/app/src/main/java/ru/megboyzz/dnevnik/navigation/AppNavHost.kt b/app/src/main/java/ru/megboyzz/dnevnik/navigation/AppNavHost.kt index b62b542..f02d53c 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/navigation/AppNavHost.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/navigation/AppNavHost.kt @@ -16,10 +16,7 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.google.accompanist.navigation.animation.AnimatedNavHost import com.google.accompanist.navigation.animation.rememberAnimatedNavController -import ru.megboyzz.dnevnik.screens.HomeWorkScreen -import ru.megboyzz.dnevnik.screens.LoginScreen -import ru.megboyzz.dnevnik.screens.MarksScreen -import ru.megboyzz.dnevnik.screens.ScheduleScreen +import ru.megboyzz.dnevnik.screens.* sealed class BaseNavRote(open val route: String) @@ -50,6 +47,6 @@ fun AppNavHost(){ composable(AppNavRoute.Marks.route) { MarksScreen(navController, scaffoldState) } composable(AppNavRoute.Schedule.route) { ScheduleScreen(navController, scaffoldState) } composable(AppNavRoute.HomeWorks.route) { HomeWorkScreen(navController, scaffoldState) } - composable(AppNavRoute.Settings.route) { } + composable(AppNavRoute.Settings.route) { SettingsScreen(navController, scaffoldState) } } } \ No newline at end of file diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/HomeWorkScreen.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/HomeWorkScreen.kt index 5188f60..f589d75 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/HomeWorkScreen.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/HomeWorkScreen.kt @@ -6,7 +6,7 @@ import androidx.navigation.NavController import ru.megboyzz.dnevnik.AsPainter import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.R -import ru.megboyzz.dnevnik.screens.ui.MainScaffold +import ru.megboyzz.dnevnik.screens.ui.main.MainScaffold @Composable fun HomeWorkScreen( diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/MarksScreen.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/MarksScreen.kt index d29adb7..8d93a73 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/MarksScreen.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/MarksScreen.kt @@ -7,7 +7,7 @@ import ru.megboyzz.dnevnik.AsPainter import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.navigation.MarksSubScreenNavHost -import ru.megboyzz.dnevnik.screens.ui.MainScaffold +import ru.megboyzz.dnevnik.screens.ui.main.MainScaffold @Composable fun MarksScreen( diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/ScheduleScreen.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/ScheduleScreen.kt index 1c63fd7..adcf070 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/ScheduleScreen.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/ScheduleScreen.kt @@ -6,7 +6,7 @@ import androidx.navigation.NavController import ru.megboyzz.dnevnik.AsPainter import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.R -import ru.megboyzz.dnevnik.screens.ui.MainScaffold +import ru.megboyzz.dnevnik.screens.ui.main.MainScaffold @Composable fun ScheduleScreen( diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/SettingsScreen.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/SettingsScreen.kt index 34cf25e..503fba9 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/SettingsScreen.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/SettingsScreen.kt @@ -1,2 +1,216 @@ 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 + ) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Components.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Components.kt index 73b7526..b6b3a2d 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Components.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Components.kt @@ -33,6 +33,7 @@ import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.* +import androidx.compose.ui.window.DialogProperties import ru.megboyzz.dnevnik.* import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.ui.theme.* @@ -559,3 +560,8 @@ fun MessageAlertInWork() { } } + +@Composable +fun AlertBox() { + //DialogProperties(). +} diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Previews.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Previews.kt index 9efc081..57b09ab 100644 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Previews.kt +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/Previews.kt @@ -12,16 +12,28 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll 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.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.tooling.preview.Preview 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.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.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.PieChartCard 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.CallData import ru.megboyzz.dnevnik.ui.theme.mainBlue +import ru.megboyzz.dnevnik.ui.theme.mainBlur import ru.megboyzz.dnevnik.ui.theme.white import java.time.LocalDate import java.time.YearMonth @@ -353,4 +366,42 @@ fun ScheduleCallsPrev() { 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") + } + ) + } \ No newline at end of file diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/main/MainScaffold.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/main/MainScaffold.kt deleted file mode 100644 index 748ff17..0000000 --- a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/main/MainScaffold.kt +++ /dev/null @@ -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) } - ) -} \ No newline at end of file diff --git a/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/main/Scaffolds.kt b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/main/Scaffolds.kt new file mode 100644 index 0000000..7742a07 --- /dev/null +++ b/app/src/main/java/ru/megboyzz/dnevnik/screens/ui/main/Scaffolds.kt @@ -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 + ) +} \ No newline at end of file diff --git a/app/src/main/res/values-en-rUS/strings.xml b/app/src/main/res/values-en-rUS/strings.xml index 1dec942..8ee233f 100644 --- a/app/src/main/res/values-en-rUS/strings.xml +++ b/app/src/main/res/values-en-rUS/strings.xml @@ -66,4 +66,9 @@ Result Average Deadline: + Account + Application + Author + " Select the icons for subjects" + Enable notify \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c78ac94..9c66c5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -65,4 +65,9 @@ Итог Ср. балл Выполнить до: + Акканут + Приложение + Автор + Выбрать иконки для предметов + Включить уведомления о новых оценках \ No newline at end of file