Skip to main content

Shell

Struct Shell 

Source
pub struct Shell<D> { /* private fields */ }
Expand description

The window frame. Hold one as the app’s root; call ui every frame.

Labels are message ids: each frame the hover text is looked up in the language installed (see i18n), so a language switch shows on the next frame.

The shell keeps clear of the system’s bars and notches (egui’s safe area, which iOS fills): the rail, the bar’s buttons and the screens stay inside it, and the bottom bar’s fill runs on under the home indicator, as a phone’s tab bar does. Give it the window’s whole root ui; the app adds no margin of its own. If the app does keep ui clear of them itself, the shell sees that and adds nothing, so the margin is never doubled. On Android, window::run_android keeps the app’s ui clear of the bars and the keyboard already.

#[derive(Clone, Copy, PartialEq)]
enum Screen { Gallery, Albums, Settings }

let mut shell = Shell::new(vec![
    // The app's own Lucide SVGs: `egui::include_image!("../assets/icons/images.svg")`.
    Destination::new(Screen::Gallery, icons::folder(), "gallery"),
    Destination::new(Screen::Albums, icons::folder(), "albums"),
])
.with_footer(vec![Destination::new(Screen::Settings, icons::settings(), "settings")]);
shell.ui(ui, |ui, screen| match screen {
    Screen::Gallery => { egui::CentralPanel::default().show(ui, |ui| ui.label("…")); }
    Screen::Albums => { egui::CentralPanel::default().show(ui, |ui| ui.label("…")); }
    Screen::Settings => { egui::CentralPanel::default().show(ui, |ui| ui.label("…")); }
});

Implementations§

Source§

impl<D: Copy + PartialEq> Shell<D>

Source

pub fn new(destinations: Vec<Destination<D>>) -> Shell<D>

A frame with destinations on the rail, the first one open.

Source

pub fn with_actions(self, actions: Vec<Action>) -> Shell<D>

Put actions on the rail, under the screens (on the bottom bar, after them).

Put footer at the rail’s foot (at the bottom bar’s end): where an app puts Settings. With no other destinations, the first of these is open.

Source

pub fn take_action(&mut self) -> Option<&'static str>

The Action clicked in the last ui, once: call it after ui every frame and do what it names.

Source

pub fn current(&self) -> Option<D>

The destination that is open; None only when there are none.

Source

pub fn open(&mut self, id: D)

Open the destination id.

Source

pub fn ui(&mut self, ui: &mut Ui, content: impl FnOnce(&mut Ui, D))

Render into the window’s root ui. content draws the open destination into what the frame leaves of ui, as it would at the root: its own panels, then a CentralPanel. The first frame installs the default theme and language if the app has not installed them.

Source

pub fn ui_with_foot( &mut self, ui: &mut Ui, foot: impl FnOnce(&mut Ui) -> Option<D>, content: impl FnOnce(&mut Ui, D), )

As ui, with foot drawn beside the footer — a status dot, say. A destination foot returns is opened, and drawn this frame.

Source

pub fn ui_with_status( &mut self, ui: &mut Ui, foot: impl FnOnce(&mut Ui) -> Option<D>, status: impl FnOnce(&mut Ui), content: impl FnOnce(&mut Ui, D), )

As ui_with_foot, with a status bar along the window’s bottom when wide. status fills it from the left — a log’s last line, the services’ state, the track playing; the bar’s right end holds foot (there rather than at the rail’s foot), then the detail pane’s toggle when the open screen has one. Narrow, as on a phone, there is no status bar: foot stays on the bottom bar, and status is not called.

Auto Trait Implementations§

§

impl<D> Freeze for Shell<D>

§

impl<D> RefUnwindSafe for Shell<D>

§

impl<D> Send for Shell<D>
where Vec<Destination<D>>: Send, Option<D>: Send,

§

impl<D> Sync for Shell<D>
where Vec<Destination<D>>: Sync, Option<D>: Sync,

§

impl<D> Unpin for Shell<D>
where Vec<Destination<D>>: Unpin, Option<D>: Unpin,

§

impl<D> UnsafeUnpin for Shell<D>

§

impl<D> UnwindSafe for Shell<D>

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> 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more