@effindomv2/fui-as 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effindomv2/fui-as",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "license": "AGPL-3.0-only OR LicenseRef-EffinDom-Commercial",
6
6
  "description": "EffinDom v2 AssemblyScript frontend framework SDK and browser harness",
@@ -18,10 +18,48 @@ const POOL_OVERSCAN_ITEMS: i32 = 2;
18
18
 
19
19
  export type VirtualListBinder = (container: FlexBox, index: i32) => void;
20
20
 
21
+ abstract class VirtualListBinderCallback {
22
+ abstract invoke(container: FlexBox, index: i32): void;
23
+ }
24
+
25
+ class FunctionVirtualListBinderCallback extends VirtualListBinderCallback {
26
+ private readonly handler: VirtualListBinder;
27
+
28
+ constructor(handler: VirtualListBinder) {
29
+ super();
30
+ this.handler = handler;
31
+ }
32
+
33
+ invoke(container: FlexBox, index: i32): void {
34
+ this.handler(container, index);
35
+ }
36
+ }
37
+
38
+ class BoundVirtualListBinderCallback<Owner> extends VirtualListBinderCallback {
39
+ private readonly owner: Owner;
40
+ private readonly handler: (owner: Owner, container: FlexBox, index: i32) => void;
41
+
42
+ constructor(owner: Owner, handler: (owner: Owner, container: FlexBox, index: i32) => void) {
43
+ super();
44
+ this.owner = owner;
45
+ this.handler = handler;
46
+ }
47
+
48
+ invoke(container: FlexBox, index: i32): void {
49
+ this.handler(this.owner, container, index);
50
+ }
51
+ }
52
+
53
+ class MissingVirtualListBinderCallback extends VirtualListBinderCallback {
54
+ invoke(_container: FlexBox, _index: i32): void {
55
+ throw new VirtualListItemBindingError();
56
+ }
57
+ }
58
+
21
59
  export class VirtualList extends FlexBox {
22
60
  private totalItemsValue: i32;
23
61
  private readonly itemHeightValue: f32;
24
- private bindItemValue: VirtualListBinder;
62
+ private bindItemValue: VirtualListBinderCallback;
25
63
  private readonly scrollStateValue: ScrollState;
26
64
  private readonly scrollBoxValue: ScrollBox;
27
65
  private readonly contentValue: FlexBox;
@@ -45,9 +83,7 @@ export class VirtualList extends FlexBox {
45
83
  const poolSizeValue = maxVisible > 0 ? maxVisible + POOL_OVERSCAN_ITEMS : POOL_OVERSCAN_ITEMS;
46
84
  this.totalItemsValue = totalItemsValue;
47
85
  this.itemHeightValue = itemHeightValue;
48
- this.bindItemValue = (): void => {
49
- throw new VirtualListItemBindingError();
50
- };
86
+ this.bindItemValue = new MissingVirtualListBinderCallback();
51
87
  this.scrollStateValue = scrollStateValue;
52
88
  this.poolSizeValue = poolSizeValue;
53
89
 
@@ -179,7 +215,7 @@ export class VirtualList extends FlexBox {
179
215
  }
180
216
 
181
217
  onBindItem(renderer: VirtualListBinder): this {
182
- this.bindItemValue = renderer;
218
+ this.bindItemValue = new FunctionVirtualListBinderCallback(renderer);
183
219
  this.currentFirstVisibleIndex = -1;
184
220
  this.currentLastVisibleIndex = -1;
185
221
  this.rebuildVisibleRange(true);
@@ -187,9 +223,7 @@ export class VirtualList extends FlexBox {
187
223
  }
188
224
 
189
225
  onBindItemWith<Owner>(owner: Owner, renderer: (owner: Owner, container: FlexBox, index: i32) => void): this {
190
- this.bindItemValue = (container: FlexBox, index: i32): void => {
191
- renderer(owner, container, index);
192
- };
226
+ this.bindItemValue = new BoundVirtualListBinderCallback<Owner>(owner, renderer);
193
227
  this.currentFirstVisibleIndex = -1;
194
228
  this.currentLastVisibleIndex = -1;
195
229
  this.rebuildVisibleRange(true);
@@ -444,7 +478,7 @@ export class VirtualList extends FlexBox {
444
478
  }
445
479
 
446
480
  private renderItem(container: FlexBox, index: i32): void {
447
- this.bindItemValue(container, index);
481
+ this.bindItemValue.invoke(container, index);
448
482
  }
449
483
 
450
484
  private maxOffsetForCurrentViewport(): f32 {