Mercurial > hg > indyvon
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 wrap: on
line source
;; ;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net> ;; ;; This file is part of Indyvon. ;; (ns indyvon.component (:use indyvon.core indyvon.layers) (:import (java.awt Component Dimension Color) (javax.swing JFrame JPanel))) (defn- font-context [component] (.getFontRenderContext (.getFontMetrics component (.getFont component)))) (defn paint-component [component layer context graphics] (let [size (.getSize component) width (.width size) height (.height size) context (assoc context :target component :font-context (.getFontRenderContext graphics) :update-fn #(.repaint component))] (.clearRect graphics 0 0 width height) (draw! layer context graphics 0 0 width height false)) (commit (:dispatcher context))) (defn preferred-size [component layer context] (let [context (assoc context :target component :font-context (font-context component)) s (size layer context)] (Dimension. (s 0) (s 1)))) (defn make-jpanel ([layer] (make-jpanel layer (make-event-dispatcher))) ([layer event-dispatcher] (let [context (default-context) context (assoc context :dispatcher event-dispatcher) panel (proxy [JPanel] [] (paintComponent [g] (paint-component this layer context g)) (getPreferredSize [] (preferred-size this layer context)))] (listen! event-dispatcher panel) (.setBackground panel (-> context :theme :back-color)) panel))) (comment (do (def frame (JFrame. "Test")) (def layer1 (reify Layer (render! [this context g] (.setColor g Color/RED) (.fillRect g 0 0 (:width context) (:height context))) (size [this context] [30 20]) MouseHandler (handle-mouse [this context event] (println "layer1" event)))) (def layer1b (border-layer layer1 2 3)) (def layer2 (reify Layer (render! [this context g] (.setColor g Color/YELLOW) (.fillRect g 0 0 (:width context) (:height context)) (draw! layer1b context g 10 5) (draw! layer1 context g 55 5)) (size [this context] [70 65]) MouseHandler (handle-mouse [this context event] (println "layer2" event)))) (def layer3 (border-layer (text-layer "Sample\ntext" :right :center))) (defn fps-layer [fps] (border-layer (text-layer (format "%.1f" fps) :right :bottom) 0 5)) (def fps (let [update-interval 0.1 frames (ref 0) last (ref 0) fl (ref (fps-layer 0.0))] (reify Layer (render! [this c g] (draw! @fl c g) (dosync (alter frames + 1) (let [time (System/currentTimeMillis) elapsed (/ (- time @last) 1000.0)] (when (> elapsed update-interval) (ref-set fl (fps-layer (/ @frames elapsed))) (ref-set frames 0) (ref-set last time))))) (size [this c] (size @fl c))))) (def layer (reify Layer (render! [this context g] ;;(update context) (.setColor g (rand-nth [Color/BLACK Color/BLUE Color/RED])) (.drawLine g 0 0 (:width context) (:height context)) (draw! layer2 context g 15 20) (draw! layer3 context g 100 100 80 50) (draw! fps context g)) (size [this context] [400 300]))) (doto frame (.addWindowListener (proxy [java.awt.event.WindowAdapter] [] (windowClosing [event] (.dispose frame)))) (.. (getContentPane) (add (make-jpanel (viewport layer)))) (.pack) (.setVisible true)) ) )