diff --git a/experiments/example.html b/experiments/example.html index 35b9837..2303d95 100644 --- a/experiments/example.html +++ b/experiments/example.html @@ -3,7 +3,6 @@ Todo app - @@ -11,9 +10,6 @@
- diff --git a/experiments/example.nim b/experiments/example.nim index 0ea805e..3fe4000 100644 --- a/experiments/example.nim +++ b/experiments/example.nim @@ -1,135 +1,32 @@ -import vdom, karax, karaxdsl, jdict, jstrutils - -type - Filter = enum - all, active, completed +import vdom, components, karax, karaxdsl, jdict, jstrutils var - entries: seq[(cstring, bool)] - selectedEntry = -1 - filter: Filter + images: seq[cstring] = @[cstring"a", "b", "c", "d"] -proc onTodoEnter(ev: Event; n: VNode) = - entries.add((n.value, false)) - n.value = "" +proc carousel*(key: VKey): VNode {.component.} = + state: + var counter: int = 0 -proc removeHandler(ev: Event; n: VNode) = - let id = suffixAsInt(n.id, "remove:") - entries[id] = (cstring(nil), false) + proc next(ev: Event; n: VNode) = + counter = (counter + 1) mod images.len -proc editHandler(ev: Event; n: VNode) = - let id = suffixAsInt(n.id, "edit:") - selectedEntry = id - -when defined(usecache): - var entryCache = newJDict[int, VNode]() - -proc focusLost(ev: Event; n: VNode) = selectedEntry = -1 - -proc editEntry(ev: Event; n: VNode) = - let id = suffixAsInt(n.id, "todo-edit:") - entries[id][0] = n.value - selectedEntry = -1 - -proc toggleEntry(ev: Event; n: VNode) = - let id = suffixAsInt(n.id, "toggle:") - entries[id][1] = not entries[id][1] - -proc onAllDone(ev: Event; n: VNode) = - entries = @[] - selectedEntry = -1 - -proc clearCompleted(ev: Event, n: VNode) = - for i in 0..= 0 and isDirty(newNode.key): + unmarkDirty(newNode.key) + let n = vnodeToDom(newNode) + if parent == nil: + replaceById("ROOT", n) + else: + parent.replaceChild(n, current) + elif newNode.kind != VNodeKind.text and newNode.kind != VNodeKind.vthunk and + newNode.kind != VNodeKind.dthunk: + for i in 0..newNode.len-1: + updateDirtyElements(current, current[i], newNode[i]) + # leave early if we know there cannot be anything left to do: + #if dirtyCount <= 0: return proc updateElement(parent, current: Node, newNode, oldNode: VNode) = if not equalsShallow(newNode, oldNode): @@ -217,6 +234,9 @@ proc dodraw() = let olddom = document.getElementById("ROOT") updateElement(nil, olddom, newtree, currentTree) #assert same(newtree, document.getElementById("ROOT")) + if someDirty: + updateDirtyElements(nil, olddom, newtree) + someDirty = false currentTree = newtree # now that it's part of the DOM, give it the focus: if toFocus != nil: diff --git a/src/vdom.nim b/src/vdom.nim index d138c7a..25f6c12 100644 --- a/src/vdom.nim +++ b/src/vdom.nim @@ -124,10 +124,10 @@ template callThunk*(fn: typed; n: VNode): untyped = fn(n.kids) proc vthunk*(name: cstring; args: varargs[VNode, vn]): VNode = - VNode(kind: VNodeKind.vthunk, text: name, kids: @args) + VNode(kind: VNodeKind.vthunk, text: name, key: -1, kids: @args) proc dthunk*(name: cstring; args: varargs[VNode, vn]): VNode = - VNode(kind: VNodeKind.dthunk, text: name, kids: @args) + VNode(kind: VNodeKind.dthunk, text: name, key: -1, kids: @args) proc eq*(a, b: VNode): bool = if a.kind != b.kind: return false