1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-10 01:51:05 +09:00

#594: add style to context menu (#756)

* #594: add style to context menu

* #594: add toast

* #594: test fix
This commit is contained in:
Konstantin Ivanov 2020-08-28 22:18:55 +03:00 committed by GitHub
parent d327bcb7eb
commit d309409887
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 115 additions and 57 deletions

View file

@ -189,7 +189,7 @@ open class PageFragment :
onProfileIconClicked = vm::onProfileIconClicked,
onTogglePlaceholderClicked = vm::onTogglePlaceholderClicked,
onToggleClicked = vm::onToggleClicked,
onMarkupActionClicked = vm::onMarkupActionClicked,
onContextMenuStyleClick = vm::onEditorContextMenuStyleClicked,
onTitleTextInputClicked = vm::onTitleTextInputClicked,
onClickListener = vm::onClickListener,
clipboardInterceptor = this,

View file

@ -19,7 +19,7 @@ import kotlinx.android.synthetic.main.item_block_bulleted.view.*
class Bulleted(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Text(view), SupportNesting {
val indent: View = itemView.bulletIndent
@ -29,7 +29,7 @@ class Bulleted(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.TEXT)
setup(onContextMenuStyleClick)
}
fun bind(

View file

@ -20,7 +20,7 @@ import kotlinx.android.synthetic.main.item_block_checkbox.view.*
class Checkbox(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Text(view), SupportNesting {
var mode = BlockView.Mode.EDIT
@ -31,7 +31,7 @@ class Checkbox(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.TEXT)
setup(onContextMenuStyleClick)
}
fun bind(

View file

@ -9,7 +9,7 @@ import kotlinx.android.synthetic.main.item_block_header_one.view.*
class HeaderOne(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Header(view) {
override val header: TextInputWidget = itemView.headerOne
@ -17,7 +17,7 @@ class HeaderOne(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.HEADER)
setup(onContextMenuStyleClick)
}
override fun getMentionImageSizeAndPadding(): Pair<Int, Int> = with(itemView) {

View file

@ -9,7 +9,7 @@ import kotlinx.android.synthetic.main.item_block_header_three.view.*
class HeaderThree(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Header(view) {
override val header: TextInputWidget = itemView.headerThree
@ -17,7 +17,7 @@ class HeaderThree(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.HEADER)
setup(onContextMenuStyleClick)
}
override fun getMentionImageSizeAndPadding(): Pair<Int, Int> = with(itemView) {

View file

@ -9,7 +9,7 @@ import kotlinx.android.synthetic.main.item_block_header_two.view.*
class HeaderTwo(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Header(view) {
override val header: TextInputWidget = itemView.headerTwo
@ -17,7 +17,7 @@ class HeaderTwo(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.HEADER)
setup(onContextMenuStyleClick)
}
override fun getMentionImageSizeAndPadding(): Pair<Int, Int> = with(itemView) {

View file

@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.item_block_highlight.view.*
class Highlight(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Text(view), BlockViewHolder.IndentableHolder {
override val content: TextInputWidget = itemView.highlightContent
@ -27,7 +27,7 @@ class Highlight(
init {
content.setSpannableFactory(DefaultSpannableFactory())
setup(onMarkupActionClicked, ContextMenuType.HIGHLIGHT)
setup(onContextMenuStyleClick)
}
fun bind(

View file

@ -16,7 +16,7 @@ import kotlinx.android.synthetic.main.item_block_numbered.view.*
class Numbered(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Text(view), SupportNesting {
private val container = itemView.numberedBlockContentContainer
@ -25,7 +25,7 @@ class Numbered(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.TEXT)
setup(onContextMenuStyleClick)
}
fun bind(

View file

@ -13,14 +13,14 @@ import kotlinx.android.synthetic.main.item_block_text.view.*
class Paragraph(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Text(view), SupportNesting {
override val root: View = itemView
override val content: TextInputWidget = itemView.textContent
init {
setup(onMarkupActionClicked, ContextMenuType.TEXT)
setup(onContextMenuStyleClick)
}
fun bind(

View file

@ -13,7 +13,7 @@ import kotlinx.android.synthetic.main.item_block_toggle.view.*
class Toggle(
view: View,
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit
onContextMenuStyleClick: (IntRange) -> Unit
) : Text(view), SupportNesting {
private var mode = BlockView.Mode.EDIT
@ -26,7 +26,7 @@ class Toggle(
override val root: View = itemView
init {
setup(onMarkupActionClicked, ContextMenuType.TEXT)
setup(onContextMenuStyleClick)
}
fun bind(

View file

@ -88,7 +88,7 @@ class BlockAdapter(
private val onProfileIconClicked: () -> Unit,
private val onTogglePlaceholderClicked: (String) -> Unit,
private val onToggleClicked: (String) -> Unit,
private val onMarkupActionClicked: (Markup.Type, IntRange) -> Unit,
private val onContextMenuStyleClick: (IntRange) -> Unit,
private val clipboardInterceptor: ClipboardInterceptor,
private val onMentionEvent: (MentionEvent) -> Unit
) : RecyclerView.Adapter<BlockViewHolder>() {
@ -107,7 +107,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_TITLE -> {
@ -135,7 +135,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_HEADER_TWO -> {
@ -145,7 +145,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_HEADER_THREE -> {
@ -155,7 +155,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_CODE_SNIPPET -> {
@ -174,7 +174,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_BULLET -> {
@ -184,7 +184,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_NUMBERED -> {
@ -194,7 +194,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_TOGGLE -> {
@ -204,7 +204,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
HOLDER_FILE -> {
@ -367,7 +367,7 @@ class BlockAdapter(
parent,
false
),
onMarkupActionClicked = onMarkupActionClicked
onContextMenuStyleClick = onContextMenuStyleClick
)
}
else -> throw IllegalStateException("Unexpected view type: $viewType")

View file

@ -7,8 +7,7 @@ import com.agileburo.anytype.core_ui.extensions.cursorYBottomCoordinate
import com.agileburo.anytype.core_ui.extensions.preserveSelection
import com.agileburo.anytype.core_ui.extensions.range
import com.agileburo.anytype.core_ui.features.editor.holders.`interface`.TextHolder
import com.agileburo.anytype.core_ui.menu.ContextMenuType
import com.agileburo.anytype.core_ui.menu.TextBlockContextMenu
import com.agileburo.anytype.core_ui.menu.EditorContextMenu
import com.agileburo.anytype.core_ui.tools.DefaultSpannableFactory
import com.agileburo.anytype.core_ui.tools.DefaultTextWatcher
import com.agileburo.anytype.core_ui.tools.MentionTextWatcher
@ -23,12 +22,11 @@ import timber.log.Timber
interface TextBlockHolder : TextHolder {
fun setup(
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit,
menuType: ContextMenuType
onContextMenuStyleClick: (IntRange) -> Unit
) {
with(content) {
setSpannableFactory(DefaultSpannableFactory())
setupSelectionActionMode(onMarkupActionClicked, menuType)
setupSelectionActionMode(onContextMenuStyleClick)
}
}
@ -211,29 +209,17 @@ interface TextBlockHolder : TextHolder {
}
private fun setupSelectionActionMode(
onMarkupActionClicked: (Markup.Type, IntRange) -> Unit,
menuType: ContextMenuType
onContextMenuStyleClick: (IntRange) -> Unit
) {
with(content) {
customSelectionActionModeCallback = TextBlockContextMenu(
menuType = menuType,
onTextColorClicked = { mode ->
customSelectionActionModeCallback = EditorContextMenu(
onStyleClick = {
preserveSelection {
content.hideKeyboard()
onMarkupActionClicked(Markup.Type.TEXT_COLOR, content.range())
mode.finish()
onContextMenuStyleClick.invoke(content.range())
//todo maybe add mode.finish
}
false
},
onBackgroundColorClicked = { mode ->
preserveSelection {
content.hideKeyboard()
onMarkupActionClicked(Markup.Type.BACKGROUND_COLOR, content.range())
mode.finish()
}
false
},
onMenuItemClicked = { onMarkupActionClicked(it, content.range()) }
}
)
}
}

View file

@ -0,0 +1,55 @@
package com.agileburo.anytype.core_ui.menu
import android.os.Build
import android.view.ActionMode
import android.view.Menu
import android.view.MenuItem
import com.agileburo.anytype.core_ui.R
class EditorContextMenu(
private val onStyleClick: () -> Unit
) : ActionMode.Callback2(){
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
menu.apply {
add(0, android.R.id.textAssist, 0, TITLE_STYLE)
}
} else {
menu.apply {
add(0, R.id.menuStyle, 3, TITLE_STYLE)
}
}
return true
}
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean =
when (item.itemId) {
android.R.id.textAssist -> {
when (item.title) {
TITLE_STYLE -> {
onStyleClick()
//mode.finish()
true
}
else -> false
}
}
R.id.menuStyle -> {
onStyleClick()
//mode.finish()
true
}
else -> false
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return false
}
override fun onDestroyActionMode(mode: ActionMode?) {}
companion object {
const val TITLE_STYLE = "Style"
}
}

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="menuStyle" type="id"/>
</resources>

View file

@ -3367,7 +3367,7 @@ class BlockAdapterTest {
onTextBlockTextChanged = {},
onTitleTextChanged = onTitleTextChanged,
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
onMarkupActionClicked = { _, _ -> },
onContextMenuStyleClick = {},
onTitleTextInputClicked = {},
onClickListener = {},
clipboardInterceptor = clipboardInterceptor,

View file

@ -374,7 +374,7 @@ class HeaderBlockTest {
onTextBlockTextChanged = {},
onTitleTextChanged = onTitleTextChanged,
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
onMarkupActionClicked = { _, _ -> },
onContextMenuStyleClick = {},
onTitleTextInputClicked = {},
onClickListener = {},
clipboardInterceptor = clipboardInterceptor,

View file

@ -111,7 +111,7 @@ class HighlightingBlockTest {
onTextBlockTextChanged = {},
onTitleTextChanged = onTitleTextChanged,
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
onMarkupActionClicked = { _, _ -> },
onContextMenuStyleClick = {},
onTitleTextInputClicked = {},
onClickListener = {},
clipboardInterceptor = clipboardInterceptor,

View file

@ -375,7 +375,7 @@ class BlockAdapterCursorBindingTest {
onTextBlockTextChanged = {},
onTitleTextChanged = onTitleTextChanged,
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
onMarkupActionClicked = { _, _ -> },
onContextMenuStyleClick = {},
onTitleTextInputClicked = {},
onClickListener = {},
clipboardInterceptor = clipboardInterceptor,

View file

@ -47,7 +47,7 @@ open class BlockAdapterTestSetup {
onTextBlockTextChanged = onTextBlockTextChanged,
onTitleTextChanged = onTitleTextChanged,
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
onMarkupActionClicked = { _, _ -> },
onContextMenuStyleClick = {},
onTitleTextInputClicked = {},
onClickListener = {},
clipboardInterceptor = clipboardInterceptor,

View file

@ -804,6 +804,19 @@ class PageViewModel(
)
}
fun onEditorContextMenuStyleClicked(selection: IntRange) {
val target = blocks.first { it.id == orchestrator.stores.focus.current().id }
val config = target.getStyleConfig(focus = true, selection = selection)
_error.value = "Style menu clicked"
// controlPanelInteractor.onEvent(
// ControlPanelMachine.Event.OnMarkupContextMenuStyleClicked(
// target = target,
// selection = selection,
// config = config
// )
// )
}
fun onMarkupActionClicked(markup: Markup.Type, selection: IntRange) {
when (markup) {
Markup.Type.BACKGROUND_COLOR -> {