|
@@ -0,0 +1,198 @@
|
|
|
+import btnPonto from '../../images/botoes/ponto.svg';
|
|
|
+import btnPontoMedio from '../../images/botoes/ponto-medio.svg';
|
|
|
+import btnCincunferencia from '../../images/botoes/circunferencia.svg';
|
|
|
+import btnCincunferenciaPontoSegmento from '../../images/botoes/circunferencia-ponto-segmento.svg';
|
|
|
+
|
|
|
+/**
|
|
|
+ * Classe MenuSuperior
|
|
|
+ *
|
|
|
+ * Esta classe é utilizada para criar os menus exibidos na parte superior da aplicação
|
|
|
+ *
|
|
|
+ * @author Robertino Mendes Santiago Jr <robertino@ufpr.br>
|
|
|
+ */
|
|
|
+export default class MenuSuperior {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método construtor da classe MenuSuperior.
|
|
|
+ * Os itens que serão exibidos no menu são definidos na estrutura itensMenu.
|
|
|
+ * @param {App} app Instância da classe App
|
|
|
+ */
|
|
|
+ constructor(app) {
|
|
|
+ this._selecionado = null;
|
|
|
+
|
|
|
+ this.itensMenu = [
|
|
|
+ {
|
|
|
+ id: 'menu-ponto',
|
|
|
+ title: 'Criação de ponto',
|
|
|
+ image: btnPonto,
|
|
|
+ options: [
|
|
|
+ {
|
|
|
+ id: this.CODE_PONTO,
|
|
|
+ title: 'Criar ponto na área de desenho',
|
|
|
+ image: btnPonto
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: this.CODE_PONTO_MEDIO,
|
|
|
+ title: 'Criar ponto entre dois pontos',
|
|
|
+ image: btnPontoMedio
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'menu-circunferencia',
|
|
|
+ title: 'Criação de circunferência',
|
|
|
+ image: btnCincunferencia,
|
|
|
+ options: [
|
|
|
+ {
|
|
|
+ id: 'circunferencia',
|
|
|
+ title: 'Criar circunferência definida por 2 pontos',
|
|
|
+ image: btnCincunferencia
|
|
|
+ },
|
|
|
+ {
|
|
|
+ id: 'circunferencia-ponto-segmento',
|
|
|
+ title: 'Criar circunferência definida por ponto e segmento',
|
|
|
+ image: btnCincunferenciaPontoSegmento
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ let div = document.getElementById('app');
|
|
|
+ div.append(this.draw());
|
|
|
+ this.acoesMenu();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que desenha os menus na parte superior da aplicação
|
|
|
+ */
|
|
|
+ draw() {
|
|
|
+ let html = `
|
|
|
+ <div id="navbar">
|
|
|
+ <div id="navbar-top">
|
|
|
+ <ul>
|
|
|
+ ${this.itensMenu.map(elem => `
|
|
|
+ <li id="${elem.id}">
|
|
|
+ <a class="btn" title="${elem.title}">
|
|
|
+ <img src="${elem.image}">
|
|
|
+ </a>
|
|
|
+ </li>
|
|
|
+ `).join('')}
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div id="navbar-bottom"></div>
|
|
|
+ </div>
|
|
|
+ `;
|
|
|
+ let div = document.createElement('div');
|
|
|
+ div.innerHTML = html;
|
|
|
+ return div;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que define as ações de clique para cada item do menu primário.
|
|
|
+ * Ao clicar em um item, é exibido no menu secundário os itens específicos o item clicado.
|
|
|
+ */
|
|
|
+ acoesMenu() {
|
|
|
+ this.itensMenu.map(elem => {
|
|
|
+ document.getElementById(elem.id).onmousedown = (event) => this.trocaSubMenu(event, elem);
|
|
|
+ });
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que desenha os itens do menu secundário de um determinado item do menu
|
|
|
+ * @param {Object} event Objeto com os valores o evento disparado pelo mouse
|
|
|
+ * @param {Object} elem Item do menu selecionado
|
|
|
+ */
|
|
|
+ trocaSubMenu(event, elem) {
|
|
|
+ this.mudaSelecionadoMenuTop(elem);
|
|
|
+
|
|
|
+ let div = document.getElementById('navbar-bottom');
|
|
|
+ let html = `
|
|
|
+ <ul>
|
|
|
+ ${elem.options.map(e => `
|
|
|
+ <li id="${e.id}">
|
|
|
+ <a class="btn" title="${e.title}">
|
|
|
+ <img src="${e.image}">
|
|
|
+ </a>
|
|
|
+ </li>
|
|
|
+ `).join('')}
|
|
|
+ </ul>
|
|
|
+ `;
|
|
|
+ div.innerHTML = html;
|
|
|
+ this.acoesSubMenu(elem);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que realiza a troca da propriedade CSS selecionado do menu primário
|
|
|
+ * @param {Object} elem Elemento que será atribuída a classe CSS selecionado
|
|
|
+ */
|
|
|
+ mudaSelecionadoMenuTop(elem) {
|
|
|
+ let selecionado = document.querySelectorAll('.selecionado');
|
|
|
+
|
|
|
+ if (selecionado.length != 0) {
|
|
|
+ selecionado.forEach(s => {
|
|
|
+ s.classList.remove('selecionado');
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ let btn = document.getElementById(elem.id);
|
|
|
+ btn.classList.add('selecionado');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que define as ações de clique para cada item do menu secundário.
|
|
|
+ * Ao clicar em um item, é exibido no menu secundário os itens específicos o item clicado.
|
|
|
+ */
|
|
|
+ acoesSubMenu(objeto) {
|
|
|
+ objeto.options.map(elem => {
|
|
|
+ document.getElementById(elem.id).onmousedown = (event) => this.botaoSubMenu(event, elem);
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que identifica o item do menu selecionado
|
|
|
+ * @param {Object} event Objeto com os valores o evento disparado pelo mouse
|
|
|
+ * @param {Object} elem Item do menu selecionado
|
|
|
+ */
|
|
|
+ botaoSubMenu(event, elem) {
|
|
|
+ this.mudaSelecionadoMenuBottom(elem);
|
|
|
+ this._selecionado = elem.id;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Método que realiza a troca da propriedade CSS selecionado do menu secundário
|
|
|
+ * @param {Object} elem Elemento que será atribuída a classe CSS selecionado
|
|
|
+ */
|
|
|
+ mudaSelecionadoMenuBottom(elem) {
|
|
|
+ let selecionado = document.querySelectorAll('#navbar-bottom .selecionado');
|
|
|
+
|
|
|
+ if (selecionado.length != 0) {
|
|
|
+ selecionado.forEach(s => {
|
|
|
+ s.classList.remove('selecionado');
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ let btn = document.getElementById(elem.id);
|
|
|
+ btn.classList.add('selecionado');
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Devolve o valor da propriedade selecionado
|
|
|
+ * @return {string} Valor da propriedade selecionado
|
|
|
+ */
|
|
|
+ get selecionado() {
|
|
|
+ return this._selecionado;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Constante que determina o código do menu Ponto
|
|
|
+ * @return {string} Valor da constante
|
|
|
+ */
|
|
|
+ get CODE_PONTO() { return 'ponto'; }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Constante que determina o código do menu Ponto Médio
|
|
|
+ * @return {string} Valor da constante
|
|
|
+ */
|
|
|
+ get CODE_PONTO_MEDIO() { return 'ponto-medio'; }
|
|
|
+}
|