Hold back an inspector rebuild while a field in it has focus
A rebuild destroys the widget being typed in, and a typed value can change the very structure that decides whether a rebuild is needed -- a field that says how many ports a node has. That made such a field unusable: every keystroke previewed, the preview emitted 'project', refreshValues() saw the signature change and threw the row away. Dragging the value worked only because a drag keeps receiving globalpointermove on the destroyed widget. So refreshValues() now postpones a due rebuild while the focus sits inside the inspector, and runs it as soon as the field is left. Values are safe in the meantime: TextField.setValue ignores an edit in progress. Two handles for that in the toolkit. FocusManager.isWithin(node) also replaces the parent chain refreshLive() walked by hand, and changeHandlers lets a panel notice that the focus has gone -- there was no signal for that before. Nothing in the editor can trigger this today, since the Sequence setting that did is gone. It is the ground for the List tab, where a row that adds or deletes an item changes the structure while you type. The e2e check therefore builds the case out of real parts: type into a field, set the object's parent from outside -- the parent is part of the structure signature -- and confirm the input survives and the rebuild follows on Escape. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3c76106fd2
commit
5a440ba433
6 files changed
+73
-5
No files matched your search
@@ -12,7 +12,8 @@ import type { EditorState } from './state';
|
||||
* visible text and to read editor state.
|
||||
*/
|
||||
export function installDebugHook(app: Application, state: EditorState, editor: Editor): void {
|
||||
const { viewport, gameView, graphEditor, textureEditor, containerEditor, hierarchy, assets } = editor;
|
||||
const { viewport, gameView, graphEditor, textureEditor, containerEditor, hierarchy, assets, inspector } =
|
||||
editor;
|
||||
const centreOf = (widget: { getGlobalPosition(): { x: number; y: number }; w: number; h: number }) => {
|
||||
const p = widget.getGlobalPosition();
|
||||
return { x: p.x + widget.w / 2, y: p.y + widget.h / 2 };
|
||||
@@ -159,6 +160,7 @@ export function installDebugHook(app: Application, state: EditorState, editor: E
|
||||
sceneObjects: () => (state.activeScene ? objectsOf(state.activeScene.id) : []),
|
||||
locate,
|
||||
inspectorField: fieldOf,
|
||||
inspectorInfo: () => inspector.debugInfo(),
|
||||
textColor,
|
||||
overlayTexts,
|
||||
overlayRect,
|
||||
|
||||
Reference in new issue
Block a user