changeset 2:0f2a98f71a9c

Beginnings of event dispatching code.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 07 Jun 2010 21:13:05 +0400
parents a93cfcf60f27
children 6bc931b1b755
files src/indyvon/core.clj
diffstat 1 files changed, 54 insertions(+), 16 deletions(-) [+]
line diff
     1.1 --- a/src/indyvon/core.clj	Mon Jun 07 04:42:52 2010 +0400
     1.2 +++ b/src/indyvon/core.clj	Mon Jun 07 21:13:05 2010 +0400
     1.3 @@ -1,10 +1,11 @@
     1.4  (ns indyvon.core
     1.5 -  (:import (java.awt Dimension Point Component Graphics2D)))
     1.6 +  (:import (java.awt Dimension Point Component Graphics2D AWTEvent)))
     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 *graphics*)
    1.13 +
    1.14  (def *width*)
    1.15  (def *height*)
    1.16  
    1.17 @@ -17,15 +18,20 @@
    1.18    (size [this])
    1.19    (anchor [this]))
    1.20  
    1.21 -;; (defmacro make-layer [& fns]
    1.22 -;;   (let [fn-map
    1.23 -;;         (apply hash-map
    1.24 -;;                (reduce #(conj %1 (first %2) (next %2)) []
    1.25 -;;                        fns))]
    1.26 -;;     ;; TODO
    1.27 -;;     fn-map))
    1.28 +(defmacro reify-layer [& fns]
    1.29 +  (let [method-map {'size [['_] [0 0]]
    1.30 +                    'anchor [['_] [0 0]]}
    1.31 +        method-map (loop [fns fns
    1.32 +                          mm method-map]
    1.33 +                     (if-let [form (first fns)]
    1.34 +                       (recur (next fns)
    1.35 +                              (conj mm [(first form) (next form)]))
    1.36 +                       mm))
    1.37 +        methods (for [m method-map]
    1.38 +                  (cons (first m) (second m)))]
    1.39 +    `(reify Layer ~@methods)))
    1.40  
    1.41 -(defn- translate [g x y w h clip]
    1.42 +(defn- make-graphics [g x y w h clip]
    1.43    (if clip
    1.44      (.create g x y w h)
    1.45      (doto (.create g)
    1.46 @@ -43,13 +49,46 @@
    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 +     (binding [*graphics* (make-graphics *graphics* x y w h clip)
    1.52                 *rx* (+ *rx* x)
    1.53                 *ry* (+ *ry* y)
    1.54                 *width* w
    1.55                 *height* h]
    1.56         (render! layer))))
    1.57  
    1.58 +;;
    1.59 +;; Event handling
    1.60 +;;
    1.61 +
    1.62 +(defprotocol EventDispatcher
    1.63 +  (register [this layer])
    1.64 +  (commit [this])
    1.65 +  (dispatch [this event]))
    1.66 +
    1.67 +(defrecord LayerContext [layer rx ry width height update-fn])
    1.68 +
    1.69 +(defn make-event-dispatcher []
    1.70 +  (let [contexts-r (ref [])
    1.71 +        contexts-d (ref [])]
    1.72 +    (reify
    1.73 +     EventDispatcher
    1.74 +     (register [this layer]
    1.75 +      (dosync
    1.76 +       (alter contexts-r conj
    1.77 +              (LayerContext. layer *rx* *ry*
    1.78 +                             *width* *height*
    1.79 +                             *update-fn*))))
    1.80 +     (commit [this]
    1.81 +      (dosync (ref-set contexts-d @contexts-r)
    1.82 +              (ref-set contexts-r [])))
    1.83 +     (dispatch [this event]
    1.84 +               ;; TODO
    1.85 +               ))))
    1.86 +
    1.87 +;;
    1.88 +;; Connection to AWT.
    1.89 +;;
    1.90 +
    1.91  (defn- make-update-fn [component]
    1.92    (fn [] (.repaint component)))
    1.93  
    1.94 @@ -89,11 +128,10 @@
    1.95    (do 
    1.96      (def frame (java.awt.Frame. "Test"))
    1.97      (def layer
    1.98 -         (reify Layer
    1.99 -                (render! [this]
   1.100 -                         (.fillRect *graphics* 10 10 40 40))
   1.101 -                (size [this] [100 100])
   1.102 -                (anchor [this] [0 0])))
   1.103 +         (reify-layer
   1.104 +          (render! [this]
   1.105 +                   (.fillRect *graphics* 10 10 40 40))
   1.106 +          (size [this] [100 100])))
   1.107      (doto frame
   1.108        (.addWindowListener
   1.109         (proxy [java.awt.event.WindowAdapter] []