view src/indyvon/component.clj @ 33:439f6ecee119

Include graphics into context. Event dispatcher respects clipping.
author Mikhail Kryshen <mikhail@kryshen.net>
date Wed, 07 Jul 2010 07:17:08 +0400
parents 0b3757d263db
children 6975b9a71eec
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 indyvon.layers)
9 (:import (indyvon.core Size Location)
10 (java.awt Component Graphics2D Dimension Color)
11 (javax.swing JFrame JPanel)))
13 (defn- font-context [^Component component]
14 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
16 (defn paint-component
17 [^Component component layer context ^Graphics2D graphics]
18 (let [size (.getSize component)
19 width (.width size)
20 height (.height size)
21 context (assoc context
22 :x 0
23 :y 0
24 :width width
25 :height height
26 :clip (indyvon.core.Bounds. 0 0 width height)
27 :target component
28 :graphics graphics
29 :font-context (.getFontRenderContext graphics)
30 :update-fn #(.repaint component))]
31 (.clearRect graphics 0 0 width height)
32 (draw! layer context))
33 (commit (:event-dispatcher context)))
35 (defn preferred-size [component layer context]
36 (let [context (assoc context
37 :target component
38 :font-context (font-context component))
39 s (size layer context)]
40 (Dimension. (:width s) (:height s))))
42 (defn make-jpanel
43 ([layer]
44 (make-jpanel layer (root-event-dispatcher)))
45 ([layer event-dispatcher]
46 (let [context (default-context)
47 context (assoc context :event-dispatcher event-dispatcher)
48 panel
49 (proxy [JPanel] []
50 (paintComponent [g]
51 (paint-component this layer context g))
52 (getPreferredSize []
53 (preferred-size this layer context)))]
54 (listen! event-dispatcher panel)
55 (.setBackground panel (-> context :theme :back-color))
56 panel)))
58 (comment
59 (do
60 (def frame (JFrame. "Test"))
62 (def layer1
63 (reify
64 Layer
65 (render! [this context]
66 (let-handlers this [context]
67 (doto (graphics context)
68 (.setColor Color/RED)
69 (.fillRect 0 0 (:width context) (:height context)))
70 (:mouse-entered e (println e))
71 (:mouse-exited e (println e))
72 (:mouse-moved e (println e))))
73 (size [this context] (Size. 30 20))))
75 (def layer1b (border-layer layer1 2 3))
77 (def layer2
78 (reify
79 Layer
80 (render! [this context]
81 (doto (graphics context)
82 (.setColor Color/YELLOW)
83 (.fillRect 0 0 (:width context) (:height context)))
84 (draw! layer1b context 10 5)
85 (draw! layer1 context 55 5))
86 (size [this context] (Size. 70 65))))
88 (def layer3
89 (border-layer (text-layer "Sample\ntext" :right :center)))
91 (defn fps-layer [fps]
92 (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5))
94 (def fps
95 (let [update-interval 0.1
96 frames (ref 0)
97 last (ref 0)
98 fl (ref (fps-layer 0.0))]
99 (reify
100 Layer
101 (render! [this c]
102 (draw! @fl c)
103 (dosync
104 (alter frames + 1)
105 (let [time (System/currentTimeMillis)
106 elapsed (/ (- time @last) 1000.0)]
107 (when (> elapsed update-interval)
108 (ref-set fl (fps-layer (/ @frames elapsed)))
109 (ref-set frames 0)
110 (ref-set last time)))))
111 (size [this c] (size @fl c)))))
113 (def layer
114 (reify Layer
115 (render! [this context]
116 (update context)
117 (doto (graphics context)
118 (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
119 (.drawLine 0 0 (:width context) (:height context)))
120 (draw! layer2 context 15 20)
121 (draw! layer3 context 100 100 80 50)
122 (draw! fps context))
123 (size [this context] (Size. 400 300))))
125 (doto frame
126 (.addWindowListener
127 (proxy [java.awt.event.WindowAdapter] []
128 (windowClosing [event] (.dispose frame))))
129 (.. (getContentPane) (add (make-jpanel (viewport layer))))
130 (.pack)
131 (.setVisible true))
132 )
133 )