Skip to content

Commit

Permalink
Expose judo.mapper.window to scripting
Browse files Browse the repository at this point in the history
Closes #73

This commit also renames the internal IJudoWindow.onSubmit to
`onSubmitFn`.  It's a little annoying, but it allows a simple
implementation of onSubmit for `IScriptWindow` that doesn't conflict
with `IJudoWindow`, so implementations of `IScriptWindow` can also
implement `IJudoWindow` for greater interop.
  • Loading branch information
dhleong committed Feb 20, 2019
1 parent a00b0ca commit 83b4bb6
Show file tree
Hide file tree
Showing 9 changed files with 46 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class TestableJudoCore(
null
}

window?.onSubmit?.let {
window?.onSubmitFn?.let {
it(text)
} ?: send(text, fromMap)
}
Expand Down Expand Up @@ -170,7 +170,7 @@ fun createWindowMock(
else -> height
}

override var onSubmit: ((String) -> Unit)? = null
override var onSubmitFn: ((String) -> Unit)? = null

override var currentBuffer: IJudoBuffer
get() = buffer
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/kotlin/net/dhleong/judo/JudoCore.kt
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,7 @@ class JudoCore(
}

override fun submit(text: String, fromMap: Boolean) {
val onSubmit = renderer.currentTabpage.currentWindow.onSubmit
val onSubmit = renderer.currentTabpage.currentWindow.onSubmitFn
?: return send(text, fromMap)

onSubmit(text)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ abstract class BaseJudoWindow(

protected val search = BufferSearcher()

override var onSubmit: ((String) -> Unit)? = null
override var onSubmitFn: ((String) -> Unit)? = null

override fun append(text: FlavorableCharSequence) = currentBuffer.append(text)
override fun appendLine(line: FlavorableCharSequence) = currentBuffer.appendLine(line)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ abstract class PrimaryJudoWindow(
override val statusCursor: Int
get() = promptWindow.statusCursor

override var onSubmit: ((String) -> Unit)?
override var onSubmitFn: ((String) -> Unit)?
get() = null
set(_) {
throw IllegalArgumentException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import net.dhleong.judo.alias.compileSimplePatternSpec
import net.dhleong.judo.event.IEventManager
import net.dhleong.judo.logging.ILogManager
import net.dhleong.judo.mapping.IJudoMap
import net.dhleong.judo.mapping.IMapManager
import net.dhleong.judo.mapping.IMapManagerPublic
import net.dhleong.judo.prompt.IPromptManager
import net.dhleong.judo.render.IJudoBuffer
Expand Down Expand Up @@ -109,7 +108,14 @@ abstract class Jsr223ScriptingEngine(
is IAliasManager -> object : IAliasManager by fromJava {}
is IEventManager -> object : IEventManager by fromJava {}
is ILogManager -> object : ILogManager by fromJava {}
is IMapManagerPublic -> object : IMapManagerPublic by fromJava {}
is IMapManagerPublic -> object : IMapManagerPublic by fromJava {
override var window: IJudoWindow?
get() = fromJava.window
set(value) {
// unpack for simplicity
fromJava.window = (value as? Jsr223Window)?.window ?: value
}
}
is IPromptManager -> object : IPromptManager by fromJava {}
is ITriggerManager -> object : ITriggerManager by fromJava {}
is JudoRendererInfo -> object : JudoRendererInfo by fromJava {}
Expand Down Expand Up @@ -137,8 +143,8 @@ class Jsr223JudoCore(
private val engine: Jsr223ScriptingEngine,
private val judo: IJudoCore
) : IScriptJudo, ICurrentJudoObjects {
override val mapper: IMapManager
get() = judo.mapper
override val mapper: IMapManagerPublic
get() = engine.toScript(judo.mapper) as IMapManagerPublic

override val current: ICurrentJudoObjects = this

Expand All @@ -165,8 +171,8 @@ class Jsr223JudoCore(
class Jsr223Window(
private val engine: Jsr223ScriptingEngine,
private val tabpage: IJudoTabpage,
private val window: IJudoWindow
) : IScriptWindow {
internal val window: IJudoWindow
) : IScriptWindow, IJudoWindow by window {

override val id: Int = window.id
override val width: Int = window.width
Expand All @@ -176,9 +182,9 @@ class Jsr223Window(

@Suppress("UNCHECKED_CAST")
override var onSubmit: Any?
get() = window.onSubmit?.let { engine.toScript(it) }
get() = window.onSubmitFn?.let { engine.toScript(it) }
set(value) {
window.onSubmit = value?.let { engine.callableToFunction1(it) as (String) -> Unit }
window.onSubmitFn = value?.let { engine.callableToFunction1(it) as (String) -> Unit }
}

override fun close() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,7 @@ internal fun createPyWindow(
"width" -> Py.java2py(window.width)
"id" -> Py.java2py(window.id)

"onSubmit" -> Py.java2py(window.onSubmit)
"onSubmit" -> Py.java2py(window.onSubmitFn)

// not used oft enough to cache
"close" -> asPyFn<Any, Unit>("close") {
Expand All @@ -573,7 +573,7 @@ internal fun createPyWindow(
@Suppress("UNCHECKED_CAST")
when (name) {
"onSubmit" -> {
window.onSubmit = when (value) {
window.onSubmitFn = when (value) {
null -> null
is PyNone -> null
else -> engine.callableToFunction1(value) as (String) -> Unit
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import assertk.assertions.isEmpty
import assertk.assertions.isEqualTo
import assertk.assertions.isNotEmpty
import assertk.assertions.isNotNull
import assertk.assertions.isNotSameAs
import assertk.assertions.isSameAs
import assertk.assertions.message
import assertk.assertions.support.expected
import net.dhleong.judo.hasHeight
Expand Down Expand Up @@ -214,6 +216,26 @@ class CmdModeObjectInteropTest(
assert(judo.sends, "sends").containsExactly("mreynolds")
}
}

@Test fun `Mapper window binding`() {
val primary = judo.renderer.currentTabpage.currentWindow
mode.execute("""
judo.mapper.createEmpty()
print(judo.mapper.window.id)
w = hsplit(10)
judo.mapper.window = w
print(judo.mapper.window.id)
""".trimIndent())

val splitWindow = judo.tabpage.currentWindow
assert(splitWindow).isNotSameAs(primary)
assert(judo.prints).containsExactly(
primary.id,
splitWindow.id
)
assert(judo.mapper.window).isSameAs(splitWindow)
}
}

private fun Assert<File>.doesNotExist() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ interface IJudoWindow : IJudoAppendable {
* Optional property; if set, *when this window is focused* any user input
* will come to this function instead of [net.dhleong.judo.IJudoCore.send].
*/
var onSubmit: ((String) -> Unit)?
var onSubmitFn: ((String) -> Unit)?

/**
* Common-use convenience
Expand Down
4 changes: 2 additions & 2 deletions model/src/main/kotlin/net/dhleong/judo/script/IScriptJudo.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.dhleong.judo.script

import net.dhleong.judo.mapping.IMapManager
import net.dhleong.judo.mapping.IMapManagerPublic

/**
* Subset of [net.dhleong.judo.IJudoCore] that is exposed to scripting
Expand All @@ -9,7 +9,7 @@ import net.dhleong.judo.mapping.IMapManager
*/
interface IScriptJudo {

val mapper: IMapManager
val mapper: IMapManagerPublic
val current: ICurrentJudoObjects

}
Expand Down

0 comments on commit 83b4bb6

Please sign in to comment.