view src/indyvon/component.clj @ 22:dc81033d4122

Layers should satisfy MouseHandler protocol to recieve mouse events.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sat, 19 Jun 2010 06:50:24 +0400
parents a70609bad3a4
children bbe95838fe77
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 (:require (indyvon [event :as event]))
10 (:import (java.awt Component Dimension Color)
11 (java.awt.event MouseEvent)
12 (javax.swing JFrame JPanel)))
14 (defn- font-context [component]
15 (.getFontRenderContext (.getFontMetrics component (.getFont component))))
17 (defn paint-component [component layer context graphics]
18 (let [size (.getSize component)
19 width (.width size)
20 height (.height size)
21 context (assoc context
22 :font-context (.getFontRenderContext graphics)
23 :update-fn #(.repaint component))]
24 (.clearRect graphics 0 0 width height)
25 (draw! context layer graphics 0 0 width height false))
26 (commit (:dispatcher context)))
28 (defn preferred-size [component layer context]
29 (let [context (assoc context
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 (event/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 (defn handler [event context]
55 (println (:layer context) (.paramString event)))
57 (def layer1
58 (reify
59 Layer
60 (render! [this context g]
61 (.setColor g Color/RED)
62 (.fillRect g 0 0 (:width context) (:height context)))
63 (size [this context] [30 20])
64 MouseHandler
65 (handle-mouse [this context event]
66 (println "layer1" (.paramString event)))))
68 (def layer1b (border-layer layer1 2 3))
70 (def layer2
71 (reify
72 Layer
73 (render! [this context g]
74 (.setColor g Color/YELLOW)
75 (.fillRect g 0 0 (:width context) (:height context))
76 (draw! context layer1b g 10 5)
77 (draw! context layer1 g 55 5))
78 (size [this context] [70 65])
79 MouseHandler
80 (handle-mouse [this context event]
81 (println "layer2" (.paramString event)))))
83 (def layer3
84 (border-layer (text-layer "Sample\ntext" :right :center)))
86 (defn fps-layer [fps]
87 (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5))
89 (def fps
90 (let [update-interval 0.1
91 frames (ref 0)
92 last (ref 0)
93 fl (ref (fps-layer 0.0))]
94 (reify
95 Layer
96 (render! [this c g]
97 (draw! c @fl g)
98 (dosync
99 (alter frames + 1)
100 (let [time (System/currentTimeMillis)
101 elapsed (/ (- time @last) 1000.0)]
102 (when (> elapsed update-interval)
103 (ref-set fl (fps-layer (/ @frames elapsed)))
104 (ref-set frames 0)
105 (ref-set last time)))))
106 (size [this c] (size @fl c)))))
108 (def layer
109 (reify Layer
110 (render! [this context g]
111 ;;(update context)
112 (.setColor g (rand-nth [Color/BLACK Color/BLUE Color/RED]))
113 (.drawLine g 0 0 (:width context) (:height context))
114 (draw! context layer2 g 15 20)
115 (draw! context layer3 g 100 100 80 50)
116 (draw! context fps g))
117 (size [this context] [400 300])))
119 (doto frame
120 (.addWindowListener
121 (proxy [java.awt.event.WindowAdapter] []
122 (windowClosing [event] (.dispose frame))))
123 (.. (getContentPane) (add (make-jpanel layer)))
124 (.pack)
125 (.setVisible true))
126 )
127 )