haerzig.core.views.Dialogs.kt Maven / Gradle / Ivy
package haerzig.core.views
import android.content.res.Configuration
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.CenterVertically
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.DialogProperties
import haerzig.core.R
import haerzig.core.themes.AppTheme
import haerzig.core.themes.horizontalGradient
import haerzig.core.themes.verticalGradient
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_YES,
name = "DefaultPreviewDark"
)
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_NO,
name = "DefaultPreviewLight"
)
@Composable
fun UnsavedChangesDialogPreview() {
AppTheme {
Surface {
UnsavedChangesDialogPreview()
}
}
}
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_YES,
name = "DefaultPreviewDark"
)
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_NO,
name = "DefaultPreviewLight"
)
@Composable
fun UndoDialogPreview() {
AppTheme {
Surface {
UndoDialog()
}
}
}
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_YES,
name = "DefaultPreviewDark"
)
@Preview(
uiMode = Configuration.UI_MODE_NIGHT_NO,
name = "DefaultPreviewLight"
)
@Composable
fun ClosableDialogPreview() {
AppTheme {
Surface {
Dialog(icon = painterResource(R.mipmap.ic_information), title = "Preview", actionIcon = painterResource(R.mipmap.ic_close), actionsDescription = "Close", onActionClick = {}) {
Text(modifier = Modifier.padding(5.dp), text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.")
}
}
}
}
@Composable
fun DialogHeader(icon: Painter = painterResource(-1), title: String = "", actionIcon: Painter? = null, actionsDescription: String = "", onActionClick: () -> Unit = {}) {
Row(
modifier = Modifier.wrapContentWidth()
) {
Image(
modifier = Modifier
.verticalGradient()
.size(25.dp),
painter = icon,
contentDescription = title
)
Text(
modifier = Modifier
.horizontalGradient()
.align(CenterVertically)
.padding(start = 5.dp),
text = title,
fontSize = 18.sp,
fontWeight = FontWeight.Bold
)
Spacer(modifier = Modifier.weight(1f))
if (actionIcon != null) {
IconButton(
actionIcon,
actionsDescription
) {
onActionClick.invoke()
}
}
}
}
@Composable
fun Dialog(icon: Painter = painterResource(-1), title: String = "", dialogProperties: DialogProperties = DialogProperties(dismissOnClickOutside = false), actionIcon: Painter? = null, actionsDescription: String = "", onActionClick: () -> Unit = {}, onDismissRequest: () -> Unit = {}, Content: @Composable ColumnScope.() -> Unit = {}) {
androidx.compose.ui.window.Dialog(
onDismissRequest = { onDismissRequest.invoke() },
properties = dialogProperties
) {
Surface(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight(),
shape = RoundedCornerShape(size = 10.dp)
) {
Column(modifier = Modifier.padding(16.dp)) {
DialogHeader(icon, title, actionIcon, actionsDescription, onActionClick)
Content()
}
}
}
}
@Composable
fun UnsavedChangesDialog(action: () -> Unit = {}, onDismissRequest: () -> Unit = {}) {
Dialog(painterResource(R.mipmap.ic_question_mark), stringResource(R.string.unsaved_changes), onDismissRequest = { onDismissRequest.invoke() }) {
Text(modifier = Modifier.padding(5.dp), text = stringResource(R.string.unsaved_changes_description))
Row(
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(5.dp)
) {
OutlinedTextButton(painterResource(R.mipmap.ic_yes), stringResource(R.string.yes)) {
action.invoke()
onDismissRequest.invoke()
}
OutlinedTextButton(painterResource(R.mipmap.ic_close), stringResource(R.string.no)) { onDismissRequest.invoke() }
}
}
}
@Composable
fun UndoDialog(action: () -> Unit = {}, onDismissRequest: () -> Unit = {}) {
Dialog(painterResource(R.mipmap.ic_question_mark), stringResource(R.string.undo_changes), onDismissRequest = { onDismissRequest.invoke() }) {
Text(modifier = Modifier.padding(5.dp), text = stringResource(R.string.undo_description))
Row(
modifier = Modifier
.align(Alignment.CenterHorizontally)
.padding(5.dp)
) {
OutlinedTextButton(painterResource(R.mipmap.ic_undo), stringResource(R.string.yes)) {
action.invoke()
onDismissRequest.invoke()
}
OutlinedTextButton(painterResource(R.mipmap.ic_close), stringResource(R.string.no)) { onDismissRequest.invoke() }
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy