universe/home/programs/graphical/waybar/default.nix
2025-03-03 00:00:20 +05:00

360 lines
9.9 KiB
Nix

{
pkgs,
config,
lib,
...
}:
with lib; let
cfg = config.universe.de.waybar;
music-script = pkgs.callPackage ./scripts/music {};
in {
options.universe.de.waybar = {
enable = mkEnableOption "waybar";
settings = {
radiuses = {
outer = mkOption {
type = types.int;
default = 100;
};
inner = mkOption {
type = types.int;
default = 40;
};
bar = mkOption {
type = types.int;
default = 25;
};
};
gapps = {
outer = mkOption {
type = types.int;
default = 6;
};
inner = mkOption {
type = types.int;
default = 8;
};
chips = mkOption {
type = types.int;
default = 4;
};
};
sizes = {
icons = mkOption {
type = types.int;
default = 20;
};
text = mkOption {
type = types.int;
default = 15;
};
};
};
};
config = mkIf cfg.enable {
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = {
main = {
name = "main";
layer = "top";
position = "bottom";
height = 50;
width = 1800;
spacing = 0;
margin-top = -15;
margin-bottom = 0;
modules-left = [
"tray"
"custom/cpu"
"cpu"
"custom/memory"
"memory"
"custom/player-btn-play"
"custom/player-text"
];
modules-center = [
"hyprland/workspaces"
];
modules-right = [
"wireplumber#icon"
"wireplumber#text"
"custom/language"
"hyprland/language"
"custom/clock"
"clock"
"custom/date"
"clock#date"
];
"tray" = {
cfg.sizes.icons = 15;
spacing = 16;
};
"custom/cpu" = {
tooltip = false;
format = "";
};
"cpu" = {
interval = 1;
format = "{usage}%";
};
"custom/memory" = {
tooltip = false;
format = "";
};
"memory" = {
interval = 1;
format = "{used:0.1f}Gb";
};
"custom/player-btn-prev" = {
tooltip = false;
on-click = "${pkgs.playerctl}/bin/playerctl previous";
format = "{}";
return-type = "json";
exec = "${music-script}/bin/main.py --icon-text ''";
};
"custom/player-btn-play" = {
tooltip = false;
format = "{}";
max-length = 40;
return-type = "json";
on-click = "${pkgs.playerctl}/bin/playerctl play-pause";
exec = "${music-script}/bin/main.py --icon";
};
"custom/player-btn-next" = {
tooltip = false;
on-click = "${pkgs.playerctl}/bin/playerctl next";
format = "{}";
return-type = "json";
exec = "${music-script}/bin/main.py --icon-text ''";
};
"custom/player-text" = {
tooltip-format = "{}";
format = "{}";
max-length = 40;
return-type = "json";
escape = false;
exec = "${music-script}/bin/main.py";
};
"hyprland/workspaces" = {
format = "{name}";
on-click = "activate";
tooltip = false;
"persistent_workspaces" = {
"*" = [];
};
};
"wireplumber#icon" = {
tooltip = false;
scroll-step = 2;
format = "{icon}";
format-icons = ["" "" ""];
format-muted = "";
on-click = "pwvucontrol";
max-volume = 100;
};
"wireplumber#text" = {
scroll-step = 2;
format = "{volume}%";
on-click = "pwvucontrol";
max-volume = 100;
};
"custom/language" = {
tooltip = false;
format = "";
};
"hyprland/language" = {
format = "{}";
format-en = "Eng";
format-ru = "Rus";
tooltip-format = "{}";
};
"custom/clock" = {
tooltip = false;
format = "";
};
"clock" = {
tooltip = false;
format = "{:%H:%M}";
timezone = "Asia/Yekaterinburg";
};
"custom/date" = {
tooltip = false;
format = "";
};
"clock#date" = {
tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
format = "{:%b %d}";
timezone = "Asia/Yekaterinburg";
};
};
};
style = let
s = x: builtins.toString x;
half = x: s ((builtins.floor (x * 10 / 2) * 1.0) / 10);
in
with config.lib.stylix.colors.withHashtag;
/*
css
*/
''
* {
font-family: "${config.stylix.fonts.serif.name}";
font-weight: bold;
font-size: ${s cfg.settings.sizes.text}px;
min-height: 0px;
}
window#waybar {
background-color: ${base01};
transition-duration: 0.5s;
border-radius: ${s cfg.settings.radiuses.bar}px ${s cfg.settings.radiuses.bar}px 0px 0px;
/* border-radius: ${s cfg.settings.radiuses.bar}px; */
}
#workspaces {
font-size: 14px;
background-color: ${base00};
margin: ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.inner}px;
padding: 4px;
border-radius: ${s cfg.settings.radiuses.outer}px;
}
#workspaces button {
background-color: ${base00};
color: ${base04};
padding: 2px 4px;
margin: 3px;
border-radius: ${s cfg.settings.radiuses.outer}px;
}
#workspaces button:hover {
background-color: ${base02};
color: ${base06};
}
#workspaces button.active {
background-color: ${base05};
color: ${base01};
}
/* global rules */
#custom-cpu,
#custom-memory,
#custom-language,
#custom-clock,
#custom-date,
#custom-player-btn-play,
#custom-player-btn-prev,
#custom-player-btn-next,
#custom-player-text,
#battery,
#wireplumber,
#tray,
#language,
#clock,
#cpu,
#memory,
#custom-spotify {
background: ${base00};
border-style: none;
border-radius: ${s cfg.settings.radiuses.outer}px;
color: ${base05};
margin: ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.inner}px;
padding: 0px 10px;
}
#tray {
margin: ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.chips}px ${s cfg.settings.gapps.outer}px ${s cfg.settings.gapps.outer}px;
}
/* icon chips */
#wireplumber.icon,
#custom-memory,
#custom-language,
#custom-clock,
#custom-date,
#custom-player-btn-prev,
#custom-player-btn-next,
#custom-player-btn-play,
#custom-cpu {
font-size: ${s cfg.settings.sizes.icons}px;
font-family: "Material Symbols Rounded";
min-width: 25px;
}
/* text chips */
#wireplumber.text,
#memory,
#language,
#clock,
#cpu {
min-width: 40px;
}
/* start chips */
#custom-cpu,
#custom-memory,
#custom-player-btn-play,
#wireplumber.icon,
#custom-language,
#custom-clock,
#custom-date {
padding: 0px 7px 0px 10px;
margin: ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.chips}px ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.inner}px;
border-radius: ${s cfg.settings.radiuses.outer}px ${s cfg.settings.radiuses.inner}px ${s cfg.settings.radiuses.inner}px ${s cfg.settings.radiuses.outer}px
}
/* center chips */
#custom-player-btn-next,
#custom-player-btn-prev {
margin: ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.chips}px ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.chips}px;
border-radius: ${s (cfg.settings.radiuses.inner / 4)}px;
min-width: 15px;
}
/* end chips */
#cpu,
#memory,
#custom-player-text,
#wireplumber.text,
#language,
#clock{
padding: 0px 10px 0px 7px;
margin: ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.inner}px ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.chips}px;
border-radius: ${s cfg.settings.radiuses.inner}px ${s cfg.settings.radiuses.outer}px ${s cfg.settings.radiuses.outer}px ${s cfg.settings.radiuses.inner}px
}
#wireplumber.icon.muted {
color: ${base08};
}
#clock.date {
margin: ${s cfg.settings.gapps.outer}px ${s cfg.settings.gapps.outer}px ${s cfg.settings.gapps.outer}px ${half cfg.settings.gapps.chips}px;
}
'';
};
};
}