This commit is contained in:
2014-07-07 13:54:32 +04:00
parent 1e734e06d6
commit bdced9a809
4 changed files with 39 additions and 50 deletions

View File

@@ -56,6 +56,7 @@ class GuiB {
if (Reflect.hasField(data, "type")) {
var type:String = data.type;
//Reflect.deleteField(data, "type");
if (type.charAt(0) == "~") return Type.resolveClass(type.substr(1));
var object:Dynamic = instance(type);
new GuiF(object, data, links, includes).fill();
var initMethod:Dynamic = Reflect.field(object, "init");

View File

@@ -1,13 +1,13 @@
package haxework.gui.list;
import haxework.gui.list.ListView.IListItemView;
import haxework.gui.core.HAlign;
import haxework.gui.layout.VerticalLayout;
import haxework.gui.list.ListView.ListItem;
import haxework.gui.list.HScrollView;
import haxework.gui.core.VAlign;
import haxework.gui.layout.HorizontalLayout;
class HListView<V:View<Dynamic>, D> extends ListView<V, D> {
class HListView<D> extends ListView<D> {
public function new() {
super(new HorizontalLayout(), new VerticalLayout());
@@ -15,8 +15,8 @@ class HListView<V:View<Dynamic>, D> extends ListView<V, D> {
container.layoutVAlign = VAlign.MIDDLE;
}
override private function recalcSize(item:ListItem<V, D>):Void {
var view:IView<Dynamic> = item.view;
override private function recalcSize(item:IListItemView<D>):Void {
var view:IView<Dynamic> = item;
itemSize = view.width + view.leftMargin + view.rightMargin + container.layoutMargin;
size = Math.ceil(Math.max(0, container.width / itemSize)) + 2;
sizeDiff = size - ((container.width - container.layoutMargin - 1) / itemSize);

View File

@@ -12,10 +12,10 @@ import haxework.gui.core.HAlign;
import flash.display.Sprite;
import haxework.gui.skin.ISkin;
class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener {
class ListView<D> extends GroupView implements ScrollListener {
public var data(default, set):Array<D>;
public var renderer(null, set):IRenderer<Dynamic, V, D>;
public var factory(null, default):Class<IListItemView<D>>;
public var offset(default, set):Int;
private var offsetDiff(default, set):Float;
@@ -23,7 +23,7 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
private var size(default, set):Int;
private var sizeDiff:Float;
public var dispatcher(default, null):IDispatcher<ListViewListener<V, D>>;
public var dispatcher(default, null):IDispatcher<ListViewListener<D>>;
public var scroll(default, set):ScrollView;
public var prev(default, set):ButtonView;
@@ -39,8 +39,8 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
private var mask:SpriteView;
private var itemSize:Float;
private var items:Array<ListItem<V, D>>;
private var itemsListeners:Map<ListItem<V, D>, MouseEvent->Void>;
private var items:Array<IListItemView<D>>;
private var itemsListeners:Map<IListItemView<D>, MouseEvent->Void>;
public function new(layout:ILayout, otherLayout:ILayout) {
super(otherLayout);
@@ -61,13 +61,13 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
mask.skin = new ColorSkin(0xffffff);
container.content.mask = mask.content;
container.addView(mask);
dispatcher = new Dispatcher<ListViewListener<V, D>>();
dispatcher = new Dispatcher<ListViewListener<D>>();
itemSize = 0;
offset = 0;
offsetDiff = 0;
sizeDiff = 0;
items = [];
itemsListeners = new Map<ListItem<V, D>, MouseEvent->Void>();
itemsListeners = new Map<IListItemView<D>, MouseEvent->Void>();
selected = [];
content.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent);
}
@@ -166,26 +166,20 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
return selected;
}
private function set_renderer(value:IRenderer<Dynamic, V, D>):IRenderer<Dynamic, V, D> {
renderer = value;
render();
return renderer;
}
public function render():Void {
if (data != null && renderer != null) {
if (data != null && factory != null) {
filteredData = filter == null ? data : data.filter(filter);
scroll.ratio = Math.min(1.0, (size - sizeDiff) / filteredData.length);
scroll.position = ((offset + offsetDiff) / filteredData.length);
for (i in 0...size) {
var item:ListItem<V, D> = items[i];
item.index = offset + i;
if (filteredData[item.index] == null) {
item.view.visible = false;
var item:IListItemView<D> = items[i];
var index = offset + i;
if (filteredData[index] == null) {
item.visible = false;
} else {
item.view.visible = true;
item.data = filteredData[item.index];
renderer.render(this, item);
item.visible = true;
item.item_index = index;
item.data = filteredData[item.item_index];
}
}
}
@@ -193,11 +187,11 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
override public function update():Void {
super.update();
recalcSize(renderer.factory());
recalcSize(Type.createInstance(factory, []));
render();
}
private function recalcSize(item:ListItem<V, D>):Void {}
private function recalcSize(item:IListItemView<D>):Void {}
private function set_size(value:Int):Int {
if (size != value) {
@@ -205,17 +199,17 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
var diff:Int = size - items.length;
if (diff > 0) {
for (i in 0...diff) {
var item:ListItem<V, D> = renderer.factory();
var item:IListItemView<D> = Type.createInstance(factory, []);
items.push(item);
setClickListener(item);
container.addView(item.view);
container.addView(item);
}
} else if (diff < 0) {
for (i in 0...-diff) {
var item:ListItem<V, D> = items.pop();
item.view.content.removeEventListener(MouseEvent.CLICK, itemsListeners.get(item));
var item:IListItemView<D> = items.pop();
item.content.removeEventListener(MouseEvent.CLICK, itemsListeners.get(item));
itemsListeners.remove(item);
container.removeView(item.view);
container.removeView(item);
}
}
}
@@ -227,13 +221,13 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
return offsetDiff;
}
private function setClickListener(item:ListItem<V, D>):Void {
private function setClickListener(item:IListItemView<D>):Void {
var listener:MouseEvent->Void = function(event:MouseEvent):Void {
dispatcher.dispatch(function(listener:ListViewListener<V, D>):Void {
dispatcher.dispatch(function(listener:ListViewListener<D>):Void {
listener.onListItemClick(item);
});
}
item.view.content.addEventListener(MouseEvent.CLICK, listener);
item.content.addEventListener(MouseEvent.CLICK, listener);
itemsListeners.set(item, listener);
}
@@ -242,18 +236,12 @@ class ListView<V:IView<Dynamic>, D> extends GroupView implements ScrollListener
}
}
interface IRenderer<L, V, D> {
public function factory():ListItem<V, D>;
public function render(list:L, item:ListItem<V, D>):Void;
interface IListItemView<D> extends IView<Sprite> {
public var item_index(default, default):Int;
public var data(default, set):D;
}
interface ListViewListener<V, D> {
public function onListItemClick(item:ListItem<V, D>):Void;
}
typedef ListItem<V, D> = {
var view:V;
@:optional var index:Int;
@:optional var data:D;
interface ListViewListener<D> {
public function onListItemClick(item:IListItemView<D>):Void;
}

View File

@@ -1,13 +1,13 @@
package haxework.gui.list;
import haxework.gui.list.ListView.IListItemView;
import haxework.gui.core.VAlign;
import haxework.gui.list.ListView.ListItem;
import haxework.gui.layout.VerticalLayout;
import haxework.gui.list.VScrollView;
import haxework.gui.core.HAlign;
import haxework.gui.layout.HorizontalLayout;
class VListView<V:View<Dynamic>, D> extends ListView<V, D> {
class VListView<D> extends ListView<D> {
public function new() {
super(new VerticalLayout(), new HorizontalLayout());
@@ -15,8 +15,8 @@ class VListView<V:View<Dynamic>, D> extends ListView<V, D> {
container.layoutVAlign = VAlign.TOP;
}
override private function recalcSize(item:ListItem<V, D>):Void {
var view:IView<Dynamic> = item.view;
override private function recalcSize(item:IListItemView<D>):Void {
var view:IView<Dynamic> = item;
itemSize = view.height + view.topMargin + view.bottomMargin + container.layoutMargin;
size = Math.ceil(Math.max(0, container.height / itemSize)) + 2;
sizeDiff = size - ((container.height - container.layoutMargin - 1) / itemSize);