You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
v0.4.31 — Mix tab uses ctx-level panels (real fix for lane Z-order bug)
User caught the diagnosis: the BOX (Frame::group border) of a lane
sat in its proper place, but the lane's CONTENT (name, chips,
M/S/A/B/+Cor buttons, profile dropdown) rendered somewhere else
(at the top of the screen, overlapping the global menu bar).
Same row's pieces drawing at different y-coords = painter-layer
/ Z-order mismatch, not bad rect math.
Root cause: egui's painter uses multiple layers (Foreground for
widgets, Background for panel fills, Tooltip for popups, plus
ScrollArea-internal sublayers). Nesting TopBottomPanel::show_inside
or child_ui + set_clip_rect inside the app's global
CentralPanel::show(ctx, ...) only constrains the immediate layer —
ComboBox popups, ScrollArea viewports, tooltip rendering ALL bypass
the child's clip_rect and use the outer ui's. So the Frame::group
border (drawn directly in the immediate layer) sat where it should,
while the ComboBox/ScrollArea content for that row ended up
unbounded.
Fix: the Mix tab now declares its three panels (mix_transport_panel,
mix_console_panel, lanes CentralPanel) AT CTX LEVEL, as siblings of
the app's global menu bar (top_bar) and status bar (bottom_bar),
NOT nested inside the global CentralPanel. This is the egui-
blessed pattern for a multi-pane workspace — egui's panel system
composites these cleanly because they all draw to the same level,
no painter-layer mismatch.
New `mix::ctx_panels(app, ctx)` called from app.rs when Tab::Mix
is active. The previous `mix::show(app, ui)` becomes a thin
placeholder for the empty-project case. Removed TRANSPORT_BAR_H
and render_clipped helper from v0.4.30 — both were ceremony for
the failed child_ui approach.
75 tests passing, clippy clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,6 +8,15 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); thi
8
8
9
9
(Nothing yet — known issues all resolved as of v0.4.23.)
10
10
11
+
## [0.4.31] — 2026-05-13
12
+
13
+
### Fixed
14
+
-**Lane content rendering at wrong Y coords — root cause finally found and fixed.** The bug was visible across v0.4.29 / v0.4.30: the first lane's name + chips + M/S/A/B/+Cor row would render at the top of the screen overlapping the global menu bar, while the `Frame::group` border for that lane was either missing or in its proper place below the transport bar. Different parts of the same row drawing in different y-coords pointed at a **painter-layer / Z-order** issue, not just bad rect maths.
15
+
- The actual cause: egui's painter uses **multiple layers** (Foreground for widgets, Background for panel fills, Tooltip for popups, plus ScrollArea-internal sublayers). Nesting `TopBottomPanel::show_inside` / `child_ui` + `set_clip_rect` inside the app's global `CentralPanel::show(ctx, ...)` only constrains the *immediate* layer — `ComboBox` popups, `ScrollArea` viewports, and tooltip rendering bypass the child's clip_rect and use the OUTER `ui`'s. So the lane's `Frame::group` (drawn directly in the immediate layer) sat where it should, while the ComboBox / ScrollArea content for that row ended up unbounded.
16
+
-**Fix:** the Mix tab now declares its three panels (`mix_transport_panel`, `mix_console_panel`, lanes `CentralPanel`) **at ctx level**, as siblings of the app's global menu bar (`top_bar`) and status bar (`bottom_bar`), rather than nested inside the global `CentralPanel`. This is the egui-blessed pattern for a multi-pane workspace — egui's panel system composites these cleanly because they all draw to the same level, with no painter-layer mismatch. New `mix::ctx_panels(app, ctx)` function called directly from `app.rs` when `Tab::Mix` is active.
17
+
-`app.rs` gains a branch: for Mix tab with tracks (and not the Visualizer takeover), it calls `mix::ctx_panels(self, ctx)`; everything else continues to render inside the global `CentralPanel` via `mix::show(self, ui)` (now a thin placeholder for the empty-project case).
18
+
- Removed `TRANSPORT_BAR_H` constant and the `render_clipped` helper from v0.4.30 — both were ceremony for the failed child_ui approach.
0 commit comments