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  ;;