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
#!/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 |