Basic info dialog
This commit is contained in:
parent
35937a933c
commit
ca37281a0b
|
@ -0,0 +1,26 @@
|
||||||
|
.control {
|
||||||
|
opacity: 1;
|
||||||
|
position: fixed !important;
|
||||||
|
top: 0px;
|
||||||
|
margin-left: calc(100% - 70px) !important;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
background-color: rgba(14, 116, 144, 0.7);
|
||||||
|
color: white;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title-text {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
padding: 20px;
|
||||||
|
background-color: rgba(255, 255, 255, 0.7);
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
import { Dialog, DialogTitle, IconButton } from '@suid/material';
|
||||||
|
import { Feature } from 'ol';
|
||||||
|
import { Geometry } from 'ol/geom';
|
||||||
|
import { Component, createSignal, For } from 'solid-js';
|
||||||
|
import { unwrap } from 'solid-js/store';
|
||||||
|
import CloseIcon from '@suid/icons-material/Close';
|
||||||
|
import { tree } from '../map';
|
||||||
|
import style from './Infos.module.css';
|
||||||
|
import { Paper, Stack } from '@suid/material';
|
||||||
|
import styled from '@suid/material/styles/styled';
|
||||||
|
|
||||||
|
const Item = styled(Paper)(({ theme }) => ({
|
||||||
|
...theme.typography.body2,
|
||||||
|
padding: theme.spacing(1),
|
||||||
|
textAlign: 'center',
|
||||||
|
color: theme.palette.text.secondary,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const [open, setOpen] = createSignal(false);
|
||||||
|
|
||||||
|
let selectedFeatures: Feature[] = [];
|
||||||
|
|
||||||
|
export const clickHandler = (event: any) => {
|
||||||
|
const pixel = [event.originalEvent.x, event.originalEvent.y];
|
||||||
|
const features = event.map.getFeaturesAtPixel(pixel, { hitTolerance: 30 });
|
||||||
|
console.log({
|
||||||
|
caller: '<Infos/> / clickHandler',
|
||||||
|
event,
|
||||||
|
features,
|
||||||
|
tree: unwrap(tree),
|
||||||
|
});
|
||||||
|
selectedFeatures.map((feature) => feature.set('isSelected', false));
|
||||||
|
selectedFeatures = features;
|
||||||
|
features.map((feature: Feature<Geometry>) => {
|
||||||
|
const id = feature.get('id');
|
||||||
|
feature.set('isSelected', true);
|
||||||
|
console.log({
|
||||||
|
caller: '<Infos/> / clickHandler / feature',
|
||||||
|
event,
|
||||||
|
feature,
|
||||||
|
id,
|
||||||
|
});
|
||||||
|
const branch = tree[id];
|
||||||
|
if (branch?.updateHandler) branch.updateHandler(feature);
|
||||||
|
});
|
||||||
|
if (features.length > 0) {
|
||||||
|
setOpen(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const Infos: Component<{}> = (props) => {
|
||||||
|
const handleClickOpen = () => {
|
||||||
|
setOpen(true);
|
||||||
|
};
|
||||||
|
const handleClose = () => {
|
||||||
|
setOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dialog onClose={handleClose} open={open()} class={style.dialog}>
|
||||||
|
<DialogTitle class={style.title}>
|
||||||
|
<div class={style['title-text']}>Nearby</div>
|
||||||
|
<IconButton onClick={handleClose} class={style.close}>
|
||||||
|
<CloseIcon />
|
||||||
|
</IconButton>
|
||||||
|
</DialogTitle>
|
||||||
|
<Stack spacing={1}>
|
||||||
|
<For each={selectedFeatures}>
|
||||||
|
{(feature) => <Item>{feature.get('type')}</Item>}
|
||||||
|
</For>
|
||||||
|
</Stack>
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Infos;
|
|
@ -0,0 +1 @@
|
||||||
|
export { default, clickHandler } from './Infos';
|
|
@ -1,5 +1,5 @@
|
||||||
import { Component, createEffect, createSignal, onMount } from 'solid-js';
|
import { Component, createEffect, createSignal, onMount } from 'solid-js';
|
||||||
import { createStore, produce, unwrap } from 'solid-js/store';
|
import { createStore } from 'solid-js/store';
|
||||||
import { useParams, useNavigate } from '@solidjs/router';
|
import { useParams, useNavigate } from '@solidjs/router';
|
||||||
import OlMap from 'ol/Map';
|
import OlMap from 'ol/Map';
|
||||||
import View from 'ol/View';
|
import View from 'ol/View';
|
||||||
|
@ -11,7 +11,6 @@ import Attribution from 'ol/control/Attribution';
|
||||||
import Rotate from 'ol/control/Rotate';
|
import Rotate from 'ol/control/Rotate';
|
||||||
import ScaleLine from 'ol/control/ScaleLine';
|
import ScaleLine from 'ol/control/ScaleLine';
|
||||||
import Control from 'ol/control/Control';
|
import Control from 'ol/control/Control';
|
||||||
import OSM from 'ol/source/OSM';
|
|
||||||
import { useGeographic as olUseGeographic } from 'ol/proj';
|
import { useGeographic as olUseGeographic } from 'ol/proj';
|
||||||
import DragRotate from 'ol/interaction/DragRotate';
|
import DragRotate from 'ol/interaction/DragRotate';
|
||||||
|
|
||||||
|
@ -35,9 +34,7 @@ import KeyboardPan from 'ol/interaction/KeyboardPan';
|
||||||
import KeyboardZoom from 'ol/interaction/KeyboardZoom';
|
import KeyboardZoom from 'ol/interaction/KeyboardZoom';
|
||||||
import MouseWheelZoom from 'ol/interaction/MouseWheelZoom';
|
import MouseWheelZoom from 'ol/interaction/MouseWheelZoom';
|
||||||
import DragZoom from 'ol/interaction/DragZoom';
|
import DragZoom from 'ol/interaction/DragZoom';
|
||||||
import Select from 'ol/interaction/Select';
|
import Infos, { clickHandler } from '../infos';
|
||||||
import Layer from 'ol/layer/Layer';
|
|
||||||
import { selectedStyle } from './selectedStyle';
|
|
||||||
|
|
||||||
const [getState, setState] = createSignal({
|
const [getState, setState] = createSignal({
|
||||||
lon: 0,
|
lon: 0,
|
||||||
|
@ -133,6 +130,7 @@ const Map: Component = () => {
|
||||||
// name: 'current location',
|
// name: 'current location',
|
||||||
style: style,
|
style: style,
|
||||||
});
|
});
|
||||||
|
feature.set('type', 'current-location');
|
||||||
feature.setStyle(style);
|
feature.setStyle(style);
|
||||||
source.addFeature(feature);
|
source.addFeature(feature);
|
||||||
// source.changed();
|
// source.changed();
|
||||||
|
@ -146,28 +144,6 @@ const Map: Component = () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let selectedFeatures: Feature[] = [];
|
|
||||||
|
|
||||||
const clickHandler = (event: any) => {
|
|
||||||
const pixel = [event.originalEvent.x, event.originalEvent.y];
|
|
||||||
const features = event.map.getFeaturesAtPixel(pixel, { hitTolerance: 30 });
|
|
||||||
console.log({
|
|
||||||
caller: 'clickHandler',
|
|
||||||
event,
|
|
||||||
features,
|
|
||||||
tree: unwrap(tree),
|
|
||||||
});
|
|
||||||
selectedFeatures.map((feature) => feature.set('isSelected', false));
|
|
||||||
selectedFeatures = features;
|
|
||||||
features.map((feature) => {
|
|
||||||
const id = feature.get('id');
|
|
||||||
feature.set('isSelected', true);
|
|
||||||
console.log({ caller: 'clickHandler / feature', event, feature, id });
|
|
||||||
const branch = tree[id];
|
|
||||||
if (branch?.updateHandler) branch.updateHandler(feature);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
olUseGeographic();
|
olUseGeographic();
|
||||||
|
|
||||||
|
@ -243,6 +219,7 @@ const Map: Component = () => {
|
||||||
<GpxImport />
|
<GpxImport />
|
||||||
<MapTileProvider />
|
<MapTileProvider />
|
||||||
<AllGpxes map={getMap} />
|
<AllGpxes map={getMap} />
|
||||||
|
<Infos />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue