changeset 42:d3e3c43df1cd

Rename size to layer-size in Layer protocol to avoid name conflict when using defrecord. Implement graph layer in defrecord.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sun, 11 Jul 2010 06:34:36 +0400
parents 2475c99fbb8c
children 7d67064f0880
files src/kryshen/indyvon/component.clj src/kryshen/indyvon/core.clj src/kryshen/indyvon/demo.clj src/kryshen/indyvon/graph.clj src/kryshen/indyvon/layers.clj
diffstat 5 files changed, 51 insertions(+), 38 deletions(-) [+]
line diff
     1.1 --- a/src/kryshen/indyvon/component.clj	Sat Jul 10 07:28:19 2010 +0400
     1.2 +++ b/src/kryshen/indyvon/component.clj	Sun Jul 11 06:34:36 2010 +0400
     1.3 @@ -35,7 +35,7 @@
     1.4  (defn preferred-size [component layer]
     1.5    (binding [*target* component
     1.6              *font-context*' (font-context component)]
     1.7 -    (let [s (size layer)]
     1.8 +    (let [s (layer-size layer)]
     1.9        (Dimension. (:width s) (:height s)))))
    1.10  
    1.11  (defn make-jpanel
     2.1 --- a/src/kryshen/indyvon/core.clj	Sat Jul 10 07:28:19 2010 +0400
     2.2 +++ b/src/kryshen/indyvon/core.clj	Sun Jul 11 06:34:36 2010 +0400
     2.3 @@ -32,7 +32,7 @@
     2.4  (defprotocol Layer
     2.5    "Basic UI element."
     2.6    (render! [this])
     2.7 -  (size [this]))
     2.8 +  (layer-size [this]))
     2.9  
    2.10  ;; TODO: modifiers
    2.11  (defrecord MouseEvent [id when x y x-on-screen y-on-screen button])
    2.12 @@ -60,7 +60,7 @@
    2.13            (if (and (= h-align :left)
    2.14                     (= v-align :top))
    2.15              (Location. 0 0)
    2.16 -            (let [size (size this)]
    2.17 +            (let [size (layer-size this)]
    2.18                (Location.
    2.19                 (case h-align
    2.20                       :top 0
    2.21 @@ -148,7 +148,7 @@
    2.22           (finally
    2.23            (.dispose graphics)))))
    2.24    ([layer x y]
    2.25 -     (let [size (size layer)]
    2.26 +     (let [size (layer-size layer)]
    2.27         (draw! layer x y (:width size) (:height size))))
    2.28    ([layer x y width height]
    2.29       (with-bounds* x y width height render! layer)))
     3.1 --- a/src/kryshen/indyvon/demo.clj	Sat Jul 10 07:28:19 2010 +0400
     3.2 +++ b/src/kryshen/indyvon/demo.clj	Sun Jul 11 06:34:36 2010 +0400
     3.3 @@ -26,7 +26,7 @@
     3.4             (:mouse-entered e (println e))
     3.5             (:mouse-exited e (println e))
     3.6             (:mouse-moved e (println e))))
     3.7 -      (size [layer] (Size. 30 20))))
     3.8 +      (layer-size [layer] (Size. 30 20))))
     3.9  
    3.10  (def layer1b (border layer1 2 3))
    3.11  
    3.12 @@ -39,7 +39,7 @@
    3.13             (.fillRect 0 0 (:width *bounds*) (:height *bounds*)))
    3.14           (draw! layer1b 10 5)
    3.15           (draw! layer1 55 5))
    3.16 -      (size [layer] (Size. 70 65))))
    3.17 +      (layer-size [layer] (Size. 70 65))))
    3.18  
    3.19  (def layer3
    3.20       (border (text-layer "Sample\ntext" :right :center)))
    3.21 @@ -64,7 +64,7 @@
    3.22                  (ref-set fl (fps-layer (/ @frames elapsed)))
    3.23                  (ref-set frames 0)
    3.24                  (ref-set last time)))))
    3.25 -        (size [layer] (size @fl)))))
    3.26 +        (layer-size [layer] (layer-size @fl)))))
    3.27  
    3.28  (def layer
    3.29       (reify
    3.30 @@ -77,7 +77,7 @@
    3.31           (draw! layer2 15 20)
    3.32           (draw! layer3 100 100 80 50)
    3.33           (draw! fps))
    3.34 -      (size [layer] (Size. 400 300))))
    3.35 +      (layer-size [layer] (Size. 400 300))))
    3.36  
    3.37  (defn -main []
    3.38    (doto frame
     4.1 --- a/src/kryshen/indyvon/graph.clj	Sat Jul 10 07:28:19 2010 +0400
     4.2 +++ b/src/kryshen/indyvon/graph.clj	Sun Jul 11 06:34:36 2010 +0400
     4.3 @@ -19,7 +19,7 @@
     4.4    Layer
     4.5    (render! [v]
     4.6       (.drawOval *graphics* 0 0 (:width *bounds*) (:height *bounds*)))
     4.7 -  (size [v]
     4.8 +  (layer-size [v]
     4.9       (Size.
    4.10        (+ (.getLeftBound v) (.getRightBound v))
    4.11        (+ (.getTopBound v) (.getBottomBound v))))
    4.12 @@ -39,7 +39,7 @@
    4.13      (let [x (+ x (.getX v))
    4.14            y (+ y (.getY v))
    4.15            anchor (anchor v :center :center)
    4.16 -          size (size v)
    4.17 +          size (layer-size v)
    4.18            x (- x (:x anchor))
    4.19            y (- y (:y anchor))]
    4.20      (with-bounds x y (:width size) (:height size)
    4.21 @@ -76,31 +76,30 @@
    4.22      (.draw *graphics* path)))
    4.23    (.translate *graphics* (- x) (- y)))
    4.24  
    4.25 +(defrecord GraphLayer [graph-layout movable dragged fix-x fix-y]
    4.26 +  Layer
    4.27 +  (render! [layer]
    4.28 +     (let [bounds (.getBounds graph-layout)
    4.29 +           x (- (.getX bounds))
    4.30 +           y (- (.getY bounds))]
    4.31 +       (draw-edges! graph-layout x y)
    4.32 +       (if movable
    4.33 +         (draw-movable-vertices! graph-layout x y dragged fix-x fix-y)
    4.34 +         (draw-vertices! graph-layout x y))))
    4.35 +  (layer-size [layer]
    4.36 +     (let [bounds (.getBounds graph-layout)]
    4.37 +       (Size. (.getWidth bounds) (.getHeight bounds))))
    4.38 +  Anchored
    4.39 +  (anchor [layer x-align y-align]
    4.40 +          (let [bounds (.getBounds graph-layout)]
    4.41 +            (Location. (- (.getX bounds))
    4.42 +                       (- (.getY bounds))))))
    4.43 +
    4.44  (defn graph-layer
    4.45 -  ([layout]
    4.46 -     (graph-layer layout false))
    4.47 -  ([^GraphLayout layout movable]
    4.48 -     (let [dragged (ref nil)
    4.49 -           fix-x (ref 0)
    4.50 -           fix-y (ref 0)]
    4.51 -       (reify
    4.52 -        Layer
    4.53 -        (render! [layer]
    4.54 -           (let [bounds (.getBounds layout)
    4.55 -                 x (- (.getX bounds))
    4.56 -                 y (- (.getY bounds))]
    4.57 -             (draw-edges! layout x y)
    4.58 -             (if movable
    4.59 -               (draw-movable-vertices! layout x y dragged fix-x fix-y)
    4.60 -               (draw-vertices! layout x y))))
    4.61 -        (size [layer]
    4.62 -           (let [bounds (.getBounds layout)]
    4.63 -             (Size. (.getWidth bounds) (.getHeight bounds))))
    4.64 -        Anchored
    4.65 -        (anchor [layer x-align y-align]
    4.66 -           (let [bounds (.getBounds layout)]
    4.67 -             (Location. (- (.getX bounds))
    4.68 -                        (- (.getY bounds)))))))))
    4.69 +  ([graph-layout]
    4.70 +     (graph-layer graph-layout false))
    4.71 +  ([^GraphGraph-Layout graph-layout movable]
    4.72 +     (GraphLayer. graph-layout movable (ref nil) (ref 0) (ref 0))))
    4.73  
    4.74  (defn build-graph
    4.75    "Returns Graph defined by a sequence of pairs of vertex ids,
     5.1 --- a/src/kryshen/indyvon/layers.clj	Sat Jul 10 07:28:19 2010 +0400
     5.2 +++ b/src/kryshen/indyvon/layers.clj	Sun Jul 11 06:34:36 2010 +0400
     5.3 @@ -41,8 +41,8 @@
     5.4                 (.drawRect *graphics* i i (- w 1 i i) (- h 1 i i)))
     5.5               (draw! content
     5.6                      offset offset (- w offset offset) (- h offset offset))))
     5.7 -        (size [l]
     5.8 -           (let [s (size content)]
     5.9 +        (layer-size [l]
    5.10 +           (let [s (layer-size content)]
    5.11               (Size. (+ (:width s) offset offset)
    5.12                      (+ (:height s) offset offset))))))))
    5.13  
    5.14 @@ -81,7 +81,7 @@
    5.15                         x (align-x (.getAdvance layout) w h-align)]
    5.16                     (.draw layout *graphics* x (+ y ascent))
    5.17                     (recur (next layouts) (+ y lh)))))))
    5.18 -        (size [layer]
    5.19 +        (layer-size [layer]
    5.20             (let [layouts (layout-text lines (:font *theme*) *font-context*)
    5.21                   width (text-width layouts)
    5.22                   height (text-height layouts)]
    5.23 @@ -124,4 +124,18 @@
    5.24             (ref-set fix-x (:x-on-screen e))
    5.25             (ref-set fix-y (:y-on-screen e)))
    5.26            (*update*))))
    5.27 -     (size [layer] (size content))))))
    5.28 +     (layer-size [layer] (layer-size content))))))
    5.29 +
    5.30 +(defmacro decorate-layer [layer & render-tail]
    5.31 +  `(reify
    5.32 +    Layer
    5.33 +    (render! ~@render-tail)
    5.34 +    (layer-size [t#] (layer-size ~layer))
    5.35 +    Anchored
    5.36 +    (anchor [t# xa# ya#] (anchor ~layer xa# ya#))))
    5.37 +
    5.38 +(defmacro handler [layer & handlers]
    5.39 +  `(decorate-layer ~layer [t#]
    5.40 +      (with-handlers t#
    5.41 +        (render! ~layer)
    5.42 +        ~@handlers)))