{ lib, config, ... }: with lib; with lib.my; let cfg = config.modules.desktop.themes; in { options.modules.desktop.themes = with types; { active = mkOption { type = types.nullOr types.str; default = null; description = "Name of the theme to apply; see modules/desktop/themes for a list of valid options"; }; dark = mkOpt bool false; gtkTheme = { name = mkOpt str ""; package = mkPackageOption pkgs "gtk" {}; }; iconTheme = { name = mkOpt str ""; package = mkPackageOption pkgs "icon" {}; }; cursorTheme = { name = mkOpt str ""; package = mkPackageOption pkgs "cursor" {}; }; sddmTheme = { name = mkOpt str ""; package = mkPackageOption pkgs "sddm" {}; }; editor = { vscode = { colorTheme = { name = mkOpt str ""; extension = mkPackageOption pkgs "extension" {}; }; iconTheme = { name = mkOpt str ""; extension = mkPackageOption pkgs "extension" {}; }; }; }; hyprland = { source = mkOpt (nullOr str) null; extraConfig = mkOpt (nullOr str) null; }; waybar = mkOpt str ""; wob = { borderColor = mkOpt (nullOr str) null; backgroundColor = mkOpt (nullOr str) null; barColor = mkOpt (nullOr str) null; }; rofi = mkOpt (nullOr path) null; }; config = mkIf (cfg.active != null) { programs.dconf.enable = true; hm.dconf = { enable = true; settings."org/gnome/desktop/interface".color-scheme = mkIf cfg.dark "prefer-dark"; settings."org/gnome/desktop/interface".gtk-theme = cfg.gtkTheme.name; settings."org/gnome/desktop/interface".icon-theme = cfg.iconTheme.name; settings."org/gnome/desktop/interface".cursor-theme = cfg.cursorTheme.name; settings."org/gnome/shell/extensions/user-theme".name = cfg.gtkTheme.name; }; hm.gtk = { enable = true; cursorTheme = cfg.cursorTheme; iconTheme = cfg.iconTheme; theme = cfg.gtkTheme; }; # unfortunately broken because the catppucciin maintainers removed gtk2 support # TODO: kvantum? #hm.qt = { # enable = true; # platformTheme.name = "gtk"; # style.name = "gtk2"; #}; hm.home.pointerCursor = { gtk.enable = true; x11.enable = true; name = cfg.cursorTheme.name; package = cfg.cursorTheme.package; }; hm.services.dunst.iconTheme = { name = cfg.iconTheme.name; package = cfg.iconTheme.package; }; hm.programs.vscode = { extensions = [ cfg.editor.vscode.colorTheme.extension cfg.editor.vscode.iconTheme.extension ]; userSettings = { "workbench.colorTheme" = cfg.editor.vscode.colorTheme.name; "workbench.iconTheme" = cfg.editor.vscode.iconTheme.name; }; }; hm.wayland.windowManager.hyprland = { settings.source = mkIf (cfg.hyprland.source != null) [ cfg.hyprland.source ]; extraConfig = mkIf (cfg.hyprland.extraConfig != null) cfg.hyprland.extraConfig; }; hm.programs.waybar.style = cfg.waybar; hm.services.wob.settings."" = { border_color = cfg.wob.borderColor; background_color = cfg.wob.backgroundColor; bar_color = cfg.wob.barColor; }; hm.programs.rofi.theme = cfg.rofi; }; }