aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt
diff options
context:
space:
mode:
authorRobert Jaros <rjaros@finn.pl>2017-10-28 23:45:26 +0200
committerRobert Jaros <rjaros@finn.pl>2017-10-28 23:45:26 +0200
commit06f297d68887c7934e66d2c757abc8bf619df66a (patch)
treea828eec09f0bdc99b0f3fd45972b8cead37fbdec /src/main/kotlin/pl/treksoft/kvision/data/DataContainer.kt
parent6b13b8909a302b0f0f2155b81b83cd5ab4d7a046 (diff)
downloadkvision-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.kt60
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) })
+ }
+ }
+
+}