display_line() { local width=26 label_with_dots formatted_label # On calcule combien de points ajouter (Largeur - longueur du label) # On utilise une astuce simple : on ajoute 27 points au label et on coupe à 27. label_with_dots="${1}............................" formatted_label="${label_with_dots:0:$width}" # 4. Affichage printf "${COLOR_YELLOW}%s: ${COLOR_WHITE}%s${NONE}\n" "$formatted_label" "$2" } display_conditional_list() { clear # On boucle sur chaque section du JSON echo "$1" | jq -c '.[]' | while read -r section; do local label cmd bin title items has_printed_title=false title=$(echo "$section" | jq -r '.section') items=$(echo "$section" | jq -c '.items[]') # On boucle sur les items de la section while read -r item; do label=$(echo "$item" | jq -r '.label') cmd=$(echo "$item" | jq -r '.cmd') bin=$(echo "$item" | jq -r '.bin // empty') # Vérification de la condition (binaire) if [[ -n "$bin" ]] && ! command -v "$bin" &> /dev/null; then continue fi # Affichage du titre une seule fois si au moins un item est valide if [ "$has_printed_title" = false ]; then echo -e "${COLOR_CYAN}[ $title ]${NONE}" has_printed_title=true fi display_line "$label" "$cmd" done <<< "$items" done } draw_bar() { local pct=$1 # Nettoyage du point si présent (arrondi simple) [[ "$pct" == *"."* ]] && pct=${pct%.*} # Sécurité pour ne pas dépasser 100 ou descendre sous 0 ((pct > 100)) && pct=100 ((pct < 0)) && pct=0 # Sélection automatique de la couleur local color="${COLOR_LIGHT_BLUE}" if (( pct >= 90 )); then color="${COLOR_LIGHT_RED}" elif (( pct >= 70 )); then color="${COLOR_ORANGE}" elif (( pct >= 50 )); then color="${COLOR_YELLOW}" elif (( pct >= 30 )); then color="${COLOR_LIGHT_GREEN}" elif (( pct >= 15 )); then color="${COLOR_GREEN}" fi local size=20 local filled=$((pct * size / 100)) local empty=$((size - filled)) # Affichage de la barre echo -ne "${NONE}[" echo -ne "${color}" for ((i=0; i