diff --git a/modules/home/workstation/tools/default.nix b/modules/home/workstation/tools/default.nix index 28f2f81..ae307e7 100644 --- a/modules/home/workstation/tools/default.nix +++ b/modules/home/workstation/tools/default.nix @@ -5,5 +5,6 @@ ./ookvolume.nix ./kdeconnect.nix ./ookbrightness.nix + ./zellijMenu.nix ]; } diff --git a/modules/home/workstation/tools/zellijMenu.nix b/modules/home/workstation/tools/zellijMenu.nix new file mode 100644 index 0000000..fbfe5b8 --- /dev/null +++ b/modules/home/workstation/tools/zellijMenu.nix @@ -0,0 +1,240 @@ +{ + 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"; + }; +}