239 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
	
		
			6.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   lib,
 | |
|   config,
 | |
|   pkgs,
 | |
|   osConfig,
 | |
|   ...
 | |
| }: let
 | |
|   inherit (lib) mkIf;
 | |
|   inherit (osConfig.ooknet.console) multiplexer;
 | |
|   inherit (config.ooknet) binds;
 | |
|   zellijmenu = pkgs.writeShellApplication {
 | |
|     name = "zellijmenu";
 | |
|     runtimeInputs = with pkgs; [zellij coreutils rofi-wayland];
 | |
|     text =
 | |
|       /*
 | |
|       bash
 | |
|       */
 | |
|       ''
 | |
|         set -e
 | |
| 
 | |
|         type=""
 | |
|         type_dir=""
 | |
|         project_name=""
 | |
|         project_dir=""
 | |
|         session_name=""
 | |
|         layout=""
 | |
|         spawn_terminal=0
 | |
| 
 | |
|         while [[ "$#" -gt 0 ]]; do
 | |
|           case $1 in
 | |
|           -n) spawn_terminal=1 ;;
 | |
|           *)
 | |
|             echo "Unknown parameter: $1" >&2
 | |
|             exit 1
 | |
|             ;;
 | |
|           esac
 | |
|           shift
 | |
|         done
 | |
| 
 | |
|         rofi_cmd() {
 | |
|           MSG=$1
 | |
|           rofi -dmenu -i -mesg "$MSG"
 | |
|         }
 | |
| 
 | |
|         zellij_cmd() {
 | |
|           if [[ "$spawn_terminal" -eq 1 ]]; then
 | |
|             ${binds.terminalLaunch} zellij "$@"
 | |
|           else
 | |
|             zellij "$@"
 | |
|           fi
 | |
|         }
 | |
| 
 | |
|         session_manager() {
 | |
|           session_list() {
 | |
|             zellij ls -s | tr ' ' '\n'
 | |
|           }
 | |
| 
 | |
|           layout_menu() {
 | |
|             layout_list=$(find ~/.config/zellij/layouts -name "*.kdl" | sed 's|.*/||; s/\.kdl$//' | tr ' ' '\n')
 | |
|             echo -e "$layout_list" | rofi_cmd "Select layout for $session_name:"
 | |
|           }
 | |
| 
 | |
|           session_menu() {
 | |
|             echo -e "$(session_list)" | rofi_cmd "Session:"
 | |
|           }
 | |
| 
 | |
|           session_select() {
 | |
|             session_name=$(session_menu)
 | |
|             if [[ -z "$session_name" ]]; then
 | |
|               echo "Nothing selected."
 | |
|               exit 0
 | |
|             fi
 | |
| 
 | |
|             if session_list | grep -qx "$session_name"; then
 | |
|               session_action="select"
 | |
|             else
 | |
|               session_action="create"
 | |
|             fi
 | |
|           }
 | |
| 
 | |
|           selection_menu() {
 | |
|             echo -e "Attach\nDelete\nBack" | rofi_cmd "$session_name action:"
 | |
|           }
 | |
| 
 | |
|           while true; do
 | |
|             session_select
 | |
|             case $session_action in
 | |
|             "create")
 | |
|               layout="$(layout_menu)"
 | |
|               if [ -z "$layout" ]; then
 | |
|                 echo "No layout given"
 | |
|                 continue
 | |
|               fi
 | |
|               zellij_cmd  --layout "$layout" attach -c "$session_name"
 | |
|               break
 | |
|               ;;
 | |
|             "select")
 | |
|               selection=$(selection_menu)
 | |
|               case $selection in
 | |
|               "Attach")
 | |
|                 zellij_cmd attach "$session_name"
 | |
|                 break
 | |
|                 ;;
 | |
|               "Delete") zellij delete-session --force "$session_name" ;;
 | |
|               "Back") echo "Going back." ;;
 | |
|               *) echo "Going Back." ;;
 | |
|               esac
 | |
|               ;;
 | |
|             *) echo "Going Back" ;;
 | |
|             esac
 | |
|           done
 | |
|         }
 | |
| 
 | |
|         project_manager() {
 | |
|           get_project_type() {
 | |
|             while true; do
 | |
|               type=$(echo -e "script\nnix" | rofi_cmd "Select project type:")
 | |
|               case "$type" in
 | |
|               script)
 | |
|                 type_dir="$SCRIPTS"
 | |
|                 break
 | |
|                 ;;
 | |
|               nix)
 | |
|                 type_dir="$NIX_DIR"
 | |
|                 break
 | |
|                 ;;
 | |
|               *)
 | |
|                 echo "Invalid selection, try again."
 | |
|                 ;;
 | |
|               esac
 | |
|             done
 | |
|           }
 | |
| 
 | |
|           get_project_name() {
 | |
|             while true; do
 | |
|               project_name=$(rofi_cmd "Enter project name:")
 | |
|               if [ -z "$project_name" ]; then
 | |
|                 echo "No name provided, try again."
 | |
|               elif [ -d "$type_dir/$project_name" ]; then
 | |
|                 echo "Project already exists, try again."
 | |
|               else
 | |
|                 project_dir="$type_dir/$project_name"
 | |
|                 break
 | |
|               fi
 | |
|             done
 | |
|           }
 | |
| 
 | |
|           get_session_name() {
 | |
|             session_name="$project_name"
 | |
|             if zellij ls | grep -q "^$session_name$"; then
 | |
|               session_name=$(rofi_cmd "Session name '$project_name' in use, enter a new session name:")
 | |
|               if [ -z "$session_name" ]; then
 | |
|                 echo "No session name entered, exiting."
 | |
|                 exit 1
 | |
|               fi
 | |
|             fi
 | |
|           }
 | |
| 
 | |
|           get_layout() {
 | |
|             case "$type" in
 | |
|             script)
 | |
|               layout="script"
 | |
|               ;;
 | |
|             nix)
 | |
|               layout="nix"
 | |
|               ;;
 | |
|             *)
 | |
|               echo "Unknown project type, using default layout."
 | |
|               layout="base"
 | |
|               ;;
 | |
|             esac
 | |
|           }
 | |
| 
 | |
|           select_project() {
 | |
|             project_name=$(find "$type_dir" -maxdepth 1 -mindepth 1 -type d ! -name .git -exec basename {} \; | rofi_cmd "Select project:")
 | |
|             project_dir="$type_dir/$project_name"
 | |
| 
 | |
|             cd "$project_dir" || return 1
 | |
|             get_session_name
 | |
|             get_layout
 | |
|             zellij_cmd -s "$session_name" --layout "$layout"
 | |
|           }
 | |
| 
 | |
|           create_and_start_project() {
 | |
|             mkdir -p "$project_dir"
 | |
|             cd "$project_dir" || return 1
 | |
| 
 | |
|             case "$type" in
 | |
|             script)
 | |
|               echo -e "#!/usr/bin/env bash\necho 'hello world'" >"$project_name.sh"
 | |
|               chmod +x "$project_name.sh"
 | |
|               ;;
 | |
|             nix)
 | |
|               echo "Creating Nix project..."
 | |
|               # still need to implement
 | |
|               ;;
 | |
|             *)
 | |
|               echo "Unknown project type."
 | |
|               return 1
 | |
|               ;;
 | |
|             esac
 | |
| 
 | |
|             get_session_name
 | |
|             get_layout
 | |
|             zellij_cmd -s "$session_name" --layout "$layout"
 | |
|           }
 | |
|           project_action=$(echo -e "Create Project\nSelect Project" | rofi_cmd "Project action:")
 | |
|           case "$project_action" in
 | |
|           "Create Project")
 | |
|             get_project_type
 | |
|             get_project_name
 | |
|             create_and_start_project
 | |
|             ;;
 | |
|           "Select Project")
 | |
|             get_project_type
 | |
|             select_project
 | |
|             ;;
 | |
|           esac
 | |
| 
 | |
|         }
 | |
| 
 | |
|         main() {
 | |
|           main_action=$(echo -e "Projects\nSessions" | rofi_cmd "Choose action:")
 | |
|           case "$main_action" in
 | |
|           "Projects") project_manager ;;
 | |
|           "Sessions") session_manager ;;
 | |
|           *) echo "Invalid option, exiting." ;;
 | |
|           esac
 | |
|         }
 | |
| 
 | |
|         main
 | |
|       '';
 | |
|   };
 | |
| in {
 | |
|   config = mkIf (multiplexer == "zellij") {
 | |
|     home.packages = [zellijmenu];
 | |
|     ooknet.binds.zellijMenu = "zellijmenu -n";
 | |
|   };
 | |
| }
 |