diff options
author | Robert Jaros <rjaros@finn.pl> | 2017-10-28 23:45:26 +0200 |
---|---|---|
committer | Robert Jaros <rjaros@finn.pl> | 2017-10-28 23:45:26 +0200 |
commit | 06f297d68887c7934e66d2c757abc8bf619df66a (patch) | |
tree | a828eec09f0bdc99b0f3fd45972b8cead37fbdec /src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt | |
parent | 6b13b8909a302b0f0f2155b81b83cd5ab4d7a046 (diff) | |
download | kvision-06f297d68887c7934e66d2c757abc8bf619df66a.tar.gz kvision-06f297d68887c7934e66d2c757abc8bf619df66a.tar.bz2 kvision-06f297d68887c7934e66d2c757abc8bf619df66a.zip |
Databinding components
Event handlers refactoring
Diffstat (limited to 'src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt')
-rw-r--r-- | src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt b/src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt new file mode 100644 index 00000000..3b6d3aa8 --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt @@ -0,0 +1,60 @@ +package pl.treksoft.kvision.data + +import com.github.snabbdom.VNode +import com.lightningkite.kotlin.observable.list.ObservableList +import pl.treksoft.kvision.core.Container +import pl.treksoft.kvision.core.Widget +import pl.treksoft.kvision.panel.VPanel + +class DataContainer<M : DataComponent, C : Widget>(val model: ObservableList<M>, + private val binding: (M, Int) -> C, + private val child: Container = VPanel()) : + Widget(setOf()), Container, DataUpdatable { + + override var visible + get() = child.visible + set(value) { + child.visible = value + } + + init { + child.parent = this + model.onUpdate += { _ -> + update() + } + update() + } + + override fun add(child: Widget): Container { + return this.child.add(child) + } + + override fun addAll(children: List<Widget>): Container { + return this.child.addAll(children) + } + + override fun remove(child: Widget): Container { + return this.child.remove(child) + } + + override fun removeAll(): Container { + return this.child.removeAll() + } + + override fun getChildren(): List<Widget> { + return this.child.getChildren() + } + + override fun renderVNode(): VNode { + return this.child.renderVNode() + } + + override fun update() { + model.forEach { it.container = this } + singleRender { + child.removeAll() + child.addAll(model.mapIndexed { index, m -> binding(m, index) }) + } + } + +} |