Milan Jurkulak 3 gadi atpakaļ
vecāks
revīzija
2b81f7d4c6

+ 19 - 0
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/card/CardFocus.kt

@@ -0,0 +1,19 @@
+/*
+ *  Copyright (c) Milan Jurkulák 2023.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package org.mjdev.tvlib.ui.components.card
+
+import androidx.compose.ui.focus.FocusState
+
+class CardFocus(
+    private var focused: Boolean
+) : FocusState {
+    override val hasFocus: Boolean get() = focused
+    override val isCaptured: Boolean get() = focused
+    override val isFocused: Boolean get() = focused
+}

+ 6 - 2
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/card/ItemCard.kt

@@ -29,6 +29,7 @@ import androidx.tv.material3.CardScale
 import androidx.tv.material3.CardShape
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import org.mjdev.tvlib.extensions.ComposeExt.computeCardWidth
+import org.mjdev.tvlib.extensions.ComposeExt.isEditMode
 import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusRequester
 import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusState
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
@@ -61,9 +62,12 @@ fun ItemCard(
         )
     },
     cardWidth: Dp = computeCardWidth(),
-    focusState: MutableState<FocusState?> = rememberFocusState(item),
+    focused: Boolean = isEditMode(),
+    focusState: MutableState<FocusState?> = rememberFocusState(
+        item,
+        CardFocus(focused)
+    ),
     focusRequester: FocusRequester = rememberFocusRequester(item),
-    focused: Boolean = false,
     titlePadding: PaddingValues = PaddingValues(8.dp),
     onFocus: (item: Any?) -> Unit = {},
     onClick: (item: Any?) -> Unit = {},

+ 8 - 2
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/card/PhotoCard.kt

@@ -25,7 +25,9 @@ import androidx.compose.ui.unit.dp
 import androidx.tv.material3.CardDefaults
 import androidx.tv.material3.CardScale
 import androidx.tv.material3.ExperimentalTvMaterial3Api
+import org.mjdev.tvlib.extensions.ComposeExt
 import org.mjdev.tvlib.extensions.ComposeExt.computeCardWidth
+import org.mjdev.tvlib.extensions.ComposeExt.isFocused
 import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusRequester
 import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusState
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
@@ -42,9 +44,12 @@ fun PhotoCard(
     modifier: Modifier = Modifier,
     contentScale: ContentScale = ContentScale.Crop,
     textColor: Color = Color.White,
-    focusState: MutableState<FocusState?> = rememberFocusState(item),
+    focused: Boolean = ComposeExt.isEditMode(),
+    focusState: MutableState<FocusState?> = rememberFocusState(
+        item,
+        CardFocus(focused)
+    ),
     focusRequester: FocusRequester = rememberFocusRequester(item),
-    focused: Boolean = false,
     @FloatRange(from = 0.0, to = 10.0)
     contrast: Float = 5f,
     @FloatRange(from = -255.0, to = 255.0)
@@ -56,6 +61,7 @@ fun PhotoCard(
             contentScale = contentScale,
             contrast = contrast,
             brightness = brightness,
+            borderColor = if (focusState.isFocused) Color.Green else Color.Black,
             contentDescription = (item as? ItemWithDescription<*>)?.description?.toString(),
         )
     },

+ 4 - 2
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/carousel/BigCarousel.kt

@@ -22,6 +22,7 @@ import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.tv.material3.CardScale
 import androidx.tv.material3.ExperimentalTvMaterial3Api
+import org.mjdev.tvlib.extensions.ComposeExt.rememberFocusState
 import org.mjdev.tvlib.extensions.ModifierExt.detectSwipe
 import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
 
@@ -41,6 +42,7 @@ fun BigCarousel(
         if (config.orientation == Configuration.ORIENTATION_PORTRAIT) config.screenWidthDp * 0.4f
         else config.screenHeightDp * 0.4f
     }
+    val focusState = rememberFocusState(items)
     Carousel(
         autoScrollDurationMillis = autoScrollDurationMillis,
         carouselState = carouselState,
@@ -59,7 +61,7 @@ fun BigCarousel(
                     },
                 )
             },
-    ) { isFocused, indexOfCarouselItem ->
+    ) {indexOfCarouselItem ->
         val selectedItem = items[indexOfCarouselItem]
         onItemSelected(selectedItem)
         CarouselCard(
@@ -69,7 +71,7 @@ fun BigCarousel(
                 .height(height.dp),
             contentScale = ContentScale.Crop,
             scale = CardScale.None,
-            focused = isFocused,
+            focusState = focusState,
             onFocus = onItemSelected,
             onClick = {
                 onItemClicked(selectedItem)

+ 1 - 3
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/carousel/Carousel.kt

@@ -64,7 +64,7 @@ fun Carousel(
                 .padding(16.dp),
         )
     },
-    content: @Composable AnimatedContentScope.(isFocused:Boolean, index: Int) -> Unit
+    content: @Composable AnimatedContentScope.(index: Int) -> Unit
 ) {
 
     CarouselStateUpdater(carouselState, itemCount)
@@ -134,9 +134,7 @@ fun Carousel(
                 }
             }
             if (itemCount > 0) {
-                val isFocused = focusState?.let { f -> f.isFocused || f.hasFocus } ?: false
                 content(
-                    isFocused,
                     if (activeItemIndex < itemCount) activeItemIndex else 0
                 )
             }

+ 8 - 3
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/carousel/CarouselCard.kt

@@ -28,6 +28,7 @@ import org.mjdev.tvlib.extensions.ModifierExt.recomposeHighlighter
 import org.mjdev.tvlib.interfaces.ItemWithBackground
 import org.mjdev.tvlib.interfaces.ItemWithDescription
 import org.mjdev.tvlib.interfaces.ItemWithImage
+import org.mjdev.tvlib.ui.components.card.CardFocus
 import org.mjdev.tvlib.ui.components.card.PhotoCard
 import org.mjdev.tvlib.ui.components.image.ImageAny
 
@@ -40,8 +41,11 @@ fun CarouselCard(
     modifier: Modifier = Modifier,
     contentScale: ContentScale = ContentScale.Crop,
     scale: CardScale = CardScale.None,
-    focusState: MutableState<FocusState?> = rememberFocusState(item),
-    focused: Boolean = false,
+    focused: Boolean = isEditMode(),
+    focusState: MutableState<FocusState?> = rememberFocusState(
+        item,
+        CardFocus(focused)
+    ),
     imageRenderer: @Composable () -> Unit = {
         val image = (item as? ItemWithImage<*>)?.image
         val background = (item as? ItemWithBackground<*>)?.background
@@ -65,9 +69,10 @@ fun CarouselCard(
             }
             .recomposeHighlighter(),
         aspectRatio = 1f,
+        focused = focused,
+        focusState = focusState,
         contentScale = contentScale,
         scale = scale,
-        focused = focused,
         imageRenderer = imageRenderer,
         titlePadding = titlePadding,
         onFocus = onFocus,

+ 15 - 13
tvlib/src/main/kotlin/org/mjdev/tvlib/ui/components/complex/FocusableCard.kt

@@ -18,7 +18,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.MutableState
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.focus.FocusRequester
@@ -52,12 +51,12 @@ import org.mjdev.tvlib.interfaces.ItemWithDescription
 import org.mjdev.tvlib.interfaces.ItemWithImage
 import org.mjdev.tvlib.interfaces.ItemWithSubtitle
 import org.mjdev.tvlib.interfaces.ItemWithTitle
+import org.mjdev.tvlib.ui.components.card.CardFocus
 import org.mjdev.tvlib.ui.components.card.colorFocusBorder
 import org.mjdev.tvlib.ui.components.card.colorFocusGlow
 import org.mjdev.tvlib.ui.components.image.ImageAny
 import org.mjdev.tvlib.ui.components.text.AutoHideEmptyText
 import org.mjdev.tvlib.ui.components.text.TextAny
-import timber.log.Timber
 
 @SuppressLint("ModifierParameter")
 @OptIn(ExperimentalTvMaterial3Api::class)
@@ -83,9 +82,12 @@ fun FocusableCard(
             contentScale = contentScale,
         )
     },
+    focused: Boolean = isEditMode(),
     focusRequester: FocusRequester = rememberFocusRequester(item),
-    focusState: MutableState<FocusState?> = rememberFocusState(item),
-    focused: Boolean = false,
+    focusState: MutableState<FocusState?> = rememberFocusState(
+        item,
+        CardFocus(focused)
+    ),
     onFocus: (item: Any?) -> Unit = {},
     onFocusChange: (state: FocusState) -> Unit = { state ->
         if (state.isFocused || state.hasFocus) {
@@ -174,13 +176,13 @@ fun FocusableCard(
             onClick(item)
         },
     )
-    LaunchedEffect(focused) {
-        try {
-            if (focused) {
-                focusRequester.requestFocus()
-            }
-        } catch (e: Exception) {
-            Timber.e(e)
-        }
-    }
+//    LaunchedEffect(focused) {
+//        try {
+//            if (focused) {
+//                focusRequester.requestFocus()
+//            }
+//        } catch (e: Exception) {
+//            Timber.e(e)
+//        }
+//    }
 }