From e22929bb35ef55a05d78cd4b2f5aa3a00ffe13d5 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 13 Mar 2025 16:53:12 +0100 Subject: [PATCH] UI: fix behaviour of hotkey "escape" when closing previews and nearby images popups --- src/Models/MenuState.ts | 65 ++++++++++++++++------- src/UI/Base/Hotkeys.ts | 5 ++ src/UI/Base/Popup.svelte | 1 + src/UI/Image/AttributedImage.svelte | 10 ++-- src/UI/Image/LinkableImage.svelte | 11 ---- src/UI/Image/NearbyImagesCollapsed.svelte | 30 ++++++----- 6 files changed, 73 insertions(+), 49 deletions(-) diff --git a/src/Models/MenuState.ts b/src/Models/MenuState.ts index 322fd01214..f2ff936f86 100644 --- a/src/Models/MenuState.ts +++ b/src/Models/MenuState.ts @@ -4,6 +4,7 @@ import UserRelatedState from "../Logic/State/UserRelatedState" import { Utils } from "../Utils" import Zoomcontrol from "../UI/Zoomcontrol" import { LocalStorageSource } from "../Logic/Web/LocalStorageSource" +import { ProvidedImage } from "../Logic/ImageProviders/ImageProvider" export type PageType = (typeof MenuState.pageNames)[number] @@ -27,7 +28,7 @@ export class MenuState { "favourites", "usersettings", "share", - "menu", + "menu" ] as const /** @@ -38,6 +39,9 @@ export class MenuState { undefined ) + public static readonly nearbyImagesFeature: UIEventSource = new UIEventSource( + undefined + ) public readonly pageStates: Record> public readonly highlightedLayerInFilters: UIEventSource = new UIEventSource( @@ -45,6 +49,7 @@ export class MenuState { ) public highlightedUserSetting: UIEventSource = new UIEventSource(undefined) private readonly _selectedElement: UIEventSource | undefined + private isClosingAll = false constructor(selectedElement: UIEventSource | undefined) { this._selectedElement = selectedElement @@ -129,29 +134,49 @@ export class MenuState { * Returns 'true' if at least one menu was opened */ public closeAll(): boolean { - console.log("Closing all") + if (this.isClosingAll) { + return true + } + this.isClosingAll = true const ps = this.pageStates - if (ps.menu.data) { - ps.menu.set(false) - return true - } + try { - if (MenuState.previewedImage.data !== undefined) { - MenuState.previewedImage.setData(undefined) - return true - } - - for (const key in ps) { - const toggle = ps[key] - const wasOpen = toggle.data - toggle.setData(false) - if (wasOpen) { + if (ps.menu.data) { + ps.menu.set(false) return true } - } - if (this._selectedElement.data) { - this._selectedElement.setData(undefined) - return true + + if (MenuState.previewedImage.data !== undefined) { + MenuState.previewedImage.setData(undefined) + return true + } + + if (MenuState.nearbyImagesFeature.data !== undefined) { + MenuState.nearbyImagesFeature.setData(undefined) + return true + } + for (const key in ps) { + const toggle = ps[key] + const wasOpen = toggle.data + toggle.setData(false) + if (wasOpen) { + return true + } + } + if (this._selectedElement.data) { + this._selectedElement.setData(undefined) + return true + } + } finally { + this.isClosingAll = false } } + + public setPreviewedImage(img?: Partial) { + if (img === undefined && !this.isClosingAll) { + return + } + MenuState.previewedImage.setData(img) + + } } diff --git a/src/UI/Base/Hotkeys.ts b/src/UI/Base/Hotkeys.ts index a7fe3bf822..fb714230f9 100644 --- a/src/UI/Base/Hotkeys.ts +++ b/src/UI/Base/Hotkeys.ts @@ -14,6 +14,8 @@ export default class Hotkeys { }[] > = new UIEventSource([]) + private static readonly seenKeys: Set = new Set() + /** * Register a hotkey * @param key @@ -51,6 +53,9 @@ export default class Hotkeys { } } + const keyString = JSON.stringify(key) + this.seenKeys.add(keyString) + this._docs.data.push({ key, documentation, alsoTriggeredBy }) this._docs.ping() if (Utils.runningFromConsole) { diff --git a/src/UI/Base/Popup.svelte b/src/UI/Base/Popup.svelte index 49160d631b..0596746071 100644 --- a/src/UI/Base/Popup.svelte +++ b/src/UI/Base/Popup.svelte @@ -56,6 +56,7 @@ {/if} + {#if $$slots.footer} diff --git a/src/UI/Image/AttributedImage.svelte b/src/UI/Image/AttributedImage.svelte index a4b4d2d8c5..a60d9d64f0 100644 --- a/src/UI/Image/AttributedImage.svelte +++ b/src/UI/Image/AttributedImage.svelte @@ -11,7 +11,6 @@ import ImageOperations from "./ImageOperations.svelte" import Popup from "../Base/Popup.svelte" import { onDestroy } from "svelte" - import type { SpecialVisualizationState } from "../SpecialVisualization" import type { Feature, Point } from "geojson" import Loading from "../Base/Loading.svelte" import Translations from "../i18n/Translations" @@ -19,8 +18,9 @@ import DotMenu from "../Base/DotMenu.svelte" import LoadingPlaceholder from "../Base/LoadingPlaceholder.svelte" import { MenuState } from "../../Models/MenuState" + import ThemeViewState from "../../Models/ThemeViewState" - export let image: Partial + export let image: Partial & { id: string; url: string } let fallbackImage: string = undefined if (image.provider === Mapillary.singleton) { fallbackImage = "./assets/svg/blocked.svg" @@ -28,7 +28,7 @@ let imgEl: HTMLImageElement export let imgClass: string = undefined - export let state: SpecialVisualizationState = undefined + export let state: ThemeViewState = undefined export let attributionFormat: "minimal" | "medium" | "large" = "medium" let previewedImage: UIEventSource> = MenuState.previewedImage export let canZoom = previewedImage !== undefined @@ -36,9 +36,7 @@ let showBigPreview = new UIEventSource(false) onDestroy( showBigPreview.addCallbackAndRun((shown) => { - if (!shown) { - previewedImage?.set(undefined) - } + state.guistate.setPreviewedImage(shown ? image : undefined) }) ) if (previewedImage) { diff --git a/src/UI/Image/LinkableImage.svelte b/src/UI/Image/LinkableImage.svelte index e3a74ac3cf..c1527215f7 100644 --- a/src/UI/Image/LinkableImage.svelte +++ b/src/UI/Image/LinkableImage.svelte @@ -89,17 +89,6 @@ imgClass="max-h-64 w-auto sm:h-32 md:h-64" attributionFormat="minimal" > - {#if linkable} diff --git a/src/UI/Image/NearbyImagesCollapsed.svelte b/src/UI/Image/NearbyImagesCollapsed.svelte index a8e95b0bbc..0d5d1a6683 100644 --- a/src/UI/Image/NearbyImagesCollapsed.svelte +++ b/src/UI/Image/NearbyImagesCollapsed.svelte @@ -1,22 +1,19 @@ {#if enableLogin.data} @@ -37,10 +44,9 @@ > - - - - + + + shown?.set(false)} /> {/if}