Implement downloader reordering

This commit is contained in:
Syer10
2022-11-07 21:47:28 -05:00
parent e9ed487cc9
commit a7062f2353
4 changed files with 52 additions and 5 deletions

View File

@@ -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>

View File

@@ -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
)
}

View File

@@ -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()) })
}
}

View File

@@ -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))
}