gui fixes
This commit is contained in:
@@ -12,6 +12,7 @@ enum ButtonState {
|
||||
|
||||
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>;
|
||||
@@ -36,7 +37,7 @@ class ButtonView extends LabelView {
|
||||
|
||||
private function onMouseClick(event:MouseEvent):Void {
|
||||
event.stopImmediatePropagation();
|
||||
dispatcher.dispatch(pressCaller);
|
||||
if (!disabled) dispatcher.dispatch(pressCaller);
|
||||
}
|
||||
|
||||
private function onMouseOver(event:MouseEvent):Void {
|
||||
@@ -65,6 +66,15 @@ class ButtonView extends LabelView {
|
||||
listener.onPress(this);
|
||||
}
|
||||
|
||||
private function set_disabled(value:Bool):Bool {
|
||||
if (disabled != value) {
|
||||
disabled = value;
|
||||
content.buttonMode = !disabled;
|
||||
invalidate();
|
||||
}
|
||||
return disabled;
|
||||
}
|
||||
|
||||
private function get_state():ButtonState {
|
||||
return (downed && overed) ? ButtonState.DOWN : overed ? ButtonState.OVER : ButtonState.UP;
|
||||
}
|
||||
@@ -75,6 +85,7 @@ class ButtonView extends LabelView {
|
||||
}
|
||||
|
||||
public function dispose():Void {
|
||||
dispatcher.removeAllListeners();
|
||||
content.removeEventListener(MouseEvent.CLICK, onMouseClick);
|
||||
content.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
|
||||
content.removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
|
||||
|
||||
@@ -55,6 +55,15 @@ class GroupView extends SpriteView implements IGroupView<Sprite> {
|
||||
return view;
|
||||
}
|
||||
|
||||
public function addViewFirst(view:IView<Dynamic>):IView<Dynamic> {
|
||||
views.unshift(view);
|
||||
viewsById.set(view.id, view);
|
||||
content.addChild(view.content);
|
||||
view.parent = this;
|
||||
invalidate();
|
||||
return view;
|
||||
}
|
||||
|
||||
public function removeView(view:IView<Dynamic>):IView<Dynamic> {
|
||||
view.parent = null;
|
||||
viewsById.remove(view.id);
|
||||
|
||||
@@ -21,6 +21,7 @@ interface IGroupView<C:Content> extends IView<C> {
|
||||
public var paddings(null, set):Float;
|
||||
|
||||
public function addView(view:IView<Dynamic>):IView<Dynamic>;
|
||||
public function addViewFirst(view:IView<Dynamic>):IView<Dynamic>;
|
||||
public function removeView(view:IView<Dynamic>):IView<Dynamic>;
|
||||
public function removeAllViews():Void;
|
||||
public function removeViewById(id:String):IView<Dynamic>;
|
||||
|
||||
@@ -1,12 +1,75 @@
|
||||
package haxework.gui;
|
||||
|
||||
import flash.events.Event;
|
||||
import flash.text.TextFormat;
|
||||
import flash.text.TextFieldAutoSize;
|
||||
import flash.text.TextField;
|
||||
import haxework.core.IDisposable;
|
||||
import haxework.core.Const;
|
||||
import flash.events.KeyboardEvent;
|
||||
import flash.events.TextEvent;
|
||||
import flash.text.TextFieldType;
|
||||
|
||||
class InputView extends TextView {
|
||||
class InputView extends TextView implements IDisposable {
|
||||
|
||||
public var hint(default, set):String;
|
||||
|
||||
private var hintTextField:TextField;
|
||||
|
||||
public function new() {
|
||||
super();
|
||||
textField.type = TextFieldType.INPUT;
|
||||
textField.addEventListener(Event.CHANGE, onTextChange);
|
||||
textField.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
|
||||
textField.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
|
||||
|
||||
hintTextField = buildHintTextField();
|
||||
content.addChild(hintTextField);
|
||||
}
|
||||
|
||||
private function set_hint(value:String):String {
|
||||
if (hint != value) {
|
||||
hint = value;
|
||||
invalidate();
|
||||
}
|
||||
return hint;
|
||||
}
|
||||
|
||||
private function buildHintTextField():TextField {
|
||||
var textField:TextField = new TextField();
|
||||
textField.autoSize = TextFieldAutoSize.NONE;
|
||||
textField.type = TextFieldType.DYNAMIC;
|
||||
textField.multiline = false;
|
||||
textField.defaultTextFormat = new TextFormat("Arial", 16, 0xa0a0a0);
|
||||
textField.mouseEnabled = false;
|
||||
return textField;
|
||||
}
|
||||
|
||||
private function onTextChange(event:Event):Void {
|
||||
hintTextField.visible = (textField.text == "");
|
||||
}
|
||||
|
||||
private function onKeyUp(event:KeyboardEvent):Void {
|
||||
event.stopImmediatePropagation();
|
||||
}
|
||||
|
||||
private function onKeyDown(event:KeyboardEvent):Void {
|
||||
event.stopImmediatePropagation();
|
||||
}
|
||||
|
||||
override public function update():Void {
|
||||
super.update();
|
||||
var htf:TextFormat = textField.defaultTextFormat;
|
||||
htf.color = 0xa0a0a0;
|
||||
htf.size -= 2;
|
||||
hintTextField.defaultTextFormat = htf;
|
||||
hintTextField.text = hint == null ? "" : hint;
|
||||
placeTextField(hintTextField);
|
||||
}
|
||||
|
||||
public function dispose():Void {
|
||||
textField.removeEventListener(Event.CHANGE, onTextChange);
|
||||
textField.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp);
|
||||
textField.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ class Root {
|
||||
} else {
|
||||
onAddedToStage();
|
||||
}
|
||||
View.updater.update();
|
||||
}
|
||||
|
||||
private function onAddedToStage(?_):Void {
|
||||
|
||||
@@ -144,27 +144,31 @@ class TextView extends SpriteView implements ITextView<Sprite, TextField> {
|
||||
textField.x = paddings;
|
||||
textField.y = paddings;
|
||||
} else {
|
||||
if (fill) {
|
||||
textField.width = width - paddings * 2;
|
||||
textField.height = height - paddings * 2;
|
||||
textField.x = paddings;
|
||||
textField.y = paddings;
|
||||
} else {
|
||||
textField.x = switch (layoutHAlign) {
|
||||
case HAlign.NONE: 0;
|
||||
case HAlign.LEFT: 0;
|
||||
case HAlign.CENTER: (width - textField.width) / 2;
|
||||
case HAlign.RIGHT: width - textField.width;
|
||||
}
|
||||
textField.y = switch (layoutVAlign) {
|
||||
case VAlign.NONE: 0;
|
||||
case VAlign.TOP: 0;
|
||||
case VAlign.MIDDLE: (height - textField.height) / 2;
|
||||
case VAlign.BOTTOM: height - textField.height;
|
||||
}
|
||||
}
|
||||
placeTextField(textField);
|
||||
}
|
||||
super.update();
|
||||
}
|
||||
|
||||
private function placeTextField(textField:TextField):Void {
|
||||
if (fill) {
|
||||
textField.width = width - paddings * 2;
|
||||
textField.height = height - paddings * 2;
|
||||
textField.x = paddings;
|
||||
textField.y = paddings;
|
||||
} else {
|
||||
textField.x = switch (layoutHAlign) {
|
||||
case HAlign.NONE: 0;
|
||||
case HAlign.LEFT: 0;
|
||||
case HAlign.CENTER: (width - textField.width) / 2;
|
||||
case HAlign.RIGHT: width - textField.width;
|
||||
}
|
||||
textField.y = switch (layoutVAlign) {
|
||||
case VAlign.NONE: 0;
|
||||
case VAlign.TOP: 0;
|
||||
case VAlign.MIDDLE: (height - textField.height) / 2;
|
||||
case VAlign.BOTTOM: height - textField.height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,8 +18,8 @@ class HListView<V:View<Dynamic>, D> extends ListView<V, D> {
|
||||
override private function recalcSize(item:ListItem<V, D>):Void {
|
||||
var view:IView<Dynamic> = item.view;
|
||||
itemSize = view.width + view.leftMargin + view.rightMargin + container.layoutMargin;
|
||||
size = Math.ceil(Math.max(0, width / itemSize)) + 2;
|
||||
sizeDiff = size - ((width - container.layoutMargin - 1) / itemSize);
|
||||
size = Math.ceil(Math.max(0, container.width / itemSize)) + 2;
|
||||
sizeDiff = size - ((container.width - container.layoutMargin - 1) / itemSize);
|
||||
}
|
||||
|
||||
override private function set_offsetDiff(value:Float):Float {
|
||||
|
||||
@@ -12,7 +12,7 @@ import haxework.gui.core.HAlign;
|
||||
import flash.display.Sprite;
|
||||
import haxework.gui.skin.ISkin;
|
||||
|
||||
class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
|
||||
public var data(default, set):Array<D>;
|
||||
public var renderer(null, set):IRenderer<Dynamic, V, D>;
|
||||
@@ -26,9 +26,15 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
public var dispatcher(default, null):IDispatcher<ListViewListener<V, D>>;
|
||||
public var scroll(default, set):ScrollView;
|
||||
|
||||
public var prev(default, set):ButtonView;
|
||||
public var next(default, set):ButtonView;
|
||||
|
||||
public var filter(default, set):D->Bool;
|
||||
private var filteredData:Array<D>;
|
||||
|
||||
public var selected(default, set):Array<D>;
|
||||
|
||||
private var main:GroupView;
|
||||
private var container:GroupView;
|
||||
private var mask:SpriteView;
|
||||
private var itemSize:Float;
|
||||
@@ -38,10 +44,16 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
|
||||
public function new(layout:ILayout, otherLayout:ILayout) {
|
||||
super(otherLayout);
|
||||
main = new GroupView(layout);
|
||||
main.layoutHAlign = HAlign.CENTER;
|
||||
main.layoutVAlign = VAlign.MIDDLE;
|
||||
main.pWidth = 100;
|
||||
main.pHeight = 100;
|
||||
addView(main);
|
||||
container = new GroupView(layout);
|
||||
container.pWidth = 100;
|
||||
container.pHeight = 100;
|
||||
addView(container);
|
||||
main.addView(container);
|
||||
mask = new SpriteView();
|
||||
mask.pWidth = 100;
|
||||
mask.pHeight = 100;
|
||||
@@ -54,8 +66,9 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
offset = 0;
|
||||
offsetDiff = 0;
|
||||
sizeDiff = 0;
|
||||
items = new Array<ListItem<V, D>>();
|
||||
items = [];
|
||||
itemsListeners = new Map<ListItem<V, D>, MouseEvent->Void>();
|
||||
selected = [];
|
||||
content.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent);
|
||||
}
|
||||
|
||||
@@ -73,6 +86,36 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
return scroll;
|
||||
}
|
||||
|
||||
private function set_prev(value:ButtonView):ButtonView {
|
||||
if (prev != null) {
|
||||
main.removeView(prev);
|
||||
prev.dispose();
|
||||
}
|
||||
prev = value;
|
||||
prev.onPress = {onPress:onPrevPress};
|
||||
main.addViewFirst(prev);
|
||||
return prev;
|
||||
}
|
||||
|
||||
private function onPrevPress(_):Void {
|
||||
offset = offset - 1;
|
||||
}
|
||||
|
||||
private function set_next(value:ButtonView):ButtonView {
|
||||
if (next != null) {
|
||||
main.removeView(next);
|
||||
next.dispose();
|
||||
}
|
||||
next = value;
|
||||
next.onPress = {onPress:onNextPress};
|
||||
main.addView(next);
|
||||
return next;
|
||||
}
|
||||
|
||||
private function onNextPress(_):Void {
|
||||
offset = offset + 1;
|
||||
}
|
||||
|
||||
public function onScroll(position:Float):Void {
|
||||
var x:Float = filteredData.length * position;
|
||||
offset = Math.round(x) - 1;
|
||||
@@ -81,15 +124,19 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
|
||||
private function onMouseWheelEvent(event:MouseEvent):Void {
|
||||
event.preventDefault();
|
||||
offsetDiff = 0;
|
||||
onMouseWheel(event.delta);
|
||||
}
|
||||
|
||||
private function onMouseWheel(value:Int):Void {}
|
||||
|
||||
private function set_offset(value:Int):Int {
|
||||
value = NumberUtil.limitInt(value, 0, filteredData == null ? 0 : filteredData.length - size);
|
||||
value = NumberUtil.limitInt(value, 0, filteredData == null ? 0 : filteredData.length - size + 2);
|
||||
if (offset != value) {
|
||||
if (filteredData != null) {
|
||||
//ToDo: constant for 2
|
||||
if (value == 0) offsetDiff = 0;
|
||||
if (value == filteredData.length - size + 2) offsetDiff = 3 - sizeDiff;
|
||||
}
|
||||
offset = value;
|
||||
render();
|
||||
}
|
||||
@@ -110,6 +157,14 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
|
||||
return filter;
|
||||
}
|
||||
|
||||
private function set_selected(value:Array<D>):Array<D> {
|
||||
if (selected != value) {
|
||||
selected = value;
|
||||
invalidate();
|
||||
}
|
||||
return selected;
|
||||
}
|
||||
|
||||
private function set_renderer(value:IRenderer<Dynamic, V, D>):IRenderer<Dynamic, V, D> {
|
||||
renderer = value;
|
||||
render();
|
||||
|
||||
@@ -18,8 +18,8 @@ class VListView<V:View<Dynamic>, D> extends ListView<V, D> {
|
||||
override private function recalcSize(item:ListItem<V, D>):Void {
|
||||
var view:IView<Dynamic> = item.view;
|
||||
itemSize = view.height + view.topMargin + view.bottomMargin + container.layoutMargin;
|
||||
size = Math.ceil(Math.max(0, height / itemSize)) + 2;
|
||||
sizeDiff = size - ((height - container.layoutMargin - 1) / itemSize);
|
||||
size = Math.ceil(Math.max(0, container.height / itemSize)) + 2;
|
||||
sizeDiff = size - ((container.height - container.layoutMargin - 1) / itemSize);
|
||||
}
|
||||
|
||||
override private function set_offsetDiff(value:Float):Float {
|
||||
|
||||
@@ -9,6 +9,7 @@ class ButtonColorSkin implements ISkin<Sprite, ButtonView> {
|
||||
|
||||
public var color(default, set_color):Int;
|
||||
private var colors:Map<ButtonState, Int>;
|
||||
private var disable:Int;
|
||||
|
||||
public function new(?color:Int = 0xffffff) {
|
||||
this.color = color;
|
||||
@@ -19,12 +20,12 @@ class ButtonColorSkin implements ISkin<Sprite, ButtonView> {
|
||||
colors.set(ButtonState.UP, value);
|
||||
colors.set(ButtonState.DOWN, ColorUtils.diff(value, -64));
|
||||
colors.set(ButtonState.OVER, ColorUtils.diff(value, 64));
|
||||
//colors.set(ButtonState.DISABLE, ColorUtils.multiply(value, 0.6));
|
||||
disable = ColorUtils.multiply(value, 0.6);
|
||||
return value;
|
||||
}
|
||||
|
||||
public function draw(view:ButtonView):Void {
|
||||
var color:Int = colors.get(view.state);
|
||||
var color:Int = view.disabled ? disable : colors.get(view.state);
|
||||
var graphics:Graphics = view.content.graphics;
|
||||
graphics.clear();
|
||||
graphics.beginFill(color);
|
||||
|
||||
@@ -29,7 +29,7 @@ class LoaderManager implements ILoaderManager {
|
||||
|
||||
public function release(loader:ILoader<Dynamic>):Void {
|
||||
actives.remove(loader);
|
||||
if (queue.length > 0 && actives.length == 0) {
|
||||
if (queue.length > 0 && actives.length < limit) {
|
||||
run(queue.shift());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ class UrlUtil {
|
||||
|
||||
public static function parseParams(url:String):Map<String, String> {
|
||||
var result:Map<String, String> = new Map<String, String>();
|
||||
var tmp:String = url.split("?")[1];
|
||||
var tmp:String = url == null ? null : url.split("?")[1];
|
||||
if (tmp != null) {
|
||||
var tmpArr:Array<String> = tmp.split("&");
|
||||
for (item in tmpArr) {
|
||||
|
||||
Reference in New Issue
Block a user