anytype-kotlin-wild/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/text/Callout.kt

153 lines
6.2 KiB
Kotlin

package com.anytypeio.anytype.core_ui.features.editor.holders.text
import android.graphics.drawable.Drawable
import android.text.Editable
import android.view.View
import android.widget.FrameLayout
import androidx.core.content.ContextCompat
import androidx.core.view.updateLayoutParams
import com.anytypeio.anytype.core_models.ThemeColor
import com.anytypeio.anytype.core_ui.BuildConfig
import com.anytypeio.anytype.core_ui.R
import com.anytypeio.anytype.core_ui.databinding.ItemBlockCalloutBinding
import com.anytypeio.anytype.core_ui.extensions.setBlockBackgroundTintColor
import com.anytypeio.anytype.core_ui.extensions.veryLight
import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil
import com.anytypeio.anytype.core_ui.features.editor.BlockViewHolder
import com.anytypeio.anytype.core_ui.features.editor.SupportNesting
import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableViewHolder
import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer
import com.anytypeio.anytype.core_ui.features.editor.marks
import com.anytypeio.anytype.core_ui.tools.DefaultSpannableFactory
import com.anytypeio.anytype.core_ui.widgets.ObjectIconWidget
import com.anytypeio.anytype.core_ui.widgets.text.TextInputWidget
import com.anytypeio.anytype.core_utils.ext.dimen
import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType
import com.anytypeio.anytype.presentation.editor.editor.mention.MentionEvent
import com.anytypeio.anytype.presentation.editor.editor.model.BlockView
import com.anytypeio.anytype.presentation.editor.editor.slash.SlashEvent
class Callout(
val binding: ItemBlockCalloutBinding,
clicked: (ListenerType) -> Unit,
) : Text <BlockView.Text.Callout>(
view = binding.root,
clicked = clicked
), BlockViewHolder.IndentableHolder, SupportNesting, DecoratableViewHolder {
override val root: View = itemView
override val content: TextInputWidget = binding.calloutText
private val icon: ObjectIconWidget = binding.calloutIcon
private val mentionIconSize: Int
private val mentionIconPadding: Int
private val mentionCheckedIcon: Drawable?
private val mentionUncheckedIcon: Drawable?
private val mentionInitialsSize: Float
private val indentOffset = dimen(R.dimen.default_indent)
override val decoratableContainer: EditorDecorationContainer = binding.decorationContainer
init {
content.setSpannableFactory(DefaultSpannableFactory())
setup()
with(itemView.context) {
mentionIconSize =
resources.getDimensionPixelSize(R.dimen.mention_span_image_size_default)
mentionIconPadding =
resources.getDimensionPixelSize(R.dimen.mention_span_image_padding_default)
mentionUncheckedIcon = ContextCompat.getDrawable(this, R.drawable.ic_task_0_text_16)
mentionCheckedIcon = ContextCompat.getDrawable(this, R.drawable.ic_task_1_text_16)
mentionInitialsSize = resources.getDimension(R.dimen.mention_span_initials_size_default)
}
}
override fun bind(
item: BlockView.Text.Callout
) = super.bind(
item = item
).also {
icon.setIcon(item.icon)
icon.setOnClickListener {
clicked(ListenerType.Callout.Icon(item.id))
}
}
override fun processChangePayload(
payloads: List<BlockViewDiffUtil.Payload>,
item: BlockView,
clicked: (ListenerType) -> Unit,
) {
val callout = requireNotNull(item as? BlockView.Text.Callout) {
"Failed to processChangePayload. $item must be Callout"
}
payloads.forEach { payload ->
if (payload.isCalloutIconChanged) {
icon.setIcon(callout.icon)
}
}
super.processChangePayload(
payloads,
item,
clicked,
)
}
override fun select(item: BlockView.Selectable) {
binding.selectionView.isSelected = item.isSelected
}
override fun indentize(item: BlockView.Indentable) {
if (!BuildConfig.NESTED_DECORATION_ENABLED) {
binding.calloutCardContainer.updateLayoutParams<FrameLayout.LayoutParams> {
marginStart = indentOffset + (item.indent * indentOffset)
marginEnd = indentOffset
}
}
}
override fun setBackgroundColor(color: ThemeColor) {
if (!BuildConfig.NESTED_DECORATION_ENABLED) {
binding.calloutCardContainer.setBlockBackgroundTintColor(
color = color,
default = itemView.resources.veryLight(
color = ThemeColor.GREY
)
)
}
}
override fun getMentionIconSize(): Int = mentionIconSize
override fun getMentionIconPadding(): Int = mentionIconPadding
override fun getMentionCheckedIcon(): Drawable? = mentionCheckedIcon
override fun getMentionUncheckedIcon(): Drawable? = mentionUncheckedIcon
override fun getMentionInitialsSize(): Float = mentionInitialsSize
override fun applyDecorations(decorations: List<BlockView.Decoration>) {
if (BuildConfig.NESTED_DECORATION_ENABLED) {
val indent = decorations.lastIndex
val last = decorations.last()
decoratableContainer.decorate(decorations) { rect ->
binding.calloutCardContainer.updateLayoutParams<FrameLayout.LayoutParams> {
marginStart = if (indent == 0) rect.left + indentOffset else rect.left
marginEnd = rect.right
bottomMargin = rect.bottom
}
}
when (last.style) {
is BlockView.Decoration.Style.Callout.Start -> {
binding.calloutCardContainer.setBackgroundResource(R.drawable.rect_callout_start)
}
is BlockView.Decoration.Style.Callout.Full -> {
binding.calloutCardContainer.setBackgroundResource(R.drawable.rect_callout_full)
}
else -> {}
}
binding.calloutCardContainer.setBlockBackgroundTintColor(
color = last.background,
default = itemView.resources.getColor(R.color.palette_very_light_grey, null)
)
}
}
}