50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
export default function createCellPositioner(_ref) {
|
|
var cellMeasurerCache = _ref.cellMeasurerCache,
|
|
columnCount = _ref.columnCount,
|
|
columnWidth = _ref.columnWidth,
|
|
_ref$spacer = _ref.spacer,
|
|
spacer = _ref$spacer === void 0 ? 0 : _ref$spacer;
|
|
var columnHeights;
|
|
initOrResetDerivedValues();
|
|
|
|
function cellPositioner(index) {
|
|
// Find the shortest column and use it.
|
|
var columnIndex = 0;
|
|
|
|
for (var i = 1; i < columnHeights.length; i++) {
|
|
if (columnHeights[i] < columnHeights[columnIndex]) {
|
|
columnIndex = i;
|
|
}
|
|
}
|
|
|
|
var left = columnIndex * (columnWidth + spacer);
|
|
var top = columnHeights[columnIndex] || 0;
|
|
columnHeights[columnIndex] = top + cellMeasurerCache.getHeight(index) + spacer;
|
|
return {
|
|
left: left,
|
|
top: top
|
|
};
|
|
}
|
|
|
|
function initOrResetDerivedValues() {
|
|
// Track the height of each column.
|
|
// Layout algorithm below always inserts into the shortest column.
|
|
columnHeights = [];
|
|
|
|
for (var i = 0; i < columnCount; i++) {
|
|
columnHeights[i] = 0;
|
|
}
|
|
}
|
|
|
|
function reset(params) {
|
|
columnCount = params.columnCount;
|
|
columnWidth = params.columnWidth;
|
|
spacer = params.spacer;
|
|
initOrResetDerivedValues();
|
|
}
|
|
|
|
cellPositioner.reset = reset;
|
|
return cellPositioner;
|
|
}
|
|
import { bpfrpt_proptype_CellMeasurerCache } from "./Masonry";
|
|
import { bpfrpt_proptype_Positioner } from "./Masonry"; |