Bläddra i källkod

navigation code cleanup

Milan Jurkulak 3 år sedan
förälder
incheckning
1acf64b41d

+ 15 - 0
app/src/main/kotlin/org/mjdev/tvapp/base/navigation/NavHostControllerEx.kt

@@ -36,6 +36,9 @@ class NavHostControllerEx(
     @OptIn(ExperimentalTvMaterial3Api::class)
     val settingsDrawerState: DrawerState = DrawerState(DrawerValue.Closed)
 
+    @OptIn(ExperimentalTvMaterial3Api::class)
+    val menuDrawerState: DrawerState = DrawerState(DrawerValue.Closed)
+
     val menuState: MutableState<Boolean> = mutableStateOf(true)
 
     val menuItems: SnapshotStateList<MenuItem> = mutableStateListOf()
@@ -114,4 +117,16 @@ class NavHostControllerEx(
         settingsDrawerState.setValue(DrawerValue.Closed)
     }
 
+    @OptIn(ExperimentalTvMaterial3Api::class)
+    fun openMenu() {
+        menuDrawerState.setValue(DrawerValue.Open)
+    }
+
+    @OptIn(ExperimentalTvMaterial3Api::class)
+    fun closeMenu() {
+        menuDrawerState.setValue(DrawerValue.Closed)
+    }
+
+    val isMenuEnabled: Boolean get() = menuState.value
+
 }

+ 0 - 58
app/src/main/kotlin/org/mjdev/tvapp/base/navigation/NavigationState.kt

@@ -1,58 +0,0 @@
-/*
- * Copyright (c) Milan Jurkulák 2023.
- *  Contact:
- *  e: mimoccc@gmail.com
- *  e: mj@mjdev.org
- *  w: https://mjdev.org
- */
-
-package org.mjdev.tvapp.base.navigation
-
-import androidx.compose.runtime.Composable
-import androidx.tv.material3.DrawerState
-import androidx.tv.material3.DrawerValue
-import androidx.tv.material3.ExperimentalTvMaterial3Api
-import androidx.tv.material3.rememberDrawerState
-
-@Suppress("unused")
-@OptIn(ExperimentalTvMaterial3Api::class)
-class NavigationState constructor(
-    val navController: NavHostControllerEx,
-    val drawerState: DrawerState = DrawerState(DrawerValue.Open),
-) {
-
-    fun openDrawer() {
-        drawerState.open()
-    }
-
-    fun closeDrawer() {
-        drawerState.close()
-    }
-
-}
-
-@OptIn(ExperimentalTvMaterial3Api::class)
-fun DrawerState.open() {
-    if (currentValue == DrawerValue.Closed) {
-        setValue(DrawerValue.Open)
-    }
-}
-
-@OptIn(ExperimentalTvMaterial3Api::class)
-fun DrawerState.close() {
-    if (currentValue == DrawerValue.Open) {
-        setValue(DrawerValue.Closed)
-    }
-}
-
-@OptIn(ExperimentalTvMaterial3Api::class)
-@Composable
-fun rememberNavigationState(
-    navController: NavHostControllerEx,
-    drawerState: DrawerState = rememberDrawerState(
-        initialValue = DrawerValue.Open
-    ),
-) = NavigationState(
-    navController = navController,
-    drawerState = drawerState,
-)

+ 6 - 20
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/navigation/NavDrawerContent.kt

@@ -20,15 +20,11 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.tooling.preview.Preview
-import androidx.tv.material3.DrawerState
-import androidx.tv.material3.DrawerValue
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import org.mjdev.tvapp.base.extensions.NavExt.rememberNavControllerEx
 import org.mjdev.tvapp.base.navigation.MenuItem
 import org.mjdev.tvapp.base.navigation.NavHostControllerEx
-import org.mjdev.tvapp.base.navigation.NavigationState
 import org.mjdev.tvapp.base.navigation.Screen.Companion.open
-import org.mjdev.tvapp.base.navigation.rememberNavigationState
 
 @SuppressLint("AutoboxingStateValueProperty")
 @OptIn(ExperimentalTvMaterial3Api::class)
@@ -36,10 +32,6 @@ import org.mjdev.tvapp.base.navigation.rememberNavigationState
 @Composable
 fun NavDrawerContent(
     navController: NavHostControllerEx = rememberNavControllerEx(),
-    navigationState: NavigationState = rememberNavigationState(
-        navController = navController,
-        drawerState = DrawerState(DrawerValue.Open)
-    ),
     backgroundColor: Color = Color(0xff202020),
     onDrawerItemClick: (id: Int) -> Unit = { id ->
         navController.menuItem(id).let { menuItem ->
@@ -62,25 +54,19 @@ fun NavDrawerContent(
         }
     },
 ) {
-
     val focusedIdx = remember { mutableIntStateOf(-1) }
-
     val topItems = navController.menuItems.filter { mi ->
         mi.menuGravity == MenuItem.Gravity.Top
     }
-
     val bottomItems = navController.menuItems.filter { mi ->
         mi.menuGravity == MenuItem.Gravity.Bottom
     }
-
     val centerItems = navController.menuItems.filter { mi ->
         mi.menuGravity == MenuItem.Gravity.Center
     }
-
     val itemId: (menuItem: MenuItem) -> Int = { menuItem ->
         navController.indexOfMenuItem(menuItem)
     }
-
     Column(
         modifier = Modifier
             .fillMaxHeight()
@@ -92,11 +78,11 @@ fun NavDrawerContent(
             if (menuItem.isEnabled) {
                 NavigationRow(
                     id = itemId(menuItem),
-                    drawerState = navigationState.drawerState,
+                    drawerState = navController.menuDrawerState,
                     icon = menuItem.menuIcon,
                     text = menuItem.menuText,
                     onFocus = { id ->
-                        navigationState.openDrawer()
+                        navController.openMenu()
                         focusedIdx.value = id
                         onDrawerItemFocus(id)
                     },
@@ -117,11 +103,11 @@ fun NavDrawerContent(
             if (menuItem.isEnabled) {
                 NavigationRow(
                     id = itemId(menuItem),
-                    drawerState = navigationState.drawerState,
+                    drawerState = navController.menuDrawerState,
                     icon = menuItem.menuIcon,
                     text = menuItem.menuText,
                     onFocus = { id ->
-                        navigationState.openDrawer()
+                        navController.openMenu()
                         focusedIdx.value = id
                         onDrawerItemFocus(id)
                     },
@@ -142,11 +128,11 @@ fun NavDrawerContent(
             if (menuItem.isEnabled) {
                 NavigationRow(
                     id = itemId(menuItem),
-                    drawerState = navigationState.drawerState,
+                    drawerState = navController.menuDrawerState,
                     text = menuItem.menuText,
                     icon = menuItem.menuIcon,
                     onFocus = { id ->
-                        navigationState.openDrawer()
+                        navController.openMenu()
                         focusedIdx.value = id
                         onDrawerItemFocus(id)
                     },

+ 8 - 18
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/navigation/Navigation.kt

@@ -20,17 +20,13 @@ import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Shape
 import androidx.compose.ui.unit.Dp
 import androidx.compose.ui.unit.dp
-import androidx.tv.material3.DrawerValue
 import androidx.tv.material3.ExperimentalTvMaterial3Api
 import androidx.tv.material3.NavigationDrawer
-import androidx.tv.material3.rememberDrawerState
 import org.mjdev.tvapp.base.annotations.TvPreview
 import org.mjdev.tvapp.base.extensions.ComposeExt.isEditMode
 import org.mjdev.tvapp.base.extensions.NavExt.rememberNavControllerEx
 import org.mjdev.tvapp.base.navigation.MenuItem
 import org.mjdev.tvapp.base.navigation.NavHostControllerEx
-import org.mjdev.tvapp.base.navigation.NavigationState
-import org.mjdev.tvapp.base.navigation.rememberNavigationState
 
 @SuppressLint("AutoboxingStateValueProperty")
 @OptIn(ExperimentalTvMaterial3Api::class)
@@ -39,28 +35,23 @@ import org.mjdev.tvapp.base.navigation.rememberNavigationState
 fun Navigation(
     modifier: Modifier = Modifier,
     navController: NavHostControllerEx = rememberNavControllerEx(),
-    navigationState: NavigationState = rememberNavigationState(
-        navController = navController,
-        drawerState = rememberDrawerState(
-            initialValue = DrawerValue.Closed
-        )
-    ),
     backgroundColor: Color = Color(0xff202020),
     roundCornerSize: Dp = 8.dp,
     borderSize: Dp = 0.dp,
     borderColor: Color = Color.Transparent,
     shape: Shape = RoundedCornerShape(roundCornerSize),
     content: @Composable () -> Unit = {},
-    menuItems: List<MenuItem> = listOf()
+    menuItems: List<MenuItem> = listOf(),
+    isEdit: Boolean = isEditMode()
 ) {
 
-    val isEdit = isEditMode()
-
-    if (isEdit) navigationState.openDrawer()
+    if (isEdit) {
+        navController.openMenu()
+    }
 
     navController.addMenuItem(*menuItems.toTypedArray())
 
-    if (navController.menuState.value) {
+    if (navController.isMenuEnabled) {
         SettingsDrawer(
             drawerState = navController.settingsDrawerState,
             modifier = modifier
@@ -73,6 +64,7 @@ fun Navigation(
                     .fillMaxHeight()
                     .background(backgroundColor, shape)
                     .border(borderSize, borderColor, shape),
+                drawerState = navController.menuDrawerState,
                 content = {
                     Box(
                         modifier.fillMaxHeight()
@@ -80,14 +72,12 @@ fun Navigation(
                         content()
                     }
                 },
-                drawerState = navigationState.drawerState,
                 drawerContent = { state ->
                     NavDrawerContent(
                         backgroundColor = backgroundColor,
                         navController = navController,
-                        navigationState = navigationState,
                     )
-                    navigationState.drawerState.setValue(state)
+                    navController.menuDrawerState.setValue(state)
                 }
             )
         }

+ 4 - 2
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/navigation/NavigationRow.kt

@@ -69,7 +69,7 @@ fun NavigationRow(
 //            0.9f to Color.Green,
 //        )
 //        .build(),
-    drawerState: DrawerState = rememberDrawerState(initialValue = DrawerValue.Open),
+    drawerState: DrawerState = rememberDrawerState(DrawerValue.Closed),
     focusState: MutableState<FocusState?> = rememberFocusState(),
     onFocus: (id: Int) -> Unit = {},
     onClick: (id: Int) -> Unit = {},
@@ -93,7 +93,9 @@ fun NavigationRow(
         focusedColor = focusedColor.copy(alpha = 0.5f),
         unFocusedColor = Color.Transparent,
         onFocus = {
-            onFocus(id)
+            if (focusState.isFocused) {
+                onFocus(id)
+            }
         },
         onClick = {
             onClick(id)

+ 1 - 1
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/screen/ScreenView.kt

@@ -27,7 +27,7 @@ fun ScreenView(
 ) {
     Box(
         modifier = Modifier.fillMaxSize(),
-        contentAlignment = Alignment.BottomCenter,
+        contentAlignment = Alignment.TopStart,
     ) {
         if (navController.menuState.value) {
             Navigation(

+ 0 - 3
app/src/main/kotlin/org/mjdev/tvapp/base/ui/components/tv/CategoryRow.kt

@@ -20,7 +20,6 @@ import androidx.compose.ui.unit.dp
 import androidx.tv.foundation.lazy.list.TvLazyListState
 import androidx.tv.foundation.lazy.list.rememberTvLazyListState
 import androidx.tv.material3.ExperimentalTvMaterial3Api
-import org.mjdev.tvapp.base.extensions.ModifierExt.rememberFocusState
 import org.mjdev.tvapp.base.ui.components.card.PhotoCard
 import org.mjdev.tvapp.base.ui.components.text.TextAny
 
@@ -33,7 +32,6 @@ fun CategoryRow(
     rowState: TvLazyListState = rememberTvLazyListState(),
     onItemClick: (item: Any?) -> Unit = {},
 ) {
-    val focusState = rememberFocusState()
     TextAny(
         modifier = Modifier
             .fillMaxWidth()
@@ -49,7 +47,6 @@ fun CategoryRow(
     ) {
         items(items) { item ->
             PhotoCard(
-                focusState = focusState,
                 item = item,
                 onClick = onItemClick,
             )