Skip to main content

StackView

Struct StackView 

Source
pub struct StackView<'a, ViewId, TitleFor, const N: usize>
where TitleFor: Fn(ViewId) -> Localized<'a>,
{ /* private fields */ }
Expand description

Stack navigation container built on StackNav.

Implementations§

Source§

impl<'a, ViewId, TitleFor, const N: usize> StackView<'a, ViewId, TitleFor, N>
where ViewId: Copy, TitleFor: Fn(ViewId) -> Localized<'a>,

Source

pub fn new(root: ViewId, title_for: TitleFor) -> Self

Creates a stack view with a root view and title callback.

Examples found in repository?
examples/containers.rs (lines 30-33)
25fn main() {
26    let bounds = Rectangle::new(Point::zero(), Size::new(320, 240));
27    let split = SplitView::new(SplitAxis::Horizontal, 620, 12);
28    let _layout = split.layout(bounds);
29
30    let mut stack = StackView::<Screen, _, 4>::new(Screen::Devices, |screen| match screen {
31        Screen::Devices => Localized::new("screen.devices", "Devices"),
32        Screen::DeviceDetail => Localized::new("screen.detail", "Device"),
33    });
34    let _ = stack.push_view(Screen::DeviceDetail);
35    let _ = stack.motion(bounds);
36    let _ = stack.handle_touch(
37        TouchEvent::new(Point::new(12, 12), TouchPhase::Start, 1),
38        bounds,
39    );
40
41    let tabs = [
42        TabSpec {
43            key: TabId::Home,
44            icon: "H",
45            title: Localized::new("tab.home", "Home"),
46        },
47        TabSpec {
48            key: TabId::Logs,
49            icon: "L",
50            title: Localized::new("tab.logs", "Logs"),
51        },
52        TabSpec {
53            key: TabId::Settings,
54            icon: "S",
55            title: Localized::new("tab.settings", "Settings"),
56        },
57    ];
58    let mut tab_view = TabView::new(tabs, 0);
59    let _ = tab_view.content_frame(bounds, &support::theme());
60    let _ = tab_view.handle_touch(
61        TouchEvent::new(Point::new(200, 220), TouchPhase::End, 2),
62        bounds,
63        &support::theme(),
64    );
65}
Source

pub fn set_root(&mut self, root: ViewId)

Replaces the whole stack with a new root.

Source

pub fn push_view(&mut self, view: ViewId) -> Result<(), StackError>

Pushes a new view onto the stack.

Examples found in repository?
examples/containers.rs (line 34)
25fn main() {
26    let bounds = Rectangle::new(Point::zero(), Size::new(320, 240));
27    let split = SplitView::new(SplitAxis::Horizontal, 620, 12);
28    let _layout = split.layout(bounds);
29
30    let mut stack = StackView::<Screen, _, 4>::new(Screen::Devices, |screen| match screen {
31        Screen::Devices => Localized::new("screen.devices", "Devices"),
32        Screen::DeviceDetail => Localized::new("screen.detail", "Device"),
33    });
34    let _ = stack.push_view(Screen::DeviceDetail);
35    let _ = stack.motion(bounds);
36    let _ = stack.handle_touch(
37        TouchEvent::new(Point::new(12, 12), TouchPhase::Start, 1),
38        bounds,
39    );
40
41    let tabs = [
42        TabSpec {
43            key: TabId::Home,
44            icon: "H",
45            title: Localized::new("tab.home", "Home"),
46        },
47        TabSpec {
48            key: TabId::Logs,
49            icon: "L",
50            title: Localized::new("tab.logs", "Logs"),
51        },
52        TabSpec {
53            key: TabId::Settings,
54            icon: "S",
55            title: Localized::new("tab.settings", "Settings"),
56        },
57    ];
58    let mut tab_view = TabView::new(tabs, 0);
59    let _ = tab_view.content_frame(bounds, &support::theme());
60    let _ = tab_view.handle_touch(
61        TouchEvent::new(Point::new(200, 220), TouchPhase::End, 2),
62        bounds,
63        &support::theme(),
64    );
65}
Source

pub fn pop_view(&mut self) -> Result<ViewId, StackError>

Pops the current view off the stack.

Source

pub fn top_view(&self) -> ViewId

Returns the top-most view identifier.

Source

pub fn depth(&self) -> usize

Returns the current stack depth.

Source

pub fn is_animating(&self) -> bool

Returns whether the stack is animating.

Source

pub fn advance(&mut self, dt_ms: u32) -> bool

Advances stack animation state.

Source

pub fn nav_view(&self, frame: Rectangle) -> NavView<'a, ViewId>

Builds a navigation view for the supplied frame.

Examples found in repository?
src/containers.rs (line 154)
149    pub fn handle_touch(
150        &mut self,
151        touch: TouchEvent,
152        frame: Rectangle,
153    ) -> ButtonTouchResponse<NavHeaderAction> {
154        self.nav_view(frame)
155            .handle_touch(&mut self.header_touch, touch)
156    }
157
158    /// Draws stack navigation chrome.
159    pub fn draw_chrome<D>(
160        &self,
161        display: &mut D,
162        frame: Rectangle,
163        theme: &FsTheme,
164        i18n: &I18n<'a>,
165    ) where
166        D: embedded_graphics::draw_target::DrawTarget<
167                Color = embedded_graphics::pixelcolor::Rgb565,
168            >,
169    {
170        self.nav_view(frame)
171            .draw_chrome(display, theme, i18n, &self.header_touch);
172    }
173
174    /// Returns stack-motion geometry for animated presentation.
175    pub fn motion(&self, frame: Rectangle) -> Option<StackMotion> {
176        let nav = self.nav_view(frame);
177        nav.layers.overlay.map(|overlay| StackMotion {
178            header: nav.header,
179            body: nav.body,
180            overlay: overlay.translated_frame(),
181        })
182    }
Source

pub fn clear_touch_state(&mut self)

Clears transient header touch state.

Source

pub fn handle_touch( &mut self, touch: TouchEvent, frame: Rectangle, ) -> ButtonTouchResponse<NavHeaderAction>

Routes one touch event to the navigation chrome.

Examples found in repository?
examples/containers.rs (lines 36-39)
25fn main() {
26    let bounds = Rectangle::new(Point::zero(), Size::new(320, 240));
27    let split = SplitView::new(SplitAxis::Horizontal, 620, 12);
28    let _layout = split.layout(bounds);
29
30    let mut stack = StackView::<Screen, _, 4>::new(Screen::Devices, |screen| match screen {
31        Screen::Devices => Localized::new("screen.devices", "Devices"),
32        Screen::DeviceDetail => Localized::new("screen.detail", "Device"),
33    });
34    let _ = stack.push_view(Screen::DeviceDetail);
35    let _ = stack.motion(bounds);
36    let _ = stack.handle_touch(
37        TouchEvent::new(Point::new(12, 12), TouchPhase::Start, 1),
38        bounds,
39    );
40
41    let tabs = [
42        TabSpec {
43            key: TabId::Home,
44            icon: "H",
45            title: Localized::new("tab.home", "Home"),
46        },
47        TabSpec {
48            key: TabId::Logs,
49            icon: "L",
50            title: Localized::new("tab.logs", "Logs"),
51        },
52        TabSpec {
53            key: TabId::Settings,
54            icon: "S",
55            title: Localized::new("tab.settings", "Settings"),
56        },
57    ];
58    let mut tab_view = TabView::new(tabs, 0);
59    let _ = tab_view.content_frame(bounds, &support::theme());
60    let _ = tab_view.handle_touch(
61        TouchEvent::new(Point::new(200, 220), TouchPhase::End, 2),
62        bounds,
63        &support::theme(),
64    );
65}
Source

pub fn draw_chrome<D>( &self, display: &mut D, frame: Rectangle, theme: &FsTheme, i18n: &I18n<'a>, )
where D: DrawTarget<Color = Rgb565>,

Draws stack navigation chrome.

Source

pub fn motion(&self, frame: Rectangle) -> Option<StackMotion>

Returns stack-motion geometry for animated presentation.

Examples found in repository?
examples/containers.rs (line 35)
25fn main() {
26    let bounds = Rectangle::new(Point::zero(), Size::new(320, 240));
27    let split = SplitView::new(SplitAxis::Horizontal, 620, 12);
28    let _layout = split.layout(bounds);
29
30    let mut stack = StackView::<Screen, _, 4>::new(Screen::Devices, |screen| match screen {
31        Screen::Devices => Localized::new("screen.devices", "Devices"),
32        Screen::DeviceDetail => Localized::new("screen.detail", "Device"),
33    });
34    let _ = stack.push_view(Screen::DeviceDetail);
35    let _ = stack.motion(bounds);
36    let _ = stack.handle_touch(
37        TouchEvent::new(Point::new(12, 12), TouchPhase::Start, 1),
38        bounds,
39    );
40
41    let tabs = [
42        TabSpec {
43            key: TabId::Home,
44            icon: "H",
45            title: Localized::new("tab.home", "Home"),
46        },
47        TabSpec {
48            key: TabId::Logs,
49            icon: "L",
50            title: Localized::new("tab.logs", "Logs"),
51        },
52        TabSpec {
53            key: TabId::Settings,
54            icon: "S",
55            title: Localized::new("tab.settings", "Settings"),
56        },
57    ];
58    let mut tab_view = TabView::new(tabs, 0);
59    let _ = tab_view.content_frame(bounds, &support::theme());
60    let _ = tab_view.handle_touch(
61        TouchEvent::new(Point::new(200, 220), TouchPhase::End, 2),
62        bounds,
63        &support::theme(),
64    );
65}

Auto Trait Implementations§

§

impl<'a, ViewId, TitleFor, const N: usize> Freeze for StackView<'a, ViewId, TitleFor, N>
where TitleFor: Freeze, ViewId: Freeze,

§

impl<'a, ViewId, TitleFor, const N: usize> RefUnwindSafe for StackView<'a, ViewId, TitleFor, N>
where TitleFor: RefUnwindSafe, ViewId: RefUnwindSafe,

§

impl<'a, ViewId, TitleFor, const N: usize> Send for StackView<'a, ViewId, TitleFor, N>
where TitleFor: Send, ViewId: Send,

§

impl<'a, ViewId, TitleFor, const N: usize> Sync for StackView<'a, ViewId, TitleFor, N>
where TitleFor: Sync, ViewId: Sync,

§

impl<'a, ViewId, TitleFor, const N: usize> Unpin for StackView<'a, ViewId, TitleFor, N>
where TitleFor: Unpin, ViewId: Unpin,

§

impl<'a, ViewId, TitleFor, const N: usize> UnsafeUnpin for StackView<'a, ViewId, TitleFor, N>
where TitleFor: UnsafeUnpin, ViewId: UnsafeUnpin,

§

impl<'a, ViewId, TitleFor, const N: usize> UnwindSafe for StackView<'a, ViewId, TitleFor, N>
where TitleFor: UnwindSafe, ViewId: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Az for T

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.