Skip to content

Commit

Permalink
Merge pull request #12
Browse files Browse the repository at this point in the history
Add placeholders for data
  • Loading branch information
Neexol authored May 24, 2022
2 parents 9468cfd + 85eb339 commit bef4311
Show file tree
Hide file tree
Showing 32 changed files with 799 additions and 346 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ data class Lesson(
val number: Int,
val weeks: List<Int>
) {
private fun formatName() = name.trim().lowercase().let {
fun formatName() = name.trim().lowercase().let {
if (it == "военная" || it == "подготовка") "Военная подготовка" else name
}
val lessonWithType = formatName() + (if (type.isNotBlank()) ", ${type.uppercase()}" else "")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ru.neexol.rtut.presentation.components

import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.*
import androidx.compose.material.ContentAlpha
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

@Composable
fun ImagePlaceholder(
@DrawableRes iconId: Int,
@StringRes labelId: Int
) {
Box(
modifier = Modifier.fillMaxSize().imePadding(),
contentAlignment = Alignment.Center
) {
Column(
modifier = Modifier.padding(horizontal = 90.dp).alpha(ContentAlpha.medium),
horizontalAlignment = Alignment.CenterHorizontally
) {
Icon(
modifier = Modifier.size(80.dp),
painter = painterResource(iconId),
contentDescription = stringResource(labelId)
)
Text(
text = stringResource(labelId),
fontSize = 20.sp,
textAlign = TextAlign.Center
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,23 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
import ru.neexol.rtut.data.lessons.models.Lesson
import ru.neexol.rtut.data.lessons.models.LessonTime

@Composable
fun LessonItem(lesson: Lesson?, time: LessonTime, onClick: (() -> Unit)? = null) {
fun LessonItem(
lesson: Lesson?,
time: LessonTime,
onClassroomCopy: () -> Unit,
onLessonClick: (() -> Unit)? = null
) {
val surfaceModifier = if (lesson == null) {
Modifier.alpha(ContentAlpha.disabled)
} else {
onClick?.let {
onLessonClick?.let {
Modifier.clickable { it() }
} ?: Modifier
}
Expand All @@ -33,7 +40,7 @@ fun LessonItem(lesson: Lesson?, time: LessonTime, onClick: (() -> Unit)? = null)
Row(Modifier.padding(16.dp)) {
Time(time)
Payload(lesson)
Classroom(lesson?.classroom)
Classroom(lesson?.classroom, onClassroomCopy)
}
}
}
Expand Down Expand Up @@ -76,11 +83,16 @@ private fun RowScope.Payload(lesson: Lesson?) {
}

@Composable
private fun Classroom(text: String?) {
private fun Classroom(text: String?, onClassroomCopy: () -> Unit,) {
val clipboardManager = LocalClipboardManager.current
Text(
modifier = Modifier
.background(MaterialTheme.colors.primary, MaterialTheme.shapes.small)
.padding(vertical = 5.dp, horizontal = 8.dp),
.padding(vertical = 5.dp, horizontal = 8.dp)
.clickable {
clipboardManager.setText(AnnotatedString(text?.uppercase().toContent()))
onClassroomCopy()
},
text = text?.uppercase().toContent(),
style = MaterialTheme.typography.caption,
color = MaterialTheme.colors.onPrimary
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.neexol.rtut.presentation.components

import androidx.compose.runtime.snapshotFlow
import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.PagerState
import java.math.BigDecimal

@ExperimentalPagerApi
fun scrollingPair(state1: PagerState, state2: PagerState) = when {
state1.isScrollInProgress -> state1 to state2
state2.isScrollInProgress -> state2 to state1
else -> null
}

@ExperimentalPagerApi
suspend fun syncScroll(pair: Pair<PagerState, PagerState>?) {
val (scrollingState, followingState) = pair ?: return
snapshotFlow { scrollingState.currentPage + scrollingState.currentPageOffset }
.collect { pagePart ->
val divideAndRemainder = BigDecimal.valueOf(pagePart.toDouble())
.divideAndRemainder(BigDecimal.ONE)

followingState.scrollToPage(
divideAndRemainder[0].toInt(),
divideAndRemainder[1].toFloat(),
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package ru.neexol.rtut.presentation.screens.main.ui

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch
import ru.neexol.rtut.R
import ru.neexol.rtut.presentation.components.GroupTextField
import ru.neexol.rtut.presentation.screens.settings.SettingsViewModel

@Composable
fun InitialGroupChoose(vm: SettingsViewModel) {
val coroutineScope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
LaunchedEffect(vm.groupUiState.message) {
vm.groupUiState.message?.let {
coroutineScope.launch {
snackbarHostState.currentSnackbarData?.dismiss()
snackbarHostState.showSnackbar(it)
vm.clearGroupMessage()
}
}
}

Surface {
Box(
modifier = Modifier
.fillMaxSize()
.background(MaterialTheme.colors.primaryVariant),
contentAlignment = Alignment.Center
) {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Icon(
modifier = Modifier.size(148.dp),
tint = MaterialTheme.colors.primary,
painter = painterResource(R.drawable.ic_launcher_foreground),
contentDescription = null
)
Text(stringResource(R.string.enter_group))
Spacer(Modifier.size(16.dp))
GroupTextField(stringResource(R.string.group_pattern), vm::editGroup)
}
SnackbarHost(
hostState = snackbarHostState,
modifier = Modifier.align(Alignment.BottomCenter)
)
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package ru.neexol.rtut.presentation.screens.main.ui

import androidx.compose.animation.Crossfade
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.ModalBottomSheetValue
import androidx.compose.material.rememberModalBottomSheetState
import androidx.compose.material.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
Expand All @@ -21,15 +21,26 @@ import ru.neexol.rtut.presentation.screens.settings.SettingsViewModel
@Composable
fun MainScreen() {
val vm: SettingsViewModel = viewModel()
if (!vm.groupUiState.group.isNullOrEmpty()) {
val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
val isSheetHidden by remember {
derivedStateOf { !sheetState.isVisible }
}
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colors.primaryVariant
) {
Crossfade(vm.groupUiState.group) { group ->
when (group?.isEmpty()) {
null -> {}
true -> InitialGroupChoose(vm)
else -> {
val sheetState = rememberModalBottomSheetState(ModalBottomSheetValue.Hidden)
val isSheetHidden by remember {
derivedStateOf { !sheetState.isVisible }
}

Column(Modifier.navigationBarsPadding()) {
StatusBar(!isSheetHidden)
Screens(sheetState, isSheetHidden, vm)
Column(Modifier.navigationBarsPadding()) {
StatusBar(!isSheetHidden)
Screens(sheetState, isSheetHidden)
}
}
}
}
} else InitialScreen(vm.groupUiState.group?.run { vm::editGroup })
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,11 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.google.accompanist.pager.ExperimentalPagerApi
import kotlinx.coroutines.launch
import ru.neexol.rtut.data.lessons.models.Lesson
import ru.neexol.rtut.presentation.screens.main.Screen
import ru.neexol.rtut.presentation.screens.map.ui.MapScreen
import ru.neexol.rtut.presentation.screens.notes.NotesViewModel
import ru.neexol.rtut.presentation.screens.notes.ui.NotesScreen
import ru.neexol.rtut.presentation.screens.schedule.ui.ScheduleScreen
import ru.neexol.rtut.presentation.screens.settings.SettingsViewModel
import ru.neexol.rtut.presentation.screens.settings.ui.SettingsScreen
import ru.neexol.rtut.presentation.screens.teacher.ui.TeacherScreen

Expand All @@ -34,22 +32,17 @@ import ru.neexol.rtut.presentation.screens.teacher.ui.TeacherScreen
@Composable
internal fun Screens(
sheetState: ModalBottomSheetState,
isSheetHidden: Boolean,
settingsVM: SettingsViewModel
isSheetHidden: Boolean
) {
val mainNavController = rememberNavController()
val coroutineScope = rememberCoroutineScope()

val notesVM = viewModel<NotesViewModel>()
LaunchedEffect(isSheetHidden) {
if (isSheetHidden) {
notesVM.clearState()
}
}
val coroutineScope = rememberCoroutineScope()
val showNotes: (Lesson, String) -> Unit = { l, w ->
notesVM.setLesson(l, w)
coroutineScope.launch { sheetState.show() }
}

ModalBottomSheetLayout(
sheetState = sheetState,
Expand All @@ -60,10 +53,17 @@ internal fun Screens(
bottomBar = { ScreensBottomBar(mainNavController) }
) { innerPadding ->
NavHost(mainNavController, Screen.Schedule.route, Modifier.padding(innerPadding)) {
composable(Screen.Schedule.route) { ScheduleScreen { l, w -> showNotes(l, w) } }
composable(Screen.Schedule.route) {
ScheduleScreen(
onLessonClick = { l, w ->
notesVM.setLesson(l, w)
coroutineScope.launch { sheetState.show() }
}
)
}
composable(Screen.Teacher.route) { TeacherScreen() }
composable(Screen.Map.route) { MapScreen() }
composable(Screen.Settings.route) { SettingsScreen(settingsVM) }
composable(Screen.Settings.route) { SettingsScreen() }
}
}
}
Expand Down
Loading

0 comments on commit bef4311

Please sign in to comment.