view src/indyvon/component.clj @ 31:8ac3a21955db

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