changeset 71:59e1810c0278

Moved fps code from demo to layers. Moved frame creation code from demo to component.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sun, 29 Aug 2010 20:38:22 +0400
parents b2f6c78413d3
children 76f4126aba84
files src/net/kryshen/indyvon/component.clj src/net/kryshen/indyvon/demo.clj src/net/kryshen/indyvon/layers.clj
diffstat 3 files changed, 76 insertions(+), 69 deletions(-) [+]
line diff
     1.1 --- a/src/net/kryshen/indyvon/component.clj	Sun Aug 29 18:33:41 2010 +0400
     1.2 +++ b/src/net/kryshen/indyvon/component.clj	Sun Aug 29 20:38:22 2010 +0400
     1.3 @@ -34,3 +34,8 @@
     1.4         (add-observer panel layer (fn [_] (.repaint panel)))
     1.5         (listen! event-dispatcher panel)
     1.6         panel)))
     1.7 +
     1.8 +(defn make-jframe [title layer]
     1.9 +  (doto (JFrame. title)
    1.10 +    (.. (getContentPane) (add (make-jpanel layer)))
    1.11 +    (.pack)))
     2.1 --- a/src/net/kryshen/indyvon/demo.clj	Sun Aug 29 18:33:41 2010 +0400
     2.2 +++ b/src/net/kryshen/indyvon/demo.clj	Sun Aug 29 20:38:22 2010 +0400
     2.3 @@ -9,90 +9,69 @@
     2.4    (:use
     2.5     (net.kryshen.indyvon core layers component))
     2.6    (:import
     2.7 -   (net.kryshen.indyvon.core Size Bounds)
     2.8 +   (net.kryshen.indyvon.core Size)
     2.9     (java.awt Color)
    2.10     (javax.swing JFrame)))
    2.11  
    2.12  (def layer1
    2.13 -     (reify
    2.14 -      Layer
    2.15 -      (render! [layer]
    2.16 -         (with-handlers layer
    2.17 -           (doto *graphics*
    2.18 -             (.setColor (rand-nth [Color/RED Color/ORANGE]))
    2.19 -             (.fillRect 0 0 *width* *height*))
    2.20 -           (:mouse-entered e (println e))
    2.21 -           (:mouse-exited e (println e))
    2.22 -           (:mouse-moved e (println e))))
    2.23 -      (layer-size [layer] (Size. 30 20))))
    2.24 +  (reify
    2.25 +   Layer
    2.26 +   (render! [layer]
    2.27 +      (with-handlers layer
    2.28 +        (doto *graphics*
    2.29 +          (.setColor (rand-nth [Color/RED Color/ORANGE]))
    2.30 +          (.fillRect 0 0 *width* *height*))
    2.31 +        (:mouse-entered e (println e))
    2.32 +        (:mouse-exited e (println e))
    2.33 +        (:mouse-moved e (println e))))
    2.34 +   (layer-size [layer]
    2.35 +      (Size. 30 20))))
    2.36  
    2.37  (def layer1b (border layer1 2 3))
    2.38  
    2.39 -;;(def layer1c (async-layer layer1 20 30))
    2.40 +(def layer2
    2.41 +  (reify
    2.42 +   Layer
    2.43 +   (render! [layer]
    2.44 +      (doto *graphics*
    2.45 +        (.setColor Color/YELLOW)
    2.46 +        (.fillRect 0 0 *width* *height*))
    2.47 +      (with-rotate 0.5 0 0
    2.48 +        (draw! layer1b 30 25))
    2.49 +      (draw! layer1 55 5))
    2.50 +   (layer-size [layer]
    2.51 +      (Size. 70 65))))
    2.52  
    2.53 -(def layer2
    2.54 -     (reify
    2.55 -      Layer
    2.56 -      (render! [layer]
    2.57 -         (doto *graphics*
    2.58 -           (.setColor Color/YELLOW)
    2.59 -           (.fillRect 0 0 *width* *height*))
    2.60 -         (with-rotate 0.5 0 0
    2.61 -           (draw! layer1b 30 25))
    2.62 -         (draw! layer1 55 5))
    2.63 -      (layer-size [layer] (Size. 70 65))))
    2.64 +(def layer2m (miniature layer2 30 30))
    2.65  
    2.66 -(def layer2m
    2.67 -     (miniature layer2 30 30))
    2.68 -
    2.69 -(def layer3
    2.70 -     (border (text-layer "Sample\ntext" :right :center)))
    2.71 -
    2.72 -(defn fps-layer [fps]
    2.73 -  (border (text-layer (format "%.1f" fps) :right :bottom) 0 5))
    2.74 -
    2.75 -(def fps
    2.76 -     (let [update-interval 0.1
    2.77 -           frames (ref 0)
    2.78 -           last (ref 0)
    2.79 -           fl (ref (fps-layer 0.0))]
    2.80 -       (reify
    2.81 -        Layer
    2.82 -        (render! [layer]
    2.83 -           (draw! @fl)
    2.84 -           (dosync
    2.85 -            (alter frames + 1)
    2.86 -            (let [time (System/currentTimeMillis)
    2.87 -                  elapsed (/ (- time @last) 1000.0)]
    2.88 -              (when (> elapsed update-interval)
    2.89 -                (ref-set fl (fps-layer (/ @frames elapsed)))
    2.90 -                (ref-set frames 0)
    2.91 -                (ref-set last time)))))
    2.92 -        (layer-size [layer] (layer-size @fl)))))
    2.93 +(def layer3 (border (text-layer "Sample\ntext" :right :center)))
    2.94  
    2.95  (def layer
    2.96 -     (reify
    2.97 -      Layer
    2.98 -      (render! [layer]
    2.99 -         ;;(repaint)
   2.100 -         (doto *graphics*
   2.101 -           (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
   2.102 -           (.drawLine 0 0 *width* *height*))
   2.103 -         (draw! layer2 15 20)
   2.104 -         (draw! layer2m 120 50)
   2.105 -         (draw! layer3 100 100 80 50)
   2.106 -         (draw! fps))
   2.107 -      (layer-size [layer] (Size. 400 300))))
   2.108 +  (reify
   2.109 +   Layer
   2.110 +   (render! [layer]
   2.111 +      ;;(repaint)
   2.112 +      (doto *graphics*
   2.113 +        ;; Random color to see when repaint happens.
   2.114 +        (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
   2.115 +        (.drawLine 0 0 *width* *height*)
   2.116 +        (.drawLine *width* 0 0 *height*))
   2.117 +      (draw! layer2 15 20)
   2.118 +      (draw! layer2m 120 50)
   2.119 +      (draw! layer3 100 100 80 50))
   2.120 +   (layer-size [layer]
   2.121 +      (Size. 400 300))))
   2.122  
   2.123 -(def root (viewport layer))
   2.124 +(def vp (viewport layer))
   2.125 +
   2.126 +(def root (fps-layer vp))
   2.127  
   2.128  (defn show-frame [layer]
   2.129 -  (doto (JFrame. "Test")
   2.130 +  (doto (make-jframe "Test" layer)
   2.131      (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE)
   2.132 -    (.. (getContentPane) (add (make-jpanel layer)))
   2.133 -    (.pack)
   2.134      (.setVisible true)))
   2.135  
   2.136  (defn -main []
   2.137 +  (println "Try to drag the viewport.")
   2.138    (show-frame root)
   2.139 -  (show-frame (viewport-miniature root 80 60)))
   2.140 +  (show-frame (fps-layer (viewport-miniature vp 80 60))))
     3.1 --- a/src/net/kryshen/indyvon/layers.clj	Sun Aug 29 18:33:41 2010 +0400
     3.2 +++ b/src/net/kryshen/indyvon/layers.clj	Sun Aug 29 20:38:22 2010 +0400
     3.3 @@ -171,7 +171,7 @@
     3.4                width (if (pos? width) width 1)
     3.5                height (if (pos? height) height 1)]
     3.6            (Size. width height))))))
     3.7 -    
     3.8 +
     3.9  (defn miniature
    3.10    "Creates layer that asynchronously renders view of the content
    3.11    scaled to the specified size."
    3.12 @@ -254,6 +254,29 @@
    3.13            (.drawRect *graphics* x y w h))))
    3.14     width height))
    3.15  
    3.16 +(defn fps-layer
    3.17 +  "Creates layer that draws content and displays
    3.18 +   the frames per seconds rate." 
    3.19 +  [content]
    3.20 +  (let [update-interval 0.1
    3.21 +        frames (ref 0)
    3.22 +        prev-time (ref 0)
    3.23 +        display (ref nil)]
    3.24 +    (decorate-layer content [_]
    3.25 +       (draw! content)
    3.26 +       (draw!
    3.27 +        (dosync
    3.28 +         (alter frames + 1)
    3.29 +         (let [time (System/nanoTime)
    3.30 +               elapsed (/ (- time @prev-time) 1E9)
    3.31 +               fps (/ @frames elapsed)]
    3.32 +           (when (or (> elapsed update-interval) (not @display))
    3.33 +             (ref-set display
    3.34 +              (border (text-layer (format "%.1f" fps) :right :bottom) 0 5))
    3.35 +             (ref-set frames 0)
    3.36 +             (ref-set prev-time time)))
    3.37 +         @display)))))
    3.38 +
    3.39  ;;
    3.40  ;; Layer context decorators.
    3.41  ;;