112 lines
9.6 KiB
Bash
112 lines
9.6 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
# Source: https://github.com/Silejonu/bash_loading_animations
|
||
|
||
# shellcheck disable=SC2034 # https://github.com/koalaman/shellcheck/wiki/SC2034
|
||
|
||
### Loading animations list ###
|
||
# The first value of an array is the interval (in seconds) between each frame
|
||
|
||
## ASCII animations ##
|
||
# Will work in any terminal, including the TTY.
|
||
BLA_classic=( 0.25 '-' "\\" '|' '/' )
|
||
BLA_box=( 0.2 ┤ ┴ ├ ┬ )
|
||
BLA_bubble=( 0.6 · o O O o · )
|
||
BLA_breathe=( 0.9 ' () ' ' ( ) ' '( )' ' ( ) ' )
|
||
BLA_growing_dots=( 0.5 '. ' '.. ' '...' '.. ' '. ' ' ' )
|
||
BLA_passing_dots=( 0.25 '. ' '.. ' '...' ' ..' ' .' ' ' )
|
||
BLA_metro=( 0.2 '[ ]' '[= ]' '[== ]' '[=== ]' '[ ===]' '[ ==]' '[ =]' )
|
||
BLA_snake=( 0.4 '[= ]' '[~< ]' '[~~= ]' '[~~~< ]' '[ ~~~= ]' '[ ~~~<]' '[ ~~~]' '[ ~~]' '[ ~]' '[ ]' )
|
||
BLA_filling_bar=( 0.25 '█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '███▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '█████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '██████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '███████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '█████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '██████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '███████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '█████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '██████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '███████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '████████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '█████████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '██████████████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒' '███████████████████▒▒▒▒▒▒▒▒▒▒▒▒▒' '████████████████████▒▒▒▒▒▒▒▒▒▒▒▒' '█████████████████████▒▒▒▒▒▒▒▒▒▒▒' '██████████████████████▒▒▒▒▒▒▒▒▒▒' '███████████████████████▒▒▒▒▒▒▒▒▒' '████████████████████████▒▒▒▒▒▒▒▒' '█████████████████████████▒▒▒▒▒▒▒' '██████████████████████████▒▒▒▒▒▒' '███████████████████████████▒▒▒▒▒' '████████████████████████████▒▒▒▒' '█████████████████████████████▒▒▒' '██████████████████████████████▒▒' '███████████████████████████████▒' '████████████████████████████████')
|
||
|
||
## UTF-8 animations ##
|
||
# Require Unicode support (will work in most modern terminals, but not in TTY).
|
||
# Some animations may not render properly with certain fonts.
|
||
BLA_classic_utf8=( 0.25 '—' "\\" '|' '/' )
|
||
BLA_bounce=( 0.3 . · ˙ · )
|
||
BLA_vertical_block=( 0.25 ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ █ ▇ ▆ ▅ ▄ ▃ ▂ ▁ )
|
||
BLA_horizontal_block=( 0.25 ▏ ▎ ▍ ▌ ▋ ▊ ▉ ▉ ▊ ▋ ▌ ▍ ▎ ▏ )
|
||
BLA_quarter=( 0.25 ▖ ▘ ▝ ▗ )
|
||
BLA_triangle=( 0.45 ◢ ◣ ◤ ◥)
|
||
BLA_semi_circle=( 0.1 ◐ ◓ ◑ ◒ )
|
||
BLA_rotating_eyes=( 0.4 ◡◡ ⊙⊙ ⊙⊙ ◠◠ )
|
||
BLA_firework=( 0.4 '⢀' '⠠' '⠐' '⠈' '*' '*' ' ' )
|
||
BLA_braille=( 0.2 ⠁ ⠂ ⠄ ⡀ ⢀ ⠠ ⠐ ⠈ )
|
||
BLA_braille_whitespace=( 0.2 ⣾ ⣽ ⣻ ⢿ ⡿ ⣟ ⣯ ⣷ )
|
||
BLA_trigram=( 0.25 ☰ ☱ ☳ ☶ ☴ )
|
||
BLA_arrow=( 0.15 ▹▹▹▹▹ ▸▹▹▹▹ ▹▸▹▹▹ ▹▹▸▹▹ ▹▹▹▸▹ ▹▹▹▹▸ ▹▹▹▹▹ ▹▹▹▹▹ ▹▹▹▹▹ ▹▹▹▹▹ ▹▹▹▹▹ ▹▹▹▹▹ ▹▹▹▹▹ )
|
||
BLA_bouncing_ball=( 0.4 '(● )' '( ● )' '( ● )' '( ● )' '( ● )' '( ●)' '( ● )' '( ● )' '( ● )' '( ● )' )
|
||
BLA_big_dot=( 0.7 ∙∙∙ ●∙∙ ∙●∙ ∙∙● )
|
||
BLA_modern_metro=( 0.15 ▰▱▱▱▱▱▱ ▰▰▱▱▱▱▱ ▰▰▰▱▱▱▱ ▱▰▰▰▱▱▱ ▱▱▰▰▰▱▱ ▱▱▱▰▰▰▱ ▱▱▱▱▰▰▰ ▱▱▱▱▱▰▰ ▱▱▱▱▱▱▰ ▱▱▱▱▱▱▱ ▱▱▱▱▱▱▱ ▱▱▱▱▱▱▱ ▱▱▱▱▱▱▱ )
|
||
BLA_pong=( 0.35 '▐⠂ ▌' '▐⠈ ▌' '▐ ⠂ ▌' '▐ ⠠ ▌' '▐ ⡀ ▌' '▐ ⠠ ▌' '▐ ⠂ ▌' '▐ ⠈ ▌' '▐ ⠂ ▌' '▐ ⠠ ▌' '▐ ⡀ ▌' '▐ ⠠ ▌' '▐ ⠂ ▌' '▐ ⠈ ▌' '▐ ⠂▌' '▐ ⠠▌' '▐ ⡀▌' '▐ ⠠ ▌' '▐ ⠂ ▌' '▐ ⠈ ▌' '▐ ⠂ ▌' '▐ ⠠ ▌' '▐ ⡀ ▌' '▐ ⠠ ▌' '▐ ⠂ ▌' '▐ ⠈ ▌' '▐ ⠂ ▌' '▐ ⠠ ▌' '▐ ⡀ ▌' '▐⠠ ▌' )
|
||
BLA_earth=( 0.45 🌍 🌎 🌏 )
|
||
BLA_clock=( 0.2 🕛 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 )
|
||
BLA_moon=( 0.8 🌑 🌒 🌓 🌔 🌕 🌖 🌗 🌘 )
|
||
BLA_orange_pulse=( 0.35 🔸 🔶 🟠 🟠 🔶 )
|
||
BLA_blue_pulse=( 0.35 🔹 🔷 🔵 🔵 🔷 )
|
||
BLA_football=( 0.25 ' 👧⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️👦 ' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' '👧 ⚽️ 👦' )
|
||
BLA_blink=( 0.25 😐 😐 😐 😐 😐 😐 😐 😐 😐 😑 )
|
||
BLA_camera=( 0.1 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📷 📸 📷 📸 )
|
||
BLA_sparkling_camera=( 0.1 '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📷 ' '📸✨' '📷 ' '📸✨' )
|
||
BLA_sick=( 0.9 🤢 🤢 🤮 )
|
||
BLA_monkey=( 0.4 🙉 🙈 🙊 🙈 )
|
||
BLA_bomb=( 0.25 '💣 ' ' 💣 ' ' 💣 ' ' 💣' ' 💣' ' 💣' ' 💣' ' 💣' ' 💥' ' ' ' ' )
|
||
|
||
declare -a BLA_active_loading_animation
|
||
|
||
BLA::play_loading_animation_loop() {
|
||
while true ; do
|
||
for frame in "${BLA_active_loading_animation[@]}" ; do
|
||
printf "\r%s" "${frame}"
|
||
sleep "${BLA_loading_animation_frame_interval}"
|
||
done
|
||
done
|
||
}
|
||
|
||
BLA::start_loading_animation() {
|
||
BLA_active_loading_animation=( "${@}" )
|
||
# Extract the delay between each frame from array BLA_active_loading_animation
|
||
BLA_loading_animation_frame_interval="${BLA_active_loading_animation[0]}"
|
||
unset "BLA_active_loading_animation[0]"
|
||
tput civis # Hide the terminal cursor
|
||
BLA::play_loading_animation_loop &
|
||
BLA_loading_animation_pid="${!}"
|
||
}
|
||
|
||
BLA::stop_loading_animation() {
|
||
kill "${BLA_loading_animation_pid}" &> /dev/null
|
||
printf "\n"
|
||
tput cnorm # Restore the terminal cursor
|
||
}
|
||
|
||
|
||
###############################################################################
|
||
################################# USAGE GUIDE #################################
|
||
###############################################################################
|
||
################## Read below for the explanations on how to ##################
|
||
################### show loading animations in your script. ###################
|
||
###############################################################################
|
||
|
||
:<<'EXAMPLES'
|
||
|
||
## Put these lines at the top of your script:
|
||
## (replace /path/to/bash_loading_animations.sh with the appropriate filepath)
|
||
# Load in the functions and animations
|
||
source /path/to/bash_loading_animations.sh
|
||
# Run BLA::stop_loading_animation if the script is interrupted
|
||
trap BLA::stop_loading_animation SIGINT
|
||
|
||
# Show a loading animation for the command "foo"
|
||
BLA::start_loading_animation "${BLA_name_of_the_animation[@]}"
|
||
foo
|
||
BLA::stop_loading_animation
|
||
|
||
# If foo prints some output in the terminal, you may want to add:
|
||
foo 1> /dev/null # hide standard output
|
||
# or
|
||
foo 2> /dev/null # hide error messages
|
||
# or
|
||
foo &> /dev/null # hide all output
|
||
|
||
EXAMPLES
|