Fix spacebar causing stutter when editing cards (#3150)

* Fix spacebar causing stutter when editing cards

* Remove IO toolbar event handlers on unmount

* Remove nested keydown handlers
This commit is contained in:
Abdo 2024-04-19 12:13:56 +03:00 committed by GitHub
parent ebc6c0847a
commit c62e2d8df0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 106 additions and 100 deletions

View file

@ -5,8 +5,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<script lang="ts"> <script lang="ts">
import * as tr from "@generated/ftl"; import * as tr from "@generated/ftl";
import { directionKey } from "@tslib/context-keys"; import { directionKey } from "@tslib/context-keys";
import { on } from "@tslib/events";
import { getPlatformString } from "@tslib/shortcuts"; import { getPlatformString } from "@tslib/shortcuts";
import { getContext, onMount } from "svelte"; import type { Callback } from "@tslib/typing";
import { singleCallback } from "@tslib/typing";
import { getContext, onDestroy, onMount } from "svelte";
import type { Readable } from "svelte/store"; import type { Readable } from "svelte/store";
import DropdownItem from "$lib/components/DropdownItem.svelte"; import DropdownItem from "$lib/components/DropdownItem.svelte";
@ -49,14 +52,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
let maksOpacity = false; let maksOpacity = false;
let showFloating = false; let showFloating = false;
const direction = getContext<Readable<"ltr" | "rtl">>(directionKey); const direction = getContext<Readable<"ltr" | "rtl">>(directionKey);
document.addEventListener("click", (event) => {
const upperCanvas = document.querySelector(".upper-canvas");
if (event.target == upperCanvas) {
showAlignTools = false;
}
});
// handle zoom event when mouse scroll and ctrl key are hold for panzoom // handle zoom event when mouse scroll and ctrl key are hold for panzoom
let spaceClicked = false; let spaceClicked = false;
let controlClicked = false; let controlClicked = false;
@ -65,22 +60,23 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const spaceKey = " "; const spaceKey = " ";
const controlKey = "Control"; const controlKey = "Control";
const shiftKey = "Shift"; const shiftKey = "Shift";
let removeHandlers: Callback;
onMount(() => { function onClick(event: MouseEvent) {
window.addEventListener("mousedown", () => { const upperCanvas = document.querySelector(".upper-canvas");
window.addEventListener("keydown", (ev) => { if (event.target == upperCanvas) {
if (ev.key === spaceKey) { showAlignTools = false;
spaceClicked = true;
} }
}); }
});
window.addEventListener("mousemove", () => { function onMousemove() {
if (spaceClicked || move) { if (spaceClicked || move) {
disableFunctions(); disableFunctions();
enablePan(canvas); enablePan(canvas);
} }
}); }
window.addEventListener("mouseup", () => {
function onMouseup() {
if (spaceClicked) { if (spaceClicked) {
spaceClicked = false; spaceClicked = false;
} }
@ -89,8 +85,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
disableFunctions(); disableFunctions();
handleToolChanges(activeTool); handleToolChanges(activeTool);
}); }
window.addEventListener("keyup", (event) => {
function onKeyup(event: KeyboardEvent) {
if ( if (
event.key === spaceKey || event.key === spaceKey ||
event.key === controlKey || event.key === controlKey ||
@ -104,8 +101,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
disableFunctions(); disableFunctions();
handleToolChanges(activeTool); handleToolChanges(activeTool);
} }
}); }
window.addEventListener("keydown", (event) => {
function onKeydown(event: KeyboardEvent) {
if (event.key === spaceKey) { if (event.key === spaceKey) {
spaceClicked = true; spaceClicked = true;
} }
@ -115,18 +113,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
if (event.key === shiftKey) { if (event.key === shiftKey) {
shiftClicked = true; shiftClicked = true;
} }
}); }
window.addEventListener("wheel", (event) => {
function onWheel(event: WheelEvent) {
if (event.ctrlKey) { if (event.ctrlKey) {
controlClicked = true; controlClicked = true;
} }
if (event.shiftKey) { if (event.shiftKey) {
shiftClicked = true; shiftClicked = true;
} }
});
window.addEventListener(
"wheel",
(event) => {
event.preventDefault(); event.preventDefault();
if (controlClicked) { if (controlClicked) {
@ -141,10 +137,21 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
onWheelDrag(canvas, event); onWheelDrag(canvas, event);
}, }
{ passive: false },
); // initializes lastPosX and lastPosY because it is undefined in touchmove event
}); function onTouchstart(event: TouchEvent) {
canvas.lastPosX = event.touches[0].clientX;
canvas.lastPosY = event.touches[0].clientY;
}
// initializes lastPosX and lastPosY because it is undefined before mousemove event
function onMousemoveDocument(event: MouseEvent) {
if (spaceClicked) {
canvas.lastPosX = event.clientX;
canvas.lastPosY = event.clientY;
}
}
const handleToolChanges = (activeTool: string) => { const handleToolChanges = (activeTool: string) => {
disableFunctions(); disableFunctions();
@ -188,6 +195,23 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
$hideAllGuessOne = occlusionType === "all"; $hideAllGuessOne = occlusionType === "all";
emitChangeSignal(); emitChangeSignal();
} }
onMount(() => {
removeHandlers = singleCallback(
on(document, "click", onClick),
on(window, "mousemove", onMousemove),
on(window, "mouseup", onMouseup),
on(window, "keyup", onKeyup),
on(window, "keydown", onKeydown),
on(window, "wheel", onWheel, { passive: false }),
on(document, "touchstart", onTouchstart),
on(document, "mousemove", onMousemoveDocument),
);
});
onDestroy(() => {
removeHandlers();
});
</script> </script>
<div class="tool-bar-container"> <div class="tool-bar-container">

View file

@ -132,24 +132,6 @@ export const onMouseMove = (opt) => {
onDrag(canvas, opt); onDrag(canvas, opt);
}; };
// initializes lastPosX and lastPosY because it is undefined in touchmove event
document.addEventListener("touchstart", (e) => {
const canvas = globalThis.canvas;
canvas.lastPosX = e.touches[0].clientX;
canvas.lastPosY = e.touches[0].clientY;
});
// initializes lastPosX and lastPosY because it is undefined before mousemove event
document.addEventListener("mousemove", (event) => {
document.addEventListener("keydown", (e) => {
if (e.key === " ") {
const canvas = globalThis.canvas;
canvas.lastPosX = event.clientX;
canvas.lastPosY = event.clientY;
}
});
});
export const onPinchZoom = (opt): boolean => { export const onPinchZoom = (opt): boolean => {
const { e } = opt; const { e } = opt;
const canvas = globalThis.canvas; const canvas = globalThis.canvas;