From 74d3b5404ff378bed308e7c62dbae204a4ffcc55 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Wed, 11 Jun 2014 16:09:38 -0700 Subject: [PATCH] More work on events --- lime/ui/KeyEvent.hx | 26 ++++++++- lime/ui/KeyEventManager.hx | 43 ++++++++++----- lime/ui/MouseEventManager.hx | 78 +++++++++++++++++--------- lime/ui/TouchEventManager.hx | 101 +++++++++++++++++++++++++++------- lime/ui/WindowEventManager.hx | 30 +++++----- 5 files changed, 202 insertions(+), 76 deletions(-) diff --git a/lime/ui/KeyEvent.hx b/lime/ui/KeyEvent.hx index de85b94c4..a4ae7c35a 100644 --- a/lime/ui/KeyEvent.hx +++ b/lime/ui/KeyEvent.hx @@ -4,21 +4,33 @@ package lime.ui; class KeyEvent { + public var altKey:Bool; public var code:Int; + public var ctrlKey:Bool; + public var key:Int; + public var location:KeyEventLocation; + public var metaKey:Bool; + public var shiftKey:Bool; public var type:KeyEventType; - public function new (type:KeyEventType = null, code:Int = -1) { + public function new (type:KeyEventType = null, code:Int = 0, key:Int = 0, location:KeyEventLocation = null, ctrlKey:Bool = false, altKey:Bool = false, shiftKey:Bool = false, metaKey:Bool = false) { this.type = type; this.code = code; + this.key = key; + this.location = location; + this.ctrlKey = ctrlKey; + this.altKey = altKey; + this.shiftKey = shiftKey; + this.metaKey = metaKey; } public function clone ():KeyEvent { - return new KeyEvent (type, code); + return new KeyEvent (type, code, key, location, ctrlKey, altKey, shiftKey, metaKey); } @@ -26,6 +38,16 @@ class KeyEvent { } +@:enum abstract KeyEventLocation(Int) { + + var KEY_LOCATION_STANDARD = 0; + var KEY_LOCATION_LEFT = 1; + var KEY_LOCATION_RIGHT = 2; + var KEY_LOCATION_NUMPAD = 3; + +} + + @:enum abstract KeyEventType(Int) { var KEY_DOWN = 0; diff --git a/lime/ui/KeyEventManager.hx b/lime/ui/KeyEventManager.hx index b7daafd0e..2e778b990 100644 --- a/lime/ui/KeyEventManager.hx +++ b/lime/ui/KeyEventManager.hx @@ -15,16 +15,19 @@ class KeyEventManager extends EventManager { private static var instance:KeyEventManager; + private var keyEvent:KeyEvent; + public function new () { super (); instance = this; + keyEvent = new KeyEvent (); #if (cpp || neko) - lime_key_event_manager_register (handleEvent, new KeyEvent ()); + lime_key_event_manager_register (handleEvent, keyEvent); #end @@ -42,6 +45,29 @@ class KeyEventManager extends EventManager { } + #if js + private function handleDOMEvent (event:js.html.KeyboardEvent):Void { + + //keyEvent.code = event.code; + keyEvent.code = (event.keyCode != null ? event.keyCode : event.which); + keyEvent.key = keyEvent.code; + //keyEvent.code = Keyboard.__convertMozillaCode (keyEvent.code); + + //keyEvent.location = untyped (event).location != null ? untyped (event).location : event.keyLocation; + + keyEvent.ctrlKey = event.ctrlKey; + keyEvent.altKey = event.altKey; + keyEvent.shiftKey = event.shiftKey; + keyEvent.metaKey = event.metaKey; + + keyEvent.type = (event.type == "keydown" ? KEY_DOWN : KEY_UP); + + handleEvent (keyEvent); + + } + #end + + private function handleEvent (event:KeyEvent):Void { var event = event.clone (); @@ -74,19 +100,8 @@ class KeyEventManager extends EventManager { if (instance != null) { #if js - - Browser.window.addEventListener ("keydown", function (event) { - - instance.handleEvent (new KeyEvent (KEY_DOWN, 0)); - - }, false); - - Browser.window.addEventListener ("keyup", function (event) { - - instance.handleEvent (new KeyEvent (KEY_UP, 0)); - - }, false); - + Browser.window.addEventListener ("keydown", instance.handleDOMEvent, false); + Browser.window.addEventListener ("keyup", instance.handleDOMEvent, false); #end } diff --git a/lime/ui/MouseEventManager.hx b/lime/ui/MouseEventManager.hx index 8662e291a..6bfb9b61e 100644 --- a/lime/ui/MouseEventManager.hx +++ b/lime/ui/MouseEventManager.hx @@ -11,16 +11,19 @@ class MouseEventManager extends EventManager { private static var instance:MouseEventManager; + private var mouseEvent:MouseEvent; + public function new () { super (); instance = this; + mouseEvent = new MouseEvent (); #if (cpp || neko) - lime_mouse_event_manager_register (handleEvent, new MouseEvent ()); + lime_mouse_event_manager_register (handleEvent, mouseEvent); #end @@ -38,6 +41,50 @@ class MouseEventManager extends EventManager { } + #if js + private function handleDOMEvent (event:js.html.MouseEvent):Void { + + /* + var rect; + + if (__canvas != null) { + + rect = __canvas.getBoundingClientRect (); + __mouseX = (event.clientX - rect.left) * (stageWidth / rect.width); + __mouseY = (event.clientY - rect.top) * (stageHeight / rect.height); + + } else { + + rect = __div.getBoundingClientRect (); + //__mouseX = (event.clientX - rect.left) * (__div.style.width / rect.width); + __mouseX = (event.clientX - rect.left); + //__mouseY = (event.clientY - rect.top) * (__div.style.height / rect.height); + __mouseY = (event.clientY - rect.top); + + } + */ + + mouseEvent.x = event.clientX; + mouseEvent.y = event.clientY; + + mouseEvent.type = switch (event.type) { + + case "mousedown": MOUSE_DOWN; + case "mouseup": MOUSE_UP; + case "mousemove": MOUSE_MOVE; + //case "click": MouseEvent.CLICK; + //case "dblclick": MouseEvent.DOUBLE_CLICK; + case "mousewheel": MOUSE_WHEEL; + default: null; + + } + + handleEvent (mouseEvent); + + } + #end + + private function handleEvent (event:MouseEvent):Void { var event = event.clone (); @@ -80,31 +127,10 @@ class MouseEventManager extends EventManager { if (instance != null) { #if js - - window.element.addEventListener ("mousedown", function (event) { - - instance.handleEvent (new MouseEvent (MOUSE_DOWN, 0, 0)); - - }, true); - - window.element.addEventListener ("mousemove", function (event) { - - instance.handleEvent (new MouseEvent (MOUSE_MOVE, 0, 0)); - - }, true); - - window.element.addEventListener ("mouseup", function (event) { - - instance.handleEvent (new MouseEvent (MOUSE_UP, 0, 0)); - - }, true); - - window.element.addEventListener ("mousewheel", function (event) { - - //instance.handleEvent (new MouseEvent (MOUSE_DOWN, 0, 0)); - - }, true); - + window.element.addEventListener ("mousedown", instance.handleDOMEvent, true); + window.element.addEventListener ("mousemove", instance.handleDOMEvent, true); + window.element.addEventListener ("mouseup", instance.handleDOMEvent, true); + //window.element.addEventListener ("mousewheel", handleDOMEvent, true); #end } diff --git a/lime/ui/TouchEventManager.hx b/lime/ui/TouchEventManager.hx index 3e8c9ae69..bd3c51012 100644 --- a/lime/ui/TouchEventManager.hx +++ b/lime/ui/TouchEventManager.hx @@ -11,16 +11,19 @@ class TouchEventManager extends EventManager { private static var instance:TouchEventManager; + private var touchEvent:TouchEvent; + public function new () { super (); instance = this; + touchEvent = new TouchEvent (); #if (cpp || neko) - lime_touch_event_manager_register (handleEvent, new TouchEvent ()); + lime_touch_event_manager_register (handleEvent, touchEvent); #end @@ -38,6 +41,80 @@ class TouchEventManager extends EventManager { } + #if js + private function handleDOMEvent (event:js.html.TouchEvent):Void { + + event.preventDefault (); + + //var rect = __canvas.getBoundingClientRect (); + + touchEvent.id = event.changedTouches[0].identifier; + touchEvent.x = event.pageX; + touchEvent.y = event.pageY; + + touchEvent.type = switch (event.type) { + + case "touchstart": TOUCH_START; + case "touchmove": TOUCH_MOVE; + case "touchend": TOUCH_END; + default: null; + + } + + handleEvent (touchEvent); + + /* + event.preventDefault (); + + var rect; + + if (__canvas != null) { + + rect = __canvas.getBoundingClientRect (); + + } else { + + rect = __div.getBoundingClientRect (); + + } + + var touch = event.changedTouches[0]; + var point = new Point ((touch.pageX - rect.left) * (stageWidth / rect.width), (touch.pageY - rect.top) * (stageHeight / rect.height)); + + __mouseX = point.x; + __mouseY = point.y; + + __stack = []; + + var type = null; + var mouseType = null; + + switch (event.type) { + + case "touchstart": + + type = TouchEvent.TOUCH_BEGIN; + mouseType = MouseEvent.MOUSE_DOWN; + + case "touchmove": + + type = TouchEvent.TOUCH_MOVE; + mouseType = MouseEvent.MOUSE_MOVE; + + case "touchend": + + type = TouchEvent.TOUCH_END; + mouseType = MouseEvent.MOUSE_UP; + + default: + + } + */ + + } + #end + + private function handleEvent (event:TouchEvent):Void { var event = event.clone (); @@ -78,25 +155,9 @@ class TouchEventManager extends EventManager { if (instance != null) { #if js - - window.element.addEventListener ("touchstart", function (event) { - - instance.handleEvent (new TouchEvent (TOUCH_START, 0, 0, 0)); - - }, true); - - window.element.addEventListener ("touchmove", function (event) { - - instance.handleEvent (new TouchEvent (TOUCH_MOVE, 0, 0, 0)); - - }, true); - - window.element.addEventListener ("touchend", function (event) { - - instance.handleEvent (new TouchEvent (TOUCH_END, 0, 0, 0)); - - }, true); - + window.element.addEventListener ("touchstart", instance.handleDOMEvent, true); + window.element.addEventListener ("touchmove", instance.handleDOMEvent, true); + window.element.addEventListener ("touchend", instance.handleDOMEvent, true); #end } diff --git a/lime/ui/WindowEventManager.hx b/lime/ui/WindowEventManager.hx index 2d1c19f67..00f8f4250 100644 --- a/lime/ui/WindowEventManager.hx +++ b/lime/ui/WindowEventManager.hx @@ -15,16 +15,19 @@ class WindowEventManager extends EventManager { private static var instance:WindowEventManager; + private var windowEvent:WindowEvent; + public function new () { super (); instance = this; + windowEvent = new WindowEvent (); #if (cpp || neko) - lime_window_event_manager_register (handleEvent, new WindowEvent ()); + lime_window_event_manager_register (handleEvent, windowEvent); #end @@ -42,6 +45,16 @@ class WindowEventManager extends EventManager { } + #if js + private function handleDOMEvent (event:js.html.Event):Void { + + windowEvent.type = (event.type == "focus" ? WINDOW_ACTIVATE : WINDOW_DEACTIVATE); + handleEvent (windowEvent); + + } + #end + + private function handleEvent (event:WindowEvent):Void { var event = event.clone (); @@ -74,19 +87,8 @@ class WindowEventManager extends EventManager { if (instance != null) { #if js - - Browser.window.addEventListener ("focus", function (event) { - - instance.handleEvent (new WindowEvent (WINDOW_ACTIVATE)); - - }, false); - - Browser.window.addEventListener ("blur", function (event) { - - instance.handleEvent (new WindowEvent (WINDOW_DEACTIVATE)); - - }, false); - + Browser.window.addEventListener ("focus", instance.handleDOMEvent, false); + Browser.window.addEventListener ("blur", instance.handleDOMEvent, false); #end }