Skip to content

Commit

Permalink
Dev (#9)
Browse files Browse the repository at this point in the history
* added new predefined frames
* reworked stop and persist
* docs updates
  • Loading branch information
Arteiii authored Apr 5, 2024
1 parent 1ed444e commit 71999b0
Show file tree
Hide file tree
Showing 10 changed files with 715 additions and 187 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ readme = "README.md"
categories = ["command-line-utilities", "command-line-interface"]


description = "easy to use cli animation lib (Yet Another Spinner Lib)"
description = "easy to use cli animation lib (Yet Another Spinner Lib ) 81+ predefined"
repository = "https://github.com/Arteiii/zenity"
keywords = ["console", "animations", "cli", "spinner", "loading"]
homepage = "https://arteiii.github.io"
Expand All @@ -18,4 +18,4 @@ homepage = "https://arteiii.github.io"
crossterm = "0.27.0"

[dev-dependencies]
unicode-icons = "1.0.0"
unicode-icons = "1.0.1"
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ easy to use cli animation lib based on crossterm

Do you often find yourself gazing into the void of your terminal, wondering if your computer has decided to take a coffee break without notifying you?

81+ predefined animations

[List Of Animations](https://docs.rs/zenity/1.0.3/zenity/spinner/struct.PreDefined.html)


## Introducing

After countless late nights (1) spent wrestling with terminal buffers and ASCII art,
Expand Down
184 changes: 105 additions & 79 deletions examples/all.rs
Original file line number Diff line number Diff line change
@@ -1,91 +1,117 @@
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread::sleep;
use std::time::Duration;
use zenity::{spinner::PreDefined, LoadingAnimation};

fn main() {
preview_material();
preview_aesthetic_spin();
preview_aesthetic_load();
preview_dot_spinner1();
preview_dot_spinner2();
preview_dot_spinner3();
preview_dot_spinner4();
preview_dot_spinner5();
preview_kaomoji();
preview_clock();
preview_bouncing_bar();
}
use zenity::{spinner::PreDefined, LoadingAnimation};

fn preview_dot_spinner1() {
println!("dot_spinner1");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::dot_spinner1(false));
sleep(Duration::from_secs(5));
}
static TOTAL_ANIMATIONS: AtomicUsize = AtomicUsize::new(0);

fn preview_dot_spinner2() {
{
// so the custom loading animation runs out of scope
println!("dot_spinner2(false)");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::dot_spinner2(false));
macro_rules! test_predefined_animation {
($animation:expr, $text:expr) => {{
let mut custom_loading_animation = LoadingAnimation::new($animation);
custom_loading_animation.set_text($text);
sleep(Duration::from_secs(5));
}

println!("dot_spinner2(true)");
// invert active
let _custom_loading_animation = LoadingAnimation::new(PreDefined::dot_spinner2(true));
sleep(Duration::from_secs(5));
}

fn preview_dot_spinner3() {
println!("dot_spinner3");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::dot_spinner3(false));
sleep(Duration::from_secs(5));
}

fn preview_dot_spinner4() {
println!("dot_spinner4");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::dot_spinner4(false));
sleep(Duration::from_secs(5));
}

fn preview_dot_spinner5() {
println!("dot_spinner5");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::dot_spinner5(false));
sleep(Duration::from_secs(5));
}

fn preview_kaomoji() {
println!("kaomoji");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::kaomoji(false));
sleep(Duration::from_secs(5));
}
custom_loading_animation.stop_and_persist(None, None, None);

fn preview_aesthetic_spin() {
println!("aesthetic");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::aesthetic_spin(false));
sleep(Duration::from_secs(5));
TOTAL_ANIMATIONS.fetch_add(1, Ordering::Relaxed);
}};
}

fn preview_aesthetic_load() {
println!("aesthetic");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::aesthetic_load(false));
sleep(Duration::from_secs(5));
}

fn preview_clock() {
println!("clock");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::clock(false));
sleep(Duration::from_secs(5));
}
fn main() {
test_predefined_animation!(PreDefined::speaker(false), "speaker");

fn preview_bouncing_bar() {
println!("bouncing_bar");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::bouncing_bar(false));
sleep(Duration::from_secs(5));
}
test_predefined_animation!(PreDefined::finger_dance(false), "finger_dance");
test_predefined_animation!(PreDefined::fist_bump(false), "fist_bump");
test_predefined_animation!(PreDefined::mind_blown(false), "mind_blown");
test_predefined_animation!(PreDefined::dots_simple_big1(false), "dots_simple_big1");
test_predefined_animation!(PreDefined::dots_simple_big2(false), "dots_simple_big2");
test_predefined_animation!(PreDefined::dots_simple_big3(false), "dots_simple_big3");
test_predefined_animation!(PreDefined::dots_simple_big4(false), "dots_simple_big4");
test_predefined_animation!(PreDefined::nade(false), "nade");
test_predefined_animation!(PreDefined::christmas_tree(false), "christmas_tree");
test_predefined_animation!(PreDefined::weather(false), "weather");
test_predefined_animation!(PreDefined::raining(false), "raining");
test_predefined_animation!(PreDefined::runner(false), "runner");
test_predefined_animation!(PreDefined::hearts(false), "hearts");
test_predefined_animation!(PreDefined::smiley(false), "smiley");
test_predefined_animation!(PreDefined::monkey(false), "monkey");
test_predefined_animation!(PreDefined::bouncing_ball(false), "bouncing_ball");
test_predefined_animation!(PreDefined::square_corners(false), "square_corners");
test_predefined_animation!(PreDefined::circle_corners(false), "circle_corners");
test_predefined_animation!(PreDefined::circle_halves(false), "circle_halves");
test_predefined_animation!(PreDefined::circle(false), "circle");
test_predefined_animation!(PreDefined::arc(false), "arc");
test_predefined_animation!(PreDefined::binary(false), "binary");
test_predefined_animation!(PreDefined::flip(false), "flip");
test_predefined_animation!(PreDefined::star1(false), "star1");
test_predefined_animation!(PreDefined::star2(false), "star2");
test_predefined_animation!(PreDefined::dots_simple1(false), "dots_simple1");
test_predefined_animation!(PreDefined::dots_simple2(false), "dots_simple2");
test_predefined_animation!(PreDefined::dot_spinner1(false), "dot_spinner1");
test_predefined_animation!(PreDefined::dot_spinner2(false), "dot_spinner2");
test_predefined_animation!(PreDefined::dot_spinner3(false), "dot_spinner3");
test_predefined_animation!(PreDefined::dot_spinner4(false), "dot_spinner4");
test_predefined_animation!(PreDefined::dot_spinner5(false), "dot_spinner5");
test_predefined_animation!(PreDefined::dot_spinner6(false), "dot_spinner6");
test_predefined_animation!(PreDefined::dot_spinner7(false), "dot_spinner7");
test_predefined_animation!(PreDefined::dot_spinner8(false), "dot_spinner8");
test_predefined_animation!(PreDefined::dot_spinner9(false), "dot_spinner9");
test_predefined_animation!(PreDefined::dot_spinner10(false), "dot_spinner10");
test_predefined_animation!(PreDefined::dot_spinner11(false), "dot_spinner11");
test_predefined_animation!(PreDefined::toggle(false), "toggle");
test_predefined_animation!(PreDefined::toggle2(false), "toggle2");
test_predefined_animation!(PreDefined::toggle3(false), "toggle3");
test_predefined_animation!(PreDefined::toggle4(false), "toggle4");
test_predefined_animation!(PreDefined::toggle5(false), "toggle5");
test_predefined_animation!(PreDefined::toggle6(false), "toggle6");
test_predefined_animation!(PreDefined::toggle7(false), "toggle7");
test_predefined_animation!(PreDefined::toggle8(false), "toggle8");
test_predefined_animation!(PreDefined::toggle9(false), "toggle9");
test_predefined_animation!(PreDefined::toggle10(false), "toggle10");
test_predefined_animation!(PreDefined::toggle11(false), "toggle11");
test_predefined_animation!(PreDefined::toggle12(false), "toggle12");
test_predefined_animation!(PreDefined::toggle13(false), "toggle13");
test_predefined_animation!(PreDefined::stack(false), "stack");
test_predefined_animation!(PreDefined::big_loading_bar(false), "big_loading_bar");
test_predefined_animation!(PreDefined::dot_bounce(false), "dot_bounce");
test_predefined_animation!(PreDefined::fractions(false), "fractions");
test_predefined_animation!(PreDefined::wall_bounce_line(false), "wall_bounce_line");
test_predefined_animation!(PreDefined::wall_bounce(false), "wall_bounce");
test_predefined_animation!(PreDefined::earth(false), "earth");
test_predefined_animation!(PreDefined::arrow_row(false), "arrow_row");
test_predefined_animation!(
PreDefined::short_loading_bar_with_arrow(false),
"short_loading_bar_with_arrow"
);
test_predefined_animation!(
PreDefined::loading_bar_with_arrow(false),
"loading_bar_with_arrow"
);
test_predefined_animation!(PreDefined::block(false), "block");
test_predefined_animation!(PreDefined::block_spinn(false), "block_spinn");
test_predefined_animation!(PreDefined::line(false), "line");
test_predefined_animation!(PreDefined::line2(false), "line2");
test_predefined_animation!(PreDefined::moon(false), "moon");
test_predefined_animation!(PreDefined::kaomoji(false), "kaomoji");
test_predefined_animation!(PreDefined::aesthetic_spin(false), "aesthetic_spin");
test_predefined_animation!(PreDefined::aesthetic_load(false), "aesthetic_load");
test_predefined_animation!(PreDefined::clock(false), "clock");
test_predefined_animation!(PreDefined::small_bouncing_bar(false), "small_bouncing_bar");
test_predefined_animation!(PreDefined::small_loading_bar(false), "small_loading_bar");
test_predefined_animation!(PreDefined::material(false), "material");
test_predefined_animation!(PreDefined::arrow_spinn(false), "arrow_spinn");
test_predefined_animation!(PreDefined::line_spinner(false), "line_spinner");
test_predefined_animation!(PreDefined::corner(false), "corner");
test_predefined_animation!(
PreDefined::line_spinner_simple(false),
"line_spinner_simple"
);
test_predefined_animation!(PreDefined::abc(false), "abc");
test_predefined_animation!(PreDefined::big_arrow_spinn(false), "big_arrow_spinn");
test_predefined_animation!(PreDefined::japanese(false), "japanese");

fn preview_material() {
println!("material");
let _custom_loading_animation = LoadingAnimation::new(PreDefined::material(false));
sleep(Duration::from_secs(5));
println!(
"Total Animations: {}",
TOTAL_ANIMATIONS.load(Ordering::Relaxed)
);
}
40 changes: 0 additions & 40 deletions examples/multi_load.rs

This file was deleted.

27 changes: 18 additions & 9 deletions src/animations/animation.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
use crossterm::style::{ContentStyle, Print, ResetColor, SetStyle};
use crossterm::{cursor, execute, terminal};
use std::io::stdout;
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;

use crossterm::style::{ContentStyle, Print, ResetColor, SetStyle};
use crossterm::{cursor, execute, terminal};

use super::frames::spinner::Frames;

/// spinner struct encapsulating the spinner animation
pub struct Spinner {
frames: Frames,
frames: Arc<Mutex<Frames>>,
should_stop: Arc<Mutex<bool>>,
text: Arc<Mutex<Option<String>>>,
animation_style: Arc<Mutex<ContentStyle>>,
Expand All @@ -21,7 +22,7 @@ pub struct Spinner {
impl Spinner {
/// creates a new instance of Spinner
pub fn new(
frames: Frames,
frames: Arc<Mutex<Frames>>,
should_stop: Arc<Mutex<bool>>,
text: Arc<Mutex<Option<String>>>,
animation_style: Arc<Mutex<ContentStyle>>,
Expand All @@ -45,6 +46,8 @@ impl Spinner {
let mut frame_index = 0;
let longest_frame_len = self
.frames
.lock()
.unwrap()
.frames
.iter()
.map(|frame| frame.len())
Expand All @@ -55,13 +58,13 @@ impl Spinner {
stdout(),
terminal::Clear(terminal::ClearType::CurrentLine),
cursor::MoveToColumn(0),
cursor::Hide
cursor::Hide, // hide cursor
)
.unwrap(); // hide cursor
.unwrap();

while !*self.should_stop.lock().unwrap() {
self.display_frame(&mut frame_index);
thread::sleep(Duration::from_millis(self.frames.speed_ms));
thread::sleep(Duration::from_millis(self.frames.lock().unwrap().speed_ms));
}

self.display_end_sequence();
Expand All @@ -76,7 +79,11 @@ impl Spinner {

/// displays a frame of the spinner animation
fn display_frame(&self, frame_index: &mut usize) {
let frame = &self.frames.frames[*frame_index];
let frame = {
let frames = self.frames.lock().unwrap();
let frame = &frames.frames[*frame_index];
frame.to_owned()
};

execute!(
stdout(),
Expand All @@ -98,7 +105,7 @@ impl Spinner {
)
.unwrap();

*frame_index = (*frame_index + 1) % self.frames.frames.len();
*frame_index = (*frame_index + 1) % self.frames.lock().unwrap().frames.len();
}

/// displays the end sequence of the spinner animation
Expand Down Expand Up @@ -139,6 +146,8 @@ impl Spinner {
Print("\r"),
)
.unwrap();
} else {
execute!(stdout(), Print("\n"),).unwrap();
}
}
}
Loading

0 comments on commit 71999b0

Please sign in to comment.