You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
3.3 KiB

//! A simple character spinner for bars with no known size
use super::*;
/// A single character spinner with optional title that can be told to spin whenever it wants. It implements `Spinner` trait, and is the default spinner.
///
/// The spinner takes up a line, and renders it's spinner on the end of its title. Calling the `Spinner::bump()` function will cause the character sequence to advance.
///
/// # Usage
/// To use the spinner you can provide it a `Wheel` (see [[wheel]] module), or it implements the `Default` trait, creating a traditional looking spinner (`|/-\`)
///
/// ```rust
/// # use termprogress::prelude::*;
/// let mut spin = Spin::default(); //Default new spinner without a title.
/// ```
///
/// # How it looks
/// It renders in the terminal like:
/// `This is a spinner /`
pub struct Spin
{
title: String,
current: char,
chars: wheel::WheelIntoIter,
}
impl Spin
{
/// Create a new spinner with title and wheel.
///
/// To give it the default wheel, you can pass `whl` `Default::default()` to use the default one.
pub fn with_title(title: &str, whl: wheel::Wheel) -> Self
{
let mut chars = whl.into_iter();
let current = chars.next().unwrap();
Self {
title: title.to_string(),
current,
chars,
}
}
/// Create a new blank spinner with a wheel
///
/// # Example
/// ```rust
/// # use termprogress::prelude::*;
/// Spin::new(Default::default()); // Create a spinner with the default wheel ('|/-\')
/// ```
pub fn new(whl: wheel::Wheel) -> Self
{
let mut chars = whl.into_iter();
let current = chars.next().unwrap();
Self {
title: String::new(),
current,
chars,
}
}
/// Consume the spinner and complete it. Removes the spin character.
pub fn complete(self) {
println!("{} ", (8u8 as char));
}
/// Consume the spinner and complete it with a message. Removes the spin character and then prints the message.
pub fn complete_with(self, msg: &str)
{
println!("{}{}", (8u8 as char), msg);
}
}
impl Default for Spin
{
fn default() -> Self
{
Self {
title: String::new(),
chars: wheel::Wheel::default().into_iter(),
current: '|',
}
}
}
impl Display for Spin
{
fn refresh(&self)
{
print!("\r{} {}", self.title, self.current);
flush!();
}
fn blank(&self)
{
print!("\r{} \r", " ".repeat(self.title.chars().count()));
flush!();
}
fn get_title(&self) -> &str
{
&self.title[..]
}
fn set_title(&mut self, from: &str)
{
self.blank();
self.title = from.to_string();
self.refresh();
}
fn update_dimensions(&mut self, _to:usize){}
fn println(&self, string: &str)
{
self.blank();
println!("{}", string);
self.refresh();
}
}
impl Spinner for Spin
{
fn bump(&mut self)
{
self.current = self.chars.next().unwrap();
self.refresh();
}
}
impl WithTitle for Spin
{
#[inline]
fn with_title(self, t: impl AsRef<str>) -> Self
{
Self {
title: t.as_ref().to_owned(),
..self
}
}
#[inline]
fn add_title(&mut self, t: impl AsRef<str>)
{
self.title = t.as_ref().to_owned();
// Self::with_title(t.as_ref(), Default::default())
}
#[inline] fn update(&mut self){}
#[inline] fn complete(self)
{
Spin::complete(self)
}
}