changeset 81:5d2153e8a28d

Code cleanup.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 02 Sep 2010 03:55:44 +0400
parents 880ae8e03408
children 9a69db231531
files README src/net/kryshen/indyvon/async.clj src/net/kryshen/indyvon/component.clj src/net/kryshen/indyvon/core.clj src/net/kryshen/indyvon/demo.clj src/net/kryshen/indyvon/layers.clj
diffstat 6 files changed, 196 insertions(+), 229 deletions(-) [+]
line diff
     1.1 --- a/README	Wed Sep 01 22:25:55 2010 +0400
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,15 +0,0 @@
     1.4 -# indyvon
     1.5 -
     1.6 -FIXME: write description
     1.7 -
     1.8 -## Usage
     1.9 -
    1.10 -FIXME: write
    1.11 -
    1.12 -## Installation
    1.13 -
    1.14 -FIXME: write
    1.15 -
    1.16 -## License
    1.17 -
    1.18 -FIXME: write
     2.1 --- a/src/net/kryshen/indyvon/async.clj	Wed Sep 01 22:25:55 2010 +0400
     2.2 +++ b/src/net/kryshen/indyvon/async.clj	Thu Sep 02 03:55:44 2010 +0400
     2.3 @@ -112,6 +112,7 @@
     2.4                  (.getGraphics ^Image (:image b))
     2.5                  (:width async-layer)
     2.6                  (:height async-layer)
     2.7 +                ;; TODO: use operational event dispatcher.
     2.8                  dummy-event-dispatcher))
     2.9    (update async-layer))
    2.10  
    2.11 @@ -122,18 +123,18 @@
    2.12  (defrecord AsyncLayer [content width height executor buffers]
    2.13    Layer
    2.14    (render! [layer]
    2.15 -     (repaint-on-update layer)
    2.16 -     (add-context-observer content (fn [_] (draw-offscreen-async layer)))
    2.17 -     (when-not @buffers
    2.18 -       ;; TODO: dynamic size, recreate buffers when size increases.
    2.19 -       (let [new-buffers (repeatedly 2 (partial create-buffer layer))]
    2.20 -         (dosync
    2.21 -          (ref-set buffers new-buffers)))
    2.22 -       (draw-offscreen-async layer))
    2.23 -     (with-buffer layer :front [b]
    2.24 -       (.drawImage *graphics* ^Image (:image b) 0 0 nil)))
    2.25 +    (repaint-on-update layer)
    2.26 +    (add-context-observer content (fn [_] (draw-offscreen-async layer)))
    2.27 +    (when-not @buffers
    2.28 +      ;; TODO: dynamic size, recreate buffers when size increases.
    2.29 +      (let [new-buffers (repeatedly 2 (partial create-buffer layer))]
    2.30 +        (dosync
    2.31 +         (ref-set buffers new-buffers)))
    2.32 +      (draw-offscreen-async layer))
    2.33 +    (with-buffer layer :front [b]
    2.34 +      (.drawImage *graphics* ^Image (:image b) 0 0 nil)))
    2.35    (layer-size [layer]
    2.36 -     (Size. width height)))
    2.37 +    (Size. width height)))
    2.38  
    2.39  (defn async-layer 
    2.40    "Creates layer that draws the content asynchronously using
     3.1 --- a/src/net/kryshen/indyvon/component.clj	Wed Sep 01 22:25:55 2010 +0400
     3.2 +++ b/src/net/kryshen/indyvon/component.clj	Thu Sep 02 03:55:44 2010 +0400
     3.3 @@ -37,12 +37,12 @@
     3.4       (let [panel
     3.5             (proxy [JPanel] []
     3.6               (paintComponent [g]
     3.7 -                (let [size (.getSize ^Component this)]
     3.8 -                  (draw-root! layer g (.width size) (.height size)
     3.9 -                              event-dispatcher this)))
    3.10 +               (let [size (.getSize ^Component this)]
    3.11 +                 (draw-root! layer g (.width size) (.height size)
    3.12 +                             event-dispatcher this)))
    3.13               (getPreferredSize []
    3.14 -                (let [s (root-size layer (font-context this) this)]
    3.15 -                  (Dimension. (:width s) (:height s)))))]
    3.16 +               (let [s (root-size layer (font-context this) this)]
    3.17 +                 (Dimension. (:width s) (:height s)))))]
    3.18         (.setBackground panel (:back-color *theme*))
    3.19         (add-observer panel layer (fn [_] (.repaint panel)))
    3.20         (listen! event-dispatcher panel)
     4.1 --- a/src/net/kryshen/indyvon/core.clj	Wed Sep 01 22:25:55 2010 +0400
     4.2 +++ b/src/net/kryshen/indyvon/core.clj	Thu Sep 02 03:55:44 2010 +0400
     4.3 @@ -19,7 +19,7 @@
     4.4  
     4.5  (ns net.kryshen.indyvon.core
     4.6    (:import
     4.7 -   (java.awt Graphics2D RenderingHints Component Color Font AWTEvent Shape)
     4.8 +   (java.awt Graphics2D RenderingHints Component Color Font Shape)
     4.9     (java.awt.geom AffineTransform Point2D$Double Rectangle2D$Double Area)
    4.10     (java.awt.event MouseListener MouseMotionListener)
    4.11     (java.awt.font FontRenderContext)))
    4.12 @@ -87,6 +87,8 @@
    4.13  ;; TODO: modifiers
    4.14  (defrecord MouseEvent [id when x y x-on-screen y-on-screen button])
    4.15  
    4.16 +;; TODO: KeyEvent
    4.17 +
    4.18  (defprotocol EventDispatcher
    4.19    (listen! [this ^Component component]
    4.20       "Listen for events on the specified AWT Component.")
    4.21 @@ -128,7 +130,7 @@
    4.22  (extend-protocol Anchored
    4.23    net.kryshen.indyvon.core.Layer
    4.24    (anchor [this h-align v-align]
    4.25 -     (default-anchor this h-align v-align)))
    4.26 +    (default-anchor this h-align v-align)))
    4.27  
    4.28  (defn- assoc-cons [m key val]
    4.29    (->> (get m key) (cons val) (assoc m key)))
    4.30 @@ -371,9 +373,8 @@
    4.31  
    4.32  (defn with-handlers*
    4.33    [handle handlers f & args]
    4.34 -  (binding
    4.35 -      [*event-dispatcher* (create-dispatcher
    4.36 -                           *event-dispatcher* handle handlers)]
    4.37 +  (binding [*event-dispatcher* (create-dispatcher
    4.38 +                                *event-dispatcher* handle handlers)]
    4.39      (apply f args)))
    4.40  
    4.41  (defmacro with-handlers
    4.42 @@ -423,15 +424,15 @@
    4.43                             bindings]
    4.44    EventDispatcher
    4.45    (listen! [this component]
    4.46 -     (listen! parent component))
    4.47 +    (listen! parent component))
    4.48    (create-dispatcher [this handle handlers]
    4.49 -     (create-dispatcher parent handle handlers))
    4.50 +    (create-dispatcher parent handle handlers))
    4.51    (commit [this]
    4.52 -     (commit parent))
    4.53 +    (commit parent))
    4.54    (handle-picked? [this handle]
    4.55 -     (handle-picked? parent handle))
    4.56 +    (handle-picked? parent handle))
    4.57    (handle-hovered? [this handle]
    4.58 -     (handle-hovered? parent handle)))
    4.59 +    (handle-hovered? parent handle)))
    4.60  
    4.61  (defn- make-node [handle handlers]
    4.62    (DispatcherNode. handle handlers *event-dispatcher* *clip*
    4.63 @@ -518,58 +519,33 @@
    4.64      (reify
    4.65       EventDispatcher
    4.66       (listen! [this component]
    4.67 -        (doto component
    4.68 -          (.addMouseListener this)
    4.69 -          (.addMouseMotionListener this)))
    4.70 +       (doto component
    4.71 +         (.addMouseListener this)
    4.72 +         (.addMouseMotionListener this)))
    4.73       (create-dispatcher [this handle handlers]
    4.74 -        (let [node (make-node handle handlers)]
    4.75 -          (dosync (alter tree-r add-node node))
    4.76 -          node))
    4.77 +       (let [node (make-node handle handlers)]
    4.78 +         (dosync (alter tree-r add-node node))
    4.79 +         node))
    4.80       (commit [this]
    4.81 -        (dosync (ref-set tree @tree-r)
    4.82 -                (ref-set tree-r {})))
    4.83 +       (dosync (ref-set tree @tree-r)
    4.84 +               (ref-set tree-r {})))
    4.85       (handle-picked? [this handle]
    4.86 -        (some #(= handle (:handle %)) @picked))
    4.87 +       (some #(= handle (:handle %)) @picked))
    4.88       (handle-hovered? [this handle]
    4.89 -        (some #(= handle (:handle %)) @hovered))
    4.90 +       (some #(= handle (:handle %)) @hovered))
    4.91       MouseListener
    4.92       (mouseEntered [this event]
    4.93 -        (dispatch-mouse-motion hovered @tree this event))
    4.94 +       (dispatch-mouse-motion hovered @tree this event))
    4.95       (mouseExited [this event]
    4.96 -        (dispatch-mouse-motion hovered @tree this event))
    4.97 +       (dispatch-mouse-motion hovered @tree this event))
    4.98       (mouseClicked [this event]
    4.99 -        (dispatch-mouse-button picked hovered event))
   4.100 +       (dispatch-mouse-button picked hovered event))
   4.101       (mousePressed [this event]
   4.102 -        (dispatch-mouse-button picked hovered event))
   4.103 +       (dispatch-mouse-button picked hovered event))
   4.104       (mouseReleased [this event]
   4.105 -        (dispatch-mouse-button picked hovered event))
   4.106 +       (dispatch-mouse-button picked hovered event))
   4.107       MouseMotionListener
   4.108       (mouseDragged [this event]
   4.109 -        (translate-and-dispatch @picked true event))
   4.110 +       (translate-and-dispatch @picked true event))
   4.111       (mouseMoved [this event]
   4.112 -        (dispatch-mouse-motion hovered @tree this event)))))
   4.113 -
   4.114 -;;
   4.115 -;; ИДЕИ:
   4.116 -;;
   4.117 -;; Контекст: биндинги или запись?
   4.118 -;;
   4.119 -;; Установка обработчиков (в контексте слоя):
   4.120 -;;
   4.121 -;; (listen
   4.122 -;;   (:mouse-entered e
   4.123 -;;     ...)
   4.124 -;;   (:mouse-exited e
   4.125 -;;     ...))
   4.126 -;;
   4.127 -;; Не надо IMGUI.
   4.128 -;; Построение сцены путем декорирования слоев:
   4.129 -;;
   4.130 -;; (listener
   4.131 -;;  (:action e (println e))
   4.132 -;;  (:mouse-dragged e (println e))
   4.133 -;;  (theme :font "Helvetica-14"
   4.134 -;;    (vbox
   4.135 -;;      (button (text-layer "Button 1"))
   4.136 -;;      (button (text-layer "Button 2")))))
   4.137 -;;
   4.138 +       (dispatch-mouse-motion hovered @tree this event)))))
     5.1 --- a/src/net/kryshen/indyvon/demo.clj	Wed Sep 01 22:25:55 2010 +0400
     5.2 +++ b/src/net/kryshen/indyvon/demo.clj	Thu Sep 02 03:55:44 2010 +0400
     5.3 @@ -18,6 +18,7 @@
     5.4  ;;
     5.5  
     5.6  (ns net.kryshen.indyvon.demo
     5.7 +  "Indyvon demo and experiments."
     5.8    (:gen-class)
     5.9    (:use
    5.10     (net.kryshen.indyvon core layers component))
    5.11 @@ -53,6 +54,8 @@
    5.12      (:mouse-clicked _ (apply callback args))))
    5.13  
    5.14  (defn combine-colors [^Color color1 ^Color color2 c]
    5.15 +  "Returns color between color1 and color2. When c (0 <= c <= 1.0) is
    5.16 +   closer to 0 the returned сolor is closer to color1."
    5.17    (case c
    5.18      0.0 color1
    5.19      1.0 color2
    5.20 @@ -71,7 +74,6 @@
    5.21                 (= prev from) (if (pos? speed) :start :stop)               
    5.22                 (= prev to) (if (neg? speed) :start :stop)
    5.23                 :default :continue)]
    5.24 -    ;;(println prev from to speed state *interval*)
    5.25      (if (= state :stop)
    5.26         prev
    5.27         (let [interval (if (= state :start) 1 *interval*)
    5.28 @@ -80,7 +82,7 @@
    5.29           (repaint)
    5.30           val))))
    5.31  
    5.32 -(defn button
    5.33 +(defn animated-button
    5.34    "Create animated button layer."
    5.35    [content callback & args]
    5.36    (let [padding 4
    5.37 @@ -120,80 +122,80 @@
    5.38            (:mouse-released _ (repaint))
    5.39            (:mouse-clicked _ (apply callback args))))
    5.40       (layer-size [button]
    5.41 -        (let [face-size (layer-size face)]
    5.42 -          (Size. (+ (:width face-size) shadow-offset)
    5.43 -                 (+ (:height face-size) shadow-offset))))))))
    5.44 +       (let [face-size (layer-size face)]
    5.45 +         (Size. (+ (:width face-size) shadow-offset)
    5.46 +                (+ (:height face-size) shadow-offset))))))))
    5.47  
    5.48 -(def button1 (button (label "Animated button 1")
    5.49 -                     println "Animated button 1 clicked"))
    5.50 +(def button1 (animated-button (label "Animated button 1")
    5.51 +                              println "Animated button 1 clicked"))
    5.52  
    5.53 -(def button2 (button (label "Animated button 2")
    5.54 -                     println "Animated button 2 clicked"))
    5.55 +(def button2 (animated-button (label "Animated button 2")
    5.56 +                              println "Animated button 2 clicked"))
    5.57  
    5.58 -(def layer1
    5.59 +(def test-layer1
    5.60    (reify
    5.61     Layer
    5.62     (render! [layer]
    5.63 -      (with-handlers layer
    5.64 -        (with-color (if (hovered? layer) Color/ORANGE Color/RED)
    5.65 -          (.fillRect *graphics* 0 0 *width* *height*))
    5.66 -        (:mouse-entered e
    5.67 -         (repaint)
    5.68 -         (println e))
    5.69 -        (:mouse-exited e
    5.70 -         (repaint)
    5.71 -         (println e))
    5.72 -        (:mouse-moved e
    5.73 -         (println e))))
    5.74 +     (with-handlers layer
    5.75 +       (with-color (if (hovered? layer) Color/ORANGE Color/RED)
    5.76 +         (.fillRect *graphics* 0 0 *width* *height*))
    5.77 +       (:mouse-entered e
    5.78 +        (repaint)
    5.79 +        (println e))
    5.80 +       (:mouse-exited e
    5.81 +        (repaint)
    5.82 +        (println e))
    5.83 +       (:mouse-moved e
    5.84 +        (println e))))
    5.85     (layer-size [layer]
    5.86 -      (Size. 30 20))))
    5.87 +     (Size. 30 20))))
    5.88  
    5.89 -(def layer1b (border layer1 2 3))
    5.90 +(def test-layer1b (border test-layer1 2 3))
    5.91  
    5.92 -(def layer2
    5.93 +(def test-layer2
    5.94    (reify
    5.95     Layer
    5.96     (render! [layer]
    5.97 -      (doto *graphics*
    5.98 -        (.setColor Color/YELLOW)
    5.99 -        (.fillRect 0 0 *width* *height*))
   5.100 -      (with-rotate 0.5 0 0
   5.101 -        (draw! layer1b 30 25))
   5.102 -      (draw! layer1 55 5))
   5.103 +     (doto *graphics*
   5.104 +       (.setColor Color/YELLOW)
   5.105 +       (.fillRect 0 0 *width* *height*))
   5.106 +     (with-rotate 0.5 0 0
   5.107 +       (draw! test-layer1b 30 25))
   5.108 +     (draw! test-layer1 55 5))
   5.109     (layer-size [layer]
   5.110 -      (Size. 70 65))))
   5.111 +     (Size. 70 65))))
   5.112  
   5.113 -(def layer2m (miniature layer2 30 30))
   5.114 +(def test-layer2m (miniature test-layer2 30 30))
   5.115  
   5.116 -(def layer3 (border (label "Sample\ntext" :right :center)))
   5.117 +(def test-layer3 (border (label "Sample\ntext" :right :bottom)))
   5.118  
   5.119 -(def layer
   5.120 +(def root
   5.121    (reify
   5.122     Layer
   5.123     (render! [layer]
   5.124 -      ;;(repaint)
   5.125 -      ;;(println (format "%.3f" (/ *interval* 1E9)))
   5.126 -      (doto *graphics*
   5.127 -        ;; Random color to see when repaint happens.
   5.128 -        (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
   5.129 -        (.drawLine 0 0 *width* *height*)
   5.130 -        (.drawLine *width* 0 0 *height*))
   5.131 -      (draw! layer2 15 20)
   5.132 -      (draw! layer2m 120 50)
   5.133 -      (draw! layer3 100 100 80 50)
   5.134 -      (draw! button1 50 160)
   5.135 -      (with-rotate (/ Math/PI 6) 250 200
   5.136 -        (draw! button1 200 160))
   5.137 -      (draw! button2 50 250)
   5.138 -      (with-bounds 100 200 140 30
   5.139 -        (draw-button! :button
   5.140 -         (label "Immediate button" :center :center)
   5.141 -         #(println "Button clicked!"))))
   5.142 +     ;;(repaint)
   5.143 +     (doto *graphics*
   5.144 +       (.drawLine 0 0 *width* *height*)
   5.145 +       (.drawLine *width* 0 0 *height*)
   5.146 +       ;; Random color to see when repaint happens.
   5.147 +       (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
   5.148 +       (.fillOval 5 5 20 20))
   5.149 +     (draw! test-layer2 30 20)
   5.150 +     (draw! test-layer2m 120 50)
   5.151 +     (draw! test-layer3 100 100 80 50)
   5.152 +     (draw! button1 50 160)
   5.153 +     (with-rotate (/ Math/PI 6) 250 200
   5.154 +       (draw! button1 200 160))
   5.155 +     (draw! button2 50 250)
   5.156 +     (with-bounds 100 200 140 30
   5.157 +       (draw-button! :button
   5.158 +        (label "Immediate button" :center :center)
   5.159 +        #(println "Button clicked!"))))
   5.160     (layer-size [layer]
   5.161 -      (Size. 400 300))))
   5.162 +     (Size. 400 300))))
   5.163  
   5.164  ;; Main viewport
   5.165 -(def vp (viewport layer))
   5.166 +(def vp (viewport root))
   5.167  
   5.168  ;; Miniature (rendered asynchronously)
   5.169  (def vp-miniature (border (viewport-miniature vp 100 75)))
   5.170 @@ -213,3 +215,6 @@
   5.171  (defn -main []
   5.172    (println "Try to drag the viewport.")
   5.173    (show-frame scene))
   5.174 +
   5.175 +(comment
   5.176 +  (show-frame (viewport-miniature vp 200 150)))
     6.1 --- a/src/net/kryshen/indyvon/layers.clj	Wed Sep 01 22:25:55 2010 +0400
     6.2 +++ b/src/net/kryshen/indyvon/layers.clj	Thu Sep 02 03:55:44 2010 +0400
     6.3 @@ -80,12 +80,12 @@
     6.4    ([content width gap]
     6.5       (let [layer (padding content (+ width gap))]
     6.6         (decorate-layer layer [_]
     6.7 -          (with-color :border-color
     6.8 -            (doseq [i (range 0 width)]
     6.9 -              (.drawRect *graphics* i i
    6.10 -                         (- *width* 1 i i)
    6.11 -                         (- *height* 1 i i))))
    6.12 -          (render! layer)))))
    6.13 +         (with-color :border-color
    6.14 +           (doseq [i (range 0 width)]
    6.15 +             (.drawRect *graphics* i i
    6.16 +                        (- *width* 1 i i)
    6.17 +                        (- *height* 1 i i))))
    6.18 +         (render! layer)))))
    6.19  
    6.20  (defn panel
    6.21    "Opaque layer using theme's alt-back-color."
    6.22 @@ -105,15 +105,15 @@
    6.23    (reify
    6.24     Layer
    6.25     (render! [_]
    6.26 -      ;; TODO: distribute space proportionally.
    6.27 -      (let [w (/ *width* (count contents))]
    6.28 -        (doseq [[i c] (map-indexed vector contents)]
    6.29 -          (draw! c (* i w) 0 w *height*))))
    6.30 +     ;; TODO: distribute space proportionally.
    6.31 +     (let [w (/ *width* (count contents))]
    6.32 +       (doseq [[i c] (map-indexed vector contents)]
    6.33 +         (draw! c (* i w) 0 w *height*))))
    6.34     (layer-size [_]
    6.35 -      (reduce #(Size. (+ (:width %1) (:width %2))
    6.36 -                      (max (:height %1) (:height %2)))
    6.37 -              (Size. 0 0)
    6.38 -              (map layer-size contents)))))
    6.39 +     (reduce #(Size. (+ (:width %1) (:width %2))
    6.40 +                     (max (:height %1) (:height %2)))
    6.41 +             (Size. 0 0)
    6.42 +             (map layer-size contents)))))
    6.43  
    6.44  (defn- re-split [^java.util.regex.Pattern re s]
    6.45    (seq (.split re s)))
    6.46 @@ -155,32 +155,32 @@
    6.47       (let [lines (re-split #"\r\n|\n|\r|\u0085|\u2028|\u2029" text)]
    6.48         (reify Layer
    6.49          (render! [layer]
    6.50 -           (let [w *width*
    6.51 -                 h *height*
    6.52 -                 font (.getFont *graphics*)
    6.53 -                 layouts (layout-text lines font *font-context*)
    6.54 -                 y (align-y (text-height layouts) h v-align)]
    6.55 -             (loop [layouts layouts, y y]
    6.56 -               (when-first [^TextLayout layout layouts]
    6.57 -                 (let [ascent (.getAscent layout)
    6.58 -                       lh (+ ascent (.getDescent layout) (.getLeading layout))
    6.59 -                       x (align-x (.getAdvance layout) w h-align)]
    6.60 -                   (.draw layout *graphics* x (+ y ascent))
    6.61 -                   (recur (next layouts) (+ y lh)))))))
    6.62 +          (let [w *width*
    6.63 +                h *height*
    6.64 +                font (.getFont *graphics*)
    6.65 +                layouts (layout-text lines font *font-context*)
    6.66 +                y (align-y (text-height layouts) h v-align)]
    6.67 +            (loop [layouts layouts, y y]
    6.68 +              (when-first [^TextLayout layout layouts]
    6.69 +                (let [ascent (.getAscent layout)
    6.70 +                      lh (+ ascent (.getDescent layout) (.getLeading layout))
    6.71 +                      x (align-x (.getAdvance layout) w h-align)]
    6.72 +                  (.draw layout *graphics* x (+ y ascent))
    6.73 +                  (recur (next layouts) (+ y lh)))))))
    6.74          (layer-size [layer]
    6.75 -           (let [layouts (layout-text lines (:font *theme*) *font-context*)
    6.76 -                 width (text-width layouts)
    6.77 -                 height (text-height layouts)]
    6.78 -             (Size. width height)))))))
    6.79 +          (let [layouts (layout-text lines (:font *theme*) *font-context*)
    6.80 +                width (text-width layouts)
    6.81 +                height (text-height layouts)]
    6.82 +            (Size. width height)))))))
    6.83  
    6.84  (defn- ^ImageObserver image-observer [layer]
    6.85    (reify
    6.86     ImageObserver
    6.87     (imageUpdate [this img infoflags x y width height]
    6.88 -      (update layer)
    6.89 -      (zero? (bit-and infoflags
    6.90 -                      (bit-or ImageObserver/ALLBITS
    6.91 -                              ImageObserver/ABORT))))))
    6.92 +     (update layer)
    6.93 +     (zero? (bit-and infoflags
    6.94 +                     (bit-or ImageObserver/ALLBITS
    6.95 +                             ImageObserver/ABORT))))))
    6.96  
    6.97  (defn image-layer
    6.98    [image-or-uri]
    6.99 @@ -192,15 +192,15 @@
   6.100      (reify
   6.101       Layer
   6.102       (render! [layer]
   6.103 -        (repaint-on-update layer)
   6.104 -        (.drawImage *graphics* image 0 0 (image-observer layer)))
   6.105 +       (repaint-on-update layer)
   6.106 +       (.drawImage *graphics* image 0 0 (image-observer layer)))
   6.107       (layer-size [layer]
   6.108 -        (let [observer (image-observer layer)
   6.109 -              width (.getWidth image observer)
   6.110 -              height (.getHeight image observer)
   6.111 -              width (if (pos? width) width 1)
   6.112 -              height (if (pos? height) height 1)]
   6.113 -          (Size. width height))))))
   6.114 +       (let [observer (image-observer layer)
   6.115 +             width (.getWidth image observer)
   6.116 +             height (.getHeight image observer)
   6.117 +             width (if (pos? width) width 1)
   6.118 +             height (if (pos? height) height 1)]
   6.119 +         (Size. width height))))))
   6.120  
   6.121  (defn miniature
   6.122    "Creates layer that asynchronously renders view of the content
   6.123 @@ -210,13 +210,13 @@
   6.124     (reify
   6.125      Layer
   6.126      (render! [this]
   6.127 -       (let [size (layer-size content)
   6.128 -             sx (/ width (:width size))
   6.129 -             sy (/ height (:height size))]
   6.130 -         (.scale *graphics* sx sy)
   6.131 -         (draw! content 0 0 (:width size) (:height size))))
   6.132 +      (let [size (layer-size content)
   6.133 +            sx (/ width (:width size))
   6.134 +            sy (/ height (:height size))]
   6.135 +        (.scale *graphics* sx sy)
   6.136 +        (draw! content 0 0 (:width size) (:height size))))
   6.137      (layer-size [this]
   6.138 -       (Size. width height)))
   6.139 +      (Size. width height)))
   6.140     width height))
   6.141  
   6.142  (defrecord Viewport [content h-align v-align
   6.143 @@ -224,34 +224,34 @@
   6.144                       x y fix-x fix-y last-width last-height]
   6.145    Layer
   6.146    (render! [layer]
   6.147 -     (repaint-on-update layer)
   6.148 -     (with-handlers layer
   6.149 -       (let [anchor (anchor content h-align v-align)]
   6.150 -         (dosync
   6.151 -          (alter x + (align-x *width* @last-width h-align))
   6.152 -          (alter y + (align-y *height* @last-height v-align))
   6.153 -          (ref-set last-width *width*)
   6.154 -          (ref-set last-height *height*))
   6.155 -         ;; TODO: notify observers when size changes.
   6.156 -         (draw! content (- 0 @x (:x anchor)) (- 0 @y (:y anchor))))
   6.157 -       (:mouse-pressed e
   6.158 +    (repaint-on-update layer)
   6.159 +    (with-handlers layer
   6.160 +      (let [anchor (anchor content h-align v-align)]
   6.161          (dosync
   6.162 -         (ref-set fix-x (:x-on-screen e))
   6.163 -         (ref-set fix-y (:y-on-screen e)))
   6.164 -        (when *target*
   6.165 -          (->> Cursor/MOVE_CURSOR Cursor. (.setCursor *target*))))
   6.166 -       (:mouse-released e
   6.167 -        (when *target*
   6.168 -          (->> Cursor/DEFAULT_CURSOR Cursor. (.setCursor *target*))))
   6.169 -       (:mouse-dragged e
   6.170 -        (dosync
   6.171 -         (alter x + (- @fix-x (:x-on-screen e)))
   6.172 -         (alter y + (- @fix-y (:y-on-screen e)))
   6.173 -         (ref-set fix-x (:x-on-screen e))
   6.174 -         (ref-set fix-y (:y-on-screen e)))
   6.175 -        (update layer))))
   6.176 +         (alter x + (align-x *width* @last-width h-align))
   6.177 +         (alter y + (align-y *height* @last-height v-align))
   6.178 +         (ref-set last-width *width*)
   6.179 +         (ref-set last-height *height*))
   6.180 +        ;; TODO: notify observers when size changes.
   6.181 +        (draw! content (- 0 @x (:x anchor)) (- 0 @y (:y anchor))))
   6.182 +      (:mouse-pressed e
   6.183 +       (dosync
   6.184 +        (ref-set fix-x (:x-on-screen e))
   6.185 +        (ref-set fix-y (:y-on-screen e)))
   6.186 +       (when *target*
   6.187 +         (->> Cursor/MOVE_CURSOR Cursor. (.setCursor *target*))))
   6.188 +      (:mouse-released e
   6.189 +       (when *target*
   6.190 +         (->> Cursor/DEFAULT_CURSOR Cursor. (.setCursor *target*))))
   6.191 +      (:mouse-dragged e
   6.192 +       (dosync
   6.193 +        (alter x + (- @fix-x (:x-on-screen e)))
   6.194 +        (alter y + (- @fix-y (:y-on-screen e)))
   6.195 +        (ref-set fix-x (:x-on-screen e))
   6.196 +        (ref-set fix-y (:y-on-screen e)))
   6.197 +       (update layer))))
   6.198    (layer-size [layer]
   6.199 -     (layer-size content)))
   6.200 +    (layer-size content)))
   6.201  
   6.202  (defn viewport
   6.203    "Creates scrollable viewport layer."
   6.204 @@ -273,15 +273,15 @@
   6.205    [viewport width height]
   6.206    (miniature
   6.207     (decorate-layer (:content viewport) [_]
   6.208 -      (repaint-on-update viewport)
   6.209 -      (let [[x y w h] (viewport-visible-bounds viewport)]
   6.210 -        (with-color :alt-back-color
   6.211 -          (.fillRect *graphics* 0 0 *width* *height*))
   6.212 -        (with-color :back-color
   6.213 -          (.fillRect *graphics* x y w h))
   6.214 -        (draw! (:content viewport))
   6.215 -        (with-color :border-color
   6.216 -          (.drawRect *graphics* x y w h))))
   6.217 +     (repaint-on-update viewport)
   6.218 +     (let [[x y w h] (viewport-visible-bounds viewport)]
   6.219 +       (with-color :alt-back-color
   6.220 +         (.fillRect *graphics* 0 0 *width* *height*))
   6.221 +       (with-color :back-color
   6.222 +         (.fillRect *graphics* x y w h))
   6.223 +       (draw! (:content viewport))
   6.224 +       (with-color :border-color
   6.225 +         (.drawRect *graphics* x y w h))))
   6.226     width height))
   6.227  
   6.228  ;;
   6.229 @@ -292,9 +292,9 @@
   6.230    "Decorate layer to handle events."
   6.231    `(let [layer# ~layer]
   6.232       (decorate-layer layer# [t#]
   6.233 -        (with-handlers t#
   6.234 -          (render! layer#)
   6.235 -          ~@handlers))))
   6.236 +       (with-handlers t#
   6.237 +         (render! layer#)
   6.238 +         ~@handlers))))
   6.239  
   6.240  (defn theme [layer & map-or-keyvals]
   6.241    (let [theme (if (== (count map-or-keyvals) 1)
   6.242 @@ -303,15 +303,15 @@
   6.243      (reify
   6.244       Layer
   6.245       (render! [t]
   6.246 -        (with-theme theme
   6.247 -          (render! layer)))
   6.248 +       (with-theme theme
   6.249 +         (render! layer)))
   6.250       (layer-size [t]
   6.251 -        (with-theme theme
   6.252 -          (layer-size layer)))
   6.253 +       (with-theme theme
   6.254 +         (layer-size layer)))
   6.255       Anchored
   6.256       (anchor [t xa ya]
   6.257 -        (with-theme theme
   6.258 -          (anchor layer xa ya))))))
   6.259 +       (with-theme theme
   6.260 +         (anchor layer xa ya))))))
   6.261  
   6.262  ;;
   6.263  ;; Measuring time