Skip to content

Commit

Permalink
feat: add logics & UIs for displaying inline suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
goofyz committed Jan 14, 2025
1 parent 4161954 commit f5aa0ea
Show file tree
Hide file tree
Showing 7 changed files with 220 additions and 0 deletions.
45 changes: 45 additions & 0 deletions app/src/main/java/com/osfans/trime/ime/bar/ui/SuggestionUi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// SPDX-FileCopyrightText: 2024 Rime community
//
// SPDX-License-Identifier: GPL-3.0-or-later

package com.osfans.trime.ime.bar.ui

import android.content.Context
import android.view.View
import com.osfans.trime.R
import splitties.dimensions.dp
import splitties.views.dsl.constraintlayout.after
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.constraintlayout.startOfParent
import splitties.views.dsl.core.Ui
import splitties.views.dsl.core.add

class SuggestionUi(
override val ctx: Context,
private val compatView: View,
) : Ui {
val homeButton =
ToolButton(ctx, R.drawable.ic_trime_status)

override val root =
ctx.constraintLayout {
add(
homeButton,
lParams(dp(40)) {
centerVertically()
startOfParent()
},
)
add(
compatView,
lParams {
centerVertically()
after(homeButton)
endOfParent()
},
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package com.osfans.trime.ime.candidates.suggestion

import android.content.Context
import android.view.View
import com.osfans.trime.R
import com.osfans.trime.daemon.RimeSession
import com.osfans.trime.data.theme.Theme
import com.osfans.trime.ime.bar.QuickBar
import com.osfans.trime.ime.broadcast.InputBroadcastReceiver
import com.osfans.trime.ime.core.TrimeInputMethodService
import splitties.views.dsl.recyclerview.recyclerView
import splitties.views.recyclerview.horizontalLayoutManager

class SuggestionCandidateModule(
val context: Context,
val service: TrimeInputMethodService,
val rime: RimeSession,
val theme: Theme,
val bar: QuickBar,
) : InputBroadcastReceiver {
val adapter by lazy {
SuggestionCandidateViewAdapter(theme)
}

val view by lazy {
context.recyclerView(R.id.suggestion_view) {
adapter = this@SuggestionCandidateModule.adapter
layoutManager = horizontalLayoutManager()
isVerticalScrollBarEnabled = false
isHorizontalScrollBarEnabled = false
}
}

override fun onInlineSuggestion(views: List<View>) {
adapter.updateCandidates(
views.map {
SuggestionViewItem(it)
},
true,
0,
-1,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// SPDX-FileCopyrightText: 2024 Rime community
//
// SPDX-License-Identifier: GPL-3.0-or-later

package com.osfans.trime.ime.candidates.suggestion

import android.content.Context
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.chad.library.adapter4.BaseQuickAdapter
import com.osfans.trime.data.theme.Theme
import splitties.dimensions.dp
import splitties.views.dsl.core.matchParent
import splitties.views.dsl.core.wrapContent
import splitties.views.setPaddingDp

open class SuggestionCandidateViewAdapter(
val theme: Theme,
) : BaseQuickAdapter<SuggestionViewItem, SuggestionViewHolder>() {
var isLastPage: Boolean = false
private set

var previous: Int = 0
private set

var highlightedIdx: Int = -1
private set

fun updateCandidates(
list: List<SuggestionViewItem>,
isLastPage: Boolean,
previous: Int,
highlightedIdx: Int,
) {
this.isLastPage = isLastPage
this.previous = previous
this.highlightedIdx = highlightedIdx
super.submitList(list)
}

override fun onCreateViewHolder(
context: Context,
parent: ViewGroup,
viewType: Int,
): SuggestionViewHolder {
val ui = SuggestionItemUi(context, theme)
ui.root.apply {
minimumWidth = dp(40)
val size = theme.generalStyle.candidatePadding
setPaddingDp(size, 0, size, 0)
layoutParams = RecyclerView.LayoutParams(wrapContent, matchParent)
}
return SuggestionViewHolder(ui)
}

override fun onBindViewHolder(
holder: SuggestionViewHolder,
position: Int,
item: SuggestionViewItem?,
) {
item ?: return
val isHighlighted = theme.generalStyle.candidateUseCursor && position == highlightedIdx
holder.ui.update(item, isHighlighted)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// SPDX-FileCopyrightText: 2024 Rime community
//
// SPDX-License-Identifier: GPL-3.0-or-later

package com.osfans.trime.ime.candidates.suggestion

import android.content.Context
import android.graphics.drawable.ColorDrawable
import com.osfans.trime.data.theme.ColorManager
import com.osfans.trime.data.theme.Theme
import com.osfans.trime.util.pressHighlightDrawable
import splitties.views.dsl.constraintlayout.constraintLayout
import splitties.views.dsl.core.Ui

class SuggestionItemUi(
override val ctx: Context,
theme: Theme,
) : Ui {
private val firstBackColorH = ColorManager.getColor("hilited_candidate_back_color")!!

override val root = constraintLayout {}

fun update(
item: SuggestionViewItem,
isHighlighted: Boolean,
) {
root.removeAllViews()
root.addView(item.view)

root.background =
if (isHighlighted) {
ColorDrawable(firstBackColorH)
} else {
pressHighlightDrawable(firstBackColorH)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-FileCopyrightText: 2024 Rime community
//
// SPDX-License-Identifier: GPL-3.0-or-later

package com.osfans.trime.ime.candidates.suggestion

import androidx.recyclerview.widget.RecyclerView

class SuggestionViewHolder(
val ui: SuggestionItemUi,
) : RecyclerView.ViewHolder(ui.root)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/*
* SPDX-FileCopyrightText: 2015 - 2025 Rime community
* SPDX-License-Identifier: GPL-3.0-or-later
*/

package com.osfans.trime.ime.candidates.suggestion

import android.view.View

data class SuggestionViewItem(
val view: View,
)
1 change: 1 addition & 0 deletions app/src/main/res/values/input_view_ids.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ SPDX-License-Identifier: GPL-3.0-or-later
<item name="unrolled_candidate_view" type="id" />
<item name="input_window" type="id" />
<item name="keyboard_view" type="id" />
<item name="suggestion_view" type="id" />
</resources>

0 comments on commit f5aa0ea

Please sign in to comment.