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
|
|
|
|
2020-12-10 02:21:42 +00:00
|
|
|
export interface DynmapIconOptions extends DivIconOptions {
|
2020-12-01 23:20:38 +00:00
|
|
|
icon: string;
|
|
|
|
label: string;
|
|
|
|
showLabel: boolean;
|
|
|
|
isHtml?: boolean;
|
|
|
|
}
|
|
|
|
|
2020-12-14 00:27:49 +00:00
|
|
|
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: '',
|
2020-12-10 02:21:42 +00:00
|
|
|
iconSize: [16, 16],
|
2020-12-01 23:20:38 +00:00
|
|
|
showLabel: false,
|
|
|
|
isHtml: false,
|
|
|
|
className: '',
|
|
|
|
};
|
2020-12-10 02:21:42 +00:00
|
|
|
|
|
|
|
// @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
|
|
|
}
|
|
|
|
|
2020-12-14 00:27:49 +00:00
|
|
|
const div = markerContainer.cloneNode(false) as HTMLDivElement,
|
|
|
|
img = markerIcon.cloneNode(false) as HTMLImageElement,
|
|
|
|
label = markerLabel.cloneNode(false) as HTMLSpanElement,
|
|
|
|
|
2020-12-10 02:21:42 +00:00
|
|
|
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
|
|
|
|
2020-12-10 02:21:42 +00:00
|
|
|
const sizeClass = [size.x, size.y].join('x');
|
2020-12-01 23:20:38 +00:00
|
|
|
|
2020-12-14 00:27:49 +00:00
|
|
|
img.width = size.x;
|
|
|
|
img.height = size.y;
|
2020-12-01 23:20:38 +00:00
|
|
|
img.src = url;
|
|
|
|
|
2020-12-14 00:27:49 +00:00
|
|
|
if(this.options.showLabel) {
|
|
|
|
label.classList.add('marker__label--show');
|
|
|
|
}
|
|
|
|
|
2020-12-10 02:21:42 +00:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2020-12-10 02:21:42 +00:00
|
|
|
// @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
|
|
|
|
2020-12-10 02:21:42 +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
|
|
|
|
2020-12-10 02:21:42 +00:00
|
|
|
return div;
|
2020-12-01 23:20:38 +00:00
|
|
|
}
|
|
|
|
}
|