From 069a12fcb7dca316f5e12be6359812f4b5dc4b40 Mon Sep 17 00:00:00 2001 From: if-can Date: Fri, 17 Jan 2025 20:57:09 +0800 Subject: [PATCH] feat: page navigation using prevIcon and nextIcon components --- .../ime/candidates/popup/PagedCandidatesUi.kt | 21 +++++++++++++++++++ .../ime/candidates/popup/PaginationUi.kt | 4 ++-- .../trime/ime/composition/CandidatesView.kt | 18 ++++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/osfans/trime/ime/candidates/popup/PagedCandidatesUi.kt b/app/src/main/java/com/osfans/trime/ime/candidates/popup/PagedCandidatesUi.kt index cc858cd3c2..8b9bca8a14 100644 --- a/app/src/main/java/com/osfans/trime/ime/candidates/popup/PagedCandidatesUi.kt +++ b/app/src/main/java/com/osfans/trime/ime/candidates/popup/PagedCandidatesUi.kt @@ -39,6 +39,18 @@ class PagedCandidatesUi( ) : UiHolder(ui) } + enum class ClickType { + CANDIDATE, + PREV_PAGE, + NEXT_PAGE, + } + + private var clickListener: ((type: ClickType, position: Int) -> Unit)? = null + + fun setOnClickListener(listener: (type: ClickType, position: Int) -> Unit) { + clickListener = listener + } + val candidatesAdapter = object : BaseQuickAdapter() { override fun getItemCount(items: List) = @@ -75,6 +87,9 @@ class PagedCandidatesUi( is UiHolder.Candidate -> { val candidate = item ?: return holder.ui.update(candidate, position == menu.highlightedCandidateIndex) + holder.ui.root.setOnClickListener { + clickListener?.invoke(ClickType.CANDIDATE, position) + } } is UiHolder.Pagination -> { holder.ui.update(menu) @@ -82,6 +97,12 @@ class PagedCandidatesUi( width = if (isHorizontal) ViewGroup.LayoutParams.WRAP_CONTENT else ViewGroup.LayoutParams.MATCH_PARENT alignSelf = if (isHorizontal) AlignItems.CENTER else AlignItems.STRETCH } + holder.ui.prevIcon.setOnClickListener { + clickListener?.invoke(ClickType.PREV_PAGE, menu.pageNumber) + } + holder.ui.nextIcon.setOnClickListener { + clickListener?.invoke(ClickType.NEXT_PAGE, menu.pageNumber) + } } } } diff --git a/app/src/main/java/com/osfans/trime/ime/candidates/popup/PaginationUi.kt b/app/src/main/java/com/osfans/trime/ime/candidates/popup/PaginationUi.kt index c9623bd94e..bd18b85afe 100644 --- a/app/src/main/java/com/osfans/trime/ime/candidates/popup/PaginationUi.kt +++ b/app/src/main/java/com/osfans/trime/ime/candidates/popup/PaginationUi.kt @@ -38,8 +38,8 @@ class PaginationUi( scaleType = ImageView.ScaleType.CENTER_CROP } - private val prevIcon = createIcon(R.drawable.ic_baseline_arrow_left_24) - private val nextIcon = createIcon(R.drawable.ic_baseline_arrow_right_24) + val prevIcon = createIcon(R.drawable.ic_baseline_arrow_left_24) + val nextIcon = createIcon(R.drawable.ic_baseline_arrow_right_24) private val disabledAlpha = ctx.styledFloat(android.R.attr.disabledAlpha) diff --git a/app/src/main/java/com/osfans/trime/ime/composition/CandidatesView.kt b/app/src/main/java/com/osfans/trime/ime/composition/CandidatesView.kt index 74a883af82..a106395227 100644 --- a/app/src/main/java/com/osfans/trime/ime/composition/CandidatesView.kt +++ b/app/src/main/java/com/osfans/trime/ime/composition/CandidatesView.kt @@ -6,8 +6,10 @@ package com.osfans.trime.ime.composition import android.annotation.SuppressLint +import android.view.KeyEvent import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout +import com.osfans.trime.core.RimeKeyMapping import com.osfans.trime.core.RimeProto import com.osfans.trime.daemon.RimeSession import com.osfans.trime.daemon.launchOnReady @@ -49,8 +51,20 @@ class CandidatesView( private val candidatesUi = PagedCandidatesUi(ctx, theme).apply { - candidatesAdapter.setOnItemClickListener { _, _, position -> - rime.launchOnReady { it.selectPagedCandidate(position) } + setOnClickListener { type, position -> + when (type) { + PagedCandidatesUi.ClickType.CANDIDATE -> { + rime.launchOnReady { it.selectPagedCandidate(position) } + } + PagedCandidatesUi.ClickType.PREV_PAGE -> { + val value = RimeKeyMapping.keyCodeToVal(KeyEvent.KEYCODE_PAGE_UP) + rime.launchOnReady { it.processKey(value, 0u) } + } + PagedCandidatesUi.ClickType.NEXT_PAGE -> { + val value = RimeKeyMapping.keyCodeToVal(KeyEvent.KEYCODE_PAGE_DOWN) + rime.launchOnReady { it.processKey(value, 0u) } + } + } } }