selector.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. var selector = (function() {
  2. let _objects = [];
  3. let _selectorPosStart;
  4. let _selectorPosNow;
  5. let _mode = "";
  6. let _selectorRect = new Konva.Rect({
  7. x: 0,
  8. y: 0,
  9. width: 0,
  10. height: 0,
  11. stroke: "#33BCFF",
  12. dash: [2, 2]
  13. });
  14. function _bootstrap() {
  15. _configureSelectorEvents();
  16. _addToLayer();
  17. }
  18. function _addToLayer() {
  19. let layer = app.currentLayer();
  20. _selectorRect.listening(false);
  21. layer.add(_selectorRect);
  22. }
  23. function _getSelectedObjects() {
  24. return _objects;
  25. }
  26. function _configureSelectorEvents() {
  27. app.stage.on("mousedown", function(e) {
  28. _mode = "drawing";
  29. _startDragSelector({ x: e.evt.layerX, y: e.evt.layerY });
  30. });
  31. app.stage.on("mousemove", function(e) {
  32. if (_mode === "drawing") {
  33. _updateDragSelector({ x: e.evt.layerX, y: e.evt.layerY });
  34. }
  35. });
  36. app.stage.on("mouseup", function(e) {
  37. _mode = "";
  38. _selectorRect.visible(false);
  39. app.stage.draw();
  40. });
  41. }
  42. function _startDragSelector(posIn) {
  43. _selectorPosStart = { x: posIn.x, y: posIn.y };
  44. _selectorPosNow = { x: posIn.x, y: posIn.y };
  45. }
  46. function _updateDragSelector(posIn) {
  47. if (app.getState() != APP_STATE.NONE) return;
  48. let objects = app.getObjects();
  49. let posRect = _reverse(_selectorPosStart, _selectorPosNow);
  50. _selectorPosNow = { x: posIn.x, y: posIn.y };
  51. _selectorRect.x(posRect.x1);
  52. _selectorRect.y(posRect.y1);
  53. _selectorRect.width(posRect.x2 - posRect.x1);
  54. _selectorRect.height(posRect.y2 - posRect.y1);
  55. _selectorRect.visible(true);
  56. for (i = 0; i < objects.length; i = i + 1) {
  57. let object = objects[i];
  58. if (object.children != undefined && object.children.length > 0) {
  59. for (j = 0; j < object.children.length; j++) {
  60. _style(object.children[j], _selectorRect);
  61. }
  62. } else {
  63. _style(object, _selectorRect);
  64. }
  65. }
  66. app.stage.draw();
  67. }
  68. function _style(object, selectorRect) {
  69. if (object.attrs.selectable != undefined) {
  70. if (object.attrs.selectable == false) {
  71. return;
  72. }
  73. }
  74. if (_hitCheck(object, selectorRect)) {
  75. object.stroke("#33BCFF");
  76. object.fill("#33BCFF");
  77. } else {
  78. if (object.attrs.style != undefined) {
  79. object.stroke(object.attrs.style.stroke);
  80. object.fill(object.attrs.style.fill);
  81. } else {
  82. object.stroke("black");
  83. }
  84. }
  85. }
  86. function _hitCheck(shape1, shape2) {
  87. let s1 = shape1.getClientRect();
  88. let s2 = shape2.getClientRect();
  89. let X = s1.x;
  90. let Y = s1.y;
  91. let A = s1.x + s1.width;
  92. let B = s1.y + s1.height;
  93. let X1 = s2.x;
  94. let A1 = s2.x + s2.width;
  95. let Y1 = s2.y;
  96. let B1 = s2.y + s2.height;
  97. if (A < X1 || A1 < X || B < Y1 || B1 < Y) {
  98. return false;
  99. } else {
  100. return true;
  101. }
  102. }
  103. function _reverse(r1, r2) {
  104. let r1x = r1.x,
  105. r1y = r1.y,
  106. r2x = r2.x,
  107. r2y = r2.y,
  108. d;
  109. if (r1x > r2x) {
  110. d = Math.abs(r1x - r2x);
  111. r1x = r2x;
  112. r2x = r1x + d;
  113. }
  114. if (r1y > r2y) {
  115. d = Math.abs(r1y - r2y);
  116. r1y = r2y;
  117. r2y = r1y + d;
  118. }
  119. return { x1: r1x, y1: r1y, x2: r2x, y2: r2y };
  120. }
  121. return {
  122. selctedObjects: _getSelectedObjects(),
  123. bootstrap: _bootstrap
  124. };
  125. })();