Mercurial > hg > indyvon
changeset 13:c6009a144727
Layer decorator macro.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Mon, 14 Jun 2010 06:26:07 +0400 |
parents | cd8a378414d1 |
children | 0a2fafca72d8 |
files | src/indyvon/core.clj |
diffstat | 1 files changed, 25 insertions(+), 12 deletions(-) [+] |
line diff
1.1 --- a/src/indyvon/core.clj Mon Jun 14 05:04:03 2010 +0400 1.2 +++ b/src/indyvon/core.clj Mon Jun 14 06:26:07 2010 +0400 1.3 @@ -16,18 +16,24 @@ 1.4 (defn default-context [] 1.5 (LayerContext. nil nil 0 0 0 0 nil nil)) 1.6 1.7 -(defmacro reify-layer [& fns] 1.8 - (let [method-map {'size [['_ '_] [0 0]] 1.9 - 'anchor [['_ '_] [0 0]]} 1.10 - method-map (loop [fns fns 1.11 - mm method-map] 1.12 - (if-let [form (first fns)] 1.13 - (recur (next fns) 1.14 - (conj mm [(first form) (next form)])) 1.15 - mm)) 1.16 - methods (for [m method-map] 1.17 - (cons (first m) (second m)))] 1.18 - `(reify Layer ~@methods))) 1.19 +(defn- spec-map 1.20 + ([specs] 1.21 + (spec-map {} specs)) 1.22 + ([mm specs] 1.23 + (if-let [form (first specs)] 1.24 + (recur (conj mm [(first form) (next form)]) 1.25 + (next specs)) 1.26 + mm))) 1.27 + 1.28 +(defn- merge-specs [s1 s2] 1.29 + (for [spec (spec-map (spec-map s1) s2)] 1.30 + (cons (first spec) (second spec)))) 1.31 + 1.32 +(defmacro reify-layer [& specs] 1.33 + `(reify Layer ~@(merge-specs 1.34 + '((size [_ _] [0 0]) 1.35 + (anchor [_ _] [0 0])) 1.36 + specs))) 1.37 1.38 (defn- make-graphics [g x y w h clip] 1.39 (if clip 1.40 @@ -64,3 +70,10 @@ 1.41 (finally 1.42 (.dispose graphics)))))) 1.43 1.44 +(defmacro decorate-layer [layer & specs] 1.45 + `(let [layer# ~layer] 1.46 + (reify Layer ~@(merge-specs 1.47 + `((~'render! [l# c# g#] (draw! c# layer# g#)) 1.48 + (~'size [l# c#] (size layer# c#)) 1.49 + (~'anchor [l# c#] (anchor layer# c#))) 1.50 + specs))))