控件优化

This commit is contained in:
HapeLee committed 2026-05-15 01:54:31 +08:00
1 parent 177045885c
commit 5cc126cf5b
15 files changed
+68 -85

No files matched your search

+2 -1
View File
@@ -72,7 +72,8 @@
"Bash(Select-Object -Last 20)", "Bash(Select-Object -Last 20)",
"WebFetch(domain:compose-miuix-ui.github.io)", "WebFetch(domain:compose-miuix-ui.github.io)",
"Bash(Select-Object -Last 60)", "Bash(Select-Object -Last 60)",
"PowerShell(.\\\\gradlew.bat :app:compileAppDebugKotlin 2>&1 | Select-Object -Last 60)" "PowerShell(.\\\\gradlew.bat :app:compileAppDebugKotlin 2>&1 | Select-Object -Last 60)",
"Bash(New-Item *)"
] ]
} }
} }
@@ -46,7 +46,7 @@ import io.legado.app.R
import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.theme.adaptiveContentPadding
import io.legado.app.ui.theme.adaptiveHorizontalPadding import io.legado.app.ui.theme.adaptiveHorizontalPadding
import io.legado.app.ui.widget.components.AppLinearProgressIndicator import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import io.legado.app.ui.widget.components.AppScaffold import io.legado.app.ui.widget.components.AppScaffold
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
import io.legado.app.ui.widget.components.button.SmallTonalIconButton import io.legado.app.ui.widget.components.button.SmallTonalIconButton
@@ -74,7 +74,7 @@ import io.legado.app.ui.book.search.ScopeSelectSheet
import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity
import io.legado.app.ui.book.source.manage.BookSourceActivity import io.legado.app.ui.book.source.manage.BookSourceActivity
import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.widget.components.AppLinearProgressIndicator import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.AppTextField
import io.legado.app.ui.widget.components.EmptyMessage import io.legado.app.ui.widget.components.EmptyMessage
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -87,7 +87,7 @@ import io.legado.app.ui.book.info.ChangeSourceSheet
import io.legado.app.ui.book.info.GroupSelectSheet import io.legado.app.ui.book.info.GroupSelectSheet
import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.theme.adaptiveContentPadding
import io.legado.app.ui.widget.components.AppLinearProgressIndicator import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.AppTextField
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
import io.legado.app.ui.widget.components.button.SmallTonalIconButton import io.legado.app.ui.widget.components.button.SmallTonalIconButton
@@ -331,13 +331,10 @@ fun SearchScreen(
} else { } else {
viewModel.onIntent(SearchIntent.LoadMore) viewModel.onIntent(SearchIntent.LoadMore)
} }
} },
) { icon = if (state.isSearching) Icons.Default.Stop else Icons.Default.PlayArrow,
AppIcon( tooltipText = if (state.isSearching) stringResource(R.string.stop) else stringResource(R.string.start)
imageVector = if (state.isSearching) Icons.Default.Stop else Icons.Default.PlayArrow, )
contentDescription = if (state.isSearching) stringResource(R.string.stop) else stringResource(R.string.start),
)
}
} }
} }
) { paddingValues -> ) { paddingValues ->
@@ -35,7 +35,6 @@ import androidx.compose.ui.unit.dp
import io.legado.app.R import io.legado.app.R
import io.legado.app.data.entities.DictRule import io.legado.app.data.entities.DictRule
import io.legado.app.ui.widget.components.AppFloatingActionButton import io.legado.app.ui.widget.components.AppFloatingActionButton
import io.legado.app.ui.widget.components.icon.AppIcon
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
import io.legado.app.ui.widget.components.text.AppText import io.legado.app.ui.widget.components.text.AppText
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -161,10 +160,9 @@ fun DictRuleEditSheet(
}, },
modifier = Modifier modifier = Modifier
.align(Alignment.BottomEnd) .align(Alignment.BottomEnd)
.padding(16.dp) .padding(16.dp),
) { icon = Icons.Default.Save
AppIcon(Icons.Default.Save, contentDescription = "Save") )
}
} }
} }
} }
@@ -19,8 +19,6 @@ import androidx.compose.material.icons.filled.FileOpen
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import io.legado.app.ui.widget.components.AppFloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.LoadingIndicator
import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
@@ -52,6 +50,7 @@ import io.legado.app.data.entities.ReplaceRule
import io.legado.app.ui.theme.adaptiveContentPadding import io.legado.app.ui.theme.adaptiveContentPadding
import io.legado.app.ui.theme.adaptiveHorizontalPadding import io.legado.app.ui.theme.adaptiveHorizontalPadding
import io.legado.app.ui.widget.components.ActionItem import io.legado.app.ui.widget.components.ActionItem
import io.legado.app.ui.widget.components.AppFloatingActionButton
import io.legado.app.ui.widget.components.DraggableSelectionHandler import io.legado.app.ui.widget.components.DraggableSelectionHandler
import io.legado.app.ui.widget.components.GroupManageBottomSheet import io.legado.app.ui.widget.components.GroupManageBottomSheet
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -335,10 +334,9 @@ fun ReplaceRuleScreen(
onClick = { onClick = {
onNavigateToEdit(ReplaceEditRoute(id = -1)) onNavigateToEdit(ReplaceEditRoute(id = -1))
}, },
tooltipText = "Localized description" tooltipText = stringResource(R.string.add),
) { icon = Icons.Default.Add
AppIcon(Icons.Default.Add, contentDescription = "Add Rule") )
}
}, },
snackbarHostState = snackbarHostState, snackbarHostState = snackbarHostState,
dropDownMenuContent = { dismiss -> dropDownMenuContent = { dismiss ->
@@ -456,4 +454,3 @@ fun ReplaceRuleScreen(
} }
} }
} }
@@ -42,6 +42,8 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuAnchorType
import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.ui.res.stringResource
import io.legado.app.R
import io.legado.app.ui.widget.components.AppFloatingActionButton import io.legado.app.ui.widget.components.AppFloatingActionButton
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
@@ -162,10 +164,9 @@ fun ReplaceEditScreen(
alignment = Alignment.BottomEnd, alignment = Alignment.BottomEnd,
), ),
onClick = { viewModel.save(onSaveSuccess) }, onClick = { viewModel.save(onSaveSuccess) },
tooltipText = "添加" tooltipText = stringResource(R.string.action_save),
) { icon = Icons.Default.Save
AppIcon(Icons.Default.Save, contentDescription = "保存") )
}
}, contentWindowInsets = WindowInsets(0, 0, 0, 0) }, contentWindowInsets = WindowInsets(0, 0, 0, 0)
) { innerPadding -> ) { innerPadding ->
Box( Box(
@@ -45,6 +45,7 @@ import io.legado.app.ui.association.ImportBookSourceDialog
import io.legado.app.ui.association.ImportReplaceRuleDialog import io.legado.app.ui.association.ImportReplaceRuleDialog
import io.legado.app.ui.association.ImportRssSourceDialog import io.legado.app.ui.association.ImportRssSourceDialog
import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.theme.adaptiveContentPadding
import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.AppTextField
import io.legado.app.ui.widget.components.EmptyMessage import io.legado.app.ui.widget.components.EmptyMessage
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
@@ -107,10 +108,9 @@ fun RuleSubScreen(
onClick = { onClick = {
showEditDialog = RuleSub(customOrder = state.items.size + 1) showEditDialog = RuleSub(customOrder = state.items.size + 1)
}, },
tooltipText = "Localized description" tooltipText = stringResource(R.string.add),
) { icon = Icons.Default.Add
Icon(Icons.Default.Add, contentDescription = "Add Rule") )
}
} }
) { paddingValues -> ) { paddingValues ->
if (state.items.isEmpty()) { if (state.items.isEmpty()) {
@@ -129,7 +129,10 @@ fun RuleSubScreen(
val typeArray = stringArrayResource(R.array.rule_type) val typeArray = stringArrayResource(R.array.rule_type)
LazyColumn( LazyColumn(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
contentPadding = paddingValues, contentPadding = adaptiveContentPadding(
top = paddingValues.calculateTopPadding(),
bottom = paddingValues.calculateBottomPadding() + 120.dp
),
verticalArrangement = Arrangement.spacedBy(8.dp) verticalArrangement = Arrangement.spacedBy(8.dp)
) { ) {
items(state.items, key = { it.id }) { ruleSub -> items(state.items, key = { it.id }) { ruleSub ->
@@ -2,6 +2,7 @@ package io.legado.app.ui.widget.components
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.PlainTooltip import androidx.compose.material3.PlainTooltip
import androidx.compose.material3.TooltipAnchorPosition import androidx.compose.material3.TooltipAnchorPosition
import androidx.compose.material3.TooltipBox import androidx.compose.material3.TooltipBox
@@ -10,10 +11,13 @@ import androidx.compose.material3.rememberTooltipState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
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.graphics.vector.ImageVector
import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.theme.ThemeResolver import io.legado.app.ui.theme.ThemeResolver
import io.legado.app.ui.widget.components.icon.AppIcon
import io.legado.app.ui.widget.components.text.AppText import io.legado.app.ui.widget.components.text.AppText
import top.yukonga.miuix.kmp.basic.FloatingActionButton as MiuixFloatingActionButton import top.yukonga.miuix.kmp.basic.FloatingActionButton as MiuixFloatingActionButton
import top.yukonga.miuix.kmp.basic.Icon as MiuixIcon
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
@@ -21,17 +25,37 @@ fun AppFloatingActionButton(
onClick: () -> Unit, onClick: () -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
tooltipText: String? = null, tooltipText: String? = null,
icon: ImageVector? = null,
containerColor: Color = LegadoTheme.colorScheme.primaryContainer, containerColor: Color = LegadoTheme.colorScheme.primaryContainer,
contentColor: Color = LegadoTheme.colorScheme.onPrimaryContainer, contentColor: Color = LegadoTheme.colorScheme.onPrimaryContainer,
content: @Composable () -> Unit content: (@Composable () -> Unit)? = null
) { ) {
val isMiuix = ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine) val isMiuix = ThemeResolver.isMiuixEngine(LegadoTheme.composeEngine)
val fabContent: @Composable () -> Unit = {
if (icon != null) {
if (isMiuix){
MiuixIcon(
imageVector = icon,
contentDescription = tooltipText,
tint = Color.White
)
} else {
Icon(
imageVector = icon,
contentDescription = tooltipText
)
}
} else {
content?.invoke()
}
}
if (isMiuix) { if (isMiuix) {
MiuixFloatingActionButton( MiuixFloatingActionButton(
onClick = onClick, onClick = onClick,
modifier = modifier, modifier = modifier,
content = content content = fabContent
) )
} else { } else {
if (tooltipText != null) { if (tooltipText != null) {
@@ -47,7 +71,7 @@ fun AppFloatingActionButton(
modifier = modifier, modifier = modifier,
containerColor = containerColor, containerColor = containerColor,
contentColor = contentColor, contentColor = contentColor,
content = content content = fabContent
) )
} }
} else { } else {
@@ -56,7 +80,7 @@ fun AppFloatingActionButton(
modifier = modifier, modifier = modifier,
containerColor = containerColor, containerColor = containerColor,
contentColor = contentColor, contentColor = contentColor,
content = content content = fabContent
) )
} }
} }
@@ -1,34 +0,0 @@
package io.legado.app.ui.widget.components
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
// 这里建议使用 as 关键字为两个库的控件起别名,避免同名冲突
import androidx.compose.material3.LinearProgressIndicator
// 请替换为实际的 MIUIX 控件包名
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
)
}
}
}
@@ -14,7 +14,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import io.legado.app.ui.theme.LegadoTheme import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.widget.components.AppLinearProgressIndicator import io.legado.app.ui.widget.components.progressIndicator.AppLinearProgressIndicator
import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.card.TextCard
@OptIn(ExperimentalSharedTransitionApi::class) @OptIn(ExperimentalSharedTransitionApi::class)
@@ -16,7 +16,6 @@ import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FloatingToolbarDefaults.ScreenOffset import androidx.compose.material3.FloatingToolbarDefaults.ScreenOffset
import androidx.compose.material3.Icon
import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.animateFloatingActionButton import androidx.compose.material3.animateFloatingActionButton
@@ -64,10 +63,9 @@ fun <T> ListScaffold(
visible = state.selectedIds.isEmpty(), visible = state.selectedIds.isEmpty(),
alignment = Alignment.BottomEnd, alignment = Alignment.BottomEnd,
), ),
tooltipText = "添加" tooltipText = "添加",
) { icon = Icons.Default.Add
Icon(Icons.Default.Add, contentDescription = "Add") )
}
} }
}, },
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() }, snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
@@ -38,7 +38,6 @@ import io.legado.app.ui.theme.LegadoTheme
import io.legado.app.ui.widget.components.AppFloatingActionButton import io.legado.app.ui.widget.components.AppFloatingActionButton
import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.AppTextField
import io.legado.app.ui.widget.components.button.MediumIconButton import io.legado.app.ui.widget.components.button.MediumIconButton
import io.legado.app.ui.widget.components.icon.AppIcon
import io.legado.app.ui.widget.components.menuItem.RoundDropdownMenu 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.menuItem.RoundDropdownMenuItem
import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet import io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet
@@ -164,10 +163,9 @@ fun <T> RuleEditSheet(
onClick = { onSave(getCurrentEntity()) }, onClick = { onSave(getCurrentEntity()) },
modifier = Modifier modifier = Modifier
.align(Alignment.BottomEnd) .align(Alignment.BottomEnd)
.padding(16.dp) .padding(16.dp),
) { icon = Icons.Default.Save
AppIcon(Icons.Default.Save, contentDescription = "Save") )
}
} }
} }
} }
@@ -29,6 +29,7 @@ import io.legado.app.ui.widget.components.ActionItem
import io.legado.app.ui.widget.components.AppFloatingActionButton import io.legado.app.ui.widget.components.AppFloatingActionButton
import io.legado.app.ui.widget.components.SelectionActions import io.legado.app.ui.widget.components.SelectionActions
import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.alert.AppAlertDialog
import io.legado.app.ui.widget.components.icon.AppIcon
import io.legado.app.ui.widget.components.list.ListScaffold import io.legado.app.ui.widget.components.list.ListScaffold
import io.legado.app.ui.widget.components.list.ListUiState import io.legado.app.ui.widget.components.list.ListUiState
import io.legado.app.ui.widget.components.text.AppText import io.legado.app.ui.widget.components.text.AppText
@@ -61,10 +62,9 @@ fun <T> RuleListScaffold(
visible = state.selectedIds.isEmpty(), visible = state.selectedIds.isEmpty(),
alignment = Alignment.BottomEnd, alignment = Alignment.BottomEnd,
), ),
tooltipText = "添加" tooltipText = "添加",
) { icon = Icons.Default.Add
Icon(Icons.Default.Add, contentDescription = "Add") )
}
} }
}, },
snackbarHostState: SnackbarHostState, snackbarHostState: SnackbarHostState,