compact.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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, { key: item.key + '' });
  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 () {
  43. var _cache = {};
  44. return function (layout, movingItem, mapedLayout) {
  45. if (movingItem) {
  46. if (_cache.GridX === movingItem.GridX
  47. && _cache.GridY === movingItem.GridY &&
  48. _cache.w === movingItem.w &&
  49. _cache.h === movingItem.h &&
  50. _cache.UniqueKey === movingItem.UniqueKey) {
  51. return {
  52. compacted: layout,
  53. mapLayout: mapedLayout
  54. };
  55. }
  56. _cache = movingItem;
  57. }
  58. var sorted = sortLayout(layout); //把静态的放在前面
  59. var needCompact = Array(layout.length);
  60. var compareList = [];
  61. var mapLayout = {};
  62. for (var i = 0, length_1 = sorted.length; i < length_1; i++) {
  63. var finished = compactItem(compareList, sorted[i]);
  64. if (movingItem) {
  65. if (movingItem.UniqueKey === finished.key) {
  66. movingItem.GridX = finished.GridX;
  67. movingItem.GridY = finished.GridY;
  68. finished.isUserMove = true;
  69. }
  70. else
  71. finished.isUserMove = false;
  72. }
  73. else
  74. finished.isUserMove = false;
  75. compareList.push(finished);
  76. needCompact[i] = finished;
  77. mapLayout[finished.key + ''] = finished;
  78. }
  79. return {
  80. compacted: needCompact,
  81. mapLayout: mapLayout
  82. };
  83. };
  84. }();