Прокинут во всех экранах стейт скаффолда
This commit is contained in:
Generated
-17
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetDropDown">
|
||||
<runningDeviceTargetSelectedWithDropDown>
|
||||
<Target>
|
||||
<type value="RUNNING_DEVICE_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="SERIAL_NUMBER" />
|
||||
<value value="2a40cdac1f0d7ece" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</runningDeviceTargetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2023-01-05T19:44:17.771649600Z" />
|
||||
</component>
|
||||
</project>
|
||||
Generated
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17_PREVIEW" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
|
||||
@@ -66,4 +66,5 @@ dependencies {
|
||||
implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
|
||||
implementation "androidx.compose.material:material-icons-extended:$compose_version"
|
||||
implementation "com.google.accompanist:accompanist-swiperefresh:0.23.0"
|
||||
implementation "com.google.accompanist:accompanist-navigation-animation:0.24.1-alpha"
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/Theme.MyDnevnik"
|
||||
android:screenOrientation="fullSensor"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
@@ -5,12 +5,24 @@ import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.SideEffect
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.drawBehind
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Paint
|
||||
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
|
||||
import androidx.compose.ui.graphics.scale
|
||||
import androidx.compose.ui.graphics.toArgb
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.res.vectorResource
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.navigation.NavController
|
||||
import androidx.navigation.NavHostController
|
||||
import ru.megboyzz.dnevnik.navigation.AppNavRoute
|
||||
|
||||
@Composable
|
||||
fun Int.AsPainter() = painterResource(this)
|
||||
@@ -26,4 +38,67 @@ fun SpacerHeight(height: Dp) = Spacer(Modifier.height(height))
|
||||
|
||||
|
||||
@Composable
|
||||
fun Int.AsImageVector() = ImageVector.vectorResource(this)
|
||||
fun Int.AsImageVector() = ImageVector.vectorResource(this)
|
||||
|
||||
@Composable
|
||||
fun NavController.navigate(to: AppNavRoute){
|
||||
LaunchedEffect(Unit) {
|
||||
navigate(to.route) {
|
||||
popUpTo(to.route) { inclusive = true }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Modifier.drawColoredShadow(
|
||||
color: Color = Color.Black,
|
||||
alpha: Float = 0.07f,
|
||||
borderRadius: Dp = 0.dp,
|
||||
offsetX: Dp = 0.dp,
|
||||
offsetY: Dp = 0.dp,
|
||||
blurRadius: Dp = 7.dp,
|
||||
spread: Dp = 0.dp,
|
||||
enabled: Boolean = true,
|
||||
) = if(enabled) {
|
||||
this.drawBehind {
|
||||
val transparentColor = color.copy(alpha = 0.0f).toArgb()
|
||||
val shadowColor = color.copy(alpha = alpha).toArgb()
|
||||
this.drawIntoCanvas {
|
||||
val paint = Paint()
|
||||
val frameworkPaint = paint.asFrameworkPaint()
|
||||
frameworkPaint.color = transparentColor
|
||||
frameworkPaint.setShadowLayer(
|
||||
blurRadius.toPx(),
|
||||
offsetX.toPx(),
|
||||
offsetY.toPx(),
|
||||
shadowColor
|
||||
)
|
||||
it.save()
|
||||
|
||||
if(spread.value > 0) {
|
||||
fun calcSpreadScale(spread: Float, childSize: Float): Float {
|
||||
return 1f + ((spread / childSize) * 2f)
|
||||
}
|
||||
|
||||
it.scale(
|
||||
calcSpreadScale(spread.toPx(), this.size.width),
|
||||
calcSpreadScale(spread.toPx(), this.size.height),
|
||||
this.center.x,
|
||||
this.center.y
|
||||
)
|
||||
}
|
||||
|
||||
it.drawRoundRect(
|
||||
0f,
|
||||
0f,
|
||||
this.size.width,
|
||||
this.size.height,
|
||||
borderRadius.toPx(),
|
||||
borderRadius.toPx(),
|
||||
paint
|
||||
)
|
||||
it.restore()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this
|
||||
}
|
||||
@@ -1,12 +1,25 @@
|
||||
package ru.megboyzz.dnevnik.navigation
|
||||
|
||||
import android.window.SplashScreen
|
||||
import androidx.compose.animation.*
|
||||
import androidx.compose.animation.core.CubicBezierEasing
|
||||
import androidx.compose.animation.core.Spring
|
||||
import androidx.compose.animation.core.spring
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.material.rememberScaffoldState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.unit.IntOffset
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import androidx.navigation.compose.NavHost
|
||||
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
|
||||
|
||||
|
||||
sealed class AppNavRoute(val route: String){
|
||||
@@ -20,9 +33,9 @@ sealed class AppNavRoute(val route: String){
|
||||
object Settings: AppNavRoute("settings_screen")
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalAnimationApi::class)
|
||||
@Composable
|
||||
fun AppNavHost(){
|
||||
val navController = rememberNavController()
|
||||
|
||||
/*val activity = LocalContext.current as MainActivity
|
||||
|
||||
@@ -30,14 +43,19 @@ fun AppNavHost(){
|
||||
|
||||
val viewModel: AppViewModel = viewModel(factory = AppViewModelFactory(application))*/
|
||||
|
||||
|
||||
val scaffoldState = rememberScaffoldState()
|
||||
val navController = rememberAnimatedNavController()
|
||||
|
||||
NavHost(
|
||||
navController = navController,
|
||||
startDestination = AppNavRoute.Splash.route
|
||||
startDestination = AppNavRoute.Login.route /* сделать проверку куки файлов */
|
||||
){
|
||||
composable(AppNavRoute.Splash.route) { }
|
||||
composable(AppNavRoute.Marks.route) { }
|
||||
composable(AppNavRoute.Schedule.route) { }
|
||||
composable(AppNavRoute.HomeWorks.route) { }
|
||||
composable(AppNavRoute.Login.route) { LoginScreen(navController) }
|
||||
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) { }
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,12 @@
|
||||
package ru.megboyzz.dnevnik.screens
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import androidx.compose.animation.animateColorAsState
|
||||
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.BorderStroke
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.*
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.selection.toggleable
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
@@ -22,6 +20,8 @@ import androidx.compose.runtime.*
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.focus.FocusRequester
|
||||
import androidx.compose.ui.focus.focusRequester
|
||||
import androidx.compose.ui.focus.onFocusChanged
|
||||
@@ -33,6 +33,8 @@ import androidx.compose.ui.graphics.Outline
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
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.LocalDensity
|
||||
import androidx.compose.ui.semantics.Role
|
||||
import androidx.compose.ui.text.input.KeyboardType
|
||||
@@ -42,9 +44,12 @@ import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.*
|
||||
import androidx.constraintlayout.compose.Visibility
|
||||
import androidx.navigation.NavController
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import kotlinx.coroutines.launch
|
||||
import ru.megboyzz.dnevnik.*
|
||||
import ru.megboyzz.dnevnik.R
|
||||
import ru.megboyzz.dnevnik.navigation.AppNavRoute
|
||||
import ru.megboyzz.dnevnik.ui.theme.*
|
||||
|
||||
@Composable
|
||||
@@ -52,9 +57,10 @@ fun MainScaffold(
|
||||
icon: Painter,
|
||||
title: String,
|
||||
/* TODO viewModel */
|
||||
content: (@Composable (it: PaddingValues) -> Unit)
|
||||
navController: NavController,
|
||||
scaffoldState: ScaffoldState,
|
||||
content: (@Composable (it: PaddingValues) -> Unit),
|
||||
) {
|
||||
val scaffoldState = rememberScaffoldState()
|
||||
val scope = rememberCoroutineScope()
|
||||
Scaffold(
|
||||
scaffoldState = scaffoldState,
|
||||
@@ -87,14 +93,146 @@ fun MainScaffold(
|
||||
drawerBackgroundColor = mainBlue,
|
||||
drawerContentColor = white,
|
||||
drawerShape = drawerShape,
|
||||
drawerContent = { DrawerContent() }
|
||||
drawerContent = { DrawerContent(navController, scaffoldState) },
|
||||
bottomBar = { BottomBar(navController) }
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BottomBar(navController: NavController) {
|
||||
//Box(Modifier.fillMaxWidth().height(90.dp).shadow(8.dp))
|
||||
|
||||
// УЖАСНЫЙ КОСТЫЛЬ ДЛЯ ПЕРЕХОДОВ С ПОМОЩЬЮ СТЕЙТОВ TODO - УБРАТЬ
|
||||
val goToMarks = remember { mutableStateOf(false) }
|
||||
val goToHw = remember { mutableStateOf(false) }
|
||||
val goToSchedule = remember { mutableStateOf(false) }
|
||||
|
||||
if(goToMarks.value){
|
||||
navController.navigate(AppNavRoute.Marks)
|
||||
//goToMarks.value = false
|
||||
}
|
||||
if(goToHw.value){
|
||||
navController.navigate(AppNavRoute.HomeWorks)
|
||||
//goToHw.value = false
|
||||
}
|
||||
if(goToSchedule.value){
|
||||
navController.navigate(AppNavRoute.Schedule)
|
||||
//goToSchedule.value = false
|
||||
}
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(90.dp)
|
||||
.background(white)
|
||||
.padding(10.dp, 10.dp, 10.dp, 15.dp),
|
||||
){
|
||||
Box(
|
||||
Modifier
|
||||
.fillMaxSize()
|
||||
.clip(RoundedCornerShape(20.dp))
|
||||
.background(mainBlue)
|
||||
){
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.SpaceEvenly,
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
modifier = Modifier.fillMaxSize()
|
||||
) {
|
||||
BottomNavButton(
|
||||
icon = R.drawable.ic_marks.AsPainter(),
|
||||
text = R.string.title_marks.AsString()
|
||||
) { goToMarks.value = true }
|
||||
BottomNavButton(
|
||||
icon = R.drawable.ic_homework.AsPainter(),
|
||||
text = R.string.title_hw.AsString()
|
||||
) { goToHw.value = true }
|
||||
BottomNavButton(
|
||||
icon = R.drawable.ic_schedule.AsPainter(),
|
||||
text = R.string.title_schedule.AsString()
|
||||
) { goToSchedule.value = true }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun DrawerContent() {
|
||||
fun BottomNavButton(
|
||||
icon: Painter,
|
||||
text: String,
|
||||
color: Color = white,
|
||||
onClick: () -> Unit,
|
||||
) {
|
||||
Column(
|
||||
Modifier
|
||||
.clickable(onClick = onClick),
|
||||
horizontalAlignment = Alignment.CenterHorizontally
|
||||
) {
|
||||
Image(
|
||||
painter = icon,
|
||||
contentDescription = "",
|
||||
modifier = Modifier.padding(5.dp)
|
||||
)
|
||||
Text(
|
||||
text = text,
|
||||
style = MainText,
|
||||
color = color
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@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")
|
||||
@Composable
|
||||
fun DrawerContent(
|
||||
navController: NavController,
|
||||
scaffoldState: ScaffoldState
|
||||
) {
|
||||
|
||||
// УЖАСНЫЙ КОСТЫЛЬ ДЛЯ ПЕРЕХОДОВ С ПОМОЩЬЮ СТЕЙТОВ TODO - УБРАТЬ
|
||||
val goToMarks = remember { mutableStateOf(false) }
|
||||
val goToHw = remember { mutableStateOf(false) }
|
||||
val goToSchedule = remember { mutableStateOf(false) }
|
||||
|
||||
val scope = rememberCoroutineScope()
|
||||
if(goToMarks.value){
|
||||
navController.navigate(AppNavRoute.Marks)
|
||||
scope.launch { scaffoldState.drawerState.close() }
|
||||
}
|
||||
if(goToHw.value){
|
||||
navController.navigate(AppNavRoute.HomeWorks)
|
||||
scope.launch { scaffoldState.drawerState.close() }
|
||||
}
|
||||
if(goToSchedule.value){
|
||||
navController.navigate(AppNavRoute.Schedule)
|
||||
scope.launch { scaffoldState.drawerState.close() }
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.width(260.dp)
|
||||
@@ -114,15 +252,15 @@ fun DrawerContent() {
|
||||
DrawerMainButton(
|
||||
icon = R.drawable.ic_marks.AsPainter(),
|
||||
text = R.string.title_marks.AsString()
|
||||
) { /* TODO */ }
|
||||
) { goToMarks.value = true }
|
||||
DrawerMainButton(
|
||||
icon = R.drawable.ic_homework.AsPainter(),
|
||||
text = R.string.title_hw.AsString()
|
||||
) { /* TODO */ }
|
||||
) { goToHw.value = true }
|
||||
DrawerMainButton(
|
||||
icon = R.drawable.ic_schedule.AsPainter(),
|
||||
text = R.string.title_schedule.AsString()
|
||||
) { /* TODO */ }
|
||||
) { goToSchedule.value = true }
|
||||
DrawerMainButton(
|
||||
icon = R.drawable.ic_settings.AsPainter(),
|
||||
text = R.string.title_settings.AsString()
|
||||
@@ -232,7 +370,19 @@ fun LoginBackground() {
|
||||
alignment = Alignment.TopStart
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BigLoginBackground() {
|
||||
val icon = R.drawable.header_big.AsPainter()
|
||||
Column(Modifier.fillMaxWidth()) {
|
||||
Image(
|
||||
painter = icon,
|
||||
contentDescription = "",
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
alignment = Alignment.TopStart
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -299,8 +449,9 @@ fun MainTextField(
|
||||
.focusRequester(focusRequester)
|
||||
.onFocusChanged {
|
||||
if (it.isFocused)
|
||||
if(isError.value) isError.value = false
|
||||
},
|
||||
if (isError.value) isError.value = false
|
||||
}
|
||||
.fillMaxWidth(),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -352,28 +503,6 @@ fun ButtonPrev() {
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun DrawerPrev() {
|
||||
Surface(
|
||||
color = mainBlue
|
||||
) {
|
||||
DrawerContent()
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun MainScaffoldPrev() {
|
||||
MainScaffold(
|
||||
icon = R.drawable.ic_marks.AsPainter(),
|
||||
title = R.string.title_marks.AsString()
|
||||
) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun CheckBoxed() {
|
||||
@@ -417,7 +546,7 @@ fun MainCheckbox(
|
||||
modifier: Modifier = Modifier,
|
||||
size: Float = 24f,
|
||||
checkedColor: Color = mainBlue,
|
||||
uncheckedColor: Color = white,
|
||||
uncheckedColor: Color = lightGray,
|
||||
checkmarkColor: Color = white,
|
||||
onValueChange: () -> Unit
|
||||
) {
|
||||
@@ -491,4 +620,113 @@ fun MainButton(
|
||||
style = H1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun LoginScreenContent(
|
||||
login: MutableState<String>,
|
||||
password: MutableState<String>,
|
||||
isError: MutableState<Boolean>,
|
||||
isRememberMe: MutableState<Boolean>,
|
||||
onSignIn: () -> Unit,
|
||||
onSignUp: () -> Unit,
|
||||
onForgetPassword: () -> Unit
|
||||
) {
|
||||
val configuration = LocalConfiguration.current
|
||||
val screenWidth = configuration.screenWidthDp
|
||||
|
||||
var defaultPadding = 65.dp
|
||||
|
||||
val isNormal = screenWidth < 500
|
||||
|
||||
Box(Modifier.fillMaxSize()) {
|
||||
|
||||
if(!isNormal) BigLoginBackground()
|
||||
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
if (isNormal) LoginBackground()
|
||||
else {
|
||||
defaultPadding *= 4
|
||||
}
|
||||
Row(horizontalArrangement = Arrangement.Center) {
|
||||
Text(
|
||||
text = R.string.title_welcome.AsString(),
|
||||
style = Big,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier.padding(defaultPadding, 20.dp, defaultPadding, 40.dp),
|
||||
color = dark
|
||||
)
|
||||
}
|
||||
Column(
|
||||
modifier = Modifier.padding(defaultPadding, 0.dp)
|
||||
) {
|
||||
Column(Modifier.fillMaxWidth()) {
|
||||
MainTextField(
|
||||
value = login,
|
||||
label = R.string.title_login.AsString(),
|
||||
isError = isError
|
||||
)
|
||||
SpacerHeight(15.dp)
|
||||
MainTextField(
|
||||
value = password,
|
||||
keyboardType = KeyboardType.Password,
|
||||
label = R.string.title_password.AsString(),
|
||||
isError = isError
|
||||
)
|
||||
}
|
||||
SpacerHeight(5.dp)
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(30.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxHeight(),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
MainCheckbox(isRememberMe) { }
|
||||
SpacerWidth(5.dp)
|
||||
Text(
|
||||
text = R.string.title_remember_me.AsString(),
|
||||
style = MainText,
|
||||
color = dark
|
||||
)
|
||||
}
|
||||
Text(
|
||||
text = R.string.title_forget_password.AsString(),
|
||||
style = MainText,
|
||||
color = dark,
|
||||
modifier = Modifier.clickable(onClick = onForgetPassword)
|
||||
)
|
||||
}
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(0.dp, 10.dp),
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
MainButton(
|
||||
text = R.string.title_sign_in.AsString(),
|
||||
onClick = onSignIn
|
||||
)
|
||||
SpacerHeight(5.dp)
|
||||
Text(
|
||||
text = R.string.title_sign_up.AsString(),
|
||||
modifier = Modifier
|
||||
.clickable(onClick = onSignUp)
|
||||
.padding(5.dp)
|
||||
.fillMaxWidth(),
|
||||
textAlign = TextAlign.Center,
|
||||
style = Mini,
|
||||
color = dark
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package ru.megboyzz.dnevnik.screens
|
||||
|
||||
import androidx.compose.material.ScaffoldState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.navigation.NavController
|
||||
import ru.megboyzz.dnevnik.AsPainter
|
||||
import ru.megboyzz.dnevnik.AsString
|
||||
import ru.megboyzz.dnevnik.R
|
||||
|
||||
@Composable
|
||||
fun HomeWorkScreen(
|
||||
navController: NavController,
|
||||
scaffoldState: ScaffoldState
|
||||
) {
|
||||
MainScaffold(
|
||||
icon = R.drawable.ic_homework.AsPainter(),
|
||||
title = R.string.title_hw.AsString(),
|
||||
navController = navController,
|
||||
scaffoldState = scaffoldState
|
||||
) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,35 +1,28 @@
|
||||
package ru.megboyzz.dnevnik.screens
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.modifier.modifierLocalOf
|
||||
import androidx.compose.ui.platform.LocalConfiguration
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.textInputServiceFactory
|
||||
import androidx.compose.ui.res.vectorResource
|
||||
import androidx.compose.ui.text.input.KeyboardType
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.navigation.NavController
|
||||
import ru.megboyzz.dnevnik.AsString
|
||||
import ru.megboyzz.dnevnik.R
|
||||
import ru.megboyzz.dnevnik.SpacerHeight
|
||||
import ru.megboyzz.dnevnik.SpacerWidth
|
||||
import ru.megboyzz.dnevnik.navigation.AppNavRoute
|
||||
import ru.megboyzz.dnevnik.ui.theme.*
|
||||
|
||||
@Composable
|
||||
fun LoginScreen() {
|
||||
fun LoginScreen(navController: NavController) {
|
||||
|
||||
val login = remember {
|
||||
mutableStateOf("")
|
||||
@@ -37,97 +30,20 @@ fun LoginScreen() {
|
||||
val password = remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
|
||||
val configuration = LocalConfiguration.current
|
||||
val screenHeight = configuration.screenHeightDp
|
||||
val screenWidth = configuration.screenWidthDp
|
||||
|
||||
val defaultModifier = Modifier.width(500.dp)
|
||||
|
||||
Column(
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
modifier = defaultModifier
|
||||
) {
|
||||
if(screenWidth < 500)
|
||||
LoginBackground()
|
||||
else{
|
||||
defaultModifier.then(Modifier.fillMaxWidth())
|
||||
}
|
||||
Row(horizontalArrangement = Arrangement.Center) {
|
||||
Text(
|
||||
text = R.string.title_welcome.AsString(),
|
||||
style = Big,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier.padding(65.dp, 20.dp, 65.dp, 40.dp)
|
||||
)
|
||||
}
|
||||
MainTextField(
|
||||
value = login,
|
||||
label = R.string.title_login.AsString()
|
||||
)
|
||||
SpacerHeight(15.dp)
|
||||
MainTextField(
|
||||
value = password,
|
||||
keyboardType = KeyboardType.Password,
|
||||
label = R.string.title_password.AsString()
|
||||
)
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(65.dp, 10.dp)
|
||||
.height(30.dp),
|
||||
horizontalArrangement = Arrangement.SpaceBetween,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxHeight(),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
val checkedState = remember { mutableStateOf(true) }
|
||||
MainCheckbox(checkedState) { /* TODO */ }
|
||||
SpacerWidth(5.dp)
|
||||
Text(
|
||||
text = R.string.title_remember_me.AsString(),
|
||||
style = MainText,
|
||||
color = dark
|
||||
)
|
||||
}
|
||||
Text(
|
||||
text = R.string.title_forget_password.AsString(),
|
||||
style = MainText,
|
||||
color = dark,
|
||||
modifier = Modifier.clickable{ /* TODO */ }
|
||||
)
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(65.dp, 10.dp),
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
MainButton(text = R.string.title_sign_in.AsString()) {
|
||||
/* TODO */
|
||||
}
|
||||
SpacerHeight(5.dp)
|
||||
Text(
|
||||
text = R.string.title_sign_up.AsString(),
|
||||
modifier = Modifier
|
||||
.clickable {
|
||||
/* TODO */
|
||||
}
|
||||
.padding(5.dp)
|
||||
.fillMaxWidth(),
|
||||
textAlign = TextAlign.Center,
|
||||
style = Mini
|
||||
)
|
||||
}
|
||||
|
||||
val isError = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
val rememberMe = remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun LoginPagePrev() {
|
||||
LoginScreen()
|
||||
}
|
||||
LoginScreenContent(
|
||||
login = login,
|
||||
password = password,
|
||||
isError = isError,
|
||||
isRememberMe = rememberMe,
|
||||
onSignIn = { navController.navigate(AppNavRoute.Marks.route) },
|
||||
onSignUp = { /*TODO*/ },
|
||||
onForgetPassword = { /* TODO */ }
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,2 +1,24 @@
|
||||
package ru.megboyzz.dnevnik.screens
|
||||
|
||||
import androidx.compose.material.ScaffoldState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.navigation.NavController
|
||||
import ru.megboyzz.dnevnik.AsPainter
|
||||
import ru.megboyzz.dnevnik.AsString
|
||||
import ru.megboyzz.dnevnik.R
|
||||
|
||||
@Composable
|
||||
fun MarksScreen(
|
||||
navController: NavController,
|
||||
scaffoldState: ScaffoldState
|
||||
) {
|
||||
MainScaffold(
|
||||
icon = R.drawable.ic_marks.AsPainter(),
|
||||
title = R.string.title_marks.AsString(),
|
||||
navController = navController,
|
||||
scaffoldState = scaffoldState
|
||||
) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,2 +1,24 @@
|
||||
package ru.megboyzz.dnevnik.screens
|
||||
|
||||
import androidx.compose.material.ScaffoldState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.navigation.NavController
|
||||
import ru.megboyzz.dnevnik.AsPainter
|
||||
import ru.megboyzz.dnevnik.AsString
|
||||
import ru.megboyzz.dnevnik.R
|
||||
import ru.megboyzz.dnevnik.navigation.AppNavRoute
|
||||
|
||||
@Composable
|
||||
fun ScheduleScreen(
|
||||
navController: NavController,
|
||||
scaffoldState: ScaffoldState
|
||||
) {
|
||||
MainScaffold(
|
||||
icon = R.drawable.ic_schedule.AsPainter(),
|
||||
title = R.string.title_schedule.AsString(),
|
||||
navController = navController,
|
||||
scaffoldState = scaffoldState
|
||||
) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="150dp"
|
||||
android:height="150dp"
|
||||
android:viewportWidth="150"
|
||||
android:viewportHeight="150">
|
||||
<path
|
||||
android:pathData="M0,0H150V120C150,136.57 136.57,150 120,150H0V0Z"
|
||||
android:fillColor="#3C95FF"/>
|
||||
<group>
|
||||
<clip-path
|
||||
android:pathData="M35,35h80v80h-80z"/>
|
||||
<path
|
||||
android:pathData="M108.52,52.43L83.94,40.72C78.53,37.49 71.8,37.43 66.33,40.57L41.48,52.43C41.38,52.48 41.29,52.53 41.2,52.58C35.3,55.96 33.25,63.47 36.62,69.37C37.77,71.37 39.45,73.01 41.48,74.1L48.33,77.37V93.7C48.34,101 53.09,107.46 60.06,109.63C64.92,111.03 69.95,111.72 75,111.67C80.05,111.72 85.08,111.04 89.94,109.64C96.91,107.47 101.66,101.02 101.67,93.72V77.36L108.33,74.17V101.67C108.33,103.51 109.82,105 111.67,105C113.51,105 115,103.51 115,101.67V61.67C115.02,57.75 111.93,54.14 108.52,52.43ZM95,93.72C95,98.08 92.17,101.95 88,103.26C83.77,104.47 79.39,105.05 75,105C70.6,105.05 66.23,104.47 62,103.26C57.83,101.95 55,98.08 55,93.72V80.54L66.06,85.81C68.78,87.43 71.9,88.28 75.07,88.27C78.09,88.29 81.06,87.49 83.66,85.96L95,80.54V93.72ZM105.67,68.08L80.53,80.08C77.02,82.12 72.68,82.07 69.23,79.93L44.63,68.23C41.89,66.75 40.86,63.33 42.34,60.59C42.84,59.66 43.59,58.9 44.51,58.37L69.49,46.44C73,44.4 77.34,44.46 80.79,46.59L105.37,58.3C107.18,59.3 108.31,61.2 108.33,63.27C108.34,65.22 107.33,67.05 105.67,68.08Z"
|
||||
android:fillColor="#ffffff"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -7,4 +7,8 @@
|
||||
<color name="teal_700">#FF018786</color>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="white">#FFFFFFFF</color>
|
||||
|
||||
<color name="statusBlue">#3077CC</color>
|
||||
<color name="backGround">#FFF4F4F4</color>
|
||||
|
||||
</resources>
|
||||
@@ -3,7 +3,7 @@
|
||||
<string name="title_header">Добро пожаловать в дневник</string>
|
||||
<string name="title_marks">Оценки</string>
|
||||
<string name="title_schedule">Расписание</string>
|
||||
<string name="title_hw">Домашнее занадние</string>
|
||||
<string name="title_hw">Домашнее задание</string>
|
||||
<string name="title_settings">Настройки</string>
|
||||
<string name="title_leave_from_acconut">Выйти из аккаунта</string>
|
||||
<string name="title_welcome">Добро пожаловать в дневник</string>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
<resources>
|
||||
|
||||
<style name="Theme.MyDnevnik" parent="android:Theme.Material.Light.NoActionBar">
|
||||
<item name="android:statusBarColor">@color/purple_700</item>
|
||||
<item name="android:statusBarColor">@color/statusBlue</item>
|
||||
<item name="android:colorBackground">@color/backGround</item>
|
||||
</style>
|
||||
</resources>
|
||||
Reference in New Issue
Block a user