Mercurial > hg > indyvon
view src/indyvon/component.clj @ 34:6975b9a71eec
Finally use var bindings instead of a context record.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Thu, 08 Jul 2010 05:27:54 +0400 |
parents | 439f6ecee119 828795987d4c |
children | 0d593970cb76 |
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 (indyvon.core Size Bounds) (java.awt Graphics2D Component Dimension Color) (javax.swing JFrame JPanel))) (defn- font-context [^Component component] (.getFontRenderContext (.getFontMetrics component (.getFont component)))) (defn paint-component [^Component component layer ^Graphics2D graphics event-dispatcher] (let [size (.getSize component) width (.width size) height (.height size)] (.clearRect graphics 0 0 width height) (let [bounds (Bounds. 0 0 width height)] (binding [*graphics* graphics *font-context* (.getFontRenderContext graphics) *target* component *event-dispatcher* event-dispatcher *update* #(.repaint component) *bounds* bounds *clip* bounds] (render! layer nil) (commit event-dispatcher))))) (defn preferred-size [component layer] (binding [*target* component *font-context*' (font-context component)] (let [s (size layer nil)] (Dimension. (:width s) (:height s))))) (defn make-jpanel ([layer] (make-jpanel layer (root-event-dispatcher))) ([layer event-dispatcher] (let [panel (proxy [JPanel] [] (paintComponent [g] (paint-component this layer g event-dispatcher)) (getPreferredSize [] (preferred-size this layer)))] (.setBackground panel (:back-color *theme*)) (listen! event-dispatcher panel) panel))) (comment (do (def frame (JFrame. "Test")) (def layer1 (reify Layer (render! [layer opts] (with-handlers layer (doto *graphics* (.setColor Color/RED) (.fillRect 0 0 (:width *bounds*) (:height *bounds*))) (:mouse-entered e (println e)) (:mouse-exited e (println e)) (:mouse-moved e (println e)))) (size [layer opts] (Size. 30 20)))) (def layer1b (border-layer layer1 2 3)) (def layer2 (reify Layer (render! [layer opts] (doto *graphics* (.setColor Color/YELLOW) (.fillRect 0 0 (:width *bounds*) (:height *bounds*))) (draw! layer1b [10 5]) (draw! layer1 [55 5])) (size [layer opts] (Size. 70 65)))) (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! [layer opts] (render! @fl nil) (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 [layer opts] (size @fl nil))))) (def layer (reify Layer (render! [layer opts] (*update*) (doto *graphics* (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED])) (.drawLine 0 0 (:width *bounds*) (:height *bounds*))) (draw! layer2 [15 20]) (draw! layer3 [100 100 80 50]) (render! fps nil)) (size [layer opts] (Size. 400 300)))) (doto frame (.addWindowListener (proxy [java.awt.event.WindowAdapter] [] (windowClosing [event] (.dispose frame)))) (.. (getContentPane) (add (make-jpanel (viewport layer)))) (.pack) (.setVisible true)) ) )