105 lines
2.9 KiB
Haxe
Executable File
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;
|
|
} |