mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.5 KiB
84 lines
2.5 KiB
class TileCoordinator {
|
|
tracker;
|
|
columnIndex = 0;
|
|
rowIndex = 0;
|
|
get rowCount() {
|
|
return this.rowIndex + 1;
|
|
}
|
|
get rowspan() {
|
|
const lastRowMax = Math.max(...this.tracker);
|
|
return lastRowMax > 1 ? this.rowCount + lastRowMax - 1 : this.rowCount;
|
|
}
|
|
positions;
|
|
update(numColumns, tiles) {
|
|
this.columnIndex = 0;
|
|
this.rowIndex = 0;
|
|
this.tracker = new Array(numColumns);
|
|
this.tracker.fill(0, 0, this.tracker.length);
|
|
this.positions = tiles.map(tile => this._trackTile(tile));
|
|
}
|
|
_trackTile(tile) {
|
|
const gapStartIndex = this._findMatchingGap(tile.colspan);
|
|
this._markTilePosition(gapStartIndex, tile);
|
|
this.columnIndex = gapStartIndex + tile.colspan;
|
|
return new TilePosition(this.rowIndex, gapStartIndex);
|
|
}
|
|
_findMatchingGap(tileCols) {
|
|
if (tileCols > this.tracker.length && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
throw Error(`mat-grid-list: tile with colspan ${tileCols} is wider than ` + `grid with cols="${this.tracker.length}".`);
|
|
}
|
|
let gapStartIndex = -1;
|
|
let gapEndIndex = -1;
|
|
do {
|
|
if (this.columnIndex + tileCols > this.tracker.length) {
|
|
this._nextRow();
|
|
gapStartIndex = this.tracker.indexOf(0, this.columnIndex);
|
|
gapEndIndex = this._findGapEndIndex(gapStartIndex);
|
|
continue;
|
|
}
|
|
gapStartIndex = this.tracker.indexOf(0, this.columnIndex);
|
|
if (gapStartIndex == -1) {
|
|
this._nextRow();
|
|
gapStartIndex = this.tracker.indexOf(0, this.columnIndex);
|
|
gapEndIndex = this._findGapEndIndex(gapStartIndex);
|
|
continue;
|
|
}
|
|
gapEndIndex = this._findGapEndIndex(gapStartIndex);
|
|
this.columnIndex = gapStartIndex + 1;
|
|
} while (gapEndIndex - gapStartIndex < tileCols || gapEndIndex == 0);
|
|
return Math.max(gapStartIndex, 0);
|
|
}
|
|
_nextRow() {
|
|
this.columnIndex = 0;
|
|
this.rowIndex++;
|
|
for (let i = 0; i < this.tracker.length; i++) {
|
|
this.tracker[i] = Math.max(0, this.tracker[i] - 1);
|
|
}
|
|
}
|
|
_findGapEndIndex(gapStartIndex) {
|
|
for (let i = gapStartIndex + 1; i < this.tracker.length; i++) {
|
|
if (this.tracker[i] != 0) {
|
|
return i;
|
|
}
|
|
}
|
|
return this.tracker.length;
|
|
}
|
|
_markTilePosition(start, tile) {
|
|
for (let i = 0; i < tile.colspan; i++) {
|
|
this.tracker[start + i] = tile.rowspan;
|
|
}
|
|
}
|
|
}
|
|
class TilePosition {
|
|
row;
|
|
col;
|
|
constructor(row, col) {
|
|
this.row = row;
|
|
this.col = col;
|
|
}
|
|
}
|
|
|
|
const ɵTileCoordinator = TileCoordinator;
|
|
|
|
export { TileCoordinator, ɵTileCoordinator };
|
|
//# sourceMappingURL=_public-api-chunk.mjs.map
|
|
|