Use newer desktop click APIs

This commit is contained in:
Syer10
2022-08-01 17:53:30 -04:00
parent ed248e01e5
commit fdd2e9fc09
4 changed files with 46 additions and 122 deletions

View File

@@ -7,22 +7,24 @@
package ca.gosyer.jui.ui.library.components
import androidx.compose.foundation.ContextMenuItem
import androidx.compose.foundation.onClick
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import ca.gosyer.jui.i18n.MR
import ca.gosyer.jui.uicore.components.contextMenuClickable
import ca.gosyer.jui.uicore.components.onRightClickContextMenu
import ca.gosyer.jui.uicore.resources.stringResource
actual fun Modifier.libraryMangaModifier(
onClickManga: () -> Unit,
onClickRemoveManga: () -> Unit
): Modifier = contextMenuClickable(
{
getContextItems(onClickRemoveManga)
},
onClick = { onClickManga() }
)
): Modifier = this
.onClick(onClick = onClickManga)
.onRightClickContextMenu(
items = {
getContextItems(onClickRemoveManga)
}
)
@Composable
@Stable

View File

@@ -7,11 +7,12 @@
package ca.gosyer.jui.ui.manga.components
import androidx.compose.foundation.ContextMenuItem
import androidx.compose.foundation.onClick
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import ca.gosyer.jui.i18n.MR
import ca.gosyer.jui.uicore.components.contextMenuClickable
import ca.gosyer.jui.uicore.components.onRightClickContextMenu
import ca.gosyer.jui.uicore.resources.stringResource
actual fun Modifier.chapterItemModifier(
@@ -19,16 +20,19 @@ actual fun Modifier.chapterItemModifier(
toggleRead: () -> Unit,
toggleBookmarked: () -> Unit,
markPreviousAsRead: () -> Unit
): Modifier = contextMenuClickable(
{
getContextItems(
toggleRead,
toggleBookmarked,
markPreviousAsRead
)
},
onClick = { onClick() }
)
): Modifier = this
.onClick(
onClick = onClick
)
.onRightClickContextMenu(
items = {
getContextItems(
toggleRead,
toggleBookmarked,
markPreviousAsRead
)
}
)
@Composable
@Stable

View File

@@ -6,17 +6,20 @@
package ca.gosyer.jui.ui.sources.components
import androidx.compose.foundation.PointerMatcher
import androidx.compose.foundation.onClick
import androidx.compose.ui.Modifier
import ca.gosyer.jui.uicore.components.combinedMouseClickable
import androidx.compose.ui.input.pointer.PointerButton
actual fun Modifier.sourceSideMenuItem(
onSourceTabClick: () -> Unit,
onSourceCloseTabClick: () -> Unit
): Modifier = combinedMouseClickable(
onClick = {
onSourceTabClick()
},
onMiddleClick = {
onSourceCloseTabClick()
}
)
): Modifier = this
.onClick(
matcher = PointerMatcher.mouse(PointerButton.Primary),
onClick = onSourceTabClick
)
.onClick(
matcher = PointerMatcher.mouse(PointerButton.Tertiary),
onClick = onSourceCloseTabClick
)

View File

@@ -7,8 +7,8 @@
package ca.gosyer.jui.uicore.components
import androidx.compose.foundation.ContextMenuItem
import androidx.compose.foundation.MouseClickScope
import androidx.compose.foundation.mouseClickable
import androidx.compose.foundation.PointerMatcher
import androidx.compose.foundation.onClick
import androidx.compose.material.CursorDropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.Text
@@ -19,34 +19,12 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.input.pointer.isPrimaryPressed
import androidx.compose.ui.input.pointer.isSecondaryPressed
import androidx.compose.ui.input.pointer.isTertiaryPressed
import androidx.compose.ui.platform.debugInspectorInfo
import androidx.compose.ui.semantics.AccessibilityAction
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.input.pointer.PointerButton
fun Modifier.contextMenuClickable(
fun Modifier.onRightClickContextMenu(
items: @Composable () -> List<ContextMenuItem>,
onClickLabel: String? = null,
onMiddleClickLabel: String? = null,
onRightClickLabel: String? = null,
onClick: MouseClickScope.() -> Unit = {},
onMiddleClick: MouseClickScope.() -> Unit = {},
enabled: Boolean = true
) = composed(
inspectorInfo = debugInspectorInfo {
name = "contextMenuClickable"
properties["onClick"] = onClick
properties["onMiddleClick"] = onMiddleClick
properties["enabled"] = enabled
properties["onClickLabel"] = onClickLabel
properties["onMiddleClickLabel"] = onMiddleClickLabel
properties["onRightClickLabel"] = onRightClickLabel
}
) {
enabled: Boolean = true,
) = composed {
var expanded by remember { mutableStateOf(false) }
CursorDropdownMenu(
expanded,
@@ -63,72 +41,9 @@ fun Modifier.contextMenuClickable(
}
}
}
Modifier.combinedMouseClickable(
onClick = onClick,
onMiddleClick = onMiddleClick,
onClickLabel = onClickLabel,
onMiddleClickLabel = onMiddleClickLabel,
onRightClickLabel = onRightClickLabel,
onRightClick = { expanded = true },
enabled = enabled
)
}
fun Modifier.combinedMouseClickable(
enabled: Boolean = true,
onClickLabel: String? = null,
onMiddleClickLabel: String? = null,
onRightClickLabel: String? = null,
role: Role? = null,
onClick: MouseClickScope.() -> Unit = {},
onMiddleClick: MouseClickScope.() -> Unit = {},
onRightClick: MouseClickScope.() -> Unit = {}
) = composed(
inspectorInfo = debugInspectorInfo {
name = "combinedMouseClickable"
properties["enabled"] = enabled
properties["onClickLabel"] = onClickLabel
properties["onMiddleClickLabel"] = onMiddleClickLabel
properties["onRightClickLabel"] = onRightClickLabel
properties["role"] = role
properties["onClick"] = onClick
properties["onMiddleClick"] = onMiddleClick
properties["onRightClick"] = onRightClick
}
) {
Modifier
.mouseClickable(
enabled,
onClickLabel,
role
) {
when {
buttons.isPrimaryPressed -> onClick()
buttons.isSecondaryPressed -> onRightClick()
buttons.isTertiaryPressed -> onMiddleClick()
}
}
.semantics(mergeDescendants = true) {
this[DesktopSemanticsActions.onMiddleClick] = AccessibilityAction(onMiddleClickLabel) { onMiddleClick(); true }
this[DesktopSemanticsActions.onRightClick] = AccessibilityAction(onRightClickLabel) { onRightClick(); true }
}
}
private object DesktopSemanticsActions {
val onRightClick = ActionPropertyKey<MouseClickScope.() -> Boolean>("OnRightClick")
val onMiddleClick = ActionPropertyKey<MouseClickScope.() -> Boolean>("OnMiddleClick")
}
private fun <T : Function<Boolean>> ActionPropertyKey(
name: String
): SemanticsPropertyKey<AccessibilityAction<T>> {
return SemanticsPropertyKey(
name = name,
mergePolicy = { parentValue, childValue ->
AccessibilityAction(
parentValue?.label ?: childValue.label,
parentValue?.action ?: childValue.action
)
}
Modifier.onClick(
enabled = enabled,
matcher = PointerMatcher.mouse(PointerButton.Secondary),
onClick = { expanded = true },
)
}