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 {
public var state(get, null):ButtonState;
public var dispatcher(default, null):IDispatcher<ButtonViewListener>;
public var onPress(null, set):ButtonViewListener;
public var dispatcher(default, null):IDispatcher<ButtonViewListener<Dynamic>>;
public var onPress(null, set):ButtonViewListener<Dynamic>;
private var overed:Bool;
private var downed:Bool;
@@ -24,7 +24,7 @@ class ButtonView extends LabelView {
overed = false;
downed = false;
state = ButtonState.UP;
dispatcher = new Dispatcher<ButtonViewListener>();
dispatcher = new Dispatcher<ButtonViewListener<Dynamic>>();
content.buttonMode = true;
content.mouseChildren = false;
content.addEventListener(MouseEvent.CLICK, onMouseClick);
@@ -61,7 +61,7 @@ class ButtonView extends LabelView {
invalidate();
}
private function pressCaller(listener:ButtonViewListener):Void {
private function pressCaller(listener:ButtonViewListener<Dynamic>):Void {
listener.onPress(this);
}
@@ -69,7 +69,7 @@ class ButtonView extends LabelView {
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);
return value;
}
@@ -83,6 +83,6 @@ class ButtonView extends LabelView {
}
}
typedef ButtonViewListener = {
public function onPress(view:ButtonView):Void;
typedef ButtonViewListener<V:ButtonView> = {
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 scroll(default, set):ScrollView;
public var filter(default, set):D->Bool;
private var filteredData:Array<D>;
private var container:GroupView;
private var mask:SpriteView;
private var itemSize:Float;
@@ -71,7 +74,7 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
}
public function onScroll(position:Float):Void {
var x:Float = data.length * position;
var x:Float = filteredData.length * position;
offset = Math.round(x) - 1;
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 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) {
offset = value;
render();
@@ -99,22 +102,35 @@ class ListView<V:View<Dynamic>, D> extends GroupView implements ScrollListener {
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> {
renderer = value;
render();
return renderer;
}
private function render():Void {
public function render():Void {
if (data != null && renderer != null) {
scroll.ratio = Math.min(1.0, (size - sizeDiff) / data.length);
scroll.position = (offset / data.length);
filteredData = filter == null ? data : data.filter(filter);
scroll.ratio = Math.min(1.0, (size - sizeDiff) / filteredData.length);
scroll.position = (offset / filteredData.length);
for (i in 0...size) {
var item:ListItem<V, D> = items[i];
item.index = offset + i;
if (data[item.index] == null) break;
item.data = data[item.index];
renderer.render(this, item);
if (filteredData[item.index] == null) {
item.view.visible = false;
} 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> {
this._success = callback.callSuccess;
this._fail = callback.callFail;
callback.dispose();
return this;
}

View File

@@ -3,10 +3,10 @@ package haxework.utils;
class NumberUtil {
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 {
return Math.min(Math.max(min, value), max);
return Math.max(Math.min(max, value), min);
}
}