feat: 部分设置页面的 MD3E 适配
This commit is contained in:
parent
a7311bfddf
commit
3b84fcd1f0
20 changed files with 115 additions and 69 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,12 @@ object TodoDefaults {
|
||||||
/**
|
/**
|
||||||
* 屏幕左右两边预留边距(防止内容全部贴边显示过丑)
|
* 屏幕左右两边预留边距(防止内容全部贴边显示过丑)
|
||||||
*/
|
*/
|
||||||
val screenPadding = 16.dp
|
val screenHorizontalPadding = 16.dp
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 屏幕上下预留边距(防止内容全部贴边显示过丑)
|
||||||
|
*/
|
||||||
|
val screenVerticalPadding = 16.dp
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 待办卡片默认高度
|
* 待办卡片默认高度
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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) } }
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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 = {},
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue