LiveAtlas/src/util/markers.ts

133 lines
4.3 KiB
TypeScript
Raw Normal View History

2020-12-16 16:54:41 +00:00
/*
* Copyright 2022 James Lyne
2020-12-16 16:54:41 +00:00
*
* Some portions of this file were taken from https://github.com/webbukkit/dynmap.
* These portions are Copyright 2020 Dynmap Contributors.
*
2021-07-25 14:12:40 +00:00
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
2020-12-16 16:54:41 +00:00
*
2021-07-25 14:12:40 +00:00
* http://www.apache.org/licenses/LICENSE-2.0
2020-12-16 16:54:41 +00:00
*
2021-07-25 14:12:40 +00:00
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
2020-12-16 16:54:41 +00:00
*/
import {useStore} from "@/store";
import {ActionTypes} from "@/store/action-types";
import {DynmapMarkerUpdate} from "@/dynmap";
import {computed, watch} from "@vue/runtime-core";
import {ComputedRef} from "@vue/reactivity";
import {
LiveAtlasAreaMarker,
LiveAtlasCircleMarker,
LiveAtlasLineMarker,
LiveAtlasMarker,
LiveAtlasPointMarker
} from "@/index";
import {Layer} from "leaflet";
2022-01-15 18:45:01 +00:00
import {createCircleLayer, updateCircleLayer} from "@/util/circles";
import {createPointLayer, updatePointLayer} from "@/util/points";
import {createAreaLayer, updateAreaLayer} from "@/util/areas";
import {createLineLayer, updateLineLayer} from "@/util/lines";
import {GenericMarker} from "@/leaflet/marker/GenericMarker";
import LiveAtlasPolygon from "@/leaflet/vector/LiveAtlasPolygon";
import LiveAtlasPolyline from "@/leaflet/vector/LiveAtlasPolyline";
export type LiveAtlasMarkerUpdateCallback = ((update: DynmapMarkerUpdate) => void);
2021-01-26 14:32:48 +00:00
export enum LiveAtlasMarkerType {
POINT,
AREA,
LINE,
CIRCLE
}
let updateFrame = 0;
let pendingUpdates: ComputedRef;
const updateHandlers: { [key:string]: Set<LiveAtlasMarkerUpdateCallback>} = {};
export const startUpdateHandling = () => {
const store = useStore();
pendingUpdates = computed(() => store.state.pendingMarkerUpdates.length);
watch(pendingUpdates, (newValue, oldValue) => {
if(newValue && newValue > 0 && oldValue === 0 && !updateFrame) {
updateFrame = requestAnimationFrame(() => handlePendingUpdates());
}
2021-05-25 22:31:03 +00:00
});
}
2021-05-25 22:31:03 +00:00
export const stopUpdateHandling = () => {
if(updateFrame) {
cancelAnimationFrame(updateFrame);
updateFrame = 0;
2021-01-26 14:32:48 +00:00
}
}
2021-01-26 14:32:48 +00:00
export const registerUpdateHandler = (callback: LiveAtlasMarkerUpdateCallback, set: string) => {
if(!updateHandlers[set]) {
updateHandlers[set] = new Set();
}
updateHandlers[set].add(callback);
}
2020-12-18 18:01:37 +00:00
export const unregisterUpdateHandler = (callback: LiveAtlasMarkerUpdateCallback, set: string) => {
if(!updateHandlers[set]) {
return;
2021-01-26 14:32:48 +00:00
}
updateHandlers[set].delete(callback);
}
2021-01-26 14:32:48 +00:00
const handlePendingUpdates = async () => {
const store = useStore(),
updates = await store.dispatch(ActionTypes.POP_MARKER_UPDATES, 10);
2021-01-26 14:32:48 +00:00
for(const update of updates) {
if(updateHandlers[update.set]) {
updateHandlers[update.set].forEach(callback => callback(update));
}
2021-01-26 14:32:48 +00:00
}
if(pendingUpdates.value) {
// eslint-disable-next-line no-unused-vars
updateFrame = requestAnimationFrame(() => handlePendingUpdates());
} else {
updateFrame = 0;
}
};
2022-01-15 18:45:01 +00:00
export const createMarkerLayer = (options: LiveAtlasMarker, converter: Function): Layer => {
switch(options.type) {
case LiveAtlasMarkerType.POINT:
2022-01-15 18:45:01 +00:00
return createPointLayer(options as LiveAtlasPointMarker, converter);
case LiveAtlasMarkerType.AREA:
2022-01-15 18:45:01 +00:00
return createAreaLayer(options as LiveAtlasAreaMarker, converter);
case LiveAtlasMarkerType.LINE:
2022-01-15 18:45:01 +00:00
return createLineLayer(options as LiveAtlasLineMarker, converter);
case LiveAtlasMarkerType.CIRCLE:
2022-01-15 18:45:01 +00:00
return createCircleLayer(options as LiveAtlasCircleMarker, converter);
}
}
2022-01-15 18:45:01 +00:00
export const updateMarkerLayer = (marker: Layer | undefined, options: LiveAtlasMarker, converter: Function): Layer => {
switch(options.type) {
case LiveAtlasMarkerType.POINT:
2022-01-15 18:45:01 +00:00
return updatePointLayer(marker as GenericMarker, options as LiveAtlasPointMarker, converter);
case LiveAtlasMarkerType.AREA:
2022-01-15 18:45:01 +00:00
return updateAreaLayer(marker as LiveAtlasPolygon | LiveAtlasPolyline, options as LiveAtlasAreaMarker, converter);
case LiveAtlasMarkerType.LINE:
2022-01-15 18:45:01 +00:00
return updateLineLayer(marker as LiveAtlasPolyline, options as LiveAtlasLineMarker, converter);
case LiveAtlasMarkerType.CIRCLE:
2022-01-15 18:45:01 +00:00
return updateCircleLayer(marker as LiveAtlasPolyline | LiveAtlasPolygon, options as LiveAtlasCircleMarker, converter);
}
}