From 3ea73b7d39acd692c7c1b393b1a2a7fd84d719ff Mon Sep 17 00:00:00 2001 From: ComfyFluffy <24245520+ComfyFluffy@users.noreply.github.com> Date: Thu, 9 May 2024 10:51:54 +0800 Subject: [PATCH] loading state resist to sprite add/remove/rename --- .../preview/stage-viewer/SpriteItem.vue | 10 ++++----- .../stage-viewer/SpriteTransformer.vue | 5 +++-- .../preview/stage-viewer/StageViewer.vue | 22 ++++++++++++++++--- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/spx-gui/src/components/editor/preview/stage-viewer/SpriteItem.vue b/spx-gui/src/components/editor/preview/stage-viewer/SpriteItem.vue index dc79f0e84..759952353 100644 --- a/spx-gui/src/components/editor/preview/stage-viewer/SpriteItem.vue +++ b/spx-gui/src/components/editor/preview/stage-viewer/SpriteItem.vue @@ -27,7 +27,7 @@ import { round } from '@/utils/utils' const props = defineProps<{ sprite: Sprite mapSize: Size - spritesReadyMap: Map + spritesReadyMap: Map }>() const nodeRef = ref() @@ -37,16 +37,14 @@ const bitmapResolution = computed(() => costume.value?.bitmapResolution ?? 1) const image = useImgFile(() => costume.value?.img) watchEffect((onCleanup) => { - // We need to notify event ready for SpriteTransformer (to get correct node size) - const name = props.sprite.name const img = image.value - onCleanup(() => props.spritesReadyMap.delete(props.sprite.name)) if (img == null) { - props.spritesReadyMap.set(props.sprite.name, false) + props.spritesReadyMap.set(props.sprite, false) return } function handleImageLoad() { - props.spritesReadyMap.set(name, true) + // We need to notify event ready for SpriteTransformer (to get correct node size) + props.spritesReadyMap.set(props.sprite, true) } img.addEventListener('load', handleImageLoad) onCleanup(() => img.removeEventListener('load', handleImageLoad)) diff --git a/spx-gui/src/components/editor/preview/stage-viewer/SpriteTransformer.vue b/spx-gui/src/components/editor/preview/stage-viewer/SpriteTransformer.vue index dbdece1a0..d49d92542 100644 --- a/spx-gui/src/components/editor/preview/stage-viewer/SpriteTransformer.vue +++ b/spx-gui/src/components/editor/preview/stage-viewer/SpriteTransformer.vue @@ -7,9 +7,10 @@ import { effect, ref } from 'vue' import type { Transformer } from 'konva/lib/shapes/Transformer' import type { Node } from 'konva/lib/Node' import { useEditorCtx } from '../../EditorContextProvider.vue' +import type { Sprite } from '@/models/sprite' const props = defineProps<{ - spritesReadyMap: Map + spritesReady: (sprite: Sprite) => boolean }>() const transformer = ref() @@ -24,7 +25,7 @@ effect(async () => { return } // Wait for sprite ready, so that Konva can get correct node size - if (!props.spritesReadyMap.get(sprite.name)) return + if (!props.spritesReady(sprite)) return const stage = transformerNode.getStage() if (stage == null) throw new Error('no stage') const selectedNode = stage.findOne((node: Node) => node.getAttr('spriteName') === sprite.name) diff --git a/spx-gui/src/components/editor/preview/stage-viewer/StageViewer.vue b/spx-gui/src/components/editor/preview/stage-viewer/StageViewer.vue index 2be43ea65..58de5d195 100644 --- a/spx-gui/src/components/editor/preview/stage-viewer/StageViewer.vue +++ b/spx-gui/src/components/editor/preview/stage-viewer/StageViewer.vue @@ -20,7 +20,7 @@ /> - + @@ -44,7 +44,7 @@