Use bottom sheet for websearch dialog
This commit is contained in:
parent
c8d34ab18a
commit
c247878c6d
@ -3,17 +3,12 @@ package de.mm20.launcher2.ui.settings.websearch
|
|||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.compose.animation.AnimatedVisibility
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
import androidx.compose.foundation.Canvas
|
import androidx.compose.foundation.*
|
||||||
import androidx.compose.foundation.Image
|
|
||||||
import androidx.compose.foundation.background
|
|
||||||
import androidx.compose.foundation.clickable
|
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.lazy.LazyRow
|
import androidx.compose.foundation.lazy.LazyRow
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.material3.OutlinedTextField
|
|
||||||
import androidx.compose.material3.TextField
|
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.rounded.*
|
import androidx.compose.material.icons.rounded.*
|
||||||
import androidx.compose.material3.*
|
import androidx.compose.material3.*
|
||||||
@ -25,16 +20,14 @@ import androidx.compose.ui.Modifier
|
|||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.*
|
import androidx.compose.ui.graphics.*
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.window.Dialog
|
|
||||||
import androidx.compose.ui.window.DialogProperties
|
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
import coil.compose.rememberImagePainter
|
import coil.compose.rememberImagePainter
|
||||||
import com.godaddy.android.colorpicker.ClassicColorPicker
|
import com.godaddy.android.colorpicker.ClassicColorPicker
|
||||||
import de.mm20.launcher2.search.data.Websearch
|
import de.mm20.launcher2.search.data.Websearch
|
||||||
import de.mm20.launcher2.ui.R
|
import de.mm20.launcher2.ui.R
|
||||||
|
import de.mm20.launcher2.ui.component.BottomSheetDialog
|
||||||
import de.mm20.launcher2.ui.component.preferences.Preference
|
import de.mm20.launcher2.ui.component.preferences.Preference
|
||||||
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
|
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
|
||||||
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
|
||||||
@ -139,7 +132,7 @@ fun WebsearchPreference(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun EditWebsearchDialog(
|
fun EditWebsearchDialog(
|
||||||
title: String,
|
title: String,
|
||||||
@ -149,7 +142,6 @@ fun EditWebsearchDialog(
|
|||||||
onCancel: () -> Unit,
|
onCancel: () -> Unit,
|
||||||
enableImport: Boolean = false
|
enableImport: Boolean = false
|
||||||
) {
|
) {
|
||||||
val context = LocalContext.current
|
|
||||||
var showDropdown by remember { mutableStateOf(false) }
|
var showDropdown by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
var label by remember { mutableStateOf(value.label) }
|
var label by remember { mutableStateOf(value.label) }
|
||||||
@ -179,52 +171,9 @@ fun EditWebsearchDialog(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BottomSheetDialog(onDismissRequest = onCancel,
|
||||||
Dialog(
|
title = { Text(title) },
|
||||||
onDismissRequest = onCancel,
|
|
||||||
properties = DialogProperties(usePlatformDefaultWidth = false)
|
|
||||||
) {
|
|
||||||
Surface(
|
|
||||||
shape = RectangleShape,
|
|
||||||
modifier = Modifier.fillMaxSize()
|
|
||||||
) {
|
|
||||||
Scaffold(
|
|
||||||
topBar = {
|
|
||||||
SmallTopAppBar(
|
|
||||||
navigationIcon = {
|
|
||||||
IconButton(onClick = {
|
|
||||||
if (icon != value.icon) {
|
|
||||||
icon?.let { viewModel.deleteIcon(it) }
|
|
||||||
}
|
|
||||||
onCancel()
|
|
||||||
}) {
|
|
||||||
Icon(imageVector = Icons.Rounded.Close, contentDescription = null)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
title = {
|
|
||||||
Text(
|
|
||||||
text = title
|
|
||||||
)
|
|
||||||
},
|
|
||||||
actions = {
|
actions = {
|
||||||
IconButton(onClick = {
|
|
||||||
if (urlTemplate.contains("\${1}")) {
|
|
||||||
value.label = label
|
|
||||||
value.urlTemplate = urlTemplate
|
|
||||||
if (value.icon != icon) {
|
|
||||||
value.icon?.let {
|
|
||||||
viewModel.deleteIcon(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
value.icon = icon
|
|
||||||
value.color = color
|
|
||||||
onValueSaved(value)
|
|
||||||
} else {
|
|
||||||
showError = true
|
|
||||||
}
|
|
||||||
}) {
|
|
||||||
Icon(imageVector = Icons.Rounded.Save, contentDescription = null)
|
|
||||||
}
|
|
||||||
if (enableImport) {
|
if (enableImport) {
|
||||||
Box {
|
Box {
|
||||||
IconButton(onClick = {
|
IconButton(onClick = {
|
||||||
@ -232,7 +181,7 @@ fun EditWebsearchDialog(
|
|||||||
importError = false
|
importError = false
|
||||||
}) {
|
}) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = Icons.Rounded.Download,
|
imageVector = Icons.Rounded.CloudDownload,
|
||||||
contentDescription = null
|
contentDescription = null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -265,12 +214,43 @@ fun EditWebsearchDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
confirmButton = {
|
||||||
|
Button(onClick = {
|
||||||
|
if (urlTemplate.contains("\${1}")) {
|
||||||
|
value.label = label
|
||||||
|
value.urlTemplate = urlTemplate
|
||||||
|
if (value.icon != icon) {
|
||||||
|
value.icon?.let {
|
||||||
|
viewModel.deleteIcon(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
value.icon = icon
|
||||||
|
value.color = color
|
||||||
|
onValueSaved(value)
|
||||||
|
} else {
|
||||||
|
showError = true
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
Text("Save")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dismissButton = {
|
||||||
|
OutlinedButton(onClick = {
|
||||||
|
if (icon != value.icon) {
|
||||||
|
icon?.let { viewModel.deleteIcon(it) }
|
||||||
|
}
|
||||||
|
onCancel()
|
||||||
|
}) {
|
||||||
|
Text(stringResource(android.R.string.cancel))
|
||||||
}
|
}
|
||||||
)
|
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
Column(modifier = Modifier.padding(it).padding(16.dp)) {
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
) {
|
||||||
AnimatedVisibility(showImport) {
|
AnimatedVisibility(showImport) {
|
||||||
Card(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@ -449,9 +429,6 @@ fun EditWebsearchDialog(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user