Skip to content

Commit

Permalink
Data Containers: add support for String items on all targets, where i…
Browse files Browse the repository at this point in the history
…t makes some sense

Previously, it worked on some targets, but not others, due to how ObjectMap is implemented. now checks for String and uses StringMap for those items
  • Loading branch information
joshtynjala committed Apr 17, 2024
1 parent c71e634 commit fb4fa5b
Show file tree
Hide file tree
Showing 5 changed files with 249 additions and 51 deletions.
54 changes: 43 additions & 11 deletions src/feathers/controls/ButtonBar.hx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

package feathers.controls;

import feathers.events.FeathersEvent;
import feathers.controls.dataRenderers.IDataRenderer;
import feathers.core.FeathersControl;
import feathers.core.IUIControl;
Expand All @@ -17,6 +16,7 @@ import feathers.core.InvalidationFlag;
import feathers.data.ButtonBarItemState;
import feathers.data.IFlatCollection;
import feathers.events.ButtonBarEvent;
import feathers.events.FeathersEvent;
import feathers.events.FlatCollectionEvent;
import feathers.events.TriggerEvent;
import feathers.layout.ILayout;
Expand All @@ -27,6 +27,7 @@ import feathers.skins.IProgrammaticSkin;
import feathers.utils.AbstractDisplayObjectRecycler;
import feathers.utils.DisplayObjectRecycler;
import haxe.ds.ObjectMap;
import haxe.ds.StringMap;
import openfl.display.DisplayObject;
import openfl.errors.IllegalOperationError;
import openfl.events.Event;
Expand Down Expand Up @@ -307,7 +308,8 @@ class ButtonBar extends FeathersControl {

private var _defaultStorage:ButtonStorage = new ButtonStorage(null, DisplayObjectRecycler.withClass(Button));
private var _additionalStorage:Array<ButtonStorage> = null;
private var dataToButton = new ObjectMap<Dynamic, Button>();
private var objectDataToButton = new ObjectMap<Dynamic, Button>();
private var stringDataToButton = new StringMap<Button>();
private var buttonToItemState = new ObjectMap<Button, ButtonBarItemState>();
private var itemStatePool = new ObjectPool(() -> new ButtonBarItemState());
private var _unrenderedData:Array<Dynamic> = [];
Expand Down Expand Up @@ -444,7 +446,10 @@ class ButtonBar extends FeathersControl {
if (item == null) {
return null;
}
return this.dataToButton.get(item);
if ((item is String)) {
return this.stringDataToButton.get(cast item);
}
return this.objectDataToButton.get(item);
}

/**
Expand All @@ -459,7 +464,10 @@ class ButtonBar extends FeathersControl {
return null;
}
var item = this._dataProvider.get(index);
return this.dataToButton.get(item);
if ((item is String)) {
return this.stringDataToButton.get(cast item);
}
return this.objectDataToButton.get(item);
}

/**
Expand All @@ -472,9 +480,14 @@ class ButtonBar extends FeathersControl {
return null;
}
var itemState:ButtonBarItemState = null;
var tab = this.dataToButton.get(item);
if (tab != null) {
itemState = this.buttonToItemState.get(tab);
var button:Button = null;
if ((item is String)) {
button = this.stringDataToButton.get(cast item);
} else {
button = this.objectDataToButton.get(item);
}
if (button != null) {
itemState = this.buttonToItemState.get(button);
} else {
var index = this._dataProvider.indexOf(item);
if (index == -1) {
Expand Down Expand Up @@ -682,7 +695,11 @@ class ButtonBar extends FeathersControl {
}
var item = state.data;
this.buttonToItemState.remove(button);
this.dataToButton.remove(item);
if ((item is String)) {
this.stringDataToButton.remove(cast item);
} else {
this.objectDataToButton.remove(item);
}
button.removeEventListener(TriggerEvent.TRIGGER, buttonBar_button_triggerHandler);
this.resetButton(button, state);
this.itemStatePool.release(state);
Expand Down Expand Up @@ -790,7 +807,12 @@ class ButtonBar extends FeathersControl {
var depthOffset = this._currentBackgroundSkin != null ? 1 : 0;
for (i in 0...this._dataProvider.length) {
var item = this._dataProvider.get(i);
var button = this.dataToButton.get(item);
var button:Button = null;
if ((item is String)) {
button = this.stringDataToButton.get(cast item);
} else {
button = this.objectDataToButton.get(item);
}
if (button != null) {
var state = this.buttonToItemState.get(button);
var changed = this.populateCurrentItemState(item, i, state, this._forceItemStateUpdate);
Expand Down Expand Up @@ -852,7 +874,12 @@ class ButtonBar extends FeathersControl {
this.updateButton(button, state, storage);
button.addEventListener(TriggerEvent.TRIGGER, buttonBar_button_triggerHandler);
this.buttonToItemState.set(button, state);
this.dataToButton.set(state.data, button);
var item = state.data;
if ((item is String)) {
this.stringDataToButton.set(cast item, button);
} else {
this.objectDataToButton.set(item, button);
}
storage.activeButtons.push(button);
return button;
}
Expand Down Expand Up @@ -975,7 +1002,12 @@ class ButtonBar extends FeathersControl {

private function updateButtonForIndex(index:Int):Void {
var item = this._dataProvider.get(index);
var button = this.dataToButton.get(item);
var button:Button = null;
if ((item is String)) {
button = this.stringDataToButton.get(cast item);
} else {
button = this.objectDataToButton.get(item);
}
if (button == null) {
// doesn't exist yet, so we need to do a full invalidation
this.setInvalid(DATA);
Expand Down
62 changes: 52 additions & 10 deletions src/feathers/controls/GroupListView.hx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import feathers.style.IVariantStyleObject;
import feathers.utils.AbstractDisplayObjectRecycler;
import feathers.utils.DisplayObjectRecycler;
import haxe.ds.ObjectMap;
import haxe.ds.StringMap;
import openfl.display.DisplayObject;
import openfl.errors.ArgumentError;
import openfl.errors.IllegalOperationError;
Expand Down Expand Up @@ -738,7 +739,8 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
private var _defaultHeaderStorage = new ItemRendererStorage(HEADER, null, DisplayObjectRecycler.withClass(ItemRenderer));
private var _additionalItemStorage:Array<ItemRendererStorage> = null;
private var _additionalHeaderStorage:Array<ItemRendererStorage> = null;
private var dataToItemRenderer = new ObjectMap<Dynamic, DisplayObject>();
private var objectDataToItemRenderer = new ObjectMap<Dynamic, DisplayObject>();
private var stringDataToItemRenderer = new StringMap<DisplayObject>();
private var itemRendererToItemState = new ObjectMap<DisplayObject, GroupListViewItemState>();
private var itemStatePool = new ObjectPool(() -> new GroupListViewItemState());
private var _unrenderedLocations:Array<Array<Int>> = [];
Expand Down Expand Up @@ -933,7 +935,10 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
if (item == null) {
return null;
}
return this.dataToItemRenderer.get(item);
if ((item is String)) {
return this.stringDataToItemRenderer.get(cast item);
}
return this.objectDataToItemRenderer.get(item);
}

/**
Expand Down Expand Up @@ -970,7 +975,10 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
return null;
}
var item = this._dataProvider.get(location);
return this.dataToItemRenderer.get(item);
if ((item is String)) {
return this.stringDataToItemRenderer.get(cast item);
}
return this.objectDataToItemRenderer.get(item);
}

/**
Expand Down Expand Up @@ -1087,7 +1095,12 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
return null;
}
var itemState:GroupListViewItemState = null;
var itemRenderer = this.dataToItemRenderer.get(item);
var itemRenderer:DisplayObject = null;
if ((item is String)) {
itemRenderer = this.stringDataToItemRenderer.get(cast item);
} else {
itemRenderer = this.objectDataToItemRenderer.get(item);
}
if (itemRenderer != null) {
itemState = this.itemRendererToItemState.get(itemRenderer);
} else {
Expand Down Expand Up @@ -1344,7 +1357,11 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
}
var item = state.data;
this.itemRendererToItemState.remove(itemRenderer);
this.dataToItemRenderer.remove(item);
if ((item is String)) {
this.stringDataToItemRenderer.remove(cast item);
} else {
this.objectDataToItemRenderer.remove(item);
}
if (storage.type == STANDARD) {
itemRenderer.removeEventListener(TriggerEvent.TRIGGER, groupListView_itemRenderer_triggerHandler);
itemRenderer.removeEventListener(MouseEvent.CLICK, groupListView_itemRenderer_clickHandler);
Expand Down Expand Up @@ -1438,7 +1455,12 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
}

private function findItemRenderer(item:Dynamic, location:Array<Int>, layoutIndex:Int):Void {
var itemRenderer = this.dataToItemRenderer.get(item);
var itemRenderer:DisplayObject = null;
if ((item is String)) {
itemRenderer = this.stringDataToItemRenderer.get(cast item);
} else {
itemRenderer = this.objectDataToItemRenderer.get(item);
}
if (itemRenderer == null) {
this._unrenderedLocations.push(location);
this._unrenderedLayoutIndices.push(layoutIndex);
Expand Down Expand Up @@ -1543,7 +1565,12 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
itemRenderer.addEventListener(Event.RESIZE, groupListView_itemRenderer_resizeHandler);
}
this.itemRendererToItemState.set(itemRenderer, state);
this.dataToItemRenderer.set(state.data, itemRenderer);
var item = state.data;
if ((item is String)) {
this.stringDataToItemRenderer.set(cast item, itemRenderer);
} else {
this.objectDataToItemRenderer.set(item, itemRenderer);
}
storage.activeItemRenderers.push(itemRenderer);
return itemRenderer;
}
Expand Down Expand Up @@ -1970,7 +1997,12 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
targetY = result.y;
} else {
var item = this._dataProvider.get(location);
var itemRenderer = this.dataToItemRenderer.get(item);
var itemRenderer:DisplayObject = null;
if ((item is String)) {
itemRenderer = this.stringDataToItemRenderer.get(cast item);
} else {
itemRenderer = this.objectDataToItemRenderer.get(item);
}
if (itemRenderer == null) {
return;
}
Expand Down Expand Up @@ -2026,7 +2058,12 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
}
if (event.keyCode == Keyboard.SPACE || event.keyCode == Keyboard.ENTER) {
if (this._selectedItem != null) {
var itemRenderer = this.dataToItemRenderer.get(this._selectedItem);
var itemRenderer:DisplayObject = null;
if ((this._selectedItem is String)) {
itemRenderer = this.stringDataToItemRenderer.get(cast this._selectedItem);
} else {
itemRenderer = this.objectDataToItemRenderer.get(this._selectedItem);
}
var state:GroupListViewItemState = null;
if (itemRenderer != null) {
state = this.itemRendererToItemState.get(itemRenderer);
Expand Down Expand Up @@ -2206,7 +2243,12 @@ class GroupListView extends BaseScrollContainer implements IDataSelector<Dynamic
}
var item = this._dataProvider.get(location);
var type = location.length == 1 ? HEADER : STANDARD;
var itemRenderer = this.dataToItemRenderer.get(item);
var itemRenderer:DisplayObject = null;
if ((item is String)) {
itemRenderer = this.stringDataToItemRenderer.get(cast item);
} else {
itemRenderer = this.objectDataToItemRenderer.get(item);
}
if (itemRenderer == null) {
// doesn't exist yet, so we need to do a full invalidation
this.setInvalid(DATA);
Expand Down
Loading

0 comments on commit fb4fa5b

Please sign in to comment.