diff --git a/haxework/gui/ButtonView.hx b/haxework/gui/ButtonView.hx index b92b1f7..b7bffce 100755 --- a/haxework/gui/ButtonView.hx +++ b/haxework/gui/ButtonView.hx @@ -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>; public var onPress(null, set):ButtonViewListener; @@ -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); diff --git a/haxework/gui/GroupView.hx b/haxework/gui/GroupView.hx index 9a12b2e..d43f7ef 100755 --- a/haxework/gui/GroupView.hx +++ b/haxework/gui/GroupView.hx @@ -55,6 +55,15 @@ class GroupView extends SpriteView implements IGroupView { return view; } + public function addViewFirst(view:IView):IView { + views.unshift(view); + viewsById.set(view.id, view); + content.addChild(view.content); + view.parent = this; + invalidate(); + return view; + } + public function removeView(view:IView):IView { view.parent = null; viewsById.remove(view.id); diff --git a/haxework/gui/IGroupView.hx b/haxework/gui/IGroupView.hx index 8966af4..96af507 100755 --- a/haxework/gui/IGroupView.hx +++ b/haxework/gui/IGroupView.hx @@ -21,6 +21,7 @@ interface IGroupView extends IView { public var paddings(null, set):Float; public function addView(view:IView):IView; + public function addViewFirst(view:IView):IView; public function removeView(view:IView):IView; public function removeAllViews():Void; public function removeViewById(id:String):IView; diff --git a/haxework/gui/InputView.hx b/haxework/gui/InputView.hx index 6903280..e613fa8 100755 --- a/haxework/gui/InputView.hx +++ b/haxework/gui/InputView.hx @@ -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); } } \ No newline at end of file diff --git a/haxework/gui/Root.hx b/haxework/gui/Root.hx index 2ea38f6..64ff7c0 100755 --- a/haxework/gui/Root.hx +++ b/haxework/gui/Root.hx @@ -20,6 +20,7 @@ class Root { } else { onAddedToStage(); } + View.updater.update(); } private function onAddedToStage(?_):Void { diff --git a/haxework/gui/TextView.hx b/haxework/gui/TextView.hx index 7b6f867..3a7ce1d 100755 --- a/haxework/gui/TextView.hx +++ b/haxework/gui/TextView.hx @@ -144,27 +144,31 @@ class TextView extends SpriteView implements ITextView { 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; + } + } + } + } diff --git a/haxework/gui/list/HListView.hx b/haxework/gui/list/HListView.hx index bf074b7..c85c050 100755 --- a/haxework/gui/list/HListView.hx +++ b/haxework/gui/list/HListView.hx @@ -18,8 +18,8 @@ class HListView, D> extends ListView { override private function recalcSize(item:ListItem):Void { var view:IView = 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 { diff --git a/haxework/gui/list/ListView.hx b/haxework/gui/list/ListView.hx index 2f3adf0..13d6970 100755 --- a/haxework/gui/list/ListView.hx +++ b/haxework/gui/list/ListView.hx @@ -12,7 +12,7 @@ import haxework.gui.core.HAlign; import flash.display.Sprite; import haxework.gui.skin.ISkin; -class ListView, D> extends GroupView implements ScrollListener { +class ListView, D> extends GroupView implements ScrollListener { public var data(default, set):Array; public var renderer(null, set):IRenderer; @@ -26,9 +26,15 @@ class ListView, D> extends GroupView implements ScrollListener { public var dispatcher(default, null):IDispatcher>; 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; + public var selected(default, set):Array; + + private var main:GroupView; private var container:GroupView; private var mask:SpriteView; private var itemSize:Float; @@ -38,10 +44,16 @@ class ListView, 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, D> extends GroupView implements ScrollListener { offset = 0; offsetDiff = 0; sizeDiff = 0; - items = new Array>(); + items = []; itemsListeners = new Map, MouseEvent->Void>(); + selected = []; content.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent); } @@ -73,6 +86,36 @@ class ListView, 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, 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, D> extends GroupView implements ScrollListener { return filter; } + private function set_selected(value:Array):Array { + if (selected != value) { + selected = value; + invalidate(); + } + return selected; + } + private function set_renderer(value:IRenderer):IRenderer { renderer = value; render(); diff --git a/haxework/gui/list/VListView.hx b/haxework/gui/list/VListView.hx index 1eb30af..80e863f 100755 --- a/haxework/gui/list/VListView.hx +++ b/haxework/gui/list/VListView.hx @@ -18,8 +18,8 @@ class VListView, D> extends ListView { override private function recalcSize(item:ListItem):Void { var view:IView = 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 { diff --git a/haxework/gui/skin/ButtonColorSkin.hx b/haxework/gui/skin/ButtonColorSkin.hx index 9b3f9ed..5ac92df 100755 --- a/haxework/gui/skin/ButtonColorSkin.hx +++ b/haxework/gui/skin/ButtonColorSkin.hx @@ -9,6 +9,7 @@ class ButtonColorSkin implements ISkin { public var color(default, set_color):Int; private var colors:Map; + private var disable:Int; public function new(?color:Int = 0xffffff) { this.color = color; @@ -19,12 +20,12 @@ class ButtonColorSkin implements ISkin { 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); diff --git a/haxework/net/manage/LoaderManager.hx b/haxework/net/manage/LoaderManager.hx index f65a247..6691daf 100755 --- a/haxework/net/manage/LoaderManager.hx +++ b/haxework/net/manage/LoaderManager.hx @@ -29,7 +29,7 @@ class LoaderManager implements ILoaderManager { public function release(loader:ILoader):Void { actives.remove(loader); - if (queue.length > 0 && actives.length == 0) { + if (queue.length > 0 && actives.length < limit) { run(queue.shift()); } } diff --git a/haxework/utils/UrlUtil.hx b/haxework/utils/UrlUtil.hx index 16da86f..3cac859 100755 --- a/haxework/utils/UrlUtil.hx +++ b/haxework/utils/UrlUtil.hx @@ -4,7 +4,7 @@ class UrlUtil { public static function parseParams(url:String):Map { var result:Map = new Map(); - var tmp:String = url.split("?")[1]; + var tmp:String = url == null ? null : url.split("?")[1]; if (tmp != null) { var tmpArr:Array = tmp.split("&"); for (item in tmpArr) {