changeset 1:a93cfcf60f27

Layers.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 07 Jun 2010 04:42:52 +0400
parents 43e3358ca4d9
children 0f2a98f71a9c
files src/indyvon/core.clj src/indyvon/layer.clj
diffstat 2 files changed, 105 insertions(+), 65 deletions(-) [+]
line diff
     1.1 --- a/src/indyvon/core.clj	Sun Jun 06 06:03:38 2010 +0400
     1.2 +++ b/src/indyvon/core.clj	Mon Jun 07 04:42:52 2010 +0400
     1.3 @@ -1,1 +1,105 @@
     1.4 -(ns indyvon.core)
     1.5 +(ns indyvon.core
     1.6 +  (:import (java.awt Dimension Point Component Graphics2D)))
     1.7 +
     1.8 +(def ^{:private true} *graphics*)
     1.9 +(def ^{:private true} *rx* 0)
    1.10 +(def ^{:private true} *ry* 0)
    1.11 +
    1.12 +(def *width*)
    1.13 +(def *height*)
    1.14 +
    1.15 +(def *lag*)
    1.16 +
    1.17 +(def *update-fn*)
    1.18 +
    1.19 +(defprotocol Layer
    1.20 +  (render! [this])
    1.21 +  (size [this])
    1.22 +  (anchor [this]))
    1.23 +
    1.24 +;; (defmacro make-layer [& fns]
    1.25 +;;   (let [fn-map
    1.26 +;;         (apply hash-map
    1.27 +;;                (reduce #(conj %1 (first %2) (next %2)) []
    1.28 +;;                        fns))]
    1.29 +;;     ;; TODO
    1.30 +;;     fn-map))
    1.31 +
    1.32 +(defn- translate [g x y w h clip]
    1.33 +  (if clip
    1.34 +    (.create g x y w h)
    1.35 +    (doto (.create g)
    1.36 +      (.translate x y))))
    1.37 +
    1.38 +(defn render-layer!
    1.39 +  "Render layer in a new graphics context."
    1.40 +  ([layer]
    1.41 +     (render-layer! layer 0 0 *width* *height*))
    1.42 +  ([layer x y]
    1.43 +     (render-layer! layer x y true))
    1.44 +  ([layer x y clip]
    1.45 +     (let [s (size layer)]
    1.46 +       (render-layer! layer x y (.width s) (.height s) clip)))
    1.47 +  ([layer x y w h]
    1.48 +     (render-layer! layer x y w h true))
    1.49 +  ([layer x y w h clip]
    1.50 +     (binding [*graphics* (translate *graphics* x y w h clip)
    1.51 +               *rx* (+ *rx* x)
    1.52 +               *ry* (+ *ry* y)
    1.53 +               *width* w
    1.54 +               *height* h]
    1.55 +       (render! layer))))
    1.56 +
    1.57 +(defn- make-update-fn [component]
    1.58 +  (fn [] (.repaint component)))
    1.59 +
    1.60 +;; (defn make-component [layer]
    1.61 +;;   (proxy [Component] []
    1.62 +;;     (update [g] (.paint this g))
    1.63 +;;     (paint [g]
    1.64 +;;            (let [insets (.getInsets this)
    1.65 +;;                  top (.top insets)
    1.66 +;;                  left (.left insets)
    1.67 +;;                  bottom (.bottom insets)
    1.68 +;;                  right (.right insets)
    1.69 +;;                  size (.getSize this)
    1.70 +;;                  width (- (.width size) left right)
    1.71 +;;                  height (- (.height size) top bottom)]
    1.72 +;;              (binding [*graphics* g
    1.73 +;;                        *update-fn* (make-update-fn this)]
    1.74 +;;                (render-layer! layer top left width height false))))
    1.75 +;;     (getPreferredSize []
    1.76 +;;                       (size layer))))
    1.77 +
    1.78 +(defn make-component [layer]
    1.79 +  (proxy [Component] []
    1.80 +    (update [g] (.paint this g))
    1.81 +    (paint [g]
    1.82 +           (let [size (.getSize this)
    1.83 +                 width (.width size)
    1.84 +                 height (.height size)]
    1.85 +             (binding [*graphics* g
    1.86 +                       *update-fn* (make-update-fn this)]
    1.87 +               (render-layer! layer 0 0 width height false))))
    1.88 +    (getPreferredSize []
    1.89 +                      (let [s (size layer)]
    1.90 +                        (Dimension. (s 0) (s 1))))))
    1.91 +
    1.92 +(comment
    1.93 +  (do 
    1.94 +    (def frame (java.awt.Frame. "Test"))
    1.95 +    (def layer
    1.96 +         (reify Layer
    1.97 +                (render! [this]
    1.98 +                         (.fillRect *graphics* 10 10 40 40))
    1.99 +                (size [this] [100 100])
   1.100 +                (anchor [this] [0 0])))
   1.101 +    (doto frame
   1.102 +      (.addWindowListener
   1.103 +       (proxy [java.awt.event.WindowAdapter] []
   1.104 +         (windowClosing [event] (.dispose frame))))
   1.105 +      (.add (make-component layer))
   1.106 +      (.pack)
   1.107 +      (.setVisible true))
   1.108 +    )
   1.109 +  )
   1.110 \ No newline at end of file
     2.1 --- a/src/indyvon/layer.clj	Sun Jun 06 06:03:38 2010 +0400
     2.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.3 @@ -1,64 +0,0 @@
     2.4 -(ns indyvon.layer
     2.5 -  (:import (java.awt Component Graphics2D)))
     2.6 -
     2.7 -(def ^{:private true} *graphics*)
     2.8 -(def ^{:private true} *rx* 0)
     2.9 -(def ^{:private true} *ry* 0)
    2.10 -
    2.11 -(def *width*)
    2.12 -(def *height*)
    2.13 -
    2.14 -(def *lag*)
    2.15 -
    2.16 -(def *update-fn*)
    2.17 -
    2.18 -(defprotocol Layer
    2.19 -  (render! [this])
    2.20 -  (size [this])
    2.21 -  (anchor [this]))
    2.22 -
    2.23 -(defn- translate [g x y w h clip]
    2.24 -  (if clip
    2.25 -    (.create g x y w h)
    2.26 -    (doto (.create g)
    2.27 -      (.translate x y))))
    2.28 -
    2.29 -(defn render-layer!
    2.30 -  "Render layer in a new graphics context."
    2.31 -  ([layer]
    2.32 -     (render-layer! layer 0 0 *width* *height*))
    2.33 -  ([layer x y]
    2.34 -     (render-layer! layer x y true))
    2.35 -  ([layer x y clip]
    2.36 -     (let [s (size layer)]
    2.37 -       (render-layer! layer x y (.width s) (.height s) clip)))
    2.38 -  ([layer x y w h]
    2.39 -     (render-layer! layer x y w h true))
    2.40 -  ([layer x y w h clip]
    2.41 -     (binding [*graphics* (translate *graphics* x y w h clip)
    2.42 -               *rx* (+ *rx* x)
    2.43 -               *ry* (+ *ry* y)
    2.44 -               *width* w
    2.45 -               *height* h]
    2.46 -       (render! layer))))
    2.47 -
    2.48 -(defn- make-update-fn [component]
    2.49 -  (fn [] (.repaint component)))
    2.50 -
    2.51 -(defn make-component [layer]
    2.52 -  (proxy [Component] []
    2.53 -    (update [g] (.paint this g))
    2.54 -    (paint [g]
    2.55 -           (let [insets (.getInsets this)
    2.56 -                 top (.top insets)
    2.57 -                 left (.left insets)
    2.58 -                 bottom (.bottom insets)
    2.59 -                 right (.right insets)
    2.60 -                 size (.getSize this)
    2.61 -                 width (- (.width size) left right)
    2.62 -                 height (- (.height size) top bottom)]
    2.63 -             (binding [*graphics* g
    2.64 -                       *update-fn* (make-update-fn this)]
    2.65 -               (render-layer! layer top left width height false))))
    2.66 -    (getPreferredSize []
    2.67 -                      (size layer))))