diff options
Diffstat (limited to 'src/main/kotlin/pl/treksoft/kvision/panel')
-rw-r--r-- | src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt | 63 | ||||
-rw-r--r-- | src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt | 52 |
2 files changed, 115 insertions, 0 deletions
diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt new file mode 100644 index 00000000..234a9a20 --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt @@ -0,0 +1,63 @@ +package pl.treksoft.kvision.panel + +import com.github.snabbdom.VNode +import pl.treksoft.jquery.JQuery +import pl.treksoft.kvision.core.Container +import pl.treksoft.kvision.html.TAG +import pl.treksoft.kvision.html.Tag +import pl.treksoft.kvision.snabbdom.obj + +enum class DIRECTION(val dir: String) { + HORIZONTAL("horizontal"), + VERTICAL("vertical") +} + +open class SplitPanel(val direction: DIRECTION = DIRECTION.VERTICAL, + classes: Set<String> = setOf()) : Container(classes + ("splitpanel-" + direction.dir)) { + + internal val splitter = Splitter(this, direction) + + internal fun afterInsertSplitter() { + if (children.size == 2) { + val horizontal = direction == DIRECTION.HORIZONTAL + children[0].getElementJQueryD().resizable(obj { + handleSelector = "#" + splitter.id + resizeWidth = !horizontal + resizeHeight = horizontal + onDragEnd = { _: dynamic, el: JQuery, _: dynamic -> + if (horizontal) { + children[0].height = el.height().toInt() + } else { + children[0].width = el.width().toInt() + } + } + }) + } + } + + override fun childrenVNodes(): Array<VNode> { + return if (children.size == 2) { + arrayOf(children[0].render(), splitter.render(), children[1].render()) + } else { + arrayOf() + } + } +} + +class Splitter(val splitPanel: SplitPanel, direction: DIRECTION) : Tag(TAG.DIV, + classes = setOf("splitter-" + direction.dir)) { + private val idc = "kv_splitter_" + counter + + init { + counter++ + this.id = idc + } + + override fun afterInsert(node: VNode) { + splitPanel.afterInsertSplitter() + } + + companion object { + var counter = 0 + } +} diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt new file mode 100644 index 00000000..24429d42 --- /dev/null +++ b/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt @@ -0,0 +1,52 @@ +package pl.treksoft.kvision.panel + +import com.github.snabbdom.VNode +import pl.treksoft.kvision.core.Container +import pl.treksoft.kvision.core.Widget + +open class StackPanel(private val activateLast: Boolean = true, + classes: Set<String> = setOf()) : Container(classes) { + var activeIndex = -1 + set(value) { + field = value + refresh() + } + + override fun childrenVNodes(): Array<VNode> { + return if (activeIndex >= 0 && activeIndex < children.size) { + arrayOf(children[activeIndex].render()) + } else { + arrayOf() + } + } + + override fun add(child: Widget): Container { + super.add(child) + if (activateLast) activeIndex = children.size - 1 + return this + } + + override fun addAll(children: List<Widget>): Container { + super.addAll(children) + if (activateLast) activeIndex = this.children.size - 1 + return this + } + + override fun remove(child: Widget): Container { + super.remove(child) + if (activeIndex > children.size - 1) activeIndex = children.size - 1 + return this + } + + override fun removeAt(index: Int): Container { + super.removeAt(index) + if (activeIndex > children.size - 1) activeIndex = children.size - 1 + return this + } + + override fun removeAll(): Container { + super.removeAll() + if (activeIndex > children.size - 1) activeIndex = children.size - 1 + return this + } +} |