feat: 部分设置页面的 MD3E 适配

This commit is contained in:
Super12138 2025-11-09 22:22:24 +08:00
parent a7311bfddf
commit 3b84fcd1f0
20 changed files with 115 additions and 69 deletions

View file

@ -37,7 +37,7 @@ android {
applicationId = "cn.super12138.todo" applicationId = "cn.super12138.todo"
minSdk = 24 minSdk = 24
targetSdk = 36 targetSdk = 36
versionCode = 884 versionCode = 886
versionName = "2.3.3" versionName = "2.3.3"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

View file

@ -6,7 +6,12 @@ object TodoDefaults {
/** /**
* 屏幕左右两边预留边距防止内容全部贴边显示过丑 * 屏幕左右两边预留边距防止内容全部贴边显示过丑
*/ */
val screenPadding = 16.dp val screenHorizontalPadding = 16.dp
/**
* 屏幕上下预留边距防止内容全部贴边显示过丑
*/
val screenVerticalPadding = 16.dp
/** /**
* 待办卡片默认高度 * 待办卡片默认高度

View file

@ -7,10 +7,13 @@ import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.FabPosition import androidx.compose.material3.FabPosition
import androidx.compose.material3.FilledIconButton
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.LargeTopAppBar
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.ScaffoldDefaults import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.Text import androidx.compose.material3.Text
@ -33,7 +36,7 @@ import cn.super12138.todo.utils.VibrationUtils
* @param onBack 当返回按钮被按下时的操作 * @param onBack 当返回按钮被按下时的操作
* @param contentWindowInsets 内容边距通常用于将内容和系统状态栏等隔开可以使用 `WindowInsets.safeContent` * @param contentWindowInsets 内容边距通常用于将内容和系统状态栏等隔开可以使用 `WindowInsets.safeContent`
*/ */
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
fun LargeTopAppBarScaffold( fun LargeTopAppBarScaffold(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
@ -56,7 +59,9 @@ fun LargeTopAppBarScaffold(
) )
}, },
navigationIcon = { navigationIcon = {
IconButton( FilledIconButton(
colors = IconButtonDefaults.filledIconButtonColors(containerColor = MaterialTheme.colorScheme.surfaceContainerHigh),
shapes = IconButtonDefaults.shapes(),
onClick = { onClick = {
VibrationUtils.performHapticFeedback(view) VibrationUtils.performHapticFeedback(view)
onBack() onBack()

View file

@ -114,7 +114,7 @@ fun CrashPage(
Column( Column(
modifier = Modifier modifier = Modifier
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenPadding) .padding(horizontal = TodoDefaults.screenHorizontalPadding)
.fillMaxSize() .fillMaxSize()
.verticalScroll(scrollState) .verticalScroll(scrollState)
) { ) {

View file

@ -169,7 +169,7 @@ fun TodoEditorPage(
verticalArrangement = Arrangement.spacedBy(5.dp), verticalArrangement = Arrangement.spacedBy(5.dp),
modifier = Modifier modifier = Modifier
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenPadding) .padding(horizontal = TodoDefaults.screenHorizontalPadding)
.fillMaxSize() .fillMaxSize()
) { ) {
item { item {

View file

@ -41,9 +41,9 @@ fun ManagerFragment(
LazyColumn( LazyColumn(
state = state, state = state,
contentPadding = PaddingValues( contentPadding = PaddingValues(
start = TodoDefaults.screenPadding, start = TodoDefaults.screenHorizontalPadding,
bottom = TodoDefaults.toDoCardHeight / 2, bottom = TodoDefaults.toDoCardHeight / 2,
end = TodoDefaults.screenPadding end = TodoDefaults.screenHorizontalPadding
), ),
/*modifier = Modifier /*modifier = Modifier
.clip( .clip(

View file

@ -2,9 +2,11 @@ package cn.super12138.todo.ui.pages.settings
import android.widget.Toast import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Balance import androidx.compose.material.icons.outlined.Balance
import androidx.compose.material.icons.outlined.DeveloperMode import androidx.compose.material.icons.outlined.DeveloperMode
@ -12,7 +14,6 @@ import androidx.compose.material.icons.outlined.Numbers
import androidx.compose.material.icons.outlined.Person4 import androidx.compose.material.icons.outlined.Person4
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@ -22,7 +23,6 @@ import androidx.compose.runtime.mutableLongStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
@ -33,6 +33,7 @@ import cn.super12138.todo.constants.Constants
import cn.super12138.todo.ui.TodoDefaults import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.icons.GitHubIcon import cn.super12138.todo.ui.icons.GitHubIcon
import cn.super12138.todo.ui.pages.settings.components.Settings
import cn.super12138.todo.ui.pages.settings.components.SettingsItem import cn.super12138.todo.ui.pages.settings.components.SettingsItem
import cn.super12138.todo.utils.SystemUtils import cn.super12138.todo.utils.SystemUtils
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -56,15 +57,15 @@ fun SettingsAbout(
val context = LocalContext.current val context = LocalContext.current
val uriHandler = LocalUriHandler.current val uriHandler = LocalUriHandler.current
LazyColumn( Column(
verticalArrangement = Arrangement.spacedBy(2.dp), verticalArrangement = Arrangement.spacedBy(2.dp),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenPadding) .padding(horizontal = TodoDefaults.screenHorizontalPadding)
.clip(MaterialTheme.shapes.extraExtraLarge) .verticalScroll(rememberScrollState())
) { ) {
item { Settings {
var clickCount by remember { mutableIntStateOf(0) } var clickCount by remember { mutableIntStateOf(0) }
var lastClickTime by remember { mutableLongStateOf(0L) } var lastClickTime by remember { mutableLongStateOf(0L) }
@ -96,32 +97,24 @@ fun SettingsAbout(
} }
} }
) )
}
item {
SettingsItem( SettingsItem(
leadingIcon = Icons.Outlined.Person4, leadingIcon = Icons.Outlined.Person4,
title = stringResource(R.string.pref_developer), title = stringResource(R.string.pref_developer),
description = stringResource(R.string.developer_name), description = stringResource(R.string.developer_name),
onClick = { uriHandler.openUri(Constants.DEVELOPER_GITHUB) } onClick = { uriHandler.openUri(Constants.DEVELOPER_GITHUB) }
) )
}
item {
SettingsItem( SettingsItem(
leadingIcon = GitHubIcon, leadingIcon = GitHubIcon,
title = stringResource(R.string.pref_view_on_github), title = stringResource(R.string.pref_view_on_github),
description = stringResource(R.string.pref_view_on_github_desc), description = stringResource(R.string.pref_view_on_github_desc),
onClick = { uriHandler.openUri(Constants.GITHUB_REPO) } onClick = { uriHandler.openUri(Constants.GITHUB_REPO) }
) )
}
item {
SettingsItem( SettingsItem(
leadingIcon = Icons.Outlined.Balance, leadingIcon = Icons.Outlined.Balance,
title = stringResource(R.string.pref_licence), title = stringResource(R.string.pref_licence),
description = stringResource(R.string.pref_licence_desc), description = stringResource(R.string.pref_licence_desc),
onClick = toLicencePage onClick = toLicencePage
) )
}
item {
SettingsItem( SettingsItem(
leadingIcon = Icons.Outlined.DeveloperMode, leadingIcon = Icons.Outlined.DeveloperMode,
title = stringResource(R.string.pref_developer_options), title = stringResource(R.string.pref_developer_options),

View file

@ -1,16 +1,20 @@
package cn.super12138.todo.ui.pages.settings package cn.super12138.todo.ui.pages.settings
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.pages.settings.components.licence.LicenceList import cn.super12138.todo.ui.pages.settings.components.licence.LicenceList
import com.mikepenz.aboutlibraries.ui.compose.android.produceLibraries import com.mikepenz.aboutlibraries.ui.compose.android.produceLibraries
@ -29,10 +33,17 @@ fun SettingsAboutLicence(
modifier = modifier modifier = modifier
) { innerPadding -> ) { innerPadding ->
val libraries by produceLibraries(R.raw.aboutlibraries) val libraries by produceLibraries(R.raw.aboutlibraries)
Column( Box(
modifier = Modifier modifier = Modifier
.padding(innerPadding)
.fillMaxSize() .fillMaxSize()
.padding(innerPadding)
.padding(horizontal = TodoDefaults.screenHorizontalPadding)
.clip(
MaterialTheme.shapes.extraLarge.copy(
bottomEnd = CornerSize(0f),
bottomStart = CornerSize(0f)
)
)
) { ) {
val listState = rememberLazyListState() val listState = rememberLazyListState()
LicenceList( LicenceList(

View file

@ -19,7 +19,9 @@ import androidx.compose.ui.res.stringResource
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.constants.Constants import cn.super12138.todo.constants.Constants
import cn.super12138.todo.logic.datastore.DataStoreManager import cn.super12138.todo.logic.datastore.DataStoreManager
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.pages.settings.components.Settings
import cn.super12138.todo.ui.pages.settings.components.SwitchSettingsItem import cn.super12138.todo.ui.pages.settings.components.SwitchSettingsItem
import cn.super12138.todo.ui.pages.settings.components.appearance.contrast.ContrastPicker import cn.super12138.todo.ui.pages.settings.components.appearance.contrast.ContrastPicker
import cn.super12138.todo.ui.pages.settings.components.appearance.darkmode.DarkModePicker import cn.super12138.todo.ui.pages.settings.components.appearance.darkmode.DarkModePicker
@ -52,33 +54,36 @@ fun SettingsAppearance(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenHorizontalPadding)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
SwitchSettingsItem( Settings {
checked = dynamicColor, SwitchSettingsItem(
leadingIcon = Icons.Outlined.AutoAwesome, checked = dynamicColor,
title = stringResource(R.string.pref_appearance_dynamic_color), leadingIcon = Icons.Outlined.AutoAwesome,
description = stringResource(R.string.pref_appearance_dynamic_color_desc), title = stringResource(R.string.pref_appearance_dynamic_color),
onCheckedChange = { scope.launch { DataStoreManager.setDynamicColor(it) } }, description = stringResource(R.string.pref_appearance_dynamic_color_desc),
) onCheckedChange = { scope.launch { DataStoreManager.setDynamicColor(it) } },
)
DarkModePicker( DarkModePicker(
currentDarkMode = { DarkMode.fromId(darkMode) }, currentDarkMode = { DarkMode.fromId(darkMode) },
onDarkModeChange = { scope.launch { DataStoreManager.setDarkMode(it.id) } } onDarkModeChange = { scope.launch { DataStoreManager.setDarkMode(it.id) } }
) )
PalettePicker( PalettePicker(
currentPalette = { PaletteStyle.fromId(paletteStyle) }, currentPalette = { PaletteStyle.fromId(paletteStyle) },
onPaletteChange = { scope.launch { DataStoreManager.setPaletteStyle(it.id) } }, onPaletteChange = { scope.launch { DataStoreManager.setPaletteStyle(it.id) } },
isDynamicColor = dynamicColor, isDynamicColor = dynamicColor,
isDarkMode = DarkMode.fromId(darkMode), isDarkMode = DarkMode.fromId(darkMode),
contrastLevel = ContrastLevel.fromFloat(contrastLevel) contrastLevel = ContrastLevel.fromFloat(contrastLevel)
) )
ContrastPicker( ContrastPicker(
currentContrast = ContrastLevel.fromFloat(contrastLevel), currentContrast = ContrastLevel.fromFloat(contrastLevel),
onContrastChange = { scope.launch { DataStoreManager.setContrastLevel(it.value) } } onContrastChange = { scope.launch { DataStoreManager.setContrastLevel(it.value) } }
) )
}
} }
} }
} }

View file

@ -120,7 +120,7 @@ fun SettingsData(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenPadding) .padding(horizontal = TodoDefaults.screenHorizontalPadding)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
SettingsCategory(stringResource(R.string.pref_category_data_management)) SettingsCategory(stringResource(R.string.pref_category_data_management))

View file

@ -1,8 +1,10 @@
package cn.super12138.todo.ui.pages.settings package cn.super12138.todo.ui.pages.settings
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Padding import androidx.compose.material.icons.outlined.Padding
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
@ -12,7 +14,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.ui.TodoDefaults
import cn.super12138.todo.ui.components.LargeTopAppBarScaffold import cn.super12138.todo.ui.components.LargeTopAppBarScaffold
import cn.super12138.todo.ui.pages.settings.components.Settings
import cn.super12138.todo.ui.pages.settings.components.SettingsItem import cn.super12138.todo.ui.pages.settings.components.SettingsItem
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@ -29,12 +33,14 @@ fun SettingsDeveloperOptions(
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
) { innerPadding -> ) { innerPadding ->
LazyColumn( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenHorizontalPadding,)
.verticalScroll(rememberScrollState())
) { ) {
item { Settings {
SettingsItem( SettingsItem(
leadingIcon = Icons.Outlined.Padding, leadingIcon = Icons.Outlined.Padding,
title = stringResource(R.string.pref_padding), title = stringResource(R.string.pref_padding),

View file

@ -65,7 +65,7 @@ fun SettingsInterface(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenPadding) .padding(horizontal = TodoDefaults.screenHorizontalPadding)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
SettingsCategory(stringResource(R.string.pref_category_todo_list)) SettingsCategory(stringResource(R.string.pref_category_todo_list))

View file

@ -44,7 +44,7 @@ fun SettingsMain(
Modifier Modifier
.fillMaxSize() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(horizontal = TodoDefaults.screenPadding) .padding(horizontal = TodoDefaults.screenHorizontalPadding)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
Settings { Settings {

View file

@ -1,6 +1,7 @@
package cn.super12138.todo.ui.pages.settings.components package cn.super12138.todo.ui.pages.settings.components
import androidx.compose.foundation.ScrollState import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -40,7 +41,8 @@ fun RowSettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.large, shape: Shape = MaterialTheme.shapes.small,
background: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top, verticalAlignment: Alignment.Vertical = Alignment.Top,
scrollState: ScrollState = rememberScrollState(), scrollState: ScrollState = rememberScrollState(),
@ -54,6 +56,7 @@ fun RowSettingsItem(
description = description, description = description,
trailingContent = trailingContent, trailingContent = trailingContent,
shape = shape, shape = shape,
background = background,
modifier = modifier modifier = modifier
) { ) {
Row( Row(
@ -91,7 +94,8 @@ fun LazyRowSettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.large, shape: Shape = MaterialTheme.shapes.small,
background: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top, verticalAlignment: Alignment.Vertical = Alignment.Top,
fadedEdgeWidth: Dp, fadedEdgeWidth: Dp,
@ -104,6 +108,7 @@ fun LazyRowSettingsItem(
description = description, description = description,
trailingContent = trailingContent, trailingContent = trailingContent,
shape = shape, shape = shape,
background = background,
modifier = modifier modifier = modifier
) { ) {
LazyRow( LazyRow(
@ -140,7 +145,8 @@ fun MoreContentSettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.large, shape: Shape = MaterialTheme.shapes.small,
background: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
Column( Column(
@ -148,6 +154,7 @@ fun MoreContentSettingsItem(
.fillMaxWidth() .fillMaxWidth()
.wrapContentHeight() .wrapContentHeight()
.clip(shape) .clip(shape)
.background(background)
.padding( .padding(
horizontal = TodoDefaults.settingsItemHorizontalPadding, horizontal = TodoDefaults.settingsItemHorizontalPadding,
vertical = TodoDefaults.settingsItemVerticalPadding vertical = TodoDefaults.settingsItemVerticalPadding

View file

@ -21,7 +21,8 @@ fun SettingsCategory(
.padding( .padding(
top = TodoDefaults.settingsItemVerticalPadding / 2, top = TodoDefaults.settingsItemVerticalPadding / 2,
start = TodoDefaults.settingsItemHorizontalPadding, start = TodoDefaults.settingsItemHorizontalPadding,
end = TodoDefaults.settingsItemHorizontalPadding end = TodoDefaults.settingsItemHorizontalPadding,
bottom = TodoDefaults.settingsItemVerticalPadding / 4,
) )
) { ) {
Text( Text(

View file

@ -3,12 +3,15 @@ package cn.super12138.todo.ui.pages.settings.components
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cn.super12138.todo.ui.TodoDefaults
@OptIn(ExperimentalMaterial3ExpressiveApi::class) @OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable @Composable
@ -18,7 +21,10 @@ fun Settings(
) { ) {
Column( Column(
verticalArrangement = Arrangement.spacedBy(2.dp), verticalArrangement = Arrangement.spacedBy(2.dp),
modifier = modifier.clip(MaterialTheme.shapes.extraExtraLarge), modifier = modifier
.padding(vertical = TodoDefaults.screenVerticalPadding).clip(
shape = MaterialTheme.shapes.extraLarge
),
content = content content = content
) )
} }

View file

@ -81,7 +81,7 @@ fun RadioItem(
}, },
role = Role.RadioButton role = Role.RadioButton
) )
.padding(horizontal = TodoDefaults.screenPadding), .padding(horizontal = TodoDefaults.screenHorizontalPadding),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
RadioButton( RadioButton(

View file

@ -51,7 +51,7 @@ fun SettingsItem(
title: String, title: String,
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
background: Color = MaterialTheme.colorScheme.surfaceContainerHighest, background: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
enableClick: Boolean = true, enableClick: Boolean = true,
onClick: () -> Unit = {} onClick: () -> Unit = {}
) { ) {
@ -85,7 +85,7 @@ fun SettingsItem(
description: String? = null, description: String? = null,
trailingContent: (@Composable () -> Unit)? = null, trailingContent: (@Composable () -> Unit)? = null,
shape: Shape = MaterialTheme.shapes.small, shape: Shape = MaterialTheme.shapes.small,
background: Color = MaterialTheme.colorScheme.surfaceContainerHighest, background: Color = MaterialTheme.colorScheme.surfaceContainerHigh,
enableClick: Boolean = true, enableClick: Boolean = true,
onClick: () -> Unit = {}, onClick: () -> Unit = {},
) { ) {

View file

@ -1,5 +1,6 @@
package cn.super12138.todo.ui.pages.settings.components.licence package cn.super12138.todo.ui.pages.settings.components.licence
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@ -34,11 +35,13 @@ fun LicenceItem(
showAuthor: Boolean = true, showAuthor: Boolean = true,
showVersion: Boolean = true, showVersion: Boolean = true,
showLicenseBadges: Boolean = true, showLicenseBadges: Boolean = true,
colors: LibraryColors = LibraryDefaults.libraryColors(), colors: LibraryColors = LibraryDefaults.libraryColors(
libraryBackgroundColor = MaterialTheme.colorScheme.surfaceContainerHigh
),
padding: LibraryPadding = LibraryDefaults.libraryPadding(), padding: LibraryPadding = LibraryDefaults.libraryPadding(),
libraryPadding: LibraryPadding = LibraryDefaults.libraryPadding(), libraryPadding: LibraryPadding = LibraryDefaults.libraryPadding(),
typography: Typography = MaterialTheme.typography, typography: Typography = MaterialTheme.typography,
shape: Shape = MaterialTheme.shapes.large, shape: Shape = MaterialTheme.shapes.small,
onClick: () -> Unit onClick: () -> Unit
) { ) {
Column( Column(
@ -46,6 +49,7 @@ fun LicenceItem(
.fillMaxWidth() .fillMaxWidth()
.clip(shape) .clip(shape)
.clickable { onClick.invoke() } .clickable { onClick.invoke() }
.background(colors.libraryBackgroundColor)
.padding(libraryPadding.contentPadding) .padding(libraryPadding.contentPadding)
) { ) {
Row( Row(
@ -64,7 +68,7 @@ fun LicenceItem(
val version = library.artifactVersion val version = library.artifactVersion
if (version != null && showVersion) { if (version != null && showVersion) {
Text( Text(
version, text = version,
modifier = Modifier.padding(padding.versionPadding.contentPadding), modifier = Modifier.padding(padding.versionPadding.contentPadding),
style = typography.bodyMedium, style = typography.bodyMedium,
textAlign = TextAlign.Center textAlign = TextAlign.Center

View file

@ -1,5 +1,6 @@
package cn.super12138.todo.ui.pages.settings.components.licence package cn.super12138.todo.ui.pages.settings.components.licence
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyListState
@ -21,6 +22,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.ui.components.BasicDialog import cn.super12138.todo.ui.components.BasicDialog
import cn.super12138.todo.ui.components.LazyColumnCustomScrollBar import cn.super12138.todo.ui.components.LazyColumnCustomScrollBar
@ -44,9 +46,10 @@ fun LicenceList(
) { ) {
LazyColumn( LazyColumn(
state = state, state = state,
verticalArrangement = Arrangement.spacedBy(2.dp),
modifier = modifier modifier = modifier
) { ) {
items(libraries?.libraries ?: listOf()) { library -> items(items = libraries?.libraries ?: listOf(), key = { it.artifactId }) { library ->
var openDialog by rememberSaveable { mutableStateOf(false) } var openDialog by rememberSaveable { mutableStateOf(false) }
LicenceItem( LicenceItem(