Skip to content

Commit 293645c

Browse files
committed
make SelectButton more flexible
1 parent 4cfc0ea commit 293645c

File tree

3 files changed

+49
-25
lines changed

3 files changed

+49
-25
lines changed

app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/LengthForm.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,8 @@ fun LengthForm(
6565
selectedUnit = unit
6666
onChange(null)
6767
},
68-
) {
69-
Text(it.toString())
70-
}
68+
itemContent = { Text(it.toString()) }
69+
)
7170
}
7271

7372
ProvideTextStyle(MaterialTheme.typography.largeInput) {

app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/max_height/MaxHeightForm.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Arrangement
44
import androidx.compose.foundation.layout.Column
55
import androidx.compose.foundation.layout.Row
66
import androidx.compose.foundation.layout.padding
7-
import androidx.compose.foundation.layout.width
87
import androidx.compose.material.MaterialTheme
98
import androidx.compose.material.ProvideTextStyle
109
import androidx.compose.material.Text
@@ -15,18 +14,15 @@ import androidx.compose.runtime.remember
1514
import androidx.compose.runtime.setValue
1615
import androidx.compose.ui.Alignment
1716
import androidx.compose.ui.Modifier
18-
import androidx.compose.ui.res.stringResource
1917
import androidx.compose.ui.text.font.FontWeight
2018
import androidx.compose.ui.tooling.preview.Preview
2119
import androidx.compose.ui.unit.dp
22-
import de.westnordost.streetcomplete.R
2320
import de.westnordost.streetcomplete.data.meta.LengthUnit
2421
import de.westnordost.streetcomplete.osm.Length
2522
import de.westnordost.streetcomplete.osm.unit
2623
import de.westnordost.streetcomplete.ui.common.LengthFeetInchesInput
2724
import de.westnordost.streetcomplete.ui.common.LengthMetersInput
2825
import de.westnordost.streetcomplete.ui.common.SelectButton
29-
import de.westnordost.streetcomplete.ui.common.TextFieldStyle
3026
import de.westnordost.streetcomplete.ui.theme.extraLargeInput
3127
import de.westnordost.streetcomplete.ui.theme.largeInput
3228

@@ -59,10 +55,9 @@ fun MaxHeightForm(
5955
onSelectedItem = { unit ->
6056
selectedUnit = unit
6157
onChange(null)
62-
}
63-
) {
64-
Text(it.toString())
65-
}
58+
},
59+
itemContent = { Text(it.toString()) }
60+
)
6661
}
6762
MaxHeightSign(countryCode = countryCode) {
6863
when (selectedUnit) {

app/src/androidMain/kotlin/de/westnordost/streetcomplete/ui/common/SelectButton.kt

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package de.westnordost.streetcomplete.ui.common
22

3+
import androidx.compose.foundation.BorderStroke
34
import androidx.compose.foundation.interaction.MutableInteractionSource
45
import androidx.compose.foundation.layout.Box
56
import androidx.compose.foundation.layout.PaddingValues
67
import androidx.compose.foundation.layout.RowScope
8+
import androidx.compose.foundation.layout.calculateEndPadding
9+
import androidx.compose.foundation.layout.calculateStartPadding
710
import androidx.compose.foundation.layout.padding
11+
import androidx.compose.material.ButtonColors
812
import androidx.compose.material.ButtonElevation
913
import androidx.compose.material.DropdownMenu
1014
import androidx.compose.material.ExperimentalMaterialApi
1115
import androidx.compose.material.Icon
1216
import androidx.compose.material.LocalTextStyle
13-
import androidx.compose.material.OutlinedButton
1417
import androidx.compose.material.Text
1518
import androidx.compose.runtime.Composable
1619
import androidx.compose.runtime.getValue
@@ -19,6 +22,8 @@ import androidx.compose.runtime.remember
1922
import androidx.compose.runtime.setValue
2023
import androidx.compose.ui.Modifier
2124
import androidx.compose.ui.draw.rotate
25+
import androidx.compose.ui.graphics.Shape
26+
import androidx.compose.ui.platform.LocalLayoutDirection
2227
import androidx.compose.ui.tooling.preview.Preview
2328
import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
2429
import androidx.compose.ui.unit.dp
@@ -39,32 +44,56 @@ import kotlin.collections.forEach
3944
@Composable
4045
fun <T> SelectButton(
4146
items: List<T>,
42-
selectedItem: T,
4347
onSelectedItem: (T) -> Unit,
4448
modifier: Modifier = Modifier,
49+
selectedItem: T? = null,
50+
style: ButtonStyle = ButtonStyle.Default,
4551
enabled: Boolean = true,
4652
interactionSource: MutableInteractionSource? = null,
47-
elevation: ButtonElevation? = null,
53+
elevation: ButtonElevation? = style.elevation,
54+
shape: Shape = style.shape,
55+
border: BorderStroke? = style.border,
56+
colors: ButtonColors = style.buttonColors,
57+
contentPadding: PaddingValues = style.contentPadding,
58+
showDropDownArrow: Boolean = true,
4859
itemContent: @Composable (RowScope.(item: T) -> Unit),
60+
content: @Composable (RowScope.() -> Unit) = { selectedItem?.let { itemContent(it) } }
4961
) {
5062
var expanded by remember { mutableStateOf(false) }
5163

64+
val revisedContentPadding = if (showDropDownArrow) {
65+
val layoutDirection = LocalLayoutDirection.current
66+
PaddingValues(
67+
start = contentPadding.calculateStartPadding(layoutDirection),
68+
top = contentPadding.calculateTopPadding(),
69+
end = contentPadding.calculateEndPadding(layoutDirection) - 8.dp,
70+
bottom = contentPadding.calculateBottomPadding(),
71+
)
72+
} else {
73+
contentPadding
74+
}
75+
5276
Box(modifier = modifier) {
53-
OutlinedButton(
77+
Button2(
5478
onClick = { expanded = !expanded },
55-
contentPadding = PaddingValues(start = 16.dp, top = 8.dp, end = 8.dp, bottom = 8.dp),
5679
enabled = enabled,
5780
interactionSource = interactionSource,
5881
elevation = elevation,
82+
shape = shape,
83+
border = border,
84+
colors = colors,
85+
contentPadding = revisedContentPadding,
5986
) {
60-
itemContent(selectedItem)
61-
Icon(
62-
painter = painterResource(Res.drawable.ic_arrow_drop_down_24),
63-
contentDescription = null,
64-
modifier = Modifier
65-
.padding(start = 8.dp)
66-
.rotate(if (expanded) 180f else 0f)
67-
)
87+
content()
88+
if (showDropDownArrow) {
89+
Icon(
90+
painter = painterResource(Res.drawable.ic_arrow_drop_down_24),
91+
contentDescription = null,
92+
modifier = Modifier
93+
.padding(start = 8.dp)
94+
.rotate(if (expanded) 180f else 0f)
95+
)
96+
}
6897
}
6998
DropdownMenu(
7099
expanded = expanded,
@@ -95,5 +124,6 @@ private fun LengthInputSelectorPreview() {
95124
items = words,
96125
selectedItem = selected,
97126
onSelectedItem = { selected = it },
98-
) { Text(it) }
127+
itemContent = { Text(it) }
128+
)
99129
}

0 commit comments

Comments
 (0)