container.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import { upperFirst, isArray, Array } from '../../util/common';
  2. import Shape from './shape';
  3. var SHAPE_MAP = {};
  4. var INDEX = '_INDEX';
  5. function getComparer(compare) {
  6. return function (left, right) {
  7. var result = compare(left, right);
  8. return result === 0 ? left[INDEX] - right[INDEX] : result;
  9. };
  10. }
  11. export default {
  12. getGroupClass() {},
  13. getChildren() {
  14. return this.get('children');
  15. },
  16. addShape(type) {
  17. var cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  18. var shapeType = SHAPE_MAP[type];
  19. if (!shapeType) {
  20. shapeType = upperFirst(type);
  21. SHAPE_MAP[type] = shapeType;
  22. }
  23. var shape = new Shape[shapeType](cfg);
  24. this.add(shape);
  25. return shape;
  26. },
  27. addGroup(cfg) {
  28. var groupClass = this.getGroupClass();
  29. var rst = new groupClass(cfg);
  30. this.add(rst);
  31. return rst;
  32. },
  33. contain(item) {
  34. var children = this.get('children');
  35. return children.indexOf(item) > -1;
  36. },
  37. sort() {
  38. var children = this.get('children');
  39. for (var i = 0, len = children.length; i < len; i++) {
  40. var child = children[i];
  41. child[INDEX] = i;
  42. }
  43. children.sort(getComparer(function (obj1, obj2) {
  44. return obj1.get('zIndex') - obj2.get('zIndex');
  45. }));
  46. return this;
  47. },
  48. drawChildren(context) {
  49. var children = this.get('children');
  50. for (var i = 0, len = children.length; i < len; i++) {
  51. var child = children[i];
  52. child.draw(context);
  53. }
  54. return this;
  55. },
  56. clear() {
  57. var children = this.get('children');
  58. while (children.length !== 0) {
  59. children[children.length - 1].remove(true);
  60. }
  61. return this;
  62. },
  63. add(items) {
  64. var self = this;
  65. var children = self.get('children');
  66. if (!isArray(items)) {
  67. items = [items];
  68. }
  69. for (var i = 0, len = items.length; i < len; i++) {
  70. var item = items[i];
  71. var parent = item.get('parent');
  72. if (parent) {
  73. var descendants = parent.get('children');
  74. Array.remove(descendants, item);
  75. }
  76. self._setEvn(item);
  77. children.push(item);
  78. }
  79. return self;
  80. },
  81. _setEvn(item) {
  82. var self = this;
  83. var {
  84. context,
  85. canvas,
  86. aria
  87. } = self._attrs;
  88. var {
  89. isGroup,
  90. type
  91. } = item._attrs;
  92. item._attrs.parent = self;
  93. item._attrs.context = context;
  94. item._attrs.canvas = canvas; // 是否需要无障碍处理
  95. if (aria && item._attrs.aria !== false) {
  96. item._attrs.aria = aria;
  97. }
  98. if (type === 'text' && canvas && canvas.get('fontFamily')) {
  99. item._attrs.attrs.fontFamily = item._attrs.attrs.fontFamily || canvas.get('fontFamily');
  100. }
  101. var clip = item._attrs.attrs.clip;
  102. if (clip) {
  103. clip._attrs.parent = self;
  104. clip._attrs.context = context;
  105. clip._attrs.canvas = canvas;
  106. }
  107. if (isGroup) {
  108. var children = item._attrs.children;
  109. for (var i = 0, len = children.length; i < len; i++) {
  110. item._setEvn(children[i]);
  111. }
  112. }
  113. },
  114. _getAriaLabel() {
  115. var {
  116. aria,
  117. ariaLabel,
  118. children
  119. } = this._attrs; // 主动关闭
  120. if (!aria) return;
  121. var childAriaLabels = [];
  122. if (children && children.length) {
  123. for (var i = 0, len = children.length; i < len; i++) {
  124. var _childAriaLabel = children[i].getAriaLabel();
  125. if (_childAriaLabel) {
  126. childAriaLabels.push(_childAriaLabel);
  127. }
  128. }
  129. }
  130. var childAriaLabel = childAriaLabels.join(' '); // 2个都有时拼接成完整句子
  131. if (ariaLabel && childAriaLabel) {
  132. return "".concat(ariaLabel, " ").concat(childAriaLabel, " ");
  133. } // 只有1个,或者都没有
  134. return ariaLabel || childAriaLabel;
  135. }
  136. };