From 1c4c827ff97ccbd8a5d762c7dae3e02d669cab75 Mon Sep 17 00:00:00 2001 From: oakes Date: Sat, 11 Jan 2014 03:24:49 -0500 Subject: [PATCH] Add UI listeners --- src/play_clj/core.clj | 13 ++++-- src/play_clj/core_ui.clj | 92 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/play_clj/core.clj b/src/play_clj/core.clj index 94d55cd..49f2a16 100644 --- a/src/play_clj/core.clj +++ b/src/play_clj/core.clj @@ -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))) diff --git a/src/play_clj/core_ui.clj b/src/play_clj/core_ui.clj index 2206279..717ccad 100644 --- a/src/play_clj/core_ui.clj +++ b/src/play_clj/core_ui.clj @@ -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))))