view src/indyvon/component.clj @ 34:6975b9a71eec

Finally use var bindings instead of a context record.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 08 Jul 2010 05:27:54 +0400
parents 439f6ecee119 828795987d4c
children 0d593970cb76
line source
1 ;;
2 ;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net>
3 ;;
4 ;; This file is part of Indyvon.
5 ;;
7 (ns indyvon.component
8 (:use indyvon.core
9 indyvon.layers)
10 (:import (indyvon.core Size Bounds)
11 (java.awt Graphics2D Component Dimension Color)
12 (javax.swing JFrame JPanel)))
14 (defn- font-context [^Component component]
15 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
17 (defn paint-component
18 [^Component component layer ^Graphics2D graphics event-dispatcher]
19 (let [size (.getSize component)
20 width (.width size)
21 height (.height size)]
22 (.clearRect graphics 0 0 width height)
23 (let [bounds (Bounds. 0 0 width height)]
24 (binding [*graphics* graphics
25 *font-context* (.getFontRenderContext graphics)
26 *target* component
27 *event-dispatcher* event-dispatcher
28 *update* #(.repaint component)
29 *bounds* bounds
30 *clip* bounds]
31 (render! layer nil)
32 (commit event-dispatcher)))))
34 (defn preferred-size [component layer]
35 (binding [*target* component
36 *font-context*' (font-context component)]
37 (let [s (size layer nil)]
38 (Dimension. (:width s) (:height s)))))
40 (defn make-jpanel
41 ([layer]
42 (make-jpanel layer (root-event-dispatcher)))
43 ([layer event-dispatcher]
44 (let [panel
45 (proxy [JPanel] []
46 (paintComponent [g]
47 (paint-component this layer g event-dispatcher))
48 (getPreferredSize []
49 (preferred-size this layer)))]
50 (.setBackground panel (:back-color *theme*))
51 (listen! event-dispatcher panel)
52 panel)))
54 (comment
55 (do
56 (def frame (JFrame. "Test"))
58 (def layer1
59 (reify
60 Layer
61 (render! [layer opts]
62 (with-handlers layer
63 (doto *graphics*
64 (.setColor Color/RED)
65 (.fillRect 0 0 (:width *bounds*) (:height *bounds*)))
66 (:mouse-entered e (println e))
67 (:mouse-exited e (println e))
68 (:mouse-moved e (println e))))
69 (size [layer opts] (Size. 30 20))))
71 (def layer1b (border-layer layer1 2 3))
73 (def layer2
74 (reify
75 Layer
76 (render! [layer opts]
77 (doto *graphics*
78 (.setColor Color/YELLOW)
79 (.fillRect 0 0 (:width *bounds*) (:height *bounds*)))
80 (draw! layer1b [10 5])
81 (draw! layer1 [55 5]))
82 (size [layer opts] (Size. 70 65))))
84 (def layer3
85 (border-layer (text-layer "Sample\ntext" :right :center)))
87 (defn fps-layer [fps]
88 (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5))
90 (def fps
91 (let [update-interval 0.1
92 frames (ref 0)
93 last (ref 0)
94 fl (ref (fps-layer 0.0))]
95 (reify
96 Layer
97 (render! [layer opts]
98 (render! @fl nil)
99 (dosync
100 (alter frames + 1)
101 (let [time (System/currentTimeMillis)
102 elapsed (/ (- time @last) 1000.0)]
103 (when (> elapsed update-interval)
104 (ref-set fl (fps-layer (/ @frames elapsed)))
105 (ref-set frames 0)
106 (ref-set last time)))))
107 (size [layer opts] (size @fl nil)))))
109 (def layer
110 (reify Layer
111 (render! [layer opts]
112 (*update*)
113 (doto *graphics*
114 (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
115 (.drawLine 0 0 (:width *bounds*) (:height *bounds*)))
116 (draw! layer2 [15 20])
117 (draw! layer3 [100 100 80 50])
118 (render! fps nil))
119 (size [layer opts] (Size. 400 300))))
121 (doto frame
122 (.addWindowListener
123 (proxy [java.awt.event.WindowAdapter] []
124 (windowClosing [event] (.dispose frame))))
125 (.. (getContentPane) (add (make-jpanel (viewport layer))))
126 (.pack)
127 (.setVisible true))
128 )
129 )