Mercurial > hg > indyvon
changeset 133:2c2e4c639311
Refactored viewport scaling code into separate function.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Tue, 24 Apr 2012 18:49:06 +0400 |
parents | 77a3a609b2fe |
children | 16643a84b9e4 |
files | src/net/kryshen/indyvon/layers.clj |
diffstat | 1 files changed, 35 insertions(+), 16 deletions(-) [+] |
line diff
1.1 --- a/src/net/kryshen/indyvon/layers.clj Tue Apr 24 18:47:31 2012 +0400 1.2 +++ b/src/net/kryshen/indyvon/layers.clj Tue Apr 24 18:49:06 2012 +0400 1.3 @@ -130,7 +130,9 @@ 1.4 ([content] 1.5 (panel content 0)) 1.6 ([content gap] 1.7 - (let [layer (padding content gap)] 1.8 + (panel content gap gap gap gap)) 1.9 + ([content top left bottom right] 1.10 + (let [layer (padding content top left bottom right)] 1.11 (decorate-layer layer [_] 1.12 (with-color :alt-back-color 1.13 (.fill *graphics* (Rectangle2D$Double. 0.0 0.0 *width* *height*))) 1.14 @@ -304,6 +306,8 @@ 1.15 (def ^:dynamic *viewport-min-scale* 1E-6) 1.16 (def ^:dynamic *viewport-max-scale* 1E6) 1.17 1.18 +(declare scale-viewport) 1.19 + 1.20 (defrecord Viewport [content h-align v-align 1.21 ;; State (refs) 1.22 transform 1.23 @@ -352,21 +356,10 @@ 1.24 (ref-set fix-y (:y-on-screen e))) 1.25 (update layer)) 1.26 (:mouse-wheel e 1.27 - (dosync 1.28 - (let [s (Math/pow *viewport-scaling-step* (:wheel-rotation e)) 1.29 - x (- (:x e) (* (:x e) s)) 1.30 - y (- (:y e) (* (:y e) s)) 1.31 - scaled (doto (AffineTransform/getTranslateInstance x y) 1.32 - (.scale s s) 1.33 - (.concatenate @transform)) 1.34 - sx (.getScaleX scaled) 1.35 - sy (.getScaleY scaled)] 1.36 - (if (<= *viewport-min-scale* 1.37 - (min sx sy) 1.38 - (max sx sy) 1.39 - *viewport-max-scale*) 1.40 - (ref-set transform scaled)))) 1.41 - (update layer)))) 1.42 + (scale-viewport 1.43 + layer 1.44 + (Math/pow *viewport-scaling-step* (:wheel-rotation e)) 1.45 + true (:x e) (:y e))))) 1.46 (geometry [_] 1.47 (geometry content))) 1.48 1.49 @@ -381,6 +374,32 @@ 1.50 (ref 0) (ref 0) ; last-width last-height 1.51 (ref 0) (ref 0)))) ; last-anchor-x last-anchor-y 1.52 1.53 +(defn scale-viewport 1.54 + ([viewport s] 1.55 + (scale-viewport viewport s true)) 1.56 + ([viewport s relative?] 1.57 + (scale-viewport viewport s relative? nil nil)) 1.58 + ([viewport s relative? x y] 1.59 + (dosync 1.60 + (let [^AffineTransform tr @(:transform viewport) 1.61 + sx (if relative? s (/ s (.getScaleX tr))) 1.62 + sy (if relative? s (/ s (.getScaleY tr))) 1.63 + x (or x (align-x 0 @(:last-width viewport) (:h-align viewport))) 1.64 + y (or y (align-y 0 @(:last-height viewport) (:v-align viewport))) 1.65 + x (- x (* x sx)) 1.66 + y (- y (* y sy)) 1.67 + scaled (doto (AffineTransform/getTranslateInstance x y) 1.68 + (.scale sx sy) 1.69 + (.concatenate tr)) 1.70 + sx (.getScaleX scaled) 1.71 + sy (.getScaleY scaled)] 1.72 + (if (<= *viewport-min-scale* 1.73 + (min sx sy) 1.74 + (max sx sy) 1.75 + *viewport-max-scale*) 1.76 + (ref-set (:transform viewport) scaled)))) 1.77 + (update viewport))) 1.78 + 1.79 (defn reset-viewport [viewport] 1.80 (dosync 1.81 (ref-set (:last-width viewport) 0)