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