Mercurial > hg > indyvon
changeset 23:bbe95838fe77
Scrollable viewport.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Sun, 20 Jun 2010 04:23:28 +0400 |
parents | dc81033d4122 |
children | c17e3588ede9 |
files | src/indyvon/component.clj src/indyvon/core.clj |
diffstat | 2 files changed, 54 insertions(+), 9 deletions(-) [+] |
line diff
1.1 --- a/src/indyvon/component.clj Sat Jun 19 06:50:24 2010 +0400 1.2 +++ b/src/indyvon/component.clj Sun Jun 20 04:23:28 2010 +0400 1.3 @@ -19,6 +19,7 @@ 1.4 width (.width size) 1.5 height (.height size) 1.6 context (assoc context 1.7 + :target component 1.8 :font-context (.getFontRenderContext graphics) 1.9 :update-fn #(.repaint component))] 1.10 (.clearRect graphics 0 0 width height) 1.11 @@ -27,6 +28,7 @@ 1.12 1.13 (defn preferred-size [component layer context] 1.14 (let [context (assoc context 1.15 + :target component 1.16 :font-context (font-context component)) 1.17 s (size layer context)] 1.18 (Dimension. (s 0) (s 1)))) 1.19 @@ -120,7 +122,7 @@ 1.20 (.addWindowListener 1.21 (proxy [java.awt.event.WindowAdapter] [] 1.22 (windowClosing [event] (.dispose frame)))) 1.23 - (.. (getContentPane) (add (make-jpanel layer))) 1.24 + (.. (getContentPane) (add (make-jpanel (viewport layer)))) 1.25 (.pack) 1.26 (.setVisible true)) 1.27 )
2.1 --- a/src/indyvon/core.clj Sat Jun 19 06:50:24 2010 +0400 2.2 +++ b/src/indyvon/core.clj Sun Jun 20 04:23:28 2010 +0400 2.3 @@ -5,8 +5,9 @@ 2.4 ;; 2.5 2.6 (ns indyvon.core 2.7 - (:import (java.awt Color Font) 2.8 - (java.awt.font FontRenderContext TextLayout))) 2.9 + (:import (java.awt Color Font Cursor) 2.10 + (java.awt.font FontRenderContext TextLayout) 2.11 + (java.awt.event MouseEvent))) 2.12 2.13 (defprotocol Layer 2.14 "Basic UI element." 2.15 @@ -29,11 +30,11 @@ 2.16 (defn default-theme [] 2.17 (Theme. Color/BLACK Color/WHITE Color/BLUE (Font. "Sans" Font/PLAIN 12))) 2.18 2.19 -(defrecord LayerContext 2.20 - [layer parent x y width height update-fn dispatcher font-context theme]) 2.21 +(defrecord LayerContext [layer parent x y width height update-fn 2.22 + dispatcher font-context theme target]) 2.23 2.24 (defn default-context [] 2.25 - (LayerContext. nil nil 0 0 0 0 nil nil nil (default-theme))) 2.26 + (LayerContext. nil nil 0 0 0 0 nil nil nil (default-theme) nil)) 2.27 2.28 (defn update [context] 2.29 ((:update-fn context))) 2.30 @@ -164,6 +165,48 @@ 2.31 2.32 (defn viewport 2.33 "Creates scrollable viewport layer." 2.34 - [content] 2.35 - ;; TODO 2.36 - ) 2.37 + ([content] (viewport content :left :top)) 2.38 + ([content h-align v-align] 2.39 + (let [x (ref 0) 2.40 + y (ref 0) 2.41 + fix-x (ref 0) 2.42 + fix-y (ref 0) 2.43 + last-width (ref 0) 2.44 + last-height (ref 0)] 2.45 + (reify 2.46 + Layer 2.47 + (render! [layer c g] 2.48 + (let [anchor (anchor content c) 2.49 + width (:width c) 2.50 + height (:height c)] 2.51 + (dosync 2.52 + (case h-align 2.53 + :left nil 2.54 + :center (alter x + (/ (- @last-width width) 2)) 2.55 + :right (alter x + (- @last-width width))) 2.56 + (case v-align 2.57 + :top nil 2.58 + :center (alter y + (/ (- @last-height height) 2)) 2.59 + :bottom (alter y + (- @last-height height))) 2.60 + (ref-set last-width width) 2.61 + (ref-set last-height height)) 2.62 + (draw! c content g 2.63 + (- 0 @x (anchor 0)) 2.64 + (- 0 @y (anchor 1))))) 2.65 + (size [layer c] (size content c)) 2.66 + MouseHandler 2.67 + (handle-mouse [layer c e] 2.68 + (when (= (.getID e) MouseEvent/MOUSE_PRESSED) 2.69 + (dosync 2.70 + (ref-set fix-x (.getXOnScreen e)) 2.71 + (ref-set fix-y (.getYOnScreen e))) 2.72 + (->> Cursor/MOVE_CURSOR Cursor. (.setCursor (:target c)))) 2.73 + (when (= (.getID e) MouseEvent/MOUSE_RELEASED) 2.74 + (->> Cursor/DEFAULT_CURSOR Cursor. (.setCursor (:target c)))) 2.75 + (when (= (.getID e) MouseEvent/MOUSE_DRAGGED) 2.76 + (dosync 2.77 + (alter x + (- @fix-x (.getXOnScreen e))) 2.78 + (alter y + (- @fix-y (.getYOnScreen e))) 2.79 + (ref-set fix-x (.getXOnScreen e)) 2.80 + (ref-set fix-y (.getYOnScreen e))) 2.81 + (update c)))))))