{ lib, config, pkgs, osConfig, ... }: let inherit (lib) mkIf; inherit (osConfig.ooknet.console) multiplexer; inherit (config.programs) rofi; inherit (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" && rofi.enable) { home.packages = [zellijmenu]; ooknet.binds.zellijMenu = "zellijmenu -n"; }; }