Mercurial > hg > indyvon
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] []