{ inputs, pkgs, lib, ... }: rec { # Receives attrs like: # { # "Poweroff" = "poweroff"; # "Reload Hyprland" = "hyprctl reload"; # } mkSimpleMenu = let # Makes a string like ''"Poweroff" "Reload Hyprland"'' unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" (builtins.attrNames attrs)}\""; mkCase = option: action: "else if test \"${option}\" = $OPTION\n set ACTION \"${action}\""; cases = attrs: attrs |> builtins.mapAttrs mkCase |> builtins.attrValues |> builtins.concatStringsSep "\n"; in prompt: attrs: pkgs.writeScriptBin "rofi-menu-${prompt}" '' #! ${pkgs.fish}/bin/fish # OPTIONS contains all possible values Rofi will display set OPTIONS ${unpack-options attrs} # We choose a single OPTION using Rofi set OPTION (echo -e (string join "\n" $OPTIONS) | rofi -dmenu -p " ${prompt} " -i) # Check if the chosen OPTION is a valid choice from OPTIONS if not contains $OPTION $OPTIONS exit end # Set a command to execute based on the chosen OPTION if false exit # Easier to generate with this ${cases attrs} else exit end # Execute the command eval $ACTION ''; # TODO: I want to generate the containers menu using the actionsA and actionsB attrs: # - actionsA will be generated from the stuff in oci-containers.containers # - actionsB will be set statically for start, stop, status # Receives attrs like: # { # optionA = "exa -1 -D ~/Notes/TU"; # optionB = "exa -1 -D ~/Notes/TU/$OPTIONA/Lecture | grep \".pdf\""; # commandB = "xdg-open ~/Notes/TU/$OPTIONA/Lecture/$OPTIONB"; # } # # Keys: # - optionA, optionB # Command that generates Rofi options: # exa -1 -D ~/Notes/TU # cat /etc/rofi-vpns # - commandA, commandB # Action to execute after sth. was chosen (mutually excl. with command) # - actionsA, actionsB # Configure actions by lookup (mutually excl. with command): # actionsB = {"status" = "systemctl status..."} # - colorA, colorB # Configure highlighting conditions: # colorA = {"red" = "systemctl ... | grep ..."}; # # Use $OPTIONA and $OPTIONB to use the options chosen by option-command and rofi # Use $EVALA and $EVALB to use the outputs generated by command mkMenu = let in prompt: attrs: ""; }