view src/net/kryshen/indyvon/demo.clj @ 67:a19cf5007d14

Asynchronous drawing.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sat, 28 Aug 2010 02:37:30 +0400
parents a1999c1f7289
children b2f6c78413d3
line wrap: on
line source

;;
;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net>
;;
;; This file is part of Indyvon.
;;

(ns net.kryshen.indyvon.demo
  (:gen-class)
  (:use
   (net.kryshen.indyvon core layers component))
  (:import
   (net.kryshen.indyvon.core Size Bounds)
   (java.awt Color)
   (javax.swing JFrame)))

(def layer1
     (reify
      Layer
      (render! [layer]
         (with-handlers layer
           (doto *graphics*
             (.setColor (rand-nth [Color/RED Color/ORANGE]))
             (.fillRect 0 0 *width* *height*))
           (:mouse-entered e (println e))
           (:mouse-exited e (println e))
           (:mouse-moved e (println e))))
      (layer-size [layer] (Size. 30 20))))

(def layer1b (border layer1 2 3))

;;(def layer1c (async-layer layer1 20 30))

(def layer2
     (reify
      Layer
      (render! [layer]
         (doto *graphics*
           (.setColor Color/YELLOW)
           (.fillRect 0 0 *width* *height*))
         (with-rotate 0.5 0 0
           (draw! layer1b 30 25))
         (draw! layer1 55 5))
      (layer-size [layer] (Size. 70 65))))

(def layer2m
     (miniature layer2 30 30))

(def layer3
     (border (text-layer "Sample\ntext" :right :center)))

(defn fps-layer [fps]
  (border (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]
           (draw! @fl)
           (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)))))
        (layer-size [layer] (layer-size @fl)))))

(def layer
     (reify
      Layer
      (render! [layer]
         ;;(repaint)
         (doto *graphics*
           (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
           (.drawLine 0 0 *width* *height*))
         (draw! layer2 15 20)
         (draw! layer2m 120 50)
         (draw! layer3 100 100 80 50)
         (draw! fps))
      (layer-size [layer] (Size. 400 300))))

(def root (viewport layer))

(defn show-frame [layer]
  (doto (JFrame. "Test")
    (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE)
    (.. (getContentPane) (add (make-jpanel layer)))
    (.pack)
    (.setVisible true)))

(defn -main []
  (show-frame root)
  (show-frame (miniature root 80 60)))