selector.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  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. updateDragSelector(posIn) {
  72. if (State.getCurrentState() != APP_STATE.NONE) return;
  73. App.clearSelectedTool();
  74. const currentObjects = Objects.get();
  75. const posRect = this.reverse(this._selectorPosStart, this._selectorPosNow);
  76. this._selectorPosNow = { x: posIn.x, y: posIn.y };
  77. console.info(" his._selectorPosStart", this._selectorPosStart);
  78. console.info("posRect", posRect);
  79. this._selectorRect.x(posRect.x1);
  80. this._selectorRect.y(posRect.y1);
  81. this._selectorRect.width(posRect.x2 - posRect.x1);
  82. this._selectorRect.height(posRect.y2 - posRect.y1);
  83. this._selectorRect.visible(true);
  84. console.info("this._selectorRect", this._selectorRect);
  85. for (let i = 0; i < currentObjects.length; i = i + 1) {
  86. const aggregator = currentObjects[i];
  87. const object = aggregator.konvaObject;
  88. if (object == undefined) return;
  89. if (object.children != undefined && object.children.length > 0) {
  90. for (let j = 0; j < object.children.length; j++) {
  91. this.style(object.children[j], this._selectorRect, aggregator);
  92. }
  93. } else {
  94. this.style(object, this._selectorRect, aggregator);
  95. }
  96. }
  97. this._stage.draw();
  98. }
  99. style(object, selectorRect, aggregator) {
  100. if (object == undefined) return;
  101. if (object.attrs.selectable != undefined) {
  102. if (object.attrs.selectable == false) {
  103. return;
  104. }
  105. }
  106. if (this.hitCheck(object, selectorRect)) {
  107. object.stroke("#33BCFF");
  108. object.fill("#33BCFF");
  109. this.setObject(aggregator);
  110. } else {
  111. if (object.attrs.style != undefined) {
  112. this.removeObject(aggregator);
  113. object.stroke(object.attrs.style.stroke);
  114. object.fill(object.attrs.style.fill);
  115. } else {
  116. this.removeObject(aggregator);
  117. object.stroke("grey");
  118. }
  119. }
  120. }
  121. hitCheck(shape1, shape2) {
  122. let s1 = shape1.getClientRect();
  123. let s2 = shape2.getClientRect();
  124. let X = s1.x;
  125. let Y = s1.y;
  126. let A = s1.x + s1.width;
  127. let B = s1.y + s1.height;
  128. let X1 = s2.x;
  129. let A1 = s2.x + s2.width;
  130. let Y1 = s2.y;
  131. let B1 = s2.y + s2.height;
  132. if (A < X1 || A1 < X || B < Y1 || B1 < Y) {
  133. return false;
  134. } else {
  135. return true;
  136. }
  137. }
  138. setObject(object) {
  139. Objects.setSelectedOject(object);
  140. }
  141. removeObject(object) {
  142. Objects.removeSelectedOject(object);
  143. }
  144. reverse(r1, r2) {
  145. let r1x = r1.x,
  146. r1y = r1.y,
  147. r2x = r2.x,
  148. r2y = r2.y,
  149. d;
  150. if (r1x > r2x) {
  151. d = Math.abs(r1x - r2x);
  152. r1x = r2x;
  153. r2x = r1x + d;
  154. }
  155. if (r1y > r2y) {
  156. d = Math.abs(r1y - r2y);
  157. r1y = r2y;
  158. r2y = r1y + d;
  159. }
  160. return { x1: r1x, y1: r1y, x2: r2x, y2: r2y };
  161. }
  162. clear() {
  163. Objects.get().forEach(aggregator => {
  164. const object = aggregator.konvaObject;
  165. if (object == undefined) return;
  166. if (object.attrs.selectable != undefined) {
  167. if (object.attrs.selectable == false) {
  168. return;
  169. }
  170. }
  171. if (object.children != undefined && object.children.length > 0) {
  172. for (let j = 0; j < object.children.length; j++) {
  173. this.clearAggregator(object.children[j], aggregator);
  174. }
  175. } else {
  176. this.clearAggregator(object, aggregator);
  177. }
  178. });
  179. }
  180. clearAggregator(object, aggregator) {
  181. if (object == undefined) return;
  182. if (object.attrs.style != undefined) {
  183. this.removeObject(aggregator);
  184. object.stroke(object.attrs.style.stroke);
  185. object.fill(object.attrs.style.fill);
  186. } else {
  187. this.removeObject(aggregator);
  188. object.stroke("grey");
  189. }
  190. }
  191. configureSelectorEvents() {
  192. this._stage.on("mousedown touchstart", this.start.bind(this));
  193. this._stage.on("mousemove touchmove", this.move.bind(this));
  194. this._stage.on("mouseup touchend", this.end.bind(this));
  195. }
  196. start(event) {
  197. const pos = {
  198. x: undefined,
  199. y: undefined
  200. };
  201. if (event.evt.type === "touchstart") {
  202. pos.x = event.target.pointerPos.x;
  203. pos.y = event.target.pointerPos.y;
  204. } else {
  205. pos.x = event.evt.layerX;
  206. pos.y = event.evt.layerY;
  207. }
  208. Stages.getCurrentKonvaLayer().add(this._selectorRect);
  209. this._mode = "drawing";
  210. this.startDragSelector(pos);
  211. }
  212. move(event) {
  213. const pos = {
  214. x: undefined,
  215. y: undefined
  216. };
  217. if (event.evt.type === "touchmove") {
  218. pos.x = event.target.pointerPos.x;
  219. pos.y = event.target.pointerPos.y;
  220. } else {
  221. pos.x = event.evt.layerX;
  222. pos.y = event.evt.layerY;
  223. }
  224. if (this._mode === "drawing") {
  225. this.updateDragSelector(pos);
  226. }
  227. }
  228. end(event) {
  229. this._selectorRect.remove();
  230. this._mode = "";
  231. this._selectorRect.visible(false);
  232. this._stage.draw();
  233. }
  234. }
  235. export const selector = new Selector();