-
Notifications
You must be signed in to change notification settings - Fork 0
/
Button.kt
98 lines (88 loc) · 2.9 KB
/
Button.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.starmel.windowsapplication.ui.theme
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.*
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawWithCache
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
enum class ButtonState {
Regular,
Pressed,
Focused,
Disabled,
}
@Composable
fun Button(
text: String,
modifier: Modifier = Modifier,
enabled: Boolean = true,
onClick: () -> Unit
) {
val interactionSource = remember { MutableInteractionSource() }
val interaction by lastInteractionState(interactionSource)
val state by remember(interaction) {
derivedStateOf {
when {
!enabled -> ButtonState.Disabled
interaction is PressInteraction.Press -> ButtonState.Pressed
interaction is FocusInteraction.Focus -> ButtonState.Focused
else -> ButtonState.Regular
}
}
}
Box(
modifier = modifier
.size(76.winDp, 24.winDp)
.graphicsLayer { this.alpha = 0.99f }
.drawWithCache {
val pixelSize = 1.winDp.toPx()
onDrawWithContent {
when (state) {
ButtonState.Regular -> drawUnpressedBorder(pixelSize)
ButtonState.Pressed -> drawPressedBorder(pixelSize)
ButtonState.Focused -> drawFocusBorder(pixelSize)
ButtonState.Disabled -> drawUnpressedBorder(pixelSize)
}
drawContent()
}
}
.clickable(
interactionSource = interactionSource,
indication = null,
enabled = enabled,
onClick = onClick
),
contentAlignment = Alignment.Center
) {
Text(text, fontSize = 12.sp, enabled = enabled)
}
}
@Composable
fun lastInteractionState(interactionSource: InteractionSource): State<Interaction?> {
val lastInteraction: MutableState<Interaction?> = remember { mutableStateOf(null) }
LaunchedEffect(interactionSource) {
interactionSource.interactions.collect { interaction ->
lastInteraction.value = interaction
}
}
return lastInteraction
}
@Composable
@Preview(showBackground = true)
private fun ButtonPreview() {
Row {
Button(text = "Close", enabled = false) {
}
Spacer(modifier = Modifier.size(16.dp))
Button(text = "Ok") {
}
}
}