🚀 Replace loading indicators with wavy loading indicators

* Replaced CircularProgressIndicator with CircularWavyProgressIndicator
This commit is contained in:
Acclorite 2024-10-31 23:07:52 +02:00
parent d0c0c9e133
commit 812584b5bb
6 changed files with 103 additions and 73 deletions

View file

@ -0,0 +1,40 @@
package ua.acclorite.book_story.presentation.core.components.progress_indicator
import androidx.compose.material3.CircularWavyProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun CircularProgressIndicator(
modifier: Modifier = Modifier,
color: Color = MaterialTheme.colorScheme.primary,
strokeWidth: Dp = 4.dp,
gapSize: Dp = 2.dp
) {
CircularWavyProgressIndicator(
modifier = modifier,
color = color,
stroke = Stroke(
width = with(LocalDensity.current) {
strokeWidth.toPx()
},
cap = StrokeCap.Round
),
trackStroke = Stroke(
width = with(LocalDensity.current) {
strokeWidth.toPx()
},
cap = StrokeCap.Round
),
gapSize = gapSize
)
}

View file

@ -10,18 +10,17 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator
import ua.acclorite.book_story.presentation.ui.FadeTransitionPreservingSpace import ua.acclorite.book_story.presentation.ui.FadeTransitionPreservingSpace
/** /**
@ -80,7 +79,6 @@ fun AboutItem(
Spacer(modifier = Modifier.width(18.dp)) Spacer(modifier = Modifier.width(18.dp))
CircularProgressIndicator( CircularProgressIndicator(
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
strokeCap = StrokeCap.Round,
modifier = Modifier.size(28.dp) modifier = Modifier.size(28.dp)
) )
} }

View file

@ -5,7 +5,8 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.LinearWavyProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -13,7 +14,6 @@ import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -24,6 +24,7 @@ import ua.acclorite.book_story.presentation.screens.book_info.data.BookInfoViewM
/** /**
* Statistic section. * Statistic section.
*/ */
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun BookInfoStatisticSection() { fun BookInfoStatisticSection() {
val state = BookInfoViewModel.getState() val state = BookInfoViewModel.getState()
@ -49,16 +50,15 @@ fun BookInfoStatisticSection() {
color = MaterialTheme.colorScheme.onSurface, color = MaterialTheme.colorScheme.onSurface,
style = MaterialTheme.typography.bodyLarge style = MaterialTheme.typography.bodyLarge
) )
Spacer(modifier = Modifier.height(6.dp)) Spacer(modifier = Modifier.height(6.dp))
LinearProgressIndicator( LinearWavyProgressIndicator(
progress = { state.value.book.progress.coerceAtLeast(0.01f) }, progress = { state.value.book.progress.coerceIn(0f, 1f) },
modifier = Modifier
.fillMaxWidth(),
color = MaterialTheme.colorScheme.primary,
trackColor = MaterialTheme.colorScheme.secondaryContainer.copy(0.7f), trackColor = MaterialTheme.colorScheme.secondaryContainer.copy(0.7f),
strokeCap = StrokeCap.Round, modifier = Modifier.fillMaxWidth(),
amplitude = { 0.5f },
wavelength = 80.dp,
waveSpeed = 15.dp
) )
Spacer(modifier = Modifier.height(6.dp)) Spacer(modifier = Modifier.height(6.dp))

View file

@ -7,18 +7,16 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AddChart import androidx.compose.material.icons.filled.AddChart
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.model.NullableBook import ua.acclorite.book_story.domain.model.NullableBook
import ua.acclorite.book_story.presentation.core.components.dialog.DialogWithLazyColumn import ua.acclorite.book_story.presentation.core.components.dialog.DialogWithLazyColumn
import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator
import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator
import ua.acclorite.book_story.presentation.core.util.showToast import ua.acclorite.book_story.presentation.core.util.showToast
import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent import ua.acclorite.book_story.presentation.screens.browse.data.BrowseEvent
@ -76,8 +74,6 @@ fun BrowseAddingDialog() {
.padding(top = 16.dp) .padding(top = 16.dp)
) { ) {
CircularProgressIndicator( CircularProgressIndicator(
color = MaterialTheme.colorScheme.primary,
strokeCap = StrokeCap.Round,
modifier = Modifier modifier = Modifier
.align(Alignment.Center) .align(Alignment.Center)
.size(36.dp) .size(36.dp)

View file

@ -27,7 +27,6 @@ import androidx.compose.foundation.layout.systemBarsIgnoringVisibility
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -60,6 +59,7 @@ import ua.acclorite.book_story.domain.model.Chapter
import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility
import ua.acclorite.book_story.presentation.core.components.common.SelectionContainer import ua.acclorite.book_story.presentation.core.components.common.SelectionContainer
import ua.acclorite.book_story.presentation.core.components.placeholder.ErrorPlaceholder import ua.acclorite.book_story.presentation.core.components.placeholder.ErrorPlaceholder
import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator
import ua.acclorite.book_story.presentation.core.constants.Constants import ua.acclorite.book_story.presentation.core.constants.Constants
import ua.acclorite.book_story.presentation.core.constants.provideFonts import ua.acclorite.book_story.presentation.core.constants.provideFonts
import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator

View file

@ -7,7 +7,6 @@ import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkHorizontally import androidx.compose.animation.shrinkHorizontally
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@ -18,8 +17,8 @@ import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.rounded.Menu import androidx.compose.material.icons.rounded.Menu
import androidx.compose.material.icons.rounded.Upgrade import androidx.compose.material.icons.rounded.Upgrade
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -30,14 +29,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import ua.acclorite.book_story.R import ua.acclorite.book_story.R
import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility import ua.acclorite.book_story.presentation.core.components.common.AnimatedVisibility
import ua.acclorite.book_story.presentation.core.components.common.IconButton import ua.acclorite.book_story.presentation.core.components.common.IconButton
import ua.acclorite.book_story.presentation.core.components.progress_indicator.CircularProgressIndicator
import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator import ua.acclorite.book_story.presentation.core.navigation.LocalNavigator
import ua.acclorite.book_story.presentation.core.navigation.Screen import ua.acclorite.book_story.presentation.core.navigation.Screen
import ua.acclorite.book_story.presentation.core.util.noRippleClickable import ua.acclorite.book_story.presentation.core.util.noRippleClickable
@ -55,7 +53,7 @@ import ua.acclorite.book_story.presentation.ui.Colors
/** /**
* Reader top bar. Displays title of the book. * Reader top bar. Displays title of the book.
*/ */
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun ReaderTopBar() { fun ReaderTopBar() {
val state = ReaderViewModel.getState() val state = ReaderViewModel.getState()
@ -113,58 +111,56 @@ fun ReaderTopBar() {
} }
}, },
title = { title = {
Column(verticalArrangement = Arrangement.Center) { Text(
Text( text = state.value.book.title,
state.value.book.title, fontSize = 20.sp,
fontFamily = FontFamily.Default, lineHeight = 20.sp,
fontWeight = FontWeight.Normal, color = MaterialTheme.colorScheme.onSurface,
fontSize = 20.sp, overflow = TextOverflow.Ellipsis,
lineHeight = 20.sp, maxLines = 1,
color = MaterialTheme.colorScheme.onSurface, modifier = Modifier
overflow = TextOverflow.Ellipsis, .padding(end = 8.dp)
maxLines = 1, .noRippleClickable(
modifier = Modifier enabled = !state.value.lockMenu,
.padding(end = 8.dp) onClick = {
.noRippleClickable( onEvent(
enabled = !state.value.lockMenu, ReaderEvent.OnGoBack(
onClick = { context = context,
onEvent( refreshList = {
ReaderEvent.OnGoBack( onLibraryEvent(LibraryEvent.OnUpdateBook(it))
context = context, onHistoryEvent(HistoryEvent.OnUpdateBook(it))
refreshList = { },
onLibraryEvent(LibraryEvent.OnUpdateBook(it)) navigate = {
onHistoryEvent(HistoryEvent.OnUpdateBook(it)) onNavigate {
}, navigate(
navigate = { Screen.BookInfo(
onNavigate { bookId = state.value.book.id,
navigate( startUpdate = false
Screen.BookInfo( ),
bookId = state.value.book.id, useBackAnimation = true,
startUpdate = false saveInBackStack = false
), )
useBackAnimation = true,
saveInBackStack = false
)
}
} }
) }
) )
} )
) }
.then( )
if (state.value.checkingForUpdate || state.value.updateFound) Modifier .then(
else Modifier.basicMarquee(iterations = Int.MAX_VALUE) if (state.value.checkingForUpdate || state.value.updateFound) Modifier
) else Modifier.basicMarquee(iterations = Int.MAX_VALUE)
) )
Text( )
state.value.currentChapter?.title },
?: context.getString(R.string.no_chapters), subtitle = {
color = MaterialTheme.colorScheme.onSurfaceVariant, Text(
style = MaterialTheme.typography.bodyLarge, text = state.value.currentChapter?.title
maxLines = 1, ?: context.getString(R.string.no_chapters),
overflow = TextOverflow.Ellipsis color = MaterialTheme.colorScheme.onSurfaceVariant,
) style = MaterialTheme.typography.bodyLarge,
} maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}, },
actions = { actions = {
AnimatedVisibility( AnimatedVisibility(