|
@@ -16,6 +16,7 @@ import androidx.compose.runtime.Composable
|
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.remember
|
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.Modifier
|
|
|
import androidx.compose.ui.focus.focusRequester
|
|
import androidx.compose.ui.focus.focusRequester
|
|
|
|
|
+import androidx.compose.ui.focus.onFocusChanged
|
|
|
import androidx.compose.ui.input.pointer.pointerInput
|
|
import androidx.compose.ui.input.pointer.pointerInput
|
|
|
import androidx.compose.ui.layout.ContentScale
|
|
import androidx.compose.ui.layout.ContentScale
|
|
|
import androidx.compose.ui.platform.LocalConfiguration
|
|
import androidx.compose.ui.platform.LocalConfiguration
|
|
@@ -24,8 +25,10 @@ import androidx.compose.ui.unit.dp
|
|
|
import androidx.tv.material3.CardScale
|
|
import androidx.tv.material3.CardScale
|
|
|
import androidx.tv.material3.ExperimentalTvMaterial3Api
|
|
import androidx.tv.material3.ExperimentalTvMaterial3Api
|
|
|
import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusRequester
|
|
import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusRequester
|
|
|
|
|
+import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusState
|
|
|
import org.mjdev.tvlib.extensions.ModifierExt.detectSwipe
|
|
import org.mjdev.tvlib.extensions.ModifierExt.detectSwipe
|
|
|
import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
|
|
import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
|
|
|
|
|
+import org.mjdev.tvlib.ui.components.card.FocusHelper
|
|
|
|
|
|
|
|
@OptIn(ExperimentalTvMaterial3Api::class)
|
|
@OptIn(ExperimentalTvMaterial3Api::class)
|
|
|
@SuppressLint("AutoboxingStateValueProperty")
|
|
@SuppressLint("AutoboxingStateValueProperty")
|
|
@@ -44,6 +47,7 @@ fun BigCarousel(
|
|
|
else config.screenHeightDp * 0.4f
|
|
else config.screenHeightDp * 0.4f
|
|
|
}
|
|
}
|
|
|
val focusRequester = rememberFocusRequester()
|
|
val focusRequester = rememberFocusRequester()
|
|
|
|
|
+ val cardFocusState = rememberFocusState()
|
|
|
Carousel(
|
|
Carousel(
|
|
|
autoScrollDurationMillis = autoScrollDurationMillis,
|
|
autoScrollDurationMillis = autoScrollDurationMillis,
|
|
|
carouselState = carouselState,
|
|
carouselState = carouselState,
|
|
@@ -53,14 +57,19 @@ fun BigCarousel(
|
|
|
.focusRequester(focusRequester)
|
|
.focusRequester(focusRequester)
|
|
|
.fillMaxWidth()
|
|
.fillMaxWidth()
|
|
|
.height(height.dp)
|
|
.height(height.dp)
|
|
|
|
|
+ .onFocusChanged { state ->
|
|
|
|
|
+ cardFocusState.value = state
|
|
|
|
|
+ }
|
|
|
.pointerInput(Unit) {
|
|
.pointerInput(Unit) {
|
|
|
detectSwipe(
|
|
detectSwipe(
|
|
|
onSwipeLeft = {
|
|
onSwipeLeft = {
|
|
|
carouselState.moveToNextItem(items.size)
|
|
carouselState.moveToNextItem(items.size)
|
|
|
|
|
+ cardFocusState.value = FocusHelper(true)
|
|
|
focusRequester.requestFocus()
|
|
focusRequester.requestFocus()
|
|
|
},
|
|
},
|
|
|
onSwipeRight = {
|
|
onSwipeRight = {
|
|
|
carouselState.moveToPreviousItem(items.size)
|
|
carouselState.moveToPreviousItem(items.size)
|
|
|
|
|
+ cardFocusState.value = FocusHelper(true)
|
|
|
focusRequester.requestFocus()
|
|
focusRequester.requestFocus()
|
|
|
},
|
|
},
|
|
|
)
|
|
)
|
|
@@ -75,6 +84,7 @@ fun BigCarousel(
|
|
|
.height(height.dp),
|
|
.height(height.dp),
|
|
|
contentScale = ContentScale.Crop,
|
|
contentScale = ContentScale.Crop,
|
|
|
scale = CardScale.None,
|
|
scale = CardScale.None,
|
|
|
|
|
+ focusState = cardFocusState,
|
|
|
onFocus = onItemSelected,
|
|
onFocus = onItemSelected,
|
|
|
onClick = {
|
|
onClick = {
|
|
|
onItemClicked(selectedItem)
|
|
onItemClicked(selectedItem)
|