changeset 37:d2fb660ca49f

Remove "opts" argument from Layer methods.
author Mikhail Kryshen <mikhail@kryshen.net>
date Fri, 09 Jul 2010 01:08:45 +0400
parents 5413b188d112
children af3187fdc44d
files src/kryshen/indyvon/component.clj src/kryshen/indyvon/core.clj src/kryshen/indyvon/demo.clj src/kryshen/indyvon/layers.clj
diffstat 4 files changed, 65 insertions(+), 59 deletions(-) [+]
line diff
     1.1 --- a/src/kryshen/indyvon/component.clj	Thu Jul 08 07:03:24 2010 +0400
     1.2 +++ b/src/kryshen/indyvon/component.clj	Fri Jul 09 01:08:45 2010 +0400
     1.3 @@ -28,13 +28,13 @@
     1.4                  *update* #(.repaint component)
     1.5                  *bounds* bounds
     1.6                  *clip* bounds]
     1.7 -        (render! layer nil)
     1.8 +        (render! layer)
     1.9          (commit event-dispatcher)))))
    1.10  
    1.11  (defn preferred-size [component layer]
    1.12    (binding [*target* component
    1.13              *font-context*' (font-context component)]
    1.14 -    (let [s (size layer nil)]
    1.15 +    (let [s (size layer)]
    1.16        (Dimension. (:width s) (:height s)))))
    1.17  
    1.18  (defn make-jpanel
     2.1 --- a/src/kryshen/indyvon/core.clj	Thu Jul 08 07:03:24 2010 +0400
     2.2 +++ b/src/kryshen/indyvon/core.clj	Fri Jul 09 01:08:45 2010 +0400
     2.3 @@ -30,8 +30,8 @@
     2.4  
     2.5  (defprotocol Layer
     2.6    "Basic UI element."
     2.7 -  (render! [this opts])
     2.8 -  (size [this opts]))
     2.9 +  (render! [this])
    2.10 +  (size [this]))
    2.11  
    2.12  ;; TODO: modifiers
    2.13  (defrecord MouseEvent [id when x y x-on-screen y-on-screen button])
    2.14 @@ -48,18 +48,18 @@
    2.15  
    2.16  (defprotocol Anchored
    2.17    "Provide anchor point for Layers. Used by viewport."
    2.18 -  (anchor [this h-align v-align opts]
    2.19 +  (anchor [this h-align v-align]
    2.20       "Anchor point: [x y], h-align could be :left, :center or :right,
    2.21        v-align is :top, :center or :bottom"))
    2.22  
    2.23  ;; Default implementation of Anchored for any Layer.
    2.24  (extend-protocol Anchored
    2.25    kryshen.indyvon.core.Layer
    2.26 -  (anchor [this h-align v-align opts]
    2.27 +  (anchor [this h-align v-align]
    2.28            (if (and (= h-align :left)
    2.29                     (= v-align :top))
    2.30              (Location. 0 0)
    2.31 -            (let [size (size this opts)]
    2.32 +            (let [size (size this)]
    2.33                (Location.
    2.34                 (case h-align
    2.35                       :top 0
    2.36 @@ -78,23 +78,29 @@
    2.37      (.setColor (:fore-color theme))
    2.38      (.setFont (:font theme))))
    2.39  
    2.40 -(defn intersect [b1 b2]
    2.41 -  (let [x11 (:x b1)
    2.42 -        y11 (:y b1)
    2.43 -        x12 (+ x11 (:width b1))
    2.44 -        y12 (+ y11 (:height b1))
    2.45 -        x21 (:x b2)
    2.46 -        y21 (:y b2)
    2.47 -        x22 (+ x21 (:width b2))
    2.48 -        y22 (+ y21 (:height b2))
    2.49 -        x1 (max x11 x21)
    2.50 -        y1 (max y11 y21)
    2.51 -        x2 (min x12 x22)
    2.52 -        y2 (min y12 y22)]
    2.53 -    (Bounds. x1 y1 (- x2 x1) (- y2 y1))))
    2.54 +(defn intersect
    2.55 +  ([b1 b2]
    2.56 +     (let [x1 (:x b1)
    2.57 +           y1 (:y b1)
    2.58 +           x2 (:x b2)
    2.59 +           y2 (:y b2)]
    2.60 +       (intersect x1 y1 (+ x1 (:width b1)) (+ y1 (:height b1))
    2.61 +                  x2 y2 (+ x2 (:width b2)) (+ y2 (:height b2)))))
    2.62 +  ([x11 y11 x12 y12, x21 y21 x22 y22]
    2.63 +     (let [x1 (max x11 x21)
    2.64 +           y1 (max y11 y21)
    2.65 +           x2 (min x12 x22)
    2.66 +           y2 (min y12 y22)]
    2.67 +       (Bounds. x1 y1 (- x2 x1) (- y2 y1)))))
    2.68 +
    2.69 +(defn- create-graphics
    2.70 +  ([]
    2.71 +     (create-graphics 0 0 (:width *bounds*) (:height *bounds*)))
    2.72 +  ([x y w h]
    2.73 +     (apply-theme (.create *graphics* x y w h) *theme*)))
    2.74  
    2.75  (defn with-translate* [x y w h f & args]
    2.76 -  (let [graphics (apply-theme (.create *graphics* x y w h) *theme*)
    2.77 +  (let [graphics (create-graphics x y w h)
    2.78          bounds (Bounds. (+ x (:x *bounds*))
    2.79                          (+ y (:y *bounds*))
    2.80                          w h)]
    2.81 @@ -109,8 +115,6 @@
    2.82  (defmacro with-translate [x y w h & body]
    2.83    `(with-translate* ~x ~y ~w ~h (fn [] ~@body)))
    2.84  
    2.85 -
    2.86 -
    2.87  (defn with-handlers* [handle handlers f & args]
    2.88    (apply with-bindings*
    2.89           {#'*event-dispatcher*
    2.90 @@ -136,14 +140,17 @@
    2.91      [(:x geometry) (:y geometry) (:width geometry) (:height geometry)]))
    2.92  
    2.93  (defn draw!
    2.94 -  "Draw a layer. Geometry is either a map or vector [x y] or
    2.95 -   [x y width height]."
    2.96 -  [layer geometry & args]
    2.97 -  (let [[x y w h] (geometry-vec geometry)
    2.98 -        size (if-not (and w h) (size layer args))
    2.99 -        w (or w (:width size))
   2.100 -        h (or h (:height size))]
   2.101 -    (with-translate* x y w h render! layer args)))
   2.102 +  ([layer]
   2.103 +     (let [graphics (create-graphics)]
   2.104 +       (try
   2.105 +         (with-bindings* {#'*graphics* graphics} render! layer)
   2.106 +         (finally
   2.107 +          (.dispose graphics)))))
   2.108 +  ([layer x y]
   2.109 +     (let [size (size layer)]
   2.110 +       (draw! layer x y (:width size) (:height size))))
   2.111 +  ([layer x y width height]
   2.112 +     (with-translate* x y width height render! layer)))
   2.113  
   2.114  ;;
   2.115  ;; EventDispatcher implementation
     3.1 --- a/src/kryshen/indyvon/demo.clj	Thu Jul 08 07:03:24 2010 +0400
     3.2 +++ b/src/kryshen/indyvon/demo.clj	Fri Jul 09 01:08:45 2010 +0400
     3.3 @@ -18,7 +18,7 @@
     3.4  (def layer1
     3.5       (reify
     3.6        Layer
     3.7 -      (render! [layer opts]
     3.8 +      (render! [layer]
     3.9           (with-handlers layer
    3.10             (doto *graphics*
    3.11               (.setColor Color/RED)
    3.12 @@ -26,20 +26,20 @@
    3.13             (:mouse-entered e (println e))
    3.14             (:mouse-exited e (println e))
    3.15             (:mouse-moved e (println e))))
    3.16 -      (size [layer opts] (Size. 30 20))))
    3.17 +      (size [layer] (Size. 30 20))))
    3.18  
    3.19  (def layer1b (border-layer layer1 2 3))
    3.20  
    3.21  (def layer2
    3.22       (reify
    3.23        Layer
    3.24 -      (render! [layer opts]
    3.25 +      (render! [layer]
    3.26           (doto *graphics*
    3.27             (.setColor Color/YELLOW)
    3.28             (.fillRect 0 0 (:width *bounds*) (:height *bounds*)))
    3.29 -         (draw! layer1b [10 5])
    3.30 -         (draw! layer1 [55 5]))
    3.31 -      (size [layer opts] (Size. 70 65))))
    3.32 +         (draw! layer1b 10 5)
    3.33 +         (draw! layer1 55 5))
    3.34 +      (size [layer] (Size. 70 65))))
    3.35  
    3.36  (def layer3
    3.37       (border-layer (text-layer "Sample\ntext" :right :center)))
    3.38 @@ -54,8 +54,8 @@
    3.39             fl (ref (fps-layer 0.0))]
    3.40         (reify
    3.41          Layer
    3.42 -        (render! [layer opts]
    3.43 -           (render! @fl nil)
    3.44 +        (render! [layer]
    3.45 +           (draw! @fl)
    3.46             (dosync
    3.47              (alter frames + 1)
    3.48              (let [time (System/currentTimeMillis)
    3.49 @@ -64,20 +64,20 @@
    3.50                  (ref-set fl (fps-layer (/ @frames elapsed)))
    3.51                  (ref-set frames 0)
    3.52                  (ref-set last time)))))
    3.53 -        (size [layer opts] (size @fl nil)))))
    3.54 +        (size [layer] (size @fl)))))
    3.55  
    3.56  (def layer
    3.57       (reify
    3.58        Layer
    3.59 -      (render! [layer opts]
    3.60 +      (render! [layer]
    3.61           (*update*)
    3.62           (doto *graphics*
    3.63             (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED]))
    3.64             (.drawLine 0 0 (:width *bounds*) (:height *bounds*)))
    3.65 -         (draw! layer2 [15 20])
    3.66 -         (draw! layer3 [100 100 80 50])
    3.67 -         (render! fps nil))
    3.68 -      (size [layer opts] (Size. 400 300))))
    3.69 +         (draw! layer2 15 20)
    3.70 +         (draw! layer3 100 100 80 50)
    3.71 +         (draw! fps))
    3.72 +      (size [layer] (Size. 400 300))))
    3.73  
    3.74  (defn -main []
    3.75    (doto frame
    3.76 @@ -87,3 +87,4 @@
    3.77      (.. (getContentPane) (add (make-jpanel (viewport layer))))
    3.78      (.pack)
    3.79      (.setVisible true)))
    3.80 +
     4.1 --- a/src/kryshen/indyvon/layers.clj	Thu Jul 08 07:03:24 2010 +0400
     4.2 +++ b/src/kryshen/indyvon/layers.clj	Fri Jul 09 01:08:45 2010 +0400
     4.3 @@ -33,17 +33,16 @@
     4.4    ([content width gap]
     4.5       (let [offset (+ width gap)]
     4.6         (reify Layer
     4.7 -        (render! [l opts]
     4.8 +        (render! [l]
     4.9             (let [w (:width *bounds*)
    4.10                   h (:height *bounds*)]
    4.11               (.setColor *graphics* (:border-color *theme*))
    4.12               (doseq [i (range 0 width)]
    4.13                 (.drawRect *graphics* i i (- w 1 i i) (- h 1 i i)))
    4.14 -             (apply draw! content
    4.15 -                    [offset offset (- w offset offset) (- h offset offset)]
    4.16 -                    opts)))
    4.17 -        (size [l opts]
    4.18 -           (let [s (size content opts)]
    4.19 +             (draw! content
    4.20 +                    offset offset (- w offset offset) (- h offset offset))))
    4.21 +        (size [l]
    4.22 +           (let [s (size content)]
    4.23               (Size. (+ (:width s) offset offset)
    4.24                      (+ (:height s) offset offset))))))))
    4.25  
    4.26 @@ -69,7 +68,7 @@
    4.27    ([text h-align v-align]
    4.28       (let [lines (re-split #"\r\n|\n|\r|\u0085|\u2028|\u2029" text)]
    4.29         (reify Layer
    4.30 -        (render! [layer opts]
    4.31 +        (render! [layer]
    4.32             (let [w (:width *bounds*)
    4.33                   h (:height *bounds*)
    4.34                   font (.getFont *graphics*)
    4.35 @@ -82,7 +81,7 @@
    4.36                         x (align-x (.getAdvance layout) w h-align)]
    4.37                     (.draw layout *graphics* x (+ y ascent))
    4.38                     (recur (next layouts) (+ y lh)))))))
    4.39 -        (size [layer opts]
    4.40 +        (size [layer]
    4.41             (let [layouts (layout-text lines (:font *theme*) *font-context*)
    4.42                   width (text-width layouts)
    4.43                   height (text-height layouts)]
    4.44 @@ -100,9 +99,9 @@
    4.45          last-height (ref 0)]
    4.46      (reify
    4.47       Layer
    4.48 -     (render! [layer opts]
    4.49 +     (render! [layer]
    4.50          (with-handlers layer
    4.51 -         (let [anchor (anchor content h-align v-align opts)
    4.52 +         (let [anchor (anchor content h-align v-align)
    4.53                 width (:width *bounds*)
    4.54                 height (:height *bounds*)]
    4.55             (dosync
    4.56 @@ -110,8 +109,7 @@
    4.57              (alter y + (align-y height @last-height v-align))
    4.58              (ref-set last-width width)
    4.59              (ref-set last-height height))
    4.60 -           (apply draw! content
    4.61 -                  [(- 0 @x (:x anchor)) (- 0 @y (:y anchor))] opts))
    4.62 +           (draw! content (- 0 @x (:x anchor)) (- 0 @y (:y anchor))))
    4.63           (:mouse-pressed e
    4.64            (dosync
    4.65             (ref-set fix-x (:x-on-screen e))
    4.66 @@ -126,4 +124,4 @@
    4.67             (ref-set fix-x (:x-on-screen e))
    4.68             (ref-set fix-y (:y-on-screen e)))
    4.69            (*update*))))
    4.70 -     (size [layer opts] (size content opts))))))
    4.71 +     (size [layer] (size content))))))