From eec8dc047120c5f20384004b44887c03a13b39b1 Mon Sep 17 00:00:00 2001 From: YuKongA <70465933+YuKongA@users.noreply.github.com> Date: Sat, 12 Oct 2024 18:59:41 +0800 Subject: [PATCH] library: Optimize SuperDropdown performance again --- .../src/androidMain/AndroidManifest.xml | 11 ++-- .../top/yukonga/miuix/kmp/extra/SuperArrow.kt | 50 ++++++++--------- .../yukonga/miuix/kmp/extra/SuperCheckbox.kt | 4 +- .../yukonga/miuix/kmp/extra/SuperDialog.kt | 8 +-- .../yukonga/miuix/kmp/extra/SuperDropdown.kt | 54 +++++++++---------- .../yukonga/miuix/kmp/extra/SuperSwitch.kt | 4 +- 6 files changed, 63 insertions(+), 68 deletions(-) diff --git a/composeApp/src/androidMain/AndroidManifest.xml b/composeApp/src/androidMain/AndroidManifest.xml index 9fe36b5..e1af107 100644 --- a/composeApp/src/androidMain/AndroidManifest.xml +++ b/composeApp/src/androidMain/AndroidManifest.xml @@ -1,17 +1,20 @@ - + + android:theme="@style/Theme.Miuix" + tools:ignore="UnusedAttribute"> + android:exported="true" + android:windowSoftInputMode="adjustResize"> diff --git a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperArrow.kt b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperArrow.kt index 1c53e18..65a097b 100644 --- a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperArrow.kt +++ b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperArrow.kt @@ -56,33 +56,29 @@ fun SuperArrow( summary = summary, summaryColor = summaryColor, leftAction = leftAction, - rightActions = { createRightActions(rightText) }, - onClick = updatedOnClick, + rightActions = { + if (rightText != null) { + Text( + text = rightText, + fontSize = 15.sp, + color = MiuixTheme.colorScheme.onSurfaceVariantActions, + textAlign = TextAlign.End, + ) + } + Image( + modifier = Modifier + .size(15.dp) + .padding(start = 6.dp), + imageVector = MiuixIcons.ArrowRight, + contentDescription = null, + colorFilter = BlendModeColorFilter(MiuixTheme.colorScheme.onSurfaceVariantActions, BlendMode.SrcIn), + ) + }, + onClick = { + if (enabled) { + updatedOnClick?.invoke() + } + }, enabled = enabled ) } - -/** - * Create the right actions of the [SuperArrow]. - * - * @param rightText The text on the right side of the [SuperArrow]. - */ -@Composable -private fun createRightActions(rightText: String?) { - if (rightText != null) { - Text( - text = rightText, - fontSize = 15.sp, - color = MiuixTheme.colorScheme.onSurfaceVariantActions, - textAlign = TextAlign.End, - ) - } - Image( - modifier = Modifier - .size(15.dp) - .padding(start = 6.dp), - imageVector = MiuixIcons.ArrowRight, - contentDescription = null, - colorFilter = BlendModeColorFilter(MiuixTheme.colorScheme.onSurfaceVariantActions, BlendMode.SrcIn), - ) -} \ No newline at end of file diff --git a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperCheckbox.kt b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperCheckbox.kt index de356e9..a2b796b 100644 --- a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperCheckbox.kt +++ b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperCheckbox.kt @@ -46,9 +46,7 @@ fun SuperCheckbox( var isChecked by remember { mutableStateOf(checked) } val updatedOnCheckedChange by rememberUpdatedState(onCheckedChange) - if (isChecked != checked) { - isChecked = checked - } + if (isChecked != checked) isChecked = checked BasicComponent( modifier = modifier, diff --git a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDialog.kt b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDialog.kt index 726ad87..a860325 100644 --- a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDialog.kt +++ b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDialog.kt @@ -86,9 +86,11 @@ fun SuperDialog( } } - BackHandler(enabled = isDialogShowing()) { - dismissDialog(show) - onDismissRequest?.invoke() + if (show.value) { + BackHandler(enabled = isDialogShowing()) { + dismissDialog(show) + onDismissRequest?.invoke() + } } Box( diff --git a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDropdown.kt b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDropdown.kt index 5418451..48a5314 100644 --- a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDropdown.kt +++ b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperDropdown.kt @@ -41,6 +41,7 @@ import androidx.compose.ui.graphics.BlendModeColorFilter import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInWindow @@ -106,36 +107,23 @@ fun SuperDropdown( enabled: Boolean = true ) { val isDropdownExpanded = remember { mutableStateOf(false) } - - if (!dropdownStates.contains(isDropdownExpanded)) dropdownStates.add(isDropdownExpanded) - LaunchedEffect(isDropdownExpanded.value) { - if (isDropdownExpanded.value) { - dropdownStates.forEach { state -> if (state != isDropdownExpanded) state.value = false } - } - } - val hapticFeedback = LocalHapticFeedback.current + val actionColor = if (enabled) MiuixTheme.colorScheme.onSurfaceVariantActions else MiuixTheme.colorScheme.disabledOnSecondaryVariant var alignLeft by rememberSaveable { mutableStateOf(true) } var dropdownOffsetPx by remember { mutableStateOf(0) } var componentHeightPx by remember { mutableStateOf(0) } var componentWidthPx by remember { mutableStateOf(0) } - BackHandler(enabled = isDropdownExpanded.value) { - dismissPopup(isDropdownExpanded) - } - BasicComponent( - onClick = { - isDropdownExpanded.value = enabled - hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) - }, modifier = modifier .pointerInput(Unit) { awaitPointerEventScope { - while (true) { + while (enabled) { val event = awaitPointerEvent() - val position = event.changes.first().position - alignLeft = position.x < (size.width / 2) + if (event.type != PointerEventType.Move) { + val eventChange = event.changes.first() + alignLeft = eventChange.position.x < (size.width / 2) + } } } } @@ -157,7 +145,7 @@ fun SuperDropdown( modifier = Modifier.padding(end = 6.dp), text = items[selectedIndex], fontSize = 15.sp, - color = if (enabled) MiuixTheme.colorScheme.onSurfaceVariantActions else MiuixTheme.colorScheme.disabledOnSecondaryVariant, + color = actionColor, textAlign = TextAlign.End, ) Image( @@ -165,16 +153,25 @@ fun SuperDropdown( .size(15.dp) .align(Alignment.CenterVertically), imageVector = MiuixIcons.ArrowUpDown, - colorFilter = BlendModeColorFilter( - if (enabled) MiuixTheme.colorScheme.onSurfaceVariantActions else MiuixTheme.colorScheme.disabledOnSecondaryVariant, - BlendMode.SrcIn - ), + colorFilter = BlendModeColorFilter(actionColor, BlendMode.SrcIn), contentDescription = null ) }, + onClick = { + if (enabled) { + isDropdownExpanded.value = enabled + hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress) + } + }, enabled = enabled ) if (isDropdownExpanded.value) { + if (!dropdownStates.contains(isDropdownExpanded)) dropdownStates.add(isDropdownExpanded) + LaunchedEffect(isDropdownExpanded.value) { + if (isDropdownExpanded.value) { + dropdownStates.forEach { state -> if (state != isDropdownExpanded) state.value = false } + } + } val density = LocalDensity.current var offsetPx by remember { mutableStateOf(0) } val textMeasurer = rememberTextMeasurer() @@ -194,16 +191,17 @@ fun SuperDropdown( ) val insideHeightPx by rememberUpdatedState(with(density) { insideMargin.height.toPx() }.roundToInt()) val displayCutoutSize = - WindowInsets.displayCutout.asPaddingValues(density).calculateLeftPadding(LayoutDirection.Ltr) + - WindowInsets.displayCutout.asPaddingValues(density).calculateRightPadding(LayoutDirection.Ltr) + WindowInsets.displayCutout.asPaddingValues(density).calculateLeftPadding(LayoutDirection.Ltr) + WindowInsets.displayCutout.asPaddingValues(density) + .calculateRightPadding(LayoutDirection.Ltr) val popupPadding by rememberUpdatedState { derivedStateOf { max( - horizontalPadding + (windowWeightPx.dp - componentWidthPx.dp) / 2 / density.density - - if (defaultWindowInsetsPadding) displayCutoutSize / 2 else 0.dp, 0.dp + horizontalPadding + (windowWeightPx.dp - componentWidthPx.dp) / 2 / density.density + - if (defaultWindowInsetsPadding) displayCutoutSize / 2 else 0.dp, 0.dp ) } } + BackHandler(enabled = isDropdownExpanded.value) { dismissPopup(isDropdownExpanded) } showPopup( content = { Box( diff --git a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperSwitch.kt b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperSwitch.kt index b776a3c..da6d80e 100644 --- a/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperSwitch.kt +++ b/miuix/src/commonMain/kotlin/top/yukonga/miuix/kmp/extra/SuperSwitch.kt @@ -47,9 +47,7 @@ fun SuperSwitch( var isChecked by remember { mutableStateOf(checked) } val updatedOnCheckedChange by rememberUpdatedState(onCheckedChange) - if (isChecked != checked) { - isChecked = checked - } + if (isChecked != checked) isChecked = checked BasicComponent( modifier = modifier,