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.
69 lines
2.0 KiB
69 lines
2.0 KiB
2 years ago
|
#!/bin/sh
|
||
|
|
||
|
# This script displays a menu to install recommended free software.
|
||
|
|
||
|
. colors
|
||
|
|
||
|
# Catch Ctrl-C and exit
|
||
|
handle_ctrl_c() {
|
||
|
trap 'echo exiting; exit' INT
|
||
|
}
|
||
|
|
||
|
handle_ctrl_c
|
||
|
|
||
|
# Calculate the length of a string
|
||
|
strlen() {
|
||
|
echo -n "$1" | wc -c
|
||
|
}
|
||
|
|
||
|
# Calculate maximum of two numbers
|
||
|
max() {
|
||
|
[ "$1" -gt "$2" ] && echo "$1" || echo "$2"
|
||
|
}
|
||
|
|
||
|
script_dir="$(dirname "$0")"
|
||
|
|
||
|
while true; do
|
||
|
max_name_length=0
|
||
|
max_status_length=0
|
||
|
formatted_items=""
|
||
|
|
||
|
# First pass: calculate maximum lengths
|
||
|
for d in $(find "$script_dir" -maxdepth 1 -mindepth 1 -type d); do
|
||
|
name=$(basename "$d")
|
||
|
status=$(command -v "${name}-status" >/dev/null 2>&1 && eval "${name}-status" || echo "coming soon")
|
||
|
|
||
|
# Update maximum lengths
|
||
|
max_name_length=$(max "$max_name_length" "$(strlen "$name")")
|
||
|
max_status_length=$(max "$max_status_length" "$(strlen "$status")")
|
||
|
done
|
||
|
|
||
|
# Second pass: create menu items using the maximum lengths
|
||
|
for d in $(find "$script_dir" -maxdepth 1 -mindepth 1 -type d); do
|
||
|
name=$(basename "$d")
|
||
|
status=$(command -v "${name}-status" >/dev/null 2>&1 && eval "${name}-status" || echo "coming soon")
|
||
|
menu_command="${name}-menu"
|
||
|
|
||
|
# Calculate padding for the name and status
|
||
|
name_padding=$(( max_name_length - $(strlen "$name") ))
|
||
|
status_length=$(strlen "$status")
|
||
|
total_padding=$(( max_status_length - status_length ))
|
||
|
left_padding=$(( total_padding / 2 ))
|
||
|
right_padding=$(( total_padding - left_padding ))
|
||
|
|
||
|
# Build the formatted item string piece by piece
|
||
|
formatted_item="${name}$(printf "%${name_padding}s")"
|
||
|
formatted_item="${formatted_item}$(printf "%${left_padding}s")"
|
||
|
formatted_item="${formatted_item}${status}"
|
||
|
formatted_item="${formatted_item}$(printf "%${right_padding}s")"
|
||
|
|
||
|
# Add formatted item to the list of menu items
|
||
|
formatted_items="${formatted_items} \"${formatted_item}%${menu_command}\""
|
||
|
done
|
||
|
|
||
|
# Add Exit command
|
||
|
formatted_items="${formatted_items} \"Exit%kill -2 $$\""
|
||
|
|
||
|
# Display the menu
|
||
|
eval "menu \"Install Menu:\" $formatted_items"
|
||
|
done
|