gui fixes

This commit is contained in:
2014-02-07 17:11:35 +04:00
parent 4651ec154c
commit 6a991d4e7e
12 changed files with 179 additions and 34 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -20,6 +20,7 @@ class Root {
} else {
onAddedToStage();
}
View.updater.update();
}
private function onAddedToStage(?_):Void {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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());
}
}

View File

@@ -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) {