feat: adding iconWorkspaceMap option
fix: use builtin.toJSON fix: removing useless function fix: attrSet Names fix: theme attrSet name fix: jsonFormat type
This commit is contained in:
195
nix/module.nix
195
nix/module.nix
@@ -1,14 +1,28 @@
|
||||
self: { lib, pkgs, config, ... }:
|
||||
self:
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
inherit (lib) types mkIf mkOption mkEnableOption;
|
||||
inherit (lib)
|
||||
types
|
||||
mkIf
|
||||
mkOption
|
||||
mkEnableOption
|
||||
;
|
||||
|
||||
cfg = config.programs.hyprpanel;
|
||||
|
||||
jsonFormat = pkgs.formats.json { };
|
||||
|
||||
# No package option
|
||||
package = if pkgs ? hyprpanel then pkgs.hyprpanel
|
||||
else abort ''
|
||||
package =
|
||||
if pkgs ? hyprpanel then
|
||||
pkgs.hyprpanel
|
||||
else
|
||||
abort ''
|
||||
|
||||
********************************************************************************
|
||||
* HyprPanel *
|
||||
@@ -22,58 +36,37 @@ let
|
||||
'';
|
||||
|
||||
# Shorthand lambda for self-documenting options under settings
|
||||
mkStrOption = default: mkOption { type = types.str; default = default; };
|
||||
mkIntOption = default: mkOption { type = types.int; default = default; };
|
||||
mkBoolOption = default: mkOption { type = types.bool; default = default; };
|
||||
mkStrListOption = default: mkOption { type = types.listOf types.str; default = default; };
|
||||
mkFloatOption = default: mkOption { type = types.float; default = default; };
|
||||
mkStrOption =
|
||||
default:
|
||||
mkOption {
|
||||
type = types.str;
|
||||
default = default;
|
||||
};
|
||||
mkIntOption =
|
||||
default:
|
||||
mkOption {
|
||||
type = types.int;
|
||||
default = default;
|
||||
};
|
||||
mkBoolOption =
|
||||
default:
|
||||
mkOption {
|
||||
type = types.bool;
|
||||
default = default;
|
||||
};
|
||||
mkStrListOption =
|
||||
default:
|
||||
mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = default;
|
||||
};
|
||||
mkFloatOption =
|
||||
default:
|
||||
mkOption {
|
||||
type = types.float;
|
||||
default = default;
|
||||
};
|
||||
|
||||
# TODO: Please merge https://github.com/Jas-SinghFSU/HyprPanel/pull/497
|
||||
# Do not ask what these do...
|
||||
flattenAttrs = attrSet: prefix:
|
||||
let
|
||||
process = key: value:
|
||||
if builtins.isAttrs value then
|
||||
flattenAttrs value "${prefix}${key}."
|
||||
else
|
||||
{ "${prefix}${key}" = value; };
|
||||
in
|
||||
builtins.foldl' (acc: key:
|
||||
acc // process key attrSet.${key}
|
||||
) {} (builtins.attrNames attrSet);
|
||||
|
||||
toNestedValue =
|
||||
let
|
||||
escapeString = s: builtins.replaceStrings [ "\"" ] [ "\\\"" ] s;
|
||||
in
|
||||
value:
|
||||
if builtins.isBool value then
|
||||
if value then "true" else "false"
|
||||
else if (builtins.isInt value || builtins.isFloat value) then
|
||||
builtins.toString value
|
||||
else if builtins.isString value then
|
||||
"\"" + escapeString value + "\""
|
||||
else if builtins.isList value then
|
||||
let
|
||||
items = builtins.map toNestedValue value;
|
||||
in
|
||||
"[\n" + (builtins.concatStringsSep ", " items) + "\n]"
|
||||
else if builtins.isAttrs value then
|
||||
let
|
||||
keys = builtins.attrNames value;
|
||||
toKeyValue = k: "\"${k}\": ${toNestedValue value.${k}}";
|
||||
inner = builtins.concatStringsSep ", " (builtins.map toKeyValue keys);
|
||||
in
|
||||
"{\n" + inner + "\n}"
|
||||
else
|
||||
abort "Unexpected error! Please post a new issue and @benvonh...";
|
||||
|
||||
toNestedObject = attrSet:
|
||||
let
|
||||
keys = builtins.attrNames attrSet;
|
||||
kvPairs = builtins.map (k: "\"${k}\": ${toNestedValue attrSet.${k}}") keys;
|
||||
in
|
||||
"{\n " + builtins.concatStringsSep ",\n " kvPairs + "\n}";
|
||||
in
|
||||
{
|
||||
options.programs.hyprpanel = {
|
||||
@@ -84,13 +77,6 @@ in
|
||||
hyprland.enable = mkEnableOption "Hyprland integration";
|
||||
overwrite.enable = mkEnableOption "overwrite config fix";
|
||||
|
||||
theme = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "catppuccin_mocha";
|
||||
description = "Theme to import (see ../themes/*.json)";
|
||||
};
|
||||
|
||||
override = mkOption {
|
||||
type = types.attrs;
|
||||
default = { };
|
||||
@@ -105,6 +91,7 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
settings = {
|
||||
layout = mkOption {
|
||||
type = jsonFormat.type;
|
||||
default = null;
|
||||
@@ -131,8 +118,6 @@ in
|
||||
'';
|
||||
description = "https://hyprpanel.com/configuration/panel.html";
|
||||
};
|
||||
|
||||
settings = {
|
||||
bar.autoHide = mkStrOption "never";
|
||||
bar.battery.hideLabelWhenFull = mkBoolOption false;
|
||||
bar.battery.label = mkBoolOption true;
|
||||
@@ -156,7 +141,16 @@ in
|
||||
bar.customModules.cava.showIcon = mkBoolOption true;
|
||||
bar.customModules.cava.icon = mkStrOption "";
|
||||
bar.customModules.cava.spaceCharacter = mkStrOption " ";
|
||||
bar.customModules.cava.barCharacters = mkStrListOption [ "▁" "▂" "▃" "▄" "▅" "▆" "▇" "█" ];
|
||||
bar.customModules.cava.barCharacters = mkStrListOption [
|
||||
"▁"
|
||||
"▂"
|
||||
"▃"
|
||||
"▄"
|
||||
"▅"
|
||||
"▆"
|
||||
"▇"
|
||||
"█"
|
||||
];
|
||||
bar.customModules.cava.showActiveOnly = mkBoolOption false;
|
||||
bar.customModules.cava.bars = mkIntOption 10;
|
||||
bar.customModules.cava.channels = mkIntOption 2;
|
||||
@@ -362,6 +356,19 @@ in
|
||||
bar.workspaces.spacing = mkFloatOption 1.0;
|
||||
bar.workspaces.workspaceMask = mkBoolOption false;
|
||||
bar.workspaces.workspaces = mkIntOption 5;
|
||||
bar.workspaces.workspaceIconMap = mkOption {
|
||||
type = jsonFormat.type;
|
||||
default = null;
|
||||
example = ''
|
||||
"1": "<U+EEFE>",
|
||||
"2": "<U+F269>",
|
||||
"3": "<U+EAC4>",
|
||||
"4": "<U+EC1B>",
|
||||
"5": "<U+F02B4>",
|
||||
"6": "<U+F1FF> ",
|
||||
"7": "<U+EB1C>"
|
||||
'';
|
||||
};
|
||||
dummy = mkBoolOption true;
|
||||
hyprpanel.restartAgs = mkBoolOption true;
|
||||
# hyprpanel.restartCommand = mkStrOption "${pkgs.procps}/bin/pkill -u $USER -USR1 hyprpanel; ${package}/bin/hyprpanel";
|
||||
@@ -375,15 +382,20 @@ in
|
||||
menus.clock.weather.unit = mkStrOption "imperial";
|
||||
menus.dashboard.controls.enabled = mkBoolOption true;
|
||||
menus.dashboard.directories.enabled = mkBoolOption true;
|
||||
menus.dashboard.directories.left.directory1.command = mkStrOption "bash -c \"xdg-open $HOME/Downloads/\"";
|
||||
menus.dashboard.directories.left.directory1.command =
|
||||
mkStrOption "bash -c \"xdg-open $HOME/Downloads/\"";
|
||||
menus.dashboard.directories.left.directory1.label = mkStrOption " Downloads";
|
||||
menus.dashboard.directories.left.directory2.command = mkStrOption "bash -c \"xdg-open $HOME/Videos/\"";
|
||||
menus.dashboard.directories.left.directory2.command =
|
||||
mkStrOption "bash -c \"xdg-open $HOME/Videos/\"";
|
||||
menus.dashboard.directories.left.directory2.label = mkStrOption " Videos";
|
||||
menus.dashboard.directories.left.directory3.command = mkStrOption "bash -c \"xdg-open $HOME/Projects/\"";
|
||||
menus.dashboard.directories.left.directory3.command =
|
||||
mkStrOption "bash -c \"xdg-open $HOME/Projects/\"";
|
||||
menus.dashboard.directories.left.directory3.label = mkStrOption " Projects";
|
||||
menus.dashboard.directories.right.directory1.command = mkStrOption "bash -c \"xdg-open $HOME/Documents/\"";
|
||||
menus.dashboard.directories.right.directory1.command =
|
||||
mkStrOption "bash -c \"xdg-open $HOME/Documents/\"";
|
||||
menus.dashboard.directories.right.directory1.label = mkStrOption " Documents";
|
||||
menus.dashboard.directories.right.directory2.command = mkStrOption "bash -c \"xdg-open $HOME/Pictures/\"";
|
||||
menus.dashboard.directories.right.directory2.command =
|
||||
mkStrOption "bash -c \"xdg-open $HOME/Pictures/\"";
|
||||
menus.dashboard.directories.right.directory2.label = mkStrOption " Pictures";
|
||||
menus.dashboard.directories.right.directory3.command = mkStrOption "bash -c \"xdg-open $HOME/\"";
|
||||
menus.dashboard.directories.right.directory3.label = mkStrOption " Home";
|
||||
@@ -410,7 +422,8 @@ in
|
||||
menus.dashboard.shortcuts.right.shortcut1.command = mkStrOption "sleep 0.5 && hyprpicker -a";
|
||||
menus.dashboard.shortcuts.right.shortcut1.icon = mkStrOption "";
|
||||
menus.dashboard.shortcuts.right.shortcut1.tooltip = mkStrOption "Color Picker";
|
||||
menus.dashboard.shortcuts.right.shortcut3.command = mkStrOption "bash -c \"${../scripts/snapshot.sh}\"";
|
||||
menus.dashboard.shortcuts.right.shortcut3.command =
|
||||
mkStrOption "bash -c \"${../scripts/snapshot.sh}\"";
|
||||
menus.dashboard.shortcuts.right.shortcut3.icon = mkStrOption "";
|
||||
menus.dashboard.shortcuts.right.shortcut3.tooltip = mkStrOption "Screenshot";
|
||||
menus.dashboard.stats.enable_gpu = mkBoolOption false;
|
||||
@@ -579,6 +592,12 @@ in
|
||||
theme.matugen_settings.mode = mkStrOption "dark";
|
||||
theme.matugen_settings.scheme_type = mkStrOption "tonal-spot";
|
||||
theme.matugen_settings.variation = mkStrOption "standard_1";
|
||||
theme.name = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "catppuccin_mocha";
|
||||
description = "Theme to import (see ../themes/*.json)";
|
||||
};
|
||||
theme.notification.border_radius = mkStrOption "0.6em";
|
||||
theme.notification.enableShadow = mkBoolOption false;
|
||||
theme.notification.opacity = mkIntOption 100;
|
||||
@@ -606,20 +625,22 @@ in
|
||||
};
|
||||
};
|
||||
|
||||
config = let
|
||||
config =
|
||||
let
|
||||
|
||||
theme =
|
||||
if cfg.theme != ""
|
||||
then builtins.fromJSON (builtins.readFile ../themes/${cfg.theme}.json)
|
||||
else {};
|
||||
if cfg.settings.theme.name != "" then
|
||||
builtins.fromJSON (builtins.readFile ../themes/${cfg.settings.theme.name}.json)
|
||||
else
|
||||
{ };
|
||||
|
||||
flatSet = flattenAttrs (lib.attrsets.recursiveUpdate cfg.settings theme) "";
|
||||
flatSet = lib.attrsets.recursiveUpdate cfg.settings theme;
|
||||
|
||||
mergeSet = flatSet // (flattenAttrs cfg.override "");
|
||||
mergeSet = flatSet // cfg.override;
|
||||
|
||||
fullSet = if cfg.layout == null then mergeSet else mergeSet // cfg.layout;
|
||||
fullSet = if cfg.settings.layout == null then mergeSet else mergeSet // cfg.settings.layout;
|
||||
|
||||
finalConfig = toNestedObject fullSet;
|
||||
finalConfig = builtins.toJSON fullSet;
|
||||
|
||||
hyprpanel-diff = pkgs.writeShellApplication {
|
||||
runtimeInputs = [ pkgs.colordiff ];
|
||||
@@ -634,7 +655,8 @@ in
|
||||
'';
|
||||
};
|
||||
|
||||
in mkIf cfg.enable {
|
||||
in
|
||||
mkIf cfg.enable {
|
||||
|
||||
# nixpkgs.overlays = if cfg.overlay.enable then [ self.overlay ] else null;
|
||||
nixpkgs.overlays = lib.mkIf cfg.overlay.enable [ self.overlay ];
|
||||
@@ -642,10 +664,13 @@ in
|
||||
home.packages = [
|
||||
package
|
||||
hyprpanel-diff
|
||||
(if pkgs ? nerd-fonts.jetbrains-mono
|
||||
then pkgs.nerd-fonts.jetbrains-mono
|
||||
(
|
||||
if pkgs ? nerd-fonts.jetbrains-mono then
|
||||
pkgs.nerd-fonts.jetbrains-mono
|
||||
# NOTE:(benvonh) Remove after next release 25.05
|
||||
else pkgs.nerdfonts.override { fonts = [ "JetBrainsMono" ]; })
|
||||
else
|
||||
pkgs.nerdfonts.override { fonts = [ "JetBrainsMono" ]; }
|
||||
)
|
||||
];
|
||||
|
||||
home.activation =
|
||||
@@ -690,6 +715,8 @@ in
|
||||
# };
|
||||
warnings = if cfg.systemd.enable then [ "The `systemd.enable` option is now obsolete." ] else [ ];
|
||||
|
||||
wayland.windowManager.hyprland.settings.exec-once = mkIf cfg.hyprland.enable [ "${package}/bin/hyprpanel" ];
|
||||
wayland.windowManager.hyprland.settings.exec-once = mkIf cfg.hyprland.enable [
|
||||
"${package}/bin/hyprpanel"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user