This commit is contained in:
2014-01-30 12:02:14 +04:00
parent fde2420c6e
commit c46a0a4b76
4 changed files with 34 additions and 17 deletions

View File

@@ -13,8 +13,8 @@ enum ButtonState {
class ButtonView extends LabelView { class ButtonView extends LabelView {
public var state(get, null):ButtonState; public var state(get, null):ButtonState;
public var dispatcher(default, null):IDispatcher<ButtonViewListener>; public var dispatcher(default, null):IDispatcher<ButtonViewListener<Dynamic>>;
public var onPress(null, set):ButtonViewListener; public var onPress(null, set):ButtonViewListener<Dynamic>;
private var overed:Bool; private var overed:Bool;
private var downed:Bool; private var downed:Bool;
@@ -24,7 +24,7 @@ class ButtonView extends LabelView {
overed = false; overed = false;
downed = false; downed = false;
state = ButtonState.UP; state = ButtonState.UP;
dispatcher = new Dispatcher<ButtonViewListener>(); dispatcher = new Dispatcher<ButtonViewListener<Dynamic>>();
content.buttonMode = true; content.buttonMode = true;
content.mouseChildren = false; content.mouseChildren = false;
content.addEventListener(MouseEvent.CLICK, onMouseClick); content.addEventListener(MouseEvent.CLICK, onMouseClick);
@@ -61,7 +61,7 @@ class ButtonView extends LabelView {
invalidate(); invalidate();
} }
private function pressCaller(listener:ButtonViewListener):Void { private function pressCaller(listener:ButtonViewListener<Dynamic>):Void {
listener.onPress(this); listener.onPress(this);
} }
@@ -69,7 +69,7 @@ class ButtonView extends LabelView {
return (downed && overed) ? ButtonState.DOWN : overed ? ButtonState.OVER : ButtonState.UP; return (downed && overed) ? ButtonState.DOWN : overed ? ButtonState.OVER : ButtonState.UP;
} }
private function set_onPress(value:ButtonViewListener):ButtonViewListener { private function set_onPress(value:ButtonViewListener<Dynamic>):ButtonViewListener<Dynamic> {
dispatcher.addListener(value); dispatcher.addListener(value);
return value; return value;
} }
@@ -83,6 +83,6 @@ class ButtonView extends LabelView {
} }
} }
typedef ButtonViewListener = { typedef ButtonViewListener<V:ButtonView> = {
public function onPress(view:ButtonView):Void; public function onPress(view:V):Void;
} }

View File

@@ -26,6 +26,9 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
public var dispatcher(default, null):IDispatcher<ListViewListener<V, D>>; public var dispatcher(default, null):IDispatcher<ListViewListener<V, D>>;
public var scroll(default, set):ScrollView; public var scroll(default, set):ScrollView;
public var filter(default, set):D->Bool;
private var filteredData:Array<D>;
private var container:GroupView; private var container:GroupView;
private var mask:SpriteView; private var mask:SpriteView;
private var itemSize:Float; private var itemSize:Float;
@@ -71,7 +74,7 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
} }
public function onScroll(position:Float):Void { public function onScroll(position:Float):Void {
var x:Float = data.length * position; var x:Float = filteredData.length * position;
offset = Math.round(x) - 1; offset = Math.round(x) - 1;
offsetDiff = (x - offset); offsetDiff = (x - offset);
} }
@@ -85,7 +88,7 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
private function onMouseWheel(value:Int):Void {} private function onMouseWheel(value:Int):Void {}
private function set_offset(value:Int):Int { private function set_offset(value:Int):Int {
value = NumberUtil.limitInt(value, 0, data == null ? 0 : data.length - size); value = NumberUtil.limitInt(value, 0, filteredData == null ? 0 : filteredData.length - size);
if (offset != value) { if (offset != value) {
offset = value; offset = value;
render(); render();
@@ -99,22 +102,35 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
return data; return data;
} }
private function set_filter(value:D->Bool):D->Bool {
if (filter != value) {
filter = value;
render();
}
return filter;
}
private function set_renderer(value:IRenderer<Dynamic, V, D>):IRenderer<Dynamic, V, D> { private function set_renderer(value:IRenderer<Dynamic, V, D>):IRenderer<Dynamic, V, D> {
renderer = value; renderer = value;
render(); render();
return renderer; return renderer;
} }
private function render():Void { public function render():Void {
if (data != null && renderer != null) { if (data != null && renderer != null) {
scroll.ratio = Math.min(1.0, (size - sizeDiff) / data.length); filteredData = filter == null ? data : data.filter(filter);
scroll.position = (offset / data.length); scroll.ratio = Math.min(1.0, (size - sizeDiff) / filteredData.length);
scroll.position = (offset / filteredData.length);
for (i in 0...size) { for (i in 0...size) {
var item:ListItem<V, D> = items[i]; var item:ListItem<V, D> = items[i];
item.index = offset + i; item.index = offset + i;
if (data[item.index] == null) break; if (filteredData[item.index] == null) {
item.data = data[item.index]; item.view.visible = false;
renderer.render(this, item); } else {
item.view.visible = true;
item.data = filteredData[item.index];
renderer.render(this, item);
}
} }
} }
} }

View File

@@ -56,6 +56,7 @@ class Callback<T> implements ICallback<T> {
public function glue(callback:ICallback<T>):ICallback<T> { public function glue(callback:ICallback<T>):ICallback<T> {
this._success = callback.callSuccess; this._success = callback.callSuccess;
this._fail = callback.callFail; this._fail = callback.callFail;
callback.dispose();
return this; return this;
} }

View File

@@ -3,10 +3,10 @@ package haxework.utils;
class NumberUtil { class NumberUtil {
public static inline function limitInt(value:Int, min:Int, max:Int):Int { public static inline function limitInt(value:Int, min:Int, max:Int):Int {
return Math.round(Math.min(Math.max(min, value), max)); return Math.round(Math.max(Math.min(max, value), min));
} }
public static inline function limitFloat(value:Float, min:Float, max:Float):Float { public static inline function limitFloat(value:Float, min:Float, max:Float):Float {
return Math.min(Math.max(min, value), max); return Math.max(Math.min(max, value), min);
} }
} }