Zoom to current location if it is in view

This commit is contained in:
Pieter Vander Vennet 2022-12-24 02:12:22 +01:00
parent 92b311bffa
commit e2419c19cd
2 changed files with 23 additions and 3 deletions

View file

@ -2,13 +2,21 @@ import { VariableUiElement } from "../Base/VariableUIElement"
import Svg from "../../Svg" import Svg from "../../Svg"
import { UIEventSource } from "../../Logic/UIEventSource" import { UIEventSource } from "../../Logic/UIEventSource"
import GeoLocationHandler from "../../Logic/Actors/GeoLocationHandler" import GeoLocationHandler from "../../Logic/Actors/GeoLocationHandler"
import { BBox } from "../../Logic/BBox"
import Loc from "../../Models/Loc"
/** /**
* Displays an icon depending on the state of the geolocation. * Displays an icon depending on the state of the geolocation.
* Will set the 'lock' if clicked twice * Will set the 'lock' if clicked twice
*/ */
export class GeolocationControl extends VariableUiElement { export class GeolocationControl extends VariableUiElement {
constructor(geolocationHandler: GeoLocationHandler) { constructor(
geolocationHandler: GeoLocationHandler,
state: {
locationControl: UIEventSource<Loc>
currentBounds: UIEventSource<BBox>
}
) {
const lastClick = new UIEventSource<Date>(undefined) const lastClick = new UIEventSource<Date>(undefined)
const lastClickWithinThreeSecs = lastClick.map((lastClick) => { const lastClickWithinThreeSecs = lastClick.map((lastClick) => {
if (lastClick === undefined) { if (lastClick === undefined) {
@ -78,8 +86,20 @@ export class GeolocationControl extends VariableUiElement {
return return
} }
// A location _is_ known! Let's zoom to this location // A location _is_ known! Let's move to this location
const currentLocation = geolocationState.currentGPSLocation.data
const inBounds = state.currentBounds.data.contains([
currentLocation.longitude,
currentLocation.latitude,
])
geolocationHandler.MoveMapToCurrentLocation() geolocationHandler.MoveMapToCurrentLocation()
if (inBounds) {
const lc = state.locationControl.data
state.locationControl.setData({
...lc,
zoom: lc.zoom + 3,
})
}
if (lastClickWithinThreeSecs.data && geolocationState.permission.data === "granted") { if (lastClickWithinThreeSecs.data && geolocationState.permission.data === "granted") {
geolocationState.isLocked.setData(true) geolocationState.isLocked.setData(true)

View file

@ -14,7 +14,7 @@ export default class RightControls extends Combine {
geolocationHandler: GeoLocationHandler geolocationHandler: GeoLocationHandler
) { ) {
const geolocationButton = new Toggle( const geolocationButton = new Toggle(
new MapControlButton(new GeolocationControl(geolocationHandler), { new MapControlButton(new GeolocationControl(geolocationHandler, state), {
dontStyle: true, dontStyle: true,
}).SetClass("p-1"), }).SetClass("p-1"),
undefined, undefined,