mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-10 06:42:05 +01:00
Improve reader hotkeys
This commit is contained in:
@@ -36,6 +36,7 @@ import androidx.compose.runtime.collectAsState
|
|||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
@@ -43,7 +44,9 @@ import androidx.compose.ui.graphics.FilterQuality
|
|||||||
import androidx.compose.ui.graphics.ImageBitmap
|
import androidx.compose.ui.graphics.ImageBitmap
|
||||||
import androidx.compose.ui.input.key.Key
|
import androidx.compose.ui.input.key.Key
|
||||||
import androidx.compose.ui.input.key.KeyEvent
|
import androidx.compose.ui.input.key.KeyEvent
|
||||||
|
import androidx.compose.ui.input.key.KeyEventType
|
||||||
import androidx.compose.ui.input.key.key
|
import androidx.compose.ui.input.key.key
|
||||||
|
import androidx.compose.ui.input.key.type
|
||||||
import androidx.compose.ui.layout.ContentScale
|
import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
@@ -79,6 +82,21 @@ import ca.gosyer.util.lang.launchApplication
|
|||||||
import io.kamel.core.config.KamelConfig
|
import io.kamel.core.config.KamelConfig
|
||||||
import io.kamel.image.config.LocalKamelConfig
|
import io.kamel.image.config.LocalKamelConfig
|
||||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||||
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
import kotlinx.coroutines.flow.SharedFlow
|
||||||
|
import kotlinx.coroutines.flow.collectLatest
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
val supportedKeyList = listOf(
|
||||||
|
Key.W,
|
||||||
|
Key.DirectionUp,
|
||||||
|
Key.S,
|
||||||
|
Key.DirectionDown,
|
||||||
|
Key.A,
|
||||||
|
Key.DirectionLeft,
|
||||||
|
Key.D,
|
||||||
|
Key.DirectionRight
|
||||||
|
)
|
||||||
|
|
||||||
@OptIn(DelicateCoroutinesApi::class)
|
@OptIn(DelicateCoroutinesApi::class)
|
||||||
fun openReaderMenu(chapterIndex: Int, mangaId: Long) {
|
fun openReaderMenu(chapterIndex: Int, mangaId: Long) {
|
||||||
@@ -94,10 +112,9 @@ fun openReaderMenu(chapterIndex: Int, mangaId: Long) {
|
|||||||
val kamelConfig = AppScope.getInstance<KamelConfig>()
|
val kamelConfig = AppScope.getInstance<KamelConfig>()
|
||||||
|
|
||||||
launchApplication {
|
launchApplication {
|
||||||
|
val scope = rememberCoroutineScope()
|
||||||
|
val hotkeyFlow = remember { MutableSharedFlow<KeyEvent>() }
|
||||||
val icon = painterResource("icon.png")
|
val icon = painterResource("icon.png")
|
||||||
var shortcuts by remember {
|
|
||||||
mutableStateOf(emptyMap<Key, ((KeyEvent) -> Boolean)>())
|
|
||||||
}
|
|
||||||
val windowState = rememberWindowState(size = size, position = position, placement = placement)
|
val windowState = rememberWindowState(size = size, position = position, placement = placement)
|
||||||
DisposableEffect(Unit) {
|
DisposableEffect(Unit) {
|
||||||
onDispose {
|
onDispose {
|
||||||
@@ -119,7 +136,11 @@ fun openReaderMenu(chapterIndex: Int, mangaId: Long) {
|
|||||||
icon = icon,
|
icon = icon,
|
||||||
state = windowState,
|
state = windowState,
|
||||||
onKeyEvent = {
|
onKeyEvent = {
|
||||||
shortcuts[it.key]?.invoke(it) ?: false
|
if (it.type != KeyEventType.KeyDown) return@Window false
|
||||||
|
scope.launch {
|
||||||
|
hotkeyFlow.emit(it)
|
||||||
|
}
|
||||||
|
it.key in supportedKeyList
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
CompositionLocalProvider(
|
CompositionLocalProvider(
|
||||||
@@ -127,7 +148,7 @@ fun openReaderMenu(chapterIndex: Int, mangaId: Long) {
|
|||||||
LocalKamelConfig provides kamelConfig
|
LocalKamelConfig provides kamelConfig
|
||||||
) {
|
) {
|
||||||
AppTheme {
|
AppTheme {
|
||||||
ReaderMenu(chapterIndex, mangaId) { shortcuts = it }
|
ReaderMenu(chapterIndex, mangaId, hotkeyFlow)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,7 +159,7 @@ fun openReaderMenu(chapterIndex: Int, mangaId: Long) {
|
|||||||
fun ReaderMenu(
|
fun ReaderMenu(
|
||||||
chapterIndex: Int,
|
chapterIndex: Int,
|
||||||
mangaId: Long,
|
mangaId: Long,
|
||||||
setHotkeys: (Map<Key, ((KeyEvent) -> Boolean)>) -> Unit
|
hotkeyFlow: SharedFlow<KeyEvent>
|
||||||
) {
|
) {
|
||||||
val vm = viewModel<ReaderMenuViewModel> {
|
val vm = viewModel<ReaderMenuViewModel> {
|
||||||
ReaderMenuViewModel.Params(chapterIndex, mangaId)
|
ReaderMenuViewModel.Params(chapterIndex, mangaId)
|
||||||
@@ -168,19 +189,15 @@ fun ReaderMenu(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(hotkeyFlow) {
|
||||||
setHotkeys(
|
hotkeyFlow.collectLatest {
|
||||||
mapOf(
|
when (it.key) {
|
||||||
Key.W to hotkey { vm.navigate(Navigation.PREV) },
|
Key.W, Key.DirectionUp -> vm.navigate(Navigation.PREV)
|
||||||
Key.DirectionUp to hotkey { vm.navigate(Navigation.PREV) },
|
Key.S, Key.DirectionDown -> vm.navigate(Navigation.NEXT)
|
||||||
Key.S to hotkey { vm.navigate(Navigation.NEXT) },
|
Key.A, Key.DirectionLeft -> vm.navigate(Navigation.LEFT)
|
||||||
Key.DirectionDown to hotkey { vm.navigate(Navigation.NEXT) },
|
Key.D, Key.DirectionRight -> vm.navigate(Navigation.RIGHT)
|
||||||
Key.A to hotkey { vm.navigate(Navigation.LEFT) },
|
}
|
||||||
Key.DirectionLeft to hotkey { vm.navigate(Navigation.LEFT) },
|
}
|
||||||
Key.D to hotkey { vm.navigate(Navigation.RIGHT) },
|
|
||||||
Key.DirectionRight to hotkey { vm.navigate(Navigation.RIGHT) }
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
DisposableEffect(Unit) {
|
DisposableEffect(Unit) {
|
||||||
onDispose(vm::sendProgress)
|
onDispose(vm::sendProgress)
|
||||||
|
|||||||
Reference in New Issue
Block a user