view src/indyvon/component.clj @ 28:828795987d4c

Some ideas.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 05 Jul 2010 06:11:42 +0400
parents 1237f7555029
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)
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 graphics event-dispatcher]
16 (let [size (.getSize component)
17 width (.width size)
18 height (.height size)]
19 (.clearRect graphics 0 0 width height)
20 (binding [*path* nil
21 *graphics* graphics
22 *font-context*' (.getFontRenderContext graphics)
23 *event-dispatcher* event-dispatcher
24 *update* #(.repaint component)
25 *bounds* (indyvon.core.Bounds. 0 0 width height)]
26 (render! layer nil)
27 (commit event-dispatcher))))
29 (defn preferred-size [component layer]
30 (binding [*path* nil
31 *font-context*' (font-context component)]
32 (let [s (size layer nil)]
33 (Dimension. (:width s) (:height s)))))
35 (defn make-jpanel
36 ([layer]
37 (make-jpanel layer (make-event-dispatcher)))
38 ([layer event-dispatcher]
39 (let [panel
40 (proxy [JPanel] []
41 (paintComponent [g]
42 (paint-component this layer g event-dispatcher))
43 (getPreferredSize []
44 (preferred-size this layer)))]
45 (.setBackground panel (:back-color *theme*))
46 (listen! event-dispatcher panel)
47 panel)))
49 (comment
50 (do
51 (def frame (JFrame. "Test"))
53 (def layer1
54 (reify
55 Layer
56 (render! [this context g]
57 (.setColor g Color/RED)
58 (.fillRect g 0 0 (:width context) (:height context)))
59 (size [this context] [30 20])
60 MouseHandler
61 (handle-mouse [this context event]
62 (println "layer1" event))))
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] [70 65])
75 MouseHandler
76 (handle-mouse [this context event]
77 (println "layer2" event))))
79 (def layer3
80 (border-layer (text-layer "Sample\ntext" :right :center)))
82 (defn fps-layer [fps]
83 (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5))
85 (def fps
86 (let [update-interval 0.1
87 frames (ref 0)
88 last (ref 0)
89 fl (ref (fps-layer 0.0))]
90 (reify
91 Layer
92 (render! [this c g]
93 (draw! @fl c g)
94 (dosync
95 (alter frames + 1)
96 (let [time (System/currentTimeMillis)
97 elapsed (/ (- time @last) 1000.0)]
98 (when (> elapsed update-interval)
99 (ref-set fl (fps-layer (/ @frames elapsed)))
100 (ref-set frames 0)
101 (ref-set last time)))))
102 (size [this c] (size @fl c)))))
104 (def layer
105 (reify Layer
106 (render! [this context g]
107 ;;(update context)
108 (.setColor g (rand-nth [Color/BLACK Color/BLUE Color/RED]))
109 (.drawLine g 0 0 (:width context) (:height context))
110 (draw! layer2 context g 15 20)
111 (draw! layer3 context g 100 100 80 50)
112 (draw! fps context g))
113 (size [this context] [400 300])))
115 (doto frame
116 (.addWindowListener
117 (proxy [java.awt.event.WindowAdapter] []
118 (windowClosing [event] (.dispose frame))))
119 (.. (getContentPane) (add (make-jpanel (viewport layer))))
120 (.pack)
121 (.setVisible true))
122 )
123 )