-
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user