selector.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. import { APP_STATE } from "../enums/app-state-enum";
  2. import { stageManager as Stages } from "./stage-manager";
  3. import { state as State } from "../application/state";
  4. import { objects as Objects } from "../application/objects";
  5. import { ELEMENTS_CLASS } from "../enums/elements-class-enum";
  6. import { app as App } from "../../app";
  7. export class Selector {
  8. constructor() {
  9. this._selectorPosStart;
  10. this._selectorPosNow;
  11. this._mode = "";
  12. this._stage = Stages.getCurrentKonvaStage();
  13. this._layer = Stages.getCurrentKonvaLayer();
  14. this._selectorRect = new Konva.Rect({
  15. x: 0,
  16. y: 0,
  17. width: 0,
  18. height: 0,
  19. stroke: "#33BCFF",
  20. dash: [2, 2]
  21. });
  22. }
  23. bootstrap() {
  24. this.configureSelectorEvents();
  25. this.addToLayer();
  26. }
  27. addToLayer() {
  28. this._selectorRect.listening(false);
  29. Stages.getCurrentKonvaLayer().add(this._selectorRect);
  30. }
  31. getSelectedAggregators() {
  32. return Objects.getSelectedObjects();
  33. }
  34. getSelectedKonvaObjects() {
  35. return this.getSelectedAggregators().map(function(aggregator) {
  36. if (aggregator.konvaObject.children == undefined) {
  37. return aggregator.konvaObject;
  38. } else {
  39. return aggregator.konvaObject.children.map(function(object) {
  40. return object;
  41. })[0];
  42. }
  43. });
  44. }
  45. getSelectedKonvaPoints() {
  46. const objects = this.getSelectedKonvaObjects();
  47. return objects.filter(
  48. x => x.attrs.class != undefined && x.attrs.class == ELEMENTS_CLASS.POINT
  49. );
  50. }
  51. getSelectedPoints() {
  52. const objects = this.getSelectedAggregators().filter(
  53. x =>
  54. x.elementClass === ELEMENTS_CLASS.POINT ||
  55. x.elementClass === ELEMENTS_CLASS.INTERSECTION_POINT
  56. );
  57. return objects.map(x => x.genericObject);
  58. }
  59. getSelectedPointsAggregators() {
  60. const objects = this.getSelectedAggregators().filter(
  61. x =>
  62. x.elementClass === ELEMENTS_CLASS.POINT ||
  63. x.elementClass === ELEMENTS_CLASS.INTERSECTION_POINT
  64. );
  65. return objects;
  66. }
  67. startDragSelector(posIn) {
  68. this._selectorPosStart = { x: posIn.x, y: posIn.y };
  69. this._selectorPosNow = { x: posIn.x, y: posIn.y };
  70. }
  71. configureSelectorEvents() {
  72. var _this = this;
  73. this._stage.on("mousedown", function(e) {
  74. Stages.getCurrentKonvaLayer().add(_this._selectorRect);
  75. _this._mode = "drawing";
  76. _this.startDragSelector({ x: e.evt.layerX, y: e.evt.layerY });
  77. });
  78. this._stage.on("mousemove", function(e) {
  79. if (_this._mode === "drawing") {
  80. _this.updateDragSelector({ x: e.evt.layerX, y: e.evt.layerY });
  81. }
  82. });
  83. this._stage.on("mouseup", function(e) {
  84. _this._selectorRect.remove();
  85. _this._mode = "";
  86. _this._selectorRect.visible(false);
  87. _this._stage.draw();
  88. });
  89. }
  90. updateDragSelector(posIn) {
  91. if (State.getCurrentState() != APP_STATE.NONE) return;
  92. App.clearSelectedTool();
  93. const currentObjects = Objects.get();
  94. const posRect = this.reverse(this._selectorPosStart, this._selectorPosNow);
  95. this._selectorPosNow = { x: posIn.x, y: posIn.y };
  96. this._selectorRect.x(posRect.x1);
  97. this._selectorRect.y(posRect.y1);
  98. this._selectorRect.width(posRect.x2 - posRect.x1);
  99. this._selectorRect.height(posRect.y2 - posRect.y1);
  100. this._selectorRect.visible(true);
  101. for (let i = 0; i < currentObjects.length; i = i + 1) {
  102. const aggregator = currentObjects[i];
  103. const object = aggregator.konvaObject;
  104. if (object == undefined) return;
  105. if (object.children != undefined && object.children.length > 0) {
  106. for (let j = 0; j < object.children.length; j++) {
  107. this.style(object.children[j], this._selectorRect, aggregator);
  108. }
  109. } else {
  110. this.style(object, this._selectorRect, aggregator);
  111. }
  112. }
  113. this._stage.draw();
  114. }
  115. style(object, selectorRect, aggregator) {
  116. if (object == undefined) return;
  117. if (object.attrs.selectable != undefined) {
  118. if (object.attrs.selectable == false) {
  119. return;
  120. }
  121. }
  122. if (this.hitCheck(object, selectorRect)) {
  123. object.stroke("#33BCFF");
  124. object.fill("#33BCFF");
  125. this.setObject(aggregator);
  126. } else {
  127. if (object.attrs.style != undefined) {
  128. this.removeObject(aggregator);
  129. object.stroke(object.attrs.style.stroke);
  130. object.fill(object.attrs.style.fill);
  131. } else {
  132. this.removeObject(aggregator);
  133. object.stroke("grey");
  134. }
  135. }
  136. }
  137. hitCheck(shape1, shape2) {
  138. let s1 = shape1.getClientRect();
  139. let s2 = shape2.getClientRect();
  140. let X = s1.x;
  141. let Y = s1.y;
  142. let A = s1.x + s1.width;
  143. let B = s1.y + s1.height;
  144. let X1 = s2.x;
  145. let A1 = s2.x + s2.width;
  146. let Y1 = s2.y;
  147. let B1 = s2.y + s2.height;
  148. if (A < X1 || A1 < X || B < Y1 || B1 < Y) {
  149. return false;
  150. } else {
  151. return true;
  152. }
  153. }
  154. setObject(object) {
  155. Objects.setSelectedOject(object);
  156. }
  157. removeObject(object) {
  158. Objects.removeSelectedOject(object);
  159. }
  160. reverse(r1, r2) {
  161. let r1x = r1.x,
  162. r1y = r1.y,
  163. r2x = r2.x,
  164. r2y = r2.y,
  165. d;
  166. if (r1x > r2x) {
  167. d = Math.abs(r1x - r2x);
  168. r1x = r2x;
  169. r2x = r1x + d;
  170. }
  171. if (r1y > r2y) {
  172. d = Math.abs(r1y - r2y);
  173. r1y = r2y;
  174. r2y = r1y + d;
  175. }
  176. return { x1: r1x, y1: r1y, x2: r2x, y2: r2y };
  177. }
  178. clear() {
  179. Objects.get().forEach(aggregator => {
  180. const object = aggregator.konvaObject;
  181. if (object == undefined) return;
  182. if (object.attrs.selectable != undefined) {
  183. if (object.attrs.selectable == false) {
  184. return;
  185. }
  186. }
  187. if (object.children != undefined && object.children.length > 0) {
  188. for (let j = 0; j < object.children.length; j++) {
  189. this.clearAggregator(object.children[j], aggregator);
  190. }
  191. } else {
  192. this.clearAggregator(object, aggregator);
  193. }
  194. });
  195. }
  196. clearAggregator(object, aggregator) {
  197. if (object == undefined) return;
  198. if (object.attrs.style != undefined) {
  199. this.removeObject(aggregator);
  200. object.stroke(object.attrs.style.stroke);
  201. object.fill(object.attrs.style.fill);
  202. } else {
  203. this.removeObject(aggregator);
  204. object.stroke("grey");
  205. }
  206. }
  207. }
  208. export const selector = new Selector();