Move BaseSettingsContent to separate file

pull/3197/head
Alex Baker 12 months ago
parent be5a4dfc01
commit d9a0a047d5

@ -1,30 +1,16 @@
package org.tasks.activities
import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.compose.Constants
import org.tasks.compose.DeleteButton
import org.tasks.compose.IconPickerActivity.Companion.launchIconPicker
import org.tasks.compose.IconPickerActivity.Companion.registerForIconPickerResult
import org.tasks.compose.settings.ProgressBar
import org.tasks.compose.settings.PromptAction
import org.tasks.compose.settings.SelectColorRow
import org.tasks.compose.settings.SelectIconRow
import org.tasks.compose.settings.SettingsSurface
import org.tasks.compose.settings.TitleInput
import org.tasks.compose.settings.Toolbar
import org.tasks.compose.settings.BaseSettingsContent
import org.tasks.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
import org.tasks.dialogs.ColorPickerAdapter.Palette
@ -125,42 +111,33 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), Co
protected fun BaseSettingsContent(
title: String = toolbarTitle ?: "",
requestKeyboard: Boolean = isNew,
optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton { promptDelete() } },
optionButton: @Composable () -> Unit = {
if (!isNew) DeleteButton(toolbarTitle ?: "") { promptDelete() }
},
extensionContent: @Composable ColumnScope.() -> Unit = {}
) {
SettingsSurface {
Toolbar(
title = title,
save = { lifecycleScope.launch { save() } },
optionButton = optionButton
)
ProgressBar(showProgress)
TitleInput(
text = textState, error = errorState, requestKeyboard = requestKeyboard,
modifier = Modifier.padding(horizontal = Constants.KEYLINE_FIRST)
)
Column(modifier = Modifier.fillMaxWidth()) {
SelectColorRow(
color = colorState,
selectColor = { showThemePicker() },
clearColor = { clearColor() })
SelectIconRow(
icon = selectedIcon.value ?: defaultIcon,
selectIcon = { showIconPicker() })
extensionContent()
PromptAction(
showDialog = promptDelete,
title = stringResource(id = R.string.delete_tag_confirmation, title),
onAction = { lifecycleScope.launch { delete() } }
)
PromptAction(
showDialog = promptDiscard,
title = stringResource(id = R.string.discard_changes),
onAction = { lifecycleScope.launch { finish() } }
)
}
}
BaseSettingsContent(
title = title,
color = colorState.value,
icon = selectedIcon.value ?: defaultIcon,
text = textState.value,
error = errorState.value,
requestKeyboard = requestKeyboard,
promptDiscard = promptDiscard.value,
showProgress = showProgress.value,
dismissDiscardPrompt = { promptDiscard.value = false },
setText = {
textState.value = it
errorState.value = ""
},
save = { lifecycleScope.launch { save() } },
pickColor = { showThemePicker() },
clearColor = { clearColor() },
pickIcon = { showIconPicker() },
discard = { finish() },
optionButton = optionButton,
extensionContent = extensionContent,
)
}
companion object {

@ -184,7 +184,7 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
IconButton(onClick = { help() }) {
Icon(imageVector = Icons.Outlined.Help, contentDescription = "")
}
} else DeleteButton{ promptDelete() }
} else DeleteButton(filter?.title ?: ""){ promptDelete() }
}
) {
FilterCondition(

@ -199,7 +199,7 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
@Composable
fun BaseCaldavSettingsContent (
optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton { promptDelete() } },
optionButton: @Composable () -> Unit = { if (!isNew) DeleteButton(caldavCalendar?.name ?: "") { promptDelete() } },
extensionContent: @Composable ColumnScope.() -> Unit = {}
) {
BaseSettingsContent (

@ -22,7 +22,7 @@ class LocalListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
setContent {
TasksTheme {
BaseCaldavSettingsContent (
optionButton = { if (!isNew && canDelete) DeleteButton { promptDelete() } }
optionButton = { if (!isNew && canDelete) DeleteButton(caldavCalendar?.name ?: "") { promptDelete() } }
)
}
}

@ -6,16 +6,31 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import org.tasks.R
import org.tasks.compose.settings.PromptAction
@Composable
fun DeleteButton(onClick: () -> Unit) {
IconButton(onClick = onClick) {
fun DeleteButton(
title: String,
onDelete: () -> Unit
) {
var promptDelete by remember { mutableStateOf(false) }
IconButton(onClick = { promptDelete = true }) {
Icon(
imageVector = Icons.Outlined.Delete,
contentDescription = stringResource(id = R.string.delete),
tint = MaterialTheme.colorScheme.onSurface,
)
}
PromptAction(
showDialog = promptDelete,
title = stringResource(id = R.string.delete_tag_confirmation, title),
onAction = { onDelete() },
onCancel = { promptDelete = false },
)
}

@ -12,6 +12,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import org.tasks.R
@ -57,7 +58,9 @@ fun Comment(
) {
Row(verticalAlignment = Alignment.Top) {
Column(
modifier = Modifier.weight(1f).padding(top = 8.dp),
modifier = Modifier
.weight(1f)
.padding(top = 8.dp),
) {
comment.message?.let {
// TODO: linkify text
@ -70,7 +73,9 @@ fun Comment(
AsyncImage(
model = it,
contentDescription = null,
modifier = Modifier.clickable { openImage(it) }.size(100.dp)
modifier = Modifier
.clickable { openImage(it) }
.size(100.dp)
)
}
Text(
@ -79,11 +84,8 @@ fun Comment(
color = MaterialTheme.colorScheme.onSurface,
)
}
DeleteButton(
onClick = {
// TODO: add confirmation dialog
deleteComment(comment)
}
)
DeleteButton(stringResource(R.string.delete_comment)) {
deleteComment(comment)
}
}
}

@ -0,0 +1,68 @@
package org.tasks.compose.settings
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import org.tasks.R
import org.tasks.compose.Constants
@Composable
fun BaseSettingsContent(
title: String,
color: Color,
icon: String,
text: String,
error: String,
requestKeyboard: Boolean,
promptDiscard: Boolean,
showProgress: Boolean,
dismissDiscardPrompt: () -> Unit,
setText: (String) -> Unit,
save: () -> Unit,
pickColor: () -> Unit,
clearColor: () -> Unit,
pickIcon: () -> Unit,
discard: () -> Unit,
optionButton: @Composable () -> Unit,
extensionContent: @Composable ColumnScope.() -> Unit,
) {
SettingsSurface {
Toolbar(
title = title,
save = { save() },
optionButton = optionButton
)
ProgressBar(showProgress)
TitleInput(
text = text,
error = error,
requestKeyboard = requestKeyboard,
modifier = Modifier.padding(horizontal = Constants.KEYLINE_FIRST),
setText = { setText(it) },
)
Column(modifier = Modifier.fillMaxWidth()) {
SelectColorRow(
color = color,
selectColor = { pickColor() },
clearColor = { clearColor() },
)
SelectIconRow(
icon = icon,
selectIcon = { pickIcon() },
)
extensionContent()
PromptAction(
showDialog = promptDiscard,
title = stringResource(id = R.string.discard_changes),
onAction = { discard() },
onCancel = { dismissDiscardPrompt() },
)
}
}
}

@ -7,18 +7,17 @@ import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.unit.dp
@Composable
fun ProgressBar(showProgress: State<Boolean>) {
fun ProgressBar(showProgress: Boolean) {
Box(modifier = Modifier
.fillMaxWidth()
.requiredHeight(3.dp))
{
if (showProgress.value) {
if (showProgress) {
LinearProgressIndicator(
modifier = Modifier.fillMaxSize(),
trackColor = LocalContentColor.current.copy(alpha = 0.3f), //Color.LightGray,

@ -4,9 +4,6 @@ import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.tooling.preview.Preview
import org.tasks.R
import org.tasks.compose.Constants
@ -14,12 +11,12 @@ import org.tasks.themes.TasksTheme
@Composable
fun PromptAction(
showDialog: MutableState<Boolean>,
showDialog: Boolean,
title: String,
onAction: () -> Unit,
onCancel: () -> Unit = { showDialog.value = false }
onCancel: () -> Unit,
) {
if (showDialog.value) {
if (showDialog) {
AlertDialog(
onDismissRequest = onCancel,
title = { Text(title, style = MaterialTheme.typography.headlineSmall) },
@ -34,8 +31,10 @@ fun PromptAction(
private fun PromptActionPreview() {
TasksTheme {
PromptAction(
showDialog = remember { mutableStateOf(true) },
showDialog = true,
title = "Delete list?",
onAction = { /*TODO*/ })
onAction = { /*TODO*/ },
onCancel = {},
)
}
}

@ -12,9 +12,6 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -29,12 +26,12 @@ import org.tasks.kmp.org.tasks.compose.settings.SettingRow
import org.tasks.themes.TasksTheme
@Composable
fun SelectColorRow(color: State<Color>, selectColor: () -> Unit, clearColor: () -> Unit) =
fun SelectColorRow(color: Color, selectColor: () -> Unit, clearColor: () -> Unit) =
SettingRow(
modifier = Modifier.clickable(onClick = selectColor),
left = {
IconButton(onClick = { selectColor() }) {
if (color.value == Color.Unspecified) {
if (color == Color.Unspecified) {
Icon(
imageVector = Icons.Outlined.NotInterested,
tint = colorResource(R.color.icon_tint_with_alpha),
@ -47,7 +44,7 @@ fun SelectColorRow(color: State<Color>, selectColor: () -> Unit, clearColor: ()
contentAlignment = Alignment.Center
) {
Canvas(modifier = Modifier.size(24.dp)) {
drawCircle(color = color.value)
drawCircle(color = color)
drawCircle(color = borderColor, style = Stroke(width = 4.0f)
)
}
@ -62,7 +59,7 @@ fun SelectColorRow(color: State<Color>, selectColor: () -> Unit, clearColor: ()
)
},
right = {
if (color.value != Color.Unspecified) {
if (color != Color.Unspecified) {
IconButton(onClick = clearColor) {
Icon(
imageVector = Icons.Outlined.Clear,
@ -78,7 +75,7 @@ fun SelectColorRow(color: State<Color>, selectColor: () -> Unit, clearColor: ()
private fun ColorSelectPreview () {
TasksTheme {
SelectColorRow(
color = remember { mutableStateOf(Color.Red) },
color = Color.Red,
selectColor = {},
clearColor = {}
)

@ -12,7 +12,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
@ -32,9 +31,10 @@ import org.tasks.R
@Composable
fun TitleInput(
text: MutableState<String>,
error: MutableState<String>,
text: String,
error: String,
requestKeyboard: Boolean,
setText: (String) -> Unit,
modifier: Modifier = Modifier,
label: String = stringResource(R.string.display_name),
errorState: Color = MaterialTheme.colorScheme.secondary,
@ -45,12 +45,12 @@ fun TitleInput(
val requester = remember { FocusRequester() }
val focused = remember { mutableStateOf(false) }
val labelColor = when {
(error.value != "") -> errorState
(error != "") -> errorState
(focused.value) -> activeState
else -> inactiveState
}
val dividerColor = if (focused.value) errorState else labelColor
val labelText = if (error.value != "") error.value else label
val labelText = if (error != "") error else label
Row (modifier = modifier)
{
@ -65,15 +65,12 @@ fun TitleInput(
)
BasicTextField(
value = text.value,
value = text,
textStyle = TextStyle(
fontSize = LocalTextStyle.current.fontSize,
color = LocalContentColor.current
),
onValueChange = {
text.value = it
if (error.value != "") error.value = ""
},
onValueChange = { setText(it) },
cursorBrush = SolidColor(errorState), // SolidColor(LocalContentColor.current),
modifier = Modifier
.fillMaxWidth()

@ -73,7 +73,7 @@ private fun TitleBarPreview() {
Toolbar(
title = "Toolbar title",
save = { /*TODO*/ },
optionButton = { DeleteButton {} }
optionButton = { DeleteButton("test") {} }
)
}
}

@ -29,7 +29,7 @@ class OpenTasksListSettingsActivity : BaseCaldavCalendarSettingsActivity() {
save = { lifecycleScope.launch { save() } },
optionButton = { },
)
ProgressBar(showProgress)
ProgressBar(showProgress.value)
SelectIconRow(icon = selectedIcon.value?: defaultIcon) { showIconPicker() }
}
Toaster(state = snackbar)

@ -262,6 +262,7 @@ File %1$s contained %2$s.\n\n
<string name="new_tag">Create new tag</string>
<string name="new_list">Create new list</string>
<string name="delete_tag_confirmation">Delete %s?</string>
<string name="delete_comment">comment</string>
<string name="TPl_notification">Timers Active for %s!</string>
<string name="TEA_timer_controls">Timer</string>
<string name="TEA_timer_comment_started">started this task:</string>

Loading…
Cancel
Save