pub struct AsyncView<T: View> { /* private fields */ }
Expand description
An AsyncView
is a wrapper view that displays a loading screen, until the
child view is ready to be created. The view can be used in two different
ways.
§Poll-based AsyncView
The poll-based AsyncView
is constructed via the AsyncView::new
function
and regularly calls the provided poll_ready
function. It indicates
whether the child view is available or not by returning an AsyncState
enum. The poll_ready
callback should only check for data to be
available and create the child view when the data got available. It must
never block until the data is available or do heavy calculations!
Use a different thread for long taking calculations. Check the bg_task
example for an example on how to use a dedicated calculation thread with
the AsyncView
.
§Example usage of the poll-based variant
use std::time::{Instant, Duration};
use cursive::{views::TextView, Cursive, CursiveExt};
use cursive_async_view::{AsyncView, AsyncState};
let mut siv = Cursive::default();
let instant = Instant::now();
let async_view = AsyncView::new(&mut siv, move || {
// check if the view can be created
if instant.elapsed() > Duration::from_secs(10) {
AsyncState::Available(
TextView::new("Yay!\n\nThe content has loaded!")
)
} else {
AsyncState::Pending
}
});
siv.add_layer(async_view);
// siv.run();
The content will be displayed after 10 seconds.
§Producing view data in a background thread
The second variant produces custom data in a background thread via the
provided bg_task
function. The produced data is then sent to the cursive
thread and given to the provided view_creator
function. This function
should construct the child view and return it to the async view.
All heavy work must be done in the bg_task
function. Otherwise,
the cursive event loop will be blocked, preventing any rendering or event
handling taking place.
§Example usage for the background thread variant
use std::thread;
use std::time::Duration;
use cursive::views::TextView;
use cursive::{Cursive, CursiveExt};
use cursive_async_view::AsyncView;
let mut siv = Cursive::default();
let async_view = AsyncView::new_with_bg_creator(&mut siv, move || {
// this function is executed in a background thread, so we can block
// here as long as we like
thread::sleep(Duration::from_secs(10));
// enough blocking, let's show the content
Ok("Yeet! It worked 🖖")
}, TextView::new); // create a text view from the string
siv.add_layer(async_view);
// siv.run();
The content will be displayed after 10 seconds.
Implementations§
Source§impl<T: View> AsyncView<T>
impl<T: View> AsyncView<T>
Sourcepub fn new<F>(siv: &mut Cursive, ready_poll: F) -> Selfwhere
F: FnMut() -> AsyncState<T> + 'static,
pub fn new<F>(siv: &mut Cursive, ready_poll: F) -> Selfwhere
F: FnMut() -> AsyncState<T> + 'static,
Create a new AsyncView
instance. The cursive reference is used
to control the refresh rate of the terminal when the loading animation
is running. In order to show the view, it has to be directly or indirectly
added to a cursive layer like any other view.
The ready_poll
function will be called regularly until the view has
either been loaded or errored. Use this function only to check whether
your data is available. Do not run heavy calculations in this function.
Instead use a dedicated thread for it as shown in the bg_task
example.
Sourcepub fn new_with_bg_creator<F, C, D>(
siv: &mut Cursive,
bg_task: F,
view_creator: C,
) -> Self
pub fn new_with_bg_creator<F, C, D>( siv: &mut Cursive, bg_task: F, view_creator: C, ) -> Self
Create a new AsyncView
instance. The cursive reference is used
to control the refresh rate of the terminal when the loading animation
is running. In order to show the view, it has to be directly or indirectly
added to a cursive layer like any other view.
The bg_task
function is executed on a background thread called
cursive-async-view::bg_task
. It should be used to produce data of
type D
which is converted to a view by the view_creator
function.
Sourcepub fn with_width(self, width: usize) -> Self
pub fn with_width(self, width: usize) -> Self
Mark the maximum allowed width in characters, the loading animation may consume. By default, the width will be inherited by the parent view.
Sourcepub fn with_height(self, height: usize) -> Self
pub fn with_height(self, height: usize) -> Self
Mark the maximum allowed height in characters, the loading animation may consume. By default, the height will be inherited by the parent view.
Sourcepub fn with_animation_fn<F>(self, animation_fn: F) -> Self
pub fn with_animation_fn<F>(self, animation_fn: F) -> Self
Set a custom animation function for this view, indicating that the wrapped view is
not available yet. See the default_animation
function reference for an example on
how to create a custom animation function.
Sourcepub fn with_error_fn<F>(self, error_fn: F) -> Self
pub fn with_error_fn<F>(self, error_fn: F) -> Self
Set a custom error animation function for this view, indicating that the
wrapped view has failed to load. See the default_error
function
reference for an example on how to create a custom error animation
function.
Sourcepub fn set_width(&mut self, width: usize)
pub fn set_width(&mut self, width: usize)
Set the maximum allowed width in characters, the loading animation may consume.
Sourcepub fn set_height(&mut self, height: usize)
pub fn set_height(&mut self, height: usize)
Set the maximum allowed height in characters, the loading animation may consume.
Sourcepub fn set_animation_fn<F>(&mut self, animation_fn: F)
pub fn set_animation_fn<F>(&mut self, animation_fn: F)
Set a custom animation function for this view, indicating that the wrapped view is
not available yet. See the default_animation
function reference for an example on
how to create a custom animation function.
This function may be set at any time. The loading animation can be changed even if the previous loading animation has already started.
Sourcepub fn set_error_fn<F>(&mut self, error_fn: F)
pub fn set_error_fn<F>(&mut self, error_fn: F)
Set a custom error animation function for this view, indicating that the wrapped view
has failed to load. See the default_error
function reference for an example on
how to create a custom error animation function.
This function may be set at any time. The error animation can be changed even if the previous error animation has already started.
Sourcepub fn inherit_width(&mut self)
pub fn inherit_width(&mut self)
Make the loading animation inherit its width from the parent view. This is the default.
Sourcepub fn inherit_height(&mut self)
pub fn inherit_height(&mut self)
Make the loading animation inherit its height from the parent view. This is the default.
Trait Implementations§
Source§impl<T: View + Sized> View for AsyncView<T>
impl<T: View + Sized> View for AsyncView<T>
Source§fn draw(&self, printer: &Printer<'_, '_>)
fn draw(&self, printer: &Printer<'_, '_>)
Source§fn layout(&mut self, vec: Vec2)
fn layout(&mut self, vec: Vec2)
Source§fn needs_relayout(&self) -> bool
fn needs_relayout(&self) -> bool
Source§fn required_size(&mut self, constraint: Vec2) -> Vec2
fn required_size(&mut self, constraint: Vec2) -> Vec2
Source§fn on_event(&mut self, ev: Event) -> EventResult
fn on_event(&mut self, ev: Event) -> EventResult
Source§fn call_on_any<'a>(&mut self, sel: &Selector<'_>, cb: AnyCb<'a>)
fn call_on_any<'a>(&mut self, sel: &Selector<'_>, cb: AnyCb<'a>)
Source§fn focus_view(
&mut self,
sel: &Selector<'_>,
) -> Result<EventResult, ViewNotFound>
fn focus_view( &mut self, sel: &Selector<'_>, ) -> Result<EventResult, ViewNotFound>
Source§fn take_focus(&mut self, source: Direction) -> Result<EventResult, CannotFocus>
fn take_focus(&mut self, source: Direction) -> Result<EventResult, CannotFocus>
Auto Trait Implementations§
impl<T> Freeze for AsyncView<T>where
T: Freeze,
impl<T> !RefUnwindSafe for AsyncView<T>
impl<T> Send for AsyncView<T>
impl<T> Sync for AsyncView<T>
impl<T> Unpin for AsyncView<T>where
T: Unpin,
impl<T> !UnwindSafe for AsyncView<T>
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> Finder for Twhere
T: View,
impl<T> Finder for Twhere
T: View,
Source§fn call_on_all<V, F>(&mut self, sel: &Selector<'_>, callback: F)
fn call_on_all<V, F>(&mut self, sel: &Selector<'_>, callback: F)
sel
. Read moreSource§fn call_on<V, F, R>(&mut self, sel: &Selector<'_>, callback: F) -> Option<R>
fn call_on<V, F, R>(&mut self, sel: &Selector<'_>, callback: F) -> Option<R>
sel
. Read moreSource§fn call_on_name<V, F, R>(&mut self, name: &str, callback: F) -> Option<R>
fn call_on_name<V, F, R>(&mut self, name: &str, callback: F) -> Option<R>
call_on
with a view::Selector::Name
.Source§impl<T> IntoBoxedView for Twhere
T: View,
impl<T> IntoBoxedView for Twhere
T: View,
Source§fn into_boxed_view(self) -> Box<dyn View>
fn into_boxed_view(self) -> Box<dyn View>
Box<View>
.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Resizable for Twhere
T: View,
impl<T> Resizable for Twhere
T: View,
Source§fn resized(
self,
width: SizeConstraint,
height: SizeConstraint,
) -> ResizedView<Self>
fn resized( self, width: SizeConstraint, height: SizeConstraint, ) -> ResizedView<Self>
self
in a ResizedView
with the given size constraints.Source§fn fixed_size<S>(self, size: S) -> ResizedView<Self>
fn fixed_size<S>(self, size: S) -> ResizedView<Self>
self
into a fixed-size ResizedView
.Source§fn fixed_width(self, width: usize) -> ResizedView<Self>
fn fixed_width(self, width: usize) -> ResizedView<Self>
self
into a fixed-width ResizedView
.Source§fn fixed_height(self, height: usize) -> ResizedView<Self>
fn fixed_height(self, height: usize) -> ResizedView<Self>
self
into a fixed-width ResizedView
.Source§fn full_screen(self) -> ResizedView<Self>
fn full_screen(self) -> ResizedView<Self>
self
into a full-screen ResizedView
.Source§fn full_width(self) -> ResizedView<Self>
fn full_width(self) -> ResizedView<Self>
self
into a full-width ResizedView
.Source§fn full_height(self) -> ResizedView<Self>
fn full_height(self) -> ResizedView<Self>
self
into a full-height ResizedView
.Source§fn max_size<S>(self, size: S) -> ResizedView<Self>
fn max_size<S>(self, size: S) -> ResizedView<Self>
self
into a limited-size ResizedView
.Source§fn max_width(self, max_width: usize) -> ResizedView<Self>
fn max_width(self, max_width: usize) -> ResizedView<Self>
self
into a limited-width ResizedView
.Source§fn max_height(self, max_height: usize) -> ResizedView<Self>
fn max_height(self, max_height: usize) -> ResizedView<Self>
self
into a limited-height ResizedView
.Source§fn min_size<S>(self, size: S) -> ResizedView<Self>
fn min_size<S>(self, size: S) -> ResizedView<Self>
self
into a ResizedView
at least sized size
.Source§fn min_width(self, min_width: usize) -> ResizedView<Self>
fn min_width(self, min_width: usize) -> ResizedView<Self>
self
in a ResizedView
at least min_width
wide.Source§fn min_height(self, min_height: usize) -> ResizedView<Self>
fn min_height(self, min_height: usize) -> ResizedView<Self>
self
in a ResizedView
at least min_height
tall.Source§impl<T> Scrollable for Twhere
T: View,
impl<T> Scrollable for Twhere
T: View,
Source§fn scrollable(self) -> ScrollView<Self>
fn scrollable(self) -> ScrollView<Self>
self
in a ScrollView
.