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)))))