Mercurial > hg > indyvon
changeset 66:a1999c1f7289
Changes in the observe-repaint mechanism.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Fri, 27 Aug 2010 19:47:28 +0400 |
parents | fd1bcb67bc32 |
children | a19cf5007d14 |
files | 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 | 4 files changed, 42 insertions(+), 36 deletions(-) [+] |
line diff
1.1 --- a/src/net/kryshen/indyvon/component.clj Fri Aug 27 01:24:31 2010 +0400 1.2 +++ b/src/net/kryshen/indyvon/component.clj Fri Aug 27 19:47:28 2010 +0400 1.3 @@ -31,6 +31,6 @@ 1.4 (let [s (root-size layer (font-context this) this)] 1.5 (Dimension. (:width s) (:height s)))))] 1.6 (.setBackground panel (:back-color *theme*)) 1.7 - (add-observer layer (fn [_] (.repaint panel))) 1.8 + (add-observer panel layer (fn [_] (.repaint panel))) 1.9 (listen! event-dispatcher panel) 1.10 panel)))
2.1 --- a/src/net/kryshen/indyvon/core.clj Fri Aug 27 01:24:31 2010 +0400 2.2 +++ b/src/net/kryshen/indyvon/core.clj Fri Aug 27 19:47:28 2010 +0400 2.3 @@ -113,28 +113,29 @@ 2.4 2.5 (def observers (atom nil)) 2.6 2.7 +;; TODO: groups should be weakly referenced. 2.8 +;; Need persistent analog to java.util.WeakHashMap. 2.9 (defn add-observer 2.10 - ([target f] 2.11 - (add-observer target f :default)) 2.12 - ([target f group-id] 2.13 - (swap! observers assoc-in-cons [group-id target] f) 2.14 - nil)) 2.15 - 2.16 -(defn remove-group 2.17 - "Remove group of observers." 2.18 - [group-id] 2.19 - (swap! observers dissoc group-id) 2.20 + "Add observer fn for the target to the specified group." 2.21 + [group target f] 2.22 + (swap! observers assoc-in-cons [group target] f) 2.23 nil) 2.24 2.25 -(defn- change-group-id* 2.26 - [observers old-id new-id] 2.27 - (let [group (get observers old-id)] 2.28 - (assoc (dissoc observers old-id) 2.29 - new-id group))) 2.30 +(defn remove-observer-group 2.31 + "Remove group of observers." 2.32 + [group] 2.33 + (swap! observers dissoc group) 2.34 + nil) 2.35 2.36 -(defn- change-group-id 2.37 - [old-id new-id] 2.38 - (swap! observers change-group-id* old-id new-id)) 2.39 +;; (defn- replace-observer-group* 2.40 +;; [observers old-id new-id] 2.41 +;; (let [group (get observers old-id)] 2.42 +;; (assoc (dissoc observers old-id) 2.43 +;; new-id group))) 2.44 + 2.45 +;; (defn- replace-observer-group 2.46 +;; [old-id new-id] 2.47 +;; (swap! observers replace-observer-group* old-id new-id)) 2.48 2.49 (defn update 2.50 "Notify observers." 2.51 @@ -152,13 +153,14 @@ 2.52 removed after the next frame rendering is complete." 2.53 [target f] 2.54 (let [root *root*] 2.55 - (add-observer target f root))) 2.56 + (add-observer root target f))) 2.57 2.58 (defn repaint-on-update 2.59 "Trigger repaint of the current scene when the target updates." 2.60 [target] 2.61 (let [root *root*] 2.62 - (add-observer target (fn [_] (update root)) root))) 2.63 + (if (not= root target) 2.64 + (add-observer root target (fn [_] (update root)))))) 2.65 2.66 ;; 2.67 ;; Rendering 2.68 @@ -326,15 +328,14 @@ 2.69 *width* width 2.70 *height* height 2.71 *clip* (Rectangle2D$Double. 0 0 width height)] 2.72 - (let [tmp-group (Object.)] 2.73 - (apply-theme) 2.74 - (.clearRect graphics 0 0 width height) 2.75 - (change-group-id layer tmp-group) 2.76 - (try 2.77 - (render! layer) 2.78 - (finally 2.79 - (remove-group tmp-group) 2.80 - (commit event-dispatcher))))))) 2.81 + (apply-theme) 2.82 + (with-color (:back-color *theme*) 2.83 + (.fillRect graphics 0 0 width height)) 2.84 + (remove-observer-group layer) 2.85 + (try 2.86 + (render! layer) 2.87 + (finally 2.88 + (commit event-dispatcher)))))) 2.89 2.90 (defn root-size 2.91 ([layer font-context]
3.1 --- a/src/net/kryshen/indyvon/demo.clj Fri Aug 27 01:24:31 2010 +0400 3.2 +++ b/src/net/kryshen/indyvon/demo.clj Fri Aug 27 19:47:28 2010 +0400 3.3 @@ -13,8 +13,6 @@ 3.4 (java.awt Color) 3.5 (javax.swing JFrame))) 3.6 3.7 -(def frame (JFrame. "Test")) 3.8 - 3.9 (def layer1 3.10 (reify 3.11 Layer 3.12 @@ -86,11 +84,17 @@ 3.13 (draw! fps)) 3.14 (layer-size [layer] (Size. 400 300)))) 3.15 3.16 -(defn -main [] 3.17 - (doto frame 3.18 +(def root (viewport layer)) 3.19 + 3.20 +(defn show-frame [layer] 3.21 + (doto (JFrame. "Test") 3.22 (.addWindowListener 3.23 (proxy [java.awt.event.WindowAdapter] [] 3.24 (windowClosing [event] (.dispose frame)))) 3.25 - (.. (getContentPane) (add (make-jpanel (viewport layer)))) 3.26 + (.. (getContentPane) (add (make-jpanel layer))) 3.27 (.pack) 3.28 (.setVisible true))) 3.29 + 3.30 +(defn -main [] 3.31 + (show-frame root) 3.32 + (show-frame (miniature root 80 60)))
4.1 --- a/src/net/kryshen/indyvon/layers.clj Fri Aug 27 01:24:31 2010 +0400 4.2 +++ b/src/net/kryshen/indyvon/layers.clj Fri Aug 27 19:47:28 2010 +0400 4.3 @@ -271,6 +271,7 @@ 4.4 (reify 4.5 Layer 4.6 (render! [layer] 4.7 + (repaint-on-update layer) 4.8 (with-handlers layer 4.9 (let [anchor (anchor content h-align v-align)] 4.10 (dosync 4.11 @@ -294,7 +295,7 @@ 4.12 (alter y + (- @fix-y (:y-on-screen e))) 4.13 (ref-set fix-x (:x-on-screen e)) 4.14 (ref-set fix-y (:y-on-screen e))) 4.15 - (repaint)))) 4.16 + (update layer)))) 4.17 (layer-size [layer] (layer-size content)))))) 4.18 4.19 ;;