mirror of
https://github.com/tapframe/NuvioStreaming.git
synced 2026-05-19 00:11:45 +00:00
feat: implement nuvioSecondaryClick modifier for secondary click handling
This commit is contained in:
parent
89ca233f71
commit
76cce3180f
9 changed files with 54 additions and 4 deletions
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.nuvio.app.core.ui
|
||||||
|
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
|
||||||
|
internal actual fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier = this
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.nuvio.app.core.ui
|
||||||
|
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
|
||||||
|
internal expect fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier
|
||||||
|
|
@ -343,10 +343,11 @@ internal fun Modifier.posterCardClickable(
|
||||||
onLongClick: (() -> Unit)?,
|
onLongClick: (() -> Unit)?,
|
||||||
): Modifier =
|
): Modifier =
|
||||||
if (onClick != null || onLongClick != null) {
|
if (onClick != null || onLongClick != null) {
|
||||||
combinedClickable(
|
nuvioSecondaryClick(onLongClick)
|
||||||
onClick = { onClick?.invoke() },
|
.combinedClickable(
|
||||||
onLongClick = onLongClick,
|
onClick = { onClick?.invoke() },
|
||||||
)
|
onLongClick = onLongClick,
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
this
|
this
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.nuvio.app.core.ui.AppIconResource
|
import com.nuvio.app.core.ui.AppIconResource
|
||||||
import com.nuvio.app.core.ui.appIconPainter
|
import com.nuvio.app.core.ui.appIconPainter
|
||||||
|
import com.nuvio.app.core.ui.nuvioSecondaryClick
|
||||||
import nuvio.composeapp.generated.resources.Res
|
import nuvio.composeapp.generated.resources.Res
|
||||||
import nuvio.composeapp.generated.resources.action_play
|
import nuvio.composeapp.generated.resources.action_play
|
||||||
import nuvio.composeapp.generated.resources.action_save
|
import nuvio.composeapp.generated.resources.action_save
|
||||||
|
|
@ -70,6 +71,7 @@ fun DetailActionButtons(
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
.nuvioSecondaryClick(onPlayLongClick)
|
||||||
.combinedClickable(
|
.combinedClickable(
|
||||||
onClick = onPlayClick,
|
onClick = onPlayClick,
|
||||||
onLongClick = onPlayLongClick,
|
onLongClick = onPlayLongClick,
|
||||||
|
|
@ -104,6 +106,7 @@ fun DetailActionButtons(
|
||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
.nuvioSecondaryClick(onSaveLongClick)
|
||||||
.combinedClickable(
|
.combinedClickable(
|
||||||
onClick = onSaveClick,
|
onClick = onSaveClick,
|
||||||
onLongClick = onSaveLongClick,
|
onLongClick = onSaveLongClick,
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ import com.nuvio.app.core.format.formatReleaseDateForDisplay
|
||||||
import com.nuvio.app.core.i18n.localizedSeasonEpisodeCode
|
import com.nuvio.app.core.i18n.localizedSeasonEpisodeCode
|
||||||
import com.nuvio.app.core.ui.NuvioAnimatedWatchedBadge
|
import com.nuvio.app.core.ui.NuvioAnimatedWatchedBadge
|
||||||
import com.nuvio.app.core.ui.NuvioProgressBar
|
import com.nuvio.app.core.ui.NuvioProgressBar
|
||||||
|
import com.nuvio.app.core.ui.nuvioSecondaryClick
|
||||||
import com.nuvio.app.features.details.MetaDetails
|
import com.nuvio.app.features.details.MetaDetails
|
||||||
import com.nuvio.app.features.details.MetaEpisodeCardStyle
|
import com.nuvio.app.features.details.MetaEpisodeCardStyle
|
||||||
import com.nuvio.app.features.details.MetaVideo
|
import com.nuvio.app.features.details.MetaVideo
|
||||||
|
|
@ -656,6 +657,7 @@ private fun EpisodeHorizontalCard(
|
||||||
color = Color.White.copy(alpha = 0.12f),
|
color = Color.White.copy(alpha = 0.12f),
|
||||||
shape = cardShape,
|
shape = cardShape,
|
||||||
)
|
)
|
||||||
|
.nuvioSecondaryClick(onLongPress)
|
||||||
.combinedClickable(
|
.combinedClickable(
|
||||||
enabled = onClick != null || onLongPress != null,
|
enabled = onClick != null || onLongPress != null,
|
||||||
onClick = { onClick?.invoke() },
|
onClick = { onClick?.invoke() },
|
||||||
|
|
@ -1011,6 +1013,7 @@ private fun EpisodeListCard(
|
||||||
color = Color.White.copy(alpha = 0.1f),
|
color = Color.White.copy(alpha = 0.1f),
|
||||||
shape = cardShape,
|
shape = cardShape,
|
||||||
)
|
)
|
||||||
|
.nuvioSecondaryClick(onLongPress)
|
||||||
.combinedClickable(
|
.combinedClickable(
|
||||||
enabled = onClick != null || onLongPress != null,
|
enabled = onClick != null || onLongPress != null,
|
||||||
onClick = { onClick?.invoke() },
|
onClick = { onClick?.invoke() },
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ import coil3.compose.AsyncImage
|
||||||
import com.nuvio.app.core.ui.localizedContinueWatchingSubtitle
|
import com.nuvio.app.core.ui.localizedContinueWatchingSubtitle
|
||||||
import com.nuvio.app.core.ui.NuvioProgressBar
|
import com.nuvio.app.core.ui.NuvioProgressBar
|
||||||
import com.nuvio.app.core.ui.NuvioShelfSection
|
import com.nuvio.app.core.ui.NuvioShelfSection
|
||||||
|
import com.nuvio.app.core.ui.nuvioSecondaryClick
|
||||||
import com.nuvio.app.core.ui.posterCardClickable
|
import com.nuvio.app.core.ui.posterCardClickable
|
||||||
import com.nuvio.app.features.watchprogress.ContinueWatchingItem
|
import com.nuvio.app.features.watchprogress.ContinueWatchingItem
|
||||||
import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle
|
import com.nuvio.app.features.watchprogress.ContinueWatchingSectionStyle
|
||||||
|
|
@ -334,6 +335,7 @@ private fun ContinueWatchingWideCard(
|
||||||
color = Color.White.copy(alpha = 0.15f),
|
color = Color.White.copy(alpha = 0.15f),
|
||||||
shape = RoundedCornerShape(layout.cardRadius),
|
shape = RoundedCornerShape(layout.cardRadius),
|
||||||
)
|
)
|
||||||
|
.nuvioSecondaryClick(onLongClick)
|
||||||
.combinedClickable(
|
.combinedClickable(
|
||||||
enabled = onClick != null || onLongClick != null,
|
enabled = onClick != null || onLongClick != null,
|
||||||
onClick = { onClick?.invoke() },
|
onClick = { onClick?.invoke() },
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
import androidx.compose.material3.rememberModalBottomSheetState
|
import androidx.compose.material3.rememberModalBottomSheetState
|
||||||
import coil3.compose.AsyncImage
|
import coil3.compose.AsyncImage
|
||||||
|
import com.nuvio.app.core.ui.nuvioSecondaryClick
|
||||||
import com.nuvio.app.core.ui.nuvioSafeBottomPadding
|
import com.nuvio.app.core.ui.nuvioSafeBottomPadding
|
||||||
import com.nuvio.app.features.watchprogress.WatchProgressRepository
|
import com.nuvio.app.features.watchprogress.WatchProgressRepository
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
@ -963,6 +964,7 @@ private fun StreamCard(
|
||||||
)
|
)
|
||||||
.clip(cardShape)
|
.clip(cardShape)
|
||||||
.background(Color.White.copy(alpha = 0.05f))
|
.background(Color.White.copy(alpha = 0.05f))
|
||||||
|
.nuvioSecondaryClick(if (isEnabled) onLongClick else null)
|
||||||
.combinedClickable(
|
.combinedClickable(
|
||||||
enabled = isEnabled,
|
enabled = isEnabled,
|
||||||
onClick = onClick,
|
onClick = onClick,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.nuvio.app.core.ui
|
||||||
|
|
||||||
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.input.pointer.PointerEventPass
|
||||||
|
import androidx.compose.ui.input.pointer.PointerEventType
|
||||||
|
import androidx.compose.ui.input.pointer.isSecondary
|
||||||
|
import androidx.compose.ui.input.pointer.onPointerEvent
|
||||||
|
|
||||||
|
@OptIn(ExperimentalComposeUiApi::class)
|
||||||
|
internal actual fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier =
|
||||||
|
if (onSecondaryClick != null) {
|
||||||
|
onPointerEvent(
|
||||||
|
eventType = PointerEventType.Press,
|
||||||
|
pass = PointerEventPass.Initial,
|
||||||
|
) { event ->
|
||||||
|
if (event.button?.isSecondary == true) {
|
||||||
|
event.changes.forEach { it.consume() }
|
||||||
|
onSecondaryClick()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package com.nuvio.app.core.ui
|
||||||
|
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
|
||||||
|
internal actual fun Modifier.nuvioSecondaryClick(onSecondaryClick: (() -> Unit)?): Modifier = this
|
||||||
Loading…
Reference in a new issue