uicore-ts 1.1.88 → 1.1.102
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/compiledScripts/UICore.js +3 -0
- package/compiledScripts/UICore.js.map +2 -2
- package/compiledScripts/UIRectangle.d.ts +4 -0
- package/compiledScripts/UIRectangle.js +19 -4
- package/compiledScripts/UIRectangle.js.map +2 -2
- package/compiledScripts/UITableView.d.ts +34 -0
- package/compiledScripts/UITableView.js +214 -25
- package/compiledScripts/UITableView.js.map +3 -3
- package/compiledScripts/UITextView.d.ts +49 -39
- package/compiledScripts/UITextView.js +137 -126
- package/compiledScripts/UITextView.js.map +2 -2
- package/compiledScripts/UIView.d.ts +40 -2
- package/compiledScripts/UIView.js +242 -89
- package/compiledScripts/UIView.js.map +2 -2
- package/package.json +1 -1
- package/scripts/UICore.ts +5 -0
- package/scripts/UIRectangle.ts +35 -5
- package/scripts/UITableView.ts +330 -93
- package/scripts/UITextView.ts +273 -358
- package/scripts/UIView.ts +361 -90
|
@@ -41,12 +41,176 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
41
41
|
this._persistedData = [];
|
|
42
42
|
this._needsDrawingOfVisibleRowsBeforeLayout = import_UIObject.NO;
|
|
43
43
|
this._isDrawVisibleRowsScheduled = import_UIObject.NO;
|
|
44
|
+
this.usesVirtualLayoutingForIntrinsicSizing = import_UIObject.NO;
|
|
44
45
|
this.animationDuration = 0.25;
|
|
46
|
+
this._useViewportScrolling = import_UIObject.NO;
|
|
45
47
|
this._fullHeightView = new import_UIView.UIView();
|
|
46
48
|
this._fullHeightView.hidden = import_UIObject.YES;
|
|
47
49
|
this._fullHeightView.userInteractionEnabled = import_UIObject.NO;
|
|
48
50
|
this.addSubview(this._fullHeightView);
|
|
49
51
|
this.scrollsX = import_UIObject.NO;
|
|
52
|
+
this._autoDetectScrollMode();
|
|
53
|
+
}
|
|
54
|
+
_autoDetectScrollMode() {
|
|
55
|
+
const checkScrollMode = () => {
|
|
56
|
+
if (!this.isMemberOfViewTree) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this._calculateAllPositions();
|
|
60
|
+
const totalContentHeight = this._rowPositions.length > 0 ? this._rowPositions[this._rowPositions.length - 1].bottomY : 0;
|
|
61
|
+
const tableBoundsHeight = this.bounds.height;
|
|
62
|
+
if (tableBoundsHeight >= totalContentHeight) {
|
|
63
|
+
this.enableViewportBasedVirtualScrolling();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
import_UIView.UIView.runFunctionBeforeNextFrame(checkScrollMode);
|
|
67
|
+
}
|
|
68
|
+
enableViewportBasedVirtualScrolling() {
|
|
69
|
+
if (this._useViewportScrolling) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this._useViewportScrolling = import_UIObject.YES;
|
|
73
|
+
this.scrollsX = import_UIObject.NO;
|
|
74
|
+
this.scrollsY = import_UIObject.NO;
|
|
75
|
+
this._setupViewportScrollListeners();
|
|
76
|
+
}
|
|
77
|
+
disableViewportBasedVirtualScrolling() {
|
|
78
|
+
if (!this._useViewportScrolling) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this._useViewportScrolling = import_UIObject.NO;
|
|
82
|
+
this.scrollsY = import_UIObject.YES;
|
|
83
|
+
this._cleanupViewportScrollListeners();
|
|
84
|
+
}
|
|
85
|
+
_setupViewportScrollListeners() {
|
|
86
|
+
this._windowScrollHandler = () => {
|
|
87
|
+
this._scheduleDrawVisibleRowsInViewport();
|
|
88
|
+
};
|
|
89
|
+
this._resizeHandler = () => {
|
|
90
|
+
this._rowPositions.forEach((pos) => pos.isValid = import_UIObject.NO);
|
|
91
|
+
this._highestValidRowPositionIndex = -1;
|
|
92
|
+
this._scheduleDrawVisibleRowsInViewport();
|
|
93
|
+
};
|
|
94
|
+
window.addEventListener("scroll", this._windowScrollHandler, { passive: true });
|
|
95
|
+
window.addEventListener("resize", this._resizeHandler, { passive: true });
|
|
96
|
+
this._intersectionObserver = new IntersectionObserver(
|
|
97
|
+
(entries) => {
|
|
98
|
+
entries.forEach((entry) => {
|
|
99
|
+
if (entry.isIntersecting) {
|
|
100
|
+
this._scheduleDrawVisibleRowsInViewport();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
root: null,
|
|
106
|
+
rootMargin: "100% 0px",
|
|
107
|
+
threshold: 0
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
this._intersectionObserver.observe(this.viewHTMLElement);
|
|
111
|
+
}
|
|
112
|
+
_cleanupViewportScrollListeners() {
|
|
113
|
+
if (this._windowScrollHandler) {
|
|
114
|
+
window.removeEventListener("scroll", this._windowScrollHandler);
|
|
115
|
+
this._windowScrollHandler = void 0;
|
|
116
|
+
}
|
|
117
|
+
if (this._resizeHandler) {
|
|
118
|
+
window.removeEventListener("resize", this._resizeHandler);
|
|
119
|
+
this._resizeHandler = void 0;
|
|
120
|
+
}
|
|
121
|
+
if (this._intersectionObserver) {
|
|
122
|
+
this._intersectionObserver.disconnect();
|
|
123
|
+
this._intersectionObserver = void 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
_scheduleDrawVisibleRowsInViewport() {
|
|
127
|
+
if (!this._isDrawVisibleRowsScheduled) {
|
|
128
|
+
this._isDrawVisibleRowsScheduled = import_UIObject.YES;
|
|
129
|
+
import_UIView.UIView.runFunctionBeforeNextFrame(() => {
|
|
130
|
+
this._calculateAllPositions();
|
|
131
|
+
this._drawVisibleRowsInViewport();
|
|
132
|
+
this.setNeedsLayout();
|
|
133
|
+
this._isDrawVisibleRowsScheduled = import_UIObject.NO;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
indexesForVisibleRowsInViewport(paddingRatio = 0.5) {
|
|
138
|
+
const tableRect = this.viewHTMLElement.getBoundingClientRect();
|
|
139
|
+
const viewportHeight = window.innerHeight;
|
|
140
|
+
const pageScale = import_UIView.UIView.pageScale;
|
|
141
|
+
const visibleTop = Math.max(0, -tableRect.top / pageScale);
|
|
142
|
+
const visibleBottom = Math.min(tableRect.height / pageScale, (viewportHeight - tableRect.top) / pageScale);
|
|
143
|
+
const paddingPx = viewportHeight / pageScale * paddingRatio;
|
|
144
|
+
const firstVisibleY = Math.max(0, visibleTop - paddingPx);
|
|
145
|
+
const lastVisibleY = Math.min(tableRect.height / pageScale, visibleBottom + paddingPx);
|
|
146
|
+
const numberOfRows = this.numberOfRows();
|
|
147
|
+
if (this.allRowsHaveEqualHeight) {
|
|
148
|
+
const rowHeight = this.heightForRowWithIndex(0);
|
|
149
|
+
let firstIndex = Math.floor(firstVisibleY / rowHeight);
|
|
150
|
+
let lastIndex = Math.floor(lastVisibleY / rowHeight);
|
|
151
|
+
firstIndex = Math.max(firstIndex, 0);
|
|
152
|
+
lastIndex = Math.min(lastIndex, numberOfRows - 1);
|
|
153
|
+
const result2 = [];
|
|
154
|
+
for (let i = firstIndex; i <= lastIndex; i++) {
|
|
155
|
+
result2.push(i);
|
|
156
|
+
}
|
|
157
|
+
return result2;
|
|
158
|
+
}
|
|
159
|
+
this._calculateAllPositions();
|
|
160
|
+
const rowPositions = this._rowPositions;
|
|
161
|
+
const result = [];
|
|
162
|
+
for (let i = 0; i < numberOfRows; i++) {
|
|
163
|
+
const position = rowPositions[i];
|
|
164
|
+
if (!position)
|
|
165
|
+
break;
|
|
166
|
+
const rowTop = position.topY;
|
|
167
|
+
const rowBottom = position.bottomY;
|
|
168
|
+
if (rowBottom >= firstVisibleY && rowTop <= lastVisibleY) {
|
|
169
|
+
result.push(i);
|
|
170
|
+
}
|
|
171
|
+
if (rowTop > lastVisibleY) {
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
_drawVisibleRowsInViewport() {
|
|
178
|
+
if (!this.isMemberOfViewTree) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const visibleIndexes = this.indexesForVisibleRowsInViewport();
|
|
182
|
+
const minIndex = visibleIndexes[0];
|
|
183
|
+
const maxIndex = visibleIndexes[visibleIndexes.length - 1];
|
|
184
|
+
const removedViews = [];
|
|
185
|
+
const visibleRows = [];
|
|
186
|
+
this._visibleRows.forEach((row) => {
|
|
187
|
+
if ((0, import_UIObject.IS_DEFINED)(row._UITableViewRowIndex) && (row._UITableViewRowIndex < minIndex || row._UITableViewRowIndex > maxIndex)) {
|
|
188
|
+
this._persistedData[row._UITableViewRowIndex] = this.persistenceDataItemForRowWithIndex(
|
|
189
|
+
row._UITableViewRowIndex,
|
|
190
|
+
row
|
|
191
|
+
);
|
|
192
|
+
this._removedReusableViews[row._UITableViewReusabilityIdentifier].push(row);
|
|
193
|
+
removedViews.push(row);
|
|
194
|
+
} else {
|
|
195
|
+
visibleRows.push(row);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
this._visibleRows = visibleRows;
|
|
199
|
+
visibleIndexes.forEach((rowIndex) => {
|
|
200
|
+
if (this.isRowWithIndexVisible(rowIndex)) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const view = this.viewForRowWithIndex(rowIndex);
|
|
204
|
+
this._firstLayoutVisibleRows.push(view);
|
|
205
|
+
this._visibleRows.push(view);
|
|
206
|
+
this.addSubview(view);
|
|
207
|
+
});
|
|
208
|
+
for (let i = 0; i < removedViews.length; i++) {
|
|
209
|
+
const view = removedViews[i];
|
|
210
|
+
if (this._visibleRows.indexOf(view) == -1) {
|
|
211
|
+
view.removeFromSuperview();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
50
214
|
}
|
|
51
215
|
loadData() {
|
|
52
216
|
this._persistedData = [];
|
|
@@ -90,7 +254,7 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
90
254
|
this._calculatePositionsUntilIndex(this.numberOfRows() - 1);
|
|
91
255
|
}
|
|
92
256
|
_calculatePositionsUntilIndex(maxIndex) {
|
|
93
|
-
|
|
257
|
+
let validPositionObject = this._rowPositions[this._highestValidRowPositionIndex];
|
|
94
258
|
if (!(0, import_UIObject.IS)(validPositionObject)) {
|
|
95
259
|
validPositionObject = {
|
|
96
260
|
bottomY: 0,
|
|
@@ -98,12 +262,12 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
98
262
|
isValid: import_UIObject.YES
|
|
99
263
|
};
|
|
100
264
|
}
|
|
101
|
-
|
|
265
|
+
let previousBottomY = validPositionObject.bottomY;
|
|
102
266
|
if (!this._rowPositions.length) {
|
|
103
267
|
this._highestValidRowPositionIndex = -1;
|
|
104
268
|
}
|
|
105
|
-
for (
|
|
106
|
-
|
|
269
|
+
for (let i = this._highestValidRowPositionIndex + 1; i <= maxIndex; i++) {
|
|
270
|
+
let height;
|
|
107
271
|
const rowPositionObject = this._rowPositions[i];
|
|
108
272
|
if ((0, import_UIObject.IS)((rowPositionObject || import_UIObject.nil).isValid)) {
|
|
109
273
|
height = rowPositionObject.bottomY - rowPositionObject.topY;
|
|
@@ -125,28 +289,31 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
125
289
|
}
|
|
126
290
|
}
|
|
127
291
|
indexesForVisibleRows(paddingRatio = 0.5) {
|
|
292
|
+
if (this._useViewportScrolling) {
|
|
293
|
+
return this.indexesForVisibleRowsInViewport(paddingRatio);
|
|
294
|
+
}
|
|
128
295
|
const firstVisibleY = this.contentOffset.y - this.bounds.height * paddingRatio;
|
|
129
296
|
const lastVisibleY = firstVisibleY + this.bounds.height * (1 + paddingRatio);
|
|
130
297
|
const numberOfRows = this.numberOfRows();
|
|
131
298
|
if (this.allRowsHaveEqualHeight) {
|
|
132
299
|
const rowHeight = this.heightForRowWithIndex(0);
|
|
133
|
-
|
|
134
|
-
|
|
300
|
+
let firstIndex = firstVisibleY / rowHeight;
|
|
301
|
+
let lastIndex = lastVisibleY / rowHeight;
|
|
135
302
|
firstIndex = Math.trunc(firstIndex);
|
|
136
303
|
lastIndex = Math.trunc(lastIndex) + 1;
|
|
137
304
|
firstIndex = Math.max(firstIndex, 0);
|
|
138
305
|
lastIndex = Math.min(lastIndex, numberOfRows - 1);
|
|
139
|
-
|
|
140
|
-
for (
|
|
141
|
-
|
|
306
|
+
const result2 = [];
|
|
307
|
+
for (let i = firstIndex; i < lastIndex + 1; i++) {
|
|
308
|
+
result2.push(i);
|
|
142
309
|
}
|
|
143
|
-
return
|
|
310
|
+
return result2;
|
|
144
311
|
}
|
|
145
|
-
|
|
146
|
-
|
|
312
|
+
let accumulatedHeight = 0;
|
|
313
|
+
const result = [];
|
|
147
314
|
this._calculateAllPositions();
|
|
148
315
|
const rowPositions = this._rowPositions;
|
|
149
|
-
for (
|
|
316
|
+
for (let i = 0; i < numberOfRows; i++) {
|
|
150
317
|
const height = rowPositions[i].bottomY - rowPositions[i].topY;
|
|
151
318
|
accumulatedHeight = accumulatedHeight + height;
|
|
152
319
|
if (accumulatedHeight >= firstVisibleY) {
|
|
@@ -227,7 +394,7 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
227
394
|
}
|
|
228
395
|
}
|
|
229
396
|
visibleRowWithIndex(rowIndex) {
|
|
230
|
-
for (
|
|
397
|
+
for (let i = 0; i < this._visibleRows.length; i++) {
|
|
231
398
|
const row = this._visibleRows[i];
|
|
232
399
|
if (row._UITableViewRowIndex == rowIndex) {
|
|
233
400
|
return row;
|
|
@@ -283,21 +450,32 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
283
450
|
}
|
|
284
451
|
didScrollToPosition(offsetPosition) {
|
|
285
452
|
super.didScrollToPosition(offsetPosition);
|
|
453
|
+
if (this._useViewportScrolling) {
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
286
456
|
this.forEachViewInSubtree(function(view) {
|
|
287
457
|
view._isPointerValid = import_UIObject.NO;
|
|
288
458
|
});
|
|
289
459
|
if (!this._isDrawVisibleRowsScheduled) {
|
|
290
460
|
this._isDrawVisibleRowsScheduled = import_UIObject.YES;
|
|
291
|
-
import_UIView.UIView.runFunctionBeforeNextFrame(
|
|
461
|
+
import_UIView.UIView.runFunctionBeforeNextFrame(() => {
|
|
292
462
|
this._calculateAllPositions();
|
|
293
463
|
this._drawVisibleRows();
|
|
294
464
|
this.setNeedsLayout();
|
|
295
465
|
this._isDrawVisibleRowsScheduled = import_UIObject.NO;
|
|
296
|
-
}
|
|
466
|
+
});
|
|
297
467
|
}
|
|
298
468
|
}
|
|
299
469
|
wasAddedToViewTree() {
|
|
470
|
+
super.wasAddedToViewTree();
|
|
300
471
|
this.loadData();
|
|
472
|
+
if (!this._useViewportScrolling) {
|
|
473
|
+
this._autoDetectScrollMode();
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
wasRemovedFromViewTree() {
|
|
477
|
+
super.wasRemovedFromViewTree();
|
|
478
|
+
this._cleanupViewportScrollListeners();
|
|
301
479
|
}
|
|
302
480
|
setFrame(rectangle, zIndex, performUncheckedLayout) {
|
|
303
481
|
const frame = this.frame;
|
|
@@ -325,7 +503,14 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
325
503
|
row.style.left = "" + this.sidePadding.integerValue + "px";
|
|
326
504
|
this.viewHTMLElement.appendChild(row.viewHTMLElement);
|
|
327
505
|
});
|
|
328
|
-
|
|
506
|
+
if (this._useViewportScrolling) {
|
|
507
|
+
this._fullHeightView.hidden = import_UIObject.NO;
|
|
508
|
+
this._fullHeightView.style.position = "absolute";
|
|
509
|
+
this._fullHeightView.style.pointerEvents = "none";
|
|
510
|
+
this._fullHeightView.frame = bounds.rectangleWithHeight((positions.lastElement || import_UIObject.nil).bottomY).rectangleWithWidth(1);
|
|
511
|
+
} else {
|
|
512
|
+
this._fullHeightView.frame = bounds.rectangleWithHeight((positions.lastElement || import_UIObject.nil).bottomY).rectangleWithWidth(bounds.width * 0.5);
|
|
513
|
+
}
|
|
329
514
|
this._firstLayoutVisibleRows = [];
|
|
330
515
|
}
|
|
331
516
|
_animateLayoutAllRows() {
|
|
@@ -334,18 +519,22 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
334
519
|
this.animationDuration,
|
|
335
520
|
0,
|
|
336
521
|
void 0,
|
|
337
|
-
|
|
522
|
+
() => {
|
|
338
523
|
this._layoutAllRows();
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
}
|
|
524
|
+
},
|
|
525
|
+
() => {
|
|
526
|
+
}
|
|
342
527
|
);
|
|
343
528
|
}
|
|
344
529
|
layoutSubviews() {
|
|
345
530
|
const previousPositions = JSON.parse(JSON.stringify(this._rowPositions));
|
|
346
531
|
const previousVisibleRowsLength = this._visibleRows.length;
|
|
347
532
|
if (this._needsDrawingOfVisibleRowsBeforeLayout) {
|
|
348
|
-
this.
|
|
533
|
+
if (this._useViewportScrolling) {
|
|
534
|
+
this._drawVisibleRowsInViewport();
|
|
535
|
+
} else {
|
|
536
|
+
this._drawVisibleRows();
|
|
537
|
+
}
|
|
349
538
|
this._needsDrawingOfVisibleRowsBeforeLayout = import_UIObject.NO;
|
|
350
539
|
}
|
|
351
540
|
super.layoutSubviews();
|
|
@@ -355,9 +544,9 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
355
544
|
if (this._shouldAnimateNextLayout) {
|
|
356
545
|
this._layoutAllRows(previousPositions);
|
|
357
546
|
if (previousVisibleRowsLength < this._visibleRows.length) {
|
|
358
|
-
import_UIView.UIView.runFunctionBeforeNextFrame(
|
|
547
|
+
import_UIView.UIView.runFunctionBeforeNextFrame(() => {
|
|
359
548
|
this._animateLayoutAllRows();
|
|
360
|
-
}
|
|
549
|
+
});
|
|
361
550
|
} else {
|
|
362
551
|
this._animateLayoutAllRows();
|
|
363
552
|
}
|
|
@@ -368,7 +557,7 @@ class UITableView extends import_UINativeScrollView.UINativeScrollView {
|
|
|
368
557
|
}
|
|
369
558
|
}
|
|
370
559
|
intrinsicContentHeight(constrainingWidth = 0) {
|
|
371
|
-
|
|
560
|
+
let result = 0;
|
|
372
561
|
this._calculateAllPositions();
|
|
373
562
|
if (this._rowPositions.length) {
|
|
374
563
|
result = this._rowPositions[this._rowPositions.length - 1].bottomY;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../scripts/UITableView.ts"],
|
|
4
|
-
"sourcesContent": ["import { UIButton } from \"./UIButton\"\nimport { UINativeScrollView } from \"./UINativeScrollView\"\nimport { FIRST_OR_NIL, IS, IS_DEFINED, nil, NO, YES } from \"./UIObject\"\nimport { UIPoint } from \"./UIPoint\"\nimport { UIRectangle } from \"./UIRectangle\"\nimport { UIView, UIViewBroadcastEvent } from \"./UIView\"\n\n\ninterface UITableViewRowView extends UIView {\n \n _UITableViewRowIndex?: number;\n \n}\n\n\nexport interface UITableViewReusableViewsContainerObject {\n \n [key: string]: UIView[];\n \n}\n\n\nexport interface UITableViewReusableViewPositionObject {\n \n bottomY: number;\n topY: number;\n \n isValid: boolean;\n \n}\n\n\nexport class UITableView extends UINativeScrollView {\n \n \n allRowsHaveEqualHeight: boolean = NO\n _visibleRows: UITableViewRowView[] = []\n _firstLayoutVisibleRows: UITableViewRowView[] = []\n \n _rowPositions: UITableViewReusableViewPositionObject[] = []\n \n _highestValidRowPositionIndex: number = 0\n \n _reusableViews: UITableViewReusableViewsContainerObject = {}\n _removedReusableViews: UITableViewReusableViewsContainerObject = {}\n \n _fullHeightView: UIView\n _rowIDIndex: number = 0\n reloadsOnLanguageChange = YES\n sidePadding = 0\n \n cellWeights?: number[]\n \n _persistedData: any[] = []\n _needsDrawingOfVisibleRowsBeforeLayout = NO\n _isDrawVisibleRowsScheduled = NO\n _shouldAnimateNextLayout?: boolean\n \n override animationDuration = 0.25\n \n \n constructor(elementID?: string) {\n \n super(elementID)\n \n this._fullHeightView = new UIView()\n this._fullHeightView.hidden = YES\n this._fullHeightView.userInteractionEnabled = NO\n this.addSubview(this._fullHeightView)\n \n this.scrollsX = NO\n \n }\n \n \n loadData() {\n \n this._persistedData = []\n \n this._calculatePositionsUntilIndex(this.numberOfRows() - 1)\n this._needsDrawingOfVisibleRowsBeforeLayout = YES\n \n this.setNeedsLayout()\n \n }\n \n reloadData() {\n \n this._removeVisibleRows()\n this._removeAllReusableRows()\n \n this._rowPositions = []\n this._highestValidRowPositionIndex = 0\n \n this.loadData()\n \n }\n \n \n highlightChanges(previousData: any[], newData: any[]) {\n \n previousData = previousData.map(dataPoint => JSON.stringify(dataPoint))\n newData = newData.map(dataPoint => JSON.stringify(dataPoint))\n \n const newIndexes: number[] = []\n \n newData.forEach((value, index) => {\n \n if (!previousData.contains(value)) {\n \n newIndexes.push(index)\n \n }\n \n })\n \n newIndexes.forEach(index => {\n \n if (this.isRowWithIndexVisible(index)) {\n this.highlightRowAsNew(this.visibleRowWithIndex(index) as UIView)\n }\n \n })\n \n }\n \n \n highlightRowAsNew(row: UIView) {\n \n \n }\n \n \n invalidateSizeOfRowWithIndex(index: number, animateChange = NO) {\n \n if (this._rowPositions[index]) {\n this._rowPositions[index].isValid = NO\n }\n \n this._highestValidRowPositionIndex = Math.min(this._highestValidRowPositionIndex, index - 1)\n \n // if (index == 0) {\n \n // this._highestValidRowPositionIndex = 0;\n \n // this._rowPositions = [];\n \n // }\n \n this._needsDrawingOfVisibleRowsBeforeLayout = YES\n \n this._shouldAnimateNextLayout = animateChange\n \n }\n \n \n _calculateAllPositions() {\n this._calculatePositionsUntilIndex(this.numberOfRows() - 1)\n }\n \n _calculatePositionsUntilIndex(maxIndex: number) {\n \n var validPositionObject = this._rowPositions[this._highestValidRowPositionIndex]\n if (!IS(validPositionObject)) {\n validPositionObject = {\n bottomY: 0,\n topY: 0,\n isValid: YES\n }\n }\n \n var previousBottomY = validPositionObject.bottomY\n \n if (!this._rowPositions.length) {\n \n this._highestValidRowPositionIndex = -1\n \n }\n \n for (var i = this._highestValidRowPositionIndex + 1; i <= maxIndex; i++) {\n \n var height: number\n \n const rowPositionObject = this._rowPositions[i]\n \n if (IS((rowPositionObject || nil).isValid)) {\n \n height = rowPositionObject.bottomY - rowPositionObject.topY\n \n }\n else {\n \n height = this.heightForRowWithIndex(i)\n \n }\n \n \n const positionObject: UITableViewReusableViewPositionObject = {\n bottomY: previousBottomY + height,\n topY: previousBottomY,\n isValid: YES\n }\n \n if (i < this._rowPositions.length) {\n this._rowPositions[i] = positionObject\n }\n else {\n this._rowPositions.push(positionObject)\n }\n this._highestValidRowPositionIndex = i\n previousBottomY = previousBottomY + height\n \n }\n \n }\n \n \n indexesForVisibleRows(paddingRatio = 0.5): number[] {\n \n const firstVisibleY = this.contentOffset.y - this.bounds.height * paddingRatio\n const lastVisibleY = firstVisibleY + this.bounds.height * (1 + paddingRatio)\n \n const numberOfRows = this.numberOfRows()\n \n if (this.allRowsHaveEqualHeight) {\n \n const rowHeight = this.heightForRowWithIndex(0)\n \n var firstIndex = firstVisibleY / rowHeight\n var lastIndex = lastVisibleY / rowHeight\n \n firstIndex = Math.trunc(firstIndex)\n lastIndex = Math.trunc(lastIndex) + 1\n \n firstIndex = Math.max(firstIndex, 0)\n lastIndex = Math.min(lastIndex, numberOfRows - 1)\n \n var result = []\n for (var i = firstIndex; i < lastIndex + 1; i++) {\n result.push(i)\n }\n return result\n }\n \n var accumulatedHeight = 0\n var result = []\n \n this._calculateAllPositions()\n \n const rowPositions = this._rowPositions\n \n for (var i = 0; i < numberOfRows; i++) {\n \n const height = rowPositions[i].bottomY - rowPositions[i].topY // this.heightForRowWithIndex(i)\n \n accumulatedHeight = accumulatedHeight + height\n if (accumulatedHeight >= firstVisibleY) {\n result.push(i)\n }\n if (accumulatedHeight >= lastVisibleY) {\n break\n }\n \n }\n \n return result\n \n }\n \n \n _removeVisibleRows() {\n \n const visibleRows: UITableViewRowView[] = []\n this._visibleRows.forEach((row: UIView) => {\n \n this._persistedData[row._UITableViewRowIndex as number] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex as number,\n row\n )\n row.removeFromSuperview()\n this._removedReusableViews[row?._UITableViewReusabilityIdentifier]?.push(row)\n \n \n })\n this._visibleRows = visibleRows\n \n }\n \n \n _removeAllReusableRows() {\n this._reusableViews.forEach((rows: UIView[]) =>\n rows.forEach((row: UIView) => {\n \n this._persistedData[row._UITableViewRowIndex as number] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex as number,\n row\n )\n row.removeFromSuperview()\n \n this._markReusableViewAsUnused(row)\n \n })\n )\n }\n \n \n _markReusableViewAsUnused(row: UIView) {\n if (!this._removedReusableViews[row._UITableViewReusabilityIdentifier].contains(row)) {\n this._removedReusableViews[row._UITableViewReusabilityIdentifier].push(row)\n }\n }\n \n _drawVisibleRows() {\n \n if (!this.isMemberOfViewTree) {\n return\n }\n \n const visibleIndexes = this.indexesForVisibleRows()\n \n const minIndex = visibleIndexes[0]\n const maxIndex = visibleIndexes[visibleIndexes.length - 1]\n \n const removedViews: UITableViewRowView[] = []\n \n const visibleRows: UITableViewRowView[] = []\n this._visibleRows.forEach((row) => {\n if (IS_DEFINED(row._UITableViewRowIndex) && (row._UITableViewRowIndex < minIndex || row._UITableViewRowIndex > maxIndex)) {\n \n //row.removeFromSuperview();\n \n this._persistedData[row._UITableViewRowIndex] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex,\n row\n )\n \n this._removedReusableViews[row._UITableViewReusabilityIdentifier].push(row)\n \n removedViews.push(row)\n \n }\n else {\n visibleRows.push(row)\n }\n })\n this._visibleRows = visibleRows\n \n visibleIndexes.forEach((rowIndex: number) => {\n \n if (this.isRowWithIndexVisible(rowIndex)) {\n return\n }\n const view: UITableViewRowView = this.viewForRowWithIndex(rowIndex)\n //view._UITableViewRowIndex = rowIndex;\n this._firstLayoutVisibleRows.push(view)\n this._visibleRows.push(view)\n this.addSubview(view)\n \n })\n \n for (let i = 0; i < removedViews.length; i++) {\n \n const view = removedViews[i]\n if (this._visibleRows.indexOf(view) == -1) {\n \n //this._persistedData[view._UITableViewRowIndex] = this.persistenceDataItemForRowWithIndex(view._UITableViewRowIndex, view);\n view.removeFromSuperview()\n \n //this._removedReusableViews[view._UITableViewReusabilityIdentifier].push(view);\n \n }\n \n }\n \n //this.setNeedsLayout();\n \n }\n \n \n visibleRowWithIndex(rowIndex: number | undefined): UIView {\n for (var i = 0; i < this._visibleRows.length; i++) {\n const row = this._visibleRows[i]\n if (row._UITableViewRowIndex == rowIndex) {\n return row\n }\n }\n return nil\n }\n \n \n isRowWithIndexVisible(rowIndex: number) {\n return IS(this.visibleRowWithIndex(rowIndex))\n }\n \n \n reusableViewForIdentifier(identifier: string, rowIndex: number): UITableViewRowView {\n \n if (!this._removedReusableViews[identifier]) {\n this._removedReusableViews[identifier] = []\n }\n \n if (this._removedReusableViews[identifier] && this._removedReusableViews[identifier].length) {\n \n const view = this._removedReusableViews[identifier].pop() as UITableViewRowView\n view._UITableViewRowIndex = rowIndex\n Object.assign(view, this._persistedData[rowIndex] || this.defaultRowPersistenceDataItem())\n return view\n \n }\n \n if (!this._reusableViews[identifier]) {\n this._reusableViews[identifier] = []\n }\n \n const newView = this.newReusableViewForIdentifier(identifier, this._rowIDIndex) as UITableViewRowView\n this._rowIDIndex = this._rowIDIndex + 1\n \n newView._UITableViewReusabilityIdentifier = identifier\n newView._UITableViewRowIndex = rowIndex\n \n Object.assign(newView, this._persistedData[rowIndex] || this.defaultRowPersistenceDataItem())\n this._reusableViews[identifier].push(newView)\n \n return newView\n \n }\n \n \n // Functions that should be overridden to draw the correct content START\n newReusableViewForIdentifier(identifier: string, rowIDIndex: number): UIView {\n \n const view = new UIButton(this.elementID + \"Row\" + rowIDIndex)\n \n view.stopsPointerEventPropagation = NO\n view.pausesPointerEvents = NO\n \n return view\n \n }\n \n heightForRowWithIndex(index: number): number {\n return 50\n }\n \n numberOfRows() {\n return 10000\n }\n \n defaultRowPersistenceDataItem(): any {\n \n \n }\n \n persistenceDataItemForRowWithIndex(rowIndex: number, row: UIView): any {\n \n \n }\n \n viewForRowWithIndex(rowIndex: number): UITableViewRowView {\n const row = this.reusableViewForIdentifier(\"Row\", rowIndex)\n row._UITableViewRowIndex = rowIndex\n FIRST_OR_NIL((row as unknown as UIButton).titleLabel).text = \"Row \" + rowIndex\n return row\n }\n \n // Functions that should be overridden to draw the correct content END\n \n \n // Functions that trigger redrawing of the content\n override didScrollToPosition(offsetPosition: UIPoint) {\n \n super.didScrollToPosition(offsetPosition)\n \n this.forEachViewInSubtree(function (view: UIView) {\n \n view._isPointerValid = NO\n \n })\n \n if (!this._isDrawVisibleRowsScheduled) {\n \n this._isDrawVisibleRowsScheduled = YES\n \n UIView.runFunctionBeforeNextFrame(function (this: UITableView) {\n \n this._calculateAllPositions()\n \n this._drawVisibleRows()\n \n this.setNeedsLayout()\n \n this._isDrawVisibleRowsScheduled = NO\n \n }.bind(this))\n \n }\n \n }\n \n override wasAddedToViewTree() {\n this.loadData()\n }\n \n override setFrame(rectangle: UIRectangle, zIndex?: number, performUncheckedLayout?: boolean) {\n \n const frame = this.frame\n super.setFrame(rectangle, zIndex, performUncheckedLayout)\n if (frame.isEqualTo(rectangle) && !performUncheckedLayout) {\n return\n }\n \n this._needsDrawingOfVisibleRowsBeforeLayout = YES\n \n }\n \n \n override didReceiveBroadcastEvent(event: UIViewBroadcastEvent) {\n \n super.didReceiveBroadcastEvent(event)\n \n if (event.name == UIView.broadcastEventName.LanguageChanged && this.reloadsOnLanguageChange) {\n \n this.reloadData()\n \n }\n \n \n }\n \n \n private _layoutAllRows(positions = this._rowPositions) {\n \n const bounds = this.bounds\n \n this._visibleRows.sort((rowA, rowB) => rowA._UITableViewRowIndex! - rowB._UITableViewRowIndex!)\n .forEach(row => {\n \n const frame = bounds.copy()\n \n const positionObject = positions[row._UITableViewRowIndex!]\n frame.min.y = positionObject.topY\n frame.max.y = positionObject.bottomY\n row.frame = frame\n \n row.style.width = \"\" + (bounds.width - this.sidePadding * 2).integerValue + \"px\"\n row.style.left = \"\" + this.sidePadding.integerValue + \"px\"\n \n // This is to reorder the elements in the DOM\n this.viewHTMLElement.appendChild(row.viewHTMLElement)\n \n })\n \n this._fullHeightView.frame = bounds.rectangleWithHeight((positions.lastElement ||\n nil).bottomY).rectangleWithWidth(bounds.width * 0.5)\n \n this._firstLayoutVisibleRows = []\n \n }\n \n private _animateLayoutAllRows() {\n \n UIView.animateViewOrViewsWithDurationDelayAndFunction(\n this._visibleRows,\n this.animationDuration,\n 0,\n undefined,\n function (this: UITableView) {\n \n this._layoutAllRows()\n \n }.bind(this),\n function (this: UITableView) {\n \n // this._calculateAllPositions()\n // this._layoutAllRows()\n \n }.bind(this)\n )\n \n }\n \n \n override layoutSubviews() {\n \n const previousPositions: UITableViewReusableViewPositionObject[] = JSON.parse(JSON.stringify(this._rowPositions))\n \n const previousVisibleRowsLength = this._visibleRows.length\n \n if (this._needsDrawingOfVisibleRowsBeforeLayout) {\n \n //this._calculateAllPositions()\n \n this._drawVisibleRows()\n \n this._needsDrawingOfVisibleRowsBeforeLayout = NO\n \n }\n \n \n super.layoutSubviews()\n \n \n if (!this.numberOfRows() || !this.isMemberOfViewTree) {\n \n return\n \n }\n \n \n if (this._shouldAnimateNextLayout) {\n \n \n // Need to do layout with the previous positions\n \n this._layoutAllRows(previousPositions)\n \n \n if (previousVisibleRowsLength < this._visibleRows.length) {\n \n \n UIView.runFunctionBeforeNextFrame(function (this: UITableView) {\n \n this._animateLayoutAllRows()\n \n }.bind(this))\n \n }\n else {\n \n this._animateLayoutAllRows()\n \n }\n \n \n this._shouldAnimateNextLayout = NO\n \n }\n else {\n \n // if (this._needsDrawingOfVisibleRowsBeforeLayout) {\n \n // this._drawVisibleRows();\n \n // this._needsDrawingOfVisibleRowsBeforeLayout = NO;\n \n // }\n \n this._calculateAllPositions()\n \n this._layoutAllRows()\n \n \n }\n \n \n }\n \n \n override intrinsicContentHeight(constrainingWidth = 0) {\n \n \n var result = 0\n \n this._calculateAllPositions()\n \n if (this._rowPositions.length) {\n \n result = this._rowPositions[this._rowPositions.length - 1].bottomY\n \n }\n \n return result\n \n }\n \n \n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import { UIButton } from \"./UIButton\"\nimport { UINativeScrollView } from \"./UINativeScrollView\"\nimport { FIRST_OR_NIL, IS, IS_DEFINED, nil, NO, YES } from \"./UIObject\"\nimport { UIPoint } from \"./UIPoint\"\nimport { UIRectangle } from \"./UIRectangle\"\nimport { UIView, UIViewBroadcastEvent } from \"./UIView\"\n\n\ninterface UITableViewRowView extends UIView {\n \n _UITableViewRowIndex?: number;\n \n}\n\n\nexport interface UITableViewReusableViewsContainerObject {\n \n [key: string]: UIView[];\n \n}\n\n\nexport interface UITableViewReusableViewPositionObject {\n \n bottomY: number;\n topY: number;\n \n isValid: boolean;\n \n}\n\n\nexport class UITableView extends UINativeScrollView {\n \n \n allRowsHaveEqualHeight: boolean = NO\n _visibleRows: UITableViewRowView[] = []\n _firstLayoutVisibleRows: UITableViewRowView[] = []\n \n _rowPositions: UITableViewReusableViewPositionObject[] = []\n \n _highestValidRowPositionIndex: number = 0\n \n _reusableViews: UITableViewReusableViewsContainerObject = {}\n _removedReusableViews: UITableViewReusableViewsContainerObject = {}\n \n _fullHeightView: UIView\n _rowIDIndex: number = 0\n reloadsOnLanguageChange = YES\n sidePadding = 0\n \n cellWeights?: number[]\n \n _persistedData: any[] = []\n _needsDrawingOfVisibleRowsBeforeLayout = NO\n _isDrawVisibleRowsScheduled = NO\n _shouldAnimateNextLayout?: boolean\n \n override usesVirtualLayoutingForIntrinsicSizing = NO\n \n override animationDuration = 0.25\n \n // Viewport scrolling properties\n private _useViewportScrolling = NO\n private _windowScrollHandler?: () => void\n private _resizeHandler?: () => void\n private _intersectionObserver?: IntersectionObserver\n \n \n constructor(elementID?: string) {\n \n super(elementID)\n \n this._fullHeightView = new UIView()\n this._fullHeightView.hidden = YES\n this._fullHeightView.userInteractionEnabled = NO\n this.addSubview(this._fullHeightView)\n \n this.scrollsX = NO\n \n // Automatically detect if we should use viewport scrolling\n this._autoDetectScrollMode()\n \n }\n \n \n /**\n * Automatically detect if this table should use viewport scrolling\n * If the table's bounds height is >= the total content height,\n * then it doesn't need internal scrolling and should use viewport scrolling\n */\n private _autoDetectScrollMode() {\n // Run detection after the view is added to the tree and layout has occurred\n const checkScrollMode = () => {\n if (!this.isMemberOfViewTree) {\n return\n }\n \n this._calculateAllPositions()\n \n const totalContentHeight = this._rowPositions.length > 0\n ? this._rowPositions[this._rowPositions.length - 1].bottomY\n : 0\n \n const tableBoundsHeight = this.bounds.height\n \n // If the table's height can contain all content, use viewport scrolling\n if (tableBoundsHeight >= totalContentHeight) {\n this.enableViewportBasedVirtualScrolling()\n }\n }\n \n // Check after first layout\n UIView.runFunctionBeforeNextFrame(checkScrollMode)\n }\n \n \n /**\n * Enable viewport-based virtual scrolling for full-height tables\n * This allows the table to be part of the page flow while still\n * benefiting from virtual scrolling performance\n */\n enableViewportBasedVirtualScrolling() {\n if (this._useViewportScrolling) {\n return // Already enabled\n }\n \n this._useViewportScrolling = YES\n this.scrollsX = NO\n this.scrollsY = NO\n \n // No style changes - respect the absolute positioning system\n \n this._setupViewportScrollListeners()\n }\n \n \n /**\n * Disable viewport scrolling and return to normal scroll behavior\n */\n disableViewportBasedVirtualScrolling() {\n if (!this._useViewportScrolling) {\n return\n }\n \n this._useViewportScrolling = NO\n this.scrollsY = YES\n \n this._cleanupViewportScrollListeners()\n }\n \n \n private _setupViewportScrollListeners() {\n this._windowScrollHandler = () => {\n this._scheduleDrawVisibleRowsInViewport()\n }\n \n this._resizeHandler = () => {\n // Invalidate all row positions on resize as widths may have changed\n this._rowPositions.forEach(pos => pos.isValid = NO)\n this._highestValidRowPositionIndex = -1\n this._scheduleDrawVisibleRowsInViewport()\n }\n \n window.addEventListener('scroll', this._windowScrollHandler, { passive: true })\n window.addEventListener('resize', this._resizeHandler, { passive: true })\n \n // Use IntersectionObserver to detect when table enters/exits viewport\n this._intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n this._scheduleDrawVisibleRowsInViewport()\n }\n })\n },\n {\n root: null,\n rootMargin: '100% 0px', // Load rows 100% viewport height before/after\n threshold: 0\n }\n )\n \n this._intersectionObserver.observe(this.viewHTMLElement)\n }\n \n \n private _cleanupViewportScrollListeners() {\n if (this._windowScrollHandler) {\n window.removeEventListener('scroll', this._windowScrollHandler)\n this._windowScrollHandler = undefined\n }\n \n if (this._resizeHandler) {\n window.removeEventListener('resize', this._resizeHandler)\n this._resizeHandler = undefined\n }\n \n if (this._intersectionObserver) {\n this._intersectionObserver.disconnect()\n this._intersectionObserver = undefined\n }\n }\n \n \n private _scheduleDrawVisibleRowsInViewport() {\n if (!this._isDrawVisibleRowsScheduled) {\n this._isDrawVisibleRowsScheduled = YES\n \n UIView.runFunctionBeforeNextFrame(() => {\n this._calculateAllPositions()\n this._drawVisibleRowsInViewport()\n this.setNeedsLayout()\n this._isDrawVisibleRowsScheduled = NO\n })\n }\n }\n \n \n /**\n * Calculate which rows are visible in the browser viewport\n * rather than in the scrollview's content area\n */\n indexesForVisibleRowsInViewport(paddingRatio = 0.5): number[] {\n const tableRect = this.viewHTMLElement.getBoundingClientRect()\n const viewportHeight = window.innerHeight\n const pageScale = UIView.pageScale\n \n // Calculate which part of the table is visible in viewport\n // Account for page scale when converting from screen to content coordinates\n const visibleTop = Math.max(0, -tableRect.top / pageScale)\n const visibleBottom = Math.min(tableRect.height / pageScale, (viewportHeight - tableRect.top) / pageScale)\n \n // Add padding to render rows slightly before they enter viewport\n const paddingPx = (viewportHeight / pageScale) * paddingRatio\n const firstVisibleY = Math.max(0, visibleTop - paddingPx)\n const lastVisibleY = Math.min(tableRect.height / pageScale, visibleBottom + paddingPx)\n \n const numberOfRows = this.numberOfRows()\n \n if (this.allRowsHaveEqualHeight) {\n const rowHeight = this.heightForRowWithIndex(0)\n \n let firstIndex = Math.floor(firstVisibleY / rowHeight)\n let lastIndex = Math.floor(lastVisibleY / rowHeight)\n \n firstIndex = Math.max(firstIndex, 0)\n lastIndex = Math.min(lastIndex, numberOfRows - 1)\n \n const result = []\n for (let i = firstIndex; i <= lastIndex; i++) {\n result.push(i)\n }\n return result\n }\n \n // Variable height rows\n this._calculateAllPositions()\n \n const rowPositions = this._rowPositions\n const result = []\n \n for (let i = 0; i < numberOfRows; i++) {\n const position = rowPositions[i]\n if (!position) break\n \n const rowTop = position.topY\n const rowBottom = position.bottomY\n \n // Check if row intersects with visible area\n if (rowBottom >= firstVisibleY && rowTop <= lastVisibleY) {\n result.push(i)\n }\n \n // Early exit if we've passed the visible area\n if (rowTop > lastVisibleY) {\n break\n }\n }\n \n return result\n }\n \n \n /**\n * Draw visible rows based on viewport position\n */\n private _drawVisibleRowsInViewport() {\n if (!this.isMemberOfViewTree) {\n return\n }\n \n const visibleIndexes = this.indexesForVisibleRowsInViewport()\n \n const minIndex = visibleIndexes[0]\n const maxIndex = visibleIndexes[visibleIndexes.length - 1]\n \n const removedViews: UITableViewRowView[] = []\n \n const visibleRows: UITableViewRowView[] = []\n this._visibleRows.forEach((row) => {\n if (IS_DEFINED(row._UITableViewRowIndex) &&\n (row._UITableViewRowIndex < minIndex || row._UITableViewRowIndex > maxIndex)) {\n \n this._persistedData[row._UITableViewRowIndex] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex,\n row\n )\n \n this._removedReusableViews[row._UITableViewReusabilityIdentifier].push(row)\n removedViews.push(row)\n }\n else {\n visibleRows.push(row)\n }\n })\n this._visibleRows = visibleRows\n \n visibleIndexes.forEach((rowIndex: number) => {\n if (this.isRowWithIndexVisible(rowIndex)) {\n return\n }\n const view: UITableViewRowView = this.viewForRowWithIndex(rowIndex)\n this._firstLayoutVisibleRows.push(view)\n this._visibleRows.push(view)\n this.addSubview(view)\n })\n \n for (let i = 0; i < removedViews.length; i++) {\n const view = removedViews[i]\n if (this._visibleRows.indexOf(view) == -1) {\n view.removeFromSuperview()\n }\n }\n }\n \n \n loadData() {\n \n this._persistedData = []\n \n this._calculatePositionsUntilIndex(this.numberOfRows() - 1)\n this._needsDrawingOfVisibleRowsBeforeLayout = YES\n \n this.setNeedsLayout()\n \n }\n \n reloadData() {\n \n this._removeVisibleRows()\n this._removeAllReusableRows()\n \n this._rowPositions = []\n this._highestValidRowPositionIndex = 0\n \n this.loadData()\n \n }\n \n \n highlightChanges(previousData: any[], newData: any[]) {\n \n previousData = previousData.map(dataPoint => JSON.stringify(dataPoint))\n newData = newData.map(dataPoint => JSON.stringify(dataPoint))\n \n const newIndexes: number[] = []\n \n newData.forEach((value, index) => {\n \n if (!previousData.contains(value)) {\n \n newIndexes.push(index)\n \n }\n \n })\n \n newIndexes.forEach(index => {\n \n if (this.isRowWithIndexVisible(index)) {\n this.highlightRowAsNew(this.visibleRowWithIndex(index) as UIView)\n }\n \n })\n \n }\n \n \n highlightRowAsNew(row: UIView) {\n \n \n }\n \n \n invalidateSizeOfRowWithIndex(index: number, animateChange = NO) {\n \n if (this._rowPositions[index]) {\n this._rowPositions[index].isValid = NO\n }\n \n this._highestValidRowPositionIndex = Math.min(this._highestValidRowPositionIndex, index - 1)\n \n this._needsDrawingOfVisibleRowsBeforeLayout = YES\n \n this._shouldAnimateNextLayout = animateChange\n \n }\n \n \n _calculateAllPositions() {\n this._calculatePositionsUntilIndex(this.numberOfRows() - 1)\n }\n \n _calculatePositionsUntilIndex(maxIndex: number) {\n \n let validPositionObject = this._rowPositions[this._highestValidRowPositionIndex]\n if (!IS(validPositionObject)) {\n validPositionObject = {\n bottomY: 0,\n topY: 0,\n isValid: YES\n }\n }\n \n let previousBottomY = validPositionObject.bottomY\n \n if (!this._rowPositions.length) {\n \n this._highestValidRowPositionIndex = -1\n \n }\n \n for (let i = this._highestValidRowPositionIndex + 1; i <= maxIndex; i++) {\n \n let height: number\n \n const rowPositionObject = this._rowPositions[i]\n \n if (IS((rowPositionObject || nil).isValid)) {\n \n height = rowPositionObject.bottomY - rowPositionObject.topY\n \n }\n else {\n \n height = this.heightForRowWithIndex(i)\n \n }\n \n \n const positionObject: UITableViewReusableViewPositionObject = {\n bottomY: previousBottomY + height,\n topY: previousBottomY,\n isValid: YES\n }\n \n if (i < this._rowPositions.length) {\n this._rowPositions[i] = positionObject\n }\n else {\n this._rowPositions.push(positionObject)\n }\n this._highestValidRowPositionIndex = i\n previousBottomY = previousBottomY + height\n \n }\n \n }\n \n \n indexesForVisibleRows(paddingRatio = 0.5): number[] {\n \n // If using viewport scrolling, delegate to viewport method\n if (this._useViewportScrolling) {\n return this.indexesForVisibleRowsInViewport(paddingRatio)\n }\n \n // Original scroll-based logic\n const firstVisibleY = this.contentOffset.y - this.bounds.height * paddingRatio\n const lastVisibleY = firstVisibleY + this.bounds.height * (1 + paddingRatio)\n \n const numberOfRows = this.numberOfRows()\n \n if (this.allRowsHaveEqualHeight) {\n \n const rowHeight = this.heightForRowWithIndex(0)\n \n let firstIndex = firstVisibleY / rowHeight\n let lastIndex = lastVisibleY / rowHeight\n \n firstIndex = Math.trunc(firstIndex)\n lastIndex = Math.trunc(lastIndex) + 1\n \n firstIndex = Math.max(firstIndex, 0)\n lastIndex = Math.min(lastIndex, numberOfRows - 1)\n \n const result = []\n for (let i = firstIndex; i < lastIndex + 1; i++) {\n result.push(i)\n }\n return result\n }\n \n let accumulatedHeight = 0\n const result = []\n \n this._calculateAllPositions()\n \n const rowPositions = this._rowPositions\n \n for (let i = 0; i < numberOfRows; i++) {\n \n const height = rowPositions[i].bottomY - rowPositions[i].topY\n \n accumulatedHeight = accumulatedHeight + height\n if (accumulatedHeight >= firstVisibleY) {\n result.push(i)\n }\n if (accumulatedHeight >= lastVisibleY) {\n break\n }\n \n }\n \n return result\n \n }\n \n \n _removeVisibleRows() {\n \n const visibleRows: UITableViewRowView[] = []\n this._visibleRows.forEach((row: UIView) => {\n \n this._persistedData[row._UITableViewRowIndex as number] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex as number,\n row\n )\n row.removeFromSuperview()\n this._removedReusableViews[row?._UITableViewReusabilityIdentifier]?.push(row)\n \n \n })\n this._visibleRows = visibleRows\n \n }\n \n \n _removeAllReusableRows() {\n this._reusableViews.forEach((rows: UIView[]) =>\n rows.forEach((row: UIView) => {\n \n this._persistedData[row._UITableViewRowIndex as number] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex as number,\n row\n )\n row.removeFromSuperview()\n \n this._markReusableViewAsUnused(row)\n \n })\n )\n }\n \n \n _markReusableViewAsUnused(row: UIView) {\n if (!this._removedReusableViews[row._UITableViewReusabilityIdentifier].contains(row)) {\n this._removedReusableViews[row._UITableViewReusabilityIdentifier].push(row)\n }\n }\n \n _drawVisibleRows() {\n \n if (!this.isMemberOfViewTree) {\n return\n }\n \n const visibleIndexes = this.indexesForVisibleRows()\n \n const minIndex = visibleIndexes[0]\n const maxIndex = visibleIndexes[visibleIndexes.length - 1]\n \n const removedViews: UITableViewRowView[] = []\n \n const visibleRows: UITableViewRowView[] = []\n this._visibleRows.forEach((row) => {\n if (IS_DEFINED(row._UITableViewRowIndex) && (row._UITableViewRowIndex < minIndex || row._UITableViewRowIndex > maxIndex)) {\n \n this._persistedData[row._UITableViewRowIndex] = this.persistenceDataItemForRowWithIndex(\n row._UITableViewRowIndex,\n row\n )\n \n this._removedReusableViews[row._UITableViewReusabilityIdentifier].push(row)\n \n removedViews.push(row)\n \n }\n else {\n visibleRows.push(row)\n }\n })\n this._visibleRows = visibleRows\n \n visibleIndexes.forEach((rowIndex: number) => {\n \n if (this.isRowWithIndexVisible(rowIndex)) {\n return\n }\n const view: UITableViewRowView = this.viewForRowWithIndex(rowIndex)\n this._firstLayoutVisibleRows.push(view)\n this._visibleRows.push(view)\n this.addSubview(view)\n \n })\n \n for (let i = 0; i < removedViews.length; i++) {\n \n const view = removedViews[i]\n if (this._visibleRows.indexOf(view) == -1) {\n \n view.removeFromSuperview()\n \n }\n \n }\n \n }\n \n \n visibleRowWithIndex(rowIndex: number | undefined): UIView {\n for (let i = 0; i < this._visibleRows.length; i++) {\n const row = this._visibleRows[i]\n if (row._UITableViewRowIndex == rowIndex) {\n return row\n }\n }\n return nil\n }\n \n \n isRowWithIndexVisible(rowIndex: number) {\n return IS(this.visibleRowWithIndex(rowIndex))\n }\n \n \n reusableViewForIdentifier(identifier: string, rowIndex: number): UITableViewRowView {\n \n if (!this._removedReusableViews[identifier]) {\n this._removedReusableViews[identifier] = []\n }\n \n if (this._removedReusableViews[identifier] && this._removedReusableViews[identifier].length) {\n \n const view = this._removedReusableViews[identifier].pop() as UITableViewRowView\n view._UITableViewRowIndex = rowIndex\n Object.assign(view, this._persistedData[rowIndex] || this.defaultRowPersistenceDataItem())\n return view\n \n }\n \n if (!this._reusableViews[identifier]) {\n this._reusableViews[identifier] = []\n }\n \n const newView = this.newReusableViewForIdentifier(identifier, this._rowIDIndex) as UITableViewRowView\n this._rowIDIndex = this._rowIDIndex + 1\n \n newView._UITableViewReusabilityIdentifier = identifier\n newView._UITableViewRowIndex = rowIndex\n \n Object.assign(newView, this._persistedData[rowIndex] || this.defaultRowPersistenceDataItem())\n this._reusableViews[identifier].push(newView)\n \n return newView\n \n }\n \n \n // Functions that should be overridden to draw the correct content START\n newReusableViewForIdentifier(identifier: string, rowIDIndex: number): UIView {\n \n const view = new UIButton(this.elementID + \"Row\" + rowIDIndex)\n \n view.stopsPointerEventPropagation = NO\n view.pausesPointerEvents = NO\n \n return view\n \n }\n \n heightForRowWithIndex(index: number): number {\n return 50\n }\n \n numberOfRows() {\n return 10000\n }\n \n defaultRowPersistenceDataItem(): any {\n \n \n }\n \n persistenceDataItemForRowWithIndex(rowIndex: number, row: UIView): any {\n \n \n }\n \n viewForRowWithIndex(rowIndex: number): UITableViewRowView {\n const row = this.reusableViewForIdentifier(\"Row\", rowIndex)\n row._UITableViewRowIndex = rowIndex\n FIRST_OR_NIL((row as unknown as UIButton).titleLabel).text = \"Row \" + rowIndex\n return row\n }\n \n // Functions that should be overridden to draw the correct content END\n \n \n // Functions that trigger redrawing of the content\n override didScrollToPosition(offsetPosition: UIPoint) {\n \n super.didScrollToPosition(offsetPosition)\n \n // Skip if using viewport scrolling\n if (this._useViewportScrolling) {\n return\n }\n \n this.forEachViewInSubtree(function (view: UIView) {\n \n view._isPointerValid = NO\n \n })\n \n if (!this._isDrawVisibleRowsScheduled) {\n \n this._isDrawVisibleRowsScheduled = YES\n \n UIView.runFunctionBeforeNextFrame(() => {\n \n this._calculateAllPositions()\n \n this._drawVisibleRows()\n \n this.setNeedsLayout()\n \n this._isDrawVisibleRowsScheduled = NO\n \n })\n \n }\n \n }\n \n override wasAddedToViewTree() {\n super.wasAddedToViewTree()\n this.loadData()\n \n // Re-check scroll mode in case CSS was applied after construction\n if (!this._useViewportScrolling) {\n this._autoDetectScrollMode()\n }\n }\n \n override wasRemovedFromViewTree() {\n super.wasRemovedFromViewTree()\n this._cleanupViewportScrollListeners()\n }\n \n override setFrame(rectangle: UIRectangle, zIndex?: number, performUncheckedLayout?: boolean) {\n \n const frame = this.frame\n super.setFrame(rectangle, zIndex, performUncheckedLayout)\n if (frame.isEqualTo(rectangle) && !performUncheckedLayout) {\n return\n }\n \n this._needsDrawingOfVisibleRowsBeforeLayout = YES\n \n }\n \n \n override didReceiveBroadcastEvent(event: UIViewBroadcastEvent) {\n \n super.didReceiveBroadcastEvent(event)\n \n if (event.name == UIView.broadcastEventName.LanguageChanged && this.reloadsOnLanguageChange) {\n \n this.reloadData()\n \n }\n \n \n }\n \n \n private _layoutAllRows(positions = this._rowPositions) {\n \n const bounds = this.bounds\n \n this._visibleRows.sort((rowA, rowB) => rowA._UITableViewRowIndex! - rowB._UITableViewRowIndex!)\n .forEach(row => {\n \n const frame = bounds.copy()\n \n const positionObject = positions[row._UITableViewRowIndex!]\n frame.min.y = positionObject.topY\n frame.max.y = positionObject.bottomY\n row.frame = frame\n \n row.style.width = \"\" + (bounds.width - this.sidePadding * 2).integerValue + \"px\"\n row.style.left = \"\" + this.sidePadding.integerValue + \"px\"\n \n // This is to reorder the elements in the DOM\n this.viewHTMLElement.appendChild(row.viewHTMLElement)\n \n })\n \n // For viewport scrolling, the full height view needs to establish the total height\n if (this._useViewportScrolling) {\n this._fullHeightView.hidden = NO\n this._fullHeightView.style.position = 'absolute'\n this._fullHeightView.style.pointerEvents = 'none'\n this._fullHeightView.frame = bounds.rectangleWithHeight((positions.lastElement || nil).bottomY)\n .rectangleWithWidth(1) // Minimal width\n } else {\n this._fullHeightView.frame = bounds.rectangleWithHeight((positions.lastElement || nil).bottomY)\n .rectangleWithWidth(bounds.width * 0.5)\n }\n \n this._firstLayoutVisibleRows = []\n \n }\n \n private _animateLayoutAllRows() {\n \n UIView.animateViewOrViewsWithDurationDelayAndFunction(\n this._visibleRows,\n this.animationDuration,\n 0,\n undefined,\n () => {\n \n this._layoutAllRows()\n \n },\n () => {\n \n \n }\n )\n \n }\n \n \n override layoutSubviews() {\n \n const previousPositions: UITableViewReusableViewPositionObject[] = JSON.parse(JSON.stringify(this._rowPositions))\n \n const previousVisibleRowsLength = this._visibleRows.length\n \n if (this._needsDrawingOfVisibleRowsBeforeLayout) {\n \n if (this._useViewportScrolling) {\n this._drawVisibleRowsInViewport()\n } else {\n this._drawVisibleRows()\n }\n \n this._needsDrawingOfVisibleRowsBeforeLayout = NO\n \n }\n \n \n super.layoutSubviews()\n \n \n if (!this.numberOfRows() || !this.isMemberOfViewTree) {\n \n return\n \n }\n \n \n if (this._shouldAnimateNextLayout) {\n \n \n // Need to do layout with the previous positions\n \n this._layoutAllRows(previousPositions)\n \n \n if (previousVisibleRowsLength < this._visibleRows.length) {\n \n \n UIView.runFunctionBeforeNextFrame(() => {\n \n this._animateLayoutAllRows()\n \n })\n \n }\n else {\n \n this._animateLayoutAllRows()\n \n }\n \n \n this._shouldAnimateNextLayout = NO\n \n }\n else {\n \n this._calculateAllPositions()\n \n this._layoutAllRows()\n \n \n }\n \n \n }\n \n \n override intrinsicContentHeight(constrainingWidth = 0) {\n \n \n let result = 0\n \n this._calculateAllPositions()\n \n if (this._rowPositions.length) {\n \n result = this._rowPositions[this._rowPositions.length - 1].bottomY\n \n }\n \n return result\n \n }\n \n \n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["result"]
|
|
7
7
|
}
|
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
import { UIColor } from "./UIColor";
|
|
2
2
|
import { UILocalizedTextObject } from "./UIInterfaces";
|
|
3
|
-
import { UIObject } from "./UIObject";
|
|
3
|
+
import { UIObject, ValueOf } from "./UIObject";
|
|
4
4
|
import { UIRectangle } from "./UIRectangle";
|
|
5
|
-
import type { ValueOf } from "./UIObject";
|
|
6
5
|
import { UIView, UIViewBroadcastEvent } from "./UIView";
|
|
7
6
|
export declare class UITextView extends UIView {
|
|
8
|
-
_textColor: UIColor;
|
|
9
|
-
_textAlignment?: ValueOf<typeof UITextView.textAlignment>;
|
|
10
|
-
_isSingleLine: boolean;
|
|
11
|
-
textPrefix: string;
|
|
12
|
-
textSuffix: string;
|
|
13
|
-
_notificationAmount: number;
|
|
14
|
-
_minFontSize?: number;
|
|
15
|
-
_maxFontSize?: number;
|
|
16
|
-
_automaticFontSizeSelection: boolean;
|
|
17
|
-
changesOften: boolean;
|
|
18
7
|
static defaultTextColor: UIColor;
|
|
19
8
|
static notificationTextColor: UIColor;
|
|
20
9
|
static _intrinsicHeightCache: {
|
|
@@ -27,24 +16,8 @@ export declare class UITextView extends UIView {
|
|
|
27
16
|
[x: string]: number;
|
|
28
17
|
};
|
|
29
18
|
} & UIObject;
|
|
30
|
-
_intrinsicHeightCache: {
|
|
31
|
-
[x: string]: {
|
|
32
|
-
[x: string]: number;
|
|
33
|
-
};
|
|
34
|
-
} & UIObject;
|
|
35
|
-
_intrinsicWidthCache: {
|
|
36
|
-
[x: string]: {
|
|
37
|
-
[x: string]: number;
|
|
38
|
-
};
|
|
39
|
-
} & UIObject;
|
|
40
19
|
static _ptToPx: number;
|
|
41
20
|
static _pxToPt: number;
|
|
42
|
-
_text?: string;
|
|
43
|
-
private _useFastMeasurement;
|
|
44
|
-
private _cachedMeasurementStyles;
|
|
45
|
-
usesVirtualLayoutingForIntrinsicSizing: boolean;
|
|
46
|
-
constructor(elementID?: string, textViewType?: string | ValueOf<typeof UITextView.type>, viewHTMLElement?: null);
|
|
47
|
-
static _determinePXAndPTRatios(): void;
|
|
48
21
|
static type: {
|
|
49
22
|
readonly paragraph: "p";
|
|
50
23
|
readonly header1: "h1";
|
|
@@ -64,6 +37,16 @@ export declare class UITextView extends UIView {
|
|
|
64
37
|
readonly right: "right";
|
|
65
38
|
readonly justify: "justify";
|
|
66
39
|
};
|
|
40
|
+
constructor(elementID?: string, textViewType?: string | ValueOf<typeof UITextView.type>, viewHTMLElement?: null);
|
|
41
|
+
didReceiveBroadcastEvent(event: UIViewBroadcastEvent): void;
|
|
42
|
+
willMoveToSuperview(superview: UIView): void;
|
|
43
|
+
layoutSubviews(): void;
|
|
44
|
+
private _invalidateMeasurementStyles;
|
|
45
|
+
private _getMeasurementStyles;
|
|
46
|
+
private _parseLineHeight;
|
|
47
|
+
private _shouldUseFastMeasurement;
|
|
48
|
+
setUseFastMeasurement(useFast: boolean): void;
|
|
49
|
+
invalidateMeasurementStrategy(): void;
|
|
67
50
|
get textAlignment(): ValueOf<typeof UITextView.textAlignment>;
|
|
68
51
|
set textAlignment(textAlignment: ValueOf<typeof UITextView.textAlignment>);
|
|
69
52
|
get textColor(): UIColor;
|
|
@@ -83,18 +66,45 @@ export declare class UITextView extends UIView {
|
|
|
83
66
|
get fontSize(): number;
|
|
84
67
|
set fontSize(fontSize: number);
|
|
85
68
|
useAutomaticFontSize(minFontSize?: number, maxFontSize?: number): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get a stable cache key for the font without triggering reflow.
|
|
71
|
+
* Only computes font on first access or when font properties change.
|
|
72
|
+
*/
|
|
73
|
+
private _getFontCacheKey;
|
|
74
|
+
/**
|
|
75
|
+
* Invalidate font cache when font properties change
|
|
76
|
+
*/
|
|
77
|
+
private _invalidateFontCache;
|
|
78
|
+
static _determinePXAndPTRatios(): void;
|
|
86
79
|
static automaticallyCalculatedFontSize(bounds: UIRectangle, currentSize: UIRectangle, currentFontSize: number, minFontSize?: number, maxFontSize?: number): number;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
80
|
+
_text?: string;
|
|
81
|
+
textPrefix: string;
|
|
82
|
+
textSuffix: string;
|
|
83
|
+
_notificationAmount: number;
|
|
84
|
+
_textColor: UIColor;
|
|
85
|
+
_textAlignment?: ValueOf<typeof UITextView.textAlignment>;
|
|
86
|
+
_isSingleLine: boolean;
|
|
87
|
+
_minFontSize?: number;
|
|
88
|
+
_maxFontSize?: number;
|
|
89
|
+
_automaticFontSizeSelection: boolean;
|
|
90
|
+
private _cachedFontKey?;
|
|
91
|
+
private _fontInvalidationTriggers;
|
|
92
|
+
changesOften: boolean;
|
|
93
|
+
_intrinsicHeightCache: {
|
|
94
|
+
[x: string]: {
|
|
95
|
+
[x: string]: number;
|
|
96
|
+
};
|
|
97
|
+
} & UIObject;
|
|
98
|
+
_intrinsicWidthCache: {
|
|
99
|
+
[x: string]: {
|
|
100
|
+
[x: string]: number;
|
|
101
|
+
};
|
|
102
|
+
} & UIObject;
|
|
103
|
+
private _useFastMeasurement;
|
|
104
|
+
private _cachedMeasurementStyles;
|
|
105
|
+
usesVirtualLayoutingForIntrinsicSizing: boolean;
|
|
90
106
|
intrinsicContentHeight(constrainingWidth?: number): any;
|
|
91
107
|
intrinsicContentWidth(constrainingHeight?: number): any;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
private _parseLineHeight;
|
|
95
|
-
intrinsicContentSizeWithConstraints(constrainingHeight?: number, constrainingWidth?: number): UIRectangle;
|
|
96
|
-
private _shouldUseFastMeasurement;
|
|
97
|
-
setUseFastMeasurement(useFast: boolean): void;
|
|
98
|
-
invalidateMeasurementStrategy(): void;
|
|
99
|
-
intrinsicContentSize(): UIRectangle;
|
|
108
|
+
addStyleClass(styleClass: string): void;
|
|
109
|
+
removeStyleClass(styleClass: string): void;
|
|
100
110
|
}
|