compact.js 1.9 KB

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