More work on events

This commit is contained in:
Joshua Granick
2014-06-11 16:09:38 -07:00
parent c155c688eb
commit 74d3b5404f
5 changed files with 202 additions and 76 deletions

View File

@@ -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;

View File

@@ -15,16 +15,19 @@ class KeyEventManager extends EventManager<IKeyEventListener> {
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<IKeyEventListener> {
}
#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<IKeyEventListener> {
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
}

View File

@@ -11,16 +11,19 @@ class MouseEventManager extends EventManager<IMouseEventListener> {
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<IMouseEventListener> {
}
#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<IMouseEventListener> {
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
}

View File

@@ -11,16 +11,19 @@ class TouchEventManager extends EventManager<ITouchEventListener> {
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<ITouchEventListener> {
}
#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<ITouchEventListener> {
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
}

View File

@@ -15,16 +15,19 @@ class WindowEventManager extends EventManager<IWindowEventListener> {
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<IWindowEventListener> {
}
#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<IWindowEventListener> {
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
}