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

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.

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.

Mark the maximum allowed width in characters, the loading animation may consume. By default, the width will be inherited by the parent view.

Mark the maximum allowed height in characters, the loading animation may consume. By default, the height will be inherited by the parent view.

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.

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.

Set the maximum allowed width in characters, the loading animation may consume.

Set the maximum allowed height in characters, the loading animation may consume.

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.

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.

Make the loading animation inherit its width from the parent view. This is the default.

Make the loading animation inherit its height from the parent view. This is the default.

Trait Implementations

Executes the destructor for this type. Read more

Draws the view with the given printer (includes bounds) and focus. Read more

Called once the size for this view has been decided. Read more

Should return true if the view content changed since the last call to layout(). Read more

Returns the minimum size the view requires with the given restrictions. Read more

Called when an event is received (key press, mouse event, …). Read more

Runs a closure on the view identified by the given selector. Read more

Moves the focus to the view identified by the given selector. Read more

Attempt to give this view the focus. Read more

What part of the view is important and should be visible? Read more

Returns the type of this view. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Downcast self to a Any.

Downcast self to a mutable Any.

Returns a boxed any from a boxed self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Runs a callback on all views identified by sel. Read more

Runs a callback on the view identified by sel. Read more

Convenient method to use call_on with a view::Selector::Name.

Convenient method to find a view wrapped in an NamedView.

Performs the conversion.

Performs the conversion.

Returns a Box<View>.

Wraps this view into an NamedView with the given id. Read more

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

Wraps self in a ResizedView with the given size constraints.

Wraps self into a fixed-size ResizedView.

Wraps self into a fixed-width ResizedView.

Wraps self into a fixed-width ResizedView.

Wraps self into a full-screen ResizedView.

Wraps self into a full-width ResizedView.

Wraps self into a full-height ResizedView.

Wraps self into a limited-size ResizedView.

Wraps self into a limited-width ResizedView.

Wraps self into a limited-height ResizedView.

Wraps self into a ResizedView at least sized size.

Wraps self in a ResizedView at least min_width wide.

Wraps self in a ResizedView at least min_height tall.

Wraps self in a ScrollView.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Calls the given closure and return the result. Read more

Calls the given closure on self.

Calls the given closure on self.

Calls the given closure if condition == true.