From bdced9a80920fcd11129313720f2d19190019c73 Mon Sep 17 00:00:00 2001 From: shmyga Date: Mon, 7 Jul 2014 13:54:32 +0400 Subject: [PATCH] - --- haxework/gui/GuiBuilder.hx | 1 + haxework/gui/list/HListView.hx | 8 ++-- haxework/gui/list/ListView.hx | 72 ++++++++++++++-------------------- haxework/gui/list/VListView.hx | 8 ++-- 4 files changed, 39 insertions(+), 50 deletions(-) diff --git a/haxework/gui/GuiBuilder.hx b/haxework/gui/GuiBuilder.hx index 8c9d829..3781394 100755 --- a/haxework/gui/GuiBuilder.hx +++ b/haxework/gui/GuiBuilder.hx @@ -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"); diff --git a/haxework/gui/list/HListView.hx b/haxework/gui/list/HListView.hx index c85c050..cbdb867 100755 --- a/haxework/gui/list/HListView.hx +++ b/haxework/gui/list/HListView.hx @@ -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, D> extends ListView { +class HListView extends ListView { public function new() { super(new HorizontalLayout(), new VerticalLayout()); @@ -15,8 +15,8 @@ class HListView, D> extends ListView { container.layoutVAlign = VAlign.MIDDLE; } - override private function recalcSize(item:ListItem):Void { - var view:IView = item.view; + override private function recalcSize(item:IListItemView):Void { + var view:IView = 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); diff --git a/haxework/gui/list/ListView.hx b/haxework/gui/list/ListView.hx index 38e6051..abe1bc6 100755 --- a/haxework/gui/list/ListView.hx +++ b/haxework/gui/list/ListView.hx @@ -12,10 +12,10 @@ import haxework.gui.core.HAlign; import flash.display.Sprite; import haxework.gui.skin.ISkin; -class ListView, D> extends GroupView implements ScrollListener { +class ListView extends GroupView implements ScrollListener { public var data(default, set):Array; - public var renderer(null, set):IRenderer; + public var factory(null, default):Class>; public var offset(default, set):Int; private var offsetDiff(default, set):Float; @@ -23,7 +23,7 @@ class ListView, D> extends GroupView implements ScrollListener private var size(default, set):Int; private var sizeDiff:Float; - public var dispatcher(default, null):IDispatcher>; + public var dispatcher(default, null):IDispatcher>; public var scroll(default, set):ScrollView; public var prev(default, set):ButtonView; @@ -39,8 +39,8 @@ class ListView, D> extends GroupView implements ScrollListener private var mask:SpriteView; private var itemSize:Float; - private var items:Array>; - private var itemsListeners:Map, MouseEvent->Void>; + private var items:Array>; + private var itemsListeners:Map, MouseEvent->Void>; public function new(layout:ILayout, otherLayout:ILayout) { super(otherLayout); @@ -61,13 +61,13 @@ class ListView, D> extends GroupView implements ScrollListener mask.skin = new ColorSkin(0xffffff); container.content.mask = mask.content; container.addView(mask); - dispatcher = new Dispatcher>(); + dispatcher = new Dispatcher>(); itemSize = 0; offset = 0; offsetDiff = 0; sizeDiff = 0; items = []; - itemsListeners = new Map, MouseEvent->Void>(); + itemsListeners = new Map, MouseEvent->Void>(); selected = []; content.addEventListener(MouseEvent.MOUSE_WHEEL, onMouseWheelEvent); } @@ -166,26 +166,20 @@ class ListView, D> extends GroupView implements ScrollListener return selected; } - private function set_renderer(value:IRenderer):IRenderer { - 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 = items[i]; - item.index = offset + i; - if (filteredData[item.index] == null) { - item.view.visible = false; + var item:IListItemView = 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, 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):Void {} + private function recalcSize(item:IListItemView):Void {} private function set_size(value:Int):Int { if (size != value) { @@ -205,17 +199,17 @@ class ListView, D> extends GroupView implements ScrollListener var diff:Int = size - items.length; if (diff > 0) { for (i in 0...diff) { - var item:ListItem = renderer.factory(); + var item:IListItemView = 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 = items.pop(); - item.view.content.removeEventListener(MouseEvent.CLICK, itemsListeners.get(item)); + var item:IListItemView = 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, D> extends GroupView implements ScrollListener return offsetDiff; } - private function setClickListener(item:ListItem):Void { + private function setClickListener(item:IListItemView):Void { var listener:MouseEvent->Void = function(event:MouseEvent):Void { - dispatcher.dispatch(function(listener:ListViewListener):Void { + dispatcher.dispatch(function(listener:ListViewListener):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, D> extends GroupView implements ScrollListener } } -interface IRenderer { - public function factory():ListItem; - public function render(list:L, item:ListItem):Void; +interface IListItemView extends IView { + public var item_index(default, default):Int; + public var data(default, set):D; } -interface ListViewListener { - public function onListItemClick(item:ListItem):Void; -} - -typedef ListItem = { - var view:V; - @:optional var index:Int; - @:optional var data:D; +interface ListViewListener { + public function onListItemClick(item:IListItemView):Void; } diff --git a/haxework/gui/list/VListView.hx b/haxework/gui/list/VListView.hx index 80e863f..5419fad 100755 --- a/haxework/gui/list/VListView.hx +++ b/haxework/gui/list/VListView.hx @@ -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, D> extends ListView { +class VListView extends ListView { public function new() { super(new VerticalLayout(), new HorizontalLayout()); @@ -15,8 +15,8 @@ class VListView, D> extends ListView { container.layoutVAlign = VAlign.TOP; } - override private function recalcSize(item:ListItem):Void { - var view:IView = item.view; + override private function recalcSize(item:IListItemView):Void { + var view:IView = 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);