view src/indyvon/component.clj @ 23:bbe95838fe77

Scrollable viewport.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sun, 20 Jun 2010 04:23:28 +0400
parents dc81033d4122
children c17e3588ede9
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 :target component
23 :font-context (.getFontRenderContext graphics)
24 :update-fn #(.repaint component))]
25 (.clearRect graphics 0 0 width height)
26 (draw! context layer graphics 0 0 width height false))
27 (commit (: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. (s 0) (s 1))))
36 (defn make-jpanel
37 ([layer]
38 (make-jpanel layer (event/make-event-dispatcher)))
39 ([layer event-dispatcher]
40 (let [context (default-context)
41 context (assoc context :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 (defn handler [event context]
57 (println (:layer context) (.paramString event)))
59 (def layer1
60 (reify
61 Layer
62 (render! [this context g]
63 (.setColor g Color/RED)
64 (.fillRect g 0 0 (:width context) (:height context)))
65 (size [this context] [30 20])
66 MouseHandler
67 (handle-mouse [this context event]
68 (println "layer1" (.paramString event)))))
70 (def layer1b (border-layer layer1 2 3))
72 (def layer2
73 (reify
74 Layer
75 (render! [this context g]
76 (.setColor g Color/YELLOW)
77 (.fillRect g 0 0 (:width context) (:height context))
78 (draw! context layer1b g 10 5)
79 (draw! context layer1 g 55 5))
80 (size [this context] [70 65])
81 MouseHandler
82 (handle-mouse [this context event]
83 (println "layer2" (.paramString event)))))
85 (def layer3
86 (border-layer (text-layer "Sample\ntext" :right :center)))
88 (defn fps-layer [fps]
89 (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5))
91 (def fps
92 (let [update-interval 0.1
93 frames (ref 0)
94 last (ref 0)
95 fl (ref (fps-layer 0.0))]
96 (reify
97 Layer
98 (render! [this c g]
99 (draw! c @fl g)
100 (dosync
101 (alter frames + 1)
102 (let [time (System/currentTimeMillis)
103 elapsed (/ (- time @last) 1000.0)]
104 (when (> elapsed update-interval)
105 (ref-set fl (fps-layer (/ @frames elapsed)))
106 (ref-set frames 0)
107 (ref-set last time)))))
108 (size [this c] (size @fl c)))))
110 (def layer
111 (reify Layer
112 (render! [this context g]
113 ;;(update context)
114 (.setColor g (rand-nth [Color/BLACK Color/BLUE Color/RED]))
115 (.drawLine g 0 0 (:width context) (:height context))
116 (draw! context layer2 g 15 20)
117 (draw! context layer3 g 100 100 80 50)
118 (draw! context fps g))
119 (size [this context] [400 300])))
121 (doto frame
122 (.addWindowListener
123 (proxy [java.awt.event.WindowAdapter] []
124 (windowClosing [event] (.dispose frame))))
125 (.. (getContentPane) (add (make-jpanel (viewport layer))))
126 (.pack)
127 (.setVisible true))
128 )
129 )