From e33b9dc09a2242b6b85c027ebc76d0ba982018b2 Mon Sep 17 00:00:00 2001 From: Fabian Keller Date: Thu, 15 Jun 2017 19:01:15 +0200 Subject: [PATCH] added base methods for VNodeRef --- experiments/refs/demo.nim | 31 ++++++++++++++++++++++++------- src/karax.nim | 2 ++ src/vdom.nim | 6 +++++- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/experiments/refs/demo.nim b/experiments/refs/demo.nim index cfbf7a3..6ecc7db 100644 --- a/experiments/refs/demo.nim +++ b/experiments/refs/demo.nim @@ -1,16 +1,30 @@ include karaxprelude import future, sequtils +type + CustomRef = ref object of VNodeRef + +method onAttach(r: CustomRef) = + kout(cstring"custom ref attached") + +method onDetach(r: CustomRef) = + kout(cstring"custom ref detached") + var modelData = @[5, 2, 4] refA = VNodeRef() refB = VNodeRef() + refC = CustomRef() refSeq = newSeq[VNodeRef]() proc onClick(ev: Event, n: VNode) = - kout(refA.vnode) - kout(refB.vnode) + modelData.add(0) + +proc showRefs() = + kout(refA) + kout(refB) + kout(refC) kout(refSeq.map(nref => nref.vnode)) proc secureRefSlot(i: int): VNodeRef = @@ -24,10 +38,13 @@ proc view(): VNode = button(onclick=onClick): text "click me" # storing refs to single elements is straightforward now - tdiv(nref=refA): - text "A" - tdiv(nref=refB): - text "B" + if modelData.len mod 2 == 0: + tdiv(nref=refA): + text "A" + tdiv(nref=refB): + text "B" + tdiv(nref=refC): + text "C" # It's a bit more tricky when containers are involved: for i, x in modelData.pairs: tdiv(nref=secureRefSlot(i)): @@ -36,4 +53,4 @@ proc view(): VNode = proc renderer(): VNode = view() -setRenderer renderer +setRenderer(renderer, showRefs) diff --git a/src/karax.nim b/src/karax.nim index d8a4cb1..b454050 100644 --- a/src/karax.nim +++ b/src/karax.nim @@ -68,10 +68,12 @@ proc wrapEvent(d: Node; n: VNode; k: EventKind; action: EventHandler) = template detach(n: VNode) = if not n.nref.isNil(): n.nref.vnode = nil + n.nref.onDetach() n.dom = nil template attach(n: VNode) = if not n.nref.isNil(): n.nref.vnode = n + n.nref.onAttach() n.dom = result proc vnodeToDom(n: VNode): Node = diff --git a/src/vdom.nim b/src/vdom.nim index f4ccff8..9f9c642 100644 --- a/src/vdom.nim +++ b/src/vdom.nim @@ -101,7 +101,7 @@ macro buildLookupTables(): untyped = buildLookupTables() type - VNodeRef* = ref object + VNodeRef* = ref object of RootObj vnode*: VNode EventHandler* = proc (ev: Event; target: VNode) {.closure.} @@ -122,6 +122,10 @@ type dom*: Node ## the attached real DOM node. Can be 'nil' if the virtual node ## is not part of the virtual DOM anymore. +method onAttach*(v: VNodeRef) {.base.} = discard +method onDetach*(v: VNodeRef) {.base.} = discard +method changed*(v: VNodeRef): bool {.base.} = false + proc value*(n: VNode): cstring = n.text proc `value=`*(n: VNode; v: cstring) = n.text = v