Correct tree controls for groups and proxy
This commit is contained in:
parent
5c16642c14
commit
66caebb090
@ -80,7 +80,7 @@ private fun VisualGroup3D.addSolid(
|
|||||||
val innerSolid = solid.solidref.resolve(context.root)
|
val innerSolid = solid.solidref.resolve(context.root)
|
||||||
?: error("Solid with tag ${solid.solidref.ref} for scaled solid ${solid.name} not defined")
|
?: error("Solid with tag ${solid.solidref.ref} for scaled solid ${solid.name} not defined")
|
||||||
|
|
||||||
addSolid(context, innerSolid) {
|
addSolid(context, innerSolid, name) {
|
||||||
block()
|
block()
|
||||||
scaleX *= solid.scale.x.toFloat()
|
scaleX *= solid.scale.x.toFloat()
|
||||||
scaleY *= solid.scale.y.toFloat()
|
scaleY *= solid.scale.y.toFloat()
|
||||||
@ -152,7 +152,7 @@ private fun VisualGroup3D.addPhysicalVolume(
|
|||||||
val group = volume(context, volume)
|
val group = volume(context, volume)
|
||||||
//optimizing single child case
|
//optimizing single child case
|
||||||
if (context.optimizeSingleChild && group.children.size == 1) {
|
if (context.optimizeSingleChild && group.children.size == 1) {
|
||||||
this[physVolume.name ?: "@unnamed"] = group.children.values.first().apply {
|
this[physVolume.name ?: ""] = group.children.values.first().apply {
|
||||||
//Must ser this to avoid parent reset error
|
//Must ser this to avoid parent reset error
|
||||||
parent = null
|
parent = null
|
||||||
//setting offset from physical volume
|
//setting offset from physical volume
|
||||||
@ -167,7 +167,7 @@ private fun VisualGroup3D.addPhysicalVolume(
|
|||||||
rotation += group.rotation
|
rotation += group.rotation
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this[physVolume.name ?: "@unnamed"] = group.apply {
|
this[physVolume.name ?: ""] = group.apply {
|
||||||
withPosition(
|
withPosition(
|
||||||
context.lUnit,
|
context.lUnit,
|
||||||
physVolume.resolvePosition(context.root),
|
physVolume.resolvePosition(context.root),
|
||||||
|
@ -15,8 +15,9 @@ import kotlinx.coroutines.GlobalScope
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.html.InputType
|
import kotlinx.html.InputType
|
||||||
import kotlinx.html.dom.append
|
import kotlinx.html.dom.append
|
||||||
import kotlinx.html.js.div
|
|
||||||
import kotlinx.html.js.input
|
import kotlinx.html.js.input
|
||||||
|
import kotlinx.html.js.li
|
||||||
|
import kotlinx.html.js.ul
|
||||||
import org.w3c.dom.Element
|
import org.w3c.dom.Element
|
||||||
import org.w3c.dom.HTMLDivElement
|
import org.w3c.dom.HTMLDivElement
|
||||||
import org.w3c.dom.events.Event
|
import org.w3c.dom.events.Event
|
||||||
@ -79,11 +80,12 @@ private class GDMLDemoApp : ApplicationBase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setupSidebar(element: Element, output: ThreeOutput) {
|
fun setupSidebar(element: Element, output: ThreeOutput, root: VisualObject3D) {
|
||||||
element.clear()
|
element.clear()
|
||||||
(0..9).forEach { layer ->
|
|
||||||
element.append {
|
element.append {
|
||||||
div("row") {
|
ul("list-group") {
|
||||||
|
(0..9).forEach { layer ->
|
||||||
|
li("list-group-item") {
|
||||||
+"layer $layer"
|
+"layer $layer"
|
||||||
input(type = InputType.checkBox).apply {
|
input(type = InputType.checkBox).apply {
|
||||||
if (layer == 0) {
|
if (layer == 0) {
|
||||||
@ -101,6 +103,8 @@ private class GDMLDemoApp : ApplicationBase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
element.appendFancyTree(root)
|
||||||
|
}
|
||||||
|
|
||||||
private val gdmlConfiguration: GDMLTransformer.() -> Unit = {
|
private val gdmlConfiguration: GDMLTransformer.() -> Unit = {
|
||||||
lUnit = LUnit.CM
|
lUnit = LUnit.CM
|
||||||
@ -118,8 +122,6 @@ private class GDMLDemoApp : ApplicationBase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// optimizeSingleChild = true
|
|
||||||
|
|
||||||
solidConfiguration = { parent, solid ->
|
solidConfiguration = { parent, solid ->
|
||||||
if (!parent.physVolumes.isEmpty()) {
|
if (!parent.physVolumes.isEmpty()) {
|
||||||
opacity = 0.3
|
opacity = 0.3
|
||||||
@ -169,7 +171,7 @@ private class GDMLDemoApp : ApplicationBase() {
|
|||||||
|
|
||||||
//output.camera.layers.enable(1)
|
//output.camera.layers.enable(1)
|
||||||
output.camera.layers.set(0)
|
output.camera.layers.set(0)
|
||||||
setupSidebar(sidebar, output)
|
setupSidebar(sidebar, output, visual)
|
||||||
|
|
||||||
output.render(visual)
|
output.render(visual)
|
||||||
launch {
|
launch {
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
package hep.dataforge.vis.spatial.gdml.demo
|
||||||
|
|
||||||
|
import hep.dataforge.vis.spatial.VisualObject3D
|
||||||
|
import hep.dataforge.vis.spatial.tree.JSVisualTree
|
||||||
|
import nl.adaptivity.js.util.asElement
|
||||||
|
import org.w3c.dom.Element
|
||||||
|
|
||||||
|
fun Element.appendFancyTree(root: VisualObject3D){
|
||||||
|
val visualTree = JSVisualTree("world", root) {}
|
||||||
|
val treeNode = visualTree.root
|
||||||
|
treeNode.asElement()!!.id = "fancytree"
|
||||||
|
appendChild(treeNode)
|
||||||
|
}
|
@ -6,7 +6,8 @@
|
|||||||
<title>Three js demo for particle physics</title>
|
<title>Three js demo for particle physics</title>
|
||||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
|
||||||
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery.fancytree/2.27.0/skin-win8/ui.fancytree.css">
|
<script src="https://cdn.jsdelivr.net/npm/jquery.fancytree@2.32.0/dist/modules/jquery.fancytree.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery.fancytree@2.32.0/dist/skin-bootstrap/ui.fancytree.min.css">
|
||||||
<link rel="stylesheet" href="main.css">
|
<link rel="stylesheet" href="main.css">
|
||||||
<script type="text/javascript" src="main.bundle.js"></script>
|
<script type="text/javascript" src="main.bundle.js"></script>
|
||||||
</head>
|
</head>
|
||||||
@ -22,15 +23,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="container loader" id="loader" style="display:none;"></div>
|
<div class="container loader" id="loader" style="display:none;"></div>
|
||||||
<div class="container animate-bottom" id="message" style="display:none;"></div>
|
<div class="container animate-bottom" id="message" style="display:none;"></div>
|
||||||
<div class="container">
|
<div class="container-fluid">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-9" id="canvas"></div>
|
<div class="col-9" id="canvas"></div>
|
||||||
<div class="col-3" id="sidebar"></div>
|
<div class="col-3" id="sidebar"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"
|
||||||
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
|
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
|
||||||
crossorigin="anonymous"></script>
|
crossorigin="anonymous"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
|
||||||
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
|
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
|
||||||
|
@ -31,8 +31,8 @@ kotlin {
|
|||||||
implementation(npm("@hi-level/three-csg", "1.0.6"))
|
implementation(npm("@hi-level/three-csg", "1.0.6"))
|
||||||
implementation(npm("style-loader"))
|
implementation(npm("style-loader"))
|
||||||
implementation(npm("element-resize-event"))
|
implementation(npm("element-resize-event"))
|
||||||
api("kotlin.js.externals:kotlin-js-jquery:3.2.0-0")
|
// api("kotlin.js.externals:kotlin-js-jquery:3.2.0-0")
|
||||||
implementation(npm("jquery.fancytree","2.32.0"))
|
// implementation(npm("jquery.fancytree","2.32.0"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ class VisualGroup3D : AbstractVisualGroup(), VisualObject3D {
|
|||||||
/**
|
/**
|
||||||
* TODO add special static group to hold statics without propagation
|
* TODO add special static group to hold statics without propagation
|
||||||
*/
|
*/
|
||||||
override fun addStatic(child: VisualObject) = setChild(NameToken(child.hashCode().toString()), child)
|
override fun addStatic(child: VisualObject) = setChild(NameToken("@static(${child.hashCode()})"), child)
|
||||||
|
|
||||||
override fun createGroup(name: Name): VisualGroup3D {
|
override fun createGroup(name: Name): VisualGroup3D {
|
||||||
return when {
|
return when {
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
package hep.dataforge.vis.spatial.tree
|
||||||
|
|
||||||
|
import hep.dataforge.vis.common.VisualObject
|
||||||
|
|
||||||
|
interface VisualTree<out T: VisualObject> {
|
||||||
|
val item: T?
|
||||||
|
val children: Collection<VisualTree<T>>
|
||||||
|
}
|
@ -1,427 +0,0 @@
|
|||||||
@file:JsModule("jquery.fancytree")
|
|
||||||
@file:JsNonModule
|
|
||||||
@file:Suppress(
|
|
||||||
"INTERFACE_WITH_SUPERCLASS",
|
|
||||||
"OVERRIDING_FINAL_MEMBER",
|
|
||||||
"RETURN_TYPE_MISMATCH_ON_OVERRIDE",
|
|
||||||
"CONFLICTING_OVERLOADS",
|
|
||||||
"EXTERNAL_DELEGATION"
|
|
||||||
)
|
|
||||||
|
|
||||||
package ru.mipt.npm.fancytreekt
|
|
||||||
|
|
||||||
import js.externals.jquery.JQuery
|
|
||||||
import js.externals.jquery.JQueryEventObject
|
|
||||||
import js.externals.jquery.JQueryPromise
|
|
||||||
import org.w3c.dom.Element
|
|
||||||
import org.w3c.dom.HTMLElement
|
|
||||||
import org.w3c.dom.HTMLTableRowElement
|
|
||||||
import org.w3c.dom.events.Event
|
|
||||||
|
|
||||||
external fun createTree(id: String, options: FancytreeOptions = definedExternally /* null */): Fancytree
|
|
||||||
|
|
||||||
external interface Fancytree {
|
|
||||||
var `$div`: JQuery<*>
|
|
||||||
var widget: Any
|
|
||||||
var rootNode: FancytreeNode
|
|
||||||
var `$container`: JQuery<*>
|
|
||||||
var focusNode: FancytreeNode
|
|
||||||
var options: FancytreeOptions
|
|
||||||
fun activateKey(key: String): FancytreeNode
|
|
||||||
fun activateKey(key: Boolean): FancytreeNode
|
|
||||||
fun applyPatch(patchList: Array<NodePatch>): JQueryPromise<Any>
|
|
||||||
fun changeRefKey(oldRefKey: String, newRefKey: String)
|
|
||||||
fun clearCookies()
|
|
||||||
fun clearFilter()
|
|
||||||
fun count(): Number
|
|
||||||
fun debug(msg: Any)
|
|
||||||
fun filterBranches(filter: String): Number
|
|
||||||
fun filterBranches(filter: (node: FancytreeNode) -> Boolean): Number
|
|
||||||
fun filterNodes(filter: String, leavesOnly: Boolean? = definedExternally /* null */): Number
|
|
||||||
fun filterNodes(
|
|
||||||
filter: (node: FancytreeNode) -> Boolean,
|
|
||||||
leavesOnly: Boolean? = definedExternally /* null */
|
|
||||||
): Number
|
|
||||||
|
|
||||||
fun findNextNode(match: String, startNode: FancytreeNode? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun findNextNode(
|
|
||||||
match: (node: FancytreeNode) -> Boolean,
|
|
||||||
startNode: FancytreeNode? = definedExternally /* null */
|
|
||||||
): FancytreeNode
|
|
||||||
|
|
||||||
fun findAll(match: String): Array<FancytreeNode>
|
|
||||||
fun findAll(match: (node: FancytreeNode) -> Boolean?): Array<FancytreeNode>
|
|
||||||
fun generateFormElements(
|
|
||||||
selected: Boolean? = definedExternally /* null */,
|
|
||||||
active: Boolean? = definedExternally /* null */
|
|
||||||
)
|
|
||||||
|
|
||||||
fun getActiveNode(): FancytreeNode
|
|
||||||
fun getFirstChild(): FancytreeNode
|
|
||||||
fun getFocusNode(ifTreeHasFocus: Boolean? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun getNodeByKey(key: String, searchRoot: FancytreeNode? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun getNodesByRef(refKey: String, rootNode: FancytreeNode? = definedExternally /* null */): Array<FancytreeNode>
|
|
||||||
fun getPersistData()
|
|
||||||
fun getRootNode(): FancytreeNode
|
|
||||||
fun getSelectedNodes(stopOnParents: Boolean? = definedExternally /* null */): Array<FancytreeNode>
|
|
||||||
fun hasFocus(): Boolean
|
|
||||||
fun info(msg: Any)
|
|
||||||
fun isEditing(): FancytreeNode
|
|
||||||
fun loadKeyPath(
|
|
||||||
keyPathList: Array<String>,
|
|
||||||
callback: (node: FancytreeNode, status: String) -> Unit
|
|
||||||
): JQueryPromise<Any>
|
|
||||||
|
|
||||||
fun loadKeyPath(keyPath: String, callback: (node: FancytreeNode, status: String) -> Unit): JQueryPromise<Any>
|
|
||||||
fun reactivate()
|
|
||||||
fun reload(source: Any? = definedExternally /* null */): JQueryPromise<Any>
|
|
||||||
fun render(force: Boolean? = definedExternally /* null */, deep: Boolean? = definedExternally /* null */)
|
|
||||||
fun setFocus(flag: Boolean? = definedExternally /* null */)
|
|
||||||
fun toDict(
|
|
||||||
includeRoot: Boolean? = definedExternally /* null */,
|
|
||||||
callback: ((node: FancytreeNode) -> Unit)? = definedExternally /* null */
|
|
||||||
): Any
|
|
||||||
|
|
||||||
fun visit(fn: (node: FancytreeNode) -> Any): Boolean
|
|
||||||
fun warn(msg: Any)
|
|
||||||
fun enableUpdate(enabled: Boolean)
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface FancytreeNode {
|
|
||||||
var tree: Fancytree
|
|
||||||
var parent: FancytreeNode
|
|
||||||
var key: String
|
|
||||||
var title: String
|
|
||||||
var data: Any
|
|
||||||
var children: Array<FancytreeNode>
|
|
||||||
var expanded: Boolean
|
|
||||||
var extraClasses: String
|
|
||||||
var folder: Boolean
|
|
||||||
var statusNodeType: String
|
|
||||||
var lazy: Boolean
|
|
||||||
var tooltip: String
|
|
||||||
var span: HTMLElement
|
|
||||||
var tr: HTMLTableRowElement
|
|
||||||
fun addChildren(
|
|
||||||
children: Array<NodeData>,
|
|
||||||
insertBefore: FancytreeNode? = definedExternally /* null */
|
|
||||||
): FancytreeNode
|
|
||||||
|
|
||||||
fun addChildren(children: Array<NodeData>, insertBefore: String? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun addChildren(children: Array<NodeData>, insertBefore: Number? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun addChildren(child: NodeData, insertBefore: FancytreeNode? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun addChildren(child: NodeData, insertBefore: String? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun addChildren(child: NodeData, insertBefore: Number? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun addClass(className: String)
|
|
||||||
fun addNode(node: NodeData, mode: String? = definedExternally /* null */): FancytreeNode
|
|
||||||
fun applyPatch(patch: NodePatch): JQueryPromise<Any>
|
|
||||||
fun collapseSiblings(): JQueryPromise<Any>
|
|
||||||
fun copyTo(
|
|
||||||
node: FancytreeNode,
|
|
||||||
mode: String? = definedExternally /* null */,
|
|
||||||
map: ((node: NodeData) -> Unit)? = definedExternally /* null */
|
|
||||||
): FancytreeNode
|
|
||||||
|
|
||||||
fun countChildren(deep: Boolean? = definedExternally /* null */): Number
|
|
||||||
fun debug(msg: Any)
|
|
||||||
fun editCreateNode(mode: String? = definedExternally /* null */, init: Any? = definedExternally /* null */)
|
|
||||||
fun editEnd(applyChanges: Boolean)
|
|
||||||
fun editStart()
|
|
||||||
fun findAll(match: String): Array<FancytreeNode>
|
|
||||||
fun findAll(match: (node: FancytreeNode) -> Boolean): Array<FancytreeNode>
|
|
||||||
fun findFirst(match: String): FancytreeNode
|
|
||||||
fun findFirst(match: (node: FancytreeNode) -> Boolean): FancytreeNode
|
|
||||||
fun fixSelection3AfterClick()
|
|
||||||
fun fixSelection3FromEndNodes()
|
|
||||||
fun fromDict(dict: NodeData)
|
|
||||||
fun getChildren(): Array<FancytreeNode>
|
|
||||||
fun getCloneList(includeSelf: Boolean? = definedExternally /* null */): Array<FancytreeNode>
|
|
||||||
fun getFirstChild(): FancytreeNode
|
|
||||||
fun getIndex(): Number
|
|
||||||
fun getIndexHier(): String
|
|
||||||
fun getKeyPath(excludeSelf: Boolean): String
|
|
||||||
fun getLastChild(): FancytreeNode
|
|
||||||
fun getLevel(): Number
|
|
||||||
fun getNextSibling(): FancytreeNode
|
|
||||||
fun getParent(): FancytreeNode
|
|
||||||
fun getParentList(includeRoot: Boolean, includeSelf: Boolean): Array<FancytreeNode>
|
|
||||||
fun getPrevSibling(): FancytreeNode
|
|
||||||
fun hasChildren(): Boolean
|
|
||||||
fun hasFocus(): Boolean
|
|
||||||
fun info(msg: String)
|
|
||||||
fun isActive(): Boolean
|
|
||||||
fun isChildOf(otherNode: FancytreeNode): Boolean
|
|
||||||
fun isClone(): Boolean
|
|
||||||
fun isDescendantOf(otherNode: FancytreeNode): Boolean
|
|
||||||
fun isEditing(): Boolean
|
|
||||||
fun isExpanded(): Boolean
|
|
||||||
fun isFirstSibling(): Boolean
|
|
||||||
fun isFolder(): Boolean
|
|
||||||
fun isLastSibling(): Boolean
|
|
||||||
fun isLazy(): Boolean
|
|
||||||
fun isLoaded(): Boolean
|
|
||||||
fun isLoading(): Boolean
|
|
||||||
fun isRootNode(): Boolean
|
|
||||||
fun isSelected(): Boolean
|
|
||||||
fun isStatusNode(): Boolean
|
|
||||||
fun isTopLevel(): Boolean
|
|
||||||
fun isUndefined(): Boolean
|
|
||||||
fun isVisible(): Boolean
|
|
||||||
fun load(forceReload: Boolean? = definedExternally /* null */): JQueryPromise<Any>
|
|
||||||
fun makeVisible(opts: Any? = definedExternally /* null */): JQueryPromise<Any>
|
|
||||||
fun moveTo(
|
|
||||||
targetNode: FancytreeNode,
|
|
||||||
mode: String,
|
|
||||||
map: ((node: FancytreeNode) -> Unit)? = definedExternally /* null */
|
|
||||||
)
|
|
||||||
|
|
||||||
fun navigate(where: Number, activate: Boolean? = definedExternally /* null */): JQueryPromise<Any>
|
|
||||||
fun remove()
|
|
||||||
fun removeChild(childNode: FancytreeNode)
|
|
||||||
fun removeChildren()
|
|
||||||
fun removeClass(className: String)
|
|
||||||
fun render(force: Boolean? = definedExternally /* null */, deep: Boolean? = definedExternally /* null */)
|
|
||||||
fun renderStatus()
|
|
||||||
fun renderTitle()
|
|
||||||
fun reRegister(key: String, refKey: String): Boolean
|
|
||||||
fun resetLazy()
|
|
||||||
fun scheduleAction(mode: String, ms: Number)
|
|
||||||
fun scrollIntoView(
|
|
||||||
effects: Boolean? = definedExternally /* null */,
|
|
||||||
options: Any? = definedExternally /* null */
|
|
||||||
): JQueryPromise<Any>
|
|
||||||
|
|
||||||
fun scrollIntoView(
|
|
||||||
effects: Any? = definedExternally /* null */,
|
|
||||||
options: Any? = definedExternally /* null */
|
|
||||||
): JQueryPromise<Any>
|
|
||||||
|
|
||||||
fun setActive(
|
|
||||||
flag: Boolean? = definedExternally /* null */,
|
|
||||||
opts: Any? = definedExternally /* null */
|
|
||||||
): JQueryPromise<Any>
|
|
||||||
|
|
||||||
fun setExpanded(
|
|
||||||
flag: Boolean? = definedExternally /* null */,
|
|
||||||
opts: Any? = definedExternally /* null */
|
|
||||||
): JQueryPromise<Any>
|
|
||||||
|
|
||||||
fun setFocus(flag: Boolean? = definedExternally /* null */)
|
|
||||||
fun setSelected(flag: Boolean? = definedExternally /* null */)
|
|
||||||
fun setStatus(
|
|
||||||
status: String,
|
|
||||||
message: String? = definedExternally /* null */,
|
|
||||||
details: String? = definedExternally /* null */
|
|
||||||
)
|
|
||||||
|
|
||||||
fun setTitle(title: String)
|
|
||||||
fun sortChildren(
|
|
||||||
cmp: ((a: FancytreeNode, b: FancytreeNode) -> Number)? = definedExternally /* null */,
|
|
||||||
deep: Boolean? = definedExternally /* null */
|
|
||||||
)
|
|
||||||
|
|
||||||
fun toDict(
|
|
||||||
recursive: Boolean? = definedExternally /* null */,
|
|
||||||
callback: ((dict: NodeData) -> Unit)? = definedExternally /* null */
|
|
||||||
): NodeData
|
|
||||||
|
|
||||||
fun toggleClass(className: String, flag: Boolean? = definedExternally /* null */): Boolean
|
|
||||||
fun toggleExpanded()
|
|
||||||
fun toggleSelected()
|
|
||||||
fun visit(fn: (node: FancytreeNode) -> Any, includeSelf: Boolean? = definedExternally /* null */): Boolean
|
|
||||||
fun visitAndLoad(
|
|
||||||
fn: (node: FancytreeNode) -> Any,
|
|
||||||
includeSelf: Boolean? = definedExternally /* null */
|
|
||||||
): JQueryPromise<Any>
|
|
||||||
|
|
||||||
fun visitParents(fn: (node: FancytreeNode) -> Any, includeSelf: Boolean? = definedExternally /* null */): Boolean
|
|
||||||
fun warn(msg: Any)
|
|
||||||
fun addChildren(children: Array<NodeData>): FancytreeNode
|
|
||||||
fun addChildren(child: NodeData): FancytreeNode
|
|
||||||
fun scrollIntoView(): JQueryPromise<Any>
|
|
||||||
}
|
|
||||||
|
|
||||||
external enum class FancytreeClickFolderMode {
|
|
||||||
activate /* = 1 */,
|
|
||||||
expand /* = 2 */,
|
|
||||||
activate_and_expand /* = 3 */,
|
|
||||||
activate_dblclick_expands /* = 4 */
|
|
||||||
}
|
|
||||||
|
|
||||||
external enum class FancytreeSelectMode {
|
|
||||||
single /* = 1 */,
|
|
||||||
multi /* = 2 */,
|
|
||||||
mutlti_hier /* = 3 */
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface EventData {
|
|
||||||
var tree: Fancytree
|
|
||||||
var widget: Any
|
|
||||||
var options: FancytreeOptions
|
|
||||||
var originalEvent: JQueryEventObject
|
|
||||||
var node: FancytreeNode
|
|
||||||
var result: Any
|
|
||||||
var targetType: String
|
|
||||||
var response: Any
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface FancytreeEvents {
|
|
||||||
val activate: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val beforeActivate: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val beforeExpand: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val beforeSelect: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val blur: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val blurTree: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val click: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val collapse: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val create: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val createNode: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val dblclick: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val deactivate: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val expand: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val focus: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val focusTree: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val init: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val keydown: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val keypress: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val lazyLoad: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val loadChildren: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val loadError: ((event: JQueryEventObject, data: EventData) -> Boolean)? get() = definedExternally
|
|
||||||
val postProcess: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val removeNode: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val renderColumns: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val renderNode: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val renderTitle: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val restore: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
val select: ((event: JQueryEventObject, data: EventData) -> Unit)? get() = definedExternally
|
|
||||||
var rtl: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface `T$0` {
|
|
||||||
var type: String
|
|
||||||
var cache: Boolean
|
|
||||||
var dataType: String
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface `T$1` {
|
|
||||||
var top: Number
|
|
||||||
var bottom: Number
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface FancytreeOptions : FancytreeEvents {
|
|
||||||
var activeVisible: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var ajax: `T$0`? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var aria: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var autoActivate: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var autoCollapse: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var autoScroll: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var checkbox: dynamic /* Boolean | String | (event: JQueryEventObject, data: EventData) -> Boolean */
|
|
||||||
var clickFolderMode: FancytreeClickFolderMode? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var debugLevel: dynamic /* 0 | 1 | 2 | 3 | 4 */
|
|
||||||
var defaultKey: ((node: FancytreeNode) -> String)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var enableAspx: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var enableTitles: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var extensions: Array<dynamic /* Any | String */>? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var focusOnSelect: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var generateIds: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var icon: dynamic /* Boolean | String */
|
|
||||||
var idPrefix: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var imagePath: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var keyboard: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var keyPathSeparator: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var minExpandLevel: Number? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var quicksearch: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var scrollOfs: `T$1`? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var scrollParent: JQuery<*>? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var selectMode: FancytreeSelectMode? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var source: dynamic /* Array<Any> | Any */
|
|
||||||
var strings: TranslationTable? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var tabbable: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var titlesTabbable: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
//var toggleEffect: EffectOptions? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var tooltip: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var unselectable: dynamic /* Boolean | (event: JQueryEventObject, data: Fancytree.EventData) -> Boolean? */
|
|
||||||
var unselectableIgnore: dynamic /* Boolean | (event: JQueryEventObject, data: Fancytree.EventData) -> Boolean? */
|
|
||||||
var unselectableStatus: dynamic /* Boolean | (event: JQueryEventObject, data: Fancytree.EventData) -> Boolean? */
|
|
||||||
var dnd5: DragAndDrop5
|
|
||||||
var filter: Filter
|
|
||||||
var table: Table
|
|
||||||
@nativeGetter
|
|
||||||
operator fun get(extension: String): Any?
|
|
||||||
|
|
||||||
@nativeSetter
|
|
||||||
operator fun set(extension: String, value: Any)
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface TranslationTable {
|
|
||||||
var loading: String
|
|
||||||
var loadError: String
|
|
||||||
var moreData: String
|
|
||||||
var noData: String
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface NodeData {
|
|
||||||
var title: String
|
|
||||||
var icon: dynamic /* Boolean | String */
|
|
||||||
var key: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var refKey: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var expanded: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var active: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var focus: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var folder: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var hideCheckbox: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var lazy: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var selected: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var unselectable: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var children: Array<NodeData>? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var tooltip: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var extraClasses: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var data: Any? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var iconTooltip: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var statusNodeType: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var type: String? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var unselectableIgnore: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var unselectableStatus: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface NodePatch {
|
|
||||||
var appendChildren: NodeData? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var replaceChildren: NodeData? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var insertChildren: NodeData? get() = definedExternally; set(value) = definedExternally
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface TreePatch {
|
|
||||||
@nativeGetter
|
|
||||||
operator fun get(key: String): NodePatch?
|
|
||||||
|
|
||||||
@nativeSetter
|
|
||||||
operator fun set(key: String, value: NodePatch)
|
|
||||||
}
|
|
||||||
|
|
||||||
external object FancytreeStatic {
|
|
||||||
var buildType: String
|
|
||||||
var debugLevel: Number
|
|
||||||
var version: String
|
|
||||||
fun assert(cond: Boolean, msg: String)
|
|
||||||
fun <T : (args: Any) -> Unit> debounce(
|
|
||||||
timeout: Number,
|
|
||||||
fn: T,
|
|
||||||
invokeAsap: Boolean? = definedExternally /* null */,
|
|
||||||
ctx: Any? = definedExternally /* null */
|
|
||||||
): T
|
|
||||||
|
|
||||||
fun debug(msg: String)
|
|
||||||
fun error(msg: String)
|
|
||||||
fun escapeHtml(s: String): String
|
|
||||||
fun getEventTarget(event: Event): Any
|
|
||||||
fun getEventTargetType(event: Event): String
|
|
||||||
fun getNode(el: JQuery<*>): FancytreeNode
|
|
||||||
fun getNode(el: Event): FancytreeNode
|
|
||||||
fun getNode(el: Element): FancytreeNode
|
|
||||||
fun info(msg: String)
|
|
||||||
fun keyEventToString(event: Event): String
|
|
||||||
fun parseHtml(`$ul`: JQuery<*>): Array<NodeData>
|
|
||||||
fun registerExtension(definition: Any)
|
|
||||||
fun unescapeHtml(s: String): String
|
|
||||||
fun warn(msg: String)
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
@file:JsModule("jquery.fancytree")
|
|
||||||
@file:JsNonModule
|
|
||||||
@file:Suppress(
|
|
||||||
"INTERFACE_WITH_SUPERCLASS",
|
|
||||||
"OVERRIDING_FINAL_MEMBER",
|
|
||||||
"RETURN_TYPE_MISMATCH_ON_OVERRIDE",
|
|
||||||
"CONFLICTING_OVERLOADS",
|
|
||||||
"EXTERNAL_DELEGATION"
|
|
||||||
)
|
|
||||||
package ru.mipt.npm.fancytreekt
|
|
||||||
|
|
||||||
external interface List {
|
|
||||||
var dnd5: DragAndDrop5? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var filter: Filter? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var table: Table? get() = definedExternally; set(value) = definedExternally
|
|
||||||
@nativeGetter
|
|
||||||
operator fun get(extension: String): Any?
|
|
||||||
|
|
||||||
@nativeSetter
|
|
||||||
operator fun set(extension: String, value: Any)
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface DragAndDrop5 {
|
|
||||||
var autoExpandMS: Number? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dropMarkerOffsetX: Number? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dropMarkerInsertOffsetX: Number? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var multiSource: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var preventForeignNodes: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var preventNonNodes: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var preventRecursiveMoves: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var preventVoidMoves: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var scroll: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var scrollSensitivity: Number? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var scrollSpeed: Number? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var setTextTypeJson: Boolean? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragStart: ((sourceNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragDrag: ((sourceNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragEnd: ((sourceNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragEnter: ((targetNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragOver: ((targetNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragExpand: ((targetNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragDrop: ((node: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
var dragLeave: ((targetNode: FancytreeNode, data: Any) -> Unit)? get() = definedExternally; set(value) = definedExternally
|
|
||||||
@nativeGetter
|
|
||||||
operator fun get(key: String): Any?
|
|
||||||
|
|
||||||
@nativeSetter
|
|
||||||
operator fun set(key: String, value: Any)
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface Filter {
|
|
||||||
var autoApply: Boolean
|
|
||||||
var autoExpand: Boolean
|
|
||||||
var counter: Boolean
|
|
||||||
var fuzzy: Boolean
|
|
||||||
var hideExpandedCounter: Boolean
|
|
||||||
var hideExpanders: Boolean
|
|
||||||
var highlight: Boolean
|
|
||||||
var leavesOnly: Boolean
|
|
||||||
var nodata: Boolean
|
|
||||||
var mode: dynamic /* 'dimm' | 'string' */
|
|
||||||
@nativeGetter
|
|
||||||
operator fun get(key: String): Any?
|
|
||||||
|
|
||||||
@nativeSetter
|
|
||||||
operator fun set(key: String, value: Any)
|
|
||||||
}
|
|
||||||
|
|
||||||
external interface Table {
|
|
||||||
var checkboxColumnIdx: Any
|
|
||||||
var indentation: Number
|
|
||||||
var nodeColumnIdx: Number
|
|
||||||
@nativeGetter
|
|
||||||
operator fun get(key: String): Any?
|
|
||||||
|
|
||||||
@nativeSetter
|
|
||||||
operator fun set(key: String, value: Any)
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
package ru.mipt.npm.fancytreekt
|
|
||||||
|
|
||||||
import kotlin.js.json
|
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE", "FunctionName")
|
|
||||||
fun NodeData(block: NodeData.() -> Unit): NodeData = (json() as NodeData).apply(block)
|
|
@ -8,6 +8,7 @@ import hep.dataforge.meta.*
|
|||||||
import hep.dataforge.names.Name
|
import hep.dataforge.names.Name
|
||||||
import hep.dataforge.names.asName
|
import hep.dataforge.names.asName
|
||||||
import hep.dataforge.names.isEmpty
|
import hep.dataforge.names.isEmpty
|
||||||
|
import hep.dataforge.names.startsWith
|
||||||
import hep.dataforge.vis.spatial.*
|
import hep.dataforge.vis.spatial.*
|
||||||
import info.laht.threekt.cameras.Camera
|
import info.laht.threekt.cameras.Camera
|
||||||
import info.laht.threekt.cameras.PerspectiveCamera
|
import info.laht.threekt.cameras.PerspectiveCamera
|
||||||
@ -17,6 +18,7 @@ import info.laht.threekt.external.controls.TrackballControls
|
|||||||
import org.w3c.dom.Node
|
import org.w3c.dom.Node
|
||||||
import kotlin.collections.set
|
import kotlin.collections.set
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
import info.laht.threekt.objects.Group as ThreeGroup
|
||||||
|
|
||||||
class ThreePlugin : AbstractPlugin() {
|
class ThreePlugin : AbstractPlugin() {
|
||||||
override val tag: PluginTag get() = Companion.tag
|
override val tag: PluginTag get() = Companion.tag
|
||||||
@ -42,7 +44,7 @@ class ThreePlugin : AbstractPlugin() {
|
|||||||
return when (obj) {
|
return when (obj) {
|
||||||
is Proxy -> proxyFactory(obj)
|
is Proxy -> proxyFactory(obj)
|
||||||
is VisualGroup3D -> {
|
is VisualGroup3D -> {
|
||||||
val group = info.laht.threekt.objects.Group()
|
val group = ThreeGroup()
|
||||||
obj.children.forEach { (name, child) ->
|
obj.children.forEach { (name, child) ->
|
||||||
if (child is VisualObject3D) {
|
if (child is VisualObject3D) {
|
||||||
try {
|
try {
|
||||||
@ -58,6 +60,19 @@ class ThreePlugin : AbstractPlugin() {
|
|||||||
group.apply {
|
group.apply {
|
||||||
updatePosition(obj)
|
updatePosition(obj)
|
||||||
//obj.onChildrenChange()
|
//obj.onChildrenChange()
|
||||||
|
|
||||||
|
obj.onPropertyChange(this) { name, _, _ ->
|
||||||
|
if (
|
||||||
|
name.startsWith(VisualObject3D.position) ||
|
||||||
|
name.startsWith(VisualObject3D.rotation) ||
|
||||||
|
name.startsWith(VisualObject3D.scale)
|
||||||
|
) {
|
||||||
|
//update position of mesh using this object
|
||||||
|
updatePosition(obj)
|
||||||
|
} else if (name == VisualObject3D.VISIBLE_KEY) {
|
||||||
|
visible = obj.visible ?: true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Composite -> compositeFactory(obj)
|
is Composite -> compositeFactory(obj)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package hep.dataforge.vis.spatial.three
|
package hep.dataforge.vis.spatial.three
|
||||||
|
|
||||||
|
import hep.dataforge.names.startsWith
|
||||||
import hep.dataforge.vis.common.VisualObject
|
import hep.dataforge.vis.common.VisualObject
|
||||||
import hep.dataforge.vis.spatial.Proxy
|
import hep.dataforge.vis.spatial.Proxy
|
||||||
import hep.dataforge.vis.spatial.VisualObject3D
|
import hep.dataforge.vis.spatial.VisualObject3D
|
||||||
@ -28,6 +29,22 @@ class ThreeProxyFactory(val three: ThreePlugin) : ThreeFactory<Proxy> {
|
|||||||
val object3D = cachedObject.clone()
|
val object3D = cachedObject.clone()
|
||||||
object3D.updatePosition(obj)
|
object3D.updatePosition(obj)
|
||||||
|
|
||||||
|
obj.onPropertyChange(this) { name, _, _ ->
|
||||||
|
if (object3D is Mesh && name.startsWith(VisualObject3D.MATERIAL_KEY)) {
|
||||||
|
//updated material
|
||||||
|
object3D.material = obj.material.jsMaterial()
|
||||||
|
} else if (
|
||||||
|
name.startsWith(VisualObject3D.position) ||
|
||||||
|
name.startsWith(VisualObject3D.rotation) ||
|
||||||
|
name.startsWith(VisualObject3D.scale)
|
||||||
|
) {
|
||||||
|
//update position of mesh using this object
|
||||||
|
object3D.updatePosition(obj)
|
||||||
|
} else if (name == VisualObject3D.VISIBLE_KEY) {
|
||||||
|
object3D.visible = obj.visible ?: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
obj.onChildrenChange(object3D) { name, propertyHolder ->
|
obj.onChildrenChange(object3D) { name, propertyHolder ->
|
||||||
(object3D.findChild(name) as? Mesh)?.updateProperties(propertyHolder)
|
(object3D.findChild(name) as? Mesh)?.updateProperties(propertyHolder)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,74 @@
|
|||||||
|
package hep.dataforge.vis.spatial.tree
|
||||||
|
|
||||||
|
import hep.dataforge.vis.common.VisualGroup
|
||||||
|
import hep.dataforge.vis.common.VisualObject
|
||||||
|
import hep.dataforge.vis.spatial.visible
|
||||||
|
import kotlinx.html.InputType
|
||||||
|
import kotlinx.html.dom.append
|
||||||
|
import kotlinx.html.js.*
|
||||||
|
import org.w3c.dom.HTMLDivElement
|
||||||
|
import org.w3c.dom.Node
|
||||||
|
import kotlin.browser.document
|
||||||
|
|
||||||
|
class JSVisualTree(
|
||||||
|
val title: String,
|
||||||
|
override val item: VisualObject,
|
||||||
|
val callback: VisualObject.() -> Unit
|
||||||
|
) : VisualTree<VisualObject> {
|
||||||
|
|
||||||
|
override val children: Collection<JSVisualTree> by lazy {
|
||||||
|
if (item is VisualGroup) {
|
||||||
|
item.children.mapNotNull {(key,value)->
|
||||||
|
val str = key.toString()
|
||||||
|
if(!str.startsWith("@")) {
|
||||||
|
JSVisualTree(str, value, callback)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var visible: Boolean
|
||||||
|
get() = item.visible ?: true
|
||||||
|
set(value) {
|
||||||
|
item.visible = value
|
||||||
|
}
|
||||||
|
|
||||||
|
val root: Node by lazy {
|
||||||
|
(document.createElement("div") as HTMLDivElement).apply {
|
||||||
|
append {
|
||||||
|
div(TREE_ITEM_HEADER_CLASS) {
|
||||||
|
input(type = InputType.checkBox).apply {
|
||||||
|
checked = visible
|
||||||
|
onChangeFunction = {
|
||||||
|
visible = checked
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
+this@JSVisualTree.title
|
||||||
|
+"[${item::class}]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (item is VisualGroup) {
|
||||||
|
ul {
|
||||||
|
this@JSVisualTree.children.forEach { value ->
|
||||||
|
li(TREE_NODE_CLASS).apply {
|
||||||
|
appendChild(value.root)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val TREE_NODE_CLASS = "tree-node"
|
||||||
|
const val TREE_LEAF_CLASS = "tree-leaf"
|
||||||
|
const val TREE_ITEM_HEADER_CLASS = "tree-header"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user