Skip to main content

max / audiofiles

Say the two review panes as a row that takes and a row that fills `RegionKind::Split` is retired (quasicoherent `cf981aaa`). Two panes side by side, the left choosing what the right shows, is content beside a fill, which is what a table row of a content column and a fill column has always been. `Stack` is the half the variant could not say: when there is not room for both, the reading takes its own line rather than being squeezed beside a listing it no longer fits next to. `deep_nodes` now walks a region's row before its body. That was a blind spot before the panes moved into one: a band's members share a row, so every test asking what a screen says was answering about the body alone.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
Author: Max Johnson <me@maxj.phd> · 2026-09-07 19:20 UTC
Signed with PGP, not checked
Commit: a317273969de1fea64806ad3186b30cfc2ab7409
Parent: 99fe269
5 files changed, +92 insertions, -49 deletions
M Cargo.lock +40 -31
@@ -4257,16 +4257,17 @@
4257 4257
4258 4258 [[package]]
4259 4259 name = "quasi-declare"
4260 - version = "0.1.7"
4260 + version = "0.1.10"
4261 4261 dependencies = [
4262 4262 "proc-macro2",
4263 4263 "quote",
4264 4264 "syn 2.0.119",
4265 + "toml 1.1.4+spec-1.1.0",
4265 4266 ]
4266 4267
4267 4268 [[package]]
4268 4269 name = "quasi-immediate"
4269 - version = "0.101.1"
4270 + version = "0.102.0"
4270 4271 dependencies = [
4271 4272 "docengine",
4272 4273 "egui",
@@ -4277,7 +4278,7 @@
4277 4278
4278 4279 [[package]]
4279 4280 name = "quasi-router"
4280 - version = "0.101.14"
4281 + version = "0.102.0"
4281 4282 dependencies = [
4282 4283 "makeover-layout",
4283 4284 ]
@@ -7566,6 +7567,38 @@
7566 7567 "winnow 1.0.4",
7567 7568 ]
7568 7569
7570 + [[patch.unused]]
7571 + name = "quasi-axum"
7572 + version = "0.102.0"
7573 +
7574 + [[patch.unused]]
7575 + name = "quasi-basics"
7576 + version = "0.102.0"
7577 +
7578 + [[patch.unused]]
7579 + name = "quasi-http"
7580 + version = "0.102.0"
7581 +
7582 + [[patch.unused]]
7583 + name = "quasi-notifs"
7584 + version = "0.102.0"
7585 +
7586 + [[patch.unused]]
7587 + name = "quasi-store"
7588 + version = "0.1.0"
7589 +
7590 + [[patch.unused]]
7591 + name = "quasi-tauri"
7592 + version = "0.102.0"
7593 +
7594 + [[patch.unused]]
7595 + name = "quasi-webview"
7596 + version = "0.102.0"
7597 +
7598 + [[patch.unused]]
7599 + name = "quasi-type"
7600 + version = "0.1.3"
7601 +
7569 7602 [[patch.unused]]
7570 7603 name = "kberg"
7571 7604 version = "0.1.0"
@@ -7579,33 +7612,9 @@
7579 7612 version = "0.1.0"
7580 7613
7581 7614 [[patch.unused]]
7582 - name = "quasi-axum"
7583 - version = "0.101.1"
7615 + name = "makeover-build"
7616 + version = "0.67.0"
7584 7617
7585 7618 [[patch.unused]]
7586 - name = "quasi-basics"
7587 - version = "0.101.1"
7588 -
7589 - [[patch.unused]]
7590 - name = "quasi-http"
7591 - version = "0.101.1"
7592 -
7593 - [[patch.unused]]
7594 - name = "quasi-notifs"
7595 - version = "0.101.2"
7596 -
7597 - [[patch.unused]]
7598 - name = "quasi-store"
7599 - version = "0.1.0"
7600 -
7601 - [[patch.unused]]
7602 - name = "quasi-tauri"
7603 - version = "0.101.1"
7604 -
7605 - [[patch.unused]]
7606 - name = "quasi-webview"
7607 - version = "0.101.1"
7608 -
7609 - [[patch.unused]]
7610 - name = "quasi-type"
7611 - version = "0.1.3"
7619 + name = "makeover-webview"
7620 + version = "0.74.0"
M Cargo.toml +2 -2
@@ -26,8 +26,8 @@
26 26 # The described screens, which are audiofiles-browser's screens. By git URL with
27 27 # a version requirement, per the tree's rule for cross-repo deps. They were
28 28 # behind a `quasi` feature until 2026-08-25, when the last flip landed.
29 - quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
30 - quasi-immediate = { git = "https://makenot.work/git/max/quasi.git", version = "0.101" }
29 + quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
30 + quasi-immediate = { git = "https://makenot.work/git/max/quasi.git", version = "0.102" }
31 31 quasi-declare = { git = "https://makenot.work/git/max/quasi.git", version = "0.1" }
32 32 egui = { version = "0.35", default-features = false, features = ["default_fonts"] }
33 33 egui_extras = { version = "0.35", default-features = false }
@@ -1824,14 +1824,18 @@
1824 1824 declare! {
1825 1825 /// Reading what the analysis suggested.
1826 1826 ///
1827 - /// The one stage with two panes, and the region says so: [`RegionKind::Split`]
1828 - /// is "two panes side by side, the left choosing what the right shows", which
1829 - /// is what the shipped side panel and central pane are. The screen's own
1830 - /// arrangement stays `sidebar_content` like every other stage -- the split is
1831 - /// inside this flow's one region rather than a different shape of screen,
1832 - /// because the flow is one address and the arrangement is the window's.
1827 + /// The one stage with two panes, and the row says so: the listing takes what
1828 + /// it needs and the reading absorbs the rest, which is what the shipped side
1829 + /// panel and central pane are. The screen's own arrangement stays
1830 + /// `sidebar_content` like every other stage -- the split is inside this
1831 + /// flow's one region rather than a different shape of screen, because the
1832 + /// flow is one address and the arrangement is the window's.
1833 1833 ///
1834 - /// [`RegionKind::Split`]: quasi_router::RegionKind::Split
1834 + /// `RegionKind::Split` said this until it was retired (quasicoherent
1835 + /// `cf981aaa`). Content beside a fill says the same division and `Stack`
1836 + /// says what happens when there is not room for both, which the variant
1837 + /// could not: the reading takes its own line rather than being squeezed
1838 + /// beside a listing it no longer fits next to.
1835 1839 shape reviewing(review: &Reviewing) -> Vec<Node>;
1836 1840
1837 1841 region "review-head" as Group {
@@ -1842,9 +1846,11 @@
1842 1846 stats review.figures.clone() unless review.figures.is_empty();
1843 1847 }
1844 1848
1845 - region "review-split" as Split {
1846 - include listing(&review.listing);
1847 - include reading(&review.reading);
1849 + region "review-split" as Group {
1850 + across Stack {
1851 + beside Essential include listing(&review.listing);
1852 + beside Essential Fill include reading(&review.reading);
1853 + }
1848 1854 }
1849 1855
1850 1856 text "Accept at least one suggestion, or use Cancel to discard." unless review.any;
@@ -441,9 +441,11 @@
441 441
442 442 screen sidebar_content "Review Tags" {
443 443 include head(review);
444 - region "review-split" as Split {
445 - include tags(review);
446 - include group(review);
444 + region "review-split" as Group {
445 + across Stack {
446 + beside Essential include tags(review);
447 + beside Essential Fill include group(review);
448 + }
447 449 }
448 450 include foot(review);
449 451 }
@@ -7696,14 +7696,27 @@
7696 7696 for placed in body {
7697 7697 into.push(placed.node.clone());
7698 7698 if let Node::Region(slot) = &placed.node {
7699 - walk(&slot.body, into);
7699 + inside(slot, into);
7700 7700 }
7701 7701 }
7702 7702 }
7703 7703
7704 + /// A region's row and then its body, which is the order they are drawn in.
7705 + ///
7706 + /// The row was missed until the two review panes moved into one
7707 + /// (quasicoherent `cf981aaa`), and it was a blind spot before that: a
7708 + /// band's members share a row, so every test asking what a screen says was
7709 + /// answering about the body alone.
7710 + fn inside(slot: &quasi_router::Slot, into: &mut Vec<Node>) {
7711 + if let Some(run) = slot.run.as_ref() {
7712 + walk(&run.members, into);
7713 + }
7714 + walk(&slot.body, into);
7715 + }
7716 +
7704 7717 let mut found = Vec::new();
7705 7718 for slot in &screen.slots {
7706 - walk(&slot.body, &mut found);
7719 + inside(slot, &mut found);
7707 7720 }
7708 7721 found
7709 7722 }
@@ -9816,7 +9829,20 @@
9816 9829 .iter()
9817 9830 .find(|slot| slot.id == "review-split")
9818 9831 .expect("the screen is a split");
9819 - assert_eq!(tags.kind, quasi_router::RegionKind::Split);
9832 + // A row of two, the second absorbing what the first did not take. That was
9833 + // `RegionKind::Split` until the variant was retired (quasicoherent
9834 + // `cf981aaa`); what says it now is the width on the row's members.
9835 + let run = tags.run.as_ref().expect("the two panes share a row");
9836 + assert_eq!(
9837 + run.members
9838 + .iter()
9839 + .map(|placed| placed.width)
9840 + .collect::<Vec<_>>(),
9841 + vec![
9842 + quasi_router::layout::Width::Content,
9843 + quasi_router::layout::Width::Fill
9844 + ],
9845 + );
9820 9846
9821 9847 let rows = deep_rows(&screen);
9822 9848 let open = rows