Mercurial > hg > indyvon
changeset 43:7d67064f0880
More layers.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Mon, 12 Jul 2010 03:52:21 +0400 |
parents | d3e3c43df1cd |
children | 064b21604f74 |
files | src/kryshen/indyvon/core.clj src/kryshen/indyvon/graph.clj src/kryshen/indyvon/layers.clj |
diffstat | 3 files changed, 81 insertions(+), 23 deletions(-) [+] |
line diff
1.1 --- a/src/kryshen/indyvon/core.clj Sun Jul 11 06:34:36 2010 +0400 1.2 +++ b/src/kryshen/indyvon/core.clj Mon Jul 12 03:52:21 2010 +0400 1.3 @@ -18,10 +18,11 @@ 1.4 (def *update*) 1.5 (def *event-dispatcher*) 1.6 1.7 -(defrecord Theme [fore-color back-color border-color font]) 1.8 +(defrecord Theme [fore-color back-color alt-back-color border-color font]) 1.9 1.10 (defn default-theme [] 1.11 - (Theme. Color/BLACK Color/WHITE Color/BLUE (Font. "Sans" Font/PLAIN 12))) 1.12 + (Theme. Color/BLACK Color/LIGHT_GRAY Color/WHITE 1.13 + Color/BLUE (Font. "Sans" Font/PLAIN 12))) 1.14 1.15 (def *theme* (default-theme)) 1.16 1.17 @@ -135,6 +136,21 @@ 1.18 specs) 1.19 (fn [] ~form))) 1.20 1.21 +(defn with-theme* [theme f & args] 1.22 + (apply with-bindings* {#'*theme* (merge *theme* theme)} 1.23 + f args)) 1.24 + 1.25 +(defmacro with-theme [theme & body] 1.26 + `(with-theme* ~theme (fn [] ~@body))) 1.27 + 1.28 +(defmacro with-color [color & body] 1.29 + `(let [color# (.getColor *graphics*)] 1.30 + (try 1.31 + (.setColor *graphics* ~color) 1.32 + ~@body 1.33 + (finally 1.34 + (.setColor *graphics* color#))))) 1.35 + 1.36 (defn- geometry-vec [geometry] 1.37 (if (vector? geometry) 1.38 geometry
2.1 --- a/src/kryshen/indyvon/graph.clj Sun Jul 11 06:34:36 2010 +0400 2.2 +++ b/src/kryshen/indyvon/graph.clj Mon Jul 12 03:52:21 2010 +0400 2.3 @@ -62,7 +62,7 @@ 2.4 (let [dx (- x @fix-x) 2.5 dy (- y @fix-y)] 2.6 (.layoutLocation v (+ vx dx) (+ vy dy)) 2.7 - (.updateBounds layout) 2.8 + (.invalidateLayout layout) 2.9 (*update*) 2.10 (ref-set fix-x x) 2.11 (ref-set fix-y y)))))))))))
3.1 --- a/src/kryshen/indyvon/layers.clj Sun Jul 11 06:34:36 2010 +0400 3.2 +++ b/src/kryshen/indyvon/layers.clj Mon Jul 12 03:52:21 2010 +0400 3.3 @@ -24,6 +24,32 @@ 3.4 (defmacro align-y [inner outer align] 3.5 `(align-xy ~inner ~outer ~align :top :center :bottom)) 3.6 3.7 +(defmacro decorate-layer [layer & render-tail] 3.8 + `(reify 3.9 + Layer 3.10 + (render! ~@render-tail) 3.11 + (layer-size [t#] (layer-size ~layer)) 3.12 + Anchored 3.13 + (anchor [t# xa# ya#] (anchor ~layer xa# ya#)))) 3.14 + 3.15 +(defn padding 3.16 + ([content pad] 3.17 + (padding content pad pad pad pad)) 3.18 + ([content top left bottom right] 3.19 + (if (== 0 top left bottom right) 3.20 + content 3.21 + (reify 3.22 + Layer 3.23 + (render! [l] 3.24 + (draw! content 3.25 + left top 3.26 + (- (:width *bounds*) left right) 3.27 + (- (:height *bounds*) top bottom))) 3.28 + (layer-size [l] 3.29 + (let [s (layer-size content)] 3.30 + (Size. (+ (:width s) left right) 3.31 + (+ (:height s) top bottom)))))))) 3.32 + 3.33 (defn border 3.34 "Decorate layer with a border." 3.35 ([content] 3.36 @@ -31,20 +57,26 @@ 3.37 ([content width] 3.38 (border content width 0)) 3.39 ([content width gap] 3.40 - (let [offset (+ width gap)] 3.41 - (reify Layer 3.42 - (render! [l] 3.43 - (let [w (:width *bounds*) 3.44 - h (:height *bounds*)] 3.45 - (.setColor *graphics* (:border-color *theme*)) 3.46 + (let [layer (padding content (+ width gap))] 3.47 + (decorate-layer layer [_] 3.48 + (let [w (:width *bounds*) 3.49 + h (:height *bounds*)] 3.50 + (with-color (:border-color *theme*) 3.51 (doseq [i (range 0 width)] 3.52 - (.drawRect *graphics* i i (- w 1 i i) (- h 1 i i))) 3.53 - (draw! content 3.54 - offset offset (- w offset offset) (- h offset offset)))) 3.55 - (layer-size [l] 3.56 - (let [s (layer-size content)] 3.57 - (Size. (+ (:width s) offset offset) 3.58 - (+ (:height s) offset offset)))))))) 3.59 + (.drawRect *graphics* i i (- w 1 i i) (- h 1 i i)))) 3.60 + (render! layer)))))) 3.61 + 3.62 +(defn panel 3.63 + "Opaque layer using theme's alt-back-color." 3.64 + ([content] 3.65 + (panel content 0)) 3.66 + ([content gap] 3.67 + (let [layer (padding content gap)] 3.68 + (decorate-layer layer [_] 3.69 + (with-color (:alt-back-color *theme*) 3.70 + (.fillRect *graphics* 0 0 3.71 + (:width *bounds*) (:height *bounds*))) 3.72 + (render! layer))))) 3.73 3.74 (defn- re-split [^java.util.regex.Pattern re s] 3.75 (seq (.split re s))) 3.76 @@ -126,16 +158,26 @@ 3.77 (*update*)))) 3.78 (layer-size [layer] (layer-size content)))))) 3.79 3.80 -(defmacro decorate-layer [layer & render-tail] 3.81 - `(reify 3.82 - Layer 3.83 - (render! ~@render-tail) 3.84 - (layer-size [t#] (layer-size ~layer)) 3.85 - Anchored 3.86 - (anchor [t# xa# ya#] (anchor ~layer xa# ya#)))) 3.87 +;; 3.88 +;; Layer context decorators. 3.89 +;; 3.90 3.91 (defmacro handler [layer & handlers] 3.92 `(decorate-layer ~layer [t#] 3.93 (with-handlers t# 3.94 (render! ~layer) 3.95 ~@handlers))) 3.96 + 3.97 +(defn theme [layer & map-or-keyvals] 3.98 + (let [theme (if (== (count map-or-keyvals) 1) 3.99 + map-or-keyvals 3.100 + (apply array-map map-or-keyvals))] 3.101 + (reify 3.102 + Layer 3.103 + (render! [t] 3.104 + (with-theme* theme render! layer)) 3.105 + (layer-size [t] 3.106 + (with-theme* theme layer-size layer)) 3.107 + Anchored 3.108 + (anchor [t xa ya] 3.109 + (with-theme* theme anchor layer xa ya)))))