Mercurial > hg > indyvon
changeset 4:0771180bf7c2
Abandoned approach at event dispatching.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Thu, 10 Jun 2010 02:54:35 +0400 |
parents | 6bc931b1b755 |
children | 74f1f265c3d9 |
files | project.clj src/indyvon/component.clj src/indyvon/core.clj |
diffstat | 3 files changed, 101 insertions(+), 38 deletions(-) [+] |
line diff
1.1 --- a/project.clj Tue Jun 08 15:24:45 2010 +0400 1.2 +++ b/project.clj Thu Jun 10 02:54:35 2010 +0400 1.3 @@ -2,4 +2,5 @@ 1.4 :description "FIXME: write" 1.5 :dependencies [[org.clojure/clojure "1.2.0-master-SNAPSHOT"] 1.6 [org.clojure/clojure-contrib "1.2.0-SNAPSHOT"]] 1.7 - :dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"]]) 1.8 + :dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"]] 1.9 + :namespaces [indyvon.core])
2.1 --- a/src/indyvon/component.clj Tue Jun 08 15:24:45 2010 +0400 2.2 +++ b/src/indyvon/component.clj Thu Jun 10 02:54:35 2010 +0400 2.3 @@ -1,17 +1,54 @@ 2.4 ;; (ns indyvon.component 2.5 -;; (:use indyvon.layer) 2.6 -;; (:import (java.awt Graphics Graphics2D)) 2.7 +;; (:use indyvon.core) 2.8 +;; (:import (java.awt Graphics Graphics2D Dimension AWTEvent)) 2.9 ;; (:gen-class 2.10 -;; :name indyvon.Component 2.11 +;; :name indyvon.IdvComponent 2.12 ;; :extends java.awt.Component 2.13 -;; :constructor {[Layer] []} 2.14 -;; :state layer 2.15 -;; :init init-state)) 2.16 +;; :constructors {[indyvon.core.Layer] [], 2.17 +;; [indyvon.core.Layer indyvon.core.EventDispatcher] []} 2.18 +;; :exposes-methods {enableEvents enableEventsSuper} 2.19 +;; :state state 2.20 +;; :init init 2.21 +;; :post-init post-init)) 2.22 2.23 -;; (defn- init-state [layer] 2.24 -;; [[] layer]) 2.25 +;; (defrecord State [layer event]) 2.26 2.27 -;; (defn -paint [this graphics]) 2.28 +;; (defn- -init 2.29 +;; ([layer] 2.30 +;; [[] (State. layer (make-event-dispatcher))]) 2.31 +;; ([layer dispatcher] 2.32 +;; [[] (State. layer dispatcher)])) 2.33 2.34 -;; (defn -update [this graphics] 2.35 -;; (-paint this graphics)) 2.36 +;; (defn -enableEvents [this mask] 2.37 +;; (.enableEventsSuper this mask)) 2.38 + 2.39 +;; (defn- -post-init [this & args] 2.40 +;; (.enableEvents 2.41 +;; this 2.42 +;; ^long (reduce bit-or 2.43 +;; [AWTEvent/MOUSE_EVENT_MASK 2.44 +;; AWTEvent/MOUSE_MOTION_EVENT_MASK 2.45 +;; AWTEvent/MOUSE_WHEEL_EVENT_MASK 2.46 +;; AWTEvent/KEY_EVENT_MASK]))) 2.47 + 2.48 +;; (defn- make-update-fn [component] 2.49 +;; (fn [] (.repaint component))) 2.50 + 2.51 +;; (defn -paint [this g] 2.52 +;; (let [layer (-> this .state :layer) 2.53 +;; size (.getSize this) 2.54 +;; width (.width size) 2.55 +;; height (.height size)] 2.56 +;; (binding [*graphics* g 2.57 +;; *update-fn* (make-update-fn this)] 2.58 +;; (render-layer! layer 0 0 width height false)))) 2.59 + 2.60 +;; (defn -update [this g] 2.61 +;; (-paint this g)) 2.62 + 2.63 +;; (defn -processEvent [this event] 2.64 +;; (dispatch (-> this .state :dispatcher) event)) 2.65 + 2.66 +;; (defn -getPreferredSize [this] 2.67 +;; (let [s (-> this .state :layer size)] 2.68 +;; (Dimension. (s 0) (s 1))))
3.1 --- a/src/indyvon/core.clj Tue Jun 08 15:24:45 2010 +0400 3.2 +++ b/src/indyvon/core.clj Thu Jun 10 02:54:35 2010 +0400 3.3 @@ -1,5 +1,7 @@ 3.4 (ns indyvon.core 3.5 - (:import (java.awt Dimension Point Component Graphics2D AWTEvent))) 3.6 + (:import (java.awt Dimension Point Component Graphics2D AWTEvent) 3.7 + (java.awt.event MouseAdapter MouseMotionAdapter 3.8 + MouseListener MouseMotionListener))) 3.9 3.10 (def ^{:private true} *rx* 0) 3.11 (def ^{:private true} *ry* 0) 3.12 @@ -64,33 +66,51 @@ 3.13 (fn [layer event] 3.14 [layer (.getID event)])) 3.15 3.16 -(defmethod handle-layer-event :default [layer event]) 3.17 +(defmethod handle-layer-event :default [layer event] 3.18 + false) 3.19 3.20 (defprotocol EventDispatcher 3.21 (register [this layer]) 3.22 (commit [this]) 3.23 (dispatch [this event])) 3.24 3.25 +;;(defrecord LayerContextState [hovered contexts]) 3.26 + 3.27 (defrecord LayerContext [layer rx ry width height update-fn]) 3.28 3.29 +;; LayerContext сам реализует EventDispatcher. 3.30 +;; Дерево диспетчеров-контекстов. 3.31 +;; Передача события от корня. 3.32 + 3.33 (defn make-event-dispatcher [] 3.34 - (let [contexts-r (ref []) 3.35 - contexts-d (ref [])] 3.36 + (let [contexts-r (ref []) ; register 3.37 + contexts (ref []) ; dispatch 3.38 + hovered (ref []) 3.39 + picked (ref [])] 3.40 (reify 3.41 EventDispatcher 3.42 (register [this layer] 3.43 - (dosync 3.44 - (alter contexts-r conj 3.45 - (LayerContext. layer *rx* *ry* 3.46 - *width* *height* 3.47 - *update-fn*)))) 3.48 + (dosync 3.49 + (alter contexts-r conj 3.50 + (LayerContext. layer *rx* *ry* 3.51 + *width* *height* 3.52 + *update-fn*)))) 3.53 (commit [this] 3.54 - (dosync (ref-set contexts-d @contexts-r) 3.55 - (ref-set contexts-r []))) 3.56 + (dosync (ref-set contexts @contexts-r) 3.57 + (ref-set contexts-r []))) 3.58 (dispatch [this event] 3.59 (println "dispatch" this event) 3.60 ;; TODO 3.61 - )))) 3.62 + ) 3.63 + MouseListener 3.64 + (mouseClicked [this event]) 3.65 + (mouseEntered [this event]) 3.66 + (mouseExited [this event]) 3.67 + (mousePressed [this event]) 3.68 + (mouseReleased [this event]) 3.69 + MouseMotionListener 3.70 + (mouseDragged [this event]) 3.71 + (mouseMoved [this event])))) 3.72 3.73 ;; 3.74 ;; Connection to AWT. 3.75 @@ -121,20 +141,25 @@ 3.76 ([layer] 3.77 (make-component layer (make-event-dispatcher))) 3.78 ([layer event-dispatcher] 3.79 - (proxy [Component] [] 3.80 - (update [g] (.paint this g)) 3.81 - (paint [g] 3.82 - (let [size (.getSize this) 3.83 - width (.width size) 3.84 - height (.height size)] 3.85 - (binding [*graphics* g 3.86 - *update-fn* (make-update-fn this)] 3.87 - (render-layer! layer 0 0 width height false)))) 3.88 - (getPreferredSize [] 3.89 - (let [s (size layer)] 3.90 - (Dimension. (s 0) (s 1)))) 3.91 - (processEvent [event] 3.92 - (dispatch event-dispatcher event))))) 3.93 + (doto 3.94 + (proxy [Component] [] 3.95 + (update [g] (.paint this g)) 3.96 + (paint [g] 3.97 + (let [size (.getSize this) 3.98 + width (.width size) 3.99 + height (.height size)] 3.100 + (binding [*graphics* g 3.101 + *update-fn* (make-update-fn this)] 3.102 + (render-layer! layer 0 0 width height false)))) 3.103 + (getPreferredSize [] 3.104 + (let [s (size layer)] 3.105 + (Dimension. (s 0) (s 1)))) 3.106 + (processEvent [event] 3.107 + (dispatch event-dispatcher event))) 3.108 + ;; No way to call protected final evenbleEvents even in gen-class, 3.109 + ;; have to use the following hack: 3.110 + (.addMouseListener (proxy [MouseAdapter] [])) 3.111 + (.addMouseMotionListener (proxy [MouseMotionAdapter] []))))) 3.112 3.113 (comment 3.114 (do