234 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { lib, config, pkgs, ... }:
 | |
| 
 | |
| let
 | |
|   inherit (lib) mkIf;
 | |
|   multiplexer = config.ooknet.console.multiplexer;
 | |
|   launcher = config.ooknet.wayland.launcher;
 | |
|   binds = config.ooknet.binds;
 | |
|   zellijmenu = pkgs.writeShellApplication {
 | |
|     name = "zellijmenu";
 | |
|     runtimeInputs = with pkgs; [ 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 -s "$session_name" --layout "$layout"
 | |
|             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" && launcher == "rofi") {
 | |
|     home.packages = [ zellijmenu ];
 | |
|     ooknet.binds.zellijMenu = "zellijmenu -n";
 | |
|   };
 | |
| }
 |