view src/indyvon/component.clj @ 32:0b3757d263db

Fixed event dispatcher. Added type hints.
author Mikhail Kryshen <mikhail@kryshen.net>
date Wed, 07 Jul 2010 05:57:49 +0400
parents 8ac3a21955db
children 439f6ecee119
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 :target component
23 :font-context (.getFontRenderContext graphics)
24 :update-fn #(.repaint component))]
25 (.clearRect graphics 0 0 width height)
26 (draw! layer context graphics 0 0 width height false))
27 (commit (:event-dispatcher context)))
29 (defn preferred-size [component layer context]
30 (let [context (assoc context
31 :target component
32 :font-context (font-context component))
33 s (size layer context)]
34 (Dimension. (:width s) (:height s))))
36 (defn make-jpanel
37 ([layer]
38 (make-jpanel layer (root-event-dispatcher)))
39 ([layer event-dispatcher]
40 (let [context (default-context)
41 context (assoc context :event-dispatcher event-dispatcher)
42 panel
43 (proxy [JPanel] []
44 (paintComponent [g]
45 (paint-component this layer context g))
46 (getPreferredSize []
47 (preferred-size this layer context)))]
48 (listen! event-dispatcher panel)
49 (.setBackground panel (-> context :theme :back-color))
50 panel)))
52 (comment
53 (do
54 (def frame (JFrame. "Test"))
56 (def layer1
57 (reify
58 Layer
59 (render! [this context g]
60 (.setColor g Color/RED)
61 (.fillRect g 0 0 (:width context) (:height context)))
62 (size [this context] (Size. 30 20))))
64 (def layer1b (border-layer layer1 2 3))
66 (def layer2
67 (reify
68 Layer
69 (render! [this context g]
70 (.setColor g Color/YELLOW)
71 (.fillRect g 0 0 (:width context) (:height context))
72 (draw! layer1b context g 10 5)
73 (draw! layer1 context g 55 5))
74 (size [this context] (Size. 70 65))))
76 (def layer3
77 (border-layer (text-layer "Sample\ntext" :right :center)))
79 (defn fps-layer [fps]
80 (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5))
82 (def fps
83 (let [update-interval 0.1
84 frames (ref 0)
85 last (ref 0)
86 fl (ref (fps-layer 0.0))]
87 (reify
88 Layer
89 (render! [this c g]
90 (draw! @fl c g)
91 (dosync
92 (alter frames + 1)
93 (let [time (System/currentTimeMillis)
94 elapsed (/ (- time @last) 1000.0)]
95 (when (> elapsed update-interval)
96 (ref-set fl (fps-layer (/ @frames elapsed)))
97 (ref-set frames 0)
98 (ref-set last time)))))
99 (size [this c] (size @fl c)))))
101 (def layer
102 (reify Layer
103 (render! [this context g]
104 (update context)
105 (.setColor g (rand-nth [Color/BLACK Color/BLUE Color/RED]))
106 (.drawLine g 0 0 (:width context) (:height context))
107 (draw! layer2 context g 15 20)
108 (draw! layer3 context g 100 100 80 50)
109 (draw! fps context g))
110 (size [this context] (Size. 400 300))))
112 (doto frame
113 (.addWindowListener
114 (proxy [java.awt.event.WindowAdapter] []
115 (windowClosing [event] (.dispose frame))))
116 (.. (getContentPane) (add (make-jpanel (viewport layer))))
117 (.pack)
118 (.setVisible true))
119 )
120 )