cursive-spinner-view 0.1.5

Cursive spinner view
Documentation
use cursive::theme::Color;
use cursive::{
    traits::*,
    views::{Button, Dialog, DummyView, LinearLayout, ViewRef},
    Cursive,
};

use cursive_spinner_view::SpinnerView;

mod themes;
use themes::{DEFAULT, DOTS, GLOBE};

fn main() {
    let mut siv = cursive::default();

    let spinner = SpinnerView::new(siv.cb_sink().clone());
    let status_spinner = spinner.with_name("spinner");

    let spin_buttons = LinearLayout::vertical()
        .child(Button::new("spin up", spin_up))
        .child(Button::new("spin down", spin_down))
        .child(Button::new("stop", stop));

    let theme_buttons = LinearLayout::vertical()
        .child(Button::new("default theme", set_default_theme))
        .child(Button::new("dots theme", set_dots_theme))
        .child(Button::new("Wow! theme", set_wow_theme));

    let buttons = LinearLayout::horizontal()
        .child(spin_buttons)
        .child(DummyView.fixed_width(2))
        .child(theme_buttons);

    let main_layout = LinearLayout::horizontal()
        .child(status_spinner)
        .child(DummyView.fixed_width(5))
        .child(buttons);

    siv.add_layer(
        Dialog::around(main_layout)
            .button("Quit", Cursive::quit)
            .padding_lrtb(5, 1, 1, 1),
    );

    siv.run();
}

fn spin_up(siv: &mut Cursive) {
    get_spinner(siv).spin_up();
}

fn spin_down(siv: &mut Cursive) {
    get_spinner(siv).spin_down();
}

fn stop(siv: &mut Cursive) {
    get_spinner(siv).stop();
}

fn set_default_theme(siv: &mut Cursive) {
    get_spinner(siv)
        .frames(DEFAULT)
        .style(Color::parse("black").unwrap());
}

fn set_dots_theme(siv: &mut Cursive) {
    get_spinner(siv)
        .frames(DOTS)
        .style(Color::parse("black").unwrap());
}

fn set_wow_theme(siv: &mut Cursive) {
    get_spinner(siv)
        .frames(GLOBE)
        .style(Color::parse("blue").unwrap());
}

fn get_spinner(siv: &mut Cursive) -> ViewRef<SpinnerView> {
    siv.find_name::<SpinnerView>("spinner").unwrap()
}