pub struct NavigationStack<T>where
T: 'static,{ /* private fields */ }Expand description
A navigation view that retains a stack of destination views for an explicit path.
NavigationStack is designed for hierarchical navigation where the caller
owns the full path and updates it over time. The path is interpreted from
root to top:
[A]showsA[A, B]showsB[A, B, C]showsC
On each update, the stack compares the old and new path using stable keys:
- the shared prefix is retained
- any diverging tail is removed and disposed
- any new tail is created
This means destination views in the shared prefix keep their local view state while deeper navigation changes happen above them.
NavigationStack is intentionally built through NavigationStack::new,
which returns a builder. That builder lets callers choose whether to:
- use the path item itself as the stable key, or provide
NavigationStackBuilder::key - use the path item itself as the destination view, or provide
NavigationStackBuilder::view
Typical usage when the route type implements both IntoView and
Eq + Hash + Clone:
let path = RwSignal::new(vec![Route("Home".to_string())]);
let stack = NavigationStack::new(path);Typical usage when route data needs explicit keying and destination construction:
let path = RwSignal::new(vec![Route::Home]);
let stack = NavigationStack::new(path)
.key(|route| match route {
Route::Home => "home".to_string(),
Route::Detail(id) => format!("detail:{id}"),
})
.view(|route| match route {
Route::Home => "Home".to_string(),
Route::Detail(id) => format!("Detail {id}"),
});Implementations§
Sourcepub fn new<P>(path: P) -> NavigationStackBuilder<T>where
P: NavigationPath<T>,
pub fn new<P>(path: P) -> NavigationStackBuilder<T>where
P: NavigationPath<T>,
Start building a NavigationStack from a path source.
This is the single entrypoint for the navigation stack API. It accepts a
path source and returns a NavigationStackBuilder, which can then be
used in one of two ways:
- Build directly when
Talready provides everything the stack needs:T: IntoViewfor destination constructionT: Eq + Hash + Clonefor stable destination identity
- Refine the builder with:
NavigationStackBuilder::keywhen identity should come from a derived key rather than the whole itemNavigationStackBuilder::viewwhen the path item is route data rather than a view
The path argument can be any supported NavigationPath, including:
- a plain
Vec<T> - a closure returning an iterable path
ReadSignal<P>RwSignal<P>
The stack reads the full path and retains destination views for the shared prefix across updates.
§Example: route items are their own views
let path = RwSignal::new(vec![Route("Home".to_string())]);
let stack = NavigationStack::new(path);§Example: route items need explicit key and view functions
let path = RwSignal::new(vec![Route::Home]);
let stack = NavigationStack::new(path)
.key(|route| match route {
Route::Home => "home".to_string(),
Route::Detail(id) => format!("detail:{id}"),
})
.view(|route| match route {
Route::Home => "Home".to_string(),
Route::Detail(id) => format!("Detail {id}"),
});Trait Implementations§
fn id(&self) -> ViewId
fn debug_name(&self) -> Cow<'static, str>
Source§fn update(&mut self, cx: &mut UpdateCx<'_>, state: Box<dyn Any>)
fn update(&mut self, cx: &mut UpdateCx<'_>, state: Box<dyn Any>)
View’s Id handle Read moreSource§fn style_pass(&mut self, _cx: &mut StyleCx<'_>)
fn style_pass(&mut self, _cx: &mut StyleCx<'_>)
fn view_style(&self) -> Option<Style>
fn view_class(&self) -> Option<StyleClassRef>
Source§fn event_capture(&mut self, _cx: &mut EventCx<'_>) -> EventPropagation
fn event_capture(&mut self, _cx: &mut EventCx<'_>) -> EventPropagation
Source§fn event(&mut self, _cx: &mut EventCx<'_>) -> EventPropagation
fn event(&mut self, _cx: &mut EventCx<'_>) -> EventPropagation
Source§fn paint(&mut self, cx: &mut PaintCx<'_>)
fn paint(&mut self, cx: &mut PaintCx<'_>)
View-specific implementation. Called during paint traversal for this view.
Children are painted automatically by Floem.
Views should only paint their own content (backgrounds, borders, custom drawing).fn post_paint(&mut self, cx: &mut PaintCx<'_>)
Auto Trait Implementations§
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ContainerExt for Twhere
T: IntoView + 'static,
impl<T> ContainerExt for Twhere
T: IntoView + 'static,
Source§impl<T> Decorators for Twhere
T: IntoView,
impl<T> Decorators for Twhere
T: IntoView,
Source§fn style(self, style: impl Fn(Style) -> Style + 'static) -> Self::Intermediate
fn style(self, style: impl Fn(Style) -> Style + 'static) -> Self::Intermediate
Source§fn debug_name(self, name: impl Into<String>) -> Self::Intermediate
fn debug_name(self, name: impl Into<String>) -> Self::Intermediate
Source§fn debug_name_if<S>(
self,
apply: impl Fn() -> bool + 'static,
name: impl Fn() -> S + 'static,
) -> Self::Intermediate
fn debug_name_if<S>( self, apply: impl Fn() -> bool + 'static, name: impl Fn() -> S + 'static, ) -> Self::Intermediate
Source§fn dragging_style(
self,
style: impl Fn(Style) -> Style + 'static,
) -> Self::Intermediate
fn dragging_style( self, style: impl Fn(Style) -> Style + 'static, ) -> Self::Intermediate
Source§fn class<C>(self, _class: C) -> Self::Intermediatewhere
C: StyleClass,
fn class<C>(self, _class: C) -> Self::Intermediatewhere
C: StyleClass,
Source§fn class_if<C>(
self,
apply: impl Fn() -> bool + 'static,
_class: C,
) -> Self::Intermediatewhere
C: StyleClass,
fn class_if<C>(
self,
apply: impl Fn() -> bool + 'static,
_class: C,
) -> Self::Intermediatewhere
C: StyleClass,
Source§fn remove_class<C>(self, _class: C) -> Self::Intermediatewhere
C: StyleClass,
fn remove_class<C>(self, _class: C) -> Self::Intermediatewhere
C: StyleClass,
Set this property using Style::keyboard_navigable instead
Source§fn disable_default_event<L>(
self,
disable: impl Fn() -> (L, bool) + 'static,
) -> Self::Intermediatewhere
L: EventListenerTrait,
fn disable_default_event<L>(
self,
disable: impl Fn() -> (L, bool) + 'static,
) -> Self::Intermediatewhere
L: EventListenerTrait,
Source§fn draggable(self) -> <Self::Intermediate as IntoView>::Intermediate
fn draggable(self) -> <Self::Intermediate as IntoView>::Intermediate
Source§fn draggable_with_config(
self,
config: impl Fn() -> DragConfig + 'static,
) -> <Self::Intermediate as IntoView>::Intermediate
fn draggable_with_config( self, config: impl Fn() -> DragConfig + 'static, ) -> <Self::Intermediate as IntoView>::Intermediate
Source§fn disabled(
self,
disabled_fn: impl Fn() -> bool + 'static,
) -> Self::Intermediate
fn disabled( self, disabled_fn: impl Fn() -> bool + 'static, ) -> Self::Intermediate
use Style::set_disabled directly instead
Source§fn on_event_with_config<L>(
self,
listener: L,
config: EventCallbackConfig,
action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) -> EventPropagation + 'static,
) -> Self::Intermediate
fn on_event_with_config<L>( self, listener: L, config: EventCallbackConfig, action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) -> EventPropagation + 'static, ) -> Self::Intermediate
EventListener with custom phase configuration.Source§fn on_event_cont_with_config<L>(
self,
listener: L,
config: EventCallbackConfig,
action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static,
) -> Self::Intermediate
fn on_event_cont_with_config<L>( self, listener: L, config: EventCallbackConfig, action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static, ) -> Self::Intermediate
EventListener. This event will be handled with
the given handler and the event will continue propagating.Source§fn on_event_stop_with_config<L>(
self,
listener: L,
config: EventCallbackConfig,
action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static,
) -> Self::Intermediate
fn on_event_stop_with_config<L>( self, listener: L, config: EventCallbackConfig, action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static, ) -> Self::Intermediate
EventListener. This event will be handled with
the given handler and the event will stop propagating.Source§fn on_event<L>(
self,
listener: L,
action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) -> EventPropagation + 'static,
) -> Self::Intermediate
fn on_event<L>( self, listener: L, action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) -> EventPropagation + 'static, ) -> Self::Intermediate
EventListener.Source§fn on_event_cont<L>(
self,
listener: L,
action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static,
) -> Self::Intermediate
fn on_event_cont<L>( self, listener: L, action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static, ) -> Self::Intermediate
EventListener. This event will be handled with
the given handler and the event will continue propagating.Source§fn on_event_stop<L>(
self,
listener: L,
action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static,
) -> Self::Intermediate
fn on_event_stop<L>( self, listener: L, action: impl FnMut(&mut EventCx<'_>, &<L as EventListenerTrait>::EventData) + 'static, ) -> Self::Intermediate
EventListener. This event will be handled with
the given handler and the event will stop propagating.Source§fn on_key_down(
self,
key: Key,
cmp: impl Fn(Modifiers) -> bool + 'static,
action: impl FnMut(&mut EventCx<'_>, &KeyboardEvent) + 'static,
) -> Self::Intermediate
fn on_key_down( self, key: Key, cmp: impl Fn(Modifiers) -> bool + 'static, action: impl FnMut(&mut EventCx<'_>, &KeyboardEvent) + 'static, ) -> Self::Intermediate
Use on_event(listener::KeyDown, ...) instead.
Source§fn on_key_up(
self,
key: Key,
cmp: impl Fn(Modifiers) -> bool + 'static,
action: impl FnMut(&mut EventCx<'_>, &KeyboardEvent) + 'static,
) -> Self::Intermediate
fn on_key_up( self, key: Key, cmp: impl Fn(Modifiers) -> bool + 'static, action: impl FnMut(&mut EventCx<'_>, &KeyboardEvent) + 'static, ) -> Self::Intermediate
Use on_event(listener::KeyUp, ...) instead.
Source§fn on_click(
self,
action: impl FnMut(&mut EventCx<'_>) -> EventPropagation + 'static,
) -> Self::Intermediate
fn on_click( self, action: impl FnMut(&mut EventCx<'_>) -> EventPropagation + 'static, ) -> Self::Intermediate
Use on_event(Click, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::Click.Source§fn on_click_cont(
self,
action: impl FnMut(&mut EventCx<'_>) + 'static,
) -> Self::Intermediate
fn on_click_cont( self, action: impl FnMut(&mut EventCx<'_>) + 'static, ) -> Self::Intermediate
Use on_event_cont(Click, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::Click. This event will be handled with
the given handler and the event will continue propagating.Source§fn on_click_stop(
self,
action: impl FnMut(&mut EventCx<'_>) + 'static,
) -> Self::Intermediate
fn on_click_stop( self, action: impl FnMut(&mut EventCx<'_>) + 'static, ) -> Self::Intermediate
Use on_event_stop(Click, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::Click. This event will be handled with
the given handler and the event will stop propagating.Source§fn action(self, action: impl FnMut() + 'static) -> Self::Intermediate
fn action(self, action: impl FnMut() + 'static) -> Self::Intermediate
Source§fn on_double_click(
self,
action: impl FnMut(&mut EventCx<'_>) -> EventPropagation + 'static,
) -> Self::Intermediate
fn on_double_click( self, action: impl FnMut(&mut EventCx<'_>) -> EventPropagation + 'static, ) -> Self::Intermediate
Use on_event(DoubleClick, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::DoubleClickSource§fn on_double_click_cont(
self,
action: impl FnMut(&mut EventCx<'_>) + 'static,
) -> Self::Intermediate
fn on_double_click_cont( self, action: impl FnMut(&mut EventCx<'_>) + 'static, ) -> Self::Intermediate
Use on_event_cont(DoubleClick, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::DoubleClick. This event will be handled with
the given handler and the event will continue propagating.Source§fn on_double_click_stop(
self,
action: impl FnMut(&mut EventCx<'_>) + 'static,
) -> Self::Intermediate
fn on_double_click_stop( self, action: impl FnMut(&mut EventCx<'_>) + 'static, ) -> Self::Intermediate
Use on_event_stop(DoubleClick, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::DoubleClick. This event will be handled with
the given handler and the event will stop propagating.Source§fn on_secondary_click(
self,
action: impl FnMut(&mut EventCx<'_>) -> EventPropagation + 'static,
) -> Self::Intermediate
fn on_secondary_click( self, action: impl FnMut(&mut EventCx<'_>) -> EventPropagation + 'static, ) -> Self::Intermediate
Use on_event(SecondaryClick, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::SecondaryClick. This is most often the “Right” click.Source§fn on_secondary_click_cont(
self,
action: impl FnMut(&mut EventCx<'_>) + 'static,
) -> Self::Intermediate
fn on_secondary_click_cont( self, action: impl FnMut(&mut EventCx<'_>) + 'static, ) -> Self::Intermediate
Use on_event_cont(SecondaryClick, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::SecondaryClick. This is most often the “Right” click.
This event will be handled with the given handler and the event will continue propagating.Source§fn on_secondary_click_stop(
self,
action: impl FnMut(&mut EventCx<'_>) + 'static,
) -> Self::Intermediate
fn on_secondary_click_stop( self, action: impl FnMut(&mut EventCx<'_>) + 'static, ) -> Self::Intermediate
Use on_event_stop(SecondaryClick, |cx, _event| { ... }) instead. The new API provides direct access to typed event data.
EventListener::SecondaryClick. This is most often the “Right” click.
This event will be handled with the given handler and the event will stop propagating.Source§fn on_cleanup(self, action: impl Fn() + 'static) -> Self::Intermediate
fn on_cleanup(self, action: impl Fn() + 'static) -> Self::Intermediate
Source§fn animation(
self,
animation: impl Fn(Animation) -> Animation + 'static,
) -> Self::Intermediate
fn animation( self, animation: impl Fn(Animation) -> Animation + 'static, ) -> Self::Intermediate
Source§fn clear_focus(self, when: impl Fn() + 'static) -> Self::Intermediate
fn clear_focus(self, when: impl Fn() + 'static) -> Self::Intermediate
Source§fn request_focus(self, when: impl Fn() + 'static) -> Self::Intermediate
fn request_focus(self, when: impl Fn() + 'static) -> Self::Intermediate
Source§fn window_scale(
self,
scale_fn: impl Fn() -> f64 + 'static,
) -> Self::Intermediate
fn window_scale( self, scale_fn: impl Fn() -> f64 + 'static, ) -> Self::Intermediate
Source§fn window_title(
self,
title_fn: impl Fn() -> String + 'static,
) -> Self::Intermediate
fn window_title( self, title_fn: impl Fn() -> String + 'static, ) -> Self::Intermediate
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more