LiveAtlas/src/leaflet/icon/DynmapIcon.ts

80 lines
2.0 KiB
TypeScript
Raw Normal View History

2020-12-12 22:04:56 +00:00
import {DivIconOptions, PointExpression, Icon, DivIcon, DomUtil, point} from 'leaflet';
2020-12-01 23:20:38 +00:00
export interface DynmapIconOptions extends DivIconOptions {
2020-12-01 23:20:38 +00:00
icon: string;
label: string;
showLabel: boolean;
isHtml?: boolean;
}
const markerContainer: HTMLDivElement = document.createElement('div');
markerContainer.className = 'marker';
const markerIcon: HTMLImageElement = document.createElement('img');
markerIcon.className = 'marker__icon';
const markerLabel: HTMLSpanElement = document.createElement('span');
markerLabel.className = 'marker__label';
2020-12-12 22:04:56 +00:00
export class DynmapIcon extends DivIcon {
2020-12-01 23:20:38 +00:00
static defaultOptions: DynmapIconOptions = {
icon: 'default',
label: '',
iconSize: [16, 16],
2020-12-01 23:20:38 +00:00
showLabel: false,
isHtml: false,
className: '',
};
// @ts-ignore
options: DynmapIconOptions;
2020-12-01 23:20:38 +00:00
constructor(options: DynmapIconOptions) {
super(Object.assign(DynmapIcon.defaultOptions, options));
}
createIcon(oldIcon: HTMLElement) {
if (oldIcon) {
2020-12-12 22:04:56 +00:00
DomUtil.remove(oldIcon);
2020-12-01 23:20:38 +00:00
}
const div = markerContainer.cloneNode(false) as HTMLDivElement,
img = markerIcon.cloneNode(false) as HTMLImageElement,
label = markerLabel.cloneNode(false) as HTMLSpanElement,
url = `${window.config.url.markers}_markers_/${this.options.icon}.png`,
2020-12-12 22:04:56 +00:00
size = point(this.options.iconSize as PointExpression);
2020-12-01 23:20:38 +00:00
const sizeClass = [size.x, size.y].join('x');
2020-12-01 23:20:38 +00:00
img.width = size.x;
img.height = size.y;
2020-12-01 23:20:38 +00:00
img.src = url;
if(this.options.showLabel) {
label.classList.add('marker__label--show');
}
label.classList.add(/*'markerName_' + set.id,*/ `marker__label--${sizeClass}`);
2020-12-01 23:20:38 +00:00
if (this.options.isHtml) {
label.insertAdjacentHTML('afterbegin', this.options.label);
} else {
label.textContent = this.options.label;
}
// @ts-ignore
2020-12-12 22:04:56 +00:00
Icon.prototype._setIconStyles.call(this, div, 'icon');
2020-12-01 23:20:38 +00:00
div.appendChild(img);
div.appendChild(label);
div.classList.add('marker');
if(this.options.className) {
div.classList.add(this.options.className);
}
2020-12-01 23:20:38 +00:00
return div;
2020-12-01 23:20:38 +00:00
}
}