AreaDeDesenho.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import Ponto from '../objetos/Ponto.js';
  2. /**
  3. * Classe AreaDeDesenho
  4. *
  5. * Esta classe é utilizada para receber os elementos que serão desenhados na tela
  6. *
  7. * @author Robertino Mendes Santiago Jr <robertino@ufpr.br>
  8. */
  9. export default class AreaDeDesenho {
  10. /**
  11. * Método construtor da classe AreaDeDesenho.
  12. * São criadas duas áreas de desenho. A área mais inferior é utilizada para
  13. * receber o Objetos. A área mais superior é utilizar para controlar as
  14. * interações com o mouse.
  15. * @param {App} app Instância da classe App
  16. */
  17. constructor(app) {
  18. this.app = app;
  19. this._area = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
  20. this._area.setAttribute('id', 'main-svg');
  21. this._area.setAttribute('preserveAspectRatio', 'none');
  22. this._areaTop = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
  23. this._areaTop.setAttribute('id', 'top-svg');
  24. this._areaTop.setAttribute('preserveAspectRatio', 'none');
  25. this._areaTop.onmouseup = (e) => this.mouseup(e);
  26. this._areaTop.onmousedown = (e) => this.mousedown(e);
  27. this._areaTop.onmousemove = (e) => this.mousemove(e);
  28. let div = document.getElementById('app');
  29. div.append(this._area);
  30. div.append(this._areaTop);
  31. this.resizeArea();
  32. window.addEventListener('resize', this.resizeArea.bind(this));
  33. this._selecionado = null;
  34. }
  35. /**
  36. * Método que redimensiona a área de desenho ao tamanho da tela
  37. */
  38. resizeArea() {
  39. let offset = this.area.getBoundingClientRect();
  40. this._area.setAttribute('width', window.innerWidth - offset.left + 'px');
  41. this._area.setAttribute('height', window.innerHeight - offset.top + 'px');
  42. this._areaTop.setAttribute('width', window.innerWidth - offset.left + 'px');
  43. this._areaTop.setAttribute('height', window.innerHeight - offset.top + 'px');
  44. }
  45. /**
  46. * Método que trata quando o botão esquerdo do mouse é pressionado na área de desenho
  47. * @param {Object} e - Objeto com os valores o evento disparado pelo mouse
  48. */
  49. mousedown(e) {
  50. e.preventDefault();
  51. e.stopPropagation();
  52. if (this.app.menuSuperior.selecionado == this.app.menuSuperior.CODE_PONTO) {
  53. let offset = this.area.getBoundingClientRect();
  54. let x = e.clientX - offset.left;
  55. let y = e.clientY - offset.top;
  56. this.adicionaObjetos(new Ponto(x, y));
  57. }
  58. // let offset = this.area.getBoundingClientRect();
  59. // let x = e.clientX - offset.left;
  60. // let y = e.clientY - offset.top;
  61. // if (this.selecionado) {
  62. // this.selecionado.selecionado = false;
  63. // this.selecionado = null;
  64. // } else {
  65. // this.app.objetos.map(objeto => {
  66. // if (objeto.contains(x, y)) {
  67. // this.selecionado = objeto;
  68. // this.selecionado.selecionado = true;
  69. // }
  70. // });
  71. // }
  72. }
  73. /**
  74. * Método que trata quando o botão esquerdo do mouse é solto na área de desenho
  75. * @param {Object} e - Objeto com os valores o evento disparado pelo mouse
  76. */
  77. mouseup(e) {
  78. }
  79. /**
  80. * Método que trata quando o mouse é movimentado pela área de desenho
  81. * @param {Object} e - Objeto com os valores o evento disparado pelo mouse
  82. */
  83. mousemove(e) {
  84. if (this.selecionado) {
  85. let offset = this.area.getBoundingClientRect();
  86. let x = e.clientX - offset.left;
  87. let y = e.clientY - offset.top;
  88. this.selecionado.mover(x, y);
  89. }
  90. }
  91. /**
  92. * Adiciona um objeto à área de desenho
  93. * @param {ObjetoDinamico} objeto Objeto a ser inserido na área de desenho
  94. */
  95. adicionaObjetos(objeto) {
  96. this.app.objetos.push(objeto);
  97. this._area.append(objeto.draw());
  98. }
  99. /**
  100. * Devolve o valor da propriedade area
  101. * @return {Object} Valor da propriedade area
  102. */
  103. get area() {
  104. return this._area;
  105. }
  106. /**
  107. * Devolve o valor da propriedade selecionado
  108. * @return {Object} Valor da propriedade selecionado
  109. */
  110. get selecionado() {
  111. return this._selecionado;
  112. }
  113. /**
  114. * Atribui um valor recebido por parâmetro à propriedade selecionado
  115. * @param {ObjetoDinamico} selecionado Objeto selecionado na area de desenho
  116. */
  117. set selecionado(selecionado) {
  118. this._selecionado = selecionado;
  119. }
  120. }