mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-26 03:26:41 +07:00
stickers: rewritten it with JSX
This commit is contained in:
parent
0d9bad9095
commit
fa9bff5756
2 changed files with 59 additions and 37 deletions
|
@ -1,9 +1,10 @@
|
||||||
import { marker } from 'leaflet';
|
import { marker } from 'leaflet';
|
||||||
import 'leaflet-editable';
|
import 'leaflet-editable';
|
||||||
|
import React from 'react';
|
||||||
import { DomMarker } from '$utils/DomMarker';
|
import { DomMarker } from '$utils/DomMarker';
|
||||||
|
|
||||||
import { STICKERS } from '$constants/stickers';
|
import { STICKERS } from '$constants/stickers';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
|
||||||
export class Sticker {
|
export class Sticker {
|
||||||
constructor({
|
constructor({
|
||||||
|
@ -21,20 +22,43 @@ export class Sticker {
|
||||||
this.lockMapClicks = lockMapClicks;
|
this.lockMapClicks = lockMapClicks;
|
||||||
|
|
||||||
this.element = document.createElement('div');
|
this.element = document.createElement('div');
|
||||||
this.stickerImage = document.createElement('div');
|
ReactDOM.render(
|
||||||
this.stickerArrow = document.createElement('div');
|
<React.Fragment>
|
||||||
this.stickerDelete = document.createElement('div');
|
<div
|
||||||
|
className="sticker-arrow"
|
||||||
|
ref={el => { this.stickerArrow = el; }}
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
className="sticker-label"
|
||||||
|
ref={el => { this.stickerImage = el; }}
|
||||||
|
onMouseDown={this.onDragStart}
|
||||||
|
onMouseUp={this.onDragStop}
|
||||||
|
>
|
||||||
|
{this.generateStickerSVG(sticker)}
|
||||||
|
<div
|
||||||
|
className="sticker-delete"
|
||||||
|
onMouseDown={this.onDelete}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</React.Fragment>,
|
||||||
|
this.element
|
||||||
|
);
|
||||||
|
|
||||||
this.element.className = 'sticker-container';
|
// this.stickerImage = document.createElement('div');
|
||||||
this.stickerImage.className = 'sticker-label';
|
// this.stickerArrow = document.createElement('div');
|
||||||
this.stickerArrow.className = 'sticker-arrow';
|
// this.stickerDelete = document.createElement('div');
|
||||||
this.stickerDelete.className = 'sticker-delete';
|
|
||||||
|
|
||||||
this.stickerImage.innerHTML = this.generateStickerSVG(sticker);
|
// this.element.className = 'sticker-container';
|
||||||
|
|
||||||
this.element.appendChild(this.stickerArrow);
|
// this.stickerImage.className = 'sticker-label';
|
||||||
this.element.appendChild(this.stickerImage);
|
// this.stickerArrow.className = 'sticker-arrow';
|
||||||
this.stickerArrow.appendChild(this.stickerDelete);
|
// this.stickerDelete.className = 'sticker-delete';
|
||||||
|
|
||||||
|
// this.stickerImage.innerHTML = this.generateStickerSVG(sticker);
|
||||||
|
|
||||||
|
// this.element.appendChild(this.stickerArrow);
|
||||||
|
// this.element.appendChild(this.stickerImage);
|
||||||
|
// this.stickerImage.appendChild(this.stickerDelete);
|
||||||
|
|
||||||
const mark = new DomMarker({
|
const mark = new DomMarker({
|
||||||
element: this.element,
|
element: this.element,
|
||||||
|
@ -43,16 +67,16 @@ export class Sticker {
|
||||||
|
|
||||||
this.marker = marker(latlng, { icon: mark });
|
this.marker = marker(latlng, { icon: mark });
|
||||||
|
|
||||||
this.setAngle(angle);
|
//
|
||||||
|
|
||||||
this.stickerImage.addEventListener('mousedown', this.onDragStart);
|
|
||||||
this.stickerImage.addEventListener('mouseup', this.onDragStop);
|
|
||||||
|
|
||||||
|
// this.stickerImage.addEventListener('mousedown', this.onDragStart);
|
||||||
|
// this.stickerImage.addEventListener('mouseup', this.onDragStop);
|
||||||
|
this.element.addEventListener('mouseup', this.onDragStop);
|
||||||
this.element.addEventListener('mouseup', this.preventPropagations);
|
this.element.addEventListener('mouseup', this.preventPropagations);
|
||||||
this.stickerDelete.addEventListener('mousedown', this.onDelete);
|
// this.stickerDelete.addEventListener('mousedown', this.onDelete);
|
||||||
|
|
||||||
this.marker.addEventListener('dragend', this.triggerOnChange);
|
this.marker.addEventListener('dragend', this.triggerOnChange);
|
||||||
|
|
||||||
|
this.setAngle(angle);
|
||||||
this.triggerOnChange();
|
this.triggerOnChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +86,7 @@ export class Sticker {
|
||||||
};
|
};
|
||||||
|
|
||||||
onDragStart = e => {
|
onDragStart = e => {
|
||||||
|
console.log('drag start');
|
||||||
this.preventPropagations(e);
|
this.preventPropagations(e);
|
||||||
|
|
||||||
this.isDragging = true;
|
this.isDragging = true;
|
||||||
|
@ -107,7 +132,7 @@ export class Sticker {
|
||||||
};
|
};
|
||||||
|
|
||||||
setAngle = angle => {
|
setAngle = angle => {
|
||||||
const rad = 44;
|
const rad = 56;
|
||||||
const mrad = 76;
|
const mrad = 76;
|
||||||
const x = ((Math.cos(angle + 3.14) * rad) - 30);
|
const x = ((Math.cos(angle + 3.14) * rad) - 30);
|
||||||
const y = ((Math.sin(angle + 3.14) * rad) - 30);
|
const y = ((Math.sin(angle + 3.14) * rad) - 30);
|
||||||
|
@ -125,17 +150,13 @@ export class Sticker {
|
||||||
};
|
};
|
||||||
|
|
||||||
generateStickerSVG = ({ set, sticker }) => (
|
generateStickerSVG = ({ set, sticker }) => (
|
||||||
// `
|
<div
|
||||||
// <svg width="64" height="64">
|
className="sticker-image"
|
||||||
// <use xlink:href="${stickers}#sticker-${sticker}" x="0" y="0" width="64" height="64" />
|
style={{
|
||||||
// </svg>
|
backgroundImage: `url('${STICKERS[set].url}`,
|
||||||
// `
|
backgroundPosition: `${-STICKERS[set].layers[sticker].off * 72} 50%`,
|
||||||
`
|
}}
|
||||||
<div
|
/>
|
||||||
class="sticker-image"
|
|
||||||
style="background-image: url('${STICKERS[set].url}');background-position: ${-STICKERS[set].layers[sticker].off * 72} 50%">
|
|
||||||
</div>
|
|
||||||
`
|
|
||||||
);
|
);
|
||||||
|
|
||||||
dumpData = () => ({
|
dumpData = () => ({
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
.sticker-container {
|
.sticker-container {
|
||||||
outline: none;
|
outline: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
// transition: transform 250ms;
|
transition: transform 250ms;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
|
|
||||||
|
@ -18,8 +18,8 @@
|
||||||
top: -24px;
|
top: -24px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border-radius: 40px;
|
border-radius: 40px;
|
||||||
opacity: 0;
|
opacity: 0.25;
|
||||||
transform: scale(0.5);
|
transform: scale(0.6);
|
||||||
transition: opacity 250ms, transform 500ms;
|
transition: opacity 250ms, transform 500ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,8 +69,8 @@
|
||||||
//}
|
//}
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
left: -8px;
|
left: -12px;
|
||||||
top: -8px;
|
top: -12px;
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 0;
|
z-index: 0;
|
||||||
}
|
}
|
||||||
|
@ -91,6 +91,7 @@
|
||||||
transform-origin: 0 0;
|
transform-origin: 0 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
&:after {
|
&:after {
|
||||||
content: ' ';
|
content: ' ';
|
||||||
|
@ -115,8 +116,8 @@
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
left: 70px;
|
left: 42px;
|
||||||
top: 12px;
|
top: 0;
|
||||||
z-index: 20;
|
z-index: 20;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue