diff --git a/app/src/main/java/com/osfans/trime/data/theme/FontManager.kt b/app/src/main/java/com/osfans/trime/data/theme/FontManager.kt index 40080aaf47..0be98107dc 100644 --- a/app/src/main/java/com/osfans/trime/data/theme/FontManager.kt +++ b/app/src/main/java/com/osfans/trime/data/theme/FontManager.kt @@ -33,7 +33,10 @@ object FontManager { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val fontFamilies = mutableListOf() getFontFamilies(key).let { - if (it.isEmpty()) return@getTypeface Typeface.DEFAULT + if (it.isEmpty()) { + typefaceCache[key] = Typeface.DEFAULT + return@getTypeface Typeface.DEFAULT + } fontFamilies.addAll(getFontFamilies("latin_font")) fontFamilies.addAll(it) fontFamilies.addAll(getFontFamilies("hanb_font")) diff --git a/app/src/main/java/com/osfans/trime/ime/symbol/CandidateAdapter.kt b/app/src/main/java/com/osfans/trime/ime/symbol/CandidateAdapter.kt index 13224e91c9..f3d45f5b73 100644 --- a/app/src/main/java/com/osfans/trime/ime/symbol/CandidateAdapter.kt +++ b/app/src/main/java/com/osfans/trime/ime/symbol/CandidateAdapter.kt @@ -22,7 +22,7 @@ import splitties.views.dsl.constraintlayout.centerHorizontally import splitties.views.dsl.constraintlayout.topOfParent // 显示长度不固定,字体大小正常的内容。用于类型 CANDIDATE, VAR_LENGTH -class CandidateAdapter(private val theme: Theme) : RecyclerView.Adapter() { +class CandidateAdapter(theme: Theme) : RecyclerView.Adapter() { private val mCandidates = mutableListOf() internal enum class CommentPosition { @@ -44,40 +44,69 @@ class CandidateAdapter(private val theme: Theme) : RecyclerView.Adapter { - candidate.updateLayoutParams { - centerHorizontally() - } - comment.updateLayoutParams { - below(candidate) - centerHorizontally() - bottomOfParent() - } + when (CommentPosition.entries[mCommentPosition]) { + CommentPosition.BOTTOM -> { + candidate.updateLayoutParams { + centerHorizontally() } - CommentPosition.TOP -> { - candidate.updateLayoutParams { - centerHorizontally() - } - comment.updateLayoutParams { - topOfParent() - above(candidate) - centerHorizontally() - } + comment.updateLayoutParams { + below(candidate) + centerHorizontally() + bottomOfParent() } - CommentPosition.RIGHT, CommentPosition.UNKNOWN -> {} } + + CommentPosition.TOP -> { + candidate.updateLayoutParams { + centerHorizontally() + } + comment.updateLayoutParams { + topOfParent() + above(candidate) + centerHorizontally() + } + } + + CommentPosition.RIGHT, CommentPosition.UNKNOWN -> {} } - binding.comment.visibility = View.GONE return ViewHolder(binding) } @@ -92,44 +121,26 @@ class CandidateAdapter(private val theme: Theme) : RecyclerView.Adapter - val hilited = ColorManager.getColor("hilited_candidate_text_color") if (motionEvent.action == MotionEvent.ACTION_DOWN) { - hilited?.let { holder.candidate.setTextColor(it) } + mHilitedCandidateTextColor?.let { holder.candidate.setTextColor(it) } } false } } - /** 添加 候选点击事件 Listener 回调 * */ + /** 添加 候选点击事件 Listener 回调 */ private var listener: ((Int) -> Unit)? = null /** @param listener position diff --git a/app/src/main/java/com/osfans/trime/ime/symbol/FlexibleAdapter.kt b/app/src/main/java/com/osfans/trime/ime/symbol/FlexibleAdapter.kt index 0dbc44777f..740f44cbfb 100644 --- a/app/src/main/java/com/osfans/trime/ime/symbol/FlexibleAdapter.kt +++ b/app/src/main/java/com/osfans/trime/ime/symbol/FlexibleAdapter.kt @@ -20,17 +20,14 @@ import com.osfans.trime.ime.core.Trime import com.osfans.trime.util.appContext import kotlinx.coroutines.launch -class FlexibleAdapter( - private val theme: Theme, -) : RecyclerView.Adapter() { +class FlexibleAdapter(theme: Theme) : RecyclerView.Adapter() { private val mBeans = mutableListOf() // 映射条目的 id 和其在视图中位置的关系 // 以应对增删条目时 id 和其位置的相对变化 // [, ...] private val mBeansId = mutableMapOf() - val beans: List - get() = mBeans + val beans get() = mBeans fun updateBeans(beans: List) { val sorted = @@ -57,12 +54,36 @@ class FlexibleAdapter( override fun getItemCount(): Int = mBeans.size + private val mTypeface = FontManager.getTypeface("long_text_font") + private val mLongTextColor = ColorManager.getColor("long_text_color") + private val mKeyTextColor = ColorManager.getColor("key_text_color") + private val mKeyLongTextSize = theme.style.getFloat("key_long_text_size") + private val mLabelTextSize = theme.style.getFloat("label_text_size") + + // 这里不用 get() 会导致快速滑动时背景填充错误 + private val mBackground + get() = + ColorManager.getDrawable( + "long_text_back_color", + "key_border", + "key_long_text_border", + "round_corner", + null, + ) + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, ): ViewHolder { val binding = SimpleKeyItemBinding.inflate(LayoutInflater.from(parent.context)) - return ViewHolder(binding) + val holder = ViewHolder(binding) + holder.simpleKeyText.apply { + typeface = mTypeface + (mLongTextColor ?: mKeyTextColor)?.let { setTextColor(it) } + (mKeyLongTextSize.takeIf { it > 0f } ?: mLabelTextSize.takeIf { it > 0f }) + ?.let { textSize = it } + } + return holder } inner class ViewHolder(binding: SimpleKeyItemBinding) : RecyclerView.ViewHolder(binding.root) { @@ -76,108 +97,87 @@ class FlexibleAdapter( ) { with(viewHolder) { val bean = mBeans[position] - simpleKeyText.apply { - text = bean.text - typeface = FontManager.getTypeface("long_text_font") - ( - ColorManager.getColor("long_text_color") - ?: ColorManager.getColor("key_text_color") - ) - ?.let { setTextColor(it) } - - theme.style.getFloat("key_long_text_size").takeIf { it > 0f } - ?: theme.style.getFloat("label_text_size").takeIf { it > 0f } - ?.let { textSize = it } - } + simpleKeyText.text = bean.text simpleKeyPin.visibility = if (bean.pinned) View.VISIBLE else View.INVISIBLE - - itemView.background = - ColorManager.getDrawable( - "long_text_back_color", - "key_border", - "key_long_text_border", - "round_corner", - null, - ) - + itemView.background = mBackground + if (!this@FlexibleAdapter::listener.isInitialized) return // 如果设置了回调,则设置点击事件 - if (this@FlexibleAdapter::listener.isInitialized) { - itemView.setOnClickListener { - listener.onPaste(bean) - } - itemView.setOnLongClickListener { - val menu = PopupMenu(it.context, it) - val scope = it.findViewTreeLifecycleOwner()!!.lifecycleScope - menu.menu.apply { - add(R.string.edit).apply { - setIcon(R.drawable.ic_baseline_edit_24) + itemView.setOnClickListener { + listener.onPaste(bean) + } + itemView.setOnLongClickListener { + val menu = PopupMenu(it.context, it) + val scope = it.findViewTreeLifecycleOwner()!!.lifecycleScope + menu.menu.apply { + add(R.string.edit).apply { + setIcon(R.drawable.ic_baseline_edit_24) + setOnMenuItemClickListener { + scope.launch { + listener.onEdit(bean) + } + true + } + } + if (bean.pinned) { + add(R.string.simple_key_unpin).apply { + setIcon(R.drawable.ic_outline_push_pin_24) setOnMenuItemClickListener { scope.launch { - listener.onEdit(bean) + listener.onUnpin(bean) + setPinStatus(bean.id, false) } true } } - if (bean.pinned) { - add(R.string.simple_key_unpin).apply { - setIcon(R.drawable.ic_outline_push_pin_24) - setOnMenuItemClickListener { - scope.launch { - listener.onUnpin(bean) - setPinStatus(bean.id, false) - } - true + } else { + add(R.string.simple_key_pin).apply { + setIcon(R.drawable.ic_baseline_push_pin_24) + setOnMenuItemClickListener { + scope.launch { + listener.onPin(bean) + setPinStatus(bean.id, true) } + true } - } else { - add(R.string.simple_key_pin).apply { - setIcon(R.drawable.ic_baseline_push_pin_24) - setOnMenuItemClickListener { - scope.launch { - listener.onPin(bean) - setPinStatus(bean.id, true) - } - true - } + } + } + if (listener.showCollectButton) { + add(R.string.collect).apply { + setIcon(R.drawable.ic_baseline_star_24) + setOnMenuItemClickListener { + scope.launch { CollectionHelper.insert(DatabaseBean(text = bean.text)) } + true } } - if (listener.showCollectButton) { - add(R.string.collect).apply { - setIcon(R.drawable.ic_baseline_star_24) - setOnMenuItemClickListener { - scope.launch { CollectionHelper.insert(DatabaseBean(text = bean.text)) } - true - } + } + + add(R.string.delete).apply { + setIcon(R.drawable.ic_baseline_delete_24) + setOnMenuItemClickListener { + scope.launch { + listener.onDelete(bean) + delete(bean.id) } + true } - add(R.string.delete).apply { - setIcon(R.drawable.ic_baseline_delete_24) + } + if (beans.isNotEmpty()) { + add(R.string.delete_all).apply { + setIcon(R.drawable.ic_baseline_delete_sweep_24) setOnMenuItemClickListener { scope.launch { - listener.onDelete(bean) - delete(bean.id) + askToDeleteAll() } true } } - if (beans.isNotEmpty()) { - add(R.string.delete_all).apply { - setIcon(R.drawable.ic_baseline_delete_sweep_24) - setOnMenuItemClickListener { - scope.launch { - askToDeleteAll() - } - true - } - } - } - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - menu.setForceShowIcon(true) } - menu.show() - true } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + menu.setForceShowIcon(true) + } + menu.show() + true } } } diff --git a/app/src/main/java/com/osfans/trime/ime/symbol/SimpleAdapter.kt b/app/src/main/java/com/osfans/trime/ime/symbol/SimpleAdapter.kt index 1df65043b5..6b51e4b622 100644 --- a/app/src/main/java/com/osfans/trime/ime/symbol/SimpleAdapter.kt +++ b/app/src/main/java/com/osfans/trime/ime/symbol/SimpleAdapter.kt @@ -13,13 +13,11 @@ import com.osfans.trime.data.theme.Theme import com.osfans.trime.databinding.SimpleItemOneBinding import com.osfans.trime.databinding.SimpleItemRowBinding import splitties.dimensions.dp -import splitties.views.dsl.core.add -class SimpleAdapter(private val theme: Theme, private val columnSize: Int) : RecyclerView.Adapter() { +class SimpleAdapter(theme: Theme, private val columnSize: Int) : RecyclerView.Adapter() { private val mBeans = mutableListOf() private val mBeansByRows = mutableListOf>() - val beans: List - get() = mBeans + val beans get() = mBeans fun updateBeans(beans: List) { val prevSize = mBeans.size @@ -39,12 +37,25 @@ class SimpleAdapter(private val theme: Theme, private val columnSize: Int) : Rec return position * 1000L } + private val mSingleWidth = theme.liquid.getInt("single_width") + private val mTextSize = theme.style.getFloat("label_text_size") + private val mTextColor = ColorManager.getColor("key_text_color") + private val mTypeface = FontManager.getTypeface("key_font") + private val mBackground = + ColorManager.getDrawable( + "key_back_color", + "key_border", + "key_border_color", + "round_corner", + null, + ) + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int, ): ViewHolder { val binding = SimpleItemRowBinding.inflate(LayoutInflater.from(parent.context), parent, false) - val size = parent.dp(theme.liquid.getInt("single_width")) + val size = parent.dp(mSingleWidth) val bindings = mutableListOf() for (i in 0 until columnSize) { val sub = SimpleItemOneBinding.inflate(LayoutInflater.from(parent.context), null, false) @@ -52,22 +63,15 @@ class SimpleAdapter(private val theme: Theme, private val columnSize: Int) : Rec binding.wrapper.addView(sub.root, size, size) } val holder = ViewHolder(binding, bindings) - for ((i, textView) in holder.simpleKeyTexts.withIndex()) { - holder.wrappers[i].tag = i + holder.simpleKeyTexts.forEachIndexed { index, textView -> + holder.wrappers[index].tag = index textView.apply { - theme.style.getFloat("label_text_size").takeIf { it > 0f }?.let { textSize = it } - ColorManager.getColor("key_text_color")?.let { setTextColor(it) } - typeface = FontManager.getTypeface("key_font") - gravity = Gravity.CENTER - ellipsize = TextUtils.TruncateAt.MARQUEE - background = - ColorManager.getDrawable( - "key_back_color", - "key_border", - "key_border_color", - "round_corner", - null, - ) + mTextSize.takeIf { it > 0f }?.let { this.textSize = it } + mTextColor?.let { setTextColor(it) } + this.typeface = mTypeface + this.gravity = Gravity.CENTER + this.ellipsize = TextUtils.TruncateAt.MARQUEE + this.background = mBackground } } return holder @@ -83,15 +87,15 @@ class SimpleAdapter(private val theme: Theme, private val columnSize: Int) : Rec position: Int, ) { val bean = mBeansByRows[position] - for ((i, keyText) in holder.simpleKeyTexts.withIndex()) { - keyText.text = "" - if (i < bean.size) { - holder.wrappers[i].visibility = View.VISIBLE - keyText.text = bean[i].label + holder.simpleKeyTexts.forEachIndexed { index, textView -> + textView.text = "" + if (index < bean.size) { + holder.wrappers[index].visibility = View.VISIBLE + textView.text = bean[index].label } else { - holder.wrappers[i].visibility = View.INVISIBLE + holder.wrappers[index].visibility = View.INVISIBLE } - holder.wrappers[i] + holder.wrappers[index] .setOnClickListener { view: View -> if (view.tag != null) { listener?.invoke(position * columnSize + view.tag as Int)