view src/indyvon/core.clj @ 1:a93cfcf60f27

Layers.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 07 Jun 2010 04:42:52 +0400
parents 43e3358ca4d9
children 0f2a98f71a9c
line source
1 (ns indyvon.core
2 (:import (java.awt Dimension Point Component Graphics2D)))
4 (def ^{:private true} *graphics*)
5 (def ^{:private true} *rx* 0)
6 (def ^{:private true} *ry* 0)
8 (def *width*)
9 (def *height*)
11 (def *lag*)
13 (def *update-fn*)
15 (defprotocol Layer
16 (render! [this])
17 (size [this])
18 (anchor [this]))
20 ;; (defmacro make-layer [& fns]
21 ;; (let [fn-map
22 ;; (apply hash-map
23 ;; (reduce #(conj %1 (first %2) (next %2)) []
24 ;; fns))]
25 ;; ;; TODO
26 ;; fn-map))
28 (defn- translate [g x y w h clip]
29 (if clip
30 (.create g x y w h)
31 (doto (.create g)
32 (.translate x y))))
34 (defn render-layer!
35 "Render layer in a new graphics context."
36 ([layer]
37 (render-layer! layer 0 0 *width* *height*))
38 ([layer x y]
39 (render-layer! layer x y true))
40 ([layer x y clip]
41 (let [s (size layer)]
42 (render-layer! layer x y (.width s) (.height s) clip)))
43 ([layer x y w h]
44 (render-layer! layer x y w h true))
45 ([layer x y w h clip]
46 (binding [*graphics* (translate *graphics* x y w h clip)
47 *rx* (+ *rx* x)
48 *ry* (+ *ry* y)
49 *width* w
50 *height* h]
51 (render! layer))))
53 (defn- make-update-fn [component]
54 (fn [] (.repaint component)))
56 ;; (defn make-component [layer]
57 ;; (proxy [Component] []
58 ;; (update [g] (.paint this g))
59 ;; (paint [g]
60 ;; (let [insets (.getInsets this)
61 ;; top (.top insets)
62 ;; left (.left insets)
63 ;; bottom (.bottom insets)
64 ;; right (.right insets)
65 ;; size (.getSize this)
66 ;; width (- (.width size) left right)
67 ;; height (- (.height size) top bottom)]
68 ;; (binding [*graphics* g
69 ;; *update-fn* (make-update-fn this)]
70 ;; (render-layer! layer top left width height false))))
71 ;; (getPreferredSize []
72 ;; (size layer))))
74 (defn make-component [layer]
75 (proxy [Component] []
76 (update [g] (.paint this g))
77 (paint [g]
78 (let [size (.getSize this)
79 width (.width size)
80 height (.height size)]
81 (binding [*graphics* g
82 *update-fn* (make-update-fn this)]
83 (render-layer! layer 0 0 width height false))))
84 (getPreferredSize []
85 (let [s (size layer)]
86 (Dimension. (s 0) (s 1))))))
88 (comment
89 (do
90 (def frame (java.awt.Frame. "Test"))
91 (def layer
92 (reify Layer
93 (render! [this]
94 (.fillRect *graphics* 10 10 40 40))
95 (size [this] [100 100])
96 (anchor [this] [0 0])))
97 (doto frame
98 (.addWindowListener
99 (proxy [java.awt.event.WindowAdapter] []
100 (windowClosing [event] (.dispose frame))))
101 (.add (make-component layer))
102 (.pack)
103 (.setVisible true))
104 )