@thibezer/ui-components-kit 2.8.2 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -0
- package/README.md +37 -10
- package/dist/acessibilidade-CSzX-DkG.cjs +1 -0
- package/dist/acessibilidade-CUlSXc2X.js +38 -0
- package/dist/altura-controle-ukMRPckR.cjs +1 -0
- package/dist/altura-controle-vxQiXG4q.js +62 -0
- package/dist/botao.cjs +1 -1
- package/dist/botao.js +1 -1
- package/dist/camadas.cjs +111 -109
- package/dist/camadas.js +1360 -1182
- package/dist/campo-texto.cjs +1 -1
- package/dist/campo-texto.js +1 -1
- package/dist/canvas.cjs +88 -86
- package/dist/canvas.js +4695 -3395
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/components/ui-area-texto/area-texto-altura.d.ts +16 -0
- package/dist/components/ui-area-texto/area-texto-contador.d.ts +6 -0
- package/dist/components/ui-area-texto/area-texto-template.d.ts +2 -0
- package/dist/components/ui-area-texto/index.d.ts +3 -0
- package/dist/components/ui-area-texto/tipos.d.ts +19 -0
- package/dist/components/ui-area-texto/ui-area-texto.d.ts +100 -0
- package/dist/components/ui-avatar/ui-avatar.d.ts +11 -0
- package/dist/components/ui-badge/ui-badge.d.ts +2 -0
- package/dist/components/ui-barra-ferramentas/ferramentas-comum.d.ts +3 -1
- package/dist/components/ui-barra-ferramentas/paleta-atalhos.d.ts +23 -0
- package/dist/components/ui-barra-ferramentas/paleta-pressao-longa.d.ts +24 -0
- package/dist/components/ui-barra-ferramentas/ribbon-render.d.ts +22 -0
- package/dist/components/ui-barra-ferramentas/ribbon-teclado.d.ts +24 -0
- package/dist/components/ui-barra-ferramentas/ui-paleta-ferramentas.d.ts +3 -7
- package/dist/components/ui-barra-ferramentas/ui-ribbon.d.ts +0 -1
- package/dist/components/ui-camadas/camadas-arraste-controles.d.ts +2 -0
- package/dist/components/ui-camadas/camadas-arvore-renderer.d.ts +4 -11
- package/dist/components/ui-camadas/camadas-colecao.d.ts +27 -0
- package/dist/components/ui-camadas/camadas-drag-drop.d.ts +13 -1
- package/dist/components/ui-camadas/camadas-drop-ops.d.ts +31 -0
- package/dist/components/ui-camadas/camadas-hierarquia.d.ts +10 -0
- package/dist/components/ui-camadas/camadas-host.d.ts +1 -0
- package/dist/components/ui-camadas/camadas-lembranca.d.ts +34 -0
- package/dist/components/ui-camadas/camadas-mapas-base.d.ts +3 -1
- package/dist/components/ui-camadas/camadas-render.d.ts +15 -0
- package/dist/components/ui-camadas/camadas-renomear.d.ts +12 -0
- package/dist/components/ui-camadas/camadas-selecao-api.d.ts +17 -0
- package/dist/components/ui-camadas/camadas-selecao.d.ts +12 -0
- package/dist/components/ui-camadas/camadas-thumb.d.ts +1 -0
- package/dist/components/ui-camadas/ui-camadas.d.ts +8 -5
- package/dist/components/ui-campo-texto/campo-texto-estados.d.ts +5 -1
- package/dist/components/ui-campo-texto/ui-campo-texto.d.ts +1 -0
- package/dist/components/ui-canvas-cad/cad-acessibilidade.d.ts +21 -0
- package/dist/components/ui-canvas-cad/cad-atributos-sync.d.ts +2 -1
- package/dist/components/ui-canvas-cad/cad-broadcast.d.ts +1 -1
- package/dist/components/ui-canvas-cad/cad-evento-coordenadas.d.ts +22 -0
- package/dist/components/ui-canvas-cad/cad-eventos-canvas.d.ts +3 -8
- package/dist/components/ui-canvas-cad/cad-feicoes-camera.d.ts +26 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-consulta.d.ts +21 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-dados.d.ts +39 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-desenho.d.ts +68 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-edicao.d.ts +37 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-operacoes.d.ts +48 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-ponteiro.d.ts +28 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-selecao-regiao.d.ts +22 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-tipos.d.ts +53 -0
- package/dist/components/ui-canvas-cad/cad-feicoes-versoes.d.ts +33 -0
- package/dist/components/ui-canvas-cad/cad-feicoes.d.ts +39 -106
- package/dist/components/ui-canvas-cad/cad-inicializador.d.ts +3 -1
- package/dist/components/ui-canvas-cad/cad-leaflet-adaptador.d.ts +5 -0
- package/dist/components/ui-canvas-cad/cad-recusas.d.ts +6 -0
- package/dist/components/ui-canvas-cad/cad-selecao-pontos.d.ts +5 -0
- package/dist/components/ui-canvas-cad/tipos.d.ts +37 -0
- package/dist/components/ui-canvas-cad/ui-canvas-cad.d.ts +30 -1
- package/dist/components/ui-card/card-interacao.d.ts +17 -0
- package/dist/components/ui-card/card-secoes.d.ts +10 -0
- package/dist/components/ui-card/ui-card.d.ts +23 -0
- package/dist/components/ui-checkbox/ui-checkbox.d.ts +4 -1
- package/dist/components/ui-cores/tipos.d.ts +2 -0
- package/dist/components/ui-cores/ui-controle-cores.d.ts +8 -3
- package/dist/components/ui-cores/ui-seletor-cor.d.ts +3 -1
- package/dist/components/ui-linha/index.d.ts +1 -0
- package/dist/components/ui-linha/ui-linha.d.ts +48 -0
- package/dist/components/ui-mapa/mapa-atributos.d.ts +14 -0
- package/dist/components/ui-mapa/mapa-basemaps.d.ts +7 -0
- package/dist/components/ui-mapa/mapa-icones.d.ts +4 -0
- package/dist/components/ui-mapa/mapa-leaflet.d.ts +5 -0
- package/dist/components/ui-mapa/mapa-vinculo-pai.d.ts +22 -0
- package/dist/components/ui-mapa/tipos.d.ts +13 -0
- package/dist/components/ui-mapa/ui-mapa-linha.d.ts +12 -5
- package/dist/components/ui-mapa/ui-mapa-marcador.d.ts +15 -6
- package/dist/components/ui-mapa/ui-mapa.d.ts +14 -1
- package/dist/components/ui-modal/modal-acessibilidade.d.ts +5 -5
- package/dist/components/ui-modal/modal-foco.d.ts +28 -0
- package/dist/components/ui-modal/ui-modal.d.ts +1 -11
- package/dist/components/ui-radio/radio-grupo-registry.d.ts +10 -0
- package/dist/components/ui-radio/ui-radio.d.ts +9 -2
- package/dist/components/ui-skeleton/ui-skeleton.d.ts +9 -0
- package/dist/components/ui-switch/ui-switch.d.ts +3 -1
- package/dist/components/ui-tabela/tabela-estados.d.ts +16 -0
- package/dist/components/ui-tabela/tabela-rolagem.d.ts +44 -0
- package/dist/components/ui-tabela/tabela-teclado.d.ts +16 -0
- package/dist/components/ui-tabela/ui-tabela.d.ts +1 -19
- package/dist/components/ui-texto/ui-texto.d.ts +16 -0
- package/dist/components/ui-tooltip/tooltip-popover.d.ts +7 -0
- package/dist/components/ui-tooltip/tooltip-posicionamento.d.ts +29 -0
- package/dist/components/ui-tooltip/ui-tooltip.d.ts +24 -1
- package/dist/core/altura-controle.d.ts +34 -0
- package/dist/core/alvo-digitavel.d.ts +5 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/opcoes.d.ts +16 -0
- package/dist/core/rotulo-controle.d.ts +13 -0
- package/dist/core.cjs +1 -1
- package/dist/core.js +28 -18
- package/dist/cores.cjs +1 -1
- package/dist/cores.js +9 -8
- package/dist/custom-elements.json +28294 -20127
- package/dist/data.cjs +1 -1
- package/dist/data.js +2 -2
- package/dist/feedback.cjs +1 -1
- package/dist/feedback.js +2 -2
- package/dist/form-validacao-BlQFxUVj.js +104 -0
- package/dist/form-validacao-DIeyQVH5.cjs +1 -0
- package/dist/forms.cjs +1 -1
- package/dist/forms.d.ts +4 -0
- package/dist/forms.js +15 -12
- package/dist/gerencigeo-canvas/canvas_interacao.d.ts +2 -1
- package/dist/gerencigeo-canvas/curva_leaflet.d.ts +2 -2
- package/dist/gerencigeo-canvas/feature_curvas.d.ts +3 -1
- package/dist/gerencigeo-canvas/feature_desenho.d.ts +13 -1
- package/dist/gerencigeo-canvas/feature_desenho_controle.d.ts +3 -0
- package/dist/gerencigeo-canvas/feature_edicao_ops.d.ts +9 -0
- package/dist/gerencigeo-canvas/feature_editor_vertices.d.ts +13 -2
- package/dist/gerencigeo-canvas/feature_lod.d.ts +38 -0
- package/dist/gerencigeo-canvas/feature_popup.d.ts +2 -0
- package/dist/gerencigeo-canvas/feature_simplificacao.d.ts +16 -8
- package/dist/gerencigeo-canvas/index.d.ts +7 -0
- package/dist/gerencigeo-canvas/layer_hit_test.d.ts +22 -0
- package/dist/gerencigeo-canvas/layer_manager.d.ts +5 -0
- package/dist/gerencigeo-canvas/mapa_core.d.ts +10 -0
- package/dist/gerencigeo-canvas/motor/dados-camada.d.ts +39 -0
- package/dist/gerencigeo-canvas/motor/estilo.d.ts +28 -0
- package/dist/gerencigeo-canvas/motor/geometria-px.d.ts +27 -0
- package/dist/gerencigeo-canvas/motor/index.d.ts +5 -0
- package/dist/gerencigeo-canvas/motor/motor-formas.d.ts +107 -0
- package/dist/gerencigeo-canvas/motor/tipos.d.ts +100 -0
- package/dist/gerencigeo-canvas/popup_gate.d.ts +30 -0
- package/dist/gerencigeo-canvas/popup_residual.d.ts +5 -0
- package/dist/gerencigeo-canvas/renderers/canvas_formas_leaflet.d.ts +87 -0
- package/dist/gerencigeo-canvas/renderers/feicoes_canvas_renderer.d.ts +58 -0
- package/dist/gerencigeo-canvas/renderers/feicoes_despachante.d.ts +31 -0
- package/dist/gerencigeo-canvas/renderers/feicoes_renderer.d.ts +48 -9
- package/dist/gerencigeo-canvas/renderers/marcadores_feicoes.d.ts +11 -0
- package/dist/gerencigeo-canvas/renderers/marcas_lod_layer.d.ts +19 -0
- package/dist/gerencigeo-canvas/renderers/renderizador_feicoes_tipos.d.ts +44 -0
- package/dist/gerencigeo-canvas/renderers/renderizador_formas.d.ts +95 -0
- package/dist/gerencigeo-canvas/renderers/selecao_visual.d.ts +6 -0
- package/dist/gerencigeo-canvas/types.d.ts +2 -0
- package/dist/gerencigeo-canvas/zoom_opcoes.d.ts +10 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.js +196 -189
- package/dist/mapa.cjs +11 -16
- package/dist/mapa.js +242 -170
- package/dist/modal.cjs +1 -1
- package/dist/modal.js +1 -1
- package/dist/motor-BB6tB6U-.cjs +1 -0
- package/dist/motor-CFI84lM2.js +1301 -0
- package/dist/motor.cjs +1 -0
- package/dist/motor.d.ts +7 -0
- package/dist/motor.js +52 -0
- package/dist/opcoes-CupvWVIm.js +24 -0
- package/dist/opcoes-vdAUY5OI.cjs +1 -0
- package/dist/register.cjs +1 -1
- package/dist/register.js +14 -13
- package/dist/tabela.cjs +1 -1
- package/dist/tabela.js +1 -1
- package/dist/tipos-elementos.d.ts +123 -8
- package/dist/tipos-react.d.ts +6 -0
- package/dist/tipos-vue.d.ts +119 -8
- package/dist/tools.cjs +1 -1
- package/dist/tools.js +1 -1
- package/dist/ui-badge-B5J_c5P5.js +197 -0
- package/dist/ui-badge-DC4y6Dik.cjs +28 -0
- package/dist/ui-botao-D24oXySA.cjs +12 -0
- package/dist/ui-botao-Dsj08jjw.js +165 -0
- package/dist/ui-campo-texto-19tIrmBK.js +377 -0
- package/dist/ui-campo-texto-CH8mzX61.cjs +16 -0
- package/dist/ui-card-0wu4rjEX.cjs +20 -0
- package/dist/ui-card-DRtpOo3l.js +143 -0
- package/dist/ui-controle-cores-BEUKOq4n.js +275 -0
- package/dist/ui-controle-cores-BLhrZHMh.cjs +32 -0
- package/dist/ui-kit.css +1 -1
- package/dist/ui-linha-C306zxWG.cjs +19 -0
- package/dist/ui-linha-C_azWkcG.js +517 -0
- package/dist/{ui-modal-DBOtSTbR.js → ui-modal-BkYvNP0G.js} +116 -140
- package/dist/ui-modal-CUNbpbZ1.cjs +18 -0
- package/dist/{ui-paleta-ferramentas-DbwdWVtT.js → ui-paleta-ferramentas-BXXrI1Y7.js} +491 -431
- package/dist/ui-paleta-ferramentas-CsPMTY0G.cjs +21 -0
- package/dist/ui-seletor-cor-2yGryC_Z.cjs +86 -0
- package/dist/ui-seletor-cor-BuyhoDZz.js +345 -0
- package/dist/{ui-skeleton-W9uwIceA.js → ui-skeleton-B2Rgrv8o.js} +254 -191
- package/dist/{ui-skeleton-SPYqku8P.cjs → ui-skeleton-DiOxTBZK.cjs} +10 -10
- package/dist/ui-switch-BL-x_-SM.js +1202 -0
- package/dist/ui-switch-C0i_3QXu.cjs +66 -0
- package/dist/{ui-tabela-propriedades-C-PeuW1i.cjs → ui-tabela-propriedades-CjK2gG14.cjs} +10 -10
- package/dist/{ui-tabela-propriedades-BokvDD3b.js → ui-tabela-propriedades-DoL4SE0r.js} +845 -826
- package/package.json +8 -3
- package/dist/form-validacao-BIOXxt-1.js +0 -140
- package/dist/form-validacao-ytRYSF3E.cjs +0 -1
- package/dist/svg-seguro-BsbNQqpd.js +0 -50
- package/dist/svg-seguro-C76iLlAZ.cjs +0 -1
- package/dist/ui-badge-BxT-sDmV.cjs +0 -28
- package/dist/ui-badge-C0eKBI8E.js +0 -183
- package/dist/ui-botao-BOOnP8ds.cjs +0 -12
- package/dist/ui-botao-DfqSivHl.js +0 -165
- package/dist/ui-botao-OGJV6Vfk.js +0 -165
- package/dist/ui-botao-psS1juof.cjs +0 -12
- package/dist/ui-campo-texto-Cnn2UAkS.cjs +0 -16
- package/dist/ui-campo-texto-Uu2dJE_0.js +0 -379
- package/dist/ui-card-B86lJXTP.cjs +0 -20
- package/dist/ui-card-C_o5_0cB.js +0 -111
- package/dist/ui-controle-cores-BS0WYPdi.js +0 -572
- package/dist/ui-controle-cores-Er6ZcQ7U.cjs +0 -111
- package/dist/ui-modal-CvGFGh1h.cjs +0 -18
- package/dist/ui-paleta-ferramentas-CEZYcN4J.js +0 -624
- package/dist/ui-paleta-ferramentas-CU4icLl0.js +0 -1171
- package/dist/ui-paleta-ferramentas-Ccmo-rB5.cjs +0 -21
- package/dist/ui-paleta-ferramentas-DLwZHIDv.cjs +0 -21
- package/dist/ui-paleta-ferramentas-DNN5i6nL.js +0 -860
- package/dist/ui-paleta-ferramentas-Dbj1kBS9.cjs +0 -18
- package/dist/ui-paleta-ferramentas-bvqxj1Yd.cjs +0 -21
- package/dist/ui-segmented-D6b6zxVs.cjs +0 -19
- package/dist/ui-segmented-DyF5YLsV.js +0 -418
- package/dist/ui-segmented-rn9RxRGM.cjs +0 -19
- package/dist/ui-segmented-wUraId2e.js +0 -412
- package/dist/ui-skeleton-DI4_9WOX.js +0 -428
- package/dist/ui-skeleton-elhKIh2B.cjs +0 -33
- package/dist/ui-switch-BcOqOkiV.js +0 -856
- package/dist/ui-switch-D7iPKDj-.cjs +0 -53
- package/dist/ui-tabela-propriedades-BBr5sqki.cjs +0 -145
- package/dist/ui-tabela-propriedades-BecPqC-e.cjs +0 -141
- package/dist/ui-tabela-propriedades-Boy7I5yW.js +0 -2412
- package/dist/ui-tabela-propriedades-Df9ajC6M.js +0 -2648
- package/dist/ui-toast-Bp_NlM5G.js +0 -156
- package/dist/ui-toast-DGTZKne5.cjs +0 -20
- package/dist/zero-js-triggers-C_KrvFOQ.js +0 -244
- package/dist/zero-js-triggers-C_gtaojZ.cjs +0 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { LatLonPar } from '../feature_types';
|
|
2
|
+
/** Pixels de mundo da latitude/longitude no zoom, gravados em `saida[i]` (x) e `saida[i + 1]` (y). Não lança. */
|
|
3
|
+
export declare function projetarEm(saida: Float64Array, i: number, lat: number, lon: number, escala: number): void;
|
|
4
|
+
export declare const escalaDoZoom: (zoom: number) => number;
|
|
5
|
+
/** Inverso de `projetarEm`: pixels de mundo no zoom → [lat, lon]. */
|
|
6
|
+
export declare function latLonDoMundo(x: number, y: number, zoom: number): LatLonPar;
|
|
7
|
+
/** Projeta uma lista de [lat, lon]. */
|
|
8
|
+
export declare function projetarVertices(coords: ReadonlyArray<LatLonPar>, zoom: number): Float64Array;
|
|
9
|
+
export declare function projetarCentro(lat: number, lon: number, zoom: number): Float64Array;
|
|
10
|
+
/** Metros por pixel na latitude e no zoom. */
|
|
11
|
+
export declare function metrosPorPixel(lat: number, zoom: number): number;
|
|
12
|
+
/** Raio, em pixels, de um círculo de `raioMetros` com centro na latitude (raio por zoom e latitude). */
|
|
13
|
+
export declare function raioCirculoPx(lat: number, raioMetros: number, zoom: number): number;
|
|
14
|
+
export interface CaixaMundoPx {
|
|
15
|
+
minX: number;
|
|
16
|
+
minY: number;
|
|
17
|
+
maxX: number;
|
|
18
|
+
maxY: number;
|
|
19
|
+
}
|
|
20
|
+
/** Envelope em px de vários arrays planos; `null` se não houver nenhum vértice finito. */
|
|
21
|
+
export declare function caixaPx(partes: ReadonlyArray<Float64Array>): CaixaMundoPx | null;
|
|
22
|
+
/**
|
|
23
|
+
* Douglas-Peucker iterativo em pixels (tolerância em px, sem cos(lat): as coordenadas já são de tela). `fechado`
|
|
24
|
+
* trata o anel como fechado (o corte não depende de onde ele "começa") e nunca devolve menos de 3 vértices (senão
|
|
25
|
+
* volta o original). Tolerância inválida (≤ 0, NaN) devolve a própria entrada.
|
|
26
|
+
*/
|
|
27
|
+
export declare function simplificarPx(pts: Float64Array, tolerancia: number, fechado: boolean): Float64Array;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Feicao, LatLonPar } from '../feature_types';
|
|
2
|
+
import { CaixaGeo } from '../feature_indice';
|
|
3
|
+
import { CamadaDesenho, DefCamadaMotor, DeltaMotor, EstatisticasCamada, ListaDesenho, RegraVisivel, Vista } from './tipos';
|
|
4
|
+
/** Que parte da lista o chamador quer: o que se pinta no canvas, os marcadores DOM, ou tudo. */
|
|
5
|
+
export type ParteLista = 'tudo' | 'canvas' | 'dom';
|
|
6
|
+
export declare class MotorFormas {
|
|
7
|
+
private camadas;
|
|
8
|
+
private regra;
|
|
9
|
+
/** Cria a camada ou atualiza a definição (estilo, zIndex, opacidade, visibilidade). */
|
|
10
|
+
definirCamada(def: DefCamadaMotor): void;
|
|
11
|
+
removerCamada(camadaId: string): void;
|
|
12
|
+
temCamada(camadaId: string): boolean;
|
|
13
|
+
definirRegra(regra: RegraVisivel | null): void;
|
|
14
|
+
/** A regra de versões mudou (prévias ligadas/desligadas): o conjunto desenhado e o agrupamento precisam ser refeitos. */
|
|
15
|
+
reavaliarVersoes(camadaId: string): void;
|
|
16
|
+
/** Troca total dos dados da camada (diferencia contra o que já existe). */
|
|
17
|
+
definirFeicoes(camadaId: string, lista: Feicao[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Mudança incremental: só vale se `delta.base` for a lista sincronizada por último; senão a camada é refeita
|
|
20
|
+
* por inteiro a partir de `lista`.
|
|
21
|
+
*/
|
|
22
|
+
aplicarDelta(camadaId: string, lista: Feicao[], delta: DeltaMotor): void;
|
|
23
|
+
private pontoVisivel;
|
|
24
|
+
private aposMudanca;
|
|
25
|
+
/** O agrupador do zoom atual acompanha os pontos que mudaram (células afetadas, sem reagrupar a camada). */
|
|
26
|
+
private manterAgrupador;
|
|
27
|
+
/** Define a seleção da camada. Devolve quem entrou e quem saiu (só o que mudou). */
|
|
28
|
+
selecionar(camadaId: string, ids: Iterable<string>): {
|
|
29
|
+
entrou: string[];
|
|
30
|
+
saiu: string[];
|
|
31
|
+
};
|
|
32
|
+
selecionadas(camadaId: string): ReadonlySet<string>;
|
|
33
|
+
/** Geometria provisória (arrasto de vértice): o canvas base deixa de desenhar a feição e a sobreposição a mostra. */
|
|
34
|
+
previsualizar(camadaId: string, f: Feicao): void;
|
|
35
|
+
temPrevia(camadaId: string, id: string): boolean;
|
|
36
|
+
/** Realce temporário (hover): as feições entram na sobreposição com `destaque: true`. */
|
|
37
|
+
destacar(camadaId: string, ids: Iterable<string>): void;
|
|
38
|
+
feicao(camadaId: string, id: string): Feicao | undefined;
|
|
39
|
+
caixaDe(camadaId: string, id: string): CaixaGeo | undefined;
|
|
40
|
+
/** Feições cujo envelope toca `caixa`, sem as ocultas (snap, hit-test, seleção por caixa). Não passa pelo LOD. */
|
|
41
|
+
consultarCaixa(camadaId: string, caixa: CaixaGeo): Feicao[];
|
|
42
|
+
feicaoVisivel(camadaId: string, f: Feicao): boolean;
|
|
43
|
+
estatisticas(camadaId: string): EstatisticasCamada | null;
|
|
44
|
+
/** Entidades da camada com prévia e com oficial (pares em detalhe completo): para testes e diagnóstico. */
|
|
45
|
+
ehPar(camadaId: string, f: Feicao): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* O que desenhar nesta vista, camada a camada, na ordem de empilhamento (a última fica por cima).
|
|
48
|
+
* `parte`: `'canvas'` só o que se pinta no canvas (marcas, formas, pontos sem ícone), `'dom'` só marcadores DOM e
|
|
49
|
+
* curvas (clusters, ícones, textos, rótulos), `'tudo'` (padrão) os dois. O pan incremental pede o canvas só das faixas
|
|
50
|
+
* expostas e o DOM da vista inteira (poucos itens, sem projetar nem simplificar formas).
|
|
51
|
+
*/
|
|
52
|
+
listaDesenho(vista: Vista, opcoes?: {
|
|
53
|
+
camadas?: string[];
|
|
54
|
+
parte?: ParteLista;
|
|
55
|
+
}): ListaDesenho;
|
|
56
|
+
private origemDe;
|
|
57
|
+
private camadaVazia;
|
|
58
|
+
private prepararZoom;
|
|
59
|
+
private estiloDe;
|
|
60
|
+
private emPar;
|
|
61
|
+
/**
|
|
62
|
+
* Vira marca? Sempre em detalhe completo: com rótulo e em par oficial × prévia; ponto e texto nunca. A seleção NÃO
|
|
63
|
+
* entra aqui: o canvas base não depende dela (a sobreposição desenha a selecionada em detalhe completo por cima).
|
|
64
|
+
*/
|
|
65
|
+
private comoMarca;
|
|
66
|
+
/** Geometria projetada e simplificada em px, em cache por (feição, revisão, zoom). `null` se não há o que desenhar. */
|
|
67
|
+
private geometriaProjetada;
|
|
68
|
+
private construirGeometria;
|
|
69
|
+
/** Marca de LOD: centro do envelope, lado de 1–2 px, cor do preenchimento/contorno. */
|
|
70
|
+
private marcaDe;
|
|
71
|
+
/**
|
|
72
|
+
* Item da marca, em cache junto com a geometria por (feição, zoom). Com 100 mil marcas na tela, montar o item e internar
|
|
73
|
+
* o estilo a cada vista custava a maior parte da lista; no pan agora só se confere se algo mudou, sem alocar.
|
|
74
|
+
*/
|
|
75
|
+
private itemMarca;
|
|
76
|
+
private estiloMarca;
|
|
77
|
+
private agrupadorAtivo;
|
|
78
|
+
private itemBase;
|
|
79
|
+
/**
|
|
80
|
+
* A caixa da vista com uma folga de poucos px: o traço de uma feição com o envelope logo fora da vista ainda entra nela
|
|
81
|
+
* (o índice é por envelope). Sem isto, o pan incremental e o quadro completo divergem na borda do canvas.
|
|
82
|
+
*/
|
|
83
|
+
private caixaComFolga;
|
|
84
|
+
private listarCamada;
|
|
85
|
+
/**
|
|
86
|
+
* Clusters da vista (marcadores DOM). Selecionado nunca entra em cluster; o cluster só aparece com o centro dentro da
|
|
87
|
+
* vista e com 2 ou mais restantes. Os pontos individuais que a seleção solta (o selecionado e o único restante de uma
|
|
88
|
+
* célula) são da sobreposição: o canvas base não depende da seleção.
|
|
89
|
+
*/
|
|
90
|
+
private listarClusters;
|
|
91
|
+
/** O ponto está dentro de um cluster neste zoom (não é desenhado nem clicável individualmente)? */
|
|
92
|
+
pontoAgrupado(camadaId: string, id: string): boolean;
|
|
93
|
+
/** O ponto de uma célula de cluster aparece solto: está selecionado ou é o único restante não selecionado? */
|
|
94
|
+
private soltoDoCluster;
|
|
95
|
+
/** Membros (id e coordenada) da célula de cluster: o clique no cluster enquadra o grupo. */
|
|
96
|
+
membrosDoCluster(camadaId: string, chave: string): Array<{
|
|
97
|
+
id: string;
|
|
98
|
+
coordenada: LatLonPar;
|
|
99
|
+
}>;
|
|
100
|
+
/**
|
|
101
|
+
* Itens da sobreposição: feições selecionadas, em edição ou destacadas, sempre em detalhe completo e com o estilo
|
|
102
|
+
* de seleção. Custo O(selecionadas): selecionar não repinta o canvas base.
|
|
103
|
+
*/
|
|
104
|
+
listaSobreposicao(camadaId: string, vista: Vista): CamadaDesenho | null;
|
|
105
|
+
/** A seleção da camada toca pontos sob agrupamento ativo? (então o conjunto de clusters muda e o base precisa refazer) */
|
|
106
|
+
selecaoAfetaAgrupamento(camadaId: string, ids: Iterable<string>): boolean;
|
|
107
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { CaixaGeo } from '../feature_indice';
|
|
2
|
+
import { PontoMundo } from '../feature_lod';
|
|
3
|
+
import { Feicao, LatLonPar } from '../feature_types';
|
|
4
|
+
import { LayerStyleDef } from '../types';
|
|
5
|
+
import { EstiloVetor } from './estilo';
|
|
6
|
+
export type { PontoMundo };
|
|
7
|
+
/**
|
|
8
|
+
* Janela que o motor desenha. `caixa` é o que cabe no canvas (geográfica); `origemPx` são os pixels de mundo, no
|
|
9
|
+
* zoom, do canto superior esquerdo do canvas: o pintor subtrai esse valor em dupla precisão (coordenadas de mundo em
|
|
10
|
+
* zoom alto não cabem em float32 do canvas). Sem `origemPx` ela é derivada de `caixa`.
|
|
11
|
+
*/
|
|
12
|
+
export interface Vista {
|
|
13
|
+
caixa: CaixaGeo;
|
|
14
|
+
zoom: number;
|
|
15
|
+
larguraPx: number;
|
|
16
|
+
alturaPx: number;
|
|
17
|
+
dpr: number;
|
|
18
|
+
origemPx?: PontoMundo;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Formas de desenho:
|
|
22
|
+
* - pintadas no canvas: `marca` (LOD), `poligono`, `circulo`, `linha`, `ponto` (sem ícone);
|
|
23
|
+
* - marcadores DOM (dependem de CSS e arraste, ficam no Leaflet): `icone`, `texto`, `cluster`, `rotulo`;
|
|
24
|
+
* - `curva` (linha/polígono Bézier): caminho Leaflet legado dentro do mesmo renderizador (pendência explícita).
|
|
25
|
+
*/
|
|
26
|
+
export type FormaDesenho = 'marca' | 'poligono' | 'circulo' | 'linha' | 'ponto' | 'icone' | 'texto' | 'cluster' | 'rotulo' | 'curva';
|
|
27
|
+
export interface ItemDesenho {
|
|
28
|
+
camadaId: string;
|
|
29
|
+
/** Id da feição; no cluster, a chave da célula; no rótulo, `rotulo:<id>`. */
|
|
30
|
+
id: string;
|
|
31
|
+
forma: FormaDesenho;
|
|
32
|
+
/**
|
|
33
|
+
* Pixels de MUNDO no zoom da vista (subtraia `origem` ao pintar). Poligono/linha: um array `[x0, y0, x1, y1, ...]`
|
|
34
|
+
* por anel/parte. Círculo, ponto e marca: um array `[x, y]` com o centro. Marcadores DOM e curva: vazio.
|
|
35
|
+
*/
|
|
36
|
+
geometriaEmPx: Float64Array[];
|
|
37
|
+
/** Círculo e ponto: raio em px (círculo em metros convertido por zoom e latitude). Marca: lado (1 ou 2). */
|
|
38
|
+
raioPx: number;
|
|
39
|
+
/** Estilo normal (sem seleção); o realce de seleção vem de `listaSelecao`. Interno: itens iguais compartilham o objeto. */
|
|
40
|
+
estilo: EstiloVetor;
|
|
41
|
+
/** A feição está selecionada? (marcadores DOM trocam de aparência; o canvas base não depende disto.) */
|
|
42
|
+
selecionada: boolean;
|
|
43
|
+
/** Realce temporário (hover/edição), pedido por `destacar`. */
|
|
44
|
+
destaque?: boolean;
|
|
45
|
+
/** Feição de origem (marcadores DOM, curva, clique). Ausente no cluster. */
|
|
46
|
+
feicao?: Feicao;
|
|
47
|
+
/** Icone, texto, rótulo e cluster: posição [lat, lon]. */
|
|
48
|
+
coordenada?: LatLonPar;
|
|
49
|
+
/** Cluster: quantos pontos há na célula e quantos aparecem no cluster (o resto está selecionado). */
|
|
50
|
+
total?: number;
|
|
51
|
+
restantes?: number;
|
|
52
|
+
/** Rótulo: texto a exibir. */
|
|
53
|
+
texto?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface EstatisticasCamada {
|
|
56
|
+
/** Feições na camada. */
|
|
57
|
+
total: number;
|
|
58
|
+
/** Itens no canvas ou em marcadores DOM nesta vista (sem contar as marcas de LOD). */
|
|
59
|
+
desenhadas: number;
|
|
60
|
+
/** Feições pequenas pintadas como marca de 1–2 px. */
|
|
61
|
+
marcasLOD: number;
|
|
62
|
+
clusters: number;
|
|
63
|
+
/** Marcadores DOM pedidos (ícones, textos, clusters, rótulos). */
|
|
64
|
+
marcadoresDom: number;
|
|
65
|
+
/** Quantas vezes o LOD foi calculado (no pan puro não cresce). */
|
|
66
|
+
avaliacoesLOD: number;
|
|
67
|
+
}
|
|
68
|
+
export interface CamadaDesenho {
|
|
69
|
+
camadaId: string;
|
|
70
|
+
zIndex: number;
|
|
71
|
+
opacidade: number;
|
|
72
|
+
/** Pintar primeiro as marcas, depois polígonos/círculos, linhas e pontos; DOM e curvas vêm separados. */
|
|
73
|
+
itens: ItemDesenho[];
|
|
74
|
+
estatisticas: EstatisticasCamada;
|
|
75
|
+
}
|
|
76
|
+
/** Camadas visíveis, na ordem de empilhamento (zIndex crescente = a última fica por cima). */
|
|
77
|
+
export interface ListaDesenho {
|
|
78
|
+
vista: Vista;
|
|
79
|
+
/** Pixels de mundo do canto superior esquerdo do canvas (a `origemPx` da vista, já resolvida). */
|
|
80
|
+
origem: PontoMundo;
|
|
81
|
+
camadas: CamadaDesenho[];
|
|
82
|
+
}
|
|
83
|
+
export interface DefCamadaMotor {
|
|
84
|
+
id: string;
|
|
85
|
+
zIndex: number;
|
|
86
|
+
opacidade: number;
|
|
87
|
+
visivel: boolean;
|
|
88
|
+
interativo: boolean;
|
|
89
|
+
bloqueada?: boolean;
|
|
90
|
+
estilo: LayerStyleDef;
|
|
91
|
+
}
|
|
92
|
+
/** Regra de visibilidade por versão (oficial × prévia): `RegraVersoes.visivel` serve direto. */
|
|
93
|
+
export type RegraVisivel = (f: Feicao, comOficial: Set<string>) => boolean;
|
|
94
|
+
/** Mudança incremental (a mesma que o gerenciador manda ao renderizador Leaflet). */
|
|
95
|
+
export interface DeltaMotor {
|
|
96
|
+
/** A lista que o motor sincronizou por último; se não bater, o motor refaz a camada por inteiro. */
|
|
97
|
+
base: Feicao[];
|
|
98
|
+
mudadas: Feicao[];
|
|
99
|
+
removidas: string[];
|
|
100
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
export type ModoPopups = 'sob-demanda' | 'automatico' | 'desligado';
|
|
3
|
+
export declare const MODO_POPUPS_PADRAO: ModoPopups;
|
|
4
|
+
export declare function lerModoPopups(valor: string | null | undefined): ModoPopups;
|
|
5
|
+
/** Executa `fn` com os popups do mapa liberados (pedido explícito do usuário). Sem portão, só executa. */
|
|
6
|
+
export declare function liberarPopups<T>(map: object | null | undefined, fn: () => T): T;
|
|
7
|
+
export declare function obterPortaoPopups(map: object | null | undefined): PortaoPopups | undefined;
|
|
8
|
+
export declare class PortaoPopups {
|
|
9
|
+
private map;
|
|
10
|
+
private modoAtual;
|
|
11
|
+
private liberados;
|
|
12
|
+
/** Verdadeiro durante o despacho síncrono de um clique no mapa (o Leaflet abre popups dentro dele). */
|
|
13
|
+
private emClique;
|
|
14
|
+
private pendentes;
|
|
15
|
+
private instalado;
|
|
16
|
+
private readonly original;
|
|
17
|
+
constructor(map: L.Map, modoAtual?: ModoPopups);
|
|
18
|
+
private container;
|
|
19
|
+
/** Fase de captura: roda antes dos tratadores do Leaflet, que abrem o popup dentro do mesmo clique. */
|
|
20
|
+
private marcarClique;
|
|
21
|
+
get modo(): ModoPopups;
|
|
22
|
+
definirModo(modo: ModoPopups): void;
|
|
23
|
+
/** Abre o que `fn` abrir, independentemente do modo. Reentrante e sempre devolve o portão ao estado anterior. */
|
|
24
|
+
liberar<T>(fn: () => T): T;
|
|
25
|
+
destruir(): void;
|
|
26
|
+
private aoAbrir;
|
|
27
|
+
/** O clique foi barrado: se vier um duplo clique na mesma camada logo em seguida, abre. */
|
|
28
|
+
private aguardarDuploClique;
|
|
29
|
+
private cancelarPendentes;
|
|
30
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
/** Solta `map._popup` se ele ainda for o `popup` (já fechado). Devolve se soltou. */
|
|
3
|
+
export declare function descartarPopupResidual(map: L.Map | null | undefined, popup: L.Popup | null | undefined): boolean;
|
|
4
|
+
/** Liga a limpeza ao evento `popupclose` do mapa (o mapa descarta o ouvinte ao ser removido). */
|
|
5
|
+
export declare function liberarEscDoPopup(map: L.Map): void;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
import { CaixaGeo } from '../feature_indice';
|
|
3
|
+
import { PontoMundo } from '../motor/tipos';
|
|
4
|
+
import { RegiaoPx } from './renderizador_formas';
|
|
5
|
+
/** Tudo que o renderizador precisa para pintar um quadro. */
|
|
6
|
+
export interface QuadroCanvas {
|
|
7
|
+
ctx: CanvasRenderingContext2D;
|
|
8
|
+
/** Multiplicador de retina do Leaflet (1 ou 2). */
|
|
9
|
+
dpr: number;
|
|
10
|
+
/** Tamanho do canvas em px CSS. */
|
|
11
|
+
larguraPx: number;
|
|
12
|
+
alturaPx: number;
|
|
13
|
+
/** Pixels de mundo, no zoom, do canto superior esquerdo do canvas. */
|
|
14
|
+
origemPx: PontoMundo;
|
|
15
|
+
/** O que cabe no canvas, em coordenadas geográficas. */
|
|
16
|
+
caixa: CaixaGeo;
|
|
17
|
+
zoom: number;
|
|
18
|
+
/**
|
|
19
|
+
* `null`: pintar o canvas inteiro. Lista: o bitmap já foi deslocado e só estas regiões (px CSS) estão vazias e
|
|
20
|
+
* precisam ser pintadas (vazia = nada novo ficou à mostra).
|
|
21
|
+
*/
|
|
22
|
+
regioes: RegiaoPx[] | null;
|
|
23
|
+
/**
|
|
24
|
+
* O bitmap está em branco antes desta pintura? Quem pinta pode então não tocar no canvas quando não há o que desenhar:
|
|
25
|
+
* qualquer chamada de desenho (até um `clearRect`) faz o navegador reenviar o canvas inteiro ao compositor.
|
|
26
|
+
*/
|
|
27
|
+
branco: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Devolve quantos itens de canvas a pintura deixou no bitmap (numa faixa do pan, quantos ACRESCENTOU), ou só se deixou
|
|
31
|
+
* algo (`true`/`void`: algo, quantidade desconhecida; `false`: nada).
|
|
32
|
+
*/
|
|
33
|
+
export type PintarQuadro = (quadro: QuadroCanvas) => number | boolean | void;
|
|
34
|
+
export interface OpcoesCanvasFormas extends L.RendererOptions {
|
|
35
|
+
/** Pan incremental: desloca o bitmap e pinta só as faixas expostas (padrão: não; a sobreposição repinta inteira). */
|
|
36
|
+
incremental?: boolean;
|
|
37
|
+
/** Pan incremental com até tantos itens no bitmap: repinta inteiro em vez de deslocar (padrão: `CanvasFormas.limiteRepintar`). */
|
|
38
|
+
limiteRepintar?: number;
|
|
39
|
+
}
|
|
40
|
+
/** Regiões que ficam vazias quando o conteúdo se desloca de (`dx`, `dy`) px: a faixa vertical inteira e a horizontal sem a quina. */
|
|
41
|
+
export declare function regioesExpostas(largura: number, altura: number, dx: number, dy: number): RegiaoPx[];
|
|
42
|
+
export declare class CanvasFormas extends L.Canvas {
|
|
43
|
+
/**
|
|
44
|
+
* Com poucos itens no bitmap, repintar a vista inteira custa menos que deslocá-lo: o deslocamento copia o bitmap
|
|
45
|
+
* todo (3072×1920 com dpr 2), seja qual for o conteúdo. Medido (sem GPU): ~180 itens por camada repintam 3× mais
|
|
46
|
+
* rápido; ~650 empatam; ~1 500 já perdem. Ajustável (benchmark); ver docs/desempenho-feicoes.md.
|
|
47
|
+
*/
|
|
48
|
+
static limiteRepintar: number;
|
|
49
|
+
private readonly aoPintar;
|
|
50
|
+
private readonly incremental;
|
|
51
|
+
private readonly limiteProprio;
|
|
52
|
+
/** Itens de canvas no bitmap (estimativa por cima entre repinturas completas: as faixas só somam). */
|
|
53
|
+
private itens;
|
|
54
|
+
/** O bitmap tem um quadro completo válido (deslocável)? Cai para falso ao redimensionar ou se a pintura falhar. */
|
|
55
|
+
private conteudoValido;
|
|
56
|
+
/**
|
|
57
|
+
* O bitmap está em branco? Canvas em branco não é deslocado no pan nem apagado de novo no `_update`: com várias
|
|
58
|
+
* camadas sem nada na vista (zoom alto, camada esparsa), o pan deixa de reenviar canvases vazios ao compositor.
|
|
59
|
+
*/
|
|
60
|
+
private branco;
|
|
61
|
+
/** Canto superior esquerdo do bitmap em pixels de MUNDO no último `_update`: o deslocamento do conteúdo se mede aqui. */
|
|
62
|
+
private mundoMin;
|
|
63
|
+
/** Regiões a pintar no próximo quadro (calculadas no `_update`); `null` = canvas inteiro. */
|
|
64
|
+
private regioesDaVez;
|
|
65
|
+
/** Quantas pinturas falharam (e a última causa): diagnóstico, já que a falha é engolida. */
|
|
66
|
+
falhas: number;
|
|
67
|
+
ultimoErro: unknown;
|
|
68
|
+
constructor(opcoes: OpcoesCanvasFormas, aoPintar: PintarQuadro);
|
|
69
|
+
private get limiteRepintar();
|
|
70
|
+
/**
|
|
71
|
+
* O primeiro `update` do canvas acontece antes de o Leaflet ouvi-lo (e o `onAdd` do L.Canvas ainda limpa o canvas):
|
|
72
|
+
* por isso o primeiro quadro é pintado aqui.
|
|
73
|
+
*/
|
|
74
|
+
onAdd(map: L.Map): this;
|
|
75
|
+
/**
|
|
76
|
+
* Reposiciona o canvas para a vista (moveend, zoomend, resize). Igual ao `L.Canvas._update`, exceto que o bitmap é
|
|
77
|
+
* preservado e deslocado quando só houve pan, em vez de ser sempre apagado pelo redimensionamento.
|
|
78
|
+
*/
|
|
79
|
+
protected _update(): void;
|
|
80
|
+
/** O Leaflet chama isto depois de cada `update` do canvas (moveend, zoomend, resize); aqui vai a pintura. */
|
|
81
|
+
protected _updatePaths(): void;
|
|
82
|
+
/** Repinta o canvas INTEIRO agora (dados, estilo ou seleção que afeta o conjunto mudaram). */
|
|
83
|
+
pintar(): void;
|
|
84
|
+
private pintarQuadro;
|
|
85
|
+
/** O quadro com a vista atual do canvas, ou `null` se o canvas ainda não foi posicionado. */
|
|
86
|
+
quadroAtual(regioes?: RegiaoPx[] | null): QuadroCanvas | null;
|
|
87
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
import { CanvasLayerDef, CanvasRenderContext } from '../types';
|
|
3
|
+
import { Feicao } from '../feature_types';
|
|
4
|
+
import { CaixaGeo } from '../feature_indice';
|
|
5
|
+
import { EstatisticasFeicoes, IRenderizadorFeicoes } from './renderizador_feicoes_tipos';
|
|
6
|
+
export declare class FeicoesCanvasRenderer implements IRenderizadorFeicoes {
|
|
7
|
+
private estados;
|
|
8
|
+
/** Por definição de camada, para a seleção sobreviver à recriação do grupo (ocultar e exibir a camada). */
|
|
9
|
+
private selecionadas;
|
|
10
|
+
render(layerDef: CanvasLayerDef, map: L.Map, context: CanvasRenderContext): L.LayerGroup;
|
|
11
|
+
update(layerDef: CanvasLayerDef, grupo: L.Layer | L.LayerGroup, changes: Partial<CanvasLayerDef>, context: CanvasRenderContext, _map: L.Map): void;
|
|
12
|
+
destroy(grupo: L.Layer | L.LayerGroup, map: L.Map): void;
|
|
13
|
+
reavaliarVersoes(grupo: L.LayerGroup): void;
|
|
14
|
+
feicaoVisivel(grupo: L.LayerGroup, f: Feicao): boolean;
|
|
15
|
+
consultarProximas(grupo: L.LayerGroup, caixa: CaixaGeo): Feicao[];
|
|
16
|
+
/** Geometria provisória (arrasto de vértice): a feição sai do base e a sobreposição a mostra com a geometria nova. */
|
|
17
|
+
previsualizar(grupo: L.LayerGroup, f: Feicao): void;
|
|
18
|
+
/**
|
|
19
|
+
* Marca como selecionadas as feições `ids` da camada. O custo é O(mudanças): a seleção só repinta a sobreposição e
|
|
20
|
+
* atualiza os marcadores DOM afetados; a base só é refeita se um ponto sob cluster entrou ou saiu da seleção.
|
|
21
|
+
*/
|
|
22
|
+
aplicarSelecao(grupo: L.LayerGroup, ids: Set<string>): void;
|
|
23
|
+
estatisticas(grupo: L.LayerGroup): EstatisticasFeicoes | null;
|
|
24
|
+
/** Detalhe completo = formas, marcadores DOM e as selecionadas (a sobreposição as desenha inteiras); marca = LOD. */
|
|
25
|
+
idsDesenhados(grupo: L.LayerGroup): {
|
|
26
|
+
materializadas: string[];
|
|
27
|
+
marcas: string[];
|
|
28
|
+
} | null;
|
|
29
|
+
/** Repinta já (testes e benchmark; no uso normal o repaint é agendado por quadro). */
|
|
30
|
+
redesenharAgora(grupo: L.LayerGroup): void;
|
|
31
|
+
private defMotor;
|
|
32
|
+
private feicoesDe;
|
|
33
|
+
private pedirBase;
|
|
34
|
+
/** Sincroniza só os marcadores DOM com a vista atual (clusters, ícones, textos, rótulos), sem repintar o canvas. */
|
|
35
|
+
private pedirDom;
|
|
36
|
+
/** Lista do quadro atual da camada (sem pintar). */
|
|
37
|
+
private listaAtual;
|
|
38
|
+
/** A vista de uma faixa exposta no pan incremental (a origem continua sendo a do canvas inteiro). */
|
|
39
|
+
private vistaDaFaixa;
|
|
40
|
+
/**
|
|
41
|
+
* Pinta um quadro. Quadro completo: lista e pintura da vista inteira. Pan incremental (o bitmap já foi deslocado pelo
|
|
42
|
+
* host): só as faixas expostas são listadas e pintadas, recortadas na faixa; os marcadores DOM acompanham a vista
|
|
43
|
+
* inteira (são poucos e não custam projeção nem simplificação).
|
|
44
|
+
*/
|
|
45
|
+
private pintarBase;
|
|
46
|
+
private acao;
|
|
47
|
+
private sincronizarDom;
|
|
48
|
+
private colocarDom;
|
|
49
|
+
private trocarIcone;
|
|
50
|
+
/** A seleção de UMA feição mudou: só o marcador DOM (ícone, texto) ou a curva dela precisa de aparência nova. */
|
|
51
|
+
private atualizarSelecaoDom;
|
|
52
|
+
/**
|
|
53
|
+
* Formas pintadas no canvas respondem ao clique pelo hit-test central do mapa, na geometria ORIGINAL (índice +
|
|
54
|
+
* `feicaoNoPonto`). Ícones, textos e curvas têm objetos Leaflet próprios e não entram aqui; pontos dentro de um
|
|
55
|
+
* cluster também não (o cluster é que responde).
|
|
56
|
+
*/
|
|
57
|
+
private registrarHit;
|
|
58
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
import { CaixaGeo } from '../feature_indice';
|
|
3
|
+
import { Feicao } from '../feature_types';
|
|
4
|
+
import { CanvasLayerDef, CanvasRenderContext } from '../types';
|
|
5
|
+
import { EstatisticasFeicoes, IRenderizadorFeicoes } from './renderizador_feicoes_tipos';
|
|
6
|
+
export type ModoRenderizador = 'leaflet' | 'canvas';
|
|
7
|
+
/** `renderizador` inválido ou ausente cai em `leaflet` (padrão até a Fase 4 do motor de formas). */
|
|
8
|
+
export declare function lerModoRenderizador(valor: string | null | undefined): ModoRenderizador;
|
|
9
|
+
export declare class DespachanteFeicoes implements IRenderizadorFeicoes {
|
|
10
|
+
readonly leaflet: IRenderizadorFeicoes;
|
|
11
|
+
readonly canvas: IRenderizadorFeicoes;
|
|
12
|
+
private roteamento;
|
|
13
|
+
constructor(leaflet?: IRenderizadorFeicoes, canvas?: IRenderizadorFeicoes);
|
|
14
|
+
private modo;
|
|
15
|
+
private de;
|
|
16
|
+
/** Qual caminho desenha este grupo? */
|
|
17
|
+
modoDe(grupo: object): ModoRenderizador;
|
|
18
|
+
render(layerDef: CanvasLayerDef, map: L.Map, context: CanvasRenderContext): L.Layer | L.LayerGroup | null;
|
|
19
|
+
update(layerDef: CanvasLayerDef, grupo: L.Layer | L.LayerGroup, changes: Partial<CanvasLayerDef>, context: CanvasRenderContext, map: L.Map): void;
|
|
20
|
+
destroy(grupo: L.Layer | L.LayerGroup, map: L.Map): void;
|
|
21
|
+
reavaliarVersoes(grupo: L.LayerGroup): void;
|
|
22
|
+
feicaoVisivel(grupo: L.LayerGroup, f: Feicao): boolean;
|
|
23
|
+
consultarProximas(grupo: L.LayerGroup, caixa: CaixaGeo): Feicao[];
|
|
24
|
+
previsualizar(grupo: L.LayerGroup, f: Feicao): void;
|
|
25
|
+
estatisticas(grupo: L.LayerGroup): EstatisticasFeicoes | null;
|
|
26
|
+
idsDesenhados(grupo: L.LayerGroup): {
|
|
27
|
+
materializadas: string[];
|
|
28
|
+
marcas: string[];
|
|
29
|
+
} | null;
|
|
30
|
+
aplicarSelecao(grupo: L.LayerGroup, ids: Set<string>): void;
|
|
31
|
+
}
|
|
@@ -3,9 +3,10 @@ import { ILayerRenderer } from '../layer_renderer_factory';
|
|
|
3
3
|
import { CanvasLayerDef, CanvasRenderContext } from '../types';
|
|
4
4
|
import { Feicao } from '../feature_types';
|
|
5
5
|
import { CaixaGeo } from '../feature_indice';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export
|
|
6
|
+
import { ICONES_FEICAO } from './marcadores_feicoes';
|
|
7
|
+
import { COR_SELECAO, corSegura } from '../motor/estilo';
|
|
8
|
+
export { ICONES_FEICAO };
|
|
9
|
+
export { corSegura, COR_SELECAO };
|
|
9
10
|
/**
|
|
10
11
|
* Mudança incremental enviada pelo gerenciador junto com os dados (`dados.delta`). Só vale se `base` for a lista que
|
|
11
12
|
* este renderizador sincronizou por último; senão a camada é reconciliada por inteiro.
|
|
@@ -17,7 +18,6 @@ export interface DeltaFeicoes {
|
|
|
17
18
|
removidas: string[];
|
|
18
19
|
}
|
|
19
20
|
type Grupo = L.LayerGroup;
|
|
20
|
-
export declare const COR_SELECAO = "#38bdf8";
|
|
21
21
|
/** Até aqui mantém tudo carregado (sem pop-in); acima, só o que está perto da tela. */
|
|
22
22
|
export declare const LIMITE_CULLING = 300;
|
|
23
23
|
export declare class FeicoesLayerRenderer implements ILayerRenderer {
|
|
@@ -36,11 +36,21 @@ export declare class FeicoesLayerRenderer implements ILayerRenderer {
|
|
|
36
36
|
consultarProximas(group: Grupo, caixa: CaixaGeo): Feicao[];
|
|
37
37
|
/** Mostra uma geometria provisória (durante um arrasto) sem tocar nos dados nem no índice. */
|
|
38
38
|
previsualizar(group: Grupo, f: Feicao): void;
|
|
39
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Para testes, benchmark e diagnóstico: `total` (na camada), `materializadas` (objetos Leaflet), `marcasLOD` (feições
|
|
41
|
+
* pequenas pintadas em lote), `clusters` e `avaliacoesLOD` (quantas vezes o LOD foi calculado; no pan puro não cresce).
|
|
42
|
+
*/
|
|
40
43
|
estatisticas(group: Grupo): {
|
|
41
44
|
total: number;
|
|
42
45
|
materializadas: number;
|
|
46
|
+
marcasLOD: number;
|
|
43
47
|
clusters: number;
|
|
48
|
+
avaliacoesLOD: number;
|
|
49
|
+
} | null;
|
|
50
|
+
/** Ids desenhados, separados por forma (Leaflet × marca de LOD). Base da comparação "incremental = completo". */
|
|
51
|
+
idsDesenhados(group: Grupo): {
|
|
52
|
+
materializadas: string[];
|
|
53
|
+
marcas: string[];
|
|
44
54
|
} | null;
|
|
45
55
|
private feicoesDe;
|
|
46
56
|
private obterEstado;
|
|
@@ -55,8 +65,34 @@ export declare class FeicoesLayerRenderer implements ILayerRenderer {
|
|
|
55
65
|
private desenhavel;
|
|
56
66
|
private estaCarregado;
|
|
57
67
|
private caixaDe;
|
|
58
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* Decide como a feição é desenhada: marca de LOD (menor que ~3 px) ou camada Leaflet. Sempre em detalhe completo:
|
|
70
|
+
* selecionada (inclui a em edição, que é sempre selecionada), com rótulo e em par oficial × prévia. Pontos e textos
|
|
71
|
+
* nunca viram marca (já têm a regra de cluster). `zoomLod < 0` = mapa sem vista: sem LOD.
|
|
72
|
+
* O resultado é guardado por (feição, zoom): no pan só se consulta; muda ao trocar de zoom ou de geometria.
|
|
73
|
+
*/
|
|
74
|
+
private comoMarca;
|
|
75
|
+
private novaMarca;
|
|
76
|
+
/** Desenha a feição como marca ou camada Leaflet, trocando de uma forma para a outra quando preciso. */
|
|
77
|
+
private colocarFeicao;
|
|
78
|
+
/**
|
|
79
|
+
* Cria a camada das marcas na primeira necessidade e pede o redesenho. Sem marcas ela é desfeita: um canvas vazio por
|
|
80
|
+
* camada ainda custaria limpeza e rasterização a cada vista. O clique nas marcas entra no hit-test central do mapa
|
|
81
|
+
* (`layer_hit_test`), que escolhe UMA feição entre todas as camadas e dispara `click` na camada das marcas.
|
|
82
|
+
*/
|
|
83
|
+
private sincronizarMarcas;
|
|
84
|
+
/**
|
|
85
|
+
* Hit-test das marcas na geometria ORIGINAL (índice + `feicaoNoPonto`): uma feição de 1 px continua clicável.
|
|
86
|
+
* Devolve as feições sob o ponto, da melhor para a pior, para a alternância de cliques empilhados do clique central.
|
|
87
|
+
*/
|
|
88
|
+
private fonteDeMarcas;
|
|
89
|
+
private descartarMarcas;
|
|
90
|
+
/**
|
|
91
|
+
* Cria a camada Leaflet da feição ou remenda a que existe (e só se algo mudou). `'estilo'` só troca o estilo.
|
|
92
|
+
* Uma feição que o Leaflet recusa (coordenada NaN, por exemplo) fica sem desenho em vez de derrubar a camada inteira.
|
|
93
|
+
*/
|
|
59
94
|
private materializar;
|
|
95
|
+
private materializarFeicao;
|
|
60
96
|
private tirarEntrada;
|
|
61
97
|
private colocarCluster;
|
|
62
98
|
private tirarCluster;
|
|
@@ -69,11 +105,13 @@ export declare class FeicoesLayerRenderer implements ILayerRenderer {
|
|
|
69
105
|
* o estado de conjunto muda: regra oficial × prévia, entrada/saída do corte por viewport ou do agrupamento.
|
|
70
106
|
*/
|
|
71
107
|
private reconciliarParcial;
|
|
108
|
+
private reconciliarParcialInterno;
|
|
72
109
|
private criarMarcadorCluster;
|
|
73
110
|
/**
|
|
74
111
|
* Marca como selecionadas as feições `ids` deste grupo (as demais voltam ao estilo normal).
|
|
75
|
-
* Só as que mudaram são tocadas
|
|
76
|
-
*
|
|
112
|
+
* Só as que mudaram são tocadas, e só no estilo: o custo é O(mudanças), não O(visíveis). A camada inteira só é
|
|
113
|
+
* reconciliada quando a mudança pode alterar o CONJUNTO desenhado, ou seja, quando há ponto sob agrupamento
|
|
114
|
+
* (selecionado sai do cluster, desmarcado volta a ele). Mudanças grandes são aplicadas em blocos, as visíveis primeiro.
|
|
77
115
|
*/
|
|
78
116
|
aplicarSelecao(group: Grupo, ids: Set<string>): void;
|
|
79
117
|
private formaDe;
|
|
@@ -81,9 +119,10 @@ export declare class FeicoesLayerRenderer implements ILayerRenderer {
|
|
|
81
119
|
private estiloVetor;
|
|
82
120
|
private criar;
|
|
83
121
|
private remendar;
|
|
122
|
+
/** Só o estilo (seleção): sem `setLatLngs`, que reprojetaria e recalcularia limites da forma. */
|
|
123
|
+
private restilizar;
|
|
84
124
|
private iconeSvg;
|
|
85
125
|
private iconeTexto;
|
|
86
126
|
private aplicarRotulo;
|
|
87
127
|
private ligarEventos;
|
|
88
128
|
}
|
|
89
|
-
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
import { Feicao } from '../feature_types';
|
|
3
|
+
import { LayerStyleDef } from '../types';
|
|
4
|
+
import { EstiloVetor } from '../motor/estilo';
|
|
5
|
+
export declare const ICONES_FEICAO: Record<string, string>;
|
|
6
|
+
export declare function iconeSvg(f: Feicao, estiloCamada: LayerStyleDef, selecionada?: boolean): L.DivIcon;
|
|
7
|
+
export declare function iconeTexto(f: Feicao, estiloCamada: LayerStyleDef, selecionada?: boolean): L.DivIcon;
|
|
8
|
+
/** Bolinha numerada do agrupamento de pontos. */
|
|
9
|
+
export declare function iconeCluster(n: number, estiloCamada: LayerStyleDef): L.DivIcon;
|
|
10
|
+
/** Opções de `L.Path` a partir do estilo resolvido pelo motor (mesma tradução nos dois renderizadores). */
|
|
11
|
+
export declare function opcoesPath(e: EstiloVetor, interativo: boolean): L.PathOptions;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
import { MarcaLOD } from '../feature_lod';
|
|
3
|
+
export declare class CamadaMarcasLOD extends L.Layer {
|
|
4
|
+
private canvas;
|
|
5
|
+
private agendado;
|
|
6
|
+
private vivo;
|
|
7
|
+
private readonly nomePane;
|
|
8
|
+
private readonly obterMarcas;
|
|
9
|
+
/** Quantas marcas caíram dentro do canvas na última pintura (diagnóstico e testes). */
|
|
10
|
+
ultimaPintura: number;
|
|
11
|
+
constructor(nomePane: string, obterMarcas: () => Iterable<MarcaLOD>);
|
|
12
|
+
onAdd(map: L.Map): this;
|
|
13
|
+
onRemove(map: L.Map): this;
|
|
14
|
+
/** Pede um redesenho no próximo quadro (vários pedidos viram um só). */
|
|
15
|
+
solicitarRedesenho(): void;
|
|
16
|
+
private esconder;
|
|
17
|
+
/** Posiciona o canvas sobre a vista atual e pinta as marcas. Nunca lança: mapa sem vista ou sem Canvas 2D só não pinta. */
|
|
18
|
+
redesenhar(): void;
|
|
19
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { default as L } from 'leaflet';
|
|
2
|
+
import { CaixaGeo } from '../feature_indice';
|
|
3
|
+
import { Feicao } from '../feature_types';
|
|
4
|
+
import { ILayerRenderer } from '../layer_renderer_factory';
|
|
5
|
+
/**
|
|
6
|
+
* Contrato comum dos renderizadores de camadas de feições (`leaflet` e `canvas`): o gerenciador de feições fala só
|
|
7
|
+
* com isto e não sabe qual dos dois está desenhando.
|
|
8
|
+
*/
|
|
9
|
+
export interface EstatisticasFeicoes {
|
|
10
|
+
/** Feições na camada. */
|
|
11
|
+
total: number;
|
|
12
|
+
/** Desenhadas com detalhe completo: objetos Leaflet (caminho `leaflet`) ou formas no canvas e marcadores DOM (`canvas`). */
|
|
13
|
+
materializadas: number;
|
|
14
|
+
/** Feições pequenas pintadas como marca de 1–2 px (LOD). */
|
|
15
|
+
marcasLOD: number;
|
|
16
|
+
clusters: number;
|
|
17
|
+
/** Quantas vezes o LOD foi calculado (no pan puro não cresce). */
|
|
18
|
+
avaliacoesLOD: number;
|
|
19
|
+
/** Caminho `canvas`: itens pintados no canvas (sem as marcas). */
|
|
20
|
+
desenhadas?: number;
|
|
21
|
+
/** Caminho `canvas`: marcadores DOM (ícones, textos, clusters, rótulos). */
|
|
22
|
+
marcadoresDom?: number;
|
|
23
|
+
/** Canvases usados pela camada (o canvas dela + a sobreposição compartilhada, no caminho `canvas`). */
|
|
24
|
+
canvases?: number;
|
|
25
|
+
renderizador?: 'leaflet' | 'canvas';
|
|
26
|
+
}
|
|
27
|
+
export interface IRenderizadorFeicoes extends ILayerRenderer {
|
|
28
|
+
/** A regra de versões mudou (prévias ligadas/desligadas): recalcula o que aparece. */
|
|
29
|
+
reavaliarVersoes(grupo: L.LayerGroup): void;
|
|
30
|
+
/** A feição aparece segundo a regra de oficial × prévia? */
|
|
31
|
+
feicaoVisivel(grupo: L.LayerGroup, f: Feicao): boolean;
|
|
32
|
+
/** Feições da camada cujo envelope toca `caixa` (snap e consultas espaciais), sem as ocultas. */
|
|
33
|
+
consultarProximas(grupo: L.LayerGroup, caixa: CaixaGeo): Feicao[];
|
|
34
|
+
/** Mostra uma geometria provisória (arrasto de vértice) sem tocar nos dados nem no índice. */
|
|
35
|
+
previsualizar(grupo: L.LayerGroup, f: Feicao): void;
|
|
36
|
+
estatisticas(grupo: L.LayerGroup): EstatisticasFeicoes | null;
|
|
37
|
+
/** Ids desenhados em detalhe completo e ids desenhados como marca de LOD (comparação entre renderizadores). */
|
|
38
|
+
idsDesenhados(grupo: L.LayerGroup): {
|
|
39
|
+
materializadas: string[];
|
|
40
|
+
marcas: string[];
|
|
41
|
+
} | null;
|
|
42
|
+
/** Marca como selecionadas as feições `ids` da camada (as demais voltam ao estilo normal). */
|
|
43
|
+
aplicarSelecao(grupo: L.LayerGroup, ids: Set<string>): void;
|
|
44
|
+
}
|