4.0 KiB
Isolated canvas renderer union
Owner: Codex-ytr83r /root/linux_build_plan. Worktree .local/canvas-union-ytr83r-20260911; baseline32334c66317692befb6517a917dc7ae90641c11a, preserving production865483b renderer. Peer pinned a31b40d0f8551ed87c8cd66250b9afb4809b3a79; known merge base c6d296a7e2. Only the three owned worktree files below were edited; main source, Git/index, compiler, native UI and WSL were untouched.
Implemented
- behavior.rs: imported peer's scenario_scroll observer adaptation (process argument, Page-only details scrolling) and canvas_workspace/form_session module declarations, retaining unconditional scenario_lifecycle. Merged peer camera_pan input/draw mapping, Lifeline palette admission, ordinary row drag/release selection and cross-operand hint. Retained root B4 scene geometry, lifetimes, markers, clipping, marker priority and model/source construction. The existing pointer-order regression now covers the replacement camera-pan backend.
- Header text and Create label clipping use the same local screen transform: pan + scale × world. Both fresh clipped child frames explicitly translate(pan) THEN scale(scale), just like the parent. Clip rectangles intersect actual parent frame size; widget absolute origin is not added. Nonfinite pan is rejected by clip helpers.
- scenario_lifecycle/render.rs changes are limited to the pan argument for draw_markers, child transform, and birth_label_clip transform/guard. No marker/lifetime/hit semantics changed.
- All15 existing lifecycle render tests remain, including .05/.1 minimum-zoom marker priority. Added2 regressions: independent absolute clip expectations for positive/negative pan at .5/1/2, partial viewport edges/offscreen/nonfinite cases; actual canvas::Program mouse-event selection for OA/SA header, Create and Delete identities with nonzero pan, nonunit zoom and nonzero widget origin. Unicode/source/lifecycle values remain unchanged.
Independent reviewer counterexample is included: rect100,200,204,70; pan(-200,-400),scale2,viewport300×100 produces header clip20,16,280,84; Create140×28 clip16,8,248,40. A scale-before-pan ordering would fail these expectations. The tests do not claim pixel validation or invoke a physical renderer; direct source inspection verifies both child-frame call sites.
Validation and handoff
Scoped rustfmt2024 with skip_children=true formatted only these3 files; subsequent --check exit0. Correct-worktree git diff --check exit0. No compiler/test/native execution. Read-only source comparison against32334c6 proved the entire impl Scene geometry/hit section equal apart from initialization field scroll_offset→camera_pan; the B4 render/lifetime/hit prefix before draw_markers is byte-equal after line-ending normalization. Existing lifecycle test names were all retained (15→17).
Root owns canvas_workspace/, scenario.rs/workspace/, topology/** and guide integration; prerequisite worker owns App/forms. Renderer interface is Scene.camera_pan (screen units), scenario_scroll::observe(context,area,process,restore,content), and Rendering::draw_markers(frame,selected,scale,pan). Root was notified about remaining scene.scroll_offset expressions in its workspace/tests.rs:1193/1198 at the time of inspection; those belong to root's interface adaptation.
windows_release_gap_review supplied exact Iced draft/paste/transform obligations and has been asked to inspect these final candidate hashes. At this report write, candidate critique is pending. Root must compile and run combined candidate tests/Clippy and actual pan/zoom/viewport native checks before acceptance. Peer729 and prior root707 results do not validate this union.
Frozen worker hashes
| Worktree file | SHA256 |
|---|---|
| crates/oa-desktop/src/behavior.rs | 82DCAAED9EB17F15329F80BCC7442FFF94C17D426A50DEA68455339F60FFA246 |
| crates/oa-desktop/src/behavior/scenario_lifecycle/render.rs | BF1C05EA1E709B3503D8BCF92F091446FD7A9B80B1A29C5A55919DF58F3B0271 |
| crates/oa-desktop/src/behavior/scenario_lifecycle/render_tests.rs | A95201F7D0DCC88C9C54863F0E95E09C1DB204668743ABBD32C495B577EA53EF |