Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.BlendModeColorFilter
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.input.pointer.PointerEventType
Expand Down Expand Up @@ -130,6 +131,11 @@ fun SuperDropdown(
var componentHeightPx by remember { mutableStateOf(0) }
var componentWidthPx by remember { mutableStateOf(0) }

val getWindowSize = rememberUpdatedState(getWindowSize())
val windowHeightPx by rememberUpdatedState(getWindowSize.value.height)
val windowWidthPx by rememberUpdatedState(getWindowSize.value.width)
var transformOrigin by mutableStateOf(TransformOrigin.Center)

DisposableEffect(Unit) {
onDispose {
dismissPopup(isDropdownExpanded)
Expand Down Expand Up @@ -165,6 +171,12 @@ fun SuperDropdown(
dropdownOffsetYPx = positionInWindow.y.toInt()
componentHeightPx = coordinates.size.height
componentWidthPx = coordinates.size.width
val xInWindow = dropdownOffsetXPx + if (mode == DropDownMode.AlwaysOnRight || !alignLeft) componentWidthPx else 0
val yInWindow = dropdownOffsetYPx + componentHeightPx / 2
transformOrigin = TransformOrigin(
xInWindow / windowWidthPx.toFloat(),
yInWindow / windowHeightPx.toFloat()
)
}
},
interactionSource = interactionSource,
Expand Down Expand Up @@ -222,8 +234,6 @@ fun SuperDropdown(
val textMeasurer = rememberTextMeasurer()
val textStyle = remember { TextStyle(fontWeight = FontWeight.Medium, fontSize = 16.sp) }
val textWidthDp = remember(items) { items.maxOfOrNull { with(density) { textMeasurer.measure(text = it, style = textStyle).size.width.toDp() } } }
val getWindowSize = rememberUpdatedState(getWindowSize())
val windowHeightPx by rememberUpdatedState(getWindowSize.value.height)
val statusBarPx by rememberUpdatedState(
with(density) { WindowInsets.statusBars.asPaddingValues().calculateTopPadding().toPx() }.roundToInt()
)
Expand Down Expand Up @@ -261,6 +271,7 @@ fun SuperDropdown(
}

showPopup(
transformOrigin = { transformOrigin },
content = {
Box(
modifier = if (defaultWindowInsetsPadding) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.BlendModeColorFilter
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.input.pointer.PointerEventType
Expand Down Expand Up @@ -134,6 +135,11 @@ fun SuperSpinner(
var componentHeightPx by remember { mutableIntStateOf(0) }
var componentWidthPx by remember { mutableIntStateOf(0) }

val getWindowSize = rememberUpdatedState(getWindowSize())
val windowHeightPx by rememberUpdatedState(getWindowSize.value.height)
val windowWidthPx by rememberUpdatedState(getWindowSize.value.width)
var transformOrigin by mutableStateOf(TransformOrigin.Center)

DisposableEffect(Unit) {
onDispose {
dismissPopup(isDropdownExpanded)
Expand Down Expand Up @@ -169,6 +175,12 @@ fun SuperSpinner(
dropdownOffsetYPx = positionInWindow.y.toInt()
componentHeightPx = coordinates.size.height
componentWidthPx = coordinates.size.width
val xInWindow = dropdownOffsetXPx + if (mode == SpinnerMode.AlwaysOnRight || !alignLeft) componentWidthPx else 0
val yInWindow = dropdownOffsetYPx + componentHeightPx / 2
transformOrigin = TransformOrigin(
xInWindow / windowWidthPx.toFloat(),
yInWindow / windowHeightPx.toFloat()
)
}
},
interactionSource = interactionSource,
Expand Down Expand Up @@ -228,8 +240,6 @@ fun SuperSpinner(
val density = LocalDensity.current
var offsetXPx by remember { mutableIntStateOf(0) }
var offsetYPx by remember { mutableIntStateOf(0) }
val getWindowSize = rememberUpdatedState(getWindowSize())
val windowHeightPx by rememberUpdatedState(getWindowSize.value.height)
val statusBarPx by rememberUpdatedState(
with(density) { WindowInsets.statusBars.asPaddingValues().calculateTopPadding().toPx() }.roundToInt()
)
Expand Down Expand Up @@ -269,6 +279,7 @@ fun SuperSpinner(
}

showPopup(
transformOrigin = { transformOrigin },
content = {
Box(
modifier = if (defaultWindowInsetsPadding) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,13 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
Expand All @@ -37,6 +41,7 @@ class MiuixPopupUtil {
private var isDialogShowing = mutableStateOf(false)
private var popupContext = mutableStateOf<(@Composable () -> Unit)?>(null)
private var dialogContext = mutableStateOf<(@Composable () -> Unit)?>(null)
private var popupTransformOrigin = mutableStateOf({ TransformOrigin.Center })

/**
* Show a dialog.
Expand Down Expand Up @@ -68,12 +73,15 @@ class MiuixPopupUtil {
* Show a popup.
*
* @param content The [Composable] content of the popup.
* @param transformOrigin The pivot point in terms of fraction of the overall size, used for scale transformations. By default it's [TransformOrigin.Center].
*/
@Composable
fun showPopup(
content: (@Composable () -> Unit)? = null,
transformOrigin: (() -> TransformOrigin) = { TransformOrigin.Center }
) {
if (isPopupShowing.value) return
popupTransformOrigin.value = transformOrigin
isPopupShowing.value = true
popupContext.value = content
}
Expand All @@ -100,11 +108,20 @@ class MiuixPopupUtil {
val windowWidth by rememberUpdatedState(getWindowSize.width.dp / density.density)
val windowHeight by rememberUpdatedState(getWindowSize.height.dp / density.density)
val largeScreen by rememberUpdatedState { derivedStateOf { (windowHeight >= 480.dp && windowWidth >= 840.dp) } }
var dimEnterDuration by remember { mutableIntStateOf(0) }
var dimExitDuration by remember { mutableIntStateOf(0) }
if (isDialogShowing.value) {
dimEnterDuration = 300
dimExitDuration = 250
} else if (isPopupShowing.value) {
dimEnterDuration = 150
dimExitDuration = 150
}
AnimatedVisibility(
visible = isDialogShowing.value || isPopupShowing.value,
modifier = Modifier.zIndex(1f).fillMaxSize(),
enter = fadeIn(animationSpec = tween(300, easing = DecelerateEasing(1.5f))),
exit = fadeOut(animationSpec = tween(250, easing = DecelerateEasing(1.5f)))
enter = fadeIn(animationSpec = tween(dimEnterDuration, easing = DecelerateEasing(1.5f))),
exit = fadeOut(animationSpec = tween(dimExitDuration, easing = DecelerateEasing(1.5f)))
) {
Box(
modifier = Modifier
Expand Down Expand Up @@ -162,16 +179,18 @@ class MiuixPopupUtil {
visible = isPopupShowing.value,
modifier = Modifier.zIndex(2f).fillMaxSize(),
enter = fadeIn(
animationSpec = tween(150, easing = DecelerateEasing(1.5f))
animationSpec = tween(150, easing = AccelerateEasing(1.5f))
) + scaleIn(
initialScale = 0.8f,
animationSpec = tween(150, easing = DecelerateEasing(1.5f))
initialScale = 0.4f,
animationSpec = tween(150, easing = DecelerateEasing(1.5f)),
transformOrigin = popupTransformOrigin.value.invoke()
),
exit = fadeOut(
animationSpec = tween(150, easing = AccelerateEasing(3.0f))
) + scaleOut(
targetScale = 0.8f,
animationSpec = tween(150, easing = AccelerateEasing(3.0f))
animationSpec = tween(150, easing = AccelerateEasing(3.0f)),
transformOrigin = popupTransformOrigin.value.invoke()
)
) {
Box(
Expand Down