#!/usr/bin/env bash set -euo pipefail source "$(dirname "$0")/../lib/common.sh" usage() { cat </dev/null) && { SELECTED+=("$req") } || { warn "Unknown app: $req (skipping)" } done # ── Mode 2: --all ───────────────────────────────────────────── elif [ "$ALL" -eq 1 ]; then for cat in "${CATEGORIES[@]}"; do for app in ${CAT_APPS[$cat]}; do SELECTED+=("$app") done done # ── Mode 3: interactive TUI ─────────────────────────────────── else section "Optional Applications" if [ "$UNINSTALL" -eq 1 ]; then echo "Select apps to uninstall (y/n for each):" else echo "Select apps to install (y/n for each):" fi echo for cat in "${CATEGORIES[@]}"; do display="${CAT_NAMES[$cat]:-$cat}" echo " $display" for app in ${CAT_APPS[$cat]}; do if [ "$UNINSTALL" -eq 1 ]; then read -rp " Remove ${app}? [y/N]: " yn else read -rp " Install ${app}? [y/N]: " yn fi if [[ "$yn" =~ ^[Yy] ]]; then SELECTED+=("$app") fi done echo done fi # ── Apply action to selected apps ───────────────────────────── [ "${#SELECTED[@]}" -eq 0 ] && { warn "No apps selected"; exit 0; } echo if [ "$UNINSTALL" -eq 1 ]; then section "Uninstalling ${SELECTED[*]}" else section "Installing ${SELECTED[*]}" fi timer_start count=1 total=${#SELECTED[@]} for app in "${SELECTED[@]}"; do cat=$(find_app_category "$app") step "$count" "$total" "$app" if [ "$UNINSTALL" -eq 1 ]; then bash "$APPS_DIR/$cat/$app.sh" uninstall else bash "$APPS_DIR/$cat/$app.sh" fi count=$((count + 1)) echo done echo if [ "$UNINSTALL" -eq 1 ]; then echo "${GREEN}════════════════════════════════════════════${RESET}" echo "${GREEN} Apps uninstalled ($(timer_stop))${RESET}" echo "${GREEN}════════════════════════════════════════════${RESET}" else echo "${GREEN}════════════════════════════════════════════${RESET}" echo "${GREEN} Apps installed ($(timer_stop))${RESET}" echo "${GREEN}════════════════════════════════════════════${RESET}" fi