组件优化

This commit is contained in:
HapeLee
2026-05-15 02:19:16 +08:00
parent c6cbfab0fa
commit 0c1ad67526
19 changed files with 160 additions and 65 deletions
@@ -23,10 +23,9 @@ import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Stop
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.LinearProgressIndicator
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -145,7 +144,7 @@ private fun BookCacheManageScreen(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
CircularProgressIndicator()
AppCircularProgressIndicator()
}
} else {
LazyColumn(
@@ -31,8 +31,8 @@ import androidx.compose.material.icons.filled.Folder
import androidx.compose.material.icons.filled.FolderOpen
import androidx.compose.material.icons.outlined.Book
import androidx.compose.material.icons.outlined.Description
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
@@ -200,7 +200,7 @@ private fun ImportBookContent(
) {
when {
state.items.isEmpty() && state.isLoading -> {
CircularProgressIndicator(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center))
AppCircularProgressIndicator(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center))
}
state.items.isEmpty() -> {
@@ -40,8 +40,8 @@ import androidx.compose.material.icons.outlined.AddCircleOutline
import androidx.compose.material.icons.outlined.Book
import androidx.compose.material.icons.outlined.CloudSync
import androidx.compose.material.icons.outlined.Description
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -326,7 +326,7 @@ fun RemoteBookScreen(
) {
if (uiState.items.isEmpty()) {
if (uiState.isLoading) {
CircularProgressIndicator(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center))
AppCircularProgressIndicator(modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center))
} else {
EmptyMessage(
modifier = Modifier
@@ -36,8 +36,8 @@ import androidx.compose.material.icons.filled.Share
import androidx.compose.material.icons.filled.Timeline
import androidx.compose.material.icons.outlined.Book
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ElevatedCard
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.ExtendedFloatingActionButton
@@ -183,10 +183,7 @@ private fun BookInfoScreenContent(
val book = state.book
if (book == null) {
Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
CircularProgressIndicator(
color = LegadoTheme.colorScheme.primary,
trackColor = LegadoTheme.colorScheme.surfaceContainerHighest,
)
AppCircularProgressIndicator()
}
} else {
Box(modifier = Modifier.fillMaxSize()) {
@@ -1053,10 +1050,7 @@ private fun BookInfoDialogs(
onDismissRequest = {},
content = {
Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
CircularProgressIndicator(
color = LegadoTheme.colorScheme.primary,
trackColor = LegadoTheme.colorScheme.surfaceContainerHighest,
)
AppCircularProgressIndicator()
}
}
)
@@ -32,9 +32,8 @@ import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.outlined.FolderZip
import androidx.compose.material.icons.outlined.Image
import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.LinearProgressIndicator
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@@ -234,7 +233,7 @@ fun ChangeCoverSheet(
}
) {
if (isSearching) {
LinearProgressIndicator(modifier = Modifier.fillMaxWidth())
AppLinearProgressIndicator(modifier = Modifier.fillMaxWidth())
Spacer(modifier = Modifier.height(12.dp))
}
LazyVerticalGrid(columns = GridCells.Fixed(3), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp)) {
@@ -588,7 +587,7 @@ fun ChangeSourceSheet(
onDismissRequest = {},
content = {
Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
CircularProgressIndicator()
AppCircularProgressIndicator()
}
}
)
@@ -41,10 +41,10 @@ import androidx.compose.material.icons.filled.SkipNext
import androidx.compose.material.icons.filled.Stop
import androidx.compose.material.icons.filled.Upload
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FloatingActionButtonMenu
import androidx.compose.material3.FloatingActionButtonMenuItem
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Text
@@ -962,7 +962,7 @@ private fun BookshelfManageScreen(
verticalArrangement = Arrangement.spacedBy(12.dp),
) {
if (state.isChangingSource) {
CircularProgressIndicator()
AppCircularProgressIndicator()
}
AppText(
text = state.changeSourceError ?: state.changeSourceProgress ?: "准备中",
@@ -27,8 +27,8 @@ import androidx.compose.material.icons.filled.History
import androidx.compose.material.icons.filled.Layers
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.Stop
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBarDefaults
import io.legado.app.ui.widget.components.topbar.GlassMediumFlexibleTopAppBar
@@ -685,7 +685,7 @@ private fun SearchResultFooter(
modifier = Modifier.size(18.dp),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator()
AppCircularProgressIndicator()
}
AppText(text = stringResource(R.string.is_loading))
}
@@ -37,8 +37,8 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import io.legado.app.ui.widget.components.AppFloatingActionButton
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.ListItem
import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import androidx.compose.material3.ListItemDefaults
import androidx.compose.material3.animateFloatingActionButton
import androidx.compose.runtime.Composable
@@ -175,7 +175,7 @@ fun SearchContentScreen(
}
AnimatedVisibility(visible = isSearching) {
LinearProgressIndicator(modifier = Modifier.fillMaxWidth())
AppLinearProgressIndicator(modifier = Modifier.fillMaxWidth())
}
}
},
@@ -52,8 +52,8 @@ import androidx.compose.material.icons.filled.VerticalAlignTop
import androidx.compose.material.icons.outlined.DownloadForOffline
import androidx.compose.material.icons.rounded.LocationOn
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FloatingActionButtonMenu
import androidx.compose.material3.FloatingActionButtonMenuItem
@@ -944,10 +944,8 @@ private fun StatusIcon(
}
"LOADING" -> {
CircularProgressIndicator(
modifier = Modifier.size(24.dp),
strokeWidth = 2.dp,
color = LegadoTheme.colorScheme.secondary
AppCircularProgressIndicator(
modifier = Modifier.size(24.dp)
)
}
@@ -66,8 +66,8 @@ import androidx.compose.material.icons.filled.Save
import androidx.compose.material.icons.filled.SelectAll
import androidx.compose.material.icons.filled.UploadFile
import androidx.compose.material.icons.filled.Wifi
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -1194,7 +1194,7 @@ private fun BookshelfOverlays(
modifier = Modifier.padding(24.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
CircularProgressIndicator()
AppCircularProgressIndicator()
uiState.loadingText?.let {
AppText(
text = it,
@@ -1,6 +1,7 @@
package io.legado.app.ui.main.explore
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.animateFloatAsState
@@ -27,8 +28,8 @@ import androidx.compose.material.icons.filled.Group
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.VerticalAlignTop
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import io.legado.app.ui.widget.components.progressIndicator.AppCircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.ListItemDefaults
@@ -75,6 +76,7 @@ import io.legado.app.ui.widget.components.list.TopFloatingStickyItem
import io.legado.app.ui.widget.components.menuItem.MenuItemIcon
import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu
import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenuItem
import io.legado.app.ui.widget.components.progressIndicator.AppContainedLoadingIndicator
import io.legado.app.ui.widget.components.text.AppText
import io.legado.app.utils.startActivity
import kotlinx.coroutines.flow.collect
@@ -356,20 +358,24 @@ fun ExploreSourceHeader(
)
},
trailingContent = {
if (loadingKinds) {
CircularProgressIndicator(
modifier = Modifier.size(18.dp),
strokeWidth = 2.dp
)
} else {
Icon(
imageVector = Icons.Default.ChevronRight,
contentDescription = null,
modifier = Modifier
.rotate(rotation)
.size(20.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant
)
AnimatedContent(
targetState = loadingKinds,
label = "LoadingSwitch"
) { loading ->
if (loading) {
AppContainedLoadingIndicator(
modifier = Modifier.size(18.dp)
)
} else {
Icon(
imageVector = Icons.Default.ChevronRight,
contentDescription = null,
modifier = Modifier
.rotate(rotation)
.size(20.dp),
tint = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
RoundDropdownMenu(expanded = showMenu, onDismissRequest = { showMenu = false }) {
PillHeaderDivider(title = item.bookSourceName)
@@ -17,8 +17,8 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.runtime.Composable
import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
@@ -78,8 +78,8 @@ fun RssStartPage(
.windowInsetsPadding(WindowInsets.statusBars)
) {
if (isLoading && progress < 100) {
LinearProgressIndicator(
progress = { progress / 100f },
AppLinearProgressIndicator(
progress = progress / 100f,
modifier = Modifier
.fillMaxWidth()
.padding(top = 4.dp)
@@ -41,8 +41,8 @@ import androidx.compose.material.icons.filled.Star
import androidx.compose.material.icons.filled.Stop
import androidx.compose.material.icons.filled.VolumeUp
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.Icon
import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
@@ -374,8 +374,8 @@ fun RssReadRouteScreen(
}
)
if (webProgress in 0..99) {
LinearProgressIndicator(
progress = { webProgress / 100f },
AppLinearProgressIndicator(
progress = webProgress / 100f,
modifier = Modifier.fillMaxWidth()
)
}
@@ -1,15 +1,21 @@
package io.legado.app.ui.widget.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import io.legado.app.ui.theme.LegadoTheme.composeEngine
import io.legado.app.ui.theme.ThemeResolver
import top.yukonga.miuix.kmp.basic.PullToRefresh as MiuixPullToRefresh
import top.yukonga.miuix.kmp.basic.rememberPullToRefreshState as miuixRememberPullToRefreshState
@OptIn(ExperimentalMaterial3Api::class)
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun AppPullToRefresh(
isRefreshing: Boolean,
@@ -41,11 +47,19 @@ fun AppPullToRefresh(
}
} else {
if (enabled) {
androidx.compose.material3.pulltorefresh.PullToRefreshBox(
val state = rememberPullToRefreshState()
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = onRefresh,
modifier = modifier,
state = androidx.compose.material3.pulltorefresh.rememberPullToRefreshState(),
state = state,
indicator = {
PullToRefreshDefaults.LoadingIndicator(
state = state,
isRefreshing = isRefreshing,
modifier = Modifier.align(Alignment.TopCenter),
)
}
) {
content()
}
@@ -9,8 +9,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material3.ContainedLoadingIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import io.legado.app.ui.widget.components.progressIndicator.AppContainedLoadingIndicator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -29,7 +28,6 @@ import io.legado.app.ui.widget.components.icon.AppIcons
import io.legado.app.ui.widget.components.button.SmallTonalTextButton
import io.legado.app.ui.widget.components.text.AnimatedTextLine
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun EmptyMessage(
message: String,
@@ -58,7 +56,7 @@ fun EmptyMessage(
label = "LoadingStateAnimation"
) { loading ->
if (loading) {
ContainedLoadingIndicator()
AppContainedLoadingIndicator()
} else {
AnimatedTextLine(
text = currentFace,
@@ -6,15 +6,13 @@ import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
import androidx.compose.material3.ContainedLoadingIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.TextButton
import io.legado.app.ui.widget.components.progressIndicator.AppContainedLoadingIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import io.legado.app.ui.widget.components.text.AppText
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun AnimatedTextButton(
isLoading: Boolean,
@@ -36,7 +34,7 @@ fun AnimatedTextButton(
label = "ButtonLoading"
) { loading ->
if (loading) {
ContainedLoadingIndicator()
AppContainedLoadingIndicator()
} else {
AppText(text)
}
@@ -0,0 +1,32 @@
package io.legado.app.ui.widget.components.progressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.legado.app.ui.theme.LegadoTheme.composeEngine
import io.legado.app.ui.theme.ThemeResolver
import androidx.compose.material3.CircularProgressIndicator
import top.yukonga.miuix.kmp.basic.CircularProgressIndicator as MiuixCircularProgressIndicator
@Composable
fun AppCircularProgressIndicator(
modifier: Modifier = Modifier,
progress: Float? = null,
) {
if (ThemeResolver.isMiuixEngine(composeEngine)) {
MiuixCircularProgressIndicator(
modifier = modifier,
progress = progress
)
} else {
if (progress != null) {
CircularProgressIndicator(
progress = { progress },
modifier = modifier
)
} else {
CircularProgressIndicator(
modifier = modifier
)
}
}
}
@@ -0,0 +1,25 @@
package io.legado.app.ui.widget.components.progressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.legado.app.ui.theme.LegadoTheme.composeEngine
import io.legado.app.ui.theme.ThemeResolver
import androidx.compose.material3.ContainedLoadingIndicator
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import top.yukonga.miuix.kmp.basic.InfiniteProgressIndicator as MiuixInfiniteProgressIndicator
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun AppContainedLoadingIndicator(
modifier: Modifier = Modifier,
) {
if (ThemeResolver.isMiuixEngine(composeEngine)) {
MiuixInfiniteProgressIndicator(
modifier = modifier,
)
} else {
ContainedLoadingIndicator(
modifier = modifier
)
}
}
@@ -0,0 +1,32 @@
package io.legado.app.ui.widget.components.progressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.legado.app.ui.theme.LegadoTheme.composeEngine
import io.legado.app.ui.theme.ThemeResolver
import androidx.compose.material3.LinearProgressIndicator
import top.yukonga.miuix.kmp.basic.LinearProgressIndicator as MiuixLinearProgressIndicator
@Composable
fun AppLinearProgressIndicator(
modifier: Modifier = Modifier,
progress: Float? = null,
) {
if (ThemeResolver.isMiuixEngine(composeEngine)) {
MiuixLinearProgressIndicator(
modifier = modifier,
progress = progress
)
} else {
if (progress != null) {
LinearProgressIndicator(
progress = { progress },
modifier = modifier
)
} else {
LinearProgressIndicator(
modifier = modifier
)
}
}
}