Make HandleSelection perfectly size when first activating

This commit is contained in:
Henrik Giesel 2021-09-17 21:23:04 +02:00
parent 06d1ec6af4
commit 51c0cedaf5
2 changed files with 26 additions and 23 deletions

View file

@ -3,7 +3,7 @@ Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts">
import { onMount, onDestroy, getContext } from "svelte"; import { onMount, onDestroy, getContext, tick } from "svelte";
import { nightModeKey } from "components/context-keys"; import { nightModeKey } from "components/context-keys";
import { convertMathjax } from "./mathjax"; import { convertMathjax } from "./mathjax";
@ -26,8 +26,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
let image: HTMLImageElement; let image: HTMLImageElement;
const observer = new ResizeObserver(() => { const observer = new ResizeObserver(async () => {
imageHeight = image.getBoundingClientRect().height; imageHeight = image.getBoundingClientRect().height;
await tick();
setTimeout(() => image.dispatchEvent(new Event("resize"))); setTimeout(() => image.dispatchEvent(new Event("resize")));
}); });

View file

@ -20,6 +20,27 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
let dropdownApi: any; let dropdownApi: any;
let removeEventListener: () => void = () => {
/* noop */
};
function onImageResize(): void {
if (activeImage) {
errorMessage = activeImage.title;
updateSelection().then(() => dropdownApi.update());
}
}
$: if (activeImage) {
activeImage.addEventListener("resize", onImageResize);
const lastImage = activeImage;
removeEventListener = () =>
lastImage.removeEventListener("resize", onImageResize);
} else {
removeEventListener();
}
const resizeObserver = new ResizeObserver(async () => { const resizeObserver = new ResizeObserver(async () => {
if (activeImage) { if (activeImage) {
await updateSelection(); await updateSelection();
@ -36,24 +57,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
return image.closest("anki-mathjax")! as HTMLElement; return image.closest("anki-mathjax")! as HTMLElement;
} }
const onImageResize = (resolve: () => void) => (): void => { function onEditorUpdate(event: CustomEvent): void {
errorMessage = activeImage!.title;
updateSelection().then(resolve);
};
function onEditorUpdate(event: CustomEvent): Promise<void> {
let selectionResolve: (value: void) => void;
const afterSelectionUpdate = new Promise((resolve: (value: void) => void) => {
selectionResolve = resolve;
});
const imageResize = onImageResize(selectionResolve!);
activeImage!.addEventListener("resize", imageResize, { once: true });
/* this updates the image in Mathjax.svelte */ /* this updates the image in Mathjax.svelte */
getComponent(activeImage!).dataset.mathjax = event.detail.mathjax; getComponent(activeImage!).dataset.mathjax = event.detail.mathjax;
return afterSelectionUpdate;
} }
</script> </script>
@ -63,7 +69,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
autoClose={false} autoClose={false}
distance={4} distance={4}
let:createDropdown let:createDropdown
let:dropdownObject
> >
{#if activeImage} {#if activeImage}
<HandleSelection <HandleSelection
@ -80,10 +85,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<DropdownMenu> <DropdownMenu>
<MathjaxHandleEditor <MathjaxHandleEditor
initialValue={getComponent(activeImage).dataset.mathjax ?? ""} initialValue={getComponent(activeImage).dataset.mathjax ?? ""}
on:update={async (event) => { on:update={onEditorUpdate}
await onEditorUpdate(event);
dropdownObject.update();
}}
/> />
<div class="margin-x"> <div class="margin-x">
<ButtonToolbar> <ButtonToolbar>