another attempt to fix bug #31
This commit is contained in:
parent
9aa3ba545d
commit
cd74cd9d4e
2 changed files with 26 additions and 18 deletions
|
|
@ -182,9 +182,7 @@ proc eq(a, b: VNode; deep: bool): EqResult =
|
||||||
result = similar
|
result = similar
|
||||||
if not sameAttrs(a, b): return different
|
if not sameAttrs(a, b): return different
|
||||||
if a.class != b.class: return different
|
if a.class != b.class: return different
|
||||||
if not eq(a.style, b.style):
|
if not eq(a.style, b.style): return similar
|
||||||
kout cstring"yes, styles differ"
|
|
||||||
return similar
|
|
||||||
# Do not test event listeners here!
|
# Do not test event listeners here!
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
@ -212,9 +210,6 @@ proc updateStyles(newNode, oldNode: VNode; deep: bool) =
|
||||||
else: oldNode.dom.style = Style()
|
else: oldNode.dom.style = Style()
|
||||||
oldNode.style = newNode.style
|
oldNode.style = newNode.style
|
||||||
if deep:
|
if deep:
|
||||||
if newNode.len != oldNode.len:
|
|
||||||
kout cstring"argh ", newNode.len, " ", oldNode.len
|
|
||||||
kout newNode, oldNode
|
|
||||||
doAssert newNode.len == oldNode.len
|
doAssert newNode.len == oldNode.len
|
||||||
for i in 0 ..< newNode.len:
|
for i in 0 ..< newNode.len:
|
||||||
updateStyles(newNode[i], oldNode[i], deep)
|
updateStyles(newNode[i], oldNode[i], deep)
|
||||||
|
|
@ -232,6 +227,8 @@ proc printV(n: VNode; depth: cstring = "") =
|
||||||
if n.kind == VNodeKind.component:
|
if n.kind == VNodeKind.component:
|
||||||
let nn = VComponent(n)
|
let nn = VComponent(n)
|
||||||
if nn.expanded != nil: printV(nn.expanded, ">>" & depth)
|
if nn.expanded != nil: printV(nn.expanded, ">>" & depth)
|
||||||
|
elif n.kind == VNodeKind.text:
|
||||||
|
kout depth, n.text
|
||||||
for i in 0 ..< n.len:
|
for i in 0 ..< n.len:
|
||||||
printV(n[i], depth & " ")
|
printV(n[i], depth & " ")
|
||||||
|
|
||||||
|
|
@ -251,17 +248,22 @@ proc updateElement(parent, current: Node, newNode, oldNode: VNode;
|
||||||
n = vnodeToDom(x.expanded, kxi)
|
n = vnodeToDom(x.expanded, kxi)
|
||||||
state = 1
|
state = 1
|
||||||
else:
|
else:
|
||||||
kout cstring"now comparing components"
|
let res = updateElement(parent, current, x.expanded, oldExpanded, kxi)
|
||||||
printV(oldExpanded)
|
if res != different:
|
||||||
printV(x.expanded)
|
|
||||||
if updateElement(parent, current, x.expanded, oldExpanded, kxi) >= similar:
|
|
||||||
x.expanded = oldExpanded
|
x.expanded = oldExpanded
|
||||||
n = oldExpanded.dom
|
n = oldExpanded.dom
|
||||||
doAssert n != nil, "old expanded.dom is nil"
|
doAssert n != nil, "old expanded.dom is nil"
|
||||||
|
#kout cstring"produced old DOM: ", cstring($res)
|
||||||
|
#printV(oldExpanded)
|
||||||
|
#printV(x.expanded)
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
n = x.expanded.dom
|
n = x.expanded.dom
|
||||||
doAssert n != nil, "expanded.dom is nil"
|
doAssert n != nil, "expanded.dom is nil"
|
||||||
state = 2
|
state = 2
|
||||||
|
#kout cstring"produced new DOM:"
|
||||||
|
#printV(oldExpanded)
|
||||||
|
#printV(x.expanded)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
detach(oldNode)
|
detach(oldNode)
|
||||||
|
|
@ -270,7 +272,8 @@ proc updateElement(parent, current: Node, newNode, oldNode: VNode;
|
||||||
if parent == nil:
|
if parent == nil:
|
||||||
replaceById(kxi.rootId, n)
|
replaceById(kxi.rootId, n)
|
||||||
else:
|
else:
|
||||||
kout cstring"state ", state, parent, current
|
#kout cstring"state ", state, parent, current
|
||||||
|
if n != current:
|
||||||
parent.replaceChild(n, current)
|
parent.replaceChild(n, current)
|
||||||
elif result == similar:
|
elif result == similar:
|
||||||
updateStyles(newNode, oldNode, false)
|
updateStyles(newNode, oldNode, false)
|
||||||
|
|
@ -301,7 +304,9 @@ proc updateElement(parent, current: Node, newNode, oldNode: VNode;
|
||||||
a[i] = b
|
a[i] = b
|
||||||
#updateDom(a, b)
|
#updateDom(a, b)
|
||||||
action
|
action
|
||||||
of different, changed: break
|
of different, changed:
|
||||||
|
if result != different: result = r
|
||||||
|
break
|
||||||
of similar:
|
of similar:
|
||||||
#updateDom(a, b)
|
#updateDom(a, b)
|
||||||
updateStyles(a[i], b, true)
|
updateStyles(a[i], b, true)
|
||||||
|
|
@ -325,6 +330,8 @@ proc updateElement(parent, current: Node, newNode, oldNode: VNode;
|
||||||
newNode[i], oldNode[i], kxi)
|
newNode[i], oldNode[i], kxi)
|
||||||
if res != different:
|
if res != different:
|
||||||
newNode[i] = oldNode[i]
|
newNode[i] = oldNode[i]
|
||||||
|
else:
|
||||||
|
result = different
|
||||||
|
|
||||||
var nextChildPos = oldPos + 1
|
var nextChildPos = oldPos + 1
|
||||||
while pos <= newPos:
|
while pos <= newPos:
|
||||||
|
|
@ -336,11 +343,13 @@ proc updateElement(parent, current: Node, newNode, oldNode: VNode;
|
||||||
inc oldLength
|
inc oldLength
|
||||||
inc pos
|
inc pos
|
||||||
inc nextChildPos
|
inc nextChildPos
|
||||||
|
result = different
|
||||||
|
|
||||||
for i in pos..oldPos:
|
for i in pos..oldPos:
|
||||||
detach(oldNode[i])
|
detach(oldNode[i])
|
||||||
doAssert pos < current.childNodes.len
|
doAssert pos < current.childNodes.len
|
||||||
current.removeChild(current.childNodes[pos])
|
current.removeChild(current.childNodes[pos])
|
||||||
|
result = different
|
||||||
|
|
||||||
when false:
|
when false:
|
||||||
var drawTimeout: Timeout
|
var drawTimeout: Timeout
|
||||||
|
|
@ -352,7 +361,7 @@ proc dodraw(kxi: KaraxInstance) =
|
||||||
kxi.toFocus = nil
|
kxi.toFocus = nil
|
||||||
#if kxi.currentTree != nil:
|
#if kxi.currentTree != nil:
|
||||||
# kout cstring"same? ", same(kxi.currentTree, document.getElementById(kxi.rootId))
|
# kout cstring"same? ", same(kxi.currentTree, document.getElementById(kxi.rootId))
|
||||||
kout cstring"dodraw -----------------------------"
|
#kout cstring"dodraw -----------------------------"
|
||||||
if kxi.currentTree == nil:
|
if kxi.currentTree == nil:
|
||||||
kxi.currentTree = newtree
|
kxi.currentTree = newtree
|
||||||
let asdom = vnodeToDom(kxi.currentTree, kxi)
|
let asdom = vnodeToDom(kxi.currentTree, kxi)
|
||||||
|
|
@ -361,7 +370,7 @@ proc dodraw(kxi: KaraxInstance) =
|
||||||
let olddom = document.getElementById(kxi.rootId)
|
let olddom = document.getElementById(kxi.rootId)
|
||||||
discard updateElement(nil, olddom, newtree, kxi.currentTree, kxi)
|
discard updateElement(nil, olddom, newtree, kxi.currentTree, kxi)
|
||||||
kxi.currentTree = newtree
|
kxi.currentTree = newtree
|
||||||
#kout cstring"same? ", same(kxi.currentTree, document.getElementById(kxi.rootId))
|
doAssert same(kxi.currentTree, document.getElementById(kxi.rootId))
|
||||||
|
|
||||||
if not kxi.postRenderCallback.isNil:
|
if not kxi.postRenderCallback.isNil:
|
||||||
kxi.postRenderCallback()
|
kxi.postRenderCallback()
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,8 @@ proc render(x: VComponent): VNode =
|
||||||
|
|
||||||
kout cstring"rendering ", self.myid
|
kout cstring"rendering ", self.myid
|
||||||
inc renderId
|
inc renderId
|
||||||
result = buildHtml(tdiv(style=style, key=renderId)):
|
result = buildHtml(tdiv(style=style)):
|
||||||
input(style=inputStyle, value=self.value, onblur=flip, onfocus=flip,
|
input(style=inputStyle, value=self.value, onblur=flip, onfocus=flip)
|
||||||
key=renderId)
|
|
||||||
|
|
||||||
var gid = 0
|
var gid = 0
|
||||||
proc newTextInput*(style: VStyle = VStyle(); value: cstring = cstring""): TextInput =
|
proc newTextInput*(style: VStyle = VStyle(); value: cstring = cstring""): TextInput =
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue