Mercurial > hg > indyvon
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