diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ActionBuilder.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ActionBuilder.kt deleted file mode 100644 index 82ca6497b..000000000 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/ActionBuilder.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.hippo.ehviewer.ui.scene - -fun interface ActionScope { - fun onSelect(action: String, that: suspend () -> Unit) -} - -inline fun buildAction(builder: ActionScope.() -> Unit) = buildList { - builder { action, that -> add(action to that) } -} diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt index 201036d50..51f02bd7f 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryCommentsFragment.kt @@ -351,30 +351,35 @@ fun GalleryCommentsScreen(galleryDetail: GalleryDetail, navigator: NavController } } - suspend fun Context.doCommentAction(comment: GalleryComment) { - val actions = buildAction { - onSelect(copyComment) { findActivity().addTextToClipboard(comment.comment.parseAsHtml()) } - if (!comment.uploader && !comment.editable) { - onSelect(blockCommenter) { showFilterCommenter(comment) } + suspend fun Context.doCommentAction(comment: GalleryComment) = dialogState.showSelectActions { + onSelect(copyComment) { + findActivity().addTextToClipboard(comment.comment.parseAsHtml()) + } + if (!comment.uploader && !comment.editable) { + onSelect(blockCommenter) { showFilterCommenter(comment) } + } + if (comment.editable) { + onSelect(editComment) { + userComment = TextFieldValue(comment.comment.parseAsHtml().toAnnotatedString()) + commentId = comment.id + commenting = true } - if (comment.editable) { - onSelect(editComment) { - userComment = TextFieldValue(comment.comment.parseAsHtml().toAnnotatedString()) - commentId = comment.id - commenting = true - } + } + if (comment.voteUpAble) { + onSelect(if (comment.voteUpEd) cancelVoteUp else voteUp) { + voteComment(comment, true) } - if (comment.voteUpAble) { - onSelect(if (comment.voteUpEd) cancelVoteUp else voteUp) { voteComment(comment, true) } + } + if (comment.voteDownAble) { + onSelect(if (comment.voteDownEd) cancelVoteDown else voteDown) { + voteComment(comment, false) } - if (comment.voteDownAble) { - onSelect(if (comment.voteDownEd) cancelVoteDown else voteDown) { voteComment(comment, false) } - } - if (!comment.voteState.isNullOrEmpty()) { - onSelect(checkVoteStatus) { showCommentVoteStatus(comment) } + } + if (!comment.voteState.isNullOrEmpty()) { + onSelect(checkVoteStatus) { + showCommentVoteStatus(comment) } } - dialogState.showSelectItem(*actions.toTypedArray()).invoke() } GalleryCommentCard( diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt index 57759a973..19706e7f0 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GalleryDetailScene.kt @@ -874,25 +874,31 @@ fun GalleryDetailScreen(args: GalleryDetailScreenArgs, navigator: NavController) } else { tag } - val actions = buildAction { - onSelect(copy) { activity.addTextToClipboard(tag) } - if (temp != translated) { - onSelect(copyTrans) { activity.addTextToClipboard(translated) } - } - onSelect(showDefine) { context.openBrowser(EhUrl.getTagDefinitionUrl(temp)) } - onSelect(addFilter) { - dialogState.awaitPermissionOrCancel { Text(text = stringResource(R.string.filter_the_tag, tag)) } - Filter(FilterMode.TAG, tag).remember() - activity.showTip(filterAdded, BaseScene.LENGTH_SHORT) - } - if (galleryDetail.apiUid >= 0) { - onSelect(upTag) { galleryDetail.voteTag(tag, 1) } - onSelect(downTag) { galleryDetail.voteTag(tag, -1) } - } - }.toTypedArray() coroutineScope.launchIO { - val action = dialogState.showSelectItem(*actions) - action.invoke() + dialogState.showSelectActions { + with(activity) { + onSelect(copy) { + addTextToClipboard(tag) + } + if (temp != translated) { + onSelect(copyTrans) { + addTextToClipboard(translated) + } + } + onSelect(showDefine) { + openBrowser(EhUrl.getTagDefinitionUrl(temp)) + } + onSelect(addFilter) { + dialogState.awaitPermissionOrCancel { Text(text = stringResource(R.string.filter_the_tag, tag)) } + Filter(FilterMode.TAG, tag).remember() + showTip(filterAdded, BaseScene.LENGTH_SHORT) + } + if (galleryDetail.apiUid >= 0) { + onSelect(upTag) { galleryDetail.voteTag(tag, 1) } + onSelect(downTag) { galleryDetail.voteTag(tag, -1) } + } + } + } } }, ) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt index 6e24f7a19..7590e51e8 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/tools/Dialog.kt @@ -61,6 +61,10 @@ import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine +fun interface ActionScope { + fun onSelect(action: String, that: suspend () -> Unit) +} + interface DialogScope { var expectedValue: R } @@ -341,6 +345,14 @@ class DialogState { } } + suspend inline fun showSelectActions( + @StringRes title: Int? = null, + builder: ActionScope.() -> Unit, + ) = showSelectItem( + *buildList { builder(ActionScope { action, that -> add(action to that) }) }.toTypedArray(), + title = title, + ).invoke() + suspend fun showSelectItemWithCheckBox( vararg items: String?, @StringRes title: Int,