mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 19:16:41 +07:00
cursor: hint for stickers
This commit is contained in:
parent
45fd758c1d
commit
d248b679ed
9 changed files with 80 additions and 24 deletions
|
@ -137,7 +137,7 @@ const run = async () => {
|
||||||
...stickersParser(stickers),
|
...stickersParser(stickers),
|
||||||
...pointParser(points)
|
...pointParser(points)
|
||||||
],
|
],
|
||||||
logo,
|
logo: logo === 'default' ? 'nvs' : logo,
|
||||||
title: '',
|
title: '',
|
||||||
version: 1,
|
version: 1,
|
||||||
distance: calcPolyDistance(route),
|
distance: calcPolyDistance(route),
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Icon } from '$components/panels/Icon';
|
import { Icon } from '$components/panels/Icon';
|
||||||
import { MODES } from '$constants/modes';
|
import { MODES } from '$constants/modes';
|
||||||
|
import { STICKERS } from '$constants/stickers';
|
||||||
|
import { StickerIcon } from '$components/StickerIcon';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
mode: String,
|
mode: String,
|
||||||
|
sticker: String,
|
||||||
|
set: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Cursor extends React.PureComponent<Props, void> {
|
export class Cursor extends React.PureComponent<Props, void> {
|
||||||
|
@ -20,12 +24,14 @@ export class Cursor extends React.PureComponent<Props, void> {
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { mode } = this.props;
|
const { mode, set, sticker } = this.props;
|
||||||
|
const activeSticker = (sticker && set && STICKERS[set] && STICKERS[set].layers[sticker]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="cursor-tooltip" ref={el => { this.cursor = el; }}>
|
<div className="cursor-tooltip" ref={el => { this.cursor = el; }}>
|
||||||
{ mode === MODES.ROUTER && <Icon icon="icon-router" />}
|
{ mode === MODES.ROUTER && <Icon icon="icon-router" />}
|
||||||
{ mode === MODES.POLY && <Icon icon="icon-poly" />}
|
{ mode === MODES.POLY && <Icon icon="icon-poly" />}
|
||||||
|
{ mode === MODES.STICKERS && activeSticker && <StickerIcon sticker={sticker} set={set} /> }
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
19
src/components/StickerIcon.jsx
Normal file
19
src/components/StickerIcon.jsx
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { STICKERS } from '$constants/stickers';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
set: String,
|
||||||
|
sticker: String,
|
||||||
|
};
|
||||||
|
|
||||||
|
export const StickerIcon = ({ set, sticker }: Props) => (
|
||||||
|
<div
|
||||||
|
className="cursor-icon-sticker"
|
||||||
|
style={{
|
||||||
|
backgroundImage: `url(${STICKERS[set].url}`,
|
||||||
|
backgroundPosition: `-${STICKERS[set].layers[sticker].off * 100}% 50%`,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
//
|
|
@ -41,7 +41,7 @@ export const Component = (props: Props) => {
|
||||||
|
|
||||||
const showDialog = (
|
const showDialog = (
|
||||||
mode === MODES.ROUTER
|
mode === MODES.ROUTER
|
||||||
|| (mode === MODES.STICKERS && !activeSticker)
|
|| (mode === MODES.STICKERS && !activeSticker.set)
|
||||||
|| mode === MODES.TRASH
|
|| mode === MODES.TRASH
|
||||||
|| mode === MODES.LOGO
|
|| mode === MODES.LOGO
|
||||||
|| mode === MODES.SAVE
|
|| mode === MODES.SAVE
|
||||||
|
|
|
@ -19,6 +19,8 @@ type Props = {
|
||||||
mode: String,
|
mode: String,
|
||||||
dialog: String,
|
dialog: String,
|
||||||
dialog_active: Boolean,
|
dialog_active: Boolean,
|
||||||
|
sticker: String,
|
||||||
|
set: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
const Component = (props: Props) => (
|
const Component = (props: Props) => (
|
||||||
|
@ -26,7 +28,7 @@ const Component = (props: Props) => (
|
||||||
<Fills />
|
<Fills />
|
||||||
<UserPanel />
|
<UserPanel />
|
||||||
<EditorPanel />
|
<EditorPanel />
|
||||||
<Cursor mode={props.mode} />
|
<Cursor mode={props.mode} sticker={props.sticker} set={props.set} />
|
||||||
<LeftDialog dialog={props.dialog} dialog_active={props.dialog_active} />
|
<LeftDialog dialog={props.dialog} dialog_active={props.dialog_active} />
|
||||||
|
|
||||||
{ props.renderer_active &&
|
{ props.renderer_active &&
|
||||||
|
@ -35,11 +37,17 @@ const Component = (props: Props) => (
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
const mapStateToProps = ({ user: { mode, dialog, dialog_active, renderer } }) => ({
|
const mapStateToProps = ({
|
||||||
|
user: {
|
||||||
|
mode, dialog, dialog_active, renderer, activeSticker: { sticker = null, set = null },
|
||||||
|
}
|
||||||
|
}) => ({
|
||||||
renderer_active: renderer.renderer_active,
|
renderer_active: renderer.renderer_active,
|
||||||
mode,
|
mode,
|
||||||
dialog,
|
dialog,
|
||||||
dialog_active,
|
dialog_active,
|
||||||
|
sticker,
|
||||||
|
set,
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapDispatchToProps = dispatch => bindActionCreators({ hideRenderer }, dispatch);
|
const mapDispatchToProps = dispatch => bindActionCreators({ hideRenderer }, dispatch);
|
||||||
|
|
27
src/index.js
27
src/index.js
|
@ -1,14 +1,29 @@
|
||||||
/*
|
/*
|
||||||
todo shot mechanism (50%)
|
done shot mechanism (100%)
|
||||||
done client-side shot mechanism
|
done client-side shot mechanism
|
||||||
todo croppr.js
|
done croppr.js
|
||||||
todo shot stickers
|
done shot stickers
|
||||||
|
todo progress
|
||||||
|
|
||||||
todo hotkeys via sagas
|
todo hotkeys via sagas
|
||||||
todo map catalogue
|
todo map catalogue
|
||||||
|
todo public maps
|
||||||
|
todo map search
|
||||||
|
todo map lazy loading
|
||||||
|
|
||||||
todo map preview on save
|
todo map preview on save
|
||||||
todo tooltips
|
todo tooltips
|
||||||
|
|
||||||
|
todo better poly editor https://github.com/SupriyaSudhindra/leaflet-editable-polyline
|
||||||
|
todo network operations notify
|
||||||
|
todo delayed notify (delay(2000).then(showLoadingMsg))
|
||||||
|
todo network error notifications
|
||||||
|
todo check canvas support at startup
|
||||||
|
todo check osrm is up
|
||||||
|
|
||||||
|
todo better loader screen
|
||||||
|
todo network errors handling on startup
|
||||||
|
|
||||||
*/
|
*/
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
|
@ -16,11 +31,7 @@ import ReactDOM from 'react-dom';
|
||||||
import { App } from '$containers/App';
|
import { App } from '$containers/App';
|
||||||
import '$styles/main.less';
|
import '$styles/main.less';
|
||||||
|
|
||||||
// import 'raleway-cyrillic/raleway.css';
|
|
||||||
// import 'typeface-pt-sans';
|
|
||||||
|
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
// import { ConnectedRouter } from 'react-router-redux';
|
|
||||||
import { PersistGate } from 'redux-persist/integration/react';
|
import { PersistGate } from 'redux-persist/integration/react';
|
||||||
import { configureStore } from '$redux/store';
|
import { configureStore } from '$redux/store';
|
||||||
|
|
||||||
|
@ -35,5 +46,3 @@ export const Index = () => (
|
||||||
);
|
);
|
||||||
|
|
||||||
ReactDOM.render(<Index />, document.getElementById('index'));
|
ReactDOM.render(<Index />, document.getElementById('index'));
|
||||||
|
|
||||||
// <PersistGate loading={null} persistor={persistor}>
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { Poly } from '$modules/Poly';
|
||||||
import { MODES } from '$constants/modes';
|
import { MODES } from '$constants/modes';
|
||||||
import { Stickers } from '$modules/Stickers';
|
import { Stickers } from '$modules/Stickers';
|
||||||
import { Router } from '$modules/Router';
|
import { Router } from '$modules/Router';
|
||||||
import { DEFAULT_LOGO } from '$constants/logos';
|
import { DEFAULT_LOGO, LOGOS } from '$constants/logos';
|
||||||
|
|
||||||
import { parseStickerAngle, parseStickerStyle } from '$utils/import';
|
import { parseStickerAngle, parseStickerStyle } from '$utils/import';
|
||||||
import { getUrlData } from '$utils/history';
|
import { getUrlData } from '$utils/history';
|
||||||
|
@ -12,7 +12,7 @@ import {
|
||||||
resetSaveDialog,
|
resetSaveDialog,
|
||||||
setActiveSticker, setAddress,
|
setActiveSticker, setAddress,
|
||||||
setChanged,
|
setChanged,
|
||||||
setDistance,
|
setDistance, setLogo,
|
||||||
setMode,
|
setMode,
|
||||||
setRouterPoints,
|
setRouterPoints,
|
||||||
setTitle,
|
setTitle,
|
||||||
|
@ -83,7 +83,6 @@ export class Editor {
|
||||||
|
|
||||||
// this.clearChanged = clearChanged;
|
// this.clearChanged = clearChanged;
|
||||||
// this.setActiveSticker = setActiveSticker;
|
// this.setActiveSticker = setActiveSticker;
|
||||||
// this.setLogo = setLogo;
|
|
||||||
// this.setMode = setMode;
|
// this.setMode = setMode;
|
||||||
// this.setEditing = setEditing;
|
// this.setEditing = setEditing;
|
||||||
// this.setTitle = setTitle;
|
// this.setTitle = setTitle;
|
||||||
|
@ -103,6 +102,7 @@ export class Editor {
|
||||||
getRouterPoints = () => store.getState().user.routerPoints;
|
getRouterPoints = () => store.getState().user.routerPoints;
|
||||||
getDistance = () => store.getState().user.distance;
|
getDistance = () => store.getState().user.distance;
|
||||||
|
|
||||||
|
setLogo = logo => store.dispatch(setLogo(logo));
|
||||||
setMode = value => store.dispatch(setMode(value));
|
setMode = value => store.dispatch(setMode(value));
|
||||||
setRouterPoints = value => store.dispatch(setRouterPoints(value));
|
setRouterPoints = value => store.dispatch(setRouterPoints(value));
|
||||||
setActiveSticker = value => store.dispatch(setActiveSticker(value));
|
setActiveSticker = value => store.dispatch(setActiveSticker(value));
|
||||||
|
@ -221,7 +221,7 @@ export class Editor {
|
||||||
};
|
};
|
||||||
|
|
||||||
setData = ({
|
setData = ({
|
||||||
route, stickers, version = 1, owner, title, address
|
route = [], stickers = [], owner, title, address, provider = DEFAULT_PROVIDER, logo = DEFAULT_LOGO,
|
||||||
}) => {
|
}) => {
|
||||||
this.setTitle(title || '');
|
this.setTitle(title || '');
|
||||||
const { id } = this.getUser();
|
const { id } = this.getUser();
|
||||||
|
@ -248,6 +248,8 @@ export class Editor {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.setLogo((logo && LOGOS[DEFAULT_LOGO] && logo) || DEFAULT_LOGO);
|
||||||
|
this.setProvider((provider && PROVIDERS[provider] && provider) || DEFAULT_PROVIDER);
|
||||||
if (owner) this.owner = owner;
|
if (owner) this.owner = owner;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,10 @@ const setDistance = (state, { distance }) => ({
|
||||||
|
|
||||||
const setRouterPoints = (state, { routerPoints }) => ({ ...state, routerPoints });
|
const setRouterPoints = (state, { routerPoints }) => ({ ...state, routerPoints });
|
||||||
|
|
||||||
const setActiveSticker = (state, { activeSticker }) => ({ ...state, activeSticker });
|
const setActiveSticker = (state, { activeSticker }) => ({
|
||||||
|
...state,
|
||||||
|
activeSticker: activeSticker || { set: null, sticker: null }
|
||||||
|
});
|
||||||
const setLogo = (state, { logo }) => ({ ...state, logo });
|
const setLogo = (state, { logo }) => ({ ...state, logo });
|
||||||
const setTitle = (state, { title }) => ({ ...state, title });
|
const setTitle = (state, { title }) => ({ ...state, title });
|
||||||
const setAddress = (state, { address }) => ({ ...state, address });
|
const setAddress = (state, { address }) => ({ ...state, address });
|
||||||
|
@ -123,7 +126,7 @@ export const INITIAL_STATE = {
|
||||||
routerPoints: 0,
|
routerPoints: 0,
|
||||||
distance: 0,
|
distance: 0,
|
||||||
estimated: 0,
|
estimated: 0,
|
||||||
activeSticker: null,
|
activeSticker: { set: null, sticker: null },
|
||||||
title: '',
|
title: '',
|
||||||
address: '',
|
address: '',
|
||||||
changed: false,
|
changed: false,
|
||||||
|
|
|
@ -57,19 +57,28 @@ body {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 4px;
|
top: 4px;
|
||||||
left: 4px;
|
left: 4px;
|
||||||
width: 20px;
|
width: 10px;
|
||||||
height: 20px;
|
height: 10px;
|
||||||
z-index: 10;
|
z-index: 1;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
width: 20px;
|
width: 20px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
stroke-width: 4;
|
stroke-width: 4;
|
||||||
fill: @blue_secondary;
|
fill: black;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cursor-icon-sticker {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-size: cover;
|
||||||
|
background-position: 0 50%;
|
||||||
|
position: absolute;
|
||||||
|
top: -30px;
|
||||||
|
}
|
||||||
|
|
||||||
.track-vertical {
|
.track-vertical {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue