Mercurial > hg > indyvon
changeset 64:702a4939312d
New mechanism for layers to trigger repaints (beginning).
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Thu, 26 Aug 2010 06:29:30 +0400 |
parents | 2d74abee0c93 |
children | fd1bcb67bc32 |
files | src/net/kryshen/indyvon/core.clj |
diffstat | 1 files changed, 47 insertions(+), 3 deletions(-) [+] |
line diff
1.1 --- a/src/net/kryshen/indyvon/core.clj Thu Aug 26 03:45:52 2010 +0400 1.2 +++ b/src/net/kryshen/indyvon/core.clj Thu Aug 26 06:29:30 2010 +0400 1.3 @@ -102,6 +102,47 @@ 1.4 :center (/ (:height size) 2) 1.5 :bottom (:height size))))))) 1.6 1.7 +(defn- assoc-cons [m key val] 1.8 + (->> (get m key) (cons val) (assoc m key))) 1.9 + 1.10 +(defn- assoc-in-cons [m keys val] 1.11 + (->> (get-in m keys) (cons val) (assoc-in m keys))) 1.12 + 1.13 +;; 1.14 +;; Observers 1.15 +;; 1.16 + 1.17 +(def observers (atom nil)) 1.18 + 1.19 +(defn add-observer 1.20 + ([target f] 1.21 + (add-observer target f :default)) 1.22 + ([target f group-id] 1.23 + (swap! observers assoc-in-cons [group-id target] f) 1.24 + nil)) 1.25 + 1.26 +(defn remove-group 1.27 + "Remove group of observers." 1.28 + [group-id] 1.29 + (swap! observers dissoc group-id) 1.30 + nil) 1.31 + 1.32 +(defn- change-group-id* 1.33 + [observers old-id new-id] 1.34 + (let [group (get observers old-id)] 1.35 + (assoc (dissoc observers old-id) 1.36 + new-id group))) 1.37 + 1.38 +(defn- change-group-id 1.39 + [old-id new-id] 1.40 + (swap! observers change-group-id* old-id new-id)) 1.41 + 1.42 +(defn update 1.43 + "Notify observers." 1.44 + [target & args] 1.45 + (doseq [f (reduce #(concat %1 (get %2 target)) nil (vals @observers))] 1.46 + (apply f target args))) 1.47 + 1.48 ;; 1.49 ;; Rendering 1.50 ;; 1.51 @@ -242,6 +283,12 @@ 1.52 ([layer x y width height] 1.53 (with-bounds* x y width height render! layer))) 1.54 1.55 +;; TODO: объект-сцена вместо context-draw! 1.56 +;; Сцена устанавливает контекст и рисует слой. Сцена - слой? 1.57 +;; Сцена идентифицирует группу обозревателя слоев. 1.58 +;; Обновления любого слоя, изображенного в сцене, вызывает обновление сцены. 1.59 +;; Обозреватель сцены вызывает repaint(). 1.60 + 1.61 (defn context-draw! 1.62 "Sets up layer context, draws layer and commits event dispatcher." 1.63 ([layer graphics event-dispatcher update-fn width height] 1.64 @@ -309,9 +356,6 @@ 1.65 (inverse-relative-transform) 1.66 (get-thread-bindings))) 1.67 1.68 -(defn- assoc-cons [m key val] 1.69 - (assoc m key (cons val (get m key)))) 1.70 - 1.71 (defn- add-node [tree node] 1.72 (assoc-cons tree (:parent node) node)) 1.73