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