notations 0.0.46 → 0.0.49
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/lib/cjs/beats.d.ts +34 -69
- package/lib/cjs/beats.js +178 -439
- package/lib/cjs/beats.js.map +1 -1
- package/lib/cjs/beatutils.d.ts +3 -0
- package/lib/cjs/beatutils.js +64 -0
- package/lib/cjs/beatutils.js.map +1 -0
- package/lib/cjs/beatview.d.ts +18 -0
- package/lib/cjs/beatview.js +62 -0
- package/lib/cjs/beatview.js.map +1 -0
- package/lib/cjs/carnatic/LineView.d.ts +2 -7
- package/lib/cjs/carnatic/LineView.js +13 -31
- package/lib/cjs/carnatic/LineView.js.map +1 -1
- package/lib/cjs/carnatic/NotationView.d.ts +8 -7
- package/lib/cjs/carnatic/NotationView.js +76 -153
- package/lib/cjs/carnatic/NotationView.js.map +1 -1
- package/lib/cjs/carnatic/atomviews.js +149 -287
- package/lib/cjs/carnatic/atomviews.js.map +1 -1
- package/lib/cjs/carnatic/beatviews.d.ts +4 -13
- package/lib/cjs/carnatic/beatviews.js +23 -118
- package/lib/cjs/carnatic/beatviews.js.map +1 -1
- package/lib/cjs/carnatic/embelishments.d.ts +1 -1
- package/lib/cjs/carnatic/embelishments.js +189 -283
- package/lib/cjs/carnatic/embelishments.js.map +1 -1
- package/lib/cjs/carnatic/gamakas.js +15 -47
- package/lib/cjs/carnatic/gamakas.js.map +1 -1
- package/lib/cjs/commands.js +111 -271
- package/lib/cjs/commands.js.map +1 -1
- package/lib/cjs/core.d.ts +14 -1
- package/lib/cjs/core.js +291 -477
- package/lib/cjs/core.js.map +1 -1
- package/lib/cjs/cycle.js +175 -367
- package/lib/cjs/cycle.js.map +1 -1
- package/lib/cjs/entity.js +48 -102
- package/lib/cjs/entity.js.map +1 -1
- package/lib/cjs/grids.d.ts +125 -0
- package/lib/cjs/grids.js +550 -0
- package/lib/cjs/grids.js.map +1 -0
- package/lib/cjs/iterators.js +96 -234
- package/lib/cjs/iterators.js.map +1 -1
- package/lib/cjs/layouts.d.ts +1 -1
- package/lib/cjs/layouts.js +62 -98
- package/lib/cjs/layouts.js.map +1 -1
- package/lib/cjs/loader.d.ts +2 -2
- package/lib/cjs/loader.js +23 -123
- package/lib/cjs/loader.js.map +1 -1
- package/lib/cjs/notation.d.ts +0 -3
- package/lib/cjs/notation.js +139 -241
- package/lib/cjs/notation.js.map +1 -1
- package/lib/cjs/parser.d.ts +2 -0
- package/lib/cjs/parser.js +225 -214
- package/lib/cjs/parser.js.map +1 -1
- package/lib/cjs/shapes.js +149 -283
- package/lib/cjs/shapes.js.map +1 -1
- package/lib/cjs/utils.d.ts +8 -0
- package/lib/cjs/utils.js +60 -55
- package/lib/cjs/utils.js.map +1 -1
- package/lib/esm/beats.d.ts +34 -69
- package/lib/esm/beats.js +172 -438
- package/lib/esm/beats.js.map +1 -1
- package/lib/esm/beatutils.d.ts +3 -0
- package/lib/esm/beatutils.js +37 -0
- package/lib/esm/beatutils.js.map +1 -0
- package/lib/esm/beatview.d.ts +18 -0
- package/lib/esm/beatview.js +35 -0
- package/lib/esm/beatview.js.map +1 -0
- package/lib/esm/carnatic/LineView.d.ts +2 -7
- package/lib/esm/carnatic/LineView.js +12 -31
- package/lib/esm/carnatic/LineView.js.map +1 -1
- package/lib/esm/carnatic/NotationView.d.ts +8 -7
- package/lib/esm/carnatic/NotationView.js +74 -152
- package/lib/esm/carnatic/NotationView.js.map +1 -1
- package/lib/esm/carnatic/atomviews.js +144 -284
- package/lib/esm/carnatic/atomviews.js.map +1 -1
- package/lib/esm/carnatic/beatviews.d.ts +4 -13
- package/lib/esm/carnatic/beatviews.js +21 -94
- package/lib/esm/carnatic/beatviews.js.map +1 -1
- package/lib/esm/carnatic/embelishments.d.ts +1 -1
- package/lib/esm/carnatic/embelishments.js +187 -296
- package/lib/esm/carnatic/embelishments.js.map +1 -1
- package/lib/esm/carnatic/gamakas.js +14 -48
- package/lib/esm/carnatic/gamakas.js.map +1 -1
- package/lib/esm/commands.js +100 -271
- package/lib/esm/commands.js.map +1 -1
- package/lib/esm/core.d.ts +14 -1
- package/lib/esm/core.js +287 -484
- package/lib/esm/core.js.map +1 -1
- package/lib/esm/cycle.js +172 -367
- package/lib/esm/cycle.js.map +1 -1
- package/lib/esm/entity.js +48 -104
- package/lib/esm/entity.js.map +1 -1
- package/lib/esm/grids.d.ts +125 -0
- package/lib/esm/grids.js +517 -0
- package/lib/esm/grids.js.map +1 -0
- package/lib/esm/iterators.js +93 -235
- package/lib/esm/iterators.js.map +1 -1
- package/lib/esm/layouts.d.ts +1 -1
- package/lib/esm/layouts.js +60 -97
- package/lib/esm/layouts.js.map +1 -1
- package/lib/esm/loader.d.ts +2 -2
- package/lib/esm/loader.js +20 -120
- package/lib/esm/loader.js.map +1 -1
- package/lib/esm/notation.d.ts +0 -3
- package/lib/esm/notation.js +135 -242
- package/lib/esm/notation.js.map +1 -1
- package/lib/esm/parser.d.ts +2 -0
- package/lib/esm/parser.js +220 -210
- package/lib/esm/parser.js.map +1 -1
- package/lib/esm/shapes.js +148 -288
- package/lib/esm/shapes.js.map +1 -1
- package/lib/esm/utils.d.ts +8 -0
- package/lib/esm/utils.js +55 -51
- package/lib/esm/utils.js.map +1 -1
- package/package.json +18 -17
package/lib/cjs/grids.js
ADDED
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.GridLayoutGroup = exports.RowAlign = exports.ColAlign = exports.AlignedLine = exports.GridRow = exports.GridCell = exports.GridCellEvent = exports.GridModel = void 0;
|
|
27
|
+
const TSU = __importStar(require("@panyam/tsutils"));
|
|
28
|
+
class GridModel extends TSU.Events.EventEmitter {
|
|
29
|
+
constructor() {
|
|
30
|
+
super(...arguments);
|
|
31
|
+
this.uuid = GridModel.idCounter++;
|
|
32
|
+
this.lastUpdatedAt = 0;
|
|
33
|
+
this.rows = [];
|
|
34
|
+
this.rowAligns = new Map();
|
|
35
|
+
this.colAligns = new Map();
|
|
36
|
+
}
|
|
37
|
+
debugValue() {
|
|
38
|
+
const out = {
|
|
39
|
+
rows: this.rows.map((r) => r.debugValue()),
|
|
40
|
+
lastUpdatedAt: this.lastUpdatedAt,
|
|
41
|
+
};
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
get firstRow() {
|
|
45
|
+
for (const gr of this.rows) {
|
|
46
|
+
if (gr.numCells > 0)
|
|
47
|
+
return gr.rowIndex;
|
|
48
|
+
}
|
|
49
|
+
return -1;
|
|
50
|
+
}
|
|
51
|
+
get firstCol() {
|
|
52
|
+
let minCol = -1;
|
|
53
|
+
for (const gr of this.rows) {
|
|
54
|
+
const fc = gr.firstCol;
|
|
55
|
+
if (fc >= 0) {
|
|
56
|
+
if (minCol < 0 || fc < minCol) {
|
|
57
|
+
minCol = fc;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return minCol;
|
|
62
|
+
}
|
|
63
|
+
cellsInRow(row) {
|
|
64
|
+
const out = [];
|
|
65
|
+
const gr = this.rows[row];
|
|
66
|
+
if (gr) {
|
|
67
|
+
for (const cell of gr.cells) {
|
|
68
|
+
if (cell === null || cell === void 0 ? void 0 : cell.value)
|
|
69
|
+
out.push(cell);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
cellsInCol(col) {
|
|
75
|
+
const out = [];
|
|
76
|
+
for (const gr of this.rows) {
|
|
77
|
+
const cell = gr.cellAt(col);
|
|
78
|
+
if (cell === null || cell === void 0 ? void 0 : cell.value)
|
|
79
|
+
out.push(cell);
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
addRowAlign(align) {
|
|
84
|
+
this.rowAligns.set(align.uuid, align);
|
|
85
|
+
}
|
|
86
|
+
addColAlign(align) {
|
|
87
|
+
this.colAligns.set(align.uuid, align);
|
|
88
|
+
}
|
|
89
|
+
addRows(insertBefore = -1, numRows = 1) {
|
|
90
|
+
if (insertBefore < 0) {
|
|
91
|
+
insertBefore = this.rows.length;
|
|
92
|
+
}
|
|
93
|
+
let next = this.rows[insertBefore] || null;
|
|
94
|
+
const prev = this.rows[insertBefore - 1] || null;
|
|
95
|
+
for (let i = numRows - 1; i >= 0; i--) {
|
|
96
|
+
const newRow = new GridRow(this, insertBefore + i);
|
|
97
|
+
this.rows.splice(insertBefore, 0, newRow);
|
|
98
|
+
if (next != null) {
|
|
99
|
+
newRow.defaultRowAlign.addSuccessor(next.defaultRowAlign);
|
|
100
|
+
}
|
|
101
|
+
if (i == 0 && insertBefore > 0) {
|
|
102
|
+
prev.defaultRowAlign.addSuccessor(newRow.defaultRowAlign);
|
|
103
|
+
}
|
|
104
|
+
next = newRow;
|
|
105
|
+
}
|
|
106
|
+
for (let i = insertBefore + numRows; i < this.rows.length; i++) {
|
|
107
|
+
this.rows[i].rowIndex += numRows;
|
|
108
|
+
}
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
111
|
+
getRow(row) {
|
|
112
|
+
if (row >= this.rows.length) {
|
|
113
|
+
this.addRows(-1, 1 + row - this.rows.length);
|
|
114
|
+
}
|
|
115
|
+
return this.rows[row];
|
|
116
|
+
}
|
|
117
|
+
setValue(row, col, value, cellCreator) {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
const grow = this.getRow(row);
|
|
120
|
+
if (!cellCreator) {
|
|
121
|
+
cellCreator = (row, col) => {
|
|
122
|
+
return new GridCell(row, col);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (value == null) {
|
|
126
|
+
const out = grow.clearCellAt(col);
|
|
127
|
+
if (out != null) {
|
|
128
|
+
(_a = this.eventHub) === null || _a === void 0 ? void 0 : _a.emit(GridCellEvent.CLEARED, this, {
|
|
129
|
+
loc: out.location,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const cell = grow.cellAt(col, cellCreator);
|
|
136
|
+
const oldValue = cell.value;
|
|
137
|
+
(_b = this.eventHub) === null || _b === void 0 ? void 0 : _b.emit(GridCellEvent.UPDATED, this, {
|
|
138
|
+
loc: cell.location,
|
|
139
|
+
cell: cell,
|
|
140
|
+
oldValue: cell.value,
|
|
141
|
+
});
|
|
142
|
+
cell.value = value;
|
|
143
|
+
return oldValue;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
eventHubChanged() {
|
|
147
|
+
console.log("Event Hub Changed for GridModel");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.GridModel = GridModel;
|
|
151
|
+
GridModel.idCounter = 0;
|
|
152
|
+
var GridCellEvent;
|
|
153
|
+
(function (GridCellEvent) {
|
|
154
|
+
GridCellEvent["ADDED"] = "CellAdded";
|
|
155
|
+
GridCellEvent["CLEARED"] = "CellCleared";
|
|
156
|
+
GridCellEvent["REMOVED"] = "CellRemoved";
|
|
157
|
+
GridCellEvent["UPDATED"] = "CellUpdated";
|
|
158
|
+
GridCellEvent["MOVED"] = "CellMoved";
|
|
159
|
+
})(GridCellEvent = exports.GridCellEvent || (exports.GridCellEvent = {}));
|
|
160
|
+
class GridCell {
|
|
161
|
+
constructor(gridRow, colIndex, value = null) {
|
|
162
|
+
this.gridRow = gridRow;
|
|
163
|
+
this.colIndex = colIndex;
|
|
164
|
+
this.value = value;
|
|
165
|
+
this.uuid = GridCell.idCounter++;
|
|
166
|
+
this.rowAlign = gridRow.defaultRowAlign;
|
|
167
|
+
}
|
|
168
|
+
get rowAlign() {
|
|
169
|
+
return this._rowAlign;
|
|
170
|
+
}
|
|
171
|
+
set rowAlign(val) {
|
|
172
|
+
val.addCell(this);
|
|
173
|
+
this._rowAlign = val;
|
|
174
|
+
}
|
|
175
|
+
get colAlign() {
|
|
176
|
+
return this._colAlign;
|
|
177
|
+
}
|
|
178
|
+
set colAlign(val) {
|
|
179
|
+
val.addCell(this);
|
|
180
|
+
this._colAlign = val;
|
|
181
|
+
}
|
|
182
|
+
get location() {
|
|
183
|
+
return this.gridRow.rowIndex + ":" + this.colIndex;
|
|
184
|
+
}
|
|
185
|
+
get grid() {
|
|
186
|
+
return this.gridRow.grid;
|
|
187
|
+
}
|
|
188
|
+
get rowIndex() {
|
|
189
|
+
return this.gridRow.rowIndex;
|
|
190
|
+
}
|
|
191
|
+
debugValue() {
|
|
192
|
+
const out = {
|
|
193
|
+
r: this.gridRow.rowIndex,
|
|
194
|
+
c: this.colIndex,
|
|
195
|
+
value: this.value,
|
|
196
|
+
y: this.rowAlign.coordOffset,
|
|
197
|
+
h: this.rowAlign.maxLength,
|
|
198
|
+
};
|
|
199
|
+
if (this.colAlign) {
|
|
200
|
+
out.x = this.colAlign.coordOffset;
|
|
201
|
+
out.w = this.colAlign.maxLength;
|
|
202
|
+
}
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
exports.GridCell = GridCell;
|
|
207
|
+
GridCell.idCounter = 0;
|
|
208
|
+
class GridRow {
|
|
209
|
+
constructor(grid, rowIndex) {
|
|
210
|
+
this.grid = grid;
|
|
211
|
+
this.rowIndex = rowIndex;
|
|
212
|
+
this.cells = [];
|
|
213
|
+
this.defaultRowAlign = new RowAlign();
|
|
214
|
+
this.grid.addRowAlign(this.defaultRowAlign);
|
|
215
|
+
}
|
|
216
|
+
get firstCol() {
|
|
217
|
+
var _a;
|
|
218
|
+
for (let i = 0; i < this.cells.length; i++) {
|
|
219
|
+
if ((_a = this.cells[i]) === null || _a === void 0 ? void 0 : _a.value) {
|
|
220
|
+
return i;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return -1;
|
|
224
|
+
}
|
|
225
|
+
get numCols() {
|
|
226
|
+
return this.cells.length;
|
|
227
|
+
}
|
|
228
|
+
get numCells() {
|
|
229
|
+
let i = 0;
|
|
230
|
+
for (const cell of this.cells) {
|
|
231
|
+
if (cell != null && cell.value != null)
|
|
232
|
+
i++;
|
|
233
|
+
}
|
|
234
|
+
return i;
|
|
235
|
+
}
|
|
236
|
+
cellAt(col, creator) {
|
|
237
|
+
let out = this.cells[col] || null;
|
|
238
|
+
if (!out && creator) {
|
|
239
|
+
this.cells[col] = out = creator(this, col);
|
|
240
|
+
out.gridRow = this;
|
|
241
|
+
out.colIndex = col;
|
|
242
|
+
if (out.rowAlign) {
|
|
243
|
+
this.grid.addRowAlign(out.rowAlign);
|
|
244
|
+
}
|
|
245
|
+
if (out.colAlign) {
|
|
246
|
+
this.grid.addColAlign(out.colAlign);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return out;
|
|
250
|
+
}
|
|
251
|
+
clearCellAt(col) {
|
|
252
|
+
const out = this.cells[col] || null;
|
|
253
|
+
if (out) {
|
|
254
|
+
this.cells[col] = null;
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
}
|
|
258
|
+
debugValue() {
|
|
259
|
+
return {
|
|
260
|
+
r: this.rowIndex,
|
|
261
|
+
cells: this.cells.filter((c) => c).map((c) => c === null || c === void 0 ? void 0 : c.debugValue()),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
exports.GridRow = GridRow;
|
|
266
|
+
class AlignedLine {
|
|
267
|
+
constructor() {
|
|
268
|
+
this.uuid = AlignedLine.idCounter++;
|
|
269
|
+
this.needsLayout = false;
|
|
270
|
+
this._coordOffset = 0;
|
|
271
|
+
this._maxLength = 0;
|
|
272
|
+
this.paddingBefore = 15;
|
|
273
|
+
this.paddingAfter = 15;
|
|
274
|
+
this.cells = [];
|
|
275
|
+
this.prevLines = [];
|
|
276
|
+
this.nextLines = [];
|
|
277
|
+
}
|
|
278
|
+
get coordOffset() {
|
|
279
|
+
return this._coordOffset;
|
|
280
|
+
}
|
|
281
|
+
get maxLength() {
|
|
282
|
+
return this._maxLength + this.paddingBefore + this.paddingAfter;
|
|
283
|
+
}
|
|
284
|
+
setMaxLength(length) {
|
|
285
|
+
this._maxLength = length;
|
|
286
|
+
}
|
|
287
|
+
setPadding(before, after) {
|
|
288
|
+
if (before >= 0) {
|
|
289
|
+
this.paddingBefore = before;
|
|
290
|
+
}
|
|
291
|
+
if (after >= 0) {
|
|
292
|
+
this.paddingAfter = after;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
addCell(cell) {
|
|
296
|
+
if (this.beforeAddingCell(cell)) {
|
|
297
|
+
this.cells.push(cell);
|
|
298
|
+
}
|
|
299
|
+
return this;
|
|
300
|
+
}
|
|
301
|
+
removeCell(cell) {
|
|
302
|
+
if (this.beforeRemovingCell(cell)) {
|
|
303
|
+
for (let i = 0; i < this.cells.length; i++) {
|
|
304
|
+
if (this.cells[i].uuid == cell.uuid) {
|
|
305
|
+
this.cells.splice(i, 1);
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return this;
|
|
311
|
+
}
|
|
312
|
+
addSuccessor(next) {
|
|
313
|
+
for (const c of this.nextLines) {
|
|
314
|
+
if (c == next)
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
this.nextLines.push(next);
|
|
318
|
+
next.prevLines.push(this);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
exports.AlignedLine = AlignedLine;
|
|
322
|
+
AlignedLine.idCounter = 0;
|
|
323
|
+
class ColAlign extends AlignedLine {
|
|
324
|
+
setOffset(val) {
|
|
325
|
+
this._coordOffset = val;
|
|
326
|
+
for (const cell of this.cells) {
|
|
327
|
+
if (cell.value) {
|
|
328
|
+
const cellView = this.getCellView(cell);
|
|
329
|
+
if (this._maxLength <= 0) {
|
|
330
|
+
this.evalMaxLength();
|
|
331
|
+
}
|
|
332
|
+
cellView.setBounds(val, null, this.maxLength, null, true);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
evalMaxLength(changedCells = []) {
|
|
337
|
+
this._maxLength = 0;
|
|
338
|
+
for (const cell of this.cells) {
|
|
339
|
+
if (cell.value) {
|
|
340
|
+
const cellView = this.getCellView(cell);
|
|
341
|
+
this._maxLength = Math.max(cellView.minSize.width, this._maxLength);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return this._maxLength;
|
|
345
|
+
}
|
|
346
|
+
beforeAddingCell(cell) {
|
|
347
|
+
if (cell.colAlign && cell.colAlign != this) {
|
|
348
|
+
cell.colAlign.removeCell(cell);
|
|
349
|
+
}
|
|
350
|
+
return cell.colAlign != this;
|
|
351
|
+
}
|
|
352
|
+
beforeRemovingCell(cell) {
|
|
353
|
+
return cell.colAlign == this;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
exports.ColAlign = ColAlign;
|
|
357
|
+
class RowAlign extends AlignedLine {
|
|
358
|
+
setOffset(val) {
|
|
359
|
+
this._coordOffset = val;
|
|
360
|
+
for (const cell of this.cells) {
|
|
361
|
+
if (cell.value) {
|
|
362
|
+
const cellView = this.getCellView(cell);
|
|
363
|
+
if (this._maxLength <= 0) {
|
|
364
|
+
this.evalMaxLength();
|
|
365
|
+
}
|
|
366
|
+
cellView.setBounds(null, val, null, this.maxLength, true);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
evalMaxLength(changedCells = []) {
|
|
371
|
+
this._maxLength = 0;
|
|
372
|
+
for (const cell of this.cells) {
|
|
373
|
+
if (cell.value) {
|
|
374
|
+
const cellView = this.getCellView(cell);
|
|
375
|
+
this._maxLength = Math.max(cellView.minSize.height, this._maxLength);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return this._maxLength;
|
|
379
|
+
}
|
|
380
|
+
beforeAddingCell(cell) {
|
|
381
|
+
if (cell.rowAlign && cell.rowAlign != this) {
|
|
382
|
+
cell.rowAlign.removeCell(cell);
|
|
383
|
+
}
|
|
384
|
+
return cell.rowAlign != this;
|
|
385
|
+
}
|
|
386
|
+
beforeRemovingCell(cell) {
|
|
387
|
+
return cell.rowAlign == this;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
exports.RowAlign = RowAlign;
|
|
391
|
+
class GridLayoutGroup {
|
|
392
|
+
constructor() {
|
|
393
|
+
this.gridModels = [];
|
|
394
|
+
this.eventHandler = (event) => {
|
|
395
|
+
this.applyModelEvents(event.payload);
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
addGridModel(gridModel) {
|
|
399
|
+
var _a;
|
|
400
|
+
(_a = gridModel.eventHub) === null || _a === void 0 ? void 0 : _a.on(TSU.Events.EventHub.BATCH_EVENTS, this.eventHandler);
|
|
401
|
+
this.gridModels.push(gridModel);
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
startingRowAligns() {
|
|
405
|
+
const out = [];
|
|
406
|
+
const visited = {};
|
|
407
|
+
for (const gm of this.gridModels) {
|
|
408
|
+
for (const cell of gm.cellsInRow(gm.firstRow)) {
|
|
409
|
+
if (cell.rowAlign && !visited[cell.rowAlign.uuid]) {
|
|
410
|
+
visited[cell.rowAlign.uuid] = true;
|
|
411
|
+
out.push(cell.rowAlign);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return out;
|
|
416
|
+
}
|
|
417
|
+
startingColAligns() {
|
|
418
|
+
const out = [];
|
|
419
|
+
const visited = {};
|
|
420
|
+
for (const gm of this.gridModels) {
|
|
421
|
+
for (const cell of gm.cellsInCol(gm.firstCol)) {
|
|
422
|
+
if (cell.colAlign && !visited[cell.colAlign.uuid]) {
|
|
423
|
+
visited[cell.colAlign.uuid] = true;
|
|
424
|
+
out.push(cell.colAlign);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return out;
|
|
429
|
+
}
|
|
430
|
+
removeGridModel(gridModel) {
|
|
431
|
+
var _a;
|
|
432
|
+
(_a = gridModel.eventHub) === null || _a === void 0 ? void 0 : _a.removeOn(TSU.Events.EventHub.BATCH_EVENTS, this.eventHandler);
|
|
433
|
+
}
|
|
434
|
+
get startingRows() {
|
|
435
|
+
return this.startingRowAligns();
|
|
436
|
+
}
|
|
437
|
+
get startingCols() {
|
|
438
|
+
return this.startingColAligns();
|
|
439
|
+
}
|
|
440
|
+
refreshLayout() {
|
|
441
|
+
const changedRowAligns = {};
|
|
442
|
+
const changedColAligns = {};
|
|
443
|
+
for (const rowAlign of this.startingRowAligns()) {
|
|
444
|
+
if (!(rowAlign.uuid in changedRowAligns)) {
|
|
445
|
+
changedRowAligns[rowAlign.uuid] = {
|
|
446
|
+
align: rowAlign,
|
|
447
|
+
cells: [],
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
for (const colAlign of this.startingColAligns()) {
|
|
452
|
+
if (!(colAlign.uuid in changedColAligns)) {
|
|
453
|
+
changedColAligns[colAlign.uuid] = {
|
|
454
|
+
align: colAlign,
|
|
455
|
+
cells: [],
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
this.doBfsLayout(this.startingRows, changedRowAligns);
|
|
460
|
+
this.doBfsLayout(this.startingCols, changedColAligns);
|
|
461
|
+
}
|
|
462
|
+
applyModelEvents(events) {
|
|
463
|
+
const [changedRowAligns, changedColAligns] = this.changesForEvents(events);
|
|
464
|
+
this.doBfsLayout(this.startingRows, changedRowAligns);
|
|
465
|
+
this.doBfsLayout(this.startingCols, changedColAligns);
|
|
466
|
+
}
|
|
467
|
+
changesForEvents(events) {
|
|
468
|
+
const cellVisited = {};
|
|
469
|
+
const changedRowAligns = {};
|
|
470
|
+
const changedColAligns = {};
|
|
471
|
+
for (let i = events.length - 1; i >= 0; i--) {
|
|
472
|
+
const event = events[i];
|
|
473
|
+
const loc = event.payload.loc;
|
|
474
|
+
if (cellVisited[loc])
|
|
475
|
+
continue;
|
|
476
|
+
cellVisited[loc] = true;
|
|
477
|
+
const [row, col] = loc.split(":").map((x) => parseInt(x));
|
|
478
|
+
const gridModel = event.source;
|
|
479
|
+
const cell = gridModel.getRow(row).cellAt(col);
|
|
480
|
+
if (cell) {
|
|
481
|
+
if (!(cell.rowAlign.uuid in changedRowAligns)) {
|
|
482
|
+
changedRowAligns[cell.rowAlign.uuid] = {
|
|
483
|
+
align: cell.rowAlign,
|
|
484
|
+
cells: [],
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
changedRowAligns[cell.rowAlign.uuid]["cells"].push(cell);
|
|
488
|
+
if (!(cell.colAlign.uuid in changedColAligns)) {
|
|
489
|
+
changedColAligns[cell.colAlign.uuid] = {
|
|
490
|
+
align: cell.colAlign,
|
|
491
|
+
cells: [],
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
changedColAligns[cell.colAlign.uuid]["cells"].push(cell);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return [changedRowAligns, changedColAligns];
|
|
498
|
+
}
|
|
499
|
+
ensureGetCellView(align) {
|
|
500
|
+
if (!align.getCellView) {
|
|
501
|
+
if (!this.getCellView) {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
align.getCellView = this.getCellView;
|
|
505
|
+
}
|
|
506
|
+
return align.getCellView;
|
|
507
|
+
}
|
|
508
|
+
doBfsLayout(startingLines, changedAligns) {
|
|
509
|
+
if (!this.getCellView)
|
|
510
|
+
return;
|
|
511
|
+
for (const alignId in changedAligns) {
|
|
512
|
+
const val = changedAligns[alignId];
|
|
513
|
+
this.ensureGetCellView(val.align);
|
|
514
|
+
val.align.evalMaxLength(val.cells);
|
|
515
|
+
}
|
|
516
|
+
let lineQueue = [];
|
|
517
|
+
const visitedLines = {};
|
|
518
|
+
for (const line of startingLines)
|
|
519
|
+
lineQueue.push([null, line]);
|
|
520
|
+
const lineOffsetChanged = {};
|
|
521
|
+
while (lineQueue.length > 0) {
|
|
522
|
+
const nextQueue = [];
|
|
523
|
+
for (let i = 0; i < lineQueue.length; i++) {
|
|
524
|
+
const [prevLineAlign, lineAlign] = lineQueue[i];
|
|
525
|
+
visitedLines[lineAlign.uuid] = true;
|
|
526
|
+
let newOffset = lineAlign.coordOffset;
|
|
527
|
+
let lineChanged = lineAlign.uuid in changedAligns;
|
|
528
|
+
if (prevLineAlign) {
|
|
529
|
+
if (lineOffsetChanged[prevLineAlign.uuid]) {
|
|
530
|
+
newOffset = prevLineAlign.coordOffset + prevLineAlign.maxLength;
|
|
531
|
+
lineChanged = true;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
if (lineChanged) {
|
|
535
|
+
this.ensureGetCellView(lineAlign);
|
|
536
|
+
lineAlign.setOffset(newOffset);
|
|
537
|
+
lineOffsetChanged[lineAlign.uuid] = true;
|
|
538
|
+
}
|
|
539
|
+
for (const next of lineAlign.nextLines) {
|
|
540
|
+
if (!visitedLines[next.uuid]) {
|
|
541
|
+
nextQueue.push([lineAlign, next]);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
lineQueue = nextQueue;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
exports.GridLayoutGroup = GridLayoutGroup;
|
|
550
|
+
//# sourceMappingURL=grids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grids.js","sourceRoot":"","sources":["../../src/grids.ts"],"names":[],"mappings":"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","sourcesContent":["import * as TSU from \"@panyam/tsutils\";\n// import * as kiwi from \"@lume/kiwi\";\n\n/**\n * A generic way to host child views in a grid (very similar to gridbag\n * layout) This allows us to have a framework for hosting BeatViews instead\n * of mucking about with beat rows and beat columns etc.\n *\n * Grid \"cells\" can be referred by cell indexes. Additionally we want our\n * grid rows and columns to have names (like in Spreadsheets) so that even\n * when rows and columns are inserted, though indexes may change, the\n * \"addresses\" will be fixed and immovable. This helps us do things like\n * insert a new new column (say for markers) and not have to worry other\n * columns index changes impacting us.\n */\nexport class GridModel extends TSU.Events.EventEmitter {\n private static idCounter = 0;\n readonly uuid = GridModel.idCounter++;\n lastUpdatedAt = 0;\n // cells = new SparseArray<SparseArray<GridCell>>();\n rows: GridRow[] = [];\n rowAligns = new Map<number, RowAlign>();\n colAligns = new Map<number, ColAlign>();\n\n debugValue() {\n const out = {\n rows: this.rows.map((r) => r.debugValue()),\n lastUpdatedAt: this.lastUpdatedAt,\n } as any;\n return out;\n }\n\n get firstRow(): number {\n for (const gr of this.rows) {\n if (gr.numCells > 0) return gr.rowIndex;\n }\n return -1;\n }\n\n get firstCol(): number {\n let minCol = -1;\n for (const gr of this.rows) {\n const fc = gr.firstCol;\n if (fc >= 0) {\n if (minCol < 0 || fc < minCol) {\n minCol = fc;\n }\n }\n }\n return minCol;\n }\n\n cellsInRow(row: number): GridCell[] {\n const out = [] as GridCell[];\n const gr = this.rows[row];\n if (gr) {\n for (const cell of gr.cells) {\n if (cell?.value) out.push(cell);\n }\n }\n return out;\n }\n\n cellsInCol(col: number): GridCell[] {\n const out = [] as GridCell[];\n for (const gr of this.rows) {\n const cell = gr.cellAt(col);\n if (cell?.value) out.push(cell);\n }\n return out;\n }\n\n addRowAlign(align: RowAlign): void {\n this.rowAligns.set(align.uuid, align);\n }\n\n addColAlign(align: ColAlign): void {\n this.colAligns.set(align.uuid, align);\n }\n\n addRows(insertBefore = -1, numRows = 1): this {\n if (insertBefore < 0) {\n insertBefore = this.rows.length;\n }\n let next = this.rows[insertBefore] || null;\n const prev = this.rows[insertBefore - 1] || null;\n for (let i = numRows - 1; i >= 0; i--) {\n const newRow = new GridRow(this, insertBefore + i);\n this.rows.splice(insertBefore, 0, newRow);\n if (next != null) {\n newRow.defaultRowAlign.addSuccessor(next.defaultRowAlign);\n }\n if (i == 0 && insertBefore > 0) {\n prev.defaultRowAlign.addSuccessor(newRow.defaultRowAlign);\n }\n next = newRow;\n }\n for (let i = insertBefore + numRows; i < this.rows.length; i++) {\n this.rows[i].rowIndex += numRows;\n }\n return this;\n }\n\n getRow(row: number): GridRow {\n if (row >= this.rows.length) {\n this.addRows(-1, 1 + row - this.rows.length);\n }\n return this.rows[row];\n }\n\n setValue(row: number, col: number, value: any, cellCreator?: (row: GridRow, col: number) => GridCell): any {\n const grow = this.getRow(row);\n if (!cellCreator) {\n cellCreator = (row: GridRow, col: number) => {\n return new GridCell(row, col);\n };\n }\n if (value == null) {\n const out = grow.clearCellAt(col);\n if (out != null) {\n this.eventHub?.emit(GridCellEvent.CLEARED, this, {\n loc: out.location,\n });\n }\n return out;\n } else {\n const cell = grow.cellAt(col, cellCreator) as GridCell;\n const oldValue = cell.value;\n this.eventHub?.emit(GridCellEvent.UPDATED, this, {\n loc: cell.location,\n cell: cell,\n oldValue: cell.value,\n });\n cell.value = value;\n return oldValue;\n }\n }\n\n protected eventHubChanged(): void {\n console.log(\"Event Hub Changed for GridModel\");\n }\n}\n\nexport interface GridCellView {\n readonly cell: GridCell;\n x: number;\n y: number;\n width: number;\n height: number;\n setBounds(\n x: number | null,\n y: number | null,\n w: number | null,\n h: number | null,\n applyLayout: boolean,\n ): [number | null, number | null, number | null, number | null];\n readonly needsLayout: boolean;\n readonly minSize: TSU.Geom.Size;\n readonly bbox: TSU.Geom.Rect;\n}\n\nexport enum GridCellEvent {\n ADDED = \"CellAdded\",\n CLEARED = \"CellCleared\",\n REMOVED = \"CellRemoved\",\n UPDATED = \"CellUpdated\",\n MOVED = \"CellMoved\",\n}\n\n/**\n * Interface for a view for a given cell in the grid.\n */\nexport class GridCell {\n private static idCounter = 0;\n readonly uuid = GridCell.idCounter++;\n cellView: GridCellView | null;\n private _rowAlign: RowAlign;\n private _colAlign: ColAlign;\n\n constructor(public gridRow: GridRow, public colIndex: number, public value: any = null) {\n this.rowAlign = gridRow.defaultRowAlign;\n }\n\n get rowAlign(): RowAlign {\n return this._rowAlign;\n }\n\n set rowAlign(val: RowAlign) {\n val.addCell(this);\n this._rowAlign = val;\n }\n\n get colAlign(): ColAlign {\n return this._colAlign;\n }\n\n set colAlign(val: ColAlign) {\n val.addCell(this);\n this._colAlign = val;\n }\n\n get location(): string {\n return this.gridRow.rowIndex + \":\" + this.colIndex;\n }\n\n get grid(): GridModel {\n return this.gridRow.grid;\n }\n\n get rowIndex(): number {\n return this.gridRow.rowIndex;\n }\n\n debugValue() {\n const out = {\n r: this.gridRow.rowIndex,\n c: this.colIndex,\n value: this.value,\n y: this.rowAlign.coordOffset,\n h: this.rowAlign.maxLength,\n } as any;\n if (this.colAlign) {\n out.x = this.colAlign.coordOffset;\n out.w = this.colAlign.maxLength;\n }\n return out;\n }\n}\n\n/**\n * Represents a row of grid cells in a GridModel\n */\nexport class GridRow {\n cells: (null | GridCell)[] = [];\n // The default vertical alignment manager for all cells in this row\n defaultRowAlign: RowAlign;\n\n constructor(public grid: GridModel, public rowIndex: number) {\n this.defaultRowAlign = new RowAlign();\n this.grid.addRowAlign(this.defaultRowAlign);\n }\n\n get firstCol() {\n for (let i = 0; i < this.cells.length; i++) {\n if (this.cells[i]?.value) {\n return i;\n }\n }\n return -1;\n }\n\n get numCols() {\n return this.cells.length;\n }\n\n /**\n * Returns the number of cells that contain values.\n */\n get numCells() {\n let i = 0;\n for (const cell of this.cells) {\n if (cell != null && cell.value != null) i++;\n }\n return i;\n }\n\n cellAt(col: number, creator?: (row: GridRow, col: number) => GridCell): GridCell | null {\n let out = this.cells[col] || null;\n if (!out && creator) {\n this.cells[col] = out = creator(this, col);\n out.gridRow = this;\n out.colIndex = col;\n if (out.rowAlign) {\n this.grid.addRowAlign(out.rowAlign);\n }\n if (out.colAlign) {\n this.grid.addColAlign(out.colAlign);\n }\n }\n return out;\n }\n\n // Clears the cell at the given column.\n // Note this is not the same as \"removing\" a cell.\n // Removing a cell needs all cells to the \"right\" to be shifted left.\n // We wont support removing yet.\n clearCellAt(col: number): GridCell | null {\n const out = this.cells[col] || null;\n if (out) {\n this.cells[col] = null;\n }\n return out;\n }\n\n debugValue() {\n return {\n r: this.rowIndex,\n cells: this.cells.filter((c) => c).map((c) => c?.debugValue()),\n };\n }\n}\n\nexport abstract class AlignedLine {\n private static idCounter = 0;\n readonly uuid = AlignedLine.idCounter++;\n needsLayout = false;\n protected _coordOffset = 0;\n protected _maxLength = 0;\n paddingBefore = 15;\n paddingAfter = 15;\n // All the cells that belong in this column\n cells: GridCell[] = [];\n getCellView: (value: any) => GridCellView;\n\n abstract setOffset(val: number): void;\n abstract evalMaxLength(changedCells: GridCell[]): number;\n\n get coordOffset(): number {\n return this._coordOffset;\n }\n\n /**\n * Return the maximum width of a particular column.\n */\n get maxLength(): number {\n return this._maxLength + this.paddingBefore + this.paddingAfter;\n }\n\n setMaxLength(length: number) {\n this._maxLength = length;\n }\n\n setPadding(before: number, after: number): void {\n if (before >= 0) {\n this.paddingBefore = before;\n }\n if (after >= 0) {\n this.paddingAfter = after;\n }\n }\n\n addCell(cell: GridCell): this {\n if (this.beforeAddingCell(cell)) {\n this.cells.push(cell);\n }\n return this;\n }\n\n protected abstract beforeAddingCell(cell: GridCell): boolean;\n\n removeCell(cell: GridCell): this {\n if (this.beforeRemovingCell(cell)) {\n for (let i = 0; i < this.cells.length; i++) {\n if (this.cells[i].uuid == cell.uuid) {\n this.cells.splice(i, 1);\n break;\n }\n }\n }\n return this;\n }\n\n protected abstract beforeRemovingCell(cell: GridCell): boolean;\n\n // The \"neighboring\" columns that depend on this column to be placed\n // before they are placed\n prevLines = [] as this[];\n nextLines = [] as this[];\n addSuccessor(next: this): void {\n // Set nextCol as a successor of this col\n // TODO - Ensure no cycles\n for (const c of this.nextLines) {\n if (c == next) return;\n }\n this.nextLines.push(next);\n next.prevLines.push(this);\n }\n\n /* TODO: Disabling only to improve test coverage as this method is\n * not used.\n * When we have mutable grids where we can insert/remove neighbors\n * we can enable this again.\n */\n /*\n removeSuccessor(next: this): void {\n // Set nextCol as a successor of this col\n // TODO - Ensure no cycles\n for (let i = 0; i < this.nextLines.length; i++) {\n if (this.nextLines[i] == next) {\n this.nextLines.splice(i, 1);\n break;\n }\n }\n for (let i = 0; i < next.prevLines.length; i++) {\n if (next.prevLines[i] == this) {\n next.prevLines.splice(i, 1);\n break;\n }\n }\n }\n */\n}\n\nexport class ColAlign extends AlignedLine {\n setOffset(val: number): void {\n this._coordOffset = val;\n for (const cell of this.cells) {\n if (cell.value) {\n const cellView = this.getCellView(cell);\n if (this._maxLength <= 0) {\n // this hasnt been evaluated yet so do it!\n this.evalMaxLength();\n }\n cellView.setBounds(val, null, this.maxLength, null, true);\n }\n }\n }\n\n evalMaxLength(changedCells: GridCell[] = []): number {\n this._maxLength = 0;\n for (const cell of this.cells) {\n if (cell.value) {\n const cellView = this.getCellView(cell);\n this._maxLength = Math.max(cellView.minSize.width, this._maxLength);\n }\n }\n return this._maxLength;\n }\n\n protected beforeAddingCell(cell: GridCell): boolean {\n if (cell.colAlign && cell.colAlign != this) {\n cell.colAlign.removeCell(cell);\n }\n return cell.colAlign != this;\n }\n\n beforeRemovingCell(cell: GridCell): boolean {\n return cell.colAlign == this;\n }\n}\n\nexport class RowAlign extends AlignedLine {\n /**\n * Sets the Y coordinate of all cells in this row.\n */\n setOffset(val: number): void {\n this._coordOffset = val;\n for (const cell of this.cells) {\n if (cell.value) {\n const cellView = this.getCellView(cell);\n if (this._maxLength <= 0) {\n // this hasnt been evaluated yet so do it!\n this.evalMaxLength();\n }\n cellView.setBounds(null, val, null, this.maxLength, true);\n }\n }\n }\n\n evalMaxLength(changedCells: GridCell[] = []): number {\n this._maxLength = 0;\n for (const cell of this.cells) {\n if (cell.value) {\n const cellView = this.getCellView(cell);\n this._maxLength = Math.max(cellView.minSize.height, this._maxLength);\n }\n }\n return this._maxLength;\n }\n\n protected beforeAddingCell(cell: GridCell): boolean {\n if (cell.rowAlign && cell.rowAlign != this) {\n cell.rowAlign.removeCell(cell);\n }\n return cell.rowAlign != this;\n }\n\n beforeRemovingCell(cell: GridCell): boolean {\n return cell.rowAlign == this;\n }\n}\n\n/**\n * The layout manager for a collection of GridViews bound by common\n * alignment objects.\n */\nexport class GridLayoutGroup {\n // rowAligns = new Map<number, RowAlign>();\n // colAligns = new Map<number, ColAlign>();\n gridModels = [] as GridModel[];\n\n private eventHandler = (event: TSU.Events.TEvent) => {\n this.applyModelEvents(event.payload);\n };\n\n addGridModel(gridModel: GridModel): boolean {\n gridModel.eventHub?.on(TSU.Events.EventHub.BATCH_EVENTS, this.eventHandler);\n this.gridModels.push(gridModel);\n return true;\n }\n\n startingRowAligns(): RowAlign[] {\n const out = [] as RowAlign[];\n const visited = {} as any;\n for (const gm of this.gridModels) {\n for (const cell of gm.cellsInRow(gm.firstRow)) {\n if (cell.rowAlign && !visited[cell.rowAlign.uuid]) {\n visited[cell.rowAlign.uuid] = true;\n out.push(cell.rowAlign);\n }\n }\n }\n return out;\n }\n\n startingColAligns(): ColAlign[] {\n const out = [] as ColAlign[];\n const visited = {} as any;\n for (const gm of this.gridModels) {\n for (const cell of gm.cellsInCol(gm.firstCol)) {\n if (cell.colAlign && !visited[cell.colAlign.uuid]) {\n visited[cell.colAlign.uuid] = true;\n out.push(cell.colAlign);\n }\n }\n }\n return out;\n }\n\n removeGridModel(gridModel: GridModel): void {\n gridModel.eventHub?.removeOn(TSU.Events.EventHub.BATCH_EVENTS, this.eventHandler);\n }\n\n getCellView: (cell: GridCell) => GridCellView;\n\n get startingRows(): RowAlign[] {\n return this.startingRowAligns();\n }\n\n get startingCols(): ColAlign[] {\n return this.startingColAligns();\n }\n\n /**\n * Forces a full refresh.\n */\n refreshLayout() {\n const changedRowAligns = {} as any;\n const changedColAligns = {} as any;\n\n for (const rowAlign of this.startingRowAligns()) {\n if (!(rowAlign.uuid in changedRowAligns)) {\n changedRowAligns[rowAlign.uuid] = {\n align: rowAlign,\n cells: [],\n };\n }\n }\n\n for (const colAlign of this.startingColAligns()) {\n if (!(colAlign.uuid in changedColAligns)) {\n changedColAligns[colAlign.uuid] = {\n align: colAlign,\n cells: [],\n };\n }\n }\n\n this.doBfsLayout(this.startingRows, changedRowAligns);\n this.doBfsLayout(this.startingCols, changedColAligns);\n }\n\n /**\n * As the grid model changes (cell content changed, cleared etc) we need\n * to refresh our layout based on this.\n * As a first step the new height and width of all changed cells is\n * evaluted to see which rows and/or columns are affected (and need to be\n * resized/repositioned).\n */\n protected applyModelEvents(events: TSU.Events.TEvent[]) {\n const [changedRowAligns, changedColAligns] = this.changesForEvents(events);\n this.doBfsLayout(this.startingRows, changedRowAligns);\n this.doBfsLayout(this.startingCols, changedColAligns);\n }\n\n protected changesForEvents(events: TSU.Events.TEvent[]): [any, any] {\n // Step 1 - topologically sort RowAligns of changed cells\n // Step 2 - topologically sort ColAligns of changed cells\n // Step 3 -\n const cellVisited = {} as any;\n const changedRowAligns = {} as any;\n const changedColAligns = {} as any;\n // Going in reverse means we only get the latest event affecting a cell\n // instead of going through every change.\n // Later on we can revisit this if the events are edge triggered instead\n // of level triggered\n for (let i = events.length - 1; i >= 0; i--) {\n const event = events[i];\n const loc = event.payload.loc;\n if (cellVisited[loc]) continue;\n cellVisited[loc] = true;\n const [row, col] = loc.split(\":\").map((x: string) => parseInt(x));\n const gridModel = event.source;\n const cell = gridModel.getRow(row).cellAt(col);\n if (cell) {\n // TODO - For now we are marking both row and col as having\n // changed for a cell. We can optimize this to only row or\n // col based on whether height or width has changed.\n if (!(cell.rowAlign.uuid in changedRowAligns)) {\n changedRowAligns[cell.rowAlign.uuid] = {\n align: cell.rowAlign,\n cells: [],\n };\n }\n changedRowAligns[cell.rowAlign.uuid][\"cells\"].push(cell);\n\n if (!(cell.colAlign.uuid in changedColAligns)) {\n changedColAligns[cell.colAlign.uuid] = {\n align: cell.colAlign,\n cells: [],\n };\n }\n changedColAligns[cell.colAlign.uuid][\"cells\"].push(cell);\n }\n }\n return [changedRowAligns, changedColAligns];\n }\n\n protected ensureGetCellView(align: AlignedLine) {\n if (!align.getCellView) {\n if (!this.getCellView) {\n return null;\n }\n align.getCellView = this.getCellView;\n }\n return align.getCellView;\n }\n\n // 1. start from the starting lines and do a BF traversal\n // 2. If a line not visited (ie laid out):\n // if it is in the changedAlign list then reval its length (w/h)\n // set its offset and length if either width or offset has changed\n // offset can be thought of changed if the preceding line's offset has changed\n // first do above for rows\n protected doBfsLayout<T extends AlignedLine>(startingLines: T[], changedAligns: any) {\n // Eval max lengths for all changed aligns\n if (!this.getCellView) return;\n for (const alignId in changedAligns) {\n const val = changedAligns[alignId];\n this.ensureGetCellView(val.align);\n val.align.evalMaxLength(val.cells);\n }\n let lineQueue = [] as [null | T, T][];\n const visitedLines = {} as any;\n for (const line of startingLines) lineQueue.push([null, line]);\n const lineOffsetChanged = {} as any;\n while (lineQueue.length > 0) {\n const nextQueue = [] as [null | T, T][];\n for (let i = 0; i < lineQueue.length; i++) {\n const [prevLineAlign, lineAlign] = lineQueue[i];\n visitedLines[lineAlign.uuid] = true;\n let newOffset = lineAlign.coordOffset;\n let lineChanged = lineAlign.uuid in changedAligns;\n if (prevLineAlign) {\n if (lineOffsetChanged[prevLineAlign.uuid]) {\n newOffset = prevLineAlign.coordOffset + prevLineAlign.maxLength;\n lineChanged = true;\n }\n }\n if (lineChanged) {\n this.ensureGetCellView(lineAlign);\n lineAlign.setOffset(newOffset);\n lineOffsetChanged[lineAlign.uuid] = true;\n }\n\n // Add next neighbors now\n for (const next of lineAlign.nextLines) {\n if (!visitedLines[next.uuid]) {\n nextQueue.push([lineAlign, next]);\n }\n }\n }\n lineQueue = nextQueue;\n }\n }\n}\n"]}
|