compact.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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, movingItem) {
  43. var sorted = sortLayout(layout); //把静态的放在前面
  44. var needCompact = Array(layout.length);
  45. var compareList = [];
  46. var mapLayout = {};
  47. for (var i = 0, length_1 = sorted.length; i < length_1; i++) {
  48. var finished = compactItem(compareList, sorted[i]);
  49. if (movingItem) {
  50. if (movingItem.UniqueKey === finished.key) {
  51. movingItem.GridX = finished.GridX;
  52. movingItem.GridY = finished.GridY;
  53. finished.isUserMove = true;
  54. }
  55. else
  56. finished.isUserMove = false;
  57. }
  58. else
  59. finished.isUserMove = false;
  60. compareList.push(finished);
  61. needCompact[i] = finished;
  62. mapLayout[finished.key + ''] = finished;
  63. }
  64. return {
  65. compacted: needCompact,
  66. mapLayout: mapLayout
  67. };
  68. };