Some refactoring

This commit is contained in:
Joshua Granick
2014-06-10 16:24:54 -07:00
parent bfbdbdba5a
commit 97d9911b67
10 changed files with 213 additions and 88 deletions

53
lime/app/EventManager.hx Normal file
View File

@@ -0,0 +1,53 @@
package lime.app;
/*@:generic*/ class EventManager<T> {
private var listeners:Array<T>;
private var priorities:Array<Int>;
public function new () {
listeners = new Array ();
priorities = new Array ();
}
private function _addEventListener (listener:T, priority:Int):Void {
for (i in 0...priorities.length) {
if (priority > priorities[i]) {
listeners.insert (i, listener);
priorities.insert (i, priority);
return;
}
}
listeners.push (listener);
priorities.push (priority);
}
private function _removeEventListener (listener:T):Void {
var index = listeners.indexOf (listener);
if (index > -1) {
listeners.splice (index, 1);
priorities.splice (index, 1);
}
}
}

View File

@@ -4,17 +4,16 @@ package lime.app;
import lime.system.System;
class UpdateEventManager {
class UpdateEventManager extends EventManager<IUpdateEventListener> {
private static var instance:UpdateEventManager;
private var listeners:Array<IUpdateEventListener>;
public function new () {
listeners = new Array ();
super ();
instance = this;
#if (cpp || neko)
@@ -24,11 +23,11 @@ class UpdateEventManager {
}
public static function addEventListener (listener:IUpdateEventListener):Void {
public static function addEventListener (listener:IUpdateEventListener, priority:Int = 0):Void {
if (instance != null) {
instance.listeners.push (listener);
instance._addEventListener (listener, priority);
}
@@ -48,6 +47,17 @@ class UpdateEventManager {
}
public static function removeEventListener (listener:IUpdateEventListener):Void {
if (instance != null) {
instance._removeEventListener (listener);
}
}
#if (cpp || neko)
private static var lime_update_event_manager_register = System.load ("lime", "lime_update_event_manager_register", 2);
#end

View File

@@ -1,34 +1,74 @@
package lime.graphics;
import lime.app.EventManager;
import lime.system.System;
#if js
import js.Browser;
#end
class RenderEventManager {
@:access(lime.ui.Window)
class RenderEventManager extends EventManager<IRenderEventListener> {
private static var instance:RenderEventManager;
private var listeners:Array<IRenderEventListener>;
private var event:RenderEvent;
public function new () {
listeners = new Array ();
instance = this;
super ();
instance = this;
event = new RenderEvent ();
#if js
untyped __js__ ("
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|| window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
window.requestAnimFrame = window.requestAnimationFrame;
");
handleFrame ();
#elseif (cpp || neko)
lime_render_event_manager_register (handleEvent, event);
#if (cpp || neko)
lime_render_event_manager_register (handleEvent, new RenderEvent ());
#end
}
public static function addEventListener (listener:IRenderEventListener):Void {
public static function addEventListener (listener:IRenderEventListener, priority:Int = 0):Void {
if (instance != null) {
instance.listeners.push (listener);
instance._addEventListener (listener, priority);
}
@@ -45,7 +85,27 @@ class RenderEventManager {
}
Renderer.flip ();
}
private function handleFrame ():Void {
handleEvent (event);
#if js
Browser.window.requestAnimationFrame (cast handleFrame);
#end
}
public static function removeEventListener (listener:IRenderEventListener) {
if (instance != null) {
instance._removeEventListener (listener);
}
}

View File

@@ -5,29 +5,26 @@ import lime.system.System;
import lime.ui.Window;
class Renderer {
class Renderer implements IRenderEventListener {
public var handle:Dynamic;
private static var instance:Renderer;
public function new (window:Window) {
#if (cpp || neko)
handle = lime_renderer_create (window.handle);
RenderEventManager.addEventListener (this, -99999999);
#end
instance = this;
}
public static function flip ():Void {
public function onRender (event:RenderEvent):Void {
#if (cpp || neko)
lime_renderer_flip (instance.handle);
lime_renderer_flip (handle);
#end
}
@@ -39,4 +36,4 @@ class Renderer {
#end
}
}

View File

@@ -1,20 +1,20 @@
package lime.ui;
import lime.app.EventManager;
import lime.system.System;
class KeyEventManager {
class KeyEventManager extends EventManager<IKeyEventListener> {
private static var instance:KeyEventManager;
private var listeners:Array<IKeyEventListener>;
public function new () {
listeners = new Array ();
super ();
instance = this;
#if (cpp || neko)
@@ -24,11 +24,11 @@ class KeyEventManager {
}
public static function addEventListener (listener:IKeyEventListener):Void {
public static function addEventListener (listener:IKeyEventListener, priority:Int = 0):Void {
if (instance != null) {
instance.listeners.push (listener);
instance._addEventListener (listener, priority);
}
@@ -62,6 +62,17 @@ class KeyEventManager {
}
public static function removeEventListener (listener:IKeyEventListener):Void {
if (instance != null) {
instance._removeEventListener (listener);
}
}
#if (cpp || neko)
private static var lime_key_event_manager_register = System.load ("lime", "lime_key_event_manager_register", 2);
#end

View File

@@ -1,20 +1,20 @@
package lime.ui;
import lime.app.EventManager;
import lime.system.System;
class MouseEventManager {
class MouseEventManager extends EventManager<IMouseEventListener> {
private static var instance:MouseEventManager;
private var listeners:Array<IMouseEventListener>;
public function new () {
listeners = new Array ();
super ();
instance = this;
#if (cpp || neko)
@@ -24,11 +24,11 @@ class MouseEventManager {
}
public static function addEventListener (listener:IMouseEventListener):Void {
public static function addEventListener (listener:IMouseEventListener, priority:Int = 0):Void {
if (instance != null) {
instance.listeners.push (listener);
instance._addEventListener (listener, priority);
}
@@ -72,6 +72,17 @@ class MouseEventManager {
}
public static function removeEventListener (listener:IMouseEventListener):Void {
if (instance != null) {
instance._removeEventListener (listener);
}
}
#if (cpp || neko)
private static var lime_mouse_event_manager_register = System.load ("lime", "lime_mouse_event_manager_register", 2);
#end

View File

@@ -1,20 +1,20 @@
package lime.ui;
import lime.app.EventManager;
import lime.system.System;
class TouchEventManager {
class TouchEventManager extends EventManager<ITouchEventListener> {
private static var instance:TouchEventManager;
private var listeners:Array<ITouchEventListener>;
public function new () {
listeners = new Array ();
super ();
instance = this;
#if (cpp || neko)
@@ -24,11 +24,11 @@ class TouchEventManager {
}
public static function addEventListener (listener:ITouchEventListener):Void {
public static function addEventListener (listener:ITouchEventListener, priority:Int = 0):Void {
if (instance != null) {
instance.listeners.push (listener);
instance._addEventListener (listener, priority);
}
@@ -70,6 +70,17 @@ class TouchEventManager {
}
public static function removeEventListener (listener:ITouchEventListener):Void {
if (instance != null) {
instance._removeEventListener (listener);
}
}
#if (cpp || neko)
private static var lime_touch_event_manager_register = System.load ("lime", "lime_touch_event_manager_register", 2);
#end

View File

@@ -15,7 +15,6 @@ import js.Browser;
#end
@:access(lime.graphics.RenderEventManager)
class Window {
@@ -23,6 +22,7 @@ class Window {
public var height:Int;
public var width:Int;
private var application:Application;
#if js
private var canvas:CanvasElement;
#end
@@ -30,7 +30,7 @@ class Window {
public function new (application:Application) {
this.application = application;
}
@@ -171,7 +171,6 @@ class Window {
Browser.window.requestAnimationFrame (cast __render);
*/
render ();
#elseif (cpp || neko)
handle = lime_window_create (application.handle);
@@ -180,17 +179,6 @@ class Window {
}
#if js
private function render ():Void {
RenderEventManager.instance.handleEvent (new RenderEvent ());
Browser.window.requestAnimationFrame (cast render);
}
#end
#if (cpp || neko)
private static var lime_window_create = System.load ("lime", "lime_window_create", 1);
#end

View File

@@ -1,20 +1,20 @@
package lime.ui;
import lime.app.EventManager;
import lime.system.System;
class WindowEventManager {
class WindowEventManager extends EventManager<IWindowEventListener> {
private static var instance:WindowEventManager;
private var listeners:Array<IWindowEventListener>;
public function new () {
listeners = new Array ();
super ();
instance = this;
#if (cpp || neko)
@@ -24,11 +24,11 @@ class WindowEventManager {
}
public static function addEventListener (listener:IWindowEventListener):Void {
public static function addEventListener (listener:IWindowEventListener, priority:Int = 0):Void {
if (instance != null) {
instance.listeners.push (listener);
instance._addEventListener (listener, priority);
}
@@ -62,6 +62,17 @@ class WindowEventManager {
}
public static function removeEventListener (listener:IWindowEventListener):Void {
if (instance != null) {
instance._removeEventListener (listener);
}
}
#if (cpp || neko)
private static var lime_window_event_manager_register = System.load ("lime", "lime_window_event_manager_register", 2);
#end

View File

@@ -48,33 +48,6 @@ class ApplicationMain {
}
untyped __js__ ("
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
|| window[vendors[x]+'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
window.requestAnimFrame = window.requestAnimationFrame;
");
var app = new ::APP_MAIN:: ();
var config:lime.app.Config = {