pub trait Component {
type Output;
// Required methods
fn handle(
&mut self,
event: &Event,
context: &Context<'_>,
) -> Flow<Self::Output>;
fn render(&self, context: &Context<'_>) -> View;
// Provided methods
fn start(&mut self, context: &Context<'_>) -> Flow<Self::Output> { ... }
fn tick(&self) -> Option<Duration> { ... }
fn mouse(&self) -> bool { ... }
fn keymap(&self) -> Keymap { ... }
fn focusable(&self) -> bool { ... }
fn focus_step(&mut self, forward: bool) -> bool { ... }
fn focus_enter(&mut self, forward: bool) -> bool { ... }
fn default_value(&self) -> Option<Self::Output> { ... }
fn prompt(
&mut self,
io: &mut dyn LineIo,
) -> Result<Option<Self::Output>, NotInteractive> { ... }
}Expand description
Required Associated Types§
Required Methods§
Provided Methods§
Sourcefn start(&mut self, context: &Context<'_>) -> Flow<Self::Output>
fn start(&mut self, context: &Context<'_>) -> Flow<Self::Output>
Called once, before the component is first painted, with the
terminal’s size: for work that needs it, such as rendering content
at the width. Returning Done or Cancel finishes the component
without waiting for an event. The default does nothing.
Sourcefn tick(&self) -> Option<Duration>
fn tick(&self) -> Option<Duration>
How often the component wants Event::Tick, for a spinner or a
countdown. None (the default): never.
Sourcefn mouse(&self) -> bool
fn mouse(&self) -> bool
Whether the component wants mouse events (#476): clicks, drags and
the wheel. Off by default, since reporting the mouse takes text
selection away from the terminal; a component turns it on when its
caller opts in, and run then enables mouse reporting
for the session.
Sourcefn keymap(&self) -> Keymap
fn keymap(&self) -> Keymap
The bindings this component has right now, for a help overlay, a
shortcut list or status-bar hints to read (see
keymap). A container’s include its focused
child’s, before its own. The default declares none.
Sourcefn focusable(&self) -> bool
fn focusable(&self) -> bool
Whether the component takes focus in a container: Tab stops on it and keys go to it. The default: yes. A label, or a component that has finished, says no.
Sourcefn focus_step(&mut self, forward: bool) -> bool
fn focus_step(&mut self, forward: bool) -> bool
Move focus to the next (forward) or previous focus stop inside
this component, for Tab and Shift+Tab. false when there is none
after the current one, so the container moves on to its next
child. The default, for a component that is one stop: false.
Sourcefn focus_enter(&mut self, forward: bool) -> bool
fn focus_enter(&mut self, forward: bool) -> bool
Take focus from outside: at the first stop inside when forward,
at the last otherwise. false when nothing in it can take focus.
The default: whether the component is focusable.
Sourcefn default_value(&self) -> Option<Self::Output>
fn default_value(&self) -> Option<Self::Output>
The value to return when the terminal is not interactive and the
policy asks for defaults. None: there is none.
Sourcefn prompt(
&mut self,
io: &mut dyn LineIo,
) -> Result<Option<Self::Output>, NotInteractive>
fn prompt( &mut self, io: &mut dyn LineIo, ) -> Result<Option<Self::Output>, NotInteractive>
Ask for the value line by line, for when the terminal is not interactive and the policy asks for a prompt. The default says the component has no line-based form.
Ok(None) means the user backed out (Outcome::Cancelled).
When input ends before an answer, the built-in components answer
with their default, and without one return NotInteractive::Ended,
which degrade reports as
NotInteractive::NoDefault: end of input is no answer, not a
refusal.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementations on Foreign Types§
Source§impl<C: Component + ?Sized> Component for &mut C
A component borrowed mutably is a component, so a caller can mount one
and still read its state after the loop.
impl<C: Component + ?Sized> Component for &mut C
A component borrowed mutably is a component, so a caller can mount one and still read its state after the loop.
type Output = <C as Component>::Output
fn start(&mut self, context: &Context<'_>) -> Flow<C::Output>
fn handle(&mut self, event: &Event, context: &Context<'_>) -> Flow<C::Output>
fn render(&self, context: &Context<'_>) -> View
fn tick(&self) -> Option<Duration>
fn mouse(&self) -> bool
fn keymap(&self) -> Keymap
fn focusable(&self) -> bool
fn focus_step(&mut self, forward: bool) -> bool
fn focus_enter(&mut self, forward: bool) -> bool
fn default_value(&self) -> Option<C::Output>
fn prompt( &mut self, io: &mut dyn LineIo, ) -> Result<Option<C::Output>, NotInteractive>
Source§impl<C: Component + ?Sized> Component for Box<C>
A boxed component is a component: how containers hold children of
different types with one output (compose::Child).
impl<C: Component + ?Sized> Component for Box<C>
A boxed component is a component: how containers hold children of
different types with one output (compose::Child).