mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-10 01:51:05 +09:00
parent
d327bcb7eb
commit
d309409887
20 changed files with 115 additions and 57 deletions
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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()) }
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
4
core-ui/src/main/res/values/ids.xml
Normal file
4
core-ui/src/main/res/values/ids.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<item name="menuStyle" type="id"/>
|
||||
</resources>
|
|
@ -3367,7 +3367,7 @@ class BlockAdapterTest {
|
|||
onTextBlockTextChanged = {},
|
||||
onTitleTextChanged = onTitleTextChanged,
|
||||
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
|
||||
onMarkupActionClicked = { _, _ -> },
|
||||
onContextMenuStyleClick = {},
|
||||
onTitleTextInputClicked = {},
|
||||
onClickListener = {},
|
||||
clipboardInterceptor = clipboardInterceptor,
|
||||
|
|
|
@ -374,7 +374,7 @@ class HeaderBlockTest {
|
|||
onTextBlockTextChanged = {},
|
||||
onTitleTextChanged = onTitleTextChanged,
|
||||
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
|
||||
onMarkupActionClicked = { _, _ -> },
|
||||
onContextMenuStyleClick = {},
|
||||
onTitleTextInputClicked = {},
|
||||
onClickListener = {},
|
||||
clipboardInterceptor = clipboardInterceptor,
|
||||
|
|
|
@ -111,7 +111,7 @@ class HighlightingBlockTest {
|
|||
onTextBlockTextChanged = {},
|
||||
onTitleTextChanged = onTitleTextChanged,
|
||||
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
|
||||
onMarkupActionClicked = { _, _ -> },
|
||||
onContextMenuStyleClick = {},
|
||||
onTitleTextInputClicked = {},
|
||||
onClickListener = {},
|
||||
clipboardInterceptor = clipboardInterceptor,
|
||||
|
|
|
@ -375,7 +375,7 @@ class BlockAdapterCursorBindingTest {
|
|||
onTextBlockTextChanged = {},
|
||||
onTitleTextChanged = onTitleTextChanged,
|
||||
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
|
||||
onMarkupActionClicked = { _, _ -> },
|
||||
onContextMenuStyleClick = {},
|
||||
onTitleTextInputClicked = {},
|
||||
onClickListener = {},
|
||||
clipboardInterceptor = clipboardInterceptor,
|
||||
|
|
|
@ -47,7 +47,7 @@ open class BlockAdapterTestSetup {
|
|||
onTextBlockTextChanged = onTextBlockTextChanged,
|
||||
onTitleTextChanged = onTitleTextChanged,
|
||||
onEndLineEnterTitleClicked = onEndLineEnterTitleClicked,
|
||||
onMarkupActionClicked = { _, _ -> },
|
||||
onContextMenuStyleClick = {},
|
||||
onTitleTextInputClicked = {},
|
||||
onClickListener = {},
|
||||
clipboardInterceptor = clipboardInterceptor,
|
||||
|
|
|
@ -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 -> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue