63 lines
1.8 KiB
Bash
63 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
|
# Rofi KiCad project launcher
|
|
# Two-step: select folder, then select project
|
|
# Works with both Hyprland and dwm
|
|
|
|
# Define project folders: "Display Name|/path/to/folder"
|
|
PROJECT_FOLDERS=(
|
|
"CNC|/data/3D-Printer/Electronics/PCBs"
|
|
"Keyboard|/data/Keyboard/PCB"
|
|
"eGPU|/data/eGPU"
|
|
)
|
|
|
|
# Step 1: Select project folder
|
|
FOLDER_MENU=""
|
|
for entry in "${PROJECT_FOLDERS[@]}"; do
|
|
FOLDER_MENU+="${entry%%|*}\n"
|
|
done
|
|
|
|
SELECTED_FOLDER=$(echo -e "$FOLDER_MENU" | rofi -dmenu -p "KiCad Folder" -i)
|
|
[ -z "$SELECTED_FOLDER" ] && exit 0
|
|
|
|
# Get the path for selected folder
|
|
FOLDER_PATH=""
|
|
for entry in "${PROJECT_FOLDERS[@]}"; do
|
|
name="${entry%%|*}"
|
|
path="${entry#*|}"
|
|
if [ "$name" = "$SELECTED_FOLDER" ]; then
|
|
FOLDER_PATH="$path"
|
|
break
|
|
fi
|
|
done
|
|
[ -z "$FOLDER_PATH" ] && exit 1
|
|
|
|
# Step 2: Find .kicad_pro files in selected folder
|
|
# Sort by path length (shallowest first) to handle submodule duplicates
|
|
mapfile -t PROJECTS < <(find "$FOLDER_PATH" -name "*.kicad_pro" -type f 2>/dev/null | awk '{print length, $0}' | sort -n | cut -d' ' -f2-)
|
|
|
|
if [ ${#PROJECTS[@]} -eq 0 ]; then
|
|
rofi -e "No KiCad projects found in $FOLDER_PATH"
|
|
exit 1
|
|
fi
|
|
|
|
# Build menu with duplicate filtering (keep shallowest path for each project name)
|
|
declare -A SEEN_PROJECTS
|
|
MENU=""
|
|
for project in "${PROJECTS[@]}"; do
|
|
name=$(basename "$project" .kicad_pro)
|
|
# Skip if we've already seen this project name (deeper path = submodule)
|
|
if [ -z "${SEEN_PROJECTS[$name]}" ]; then
|
|
SEEN_PROJECTS[$name]="$project"
|
|
MENU+="$name\n"
|
|
fi
|
|
done
|
|
|
|
# Show rofi menu
|
|
SELECTED=$(echo -e "$MENU" | rofi -dmenu -p "Project" -i)
|
|
[ -z "$SELECTED" ] && exit 0
|
|
|
|
# Launch selected project
|
|
PROJECT_PATH="${SEEN_PROJECTS[$SELECTED]}"
|
|
if [ -n "$PROJECT_PATH" ]; then
|
|
kicad-launch "$PROJECT_PATH"
|
|
fi
|