From 0255f58964a7c2ccd8761991d1f938481d0b7e22 Mon Sep 17 00:00:00 2001 From: Araq Date: Sun, 16 Apr 2017 09:51:10 +0200 Subject: [PATCH] wip: stateful components --- experiments/example.html | 4 -- experiments/example.nim | 148 ++++++--------------------------------- experiments/example.nims | 1 + src/components.nim | 47 +++++++++++++ src/karax.nim | 29 +++++++- 5 files changed, 99 insertions(+), 130 deletions(-) create mode 100644 experiments/example.nims 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: