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..78dcaae 100644
--- a/experiments/example.nim
+++ b/experiments/example.nim
@@ -1,135 +1,33 @@
-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 = 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
+ markDirty key
-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 dirty.contains(&newNode.key):
+ dirty.del(&newNode.key)
+ dec dirtyCount
+ 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 +241,9 @@ proc dodraw() =
let olddom = document.getElementById("ROOT")
updateElement(nil, olddom, newtree, currentTree)
#assert same(newtree, document.getElementById("ROOT"))
+ if dirtyCount > 0:
+ updateDirtyElements(nil, olddom, newtree)
+ dirtyCount = 0
currentTree = newtree
# now that it's part of the DOM, give it the focus:
if toFocus != nil: