Skip to content

Commit 0bd00da

Browse files
committed
library: Add HoverInteraction to SuperDropdown & SuperSpinner
1 parent cca0d85 commit 0bd00da

File tree

8 files changed

+158
-2
lines changed

8 files changed

+158
-2
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package top.yukonga.miuix.kmp.extra
2+
3+
import android.annotation.SuppressLint
4+
import androidx.compose.runtime.MutableState
5+
import androidx.compose.ui.Modifier
6+
7+
/**
8+
* Returns modifier to be used for the current platform.
9+
*/
10+
@SuppressLint("ModifierFactoryExtensionFunction")
11+
actual fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier = modifier

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDropdown.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.compose.foundation.background
66
import androidx.compose.foundation.clickable
77
import androidx.compose.foundation.gestures.detectTapGestures
88
import androidx.compose.foundation.indication
9+
import androidx.compose.foundation.interaction.HoverInteraction
910
import androidx.compose.foundation.interaction.MutableInteractionSource
1011
import androidx.compose.foundation.interaction.PressInteraction
1112
import androidx.compose.foundation.layout.Arrangement
@@ -128,6 +129,7 @@ fun SuperDropdown(
128129
val hapticFeedback = LocalHapticFeedback.current
129130
val actionColor = if (enabled) MiuixTheme.colorScheme.onSurfaceVariantActions else MiuixTheme.colorScheme.disabledOnSecondaryVariant
130131
var alignLeft by rememberSaveable { mutableStateOf(true) }
132+
val isHovered = remember { mutableStateOf(false) }
131133
var componentInnerOffsetXPx by remember { mutableIntStateOf(0) }
132134
var componentInnerOffsetYPx by remember { mutableIntStateOf(0) }
133135
var componentInnerHeightPx by remember { mutableIntStateOf(0) }
@@ -152,10 +154,23 @@ fun SuperDropdown(
152154
}
153155
held.value = null
154156
}
157+
if (isHovered.value) {
158+
coroutineScope.launch {
159+
interactionSource.emit(HoverInteraction.Enter())
160+
}
161+
} else {
162+
coroutineScope.launch {
163+
interactionSource.emit(HoverInteraction.Exit(HoverInteraction.Enter()))
164+
}
165+
}
155166
}
156167

157168
BasicComponent(
158-
modifier = modifier
169+
modifier = modifierPlatform(
170+
modifier = modifier,
171+
isHovered = isHovered,
172+
isEnable = enabled
173+
)
159174
.indication(
160175
interactionSource = interactionSource,
161176
indication = LocalIndication.current
@@ -510,3 +525,8 @@ enum class DropDownMode {
510525
Normal,
511526
AlwaysOnRight
512527
}
528+
529+
/**
530+
* Returns modifier to be used for the current platform.
531+
*/
532+
expect fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier

miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperSpinner.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.compose.foundation.background
66
import androidx.compose.foundation.clickable
77
import androidx.compose.foundation.gestures.detectTapGestures
88
import androidx.compose.foundation.indication
9+
import androidx.compose.foundation.interaction.HoverInteraction
910
import androidx.compose.foundation.interaction.MutableInteractionSource
1011
import androidx.compose.foundation.interaction.PressInteraction
1112
import androidx.compose.foundation.layout.Arrangement
@@ -132,6 +133,7 @@ fun SuperSpinner(
132133
val hapticFeedback = LocalHapticFeedback.current
133134
val actionColor = if (enabled) MiuixTheme.colorScheme.onSurfaceVariantActions else MiuixTheme.colorScheme.disabledOnSecondaryVariant
134135
var alignLeft by rememberSaveable { mutableStateOf(true) }
136+
val isHovered = remember { mutableStateOf(false) }
135137
var componentInnerOffsetXPx by remember { mutableIntStateOf(0) }
136138
var componentInnerOffsetYPx by remember { mutableIntStateOf(0) }
137139
var componentInnerHeightPx by remember { mutableIntStateOf(0) }
@@ -156,10 +158,23 @@ fun SuperSpinner(
156158
}
157159
held.value = null
158160
}
161+
if (isHovered.value) {
162+
coroutineScope.launch {
163+
interactionSource.emit(HoverInteraction.Enter())
164+
}
165+
} else {
166+
coroutineScope.launch {
167+
interactionSource.emit(HoverInteraction.Exit(HoverInteraction.Enter()))
168+
}
169+
}
159170
}
160171

161172
BasicComponent(
162-
modifier = modifier
173+
modifier = modifierPlatform(
174+
modifier = modifier,
175+
isHovered = isHovered,
176+
isEnable = enabled
177+
)
163178
.indication(
164179
interactionSource = interactionSource,
165180
indication = LocalIndication.current
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package top.yukonga.miuix.kmp.extra
2+
3+
import androidx.compose.runtime.MutableState
4+
import androidx.compose.ui.ExperimentalComposeUiApi
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.input.pointer.PointerEventType
7+
import androidx.compose.ui.input.pointer.onPointerEvent
8+
9+
/**
10+
* Returns modifier to be used for the current platform.
11+
*/
12+
@OptIn(ExperimentalComposeUiApi::class)
13+
actual fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier = modifier
14+
.onPointerEvent(PointerEventType.Enter) {
15+
if (isEnable) isHovered.value = true
16+
}
17+
.onPointerEvent(PointerEventType.Exit) {
18+
isHovered.value = false
19+
}
20+
.onPointerEvent(PointerEventType.Release) {
21+
isHovered.value = false
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package top.yukonga.miuix.kmp.extra
2+
3+
import androidx.compose.runtime.MutableState
4+
import androidx.compose.ui.ExperimentalComposeUiApi
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.input.pointer.PointerEventType
7+
import androidx.compose.ui.input.pointer.onPointerEvent
8+
9+
/**
10+
* Returns modifier to be used for the current platform.
11+
*/
12+
@OptIn(ExperimentalComposeUiApi::class)
13+
actual fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier = modifier
14+
.onPointerEvent(PointerEventType.Enter) {
15+
if (isEnable) isHovered.value = true
16+
}
17+
.onPointerEvent(PointerEventType.Exit) {
18+
isHovered.value = false
19+
}
20+
.onPointerEvent(PointerEventType.Release) {
21+
isHovered.value = false
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package top.yukonga.miuix.kmp.extra
2+
3+
import androidx.compose.runtime.MutableState
4+
import androidx.compose.ui.ExperimentalComposeUiApi
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.input.pointer.PointerEventType
7+
import androidx.compose.ui.input.pointer.onPointerEvent
8+
9+
/**
10+
* Returns modifier to be used for the current platform.
11+
*/
12+
@OptIn(ExperimentalComposeUiApi::class)
13+
actual fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier = modifier
14+
.onPointerEvent(PointerEventType.Enter) {
15+
if (isEnable) isHovered.value = true
16+
}
17+
.onPointerEvent(PointerEventType.Exit) {
18+
isHovered.value = false
19+
}
20+
.onPointerEvent(PointerEventType.Release) {
21+
isHovered.value = false
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package top.yukonga.miuix.kmp.extra
2+
3+
import androidx.compose.runtime.MutableState
4+
import androidx.compose.ui.ExperimentalComposeUiApi
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.input.pointer.PointerEventType
7+
import androidx.compose.ui.input.pointer.onPointerEvent
8+
9+
/**
10+
* Returns modifier to be used for the current platform.
11+
*/
12+
@OptIn(ExperimentalComposeUiApi::class)
13+
actual fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier = modifier
14+
.onPointerEvent(PointerEventType.Enter) {
15+
if (isEnable) isHovered.value = true
16+
}
17+
.onPointerEvent(PointerEventType.Exit) {
18+
isHovered.value = false
19+
}
20+
.onPointerEvent(PointerEventType.Release) {
21+
isHovered.value = false
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package top.yukonga.miuix.kmp.extra
2+
3+
import androidx.compose.runtime.MutableState
4+
import androidx.compose.ui.ExperimentalComposeUiApi
5+
import androidx.compose.ui.Modifier
6+
import androidx.compose.ui.input.pointer.PointerEventType
7+
import androidx.compose.ui.input.pointer.onPointerEvent
8+
9+
/**
10+
* Returns modifier to be used for the current platform.
11+
*/
12+
@OptIn(ExperimentalComposeUiApi::class)
13+
actual fun modifierPlatform(modifier: Modifier, isHovered: MutableState<Boolean>, isEnable: Boolean): Modifier = modifier
14+
.onPointerEvent(PointerEventType.Enter) {
15+
if (isEnable) isHovered.value = true
16+
}
17+
.onPointerEvent(PointerEventType.Exit) {
18+
isHovered.value = false
19+
}
20+
.onPointerEvent(PointerEventType.Release) {
21+
isHovered.value = false
22+
}

0 commit comments

Comments
 (0)