Skip to content

Commit b449368

Browse files
committed
feat: add PageinationUi to indicate if candidates page has prev or next
1 parent faac441 commit b449368

File tree

5 files changed

+113
-12
lines changed

5 files changed

+113
-12
lines changed

app/src/main/java/com/osfans/trime/ime/candidates/popup/PagedCandidatesUi.kt

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package com.osfans.trime.ime.candidates.popup
88
import android.content.Context
99
import android.view.View
1010
import android.view.ViewGroup
11+
import androidx.core.view.updateLayoutParams
1112
import androidx.recyclerview.widget.RecyclerView
1213
import com.chad.library.adapter4.BaseQuickAdapter
1314
import com.google.android.flexbox.AlignItems
@@ -25,12 +26,20 @@ class PagedCandidatesUi(
2526
) : Ui {
2627
private var menu = RimeProto.Context.Menu()
2728

28-
class UiViewHolder(
29-
val ui: Ui,
30-
) : RecyclerView.ViewHolder(ui.root)
29+
sealed class UiHolder(
30+
open val ui: Ui,
31+
) : RecyclerView.ViewHolder(ui.root) {
32+
class Candidate(
33+
override val ui: LabeledCandidateItemUi,
34+
) : UiHolder(ui)
35+
36+
class Pagination(
37+
override val ui: PaginationUi,
38+
) : UiHolder(ui)
39+
}
3140

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

@@ -43,23 +52,35 @@ class PagedCandidatesUi(
4352
context: Context,
4453
parent: ViewGroup,
4554
viewType: Int,
46-
): UiViewHolder =
55+
): UiHolder =
4756
when (viewType) {
48-
0 -> UiViewHolder(LabeledCandidateItemUi(ctx, theme))
49-
else -> UiViewHolder(LabeledCandidateItemUi(ctx, theme))
57+
0 -> UiHolder.Candidate(LabeledCandidateItemUi(ctx, theme))
58+
else ->
59+
UiHolder.Pagination(PaginationUi(ctx, theme)).apply {
60+
val wrap = ViewGroup.LayoutParams.WRAP_CONTENT
61+
ui.root.layoutParams =
62+
FlexboxLayoutManager.LayoutParams(wrap, wrap).apply {
63+
flexGrow = 1f
64+
}
65+
}
5066
}
5167

5268
override fun onBindViewHolder(
53-
holder: UiViewHolder,
69+
holder: UiHolder,
5470
position: Int,
5571
item: RimeProto.Candidate?,
5672
) {
57-
when (getItemViewType(position)) {
58-
0 -> {
59-
holder.ui as LabeledCandidateItemUi
73+
when (holder) {
74+
is UiHolder.Candidate -> {
6075
val candidate = item ?: return
6176
holder.ui.update(candidate, position == menu.highlightedCandidateIndex)
6277
}
78+
is UiHolder.Pagination -> {
79+
holder.ui.update(menu)
80+
holder.ui.root.updateLayoutParams<FlexboxLayoutManager.LayoutParams> {
81+
alignSelf = AlignItems.CENTER
82+
}
83+
}
6384
}
6485
}
6586
}.apply {
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
3+
* SPDX-License-Identifier: GPL-3.0-or-later
4+
*/
5+
6+
package com.osfans.trime.ime.candidates.popup
7+
8+
import android.content.Context
9+
import android.content.res.ColorStateList
10+
import android.widget.ImageView
11+
import androidx.annotation.DrawableRes
12+
import com.osfans.trime.R
13+
import com.osfans.trime.core.RimeProto
14+
import com.osfans.trime.data.theme.ColorManager
15+
import com.osfans.trime.data.theme.Theme
16+
import com.osfans.trime.util.styledFloat
17+
import splitties.dimensions.dp
18+
import splitties.resources.drawable
19+
import splitties.views.dsl.constraintlayout.before
20+
import splitties.views.dsl.constraintlayout.centerVertically
21+
import splitties.views.dsl.constraintlayout.constraintLayout
22+
import splitties.views.dsl.constraintlayout.endOfParent
23+
import splitties.views.dsl.constraintlayout.lParams
24+
import splitties.views.dsl.core.Ui
25+
import splitties.views.dsl.core.add
26+
import splitties.views.dsl.core.imageView
27+
import splitties.views.imageDrawable
28+
29+
class PaginationUi(
30+
override val ctx: Context,
31+
val theme: Theme,
32+
) : Ui {
33+
private fun createIcon(
34+
@DrawableRes icon: Int,
35+
) = imageView {
36+
imageTintList = ColorStateList.valueOf(ColorManager.getColor("key_text_color")!!)
37+
imageDrawable = drawable(icon)
38+
scaleType = ImageView.ScaleType.CENTER_CROP
39+
}
40+
41+
private val prevIcon = createIcon(R.drawable.ic_baseline_arrow_left_24)
42+
private val nextIcon = createIcon(R.drawable.ic_baseline_arrow_right_24)
43+
44+
private val disabledAlpha = ctx.styledFloat(android.R.attr.disabledAlpha)
45+
46+
override val root =
47+
constraintLayout {
48+
val w = dp(10)
49+
val h = dp(20)
50+
add(
51+
nextIcon,
52+
lParams(w, h) {
53+
centerVertically()
54+
endOfParent()
55+
},
56+
)
57+
add(
58+
prevIcon,
59+
lParams(w, h) {
60+
centerVertically()
61+
before(nextIcon)
62+
},
63+
)
64+
}
65+
66+
fun update(menu: RimeProto.Context.Menu) {
67+
prevIcon.alpha = if (menu.pageNumber != 0) 1f else disabledAlpha
68+
nextIcon.alpha = if (!menu.isLastPage) 1f else disabledAlpha
69+
}
70+
}

app/src/main/java/com/osfans/trime/ime/candidates/unrolled/window/BaseUnrolledCandidateWindow.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import com.osfans.trime.ime.bar.UnrollButtonStateMachine
2424
import com.osfans.trime.ime.broadcast.InputBroadcastReceiver
2525
import com.osfans.trime.ime.candidates.CandidateViewHolder
2626
import com.osfans.trime.ime.candidates.compact.CompactCandidateModule
27-
import com.osfans.trime.ime.candidates.unrolled.PagingCandidateViewAdapter
2827
import com.osfans.trime.ime.candidates.unrolled.CandidatesPagingSource
28+
import com.osfans.trime.ime.candidates.unrolled.PagingCandidateViewAdapter
2929
import com.osfans.trime.ime.candidates.unrolled.UnrolledCandidateLayout
3030
import com.osfans.trime.ime.core.TrimeInputMethodService
3131
import com.osfans.trime.ime.keyboard.KeyboardSwitcher
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<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">
2+
3+
<path android:fillColor="@android:color/white" android:pathData="M14,7l-5,5 5,5V7z"/>
4+
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<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">
2+
3+
<path android:fillColor="@android:color/white" android:pathData="M10,17l5,-5 -5,-5v10z"/>
4+
5+
</vector>

0 commit comments

Comments
 (0)