Определена логика суб скринов, добавлены строки и компоненты

This commit is contained in:
Michael Kits
2023-01-08 23:56:45 +03:00
parent 2527cae931
commit 0500e8fb0a
9 changed files with 507 additions and 97 deletions
@@ -23,6 +23,7 @@ import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import ru.megboyzz.dnevnik.navigation.AppNavRoute
import ru.megboyzz.dnevnik.navigation.BaseNavRote
@Composable
fun Int.AsPainter() = painterResource(this)
@@ -41,7 +42,7 @@ fun SpacerHeight(height: Dp) = Spacer(Modifier.height(height))
fun Int.AsImageVector() = ImageVector.vectorResource(this)
@Composable
fun NavController.navigate(to: AppNavRoute){
fun NavController.navigate(to: BaseNavRote){
LaunchedEffect(Unit) {
navigate(to.route) {
popUpTo(to.route) { inclusive = true }
@@ -21,8 +21,9 @@ 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 AppNavRoute(val route: String){
sealed class AppNavRoute(override val route: String): BaseNavRote(route){
object Splash : AppNavRoute("splash_screen")
@@ -0,0 +1,81 @@
package ru.megboyzz.dnevnik.navigation
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.screens.*
sealed class MarksNavRoute(override val route: String): BaseNavRote(route){
object LastMarks: MarksNavRoute("last_marks")
object ByDaysMarks: MarksNavRoute("by_days_marks")
object StatsByMarks: MarksNavRoute("stats_by_marks")
object StatsBySubjects: MarksNavRoute("stats_by_subjects")
object ByTermsMarks: MarksNavRoute("by_terms_marks")
object ByYearMarks: MarksNavRoute("by_terms_marks")
}
@OptIn(ExperimentalAnimationApi::class)
@Composable
fun MarksSubScreenNavHost() {
val navController = rememberAnimatedNavController()
val list = listOf(
SubScreenData(
R.string.title_last_marks.AsString(),
MarksNavRoute.LastMarks,
remember { mutableStateOf(true) }
),
SubScreenData(
R.string.title_by_days.AsString(),
MarksNavRoute.ByDaysMarks,
remember { mutableStateOf(false) }
),
SubScreenData(
R.string.title_statistics_by_marks.AsString(),
MarksNavRoute.StatsByMarks,
remember { mutableStateOf(false) }
),
SubScreenData(
R.string.title_statistics_by_subjects.AsString(),
MarksNavRoute.StatsBySubjects,
remember { mutableStateOf(false) }
),
SubScreenData(
R.string.title_by_terms_4.AsString(),
MarksNavRoute.ByTermsMarks,
remember { mutableStateOf(false) }
),
SubScreenData(
R.string.title_one_year.AsString(),
MarksNavRoute.ByYearMarks,
remember { mutableStateOf(false) }
),
)
Column {
SubScreenNavBar(list = list, subScreenNavController = navController)
NavHost(
navController = navController,
startDestination = MarksNavRoute.LastMarks.route
){
composable(MarksNavRoute.LastMarks.route) { Text(MarksNavRoute.LastMarks.route) }
composable(MarksNavRoute.ByDaysMarks.route) { Text(MarksNavRoute.ByDaysMarks.route) }
composable(MarksNavRoute.StatsByMarks.route) { Text(MarksNavRoute.StatsByMarks.route) }
composable(MarksNavRoute.StatsBySubjects.route) { Text(MarksNavRoute.StatsBySubjects.route) }
composable(MarksNavRoute.ByTermsMarks.route) { Text(MarksNavRoute.ByTermsMarks.route) }
composable(MarksNavRoute.ByYearMarks.route) { Text(MarksNavRoute.ByYearMarks.route) }
}
}
}
@@ -1,2 +0,0 @@
package ru.megboyzz.dnevnik.navigation
@@ -1,11 +1,9 @@
package ru.megboyzz.dnevnik.screens
import android.annotation.SuppressLint
import androidx.compose.animation.animateColorAsState
import android.widget.Toast
import androidx.compose.animation.*
import androidx.compose.animation.core.tween
import androidx.compose.animation.expandHorizontally
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInHorizontally
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.toggleable
@@ -14,6 +12,7 @@ import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.runtime.*
@@ -35,6 +34,7 @@ import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.modifier.modifierLocalConsumer
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.input.KeyboardType
@@ -46,11 +46,15 @@ import androidx.compose.ui.unit.*
import androidx.constraintlayout.compose.Visibility
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.*
import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.navigation.AppNavRoute
import ru.megboyzz.dnevnik.navigation.BaseNavRote
import ru.megboyzz.dnevnik.navigation.MarksNavRoute
import ru.megboyzz.dnevnik.ui.theme.*
import java.util.Calendar
@Composable
fun MainScaffold(
@@ -80,13 +84,23 @@ fun MainScaffold(
}
}
) {
Image(painter = icon, contentDescription = "icon")
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,
@@ -123,6 +137,9 @@ fun BottomBar(navController: NavController) {
Box(
modifier = Modifier
.fillMaxWidth()
.drawColoredShadow(
offsetY = 1.dp
)
.height(90.dp)
.background(white)
.padding(10.dp, 10.dp, 10.dp, 15.dp),
@@ -180,31 +197,6 @@ fun BottomNavButton(
}
}
@Preview
@Composable
fun BottomNavButtonPrev() {
Row(horizontalArrangement = Arrangement.spacedBy(20.dp)) {
BottomNavButton(
icon = R.drawable.ic_marks.AsPainter(),
text = R.string.title_marks.AsString()
) { /* TODO*/ }
BottomNavButton(
icon = R.drawable.ic_homework.AsPainter(),
text = R.string.title_hw.AsString()
) { /* TODO*/ }
BottomNavButton(
icon = R.drawable.ic_schedule.AsPainter(),
text = R.string.title_schedule.AsString()
) { /* TODO*/ }
}
}
@Preview
@Composable
fun BottomBarPrev() {
val navController = rememberNavController()
BottomBar(navController = navController)
}
@SuppressLint("CoroutineCreationDuringComposition")
@@ -385,14 +377,6 @@ fun BigLoginBackground() {
}
}
@Preview
@Composable
fun ProfilePrev() {
ProfileCard(painter = R.drawable.ic_author.AsPainter())
}
@Composable
fun MainTextField(
value: MutableState<String>,
@@ -486,59 +470,6 @@ fun DrawerMainButton(
}
}
@Preview
@Composable
fun Almst() {
Column() {
AlmostOutlinedText(text = "Идет 3-я четверть")
}
}
@Preview
@Composable
fun ButtonPrev() {
DrawerMainButton(
icon = R.drawable.ic_marks.AsPainter(),
text = "Оценки"
)
}
@Preview
@Composable
fun CheckBoxed() {
val isCheck = remember { mutableStateOf(false) }
val titleColor = mainBlue
Row {
Card(
elevation = 0.dp,
shape = RoundedCornerShape(6.dp),
border = BorderStroke(1.5.dp, color = titleColor)
) {
Box(
modifier = Modifier
.size(20.dp)
.background(if (isCheck.value) titleColor else Color.White)
.clickable {
isCheck.value = !isCheck.value
},
contentAlignment = Alignment.Center
) {
if(isCheck.value)
Icon(Icons.Default.Check, contentDescription = "", tint = Color.White)
}
}
}
}
@Preview
@Composable
fun PrevCB() {
val checkedState = remember { mutableStateOf(true) }
MainCheckbox(checkedState){
}
}
@Composable
fun MainCheckbox(
@@ -729,4 +660,303 @@ fun LoginScreenContent(
}
}
}
}
@Composable
fun SubScreenNavButton(
text: String,
isClicked: MutableState<Boolean>,
onCLick: () -> Unit
) {
val colors = ButtonDefaults.buttonColors(
backgroundColor = if(isClicked.value) mainBlue else white,
contentColor = if(isClicked.value) white else dark
)
Button(
onClick = {
isClicked.value = !isClicked.value
onCLick.invoke()
},
shape = RoundedCornerShape(20.dp),
border = BorderStroke(
width = 1.dp,
color = mainBlue,
),
colors = colors,
) {
Text(
text = text,
style= MainText
)
}
}
data class SubScreenData(
val title: String,
val to: BaseNavRote,
val isClicked: MutableState<Boolean>
)
@Composable
fun SubScreenNavBar(
list: List<SubScreenData>,
subScreenNavController: NavController
) {
val horizontalScroll = rememberScrollState()
Row(
modifier = Modifier
.fillMaxWidth()
.horizontalScroll(horizontalScroll)
.padding(15.dp),
horizontalArrangement = Arrangement.spacedBy(15.dp)
){
for(data in list){
if(data.isClicked.value)
subScreenNavController.navigate(data.to)
SubScreenNavButton(
text = data.title,
isClicked = data.isClicked
) {
for(d in list){
if(data != d)
d.isClicked.value = false
}
}
}
}
}
@Composable
fun LastMarkCard(
subjectName: String,
mark: Int,
date: String, /* мейби стоит поменять на Date или инстанс */
teacher: String,
reason: String = "null"
) {
Card(
backgroundColor = white,
shape = RoundedCornerShape(10.dp),
border = BorderStroke(
width = 1.dp,
color = mainBlue
),
modifier = Modifier.fillMaxWidth()
) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.padding(15.dp)
) {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.width(200.dp)
) {
Text(
text = subjectName,
style = MainText
)
Text(
text = mark.toString(),
style = H1,
color = mainBlue
)
}
Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
Text(
text = "${R.string.title_mark_recive.AsString()} $date",
style = MainText,
color = dark
)
Text(
text = "${R.string.title_teacher_name.AsString()}: $teacher",
style = MainText,
color = dark
)
if(reason != "null")
Text(
text = "${R.string.title_reason.AsString()} $reason",
style = MainText,
color = dark
)
}
}
}
}
@Preview
@Composable
fun LastMarkPrev() {
Column(verticalArrangement = Arrangement.spacedBy(20.dp)) {
LastMarkCard(
subjectName = "Русский язык",
mark = 3,
date = "03.02.2023",
teacher = "Джаналиева Д. Ф.",
reason = "диктнант"
)
LastMarkCard(
subjectName = "Алгебра и начала математического анализа",
mark = 5,
date = "03.08.2023",
teacher = "Штрошер С. Н.")
}
}
data class CalendarData(
val title: String,
)
@Composable
fun CardCalendar(
onClick: (day: Int) -> Unit
) {
//Calendar(Calendar.FEBRUARY)
val listOfDays = listOf(
R.string.title_mon.AsString(),
R.string.title_tue.AsString(),
R.string.title_wed.AsString(),
R.string.title_thu.AsString(),
R.string.title_fri.AsString(),
R.string.title_sat.AsString(),
)
Card(
backgroundColor = white,
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(10.dp)
){
Box(
modifier = Modifier
.fillMaxWidth()
.padding(15.dp)
){
Column(
//horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxWidth()
) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp, 0.dp, 10.dp, 5.dp)
){
for(day in listOfDays){
Text(
text = day,
style = MainText,
color = dark
)
}
}
Divider(
thickness = 1.dp,
color = dark,
modifier = Modifier.padding(0.dp, 0.dp, 0.dp, 10.dp)
)
val days = 28
val weeks = days / 6
var dayIn = 2
val startDay = 1
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp, 10.dp, 10.dp, 5.dp)
) {
for (i in 1..6) {
//if(i != 7)
Column(
verticalArrangement = Arrangement.spacedBy(10.dp)
) {
for(j in i..days step 7){
var text = j.toString()
if(j < startDay)
text = ""
val isClicked = remember {
mutableStateOf(false)
}
NumberOnCalendar(
isClicked = isClicked,
number = j
) { onClick.invoke(j) }
}
}
}
}
/*for(day in 1..weeks){
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.fillMaxWidth()
.padding(10.dp, 10.dp, 10.dp, 5.dp)
){
for(i in dayIn..dayIn + 5){
Text(
text = i.toString(),
color = dark,
style = MainText,
modifier = Modifier.clickable{
onClick.invoke(i)
}
)
}
dayIn += 6
}
}*/
}
}
}
}
// TODO СДЕЛАТЬ КЛИКАБЕЛЬНОЕ ЧИСЛО НА КАЛЕНДАРЕ
@Composable
fun NumberOnCalendar(
isClicked: MutableState<Boolean>,
number: Int,
onClick: () -> Unit
) {
val isClickedModifier = if(isClicked.value)
Modifier
.border(
width = 1.dp,
color = mainBlue,
shape = RoundedCornerShape(20.dp)
)
.background(
color = lightGray,
shape = RoundedCornerShape(20.dp)
)
.padding(2.dp)
else Modifier
Box(
modifier = Modifier
.size(30.dp)
.then(isClickedModifier),
contentAlignment = Alignment.Center
){
Text(
text = number.toString(),
style = H2,
color = dark,
modifier = Modifier.clickable{
isClicked.value = !isClicked.value
onClick.invoke()
}
)
}
}
@Preview
@Composable
fun CalendarPrev() {
val current = LocalContext.current
CardCalendar(){
Toast.makeText(current, "Число $it", Toast.LENGTH_SHORT).show()
}
}
@@ -6,6 +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.navigation.MarksSubScreenNavHost
@Composable
fun MarksScreen(
@@ -18,7 +19,7 @@ fun MarksScreen(
navController = navController,
scaffoldState = scaffoldState
) {
MarksSubScreenNavHost()
}
}
@@ -14,4 +14,53 @@
<string name="title_remember_me">Remember me</string>
<string name="title_sign_in">Sign in</string>
<string name="title_sign_up">Sign up</string>
<string name="title_mark_recive">"Recived: "</string>
<string name="title_teacher_name">Teacher</string>
<string name="title_last_marks">Last marks</string>
<string name="title_by_days">By days</string>
<string name="title_statistics_by_marks">Statistics by marks</string>
<string name="title_statistics_by_subjects">Statistics by subjects</string>
<string name="title_by_terms_4">By terms</string>
<string name="title_by_trems_2">By terms</string>
<string name="title_term_4">Term</string>
<string name="title_trem_2">Term</string>
<string name="title_common_stats">Common</string>
<string name="title_stats_by_subject">Subjects</string>
<string name="title_one_year">Year</string>
<string name="title_academic_year">Аcademic year</string>
<string name="title_stats_by_mark_5">Summary of ratings 5</string>
<string name="title_stats_by_mark_4">Summary of ratings 4</string>
<string name="title_stats_by_mark_3">Summary of ratings 3</string>
<string name="title_stats_by_mark_2">Summary of ratings 2</string>
<string name="title_stats_by_mark_1">Summary of ratings 1</string>
<string name="title_mon">MON</string>
<string name="title_tue">TUE</string>
<string name="title_wed">WED</string>
<string name="title_thu">THU</string>
<string name="title_fri">FRI</string>
<string name="title_sat">SAT</string>
<string name="title_january">January</string>
<string name="title_february">February</string>
<string name="title_march">March</string>
<string name="title_april">April</string>
<string name="title_may">May</string>
<string name="title_june">June</string>
<string name="title_july">July</string>
<string name="title_august">August</string>
<string name="title_september">September</string>
<string name="title_october">October</string>
<string name="title_november">November</string>
<string name="title_december">December</string>
<string name="title_no_marks">There are no ratings</string>
<string name="title_day_no_marks">There are no ratings for this day.</string>
<string name="title_lessons_schedule">Schedule of lessons</string>
<string name="title_calls_schedule">Schedule of calls</string>
<string name="title_no_lessons">No lessons</string>
<string name="title_no_calls_schedule">No calls schedule</string>
<string name="title_now_lesson">Now there is a lesson</string>
<string name="title_lesson_teacher">Teacher</string>
<string name="title_classroom">Classroom</string>
<string name="title_next_lesson">The next lesson</string>
<string name="title_lesson">Lesson</string>
<string name="title_reason">"Reason: "</string>
</resources>
+49
View File
@@ -13,4 +13,53 @@
<string name="title_remember_me">Запомнить меня</string>
<string name="title_sign_in">Войти</string>
<string name="title_sign_up">Нет аккаунта? Расскажем как его зарегистрировать и подключить к школе</string>
<string name="title_mark_recive">Получена:</string>
<string name="title_teacher_name">Преподаватель</string>
<string name="title_last_marks">Последние</string>
<string name="title_by_days">По дням</string>
<string name="title_statistics_by_marks">Статистика по оценкам</string>
<string name="title_statistics_by_subjects">Статистика по предметам</string>
<string name="title_by_terms_4">По четвертям</string>
<string name="title_by_trems_2">По семестрам</string>
<string name="title_term_4">Четверть</string>
<string name="title_trem_2">Семестр</string>
<string name="title_common_stats">Общая сводка</string>
<string name="title_stats_by_subject">Сводка по предметам</string>
<string name="title_one_year">За год</string>
<string name="title_academic_year">учебный год</string>
<string name="title_stats_by_mark_5">Сводка по оценкам отлично</string>
<string name="title_stats_by_mark_4">Сводка по оценкам хорошо</string>
<string name="title_stats_by_mark_3">Сводка по оценкам уд.</string>
<string name="title_stats_by_mark_2">Сводка по оценкам неуд.</string>
<string name="title_stats_by_mark_1">Сводка по оценкам кол</string>
<string name="title_mon">ПН</string>
<string name="title_tue">ВТ</string>
<string name="title_wed">СР</string>
<string name="title_thu">ЧТ</string>
<string name="title_fri">ПТ</string>
<string name="title_sat">СБ</string>
<string name="title_january">Январь</string>
<string name="title_february">Февраль</string>
<string name="title_march">Март</string>
<string name="title_april">Апрель</string>
<string name="title_may">Май</string>
<string name="title_june">Июнь</string>
<string name="title_july">Июль</string>
<string name="title_august">Август</string>
<string name="title_september">Сентябрь</string>
<string name="title_october">Октябрь</string>
<string name="title_november">Ноябрь</string>
<string name="title_december">Декабрь</string>
<string name="title_no_marks">Таких оценок нет</string>
<string name="title_day_no_marks">В этот день нет ни одной оценки</string>
<string name="title_lessons_schedule">Расписание уроков</string>
<string name="title_calls_schedule">Распиание звонков</string>
<string name="title_no_lessons">Сейчас нет уроков можно отдыхать!</string>
<string name="title_no_calls_schedule">Пока не выложили расписание звонков</string>
<string name="title_now_lesson">Сейчас идет урок</string>
<string name="title_lesson_teacher">Урок ведет</string>
<string name="title_classroom">В кабинете</string>
<string name="title_next_lesson">Следующий урок</string>
<string name="title_lesson">Урок</string>
<string name="title_reason">Причина:</string>
</resources>