compact.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. var __assign = (this && this.__assign) || Object.assign || function(t) {
  2. for (var s, i = 1, n = arguments.length; i < n; i++) {
  3. s = arguments[i];
  4. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  5. t[p] = s[p];
  6. }
  7. return t;
  8. };
  9. import { sortLayout } from "./sort";
  10. import { getFirstCollison } from "./collison";
  11. /**
  12. * 压缩单个元素,使得每一个元素都会紧挨着边界或者相邻的元素
  13. * @param {*} finishedLayout 压缩完的元素会放进这里来,用来对比之后的每一个元素是否需要压缩
  14. * @param {*} item
  15. */
  16. export var compactItem = function (finishedLayout, item) {
  17. if (item.static)
  18. return item;
  19. var newItem = __assign({}, item);
  20. if (finishedLayout.length === 0) {
  21. return __assign({}, newItem, { GridY: 0 });
  22. }
  23. /**
  24. * 类似一个递归调用
  25. */
  26. while (true) {
  27. var FirstCollison = getFirstCollison(finishedLayout, newItem);
  28. if (FirstCollison) {
  29. /**第一次发生碰撞时,就可以返回了 */
  30. newItem.GridY = FirstCollison.GridY + FirstCollison.h;
  31. return newItem;
  32. }
  33. newItem.GridY--;
  34. if (newItem.GridY < 0)
  35. return __assign({}, newItem, { GridY: 0 }); /**碰到边界的时候,返回 */
  36. }
  37. };
  38. /**
  39. * 压缩layout,使得每一个元素都会紧挨着边界或者相邻的元素
  40. * @param {*} layout
  41. */
  42. export var compactLayout = function (layout) {
  43. var sorted = sortLayout(layout);
  44. var needCompact = Array(layout.length);
  45. var compareList = [];
  46. for (var i = 0, length_1 = sorted.length; i < length_1; i++) {
  47. var finished = compactItem(compareList, sorted[i]);
  48. finished.isUserMove = false;
  49. compareList.push(finished);
  50. needCompact[i] = finished;
  51. }
  52. return needCompact;
  53. };