mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-10 06:42:05 +01:00
Implement downloader reordering
This commit is contained in:
@@ -28,6 +28,9 @@
|
||||
<string name="action_pause">Pause</string>
|
||||
<string name="action_continue">Continue</string>
|
||||
<string name="action_clear_queue">Clear queue</string>
|
||||
<string name="action_move_up">Move up</string>
|
||||
<string name="action_move_down">Move down</string>
|
||||
<string name="action_move_to_top">Move to top</string>
|
||||
<string name="action_move_to_bottom">Move to bottom</string>
|
||||
<string name="action_install">Install</string>
|
||||
<string name="action_uninstall">Uninstall</string>
|
||||
|
||||
@@ -32,6 +32,9 @@ class DownloadsScreen : Screen {
|
||||
clearQueue = vm::clear,
|
||||
onMangaClick = { navigator push MangaScreen(it) },
|
||||
stopDownload = vm::stopDownload,
|
||||
moveDownloadUp = vm::moveUp,
|
||||
moveDownloadDown = vm::moveDown,
|
||||
moveDownloadToTop = vm::moveToTop,
|
||||
moveDownloadToBottom = vm::moveToBottom
|
||||
)
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import ca.gosyer.jui.domain.base.WebsocketService.Actions
|
||||
import ca.gosyer.jui.domain.chapter.model.Chapter
|
||||
import ca.gosyer.jui.domain.download.interactor.ClearDownloadQueue
|
||||
import ca.gosyer.jui.domain.download.interactor.QueueChapterDownload
|
||||
import ca.gosyer.jui.domain.download.interactor.ReorderChapterDownload
|
||||
import ca.gosyer.jui.domain.download.interactor.StartDownloading
|
||||
import ca.gosyer.jui.domain.download.interactor.StopChapterDownload
|
||||
import ca.gosyer.jui.domain.download.interactor.StopDownloading
|
||||
@@ -36,6 +37,7 @@ class DownloadsScreenViewModel @Inject constructor(
|
||||
private val clearDownloadQueue: ClearDownloadQueue,
|
||||
private val queueChapterDownload: QueueChapterDownload,
|
||||
private val stopChapterDownload: StopChapterDownload,
|
||||
private val reorderChapterDownload: ReorderChapterDownload,
|
||||
private val contextWrapper: ContextWrapper,
|
||||
standalone: Boolean
|
||||
) : ViewModel(contextWrapper) {
|
||||
@@ -48,9 +50,9 @@ class DownloadsScreenViewModel @Inject constructor(
|
||||
override val scope: CoroutineScope
|
||||
get() = uiScope ?: super.scope
|
||||
|
||||
val serviceStatus get() = DownloadService.status.asStateFlow()
|
||||
val downloaderStatus get() = DownloadService.downloaderStatus.asStateFlow()
|
||||
val downloadQueue get() = DownloadService.downloadQueue.map { it.toImmutableList() }
|
||||
val serviceStatus = DownloadService.status.asStateFlow()
|
||||
val downloaderStatus = DownloadService.downloaderStatus.asStateFlow()
|
||||
val downloadQueue = DownloadService.downloadQueue.map { it.toImmutableList() }
|
||||
.stateIn(scope, SharingStarted.Eagerly, persistentListOf())
|
||||
|
||||
fun start() {
|
||||
@@ -69,10 +71,31 @@ class DownloadsScreenViewModel @Inject constructor(
|
||||
scope.launch { stopChapterDownload.await(chapter, onError = { toast(it.message.orEmpty()) }) }
|
||||
}
|
||||
|
||||
fun moveUp(chapter: Chapter) {
|
||||
scope.launch {
|
||||
val index = downloadQueue.value.indexOfFirst { it.mangaId == chapter.mangaId && it.chapterIndex == chapter.index }
|
||||
if (index == -1 || index <= 0) return@launch
|
||||
reorderChapterDownload.await(chapter, index - 1, onError = { toast(it.message.orEmpty()) })
|
||||
}
|
||||
}
|
||||
|
||||
fun moveDown(chapter: Chapter) {
|
||||
scope.launch {
|
||||
val index = downloadQueue.value.indexOfFirst { it.mangaId == chapter.mangaId && it.chapterIndex == chapter.index }
|
||||
if (index == -1 || index >= downloadQueue.value.lastIndex) return@launch
|
||||
reorderChapterDownload.await(chapter, index + 1, onError = { toast(it.message.orEmpty()) })
|
||||
}
|
||||
}
|
||||
|
||||
fun moveToTop(chapter: Chapter) {
|
||||
scope.launch {
|
||||
reorderChapterDownload.await(chapter, 0, onError = { toast(it.message.orEmpty()) })
|
||||
}
|
||||
}
|
||||
|
||||
fun moveToBottom(chapter: Chapter) {
|
||||
scope.launch {
|
||||
stopChapterDownload.await(chapter, onError = { toast(it.message.orEmpty()) })
|
||||
queueChapterDownload.await(chapter, onError = { toast(it.message.orEmpty()) })
|
||||
reorderChapterDownload.await(chapter, downloadQueue.value.lastIndex, onError = { toast(it.message.orEmpty()) })
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,9 @@ fun DownloadsScreenContent(
|
||||
clearQueue: () -> Unit,
|
||||
onMangaClick: (Long) -> Unit,
|
||||
stopDownload: (Chapter) -> Unit,
|
||||
moveDownloadUp: (Chapter) -> Unit,
|
||||
moveDownloadDown: (Chapter) -> Unit,
|
||||
moveDownloadToTop: (Chapter) -> Unit,
|
||||
moveDownloadToBottom: (Chapter) -> Unit
|
||||
) {
|
||||
Scaffold(
|
||||
@@ -117,6 +120,9 @@ fun DownloadsScreenContent(
|
||||
item = it,
|
||||
onClickCover = { onMangaClick(it.mangaId) },
|
||||
onClickCancel = stopDownload,
|
||||
onClickMoveUp = moveDownloadUp,
|
||||
onClickMoveDown = moveDownloadDown,
|
||||
onClickMoveToTop = moveDownloadToTop,
|
||||
onClickMoveToBottom = moveDownloadToBottom
|
||||
)
|
||||
}
|
||||
@@ -144,6 +150,9 @@ fun DownloadsItem(
|
||||
item: DownloadChapter,
|
||||
onClickCover: () -> Unit,
|
||||
onClickCancel: (Chapter) -> Unit,
|
||||
onClickMoveUp: (Chapter) -> Unit,
|
||||
onClickMoveDown: (Chapter) -> Unit,
|
||||
onClickMoveToTop: (Chapter) -> Unit,
|
||||
onClickMoveToBottom: (Chapter) -> Unit
|
||||
) {
|
||||
MangaListItem(
|
||||
@@ -196,6 +205,15 @@ fun DownloadsItem(
|
||||
DropdownMenuItem(onClick = { onClickCancel(item.chapter) }) {
|
||||
Text(stringResource(MR.strings.action_cancel))
|
||||
}
|
||||
DropdownMenuItem(onClick = { onClickMoveToTop(item.chapter) }) {
|
||||
Text(stringResource(MR.strings.action_move_to_top))
|
||||
}
|
||||
DropdownMenuItem(onClick = { onClickMoveUp(item.chapter) }) {
|
||||
Text(stringResource(MR.strings.action_move_up))
|
||||
}
|
||||
DropdownMenuItem(onClick = { onClickMoveDown(item.chapter) }) {
|
||||
Text(stringResource(MR.strings.action_move_down))
|
||||
}
|
||||
DropdownMenuItem(onClick = { onClickMoveToBottom(item.chapter) }) {
|
||||
Text(stringResource(MR.strings.action_move_to_bottom))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user