Skip to content

Commit a1b0508

Browse files
committed
Merge branch 'master' of https://github.com/haxeui/haxeui-core
2 parents 2c302f6 + 932b07f commit a1b0508

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

haxe/ui/containers/Box.hx

+34-8
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class Box extends Component implements IDataComponent {
3232
**/
3333
@:clonable @:behaviour(DefaultBehaviour) public var icon:Variant;
3434
@:clonable @:behaviour(DataSourceBehaviour) public var dataSource:DataSource<Dynamic>;
35+
@:clonable @:behaviour(DefaultBehaviour, true) public var cacheItemRenderers:Bool;
3536

3637
@:noCompletion private var _layoutName:String;
3738
@:clonable public var layoutName(get, set):String;
@@ -76,11 +77,11 @@ class Box extends Component implements IDataComponent {
7677
_defaultLayoutClass = DefaultLayout;
7778
}
7879
}
79-
80+
8081
@:noCompletion private var _direction:String = null;
8182
private override function applyStyle(style:Style) {
8283
super.applyStyle(style);
83-
84+
8485
if (style.direction != null && style.direction != _direction) {
8586
_direction = style.direction;
8687
this.layout = LayoutFactory.createFromName(_direction);
@@ -99,6 +100,7 @@ class Box extends Component implements IDataComponent {
99100
//***********************************************************************************************************
100101
private class Builder extends CompositeBuilder {
101102
private var _box:Box;
103+
private var _cachedItemRenderers:Array<ItemRenderer>;
102104

103105
public function new(box:Box) {
104106
super(box);
@@ -143,36 +145,60 @@ private class Builder extends CompositeBuilder {
143145
_box.itemRenderer.handleVisibility(false);
144146
}
145147

148+
var childRenderers = _component.findComponents(ItemRenderer, 1);
149+
146150
for (i in 0...dataSource.size) {
147151
var item = dataSource.get(i);
148-
var renderer = findRenderer(item);
152+
var renderer = findRenderer(item, childRenderers);
153+
if (renderer == null && _box.cacheItemRenderers && _cachedItemRenderers != null) {
154+
renderer = findRenderer(item, _cachedItemRenderers);
155+
if (renderer != null){
156+
_cachedItemRenderers.remove(item);
157+
_box.addComponent(renderer);
158+
}
159+
}
149160
if (renderer == null) {
150161
renderer = itemRenderer.cloneComponent();
151162
_box.addComponent(renderer);
152163
}
164+
153165
renderer.itemIndex = i;
154166
_box.setComponentIndex(renderer, i);
155167
renderer.data = item;
156168
}
157-
158-
for (child in _component.findComponents(ItemRenderer)) {
169+
for (child in childRenderers) {
159170
if (child == _box.itemRenderer) {
160171
continue;
161172
}
162173
if (dataSource.indexOf(child.data) == -1) {
163-
_box.removeComponent(child);
174+
_box.removeComponent(child, !_box.cacheItemRenderers);
175+
if (_box.cacheItemRenderers) {
176+
if (_cachedItemRenderers == null){
177+
_cachedItemRenderers = [];
178+
}
179+
_cachedItemRenderers.push(child);
180+
}
164181
}
165182
}
166183
}
167184

168-
private function findRenderer(data:Dynamic):ItemRenderer {
169-
for (child in _component.findComponents(ItemRenderer)) {
185+
private function findRenderer(data:Dynamic, renderers:Array<ItemRenderer>):ItemRenderer {
186+
for (child in renderers) {
170187
if (child.data == data) {
171188
return child;
172189
}
173190
}
174191
return null;
175192
}
193+
194+
public override function destroy() {
195+
if (_cachedItemRenderers != null) {
196+
for (itemRenderer in _cachedItemRenderers) {
197+
itemRenderer.disposeComponent();
198+
}
199+
}
200+
super.destroy();
201+
}
176202
}
177203

178204
//***********************************************************************************************************

0 commit comments

Comments
 (0)