2022-06-21 09:31:36 +07:00
|
|
|
package eu.kanade.presentation.util
|
|
|
|
|
2022-07-16 21:06:24 +02:00
|
|
|
import androidx.compose.foundation.background
|
2022-06-21 09:31:36 +07:00
|
|
|
import androidx.compose.foundation.combinedClickable
|
|
|
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
2022-07-16 21:06:24 +02:00
|
|
|
import androidx.compose.foundation.isSystemInDarkTheme
|
2022-06-21 09:31:36 +07:00
|
|
|
import androidx.compose.material3.LocalMinimumTouchTargetEnforcement
|
2022-07-16 21:06:24 +02:00
|
|
|
import androidx.compose.material3.MaterialTheme
|
2022-06-21 09:31:36 +07:00
|
|
|
import androidx.compose.runtime.remember
|
|
|
|
import androidx.compose.ui.Modifier
|
|
|
|
import androidx.compose.ui.composed
|
|
|
|
import androidx.compose.ui.draw.alpha
|
|
|
|
import androidx.compose.ui.layout.LayoutModifier
|
|
|
|
import androidx.compose.ui.layout.Measurable
|
|
|
|
import androidx.compose.ui.layout.MeasureResult
|
|
|
|
import androidx.compose.ui.layout.MeasureScope
|
|
|
|
import androidx.compose.ui.platform.LocalViewConfiguration
|
|
|
|
import androidx.compose.ui.platform.debugInspectorInfo
|
|
|
|
import androidx.compose.ui.unit.Constraints
|
|
|
|
import androidx.compose.ui.unit.DpSize
|
|
|
|
import kotlin.math.roundToInt
|
|
|
|
|
2022-07-16 21:06:24 +02:00
|
|
|
fun Modifier.selectedBackground(isSelected: Boolean): Modifier = composed {
|
|
|
|
if (isSelected) {
|
|
|
|
val alpha = if (isSystemInDarkTheme()) 0.08f else 0.22f
|
|
|
|
background(MaterialTheme.colorScheme.secondary.copy(alpha = alpha))
|
|
|
|
} else {
|
|
|
|
this
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-21 09:31:36 +07:00
|
|
|
fun Modifier.secondaryItemAlpha(): Modifier = this.alpha(.78f)
|
|
|
|
|
|
|
|
fun Modifier.clickableNoIndication(
|
|
|
|
onLongClick: (() -> Unit)? = null,
|
|
|
|
onClick: () -> Unit,
|
|
|
|
): Modifier = composed {
|
|
|
|
this.combinedClickable(
|
|
|
|
interactionSource = remember { MutableInteractionSource() },
|
|
|
|
indication = null,
|
|
|
|
onLongClick = onLongClick,
|
|
|
|
onClick = onClick,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
@Suppress("ModifierInspectorInfo")
|
|
|
|
fun Modifier.minimumTouchTargetSize(): Modifier = composed(
|
|
|
|
inspectorInfo = debugInspectorInfo {
|
|
|
|
name = "minimumTouchTargetSize"
|
|
|
|
properties["README"] = "Adds outer padding to measure at least 48.dp (default) in " +
|
|
|
|
"size to disambiguate touch interactions if the element would measure smaller"
|
|
|
|
},
|
|
|
|
) {
|
|
|
|
if (LocalMinimumTouchTargetEnforcement.current) {
|
|
|
|
val size = LocalViewConfiguration.current.minimumTouchTargetSize
|
|
|
|
MinimumTouchTargetModifier(size)
|
|
|
|
} else {
|
|
|
|
Modifier
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private class MinimumTouchTargetModifier(val size: DpSize) : LayoutModifier {
|
|
|
|
override fun MeasureScope.measure(
|
|
|
|
measurable: Measurable,
|
|
|
|
constraints: Constraints,
|
|
|
|
): MeasureResult {
|
|
|
|
val placeable = measurable.measure(constraints)
|
|
|
|
|
|
|
|
// Be at least as big as the minimum dimension in both dimensions
|
|
|
|
val width = maxOf(placeable.width, size.width.roundToPx())
|
|
|
|
val height = maxOf(placeable.height, size.height.roundToPx())
|
|
|
|
|
|
|
|
return layout(width, height) {
|
|
|
|
val centerX = ((width - placeable.width) / 2f).roundToInt()
|
|
|
|
val centerY = ((height - placeable.height) / 2f).roundToInt()
|
|
|
|
placeable.place(centerX, centerY)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun equals(other: Any?): Boolean {
|
|
|
|
val otherModifier = other as? MinimumTouchTargetModifier ?: return false
|
|
|
|
return size == otherModifier.size
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun hashCode(): Int {
|
|
|
|
return size.hashCode()
|
|
|
|
}
|
|
|
|
}
|