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