mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 10:53:59 +00:00
fix(ui): keep the scene select on the published scene after a local pick
Re-apply the published scene to the select after every option render, as the imperative renderer did. The scene and visual-input QA scripts click a held shot label after disposal and wait a frame for the bloom row.
This commit is contained in:
1 parent
b870df4199
commit
54b8060f71
5 files changed
+51
-6
No files matched your search
@@ -459,6 +459,26 @@ test('the scene select follows option renders, as before', async () => {
|
||||
}
|
||||
});
|
||||
|
||||
test('an option render restores the published scene after a local pick', async () => {
|
||||
const f = fixture();
|
||||
try {
|
||||
f.state.scenes.push({ id: 'scene-b', title: 'B', shots: [] });
|
||||
f.owner.renderSceneSelect();
|
||||
await nextTick();
|
||||
assert.equal(f.elements.select.value, 'scene-a');
|
||||
// The person picks B; the owner re-renders the shot list only.
|
||||
f.elements.select.value = 'scene-b';
|
||||
f.owner.renderShotList();
|
||||
await nextTick();
|
||||
// Something reloads A and renders the options with the same choice.
|
||||
f.owner.renderSceneSelect();
|
||||
await nextTick();
|
||||
assert.equal(f.elements.select.value, 'scene-a');
|
||||
} finally {
|
||||
f.restore();
|
||||
}
|
||||
});
|
||||
|
||||
test('Scene controls consume current state, preserve rows on progress, and unsubscribe on destruction', async () => {
|
||||
const f = fixture();
|
||||
try {
|
||||
|
||||
@@ -21,6 +21,9 @@ export const useSceneStore = defineStore('gev-scenes', () => {
|
||||
const selectedShotId = shallowRef(null);
|
||||
// The select's choice, updated only when its options are rendered.
|
||||
const listedSceneId = shallowRef(null);
|
||||
// Counts option renders: each one re-applies the select's choice, which
|
||||
// the person may have changed since.
|
||||
const listedRevision = shallowRef(0);
|
||||
/** Whether an owner presents the project; until then the list is empty. */
|
||||
const attached = shallowRef(false);
|
||||
/** @type {{handlers: SceneRowHandlers}|null} */
|
||||
@@ -48,6 +51,7 @@ export const useSceneStore = defineStore('gev-scenes', () => {
|
||||
function publishOptions(state) {
|
||||
publish(state);
|
||||
listedSceneId.value = state.selectedSceneId ?? null;
|
||||
listedRevision.value++;
|
||||
}
|
||||
|
||||
/** @param {string|null} id */
|
||||
@@ -79,6 +83,7 @@ export const useSceneStore = defineStore('gev-scenes', () => {
|
||||
selectedSceneId,
|
||||
selectedShotId,
|
||||
listedSceneId,
|
||||
listedRevision,
|
||||
attached,
|
||||
attach,
|
||||
publish,
|
||||
|
||||
@@ -1,9 +1,23 @@
|
||||
<script setup>
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { getCurrentInstance, watch } from 'vue';
|
||||
import { useSceneStore } from '../stores/scenes.js';
|
||||
|
||||
// The Scene select's options; selecting one stays with SceneControls.
|
||||
const { scenes, listedSceneId } = storeToRefs(useSceneStore());
|
||||
const { scenes, listedSceneId, listedRevision } = storeToRefs(useSceneStore());
|
||||
|
||||
// Every option render shows the published scene, as the select did before:
|
||||
// `selected` alone is written only when it changes, so it would leave a
|
||||
// person's later pick standing.
|
||||
const instance = getCurrentInstance();
|
||||
watch(
|
||||
listedRevision,
|
||||
() => {
|
||||
const select = instance.proxy.$el?.parentNode;
|
||||
if (select && listedSceneId.value) select.value = listedSceneId.value;
|
||||
},
|
||||
{ flush: 'post' },
|
||||
);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
Reference in new issue
Block a user