pub enum NavPatch {
Pushed {
title: String,
immersive: bool,
},
Popped,
Title(String),
GuardTop(bool),
Presentation(NavPresentation),
Select(usize),
Reorder(Vec<usize>),
ListVisible(bool),
ListInStack(bool),
}Expand description
Applied to the nav host after a page child is attached / before it is removed; the toolkit animates its native presentation accordingly.
Variants§
Pushed
The just-attached last page child became the top of the stack. immersive marks a
page that keeps the floating transparent chrome on backends with an immersive nav
mode (day-android edge-to-edge today; ignored elsewhere). Unmarked pages get the
standard opaque bar.
Popped
The top page is about to be removed; present its predecessor.
Title(String)
Current top-of-stack title changed.
GuardTop(bool)
The top page has a back guard (NavStack::on_back, docs/navigation.md): while true,
the toolkit must not auto-pop on a native back gesture/button but route it to
Day as Event::NavBack { already_popped: false } so the app’s guard decides. On
backends whose back already routes through Day (AppKit/Qt/XAML/web custom headers)
this is a no-op; iOS disables the swipe, Android holds its callback, GTK sets the
page can-pop=false, ArkUI consumes onBackPressed.
Presentation(NavPresentation)
Re-present the host: the window’s size class crossed a breakpoint, or the app wrote a
new presentation. The page children do not change: the toolkit rebuilds its
chrome and re-homes the pages it already has, each one landing by its
NavPageProps::pane. Rebuilding them instead would drop scroll offsets, field
focus, and every native animation in flight, which is why this is a patch and not
a rebuild.
Backends with no split container ignore it and stay stacked.
Select(usize)
Show the resident Pane::Detail page at this index, counting the host’s detail
children in attach order. The counterpart to Self::Pushed/Self::Popped for the
presentations where pages are resident rather than stacked
(NavPresentation::rows_are_chrome): a tab bar switches between pages that all stay
alive, so there is nothing to push and nothing to pop.
Applied without re-emitting crate::Event::SelectionChanged, per the from-native
echo rule: this is the programmatic-sync direction.
A backend drawing a stacked presentation never receives it; the pieces layer sends push/pop there instead.
Reorder(Vec<usize>)
Reorder resident detail pages by their previous indices without rebuilding them.
ListVisible(bool)
Show or collapse the content-list pane (Pane::List), the per-destination
visibility switch (Nav::content_list_for, docs/navigation.md): a nav host
section that spans the whole detail area (a settings page) collapses the pane, and
selecting a list-backed section brings it back. Only sent to hosts whose
NavProps::list_width is set. Applied directly, not through an animator proxy:
the screenshot step captures the instant the patch returns (the sidebar-toggle rule).
ListInStack(bool)
Stacked presentations on a merged-pane backend (crate::Cap::NavContentList
Emulated) only: the resident Pane::List page joins (true) or leaves
(false) the navigation stack directly above the sidebar root. The pieces layer
sends it as the selection gains or loses a list-backed destination; the backend
realizes the membership change through its platform’s navigation APIs (UIKit:
showColumn(.supplementary) / a pop to the root; never a manual splice, which
destroys the split’s collapse bookkeeping). Never sent to Native backends (their
pane persists through every presentation) nor while split.