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";
 | 
						|
  };
 | 
						|
}
 |