bugfix: component handling

This commit is contained in:
Andreas Rumpf 2017-07-07 16:40:48 +02:00
commit 920bd2db9d

View file

@ -167,9 +167,9 @@ proc vnodeToDom(n: VNode; kxi: KaraxInstance): Node =
kxi.toFocus = result kxi.toFocus = result
if not n.style.isNil: applyStyle(result, n.style) if not n.style.isNil: applyStyle(result, n.style)
proc same(n: VNode, e: Node): bool = proc same(n: VNode, e: Node; nesting = 0): bool =
if n.kind == VNodeKind.component: if n.kind == VNodeKind.component:
result = same(VComponent(n).expanded, e) result = same(VComponent(n).expanded, e, nesting+1)
elif n.kind == VNodeKind.vthunk or n.kind == VNodeKind.dthunk: elif n.kind == VNodeKind.vthunk or n.kind == VNodeKind.dthunk:
# we don't check these for now: # we don't check these for now:
result = true result = true
@ -177,10 +177,10 @@ proc same(n: VNode, e: Node): bool =
result = true result = true
if n.kind != VNodeKind.text: if n.kind != VNodeKind.text:
if e.len != n.len: if e.len != n.len:
kout e.len, n.len kout e.len, n.len, toTag[n.kind], nesting
return false return false
for i in 0 ..< n.len: for i in 0 ..< n.len:
if not same(n[i], e[i]): return false if not same(n[i], e[i], nesting+1): return false
else: else:
kout toTag[n.kind], e.nodename kout toTag[n.kind], e.nodename
@ -298,6 +298,7 @@ proc apply(kxi: KaraxInstance) =
for i in 0..<kxi.patchLenV: for i in 0..<kxi.patchLenV:
let p = kxi.patchesV[i] let p = kxi.patchesV[i]
p.parent[p.pos] = p.newChild p.parent[p.pos] = p.newChild
assert p.newChild.dom != nil
kxi.patchLenV = 0 kxi.patchLenV = 0
proc diff(newNode, oldNode: VNode; parent, current: Node; kxi: KaraxInstance): EqResult = proc diff(newNode, oldNode: VNode; parent, current: Node; kxi: KaraxInstance): EqResult =
@ -310,6 +311,7 @@ proc diff(newNode, oldNode: VNode; parent, current: Node; kxi: KaraxInstance): E
#doAssert false, "overflow!" #doAssert false, "overflow!"
inc kxi.recursion inc kxi.recursion
result = eq(newNode, oldNode) result = eq(newNode, oldNode)
assert(same(oldNode, current))
case result case result
of identical, similar: of identical, similar:
newNode.dom = oldNode.dom newNode.dom = oldNode.dom
@ -378,7 +380,7 @@ proc diff(newNode, oldNode: VNode; parent, current: Node; kxi: KaraxInstance): E
elif r != different: elif r != different:
newNode[i] = oldNode[i] newNode[i] = oldNode[i]
#else: #else:
# result = different # result = usenewNode
if oldPos + 1 == oldLength: if oldPos + 1 == oldLength:
for i in pos..newPos: for i in pos..newPos:
@ -403,13 +405,16 @@ proc diff(newNode, oldNode: VNode; parent, current: Node; kxi: KaraxInstance): E
let oldExpanded = x.expanded let oldExpanded = x.expanded
x.expanded = x.renderImpl(x) x.expanded = x.renderImpl(x)
x.renderedVersion = x.version x.renderedVersion = x.version
#echo "expanding ", x.debugId
if oldExpanded == nil: if oldExpanded == nil:
detach(oldNode) detach(oldNode)
kxi.addPatch(pkReplace, parent, current, x.expanded) kxi.addPatch(pkReplace, parent, current, x.expanded)
else: else:
let res = diff(x.expanded, oldExpanded, parent, current, kxi) let res = diff(x.expanded, oldExpanded, parent, current, kxi)
if res != different: if res == usenewNode:
#oldNode[i] = newNode[i]
#kxi.addPatchV(oldNode, i, newNode[i])
kxi.addPatch(pkReplace, parent, current, x.expanded)
elif res != different:
x.expanded = oldExpanded x.expanded = oldExpanded
assert oldExpanded.dom != nil, "old expanded.dom is nil" assert oldExpanded.dom != nil, "old expanded.dom is nil"
else: else:
@ -440,6 +445,7 @@ proc dodraw(kxi: KaraxInstance) =
let asdom = vnodeToDom(kxi.currentTree, kxi) let asdom = vnodeToDom(kxi.currentTree, kxi)
replaceById(kxi.rootId, asdom) replaceById(kxi.rootId, asdom)
else: else:
doAssert same(kxi.currentTree, document.getElementById(kxi.rootId))
let olddom = document.getElementById(kxi.rootId) let olddom = document.getElementById(kxi.rootId)
discard diff(newtree, kxi.currentTree, nil, olddom, kxi) discard diff(newtree, kxi.currentTree, nil, olddom, kxi)
#kout cstring"patch len ", patches.len #kout cstring"patch len ", patches.len