Skip to content

Commit

Permalink
feat: add PageinationUi to indicate if candidates page has prev or next
Browse files Browse the repository at this point in the history
  • Loading branch information
WhiredPlanck committed Nov 21, 2024
1 parent faac441 commit b449368
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ package com.osfans.trime.ime.candidates.popup
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter4.BaseQuickAdapter
import com.google.android.flexbox.AlignItems
Expand All @@ -25,12 +26,20 @@ class PagedCandidatesUi(
) : Ui {
private var menu = RimeProto.Context.Menu()

class UiViewHolder(
val ui: Ui,
) : RecyclerView.ViewHolder(ui.root)
sealed class UiHolder(
open val ui: Ui,
) : RecyclerView.ViewHolder(ui.root) {
class Candidate(
override val ui: LabeledCandidateItemUi,
) : UiHolder(ui)

class Pagination(
override val ui: PaginationUi,
) : UiHolder(ui)
}

val candidatesAdapter =
object : BaseQuickAdapter<RimeProto.Candidate, UiViewHolder>() {
object : BaseQuickAdapter<RimeProto.Candidate, UiHolder>() {
override fun getItemCount(items: List<RimeProto.Candidate>) =
items.size + (if (menu.pageNumber != 0 || !menu.isLastPage) 1 else 0)

Expand All @@ -43,23 +52,35 @@ class PagedCandidatesUi(
context: Context,
parent: ViewGroup,
viewType: Int,
): UiViewHolder =
): UiHolder =
when (viewType) {
0 -> UiViewHolder(LabeledCandidateItemUi(ctx, theme))
else -> UiViewHolder(LabeledCandidateItemUi(ctx, theme))
0 -> UiHolder.Candidate(LabeledCandidateItemUi(ctx, theme))
else ->
UiHolder.Pagination(PaginationUi(ctx, theme)).apply {
val wrap = ViewGroup.LayoutParams.WRAP_CONTENT
ui.root.layoutParams =
FlexboxLayoutManager.LayoutParams(wrap, wrap).apply {
flexGrow = 1f
}
}
}

override fun onBindViewHolder(
holder: UiViewHolder,
holder: UiHolder,
position: Int,
item: RimeProto.Candidate?,
) {
when (getItemViewType(position)) {
0 -> {
holder.ui as LabeledCandidateItemUi
when (holder) {
is UiHolder.Candidate -> {
val candidate = item ?: return
holder.ui.update(candidate, position == menu.highlightedCandidateIndex)
}
is UiHolder.Pagination -> {
holder.ui.update(menu)
holder.ui.root.updateLayoutParams<FlexboxLayoutManager.LayoutParams> {
alignSelf = AlignItems.CENTER
}
}
}
}
}.apply {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package com.osfans.trime.ime.candidates.popup

import android.content.Context
import android.content.res.ColorStateList
import android.widget.ImageView
import androidx.annotation.DrawableRes
import com.osfans.trime.R
import com.osfans.trime.core.RimeProto
import com.osfans.trime.data.theme.ColorManager
import com.osfans.trime.data.theme.Theme
import com.osfans.trime.util.styledFloat
import splitties.dimensions.dp
import splitties.resources.drawable
import splitties.views.dsl.constraintlayout.before
import splitties.views.dsl.constraintlayout.centerVertically
import splitties.views.dsl.constraintlayout.constraintLayout
import splitties.views.dsl.constraintlayout.endOfParent
import splitties.views.dsl.constraintlayout.lParams
import splitties.views.dsl.core.Ui
import splitties.views.dsl.core.add
import splitties.views.dsl.core.imageView
import splitties.views.imageDrawable

class PaginationUi(
override val ctx: Context,
val theme: Theme,
) : Ui {
private fun createIcon(
@DrawableRes icon: Int,
) = imageView {
imageTintList = ColorStateList.valueOf(ColorManager.getColor("key_text_color")!!)
imageDrawable = drawable(icon)
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)

private val disabledAlpha = ctx.styledFloat(android.R.attr.disabledAlpha)

override val root =
constraintLayout {
val w = dp(10)
val h = dp(20)
add(
nextIcon,
lParams(w, h) {
centerVertically()
endOfParent()
},
)
add(
prevIcon,
lParams(w, h) {
centerVertically()
before(nextIcon)
},
)
}

fun update(menu: RimeProto.Context.Menu) {
prevIcon.alpha = if (menu.pageNumber != 0) 1f else disabledAlpha
nextIcon.alpha = if (!menu.isLastPage) 1f else disabledAlpha
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ import com.osfans.trime.ime.bar.UnrollButtonStateMachine
import com.osfans.trime.ime.broadcast.InputBroadcastReceiver
import com.osfans.trime.ime.candidates.CandidateViewHolder
import com.osfans.trime.ime.candidates.compact.CompactCandidateModule
import com.osfans.trime.ime.candidates.unrolled.PagingCandidateViewAdapter
import com.osfans.trime.ime.candidates.unrolled.CandidatesPagingSource
import com.osfans.trime.ime.candidates.unrolled.PagingCandidateViewAdapter
import com.osfans.trime.ime.candidates.unrolled.UnrolledCandidateLayout
import com.osfans.trime.ime.core.TrimeInputMethodService
import com.osfans.trime.ime.keyboard.KeyboardSwitcher
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/drawable/ic_baseline_arrow_left_24.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">

<path android:fillColor="@android:color/white" android:pathData="M14,7l-5,5 5,5V7z"/>

</vector>
5 changes: 5 additions & 0 deletions app/src/main/res/drawable/ic_baseline_arrow_right_24.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">

<path android:fillColor="@android:color/white" android:pathData="M10,17l5,-5 -5,-5v10z"/>

</vector>

0 comments on commit b449368

Please sign in to comment.