diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt
index bd705e5b4..c057693e2 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/ComposeController.kt
@@ -51,28 +51,6 @@ abstract class ComposeController
>(bundle: Bundle? = null) :
}
}
-/**
- * Basic Compose controller without a presenter.
- */
-abstract class BasicComposeController(bundle: Bundle? = null) :
- BaseController(bundle),
- ComposeContentController {
-
- override fun createBinding(inflater: LayoutInflater) =
- ComposeControllerBinding.inflate(inflater)
-
- override fun onViewCreated(view: View) {
- super.onViewCreated(view)
-
- binding.root.apply {
- setComposeContent {
- val nestedScrollInterop = rememberNestedScrollInteropConnection()
- ComposeContent(nestedScrollInterop)
- }
- }
- }
-}
-
/**
* Basic Compose controller without a presenter.
*/
diff --git a/app/src/main/java/exh/debug/SettingsDebugController.kt b/app/src/main/java/exh/debug/SettingsDebugController.kt
index 6537d577b..1b5205997 100644
--- a/app/src/main/java/exh/debug/SettingsDebugController.kt
+++ b/app/src/main/java/exh/debug/SettingsDebugController.kt
@@ -3,18 +3,24 @@ package exh.debug
import android.app.Activity
import android.util.Log
import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.Crossfade
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.forEachGesture
import androidx.compose.foundation.gestures.waitForUpOrCancellation
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.WindowInsetsSides
+import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBars
+import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.windowInsetsBottomHeight
+import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.selection.SelectionContainer
@@ -23,6 +29,8 @@ import androidx.compose.material3.AlertDialog
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
+import androidx.compose.material3.TopAppBarDefaults
+import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -33,19 +41,22 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.unit.dp
import eu.kanade.core.prefs.PreferenceMutableState
+import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.components.Divider
-import eu.kanade.presentation.components.LazyColumn
import eu.kanade.presentation.components.LoadingScreen
import eu.kanade.presentation.components.PreferenceRow
+import eu.kanade.presentation.components.Scaffold
+import eu.kanade.presentation.components.ScrollbarLazyColumn
import eu.kanade.presentation.components.SwitchPreference
-import eu.kanade.tachiyomi.ui.base.controller.BasicComposeController
+import eu.kanade.presentation.util.plus
+import eu.kanade.presentation.util.topPaddingValues
+import eu.kanade.tachiyomi.ui.base.controller.BasicFullComposeController
import exh.util.capitalize
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -55,16 +66,14 @@ import kotlin.reflect.KFunction
import kotlin.reflect.KVisibility
import kotlin.reflect.full.declaredFunctions
-class SettingsDebugController : BasicComposeController() {
-
- override fun getTitle(): String {
- return "DEBUG MENU"
- }
+class SettingsDebugController : BasicFullComposeController() {
data class DebugToggle(val name: String, val pref: PreferenceMutableState, val default: Boolean)
@Composable
- override fun ComposeContent(nestedScrollInterop: NestedScrollConnection) {
+ override fun ComposeContent() {
+ val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
+ val insets = WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal)
val functions by produceState, String>>?>(initialValue = null) {
value = withContext(Dispatchers.Default) {
DebugFunctions::class.declaredFunctions.filter {
@@ -81,20 +90,42 @@ class SettingsDebugController : BasicComposeController() {
DebugToggles.values().map { DebugToggle(it.name, it.asPref(viewScope), it.default) }
}
}
- if (functions == null) {
- LoadingScreen()
- return
+ Scaffold(
+ modifier = Modifier
+ .windowInsetsPadding(insets)
+ .nestedScroll(scrollBehavior.nestedScrollConnection),
+ topBar = {
+ AppBar(
+ title = "DEBUG MENU",
+ scrollBehavior = scrollBehavior,
+ )
+ },
+ ) { paddingValues ->
+ Crossfade(functions == null) {
+ when (it) {
+ true -> LoadingScreen()
+ false -> FunctionList(paddingValues, functions.orEmpty(), toggles)
+ }
+ }
}
+ }
+ @Composable
+ fun FunctionList(
+ paddingValues: PaddingValues,
+ functions: List, String>>,
+ toggles: List
+ ) {
val scope = rememberCoroutineScope()
- Box(
- Modifier
- .fillMaxSize()
- .nestedScroll(nestedScrollInterop),
- ) {
+ Box(Modifier.fillMaxSize()) {
var running by remember { mutableStateOf(false) }
var result by remember { mutableStateOf?>(null) }
- LazyColumn(Modifier.fillMaxSize()) {
+ ScrollbarLazyColumn(
+ Modifier.fillMaxSize(),
+ contentPadding = paddingValues +
+ WindowInsets.navigationBars.only(WindowInsetsSides.Vertical).asPaddingValues() +
+ topPaddingValues,
+ ) {
item {
Text(
text = "Functions",
@@ -103,7 +134,7 @@ class SettingsDebugController : BasicComposeController() {
modifier = Modifier.padding(16.dp),
)
}
- items(functions.orEmpty()) { (func, name) ->
+ items(functions) { (func, name) ->
PreferenceRow(
title = name,
onClick = {