mirror of
https://github.com/nix-community/home-manager.git
synced 2025-03-31 04:04:32 +00:00
godot: init module and lib
This adds the `programs.godot` module with support for editor configurations and text editor themes. It's accompanied by the `godot` library module which exposes constructors for godot data types.
This commit is contained in:
parent
74f0a8546e
commit
2f0999538a
4 changed files with 215 additions and 0 deletions
|
@ -15,4 +15,5 @@ rec {
|
||||||
shell = import ./shell.nix { inherit lib; };
|
shell = import ./shell.nix { inherit lib; };
|
||||||
zsh = import ./zsh.nix { inherit lib; };
|
zsh = import ./zsh.nix { inherit lib; };
|
||||||
nushell = import ./nushell.nix { inherit lib; };
|
nushell = import ./nushell.nix { inherit lib; };
|
||||||
|
godot = import ./godot.nix { inherit lib; };
|
||||||
}
|
}
|
||||||
|
|
76
modules/lib/godot.nix
Normal file
76
modules/lib/godot.nix
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
{ lib }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
concatMapStringsSep escape replaceStrings boolToString floatToString
|
||||||
|
concatStringsSep mapAttrsToList;
|
||||||
|
|
||||||
|
inherit (builtins) mapAttrs;
|
||||||
|
|
||||||
|
mkPrimitive = t: v: {
|
||||||
|
_type = "godotData";
|
||||||
|
type = t;
|
||||||
|
value = v;
|
||||||
|
__toString = self: toString self.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
in rec {
|
||||||
|
isGodotData = v: v._type or "" == "godotData";
|
||||||
|
|
||||||
|
mkValue = v:
|
||||||
|
if builtins.isBool v then
|
||||||
|
mkBool v
|
||||||
|
else if builtins.isInt v then
|
||||||
|
mkInt v
|
||||||
|
else if builtins.isFloat v then
|
||||||
|
mkFloat v
|
||||||
|
else if builtins.isString v then
|
||||||
|
mkString v
|
||||||
|
else if builtins.isList v then
|
||||||
|
mkList v
|
||||||
|
else if builtins.isAttrs v && (v._type or "") == "godotData" then
|
||||||
|
v
|
||||||
|
else if builtins.isAttrs v then
|
||||||
|
mkAttrs v
|
||||||
|
else
|
||||||
|
null;
|
||||||
|
|
||||||
|
mkList = elems:
|
||||||
|
mkPrimitive "list" (map mkValue elems) // {
|
||||||
|
__toString = self: "[${concatMapStringsSep ", " toString self.value}]";
|
||||||
|
};
|
||||||
|
|
||||||
|
mkAttrs = attrs:
|
||||||
|
mkPrimitive "attrs" (mapAttrs (name: mkValue) attrs) // {
|
||||||
|
__toString = self:
|
||||||
|
"{${
|
||||||
|
concatStringsSep ", "
|
||||||
|
(mapAttrsToList (name: value: "${mkString name}: ${value}")
|
||||||
|
self.value)
|
||||||
|
}}";
|
||||||
|
};
|
||||||
|
|
||||||
|
mkBool = v:
|
||||||
|
mkPrimitive "bool" v // {
|
||||||
|
__toString = self: boolToString self.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkString = v:
|
||||||
|
let
|
||||||
|
sanitize = s: replaceStrings [ "\n" ] [ "\\n" ] (escape [ ''"'' "\\" ] s);
|
||||||
|
in mkPrimitive "string" v // {
|
||||||
|
__toString = self: ''"${sanitize self.value}"'';
|
||||||
|
};
|
||||||
|
|
||||||
|
mkInt = mkPrimitive "int";
|
||||||
|
|
||||||
|
mkFloat = mkPrimitive "float";
|
||||||
|
|
||||||
|
mkCall = name: args:
|
||||||
|
mkPrimitive "call" { inherit name args; } // {
|
||||||
|
__toString = self:
|
||||||
|
"${self.value.name}(${
|
||||||
|
concatMapStringsSep ", " toString self.value.args
|
||||||
|
})";
|
||||||
|
};
|
||||||
|
}
|
|
@ -118,6 +118,7 @@ let
|
||||||
./programs/gnome-shell.nix
|
./programs/gnome-shell.nix
|
||||||
./programs/gnome-terminal.nix
|
./programs/gnome-terminal.nix
|
||||||
./programs/go.nix
|
./programs/go.nix
|
||||||
|
./programs/godot.nix
|
||||||
./programs/gpg.nix
|
./programs/gpg.nix
|
||||||
./programs/gradle.nix
|
./programs/gradle.nix
|
||||||
./programs/granted.nix
|
./programs/granted.nix
|
||||||
|
|
137
modules/programs/godot.nix
Normal file
137
modules/programs/godot.nix
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
literalExpression mkEnableOption mkOption mkIf types hm mapAttrsToList
|
||||||
|
splitString mkOptionDefault singleton concatMapStringsSep mkMerge mapAttrs'
|
||||||
|
nameValuePair;
|
||||||
|
|
||||||
|
inherit (hm.godot) mkValue;
|
||||||
|
|
||||||
|
inherit (builtins) concatStringsSep typeOf toString head;
|
||||||
|
|
||||||
|
cfg = config.programs.godot;
|
||||||
|
|
||||||
|
primitiveType = with types; oneOf [ str int float bool attrs ];
|
||||||
|
|
||||||
|
primitiveTypeOrAttrs = with types;
|
||||||
|
either primitiveType (attrsOf primitiveType);
|
||||||
|
|
||||||
|
composedType = with types;
|
||||||
|
either primitiveTypeOrAttrs (listOf primitiveTypeOrAttrs);
|
||||||
|
|
||||||
|
dataType = with types; coercedTo composedType mkValue attrs;
|
||||||
|
|
||||||
|
# See https://docs.godotengine.org/en/latest/contributing/development/file_formats/tscn.html.
|
||||||
|
genResources = concatMapStringsSep "\n\n" genResource;
|
||||||
|
|
||||||
|
genResource = { type, attributes ? { }, data ? { } }:
|
||||||
|
concatStringsSep "\n" ([
|
||||||
|
(genHeader { inherit type attributes; })
|
||||||
|
] ++ (mapAttrsToList (name: value: "${name} = ${value}") data));
|
||||||
|
|
||||||
|
genHeader = { type, attributes }:
|
||||||
|
"[${
|
||||||
|
concatStringsSep " " ([ type ]
|
||||||
|
++ (mapAttrsToList (name: val: "${name}=${mkValue val}") attributes))
|
||||||
|
}]";
|
||||||
|
|
||||||
|
in {
|
||||||
|
meta.maintainers = [ hm.maintainers.bricked ];
|
||||||
|
|
||||||
|
options.programs.godot = {
|
||||||
|
enable = mkEnableOption "Godot";
|
||||||
|
|
||||||
|
package = lib.mkPackageOption pkgs "godot_4" { };
|
||||||
|
|
||||||
|
version = lib.mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Semantic version of the Godot package.
|
||||||
|
'';
|
||||||
|
internal = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
type = with types; nullOr (attrsOf dataType);
|
||||||
|
description = ''
|
||||||
|
Attribute set of godot editor settings.
|
||||||
|
|
||||||
|
For a list of available options see https://docs.godotengine.org/en/stable/classes/class_editorsettings.html.
|
||||||
|
|
||||||
|
Primitive values, lists and attrs work as expected. For function calls, 'lib.hm.godot.mkCall name args' is used.
|
||||||
|
'';
|
||||||
|
example = literalExpression ''
|
||||||
|
{
|
||||||
|
"resource_local_to_scene" = false;
|
||||||
|
"interface/editor/editor_language" = "en";
|
||||||
|
"interface/editor/main_font_size" = 14;
|
||||||
|
"interface/theme/accent_color" = lib.hm.godot.mkCall "Color" [ 0.5, 0.5, 1.0, 1.0 ];
|
||||||
|
"text_editor/theme/color_theme" = "Dracula";
|
||||||
|
}'';
|
||||||
|
};
|
||||||
|
|
||||||
|
textThemes = mkOption {
|
||||||
|
type = with types;
|
||||||
|
attrsOf (submodule ({ name, ... }: {
|
||||||
|
options = {
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The name of the text editor theme.
|
||||||
|
'';
|
||||||
|
example = "Dracula";
|
||||||
|
default = name;
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
type = with types; attrsOf dataType;
|
||||||
|
description = ''
|
||||||
|
Attribute set of text editor theme data.
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
text_color = "cdd6f4ff";
|
||||||
|
number_color = "fab387ff";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
description = ''
|
||||||
|
Attribute set of text editor themes.
|
||||||
|
|
||||||
|
The default text editor theme can be defined using the "text_editor/theme/color_theme" setting.
|
||||||
|
'';
|
||||||
|
default = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.godot.version =
|
||||||
|
mkOptionDefault (head (splitString "-" cfg.package.version));
|
||||||
|
|
||||||
|
home.packages = [ cfg.package ];
|
||||||
|
|
||||||
|
xdg.configFile = {
|
||||||
|
"godot/editor_settings-${cfg.version}.tres".text =
|
||||||
|
mkIf (cfg.settings != null) (genResources [
|
||||||
|
{
|
||||||
|
type = "gd_resource";
|
||||||
|
attributes = {
|
||||||
|
type = "EditorSettings";
|
||||||
|
format = 3;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
type = "resource";
|
||||||
|
data = cfg.settings;
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
} // mapAttrs' (name: theme:
|
||||||
|
nameValuePair "godot/text_editor_themes/${theme.name}.tet" {
|
||||||
|
text = genResource {
|
||||||
|
type = "color_theme";
|
||||||
|
data = theme.settings;
|
||||||
|
};
|
||||||
|
}) cfg.textThemes;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue