view src/indyvon/component.clj @ 26:1237f7555029

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