Files
haxework/haxework/gui/ButtonView.hx
2014-03-24 15:17:47 +04:00

105 lines
2.9 KiB
Haxe
Executable File

package haxework.gui;
import flash.events.MouseEvent;
import haxework.dispath.Dispatcher;
import haxework.dispath.IDispatcher;
enum ButtonState {
UP;
OVER;
DOWN;
}
class ButtonView extends LabelView {
public var disabled(default, set):Bool;
public var state(get, null):ButtonState;
public var dispatcher(default, null):IDispatcher<ButtonViewListener<Dynamic>>;
public var onPress(null, set):ButtonViewListener<Dynamic>;
private var overed:Bool;
private var downed:Bool;
public function new() {
super();
overed = false;
downed = false;
state = ButtonState.UP;
dispatcher = new Dispatcher<ButtonViewListener<Dynamic>>();
content.buttonMode = true;
content.mouseChildren = false;
content.addEventListener(MouseEvent.CLICK, onMouseClick);
#if !mobile
content.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
content.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
#end
content.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
content.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private function onMouseClick(event:MouseEvent):Void {
event.stopImmediatePropagation();
if (!disabled) dispatcher.dispatch(pressCaller);
}
private function onMouseOver(event:MouseEvent):Void {
overed = true;
invalidate();
}
private function onMouseOut(event:MouseEvent):Void {
overed = false;
invalidate();
}
private function onMouseDown(event:MouseEvent):Void {
downed = true;
content.stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
invalidate();
}
private function onMouseUp(event:MouseEvent):Void {
downed = false;
content.stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
invalidate();
}
private function pressCaller(listener:ButtonViewListener<Dynamic>):Void {
try {listener.onPress(this);} catch (error:Dynamic) L.e("onPress", "", error);
}
private function set_disabled(value:Bool):Bool {
if (disabled != value) {
disabled = value;
content.buttonMode = !disabled;
invalidate();
}
return disabled;
}
private function get_state():ButtonState {
#if mobile
return downed ? ButtonState.DOWN : ButtonState.UP;
#else
return (downed && overed) ? ButtonState.DOWN : overed ? ButtonState.OVER : ButtonState.UP;
#end
}
private function set_onPress(value:ButtonViewListener<Dynamic>):ButtonViewListener<Dynamic> {
dispatcher.addListener(value);
return value;
}
public function dispose():Void {
dispatcher.removeAllListeners();
content.removeEventListener(MouseEvent.CLICK, onMouseClick);
content.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
content.removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
content.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
content.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
}
typedef ButtonViewListener<V:ButtonView> = {
public function onPress(view:V):Void;
}