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")) { if (Reflect.hasField(data, "type")) {
var type:String = data.type; var type:String = data.type;
//Reflect.deleteField(data, "type"); //Reflect.deleteField(data, "type");
if (type.charAt(0) == "~") return Type.resolveClass(type.substr(1));
var object:Dynamic = instance(type); var object:Dynamic = instance(type);
new GuiF(object, data, links, includes).fill(); new GuiF(object, data, links, includes).fill();
var initMethod:Dynamic = Reflect.field(object, "init"); var initMethod:Dynamic = Reflect.field(object, "init");

View File

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

View File

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

View File

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