mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 02:56:41 +07:00
adaptive sticker scale
This commit is contained in:
parent
ef5cd0cdef
commit
a1c55befa2
5 changed files with 22 additions and 9 deletions
|
@ -7,6 +7,7 @@ import classNames from 'classnames';
|
||||||
import { DomMarker } from '~/utils/map/DomMarker';
|
import { DomMarker } from '~/utils/map/DomMarker';
|
||||||
import { createPortal } from 'react-dom';
|
import { createPortal } from 'react-dom';
|
||||||
import { MapContainer, MainMap } from '~/constants/map';
|
import { MapContainer, MainMap } from '~/constants/map';
|
||||||
|
import { getAdaptiveScale } from '~/utils/dom';
|
||||||
|
|
||||||
interface IProps {
|
interface IProps {
|
||||||
sticker: IStickerDump;
|
sticker: IStickerDump;
|
||||||
|
@ -153,7 +154,7 @@ const Sticker: React.FC<IProps> = ({
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!wrapper || !wrapper.current) return;
|
if (!wrapper || !wrapper.current) return;
|
||||||
|
|
||||||
const scale = zoom / 13;
|
const scale = getAdaptiveScale(zoom) // adaptive zoom :-)
|
||||||
|
|
||||||
wrapper.current.style.transform = `scale(${scale}) perspective(1px)`
|
wrapper.current.style.transform = `scale(${scale}) perspective(1px)`
|
||||||
}, [zoom, wrapper]);
|
}, [zoom, wrapper]);
|
||||||
|
|
|
@ -18,8 +18,8 @@ const Stickers: FC<IProps> = memo(({ stickers, is_editing, mapSetSticker, mapDro
|
||||||
const [zoom, setZoom] = useState(16);
|
const [zoom, setZoom] = useState(16);
|
||||||
|
|
||||||
const onZoomChange = useCallback(
|
const onZoomChange = useCallback(
|
||||||
(event: LeafletEvent) => {
|
(event) => {
|
||||||
setZoom(event.target._zoom);
|
setZoom(event.zoom);
|
||||||
},
|
},
|
||||||
[setZoom]
|
[setZoom]
|
||||||
);
|
);
|
||||||
|
@ -29,10 +29,10 @@ const Stickers: FC<IProps> = memo(({ stickers, is_editing, mapSetSticker, mapDro
|
||||||
|
|
||||||
const item = new FeatureGroup().addTo(MainMap.stickerLayer);
|
const item = new FeatureGroup().addTo(MainMap.stickerLayer);
|
||||||
setLayer(item);
|
setLayer(item);
|
||||||
MainMap.on('zoomend', onZoomChange);
|
MainMap.on('zoomanim', onZoomChange);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
MainMap.off('zoomend', onZoomChange);
|
MainMap.off('zoomanim', onZoomChange);
|
||||||
MainMap.stickerLayer.removeLayer(item);
|
MainMap.stickerLayer.removeLayer(item);
|
||||||
};
|
};
|
||||||
}, [MainMap, onZoomChange]);
|
}, [MainMap, onZoomChange]);
|
||||||
|
|
|
@ -66,7 +66,7 @@ import { MainMap } from '~/constants/map';
|
||||||
import { EDITOR_INITIAL_STATE } from '.';
|
import { EDITOR_INITIAL_STATE } from '.';
|
||||||
import { Unwrap } from '~/utils/middleware';
|
import { Unwrap } from '~/utils/middleware';
|
||||||
import uuid from 'uuid';
|
import uuid from 'uuid';
|
||||||
import { getRandomColor } from '~/utils/dom';
|
import { getRandomColor, getAdaptiveScale } from '~/utils/dom';
|
||||||
|
|
||||||
const hideLoader = () => {
|
const hideLoader = () => {
|
||||||
document.getElementById('loader').style.opacity = String(0);
|
document.getElementById('loader').style.opacity = String(0);
|
||||||
|
@ -141,7 +141,11 @@ function* getRenderData() {
|
||||||
|
|
||||||
yield composeArrows({ points, ctx });
|
yield composeArrows({ points, ctx });
|
||||||
yield composeDistMark({ ctx, points, distance });
|
yield composeDistMark({ ctx, points, distance });
|
||||||
yield composeStickers({ stickers: sticker_points, ctx, zoom: MainMap.getZoom() / 13 });
|
yield composeStickers({
|
||||||
|
stickers: sticker_points,
|
||||||
|
ctx,
|
||||||
|
zoom: getAdaptiveScale(MainMap.getZoom()),
|
||||||
|
});
|
||||||
|
|
||||||
yield put(editorSetRenderer({ info: 'Готово', progress: 1 }));
|
yield put(editorSetRenderer({ info: 'Готово', progress: 1 }));
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,11 @@
|
||||||
|
|
||||||
.sticker-wrapper {
|
.sticker-wrapper {
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
transition: transform 50ms;
|
transition: transform 250ms;
|
||||||
|
|
||||||
|
@media (hover: hover) {
|
||||||
|
transition: transform 0ms;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sticker-arrow {
|
.sticker-arrow {
|
||||||
|
|
|
@ -11,4 +11,8 @@ export const getStyle = (oElm: any, strCssRule: string): string => {
|
||||||
|
|
||||||
export const getRandomColor = () => {
|
export const getRandomColor = () => {
|
||||||
return `hsla(${(Math.floor(Math.random() * 360))}, 100%, 50%, 0.4)`
|
return `hsla(${(Math.floor(Math.random() * 360))}, 100%, 50%, 0.4)`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getAdaptiveScale = (zoom: number): number => (
|
||||||
|
Math.min(1, Math.max(0.4, 1 / (2 ** (13 - zoom))))
|
||||||
|
);
|
Loading…
Add table
Add a link
Reference in a new issue