Add UI listeners
This commit is contained in:
@@ -20,8 +20,9 @@
|
||||
[com.badlogic.gdx.scenes.scene2d Actor Stage]
|
||||
[com.badlogic.gdx.scenes.scene2d.ui ButtonGroup CheckBox Dialog
|
||||
ImageButton ImageTextButton Label Skin Slider TextButton TextField]
|
||||
[com.badlogic.gdx.scenes.scene2d.utils NinePatchDrawable
|
||||
SpriteDrawable TextureRegionDrawable TiledDrawable]))
|
||||
[com.badlogic.gdx.scenes.scene2d.utils ActorGestureListener
|
||||
ChangeListener ClickListener DragListener FocusListener
|
||||
NinePatchDrawable SpriteDrawable TextureRegionDrawable TiledDrawable]))
|
||||
|
||||
(defmulti create-entity class)
|
||||
|
||||
@@ -53,6 +54,11 @@
|
||||
flatten
|
||||
(remove nil?)
|
||||
(compare-and-set! entities entities-list)))))
|
||||
ui-listeners [(ui-gesture-listener options execute-fn!)
|
||||
(ui-change-listener options execute-fn!)
|
||||
(ui-click-listener options execute-fn!)
|
||||
(ui-drag-listener options execute-fn!)
|
||||
(ui-focus-listener options execute-fn!)]
|
||||
create-renderer-fn! #(swap! screen assoc :renderer (renderer %))
|
||||
update-fn! #(swap! screen merge %)]
|
||||
{:screen screen
|
||||
@@ -61,7 +67,8 @@
|
||||
(swap! screen assoc
|
||||
:total-time 0
|
||||
:create-renderer-fn! create-renderer-fn!
|
||||
:update-fn! update-fn!)
|
||||
:update-fn! update-fn!
|
||||
:ui-listeners ui-listeners)
|
||||
(execute-fn! on-show))
|
||||
:render (fn [d]
|
||||
(swap! screen #(assoc % :total-time (+ (:total-time %) d)))
|
||||
|
||||
@@ -87,3 +87,95 @@
|
||||
(defmacro dialog
|
||||
[text arg & options]
|
||||
`(create-entity (utils/calls! ^Dialog (dialog* ~text ~arg) ~@options)))
|
||||
|
||||
; listeners
|
||||
|
||||
(defn listen!
|
||||
[{:keys [renderer ui-listeners] :as screen} entities]
|
||||
(assert (isa? (type renderer) Stage))
|
||||
(add-input! renderer)
|
||||
(stage! screen :clear)
|
||||
(doseq [{:keys [object]} entities]
|
||||
(stage! screen :add-actor object)
|
||||
(doseq [listener ui-listeners]
|
||||
(.addListener ^Actor object listener)))
|
||||
entities)
|
||||
|
||||
(defn- ui-gesture-listener
|
||||
[{:keys [on-ui-fling on-ui-long-press on-ui-pan on-ui-pinch
|
||||
on-ui-tap on-ui-touch-down on-ui-touch-up on-ui-zoom]}
|
||||
execute-fn!]
|
||||
(proxy [ActorGestureListener] []
|
||||
(fling [e vx vy b]
|
||||
(execute-fn! on-ui-fling
|
||||
:event e :velocity-x vx :velocity-y vy :button b))
|
||||
(longPress [a x y]
|
||||
(execute-fn! on-ui-long-press :actor a :x x :y y)
|
||||
false)
|
||||
(pan [e x y dx dy]
|
||||
(execute-fn! on-ui-pan :event e :x x :y y :delta-x dx :delta-y dy))
|
||||
(pinch [e ip1 ip2 p1 p2]
|
||||
(execute-fn! on-ui-pinch
|
||||
:event e :initial-pointer-1 ip1 :initial-pointer-2 ip2
|
||||
:pointer1 p1 :pointer2 p2))
|
||||
(tap [e x y p b]
|
||||
(execute-fn! on-ui-tap :event e :x x :y y :pointer p :button b))
|
||||
;(touchDown [e x y p b]
|
||||
; (execute-fn! on-ui-touch-down :event e :x x :y y :pointer p :button b))
|
||||
;(touchUp [e x y p b]
|
||||
; (execute-fn! on-ui-touch-up :event e :x x :y y :pointer p :button b))
|
||||
(zoom [e id d]
|
||||
(execute-fn! on-ui-zoom :event e :initial-distance id :distance d))))
|
||||
|
||||
(defn- ui-change-listener
|
||||
[{:keys [on-ui-changed]} execute-fn!]
|
||||
(proxy [ChangeListener] []
|
||||
(changed [e a]
|
||||
(execute-fn! on-ui-changed :event e :actor a))))
|
||||
|
||||
(defn- ui-click-listener
|
||||
[{:keys [on-ui-clicked on-ui-enter on-ui-exit
|
||||
on-ui-touch-down on-ui-touch-dragged on-ui-touch-up]}
|
||||
execute-fn!]
|
||||
(proxy [ClickListener] []
|
||||
(clicked [e x y]
|
||||
(execute-fn! on-ui-clicked :event e :x x :y y))
|
||||
(enter [e x y p a]
|
||||
(execute-fn! on-ui-enter :event e :x x :y y :pointer p :from-actor a))
|
||||
(exit [e x y p a]
|
||||
(execute-fn! on-ui-exit :event e :x x :y y :pointer p :to-actor a))
|
||||
(touchDown [e x y p b]
|
||||
(execute-fn! on-ui-touch-down :event e :x x :y y :pointer p :button b)
|
||||
true)
|
||||
(touchDragged [e x y p]
|
||||
(execute-fn! on-ui-touch-dragged :event e :x x :y y :pointer p))
|
||||
(touchUp [e x y p b]
|
||||
(execute-fn! on-ui-touch-up :event e :x x :y y :pointer p :button b))))
|
||||
|
||||
(defn- ui-drag-listener
|
||||
[{:keys [on-ui-drag on-ui-drag-start on-ui-drag-stop
|
||||
on-ui-touch-down on-ui-touch-dragged on-ui-touch-up]}
|
||||
execute-fn!]
|
||||
(proxy [DragListener] []
|
||||
;(touchDown [e x y p b]
|
||||
; (execute-fn! on-ui-touch-down :event e :x x :y y :pointer p :button b)
|
||||
; true)
|
||||
;(touchDragged [e x y p]
|
||||
; (execute-fn! on-ui-touch-dragged :event e :x x :y y :pointer p))
|
||||
;(touchUp [e x y p b]
|
||||
; (execute-fn! on-ui-touch-up :event e :x x :y y :pointer p :button b))
|
||||
(drag [e x y p]
|
||||
(execute-fn! on-ui-drag :event e :x x :y y :pointer p))
|
||||
(dragStart [e x y p]
|
||||
(execute-fn! on-ui-drag-start :event e :x x :y y :pointer p))
|
||||
(dragStop [e x y p]
|
||||
(execute-fn! on-ui-drag-stop :event e :x x :y y :pointer p))))
|
||||
|
||||
(defn- ui-focus-listener
|
||||
[{:keys [on-ui-keyboard-focus-changed on-ui-scroll-focus-changed]}
|
||||
execute-fn!]
|
||||
(proxy [FocusListener] []
|
||||
(keyboardFocusChanged [e a f]
|
||||
(execute-fn! on-ui-keyboard-focus-changed :event e :actor a :focused? f))
|
||||
(scrollFocusChanged [e a f]
|
||||
(execute-fn! on-ui-scroll-focus-changed :event e :actor a :focused? f))))
|
||||
|
||||
Reference in New Issue
Block a user