Skip to content

Interface editor: typed edits, tree, multiselect, versioning - #36

Merged
EthanRStokes merged 26 commits into
masterfrom
claude/project-thread-m9yspp
Oct 11, 2026
Merged

EthanRStokes merged 26 commits into
masterfrom
claude/project-thread-m9yspp

Conversation

@EthanRStokes

@EthanRStokes EthanRStokes commented Oct 8, 2026 •

Copy link
Copy Markdown
Member

Requested by Treetrain1 · project thread

Before: The Interface workspace still rewrote the whole document with set_interface for adding, deleting, duplicating and most inspector fields. It had a flat hierarchy list, single selection, no schema version, and every commit reloaded the world.

After: Those actions are typed, undoable edits in the begin/update/commit transaction used by move and resize, also available from shell and MCP. The hierarchy is a searchable tree with editor-only Lock and Hide. Widgets can be multiselected (Shift-click, marquee), moved as a group, aligned and distributed. The interface document is versioned, and committing with a design preview open no longer reloads the world.

What changed:

  • New UiEdits: Create, Delete, Duplicate (remaps parents and scroll targets inside the copy), Batch (all or nothing), SetDocument, SetClass; SetProperty now covers range, style, class, bindings, items, tooltip, scroll target, tab page and transition.
  • interface-properties lists every property path with label, group, type and applicable kinds; a test keeps it in step with the edit enum.
  • UiDocument.version (1); old documents migrate on load, newer ones are refused rather than rewritten.
  • InterfaceDesign.hidden (protocol 36) hides widgets in the preview only.
  • docs/interface-editor-plan.md is updated against recent master changes and lists what remains; AGENTS.md has an Interface editor section.

How: core in blockloom-core/src/ui_framework.rs, backend in commands.rs/dispatch.rs/shell.rs, runtime hide in ui_design.rs, UI in UiDesigner.qml.

Tested locally: core and runtime design-session tests, protocol tests, the backend interface transaction tests, clippy -D warnings and fmt. QML lints clean. just qml-test has now run: 169 pass; PhysicsInspector::test_aConflictNeedsTheConversionBeforeApplying fails independently of this PR.

Follow-up on this branch (verified on a Qt 6 + RTX 5080 machine):

  • Qt Quick tests run and fixed: two viewport tests toggled checkboxes without firing onToggled, and the hierarchy's Ctrl/Shift multiselect never received modifiers (it read a mouse argument ItemDelegate.onClicked lacks).
  • Text input: the caret, selection and IME underline are drawn from the text layout (input_caret.rs, parley geometry), and click/drag places the caret by character index. The | and [..] marks in the text are gone.
  • Animation: Opacity, OffsetX, OffsetY, Rotation tracks plus an authored fx property. Offset rides margins/insets and rotation the transform's rotation, so the anchor's translation is untouched; opacity multiplies down the tree (slider tracks and fills are not faded yet). The timeline has Preview and a scrub slider via InterfaceDesign.animation (protocol 37); editing pauses while previewing and nothing is saved.
  • Hardware: ignored GPU test interface_design_geometry_follows_viewport_dpi_and_safe_area (six viewport/DPI/safe-area/scale cases) passes through the embedded runtime. Still open: process runtime matrix, real image/font loading, presentation timing, screenshot baselines.
  • cargo test --workspace: all pass except screen::shell::tests::keys_type_their_keycode_and_unknown_ones_are_refused, which passes alone and looks load-sensitive. Clippy is clean for this branch's code.

🤖 Generated with Claude Code

https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
@EthanRStokes EthanRStokes self-assigned this Oct 8, 2026
@EthanRStokes EthanRStokes changed the title Interface editor: typed create, delete and duplicate Interface editor: create/delete/duplicate and hierarchy tree Oct 8, 2026
@EthanRStokes EthanRStokes changed the title Interface editor: create/delete/duplicate and hierarchy tree Interface editor: edits, hierarchy tree, editor hide, schema versioning Oct 8, 2026
claude added 4 commits October 8, 2026 23:46
…marquee

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
@EthanRStokes EthanRStokes changed the title Interface editor: edits, hierarchy tree, editor hide, schema versioning Interface editor: typed edits, tree, multiselect, versioning Oct 9, 2026

Copy link
Copy Markdown
Member Author

CI test failed on one test, android::tests::boot_state_reads_sys_boot_completed (890 passed, 1 failed). It runs a stub adb shell script and does not touch the interface editor code this PR changes, so the failure is not from this PR. Likely a flaky stub-script exec in the test. I re-ran the failed job once; if it fails again I will look at the test itself.


Generated by Claude Code

claude and others added 14 commits October 9, 2026 03:31
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013K2j7WKJ3rVme2h7LSfvc6
The caret, selection and IME composition underline are drawn from the
text layout's glyph geometry instead of | and [..] in the text. A click
or drag places the caret by character index.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
UiFx (authored 'fx' edit plus Opacity/OffsetX/OffsetY/Rotation props) is
visual only and composes with the anchor transform through margins and
insets. Design sessions can freeze an animation at a time (protocol 37).
Adds a GPU matrix test for viewport, DPI and safe area.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Fixes checkbox toggle tests and the hierarchy's Ctrl/Shift multiselect.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@EthanRStokes
EthanRStokes merged commit 344b8c9 into master Oct 11, 2026
13 checks passed
@EthanRStokes
EthanRStokes deleted the claude/project-thread-m9yspp branch October 11, 2026 02:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants