diff --git a/assets/fonts/Font.ttf.import b/assets/fonts/Font.ttf.import
index fd23a39..19acc79 100644
--- a/assets/fonts/Font.ttf.import
+++ b/assets/fonts/Font.ttf.import
@@ -21,6 +21,7 @@ msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
+modulate_color_glyphs=false
hinting=1
subpixel_positioning=1
keep_rounding_remainders=true
diff --git a/assets/icons/ApplyMatrix.svg b/assets/icons/ApplyMatrix.svg
index 7ecd54e..8afa585 100644
--- a/assets/icons/ApplyMatrix.svg
+++ b/assets/icons/ApplyMatrix.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/ApplyMatrix.svg.import b/assets/icons/ApplyMatrix.svg.import
index cb41847..5fa1c0b 100644
--- a/assets/icons/ApplyMatrix.svg.import
+++ b/assets/icons/ApplyMatrix.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cqg7ga6y3m0v1"
-path="res://.godot/imported/ApplyMatrix.svg-4b4fb4d9ae9b2b8df69ee71dac2db3d2.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/ApplyMatrix.svg-4b4fb4d9ae9b2b8df69ee71dac2db3d2.svgtex"
[deps]
source_file="res://assets/icons/ApplyMatrix.svg"
-dest_files=["res://.godot/imported/ApplyMatrix.svg-4b4fb4d9ae9b2b8df69ee71dac2db3d2.ctex"]
+dest_files=["res://.godot/imported/ApplyMatrix.svg-4b4fb4d9ae9b2b8df69ee71dac2db3d2.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Arrow.svg b/assets/icons/Arrow.svg
index 3128945..ebdedde 100644
--- a/assets/icons/Arrow.svg
+++ b/assets/icons/Arrow.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Arrow.svg.import b/assets/icons/Arrow.svg.import
index 3f2255b..4a5f214 100644
--- a/assets/icons/Arrow.svg.import
+++ b/assets/icons/Arrow.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://coda6chhcatal"
-path="res://.godot/imported/Arrow.svg-454f1a120b660e1c200a4fee4bc9d4e9.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Arrow.svg-454f1a120b660e1c200a4fee4bc9d4e9.svgtex"
[deps]
source_file="res://assets/icons/Arrow.svg"
-dest_files=["res://.godot/imported/Arrow.svg-454f1a120b660e1c200a4fee4bc9d4e9.ctex"]
+dest_files=["res://.godot/imported/Arrow.svg-454f1a120b660e1c200a4fee4bc9d4e9.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/BWHandle.svg.import b/assets/icons/BWHandle.svg.import
index 1078b13..fe75941 100644
--- a/assets/icons/BWHandle.svg.import
+++ b/assets/icons/BWHandle.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ksx758sjihau"
-path="res://.godot/imported/BWHandle.svg-9588bc79a1c5a24e3ab185d58c8cacd6.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/BWHandle.svg-9588bc79a1c5a24e3ab185d58c8cacd6.svgtex"
[deps]
source_file="res://assets/icons/BWHandle.svg"
-dest_files=["res://.godot/imported/BWHandle.svg-9588bc79a1c5a24e3ab185d58c8cacd6.ctex"]
+dest_files=["res://.godot/imported/BWHandle.svg-9588bc79a1c5a24e3ab185d58c8cacd6.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Clear.svg b/assets/icons/Clear.svg
index 8d8b36b..16ed450 100644
--- a/assets/icons/Clear.svg
+++ b/assets/icons/Clear.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Clear.svg.import b/assets/icons/Clear.svg.import
index 5eab9d8..856db5c 100644
--- a/assets/icons/Clear.svg.import
+++ b/assets/icons/Clear.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dw7ho4df0uh4p"
-path="res://.godot/imported/Clear.svg-3a871eef1b434e2f0f43b3b19cfa4303.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Clear.svg-3a871eef1b434e2f0f43b3b19cfa4303.svgtex"
[deps]
source_file="res://assets/icons/Clear.svg"
-dest_files=["res://.godot/imported/Clear.svg-3a871eef1b434e2f0f43b3b19cfa4303.ctex"]
+dest_files=["res://.godot/imported/Clear.svg-3a871eef1b434e2f0f43b3b19cfa4303.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Close.svg b/assets/icons/Close.svg
index 4879911..b507d81 100644
--- a/assets/icons/Close.svg
+++ b/assets/icons/Close.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Close.svg.import b/assets/icons/Close.svg.import
index ffddd08..a90efdd 100644
--- a/assets/icons/Close.svg.import
+++ b/assets/icons/Close.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://b0y4h5tuyrais"
-path="res://.godot/imported/Close.svg-ec226890f15a36af010397a4558772f4.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Close.svg-ec226890f15a36af010397a4558772f4.svgtex"
[deps]
source_file="res://assets/icons/Close.svg"
-dest_files=["res://.godot/imported/Close.svg-ec226890f15a36af010397a4558772f4.ctex"]
+dest_files=["res://.godot/imported/Close.svg-ec226890f15a36af010397a4558772f4.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/CodeEditor.svg b/assets/icons/CodeEditor.svg
index eb9075a..dd920fb 100644
--- a/assets/icons/CodeEditor.svg
+++ b/assets/icons/CodeEditor.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/CodeEditor.svg.import b/assets/icons/CodeEditor.svg.import
index 28cc648..1e39cbb 100644
--- a/assets/icons/CodeEditor.svg.import
+++ b/assets/icons/CodeEditor.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://drl587rrnbwo3"
-path="res://.godot/imported/CodeEditor.svg-0e7e65ddead32356f4603181bf8c379c.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/CodeEditor.svg-0e7e65ddead32356f4603181bf8c379c.svgtex"
[deps]
source_file="res://assets/icons/CodeEditor.svg"
-dest_files=["res://.godot/imported/CodeEditor.svg-0e7e65ddead32356f4603181bf8c379c.ctex"]
+dest_files=["res://.godot/imported/CodeEditor.svg-0e7e65ddead32356f4603181bf8c379c.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/CodeOptions.svg b/assets/icons/CodeOptions.svg
index 040ad83..c5a60c4 100644
--- a/assets/icons/CodeOptions.svg
+++ b/assets/icons/CodeOptions.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/CodeOptions.svg.import b/assets/icons/CodeOptions.svg.import
index af09a94..a968e1c 100644
--- a/assets/icons/CodeOptions.svg.import
+++ b/assets/icons/CodeOptions.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dthdjf4v2vlvg"
-path="res://.godot/imported/CodeOptions.svg-494ca15fb7ae22eb042af52beb4677fd.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/CodeOptions.svg-494ca15fb7ae22eb042af52beb4677fd.svgtex"
[deps]
source_file="res://assets/icons/CodeOptions.svg"
-dest_files=["res://.godot/imported/CodeOptions.svg-494ca15fb7ae22eb042af52beb4677fd.ctex"]
+dest_files=["res://.godot/imported/CodeOptions.svg-494ca15fb7ae22eb042af52beb4677fd.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Compress.svg b/assets/icons/Compress.svg
index a6c4f97..595504e 100644
--- a/assets/icons/Compress.svg
+++ b/assets/icons/Compress.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Compress.svg.import b/assets/icons/Compress.svg.import
index 7837613..dc2d395 100644
--- a/assets/icons/Compress.svg.import
+++ b/assets/icons/Compress.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c5kgvxffw35gi"
-path="res://.godot/imported/Compress.svg-108f53e6f660b13f0dc7d2a72d7cff0f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Compress.svg-108f53e6f660b13f0dc7d2a72d7cff0f.svgtex"
[deps]
source_file="res://assets/icons/Compress.svg"
-dest_files=["res://.godot/imported/Compress.svg-108f53e6f660b13f0dc7d2a72d7cff0f.ctex"]
+dest_files=["res://.godot/imported/Compress.svg-108f53e6f660b13f0dc7d2a72d7cff0f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Config.svg b/assets/icons/Config.svg
index 913e7e6..dbb7360 100644
--- a/assets/icons/Config.svg
+++ b/assets/icons/Config.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Config.svg.import b/assets/icons/Config.svg.import
index aef5154..45e9b31 100644
--- a/assets/icons/Config.svg.import
+++ b/assets/icons/Config.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://qm5bah5fncuy"
-path="res://.godot/imported/Config.svg-2731db6c5d5933d8f40d2eb4ac5c9112.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Config.svg-2731db6c5d5933d8f40d2eb4ac5c9112.svgtex"
[deps]
source_file="res://assets/icons/Config.svg"
-dest_files=["res://.godot/imported/Config.svg-2731db6c5d5933d8f40d2eb4ac5c9112.ctex"]
+dest_files=["res://.godot/imported/Config.svg-2731db6c5d5933d8f40d2eb4ac5c9112.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Copy.svg b/assets/icons/Copy.svg
index 2c89667..1122af1 100644
--- a/assets/icons/Copy.svg
+++ b/assets/icons/Copy.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Copy.svg.import b/assets/icons/Copy.svg.import
index 8d9ac91..9aed1dd 100644
--- a/assets/icons/Copy.svg.import
+++ b/assets/icons/Copy.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ccvjkdd0s7rb4"
-path="res://.godot/imported/Copy.svg-ff5026a49044a654e1790e2dfe8ef364.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Copy.svg-ff5026a49044a654e1790e2dfe8ef364.svgtex"
[deps]
source_file="res://assets/icons/Copy.svg"
-dest_files=["res://.godot/imported/Copy.svg-ff5026a49044a654e1790e2dfe8ef364.ctex"]
+dest_files=["res://.godot/imported/Copy.svg-ff5026a49044a654e1790e2dfe8ef364.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/CreateFolder.svg b/assets/icons/CreateFolder.svg
index 7cb8188..d9f2b14 100644
--- a/assets/icons/CreateFolder.svg
+++ b/assets/icons/CreateFolder.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/CreateFolder.svg.import b/assets/icons/CreateFolder.svg.import
index a1eaf7f..8d59e7a 100644
--- a/assets/icons/CreateFolder.svg.import
+++ b/assets/icons/CreateFolder.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bhxd4l64dq2jy"
-path="res://.godot/imported/CreateFolder.svg-913d7182fde1b4bb6fe68c275a28a374.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/CreateFolder.svg-913d7182fde1b4bb6fe68c275a28a374.svgtex"
[deps]
source_file="res://assets/icons/CreateFolder.svg"
-dest_files=["res://.godot/imported/CreateFolder.svg-913d7182fde1b4bb6fe68c275a28a374.ctex"]
+dest_files=["res://.godot/imported/CreateFolder.svg-913d7182fde1b4bb6fe68c275a28a374.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/CreateTab.svg b/assets/icons/CreateTab.svg
index aa7635d..88a07af 100644
--- a/assets/icons/CreateTab.svg
+++ b/assets/icons/CreateTab.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/CreateTab.svg.import b/assets/icons/CreateTab.svg.import
index 1a75ed2..cb3af3f 100644
--- a/assets/icons/CreateTab.svg.import
+++ b/assets/icons/CreateTab.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bnl24bflj771n"
-path="res://.godot/imported/CreateTab.svg-5a4a2c79f40bbfe654b40ae41510476b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/CreateTab.svg-5a4a2c79f40bbfe654b40ae41510476b.svgtex"
[deps]
source_file="res://assets/icons/CreateTab.svg"
-dest_files=["res://.godot/imported/CreateTab.svg-5a4a2c79f40bbfe654b40ae41510476b.ctex"]
+dest_files=["res://.godot/imported/CreateTab.svg-5a4a2c79f40bbfe654b40ae41510476b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Cube.svg b/assets/icons/Cube.svg
index f735d8b..8efc1ab 100644
--- a/assets/icons/Cube.svg
+++ b/assets/icons/Cube.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Cube.svg.import b/assets/icons/Cube.svg.import
index cc7604c..c6655f2 100644
--- a/assets/icons/Cube.svg.import
+++ b/assets/icons/Cube.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://7vnn8bloi26s"
-path="res://.godot/imported/Cube.svg-e714e55d7ae8d48f4e15ef31cdfdb647.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Cube.svg-e714e55d7ae8d48f4e15ef31cdfdb647.svgtex"
[deps]
source_file="res://assets/icons/Cube.svg"
-dest_files=["res://.godot/imported/Cube.svg-e714e55d7ae8d48f4e15ef31cdfdb647.ctex"]
+dest_files=["res://.godot/imported/Cube.svg-e714e55d7ae8d48f4e15ef31cdfdb647.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Cut.svg b/assets/icons/Cut.svg
index cb3389b..89f28c2 100644
--- a/assets/icons/Cut.svg
+++ b/assets/icons/Cut.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Cut.svg.import b/assets/icons/Cut.svg.import
index a43c34c..a4a6363 100644
--- a/assets/icons/Cut.svg.import
+++ b/assets/icons/Cut.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://boihbt4421eu8"
-path="res://.godot/imported/Cut.svg-9fcfd8686ef77f78ed2688cfb69d7644.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Cut.svg-9fcfd8686ef77f78ed2688cfb69d7644.svgtex"
[deps]
source_file="res://assets/icons/Cut.svg"
-dest_files=["res://.godot/imported/Cut.svg-9fcfd8686ef77f78ed2688cfb69d7644.ctex"]
+dest_files=["res://.godot/imported/Cut.svg-9fcfd8686ef77f78ed2688cfb69d7644.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Debug.svg b/assets/icons/Debug.svg
index a22942b..ec10401 100644
--- a/assets/icons/Debug.svg
+++ b/assets/icons/Debug.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Debug.svg.import b/assets/icons/Debug.svg.import
index e691f2b..93178d4 100644
--- a/assets/icons/Debug.svg.import
+++ b/assets/icons/Debug.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bfqay6kyf0guc"
-path="res://.godot/imported/Debug.svg-10e83314f10b353cebaa94e1c70de967.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Debug.svg-10e83314f10b353cebaa94e1c70de967.svgtex"
[deps]
source_file="res://assets/icons/Debug.svg"
-dest_files=["res://.godot/imported/Debug.svg-10e83314f10b353cebaa94e1c70de967.ctex"]
+dest_files=["res://.godot/imported/Debug.svg-10e83314f10b353cebaa94e1c70de967.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Delete.svg b/assets/icons/Delete.svg
index 293ccd3..097e28e 100644
--- a/assets/icons/Delete.svg
+++ b/assets/icons/Delete.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Delete.svg.import b/assets/icons/Delete.svg.import
index 1c35cb2..ae5e0d2 100644
--- a/assets/icons/Delete.svg.import
+++ b/assets/icons/Delete.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cj5x2ti8150ja"
-path="res://.godot/imported/Delete.svg-fb617ed67411fb32cbb6cbd03041205f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Delete.svg-fb617ed67411fb32cbb6cbd03041205f.svgtex"
[deps]
source_file="res://assets/icons/Delete.svg"
-dest_files=["res://.godot/imported/Delete.svg-fb617ed67411fb32cbb6cbd03041205f.ctex"]
+dest_files=["res://.godot/imported/Delete.svg-fb617ed67411fb32cbb6cbd03041205f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DirDesktop.svg b/assets/icons/DirDesktop.svg
index 8022efb..c3bf57c 100644
--- a/assets/icons/DirDesktop.svg
+++ b/assets/icons/DirDesktop.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DirDesktop.svg.import b/assets/icons/DirDesktop.svg.import
index 27e1288..90748f4 100644
--- a/assets/icons/DirDesktop.svg.import
+++ b/assets/icons/DirDesktop.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://7tukdjdfcrwg"
-path="res://.godot/imported/DirDesktop.svg-b7a2d67676de3b45f53c5d5fb9d04055.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DirDesktop.svg-b7a2d67676de3b45f53c5d5fb9d04055.svgtex"
[deps]
source_file="res://assets/icons/DirDesktop.svg"
-dest_files=["res://.godot/imported/DirDesktop.svg-b7a2d67676de3b45f53c5d5fb9d04055.ctex"]
+dest_files=["res://.godot/imported/DirDesktop.svg-b7a2d67676de3b45f53c5d5fb9d04055.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DirDocuments.svg b/assets/icons/DirDocuments.svg
index e1e368e..47f0d95 100644
--- a/assets/icons/DirDocuments.svg
+++ b/assets/icons/DirDocuments.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DirDocuments.svg.import b/assets/icons/DirDocuments.svg.import
index 782e225..72961e4 100644
--- a/assets/icons/DirDocuments.svg.import
+++ b/assets/icons/DirDocuments.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bpmks3pbl18rl"
-path="res://.godot/imported/DirDocuments.svg-df89f18957b052f6296002d8d0a41440.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DirDocuments.svg-df89f18957b052f6296002d8d0a41440.svgtex"
[deps]
source_file="res://assets/icons/DirDocuments.svg"
-dest_files=["res://.godot/imported/DirDocuments.svg-df89f18957b052f6296002d8d0a41440.ctex"]
+dest_files=["res://.godot/imported/DirDocuments.svg-df89f18957b052f6296002d8d0a41440.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DirDownloads.svg b/assets/icons/DirDownloads.svg
index 35b4e58..90c2135 100644
--- a/assets/icons/DirDownloads.svg
+++ b/assets/icons/DirDownloads.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DirDownloads.svg.import b/assets/icons/DirDownloads.svg.import
index 21f39aa..3b08af1 100644
--- a/assets/icons/DirDownloads.svg.import
+++ b/assets/icons/DirDownloads.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://biq08throgeuw"
-path="res://.godot/imported/DirDownloads.svg-5704048e3ee9a7ac86a49b059bd6a059.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DirDownloads.svg-5704048e3ee9a7ac86a49b059bd6a059.svgtex"
[deps]
source_file="res://assets/icons/DirDownloads.svg"
-dest_files=["res://.godot/imported/DirDownloads.svg-5704048e3ee9a7ac86a49b059bd6a059.ctex"]
+dest_files=["res://.godot/imported/DirDownloads.svg-5704048e3ee9a7ac86a49b059bd6a059.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DirMovies.svg b/assets/icons/DirMovies.svg
index c2ecc8b..633cd98 100644
--- a/assets/icons/DirMovies.svg
+++ b/assets/icons/DirMovies.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DirMovies.svg.import b/assets/icons/DirMovies.svg.import
index 36bef7b..5fc7755 100644
--- a/assets/icons/DirMovies.svg.import
+++ b/assets/icons/DirMovies.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bix0itrhquk43"
-path="res://.godot/imported/DirMovies.svg-2d6571f0e062e42f434e9d816096b73f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DirMovies.svg-2d6571f0e062e42f434e9d816096b73f.svgtex"
[deps]
source_file="res://assets/icons/DirMovies.svg"
-dest_files=["res://.godot/imported/DirMovies.svg-2d6571f0e062e42f434e9d816096b73f.ctex"]
+dest_files=["res://.godot/imported/DirMovies.svg-2d6571f0e062e42f434e9d816096b73f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DirMusic.svg b/assets/icons/DirMusic.svg
index 7ba2143..6699489 100644
--- a/assets/icons/DirMusic.svg
+++ b/assets/icons/DirMusic.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DirMusic.svg.import b/assets/icons/DirMusic.svg.import
index 9ad0806..b22fdf8 100644
--- a/assets/icons/DirMusic.svg.import
+++ b/assets/icons/DirMusic.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://yspvgvx4p5i7"
-path="res://.godot/imported/DirMusic.svg-a00acecf89df9970f2430b62ecb1c948.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DirMusic.svg-a00acecf89df9970f2430b62ecb1c948.svgtex"
[deps]
source_file="res://assets/icons/DirMusic.svg"
-dest_files=["res://.godot/imported/DirMusic.svg-a00acecf89df9970f2430b62ecb1c948.ctex"]
+dest_files=["res://.godot/imported/DirMusic.svg-a00acecf89df9970f2430b62ecb1c948.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DirPictures.svg b/assets/icons/DirPictures.svg
index ebf151e..b6501ba 100644
--- a/assets/icons/DirPictures.svg
+++ b/assets/icons/DirPictures.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DirPictures.svg.import b/assets/icons/DirPictures.svg.import
index d4adfe7..b5862ac 100644
--- a/assets/icons/DirPictures.svg.import
+++ b/assets/icons/DirPictures.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ctulth0ybk2l7"
-path="res://.godot/imported/DirPictures.svg-d937c884a9108699c403087d49b8911d.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DirPictures.svg-d937c884a9108699c403087d49b8911d.svgtex"
[deps]
source_file="res://assets/icons/DirPictures.svg"
-dest_files=["res://.godot/imported/DirPictures.svg-d937c884a9108699c403087d49b8911d.ctex"]
+dest_files=["res://.godot/imported/DirPictures.svg-d937c884a9108699c403087d49b8911d.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/DotPatternSegment.svg b/assets/icons/DotPatternSegment.svg
index bfff879..30dfe37 100644
--- a/assets/icons/DotPatternSegment.svg
+++ b/assets/icons/DotPatternSegment.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/DotPatternSegment.svg.import b/assets/icons/DotPatternSegment.svg.import
index 3a89838..a05e33c 100644
--- a/assets/icons/DotPatternSegment.svg.import
+++ b/assets/icons/DotPatternSegment.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bjo2bdb1cgusy"
-path="res://.godot/imported/DotPatternSegment.svg-014783b79e9ccf4aa6aad42fedc56aec.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/DotPatternSegment.svg-014783b79e9ccf4aa6aad42fedc56aec.svgtex"
[deps]
source_file="res://assets/icons/DotPatternSegment.svg"
-dest_files=["res://.godot/imported/DotPatternSegment.svg-014783b79e9ccf4aa6aad42fedc56aec.ctex"]
+dest_files=["res://.godot/imported/DotPatternSegment.svg-014783b79e9ccf4aa6aad42fedc56aec.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Duplicate.svg b/assets/icons/Duplicate.svg
index e8e9323..3765044 100644
--- a/assets/icons/Duplicate.svg
+++ b/assets/icons/Duplicate.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Duplicate.svg.import b/assets/icons/Duplicate.svg.import
index 496fa81..35410f7 100644
--- a/assets/icons/Duplicate.svg.import
+++ b/assets/icons/Duplicate.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c47mt41k028j2"
-path="res://.godot/imported/Duplicate.svg-959ae53cae0657548eb01f107c8bac01.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Duplicate.svg-959ae53cae0657548eb01f107c8bac01.svgtex"
[deps]
source_file="res://assets/icons/Duplicate.svg"
-dest_files=["res://.godot/imported/Duplicate.svg-959ae53cae0657548eb01f107c8bac01.ctex"]
+dest_files=["res://.godot/imported/Duplicate.svg-959ae53cae0657548eb01f107c8bac01.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Edit.svg b/assets/icons/Edit.svg
index b210f32..113aedd 100644
--- a/assets/icons/Edit.svg
+++ b/assets/icons/Edit.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Edit.svg.import b/assets/icons/Edit.svg.import
index 632d472..b83cafd 100644
--- a/assets/icons/Edit.svg.import
+++ b/assets/icons/Edit.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dr2erka82g6j4"
-path="res://.godot/imported/Edit.svg-40006b452883af7dafa16974b9dda14a.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Edit.svg-40006b452883af7dafa16974b9dda14a.svgtex"
[deps]
source_file="res://assets/icons/Edit.svg"
-dest_files=["res://.godot/imported/Edit.svg-40006b452883af7dafa16974b9dda14a.ctex"]
+dest_files=["res://.godot/imported/Edit.svg-40006b452883af7dafa16974b9dda14a.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Expand.svg b/assets/icons/Expand.svg
index e53c7ff..628e878 100644
--- a/assets/icons/Expand.svg
+++ b/assets/icons/Expand.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Expand.svg.import b/assets/icons/Expand.svg.import
index faef64a..11f54cf 100644
--- a/assets/icons/Expand.svg.import
+++ b/assets/icons/Expand.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://0xptbhyrvsk1"
-path="res://.godot/imported/Expand.svg-54a09277a628926ed67d8eb42ef8926e.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Expand.svg-54a09277a628926ed67d8eb42ef8926e.svgtex"
[deps]
source_file="res://assets/icons/Expand.svg"
-dest_files=["res://.godot/imported/Expand.svg-54a09277a628926ed67d8eb42ef8926e.ctex"]
+dest_files=["res://.godot/imported/Expand.svg-54a09277a628926ed67d8eb42ef8926e.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Export.svg b/assets/icons/Export.svg
index bacb145..b32a7c4 100644
--- a/assets/icons/Export.svg
+++ b/assets/icons/Export.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Export.svg.import b/assets/icons/Export.svg.import
index 25bd0d6..dc193a2 100644
--- a/assets/icons/Export.svg.import
+++ b/assets/icons/Export.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://d0uvwj0t44n6v"
-path="res://.godot/imported/Export.svg-6941de360a1bbebc9741d069d3bfeced.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Export.svg-6941de360a1bbebc9741d069d3bfeced.svgtex"
[deps]
source_file="res://assets/icons/Export.svg"
-dest_files=["res://.godot/imported/Export.svg-6941de360a1bbebc9741d069d3bfeced.ctex"]
+dest_files=["res://.godot/imported/Export.svg-6941de360a1bbebc9741d069d3bfeced.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Eyedropper.svg b/assets/icons/Eyedropper.svg
index 973a54b..f0e2ae2 100644
--- a/assets/icons/Eyedropper.svg
+++ b/assets/icons/Eyedropper.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Eyedropper.svg.import b/assets/icons/Eyedropper.svg.import
index 2812627..817c5c3 100644
--- a/assets/icons/Eyedropper.svg.import
+++ b/assets/icons/Eyedropper.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://brff7fx0puj6"
-path="res://.godot/imported/Eyedropper.svg-22a2f037b51e69561fa914953a212e31.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Eyedropper.svg-22a2f037b51e69561fa914953a212e31.svgtex"
[deps]
source_file="res://assets/icons/Eyedropper.svg"
-dest_files=["res://.godot/imported/Eyedropper.svg-22a2f037b51e69561fa914953a212e31.ctex"]
+dest_files=["res://.godot/imported/Eyedropper.svg-22a2f037b51e69561fa914953a212e31.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/FileBroken.svg.import b/assets/icons/FileBroken.svg.import
index 562824b..7e3cb45 100644
--- a/assets/icons/FileBroken.svg.import
+++ b/assets/icons/FileBroken.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cr4fc0hsu58lf"
-path="res://.godot/imported/FileBroken.svg-e9da65d10479a56ef147774312af3ca7.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/FileBroken.svg-e9da65d10479a56ef147774312af3ca7.svgtex"
[deps]
source_file="res://assets/icons/FileBroken.svg"
-dest_files=["res://.godot/imported/FileBroken.svg-e9da65d10479a56ef147774312af3ca7.ctex"]
+dest_files=["res://.godot/imported/FileBroken.svg-e9da65d10479a56ef147774312af3ca7.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Folder.svg.import b/assets/icons/Folder.svg.import
index 1b399a2..88b8803 100644
--- a/assets/icons/Folder.svg.import
+++ b/assets/icons/Folder.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cba8p7b8tjiv3"
-path="res://.godot/imported/Folder.svg-22bb452791dc5b3ede2a4bc12d5c1d9b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Folder.svg-22bb452791dc5b3ede2a4bc12d5c1d9b.svgtex"
[deps]
source_file="res://assets/icons/Folder.svg"
-dest_files=["res://.godot/imported/Folder.svg-22bb452791dc5b3ede2a4bc12d5c1d9b.ctex"]
+dest_files=["res://.godot/imported/Folder.svg-22bb452791dc5b3ede2a4bc12d5c1d9b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/FolderUp.svg b/assets/icons/FolderUp.svg
index 151dc5c..1092fea 100644
--- a/assets/icons/FolderUp.svg
+++ b/assets/icons/FolderUp.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/FolderUp.svg.import b/assets/icons/FolderUp.svg.import
index 106ede5..a3a66d9 100644
--- a/assets/icons/FolderUp.svg.import
+++ b/assets/icons/FolderUp.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://rrhdja8l17cn"
-path="res://.godot/imported/FolderUp.svg-7eb1d635a1955e89cf029a3e96626a9c.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/FolderUp.svg-7eb1d635a1955e89cf029a3e96626a9c.svgtex"
[deps]
source_file="res://assets/icons/FolderUp.svg"
-dest_files=["res://.godot/imported/FolderUp.svg-7eb1d635a1955e89cf029a3e96626a9c.ctex"]
+dest_files=["res://.godot/imported/FolderUp.svg-7eb1d635a1955e89cf029a3e96626a9c.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Gear.svg b/assets/icons/Gear.svg
index b2ce606..914c135 100644
--- a/assets/icons/Gear.svg
+++ b/assets/icons/Gear.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Gear.svg.import b/assets/icons/Gear.svg.import
index d1ec47d..0f27a50 100644
--- a/assets/icons/Gear.svg.import
+++ b/assets/icons/Gear.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ckkkgof1hcbld"
-path="res://.godot/imported/Gear.svg-ca94d59e8c536d42f979019c85e0d8ba.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Gear.svg-ca94d59e8c536d42f979019c85e0d8ba.svgtex"
[deps]
source_file="res://assets/icons/Gear.svg"
-dest_files=["res://.godot/imported/Gear.svg-ca94d59e8c536d42f979019c85e0d8ba.ctex"]
+dest_files=["res://.godot/imported/Gear.svg-ca94d59e8c536d42f979019c85e0d8ba.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/GearOutlined.svg b/assets/icons/GearOutlined.svg
index 0aab8bd..9f39a03 100644
--- a/assets/icons/GearOutlined.svg
+++ b/assets/icons/GearOutlined.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/GearOutlined.svg.import b/assets/icons/GearOutlined.svg.import
index e47d10e..51638b7 100644
--- a/assets/icons/GearOutlined.svg.import
+++ b/assets/icons/GearOutlined.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bhxr0nv6bs5j2"
-path="res://.godot/imported/GearOutlined.svg-9ffca79f703b36dfc1fb5067906e0876.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/GearOutlined.svg-9ffca79f703b36dfc1fb5067906e0876.svgtex"
[deps]
source_file="res://assets/icons/GearOutlined.svg"
-dest_files=["res://.godot/imported/GearOutlined.svg-9ffca79f703b36dfc1fb5067906e0876.ctex"]
+dest_files=["res://.godot/imported/GearOutlined.svg-9ffca79f703b36dfc1fb5067906e0876.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Heart.svg.import b/assets/icons/Heart.svg.import
index a64364d..7829f8e 100644
--- a/assets/icons/Heart.svg.import
+++ b/assets/icons/Heart.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bvm6h1qda67ys"
-path="res://.godot/imported/Heart.svg-0ab6963a35d0b59270531cd65b47ee68.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Heart.svg-0ab6963a35d0b59270531cd65b47ee68.svgtex"
[deps]
source_file="res://assets/icons/Heart.svg"
-dest_files=["res://.godot/imported/Heart.svg-0ab6963a35d0b59270531cd65b47ee68.ctex"]
+dest_files=["res://.godot/imported/Heart.svg-0ab6963a35d0b59270531cd65b47ee68.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Import.svg b/assets/icons/Import.svg
index 7921525..4526cbe 100644
--- a/assets/icons/Import.svg
+++ b/assets/icons/Import.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Import.svg.import b/assets/icons/Import.svg.import
index 63e3e82..27b25e5 100644
--- a/assets/icons/Import.svg.import
+++ b/assets/icons/Import.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://6ymbl3jqersp"
-path="res://.godot/imported/Import.svg-192a814e11a31699451eba5a11b8d95f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Import.svg-192a814e11a31699451eba5a11b8d95f.svgtex"
[deps]
source_file="res://assets/icons/Import.svg"
-dest_files=["res://.godot/imported/Import.svg-192a814e11a31699451eba5a11b8d95f.ctex"]
+dest_files=["res://.godot/imported/Import.svg-192a814e11a31699451eba5a11b8d95f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Info.svg b/assets/icons/Info.svg
index dfdaf68..96b2852 100644
--- a/assets/icons/Info.svg
+++ b/assets/icons/Info.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Info.svg.import b/assets/icons/Info.svg.import
index 447e8eb..be11652 100644
--- a/assets/icons/Info.svg.import
+++ b/assets/icons/Info.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://v0lqyuvo50yq"
-path="res://.godot/imported/Info.svg-b6a970b105b815abf501807a06233c56.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Info.svg-b6a970b105b815abf501807a06233c56.svgtex"
[deps]
source_file="res://assets/icons/Info.svg"
-dest_files=["res://.godot/imported/Info.svg-b6a970b105b815abf501807a06233c56.ctex"]
+dest_files=["res://.godot/imported/Info.svg-b6a970b105b815abf501807a06233c56.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/InsertAfter.svg b/assets/icons/InsertAfter.svg
index ad4c204..997e1ce 100644
--- a/assets/icons/InsertAfter.svg
+++ b/assets/icons/InsertAfter.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/InsertAfter.svg.import b/assets/icons/InsertAfter.svg.import
index 78c9f31..534d7ba 100644
--- a/assets/icons/InsertAfter.svg.import
+++ b/assets/icons/InsertAfter.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c5iyi2abx0ja1"
-path="res://.godot/imported/InsertAfter.svg-ecdb8075972644ee5295e10c7410dd81.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/InsertAfter.svg-ecdb8075972644ee5295e10c7410dd81.svgtex"
[deps]
source_file="res://assets/icons/InsertAfter.svg"
-dest_files=["res://.godot/imported/InsertAfter.svg-ecdb8075972644ee5295e10c7410dd81.ctex"]
+dest_files=["res://.godot/imported/InsertAfter.svg-ecdb8075972644ee5295e10c7410dd81.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/InsertBefore.svg b/assets/icons/InsertBefore.svg
index 2824d8d..281c8e9 100644
--- a/assets/icons/InsertBefore.svg
+++ b/assets/icons/InsertBefore.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/InsertBefore.svg.import b/assets/icons/InsertBefore.svg.import
index 846aa06..ca627c1 100644
--- a/assets/icons/InsertBefore.svg.import
+++ b/assets/icons/InsertBefore.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dav1phw6au0c1"
-path="res://.godot/imported/InsertBefore.svg-8dc67cab8823221d311f91e90cdd6e9b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/InsertBefore.svg-8dc67cab8823221d311f91e90cdd6e9b.svgtex"
[deps]
source_file="res://assets/icons/InsertBefore.svg"
-dest_files=["res://.godot/imported/InsertBefore.svg-8dc67cab8823221d311f91e90cdd6e9b.ctex"]
+dest_files=["res://.godot/imported/InsertBefore.svg-8dc67cab8823221d311f91e90cdd6e9b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Inspector.svg b/assets/icons/Inspector.svg
index befba79..8f95396 100644
--- a/assets/icons/Inspector.svg
+++ b/assets/icons/Inspector.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Inspector.svg.import b/assets/icons/Inspector.svg.import
index 76bd231..c61c9f2 100644
--- a/assets/icons/Inspector.svg.import
+++ b/assets/icons/Inspector.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://oha0oauf4kup"
-path="res://.godot/imported/Inspector.svg-16dc105bb2fde5191bb55e4179b50443.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Inspector.svg-16dc105bb2fde5191bb55e4179b50443.svgtex"
[deps]
source_file="res://assets/icons/Inspector.svg"
-dest_files=["res://.godot/imported/Inspector.svg-16dc105bb2fde5191bb55e4179b50443.ctex"]
+dest_files=["res://.godot/imported/Inspector.svg-16dc105bb2fde5191bb55e4179b50443.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Languages.svg b/assets/icons/Languages.svg
index b6a51bb..784781b 100644
--- a/assets/icons/Languages.svg
+++ b/assets/icons/Languages.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Languages.svg.import b/assets/icons/Languages.svg.import
index 0f5f11f..0f24371 100644
--- a/assets/icons/Languages.svg.import
+++ b/assets/icons/Languages.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c528knojuxbw6"
-path="res://.godot/imported/Languages.svg-56e992e4c3e11801226f5281fef7e603.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Languages.svg-56e992e4c3e11801226f5281fef7e603.svgtex"
[deps]
source_file="res://assets/icons/Languages.svg"
-dest_files=["res://.godot/imported/Languages.svg-56e992e4c3e11801226f5281fef7e603.ctex"]
+dest_files=["res://.godot/imported/Languages.svg-56e992e4c3e11801226f5281fef7e603.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Layouts.svg b/assets/icons/Layouts.svg
index 2eb318c..40c0f57 100644
--- a/assets/icons/Layouts.svg
+++ b/assets/icons/Layouts.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Layouts.svg.import b/assets/icons/Layouts.svg.import
index 8b9c759..4ab31a7 100644
--- a/assets/icons/Layouts.svg.import
+++ b/assets/icons/Layouts.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://b6mqp088ef65"
-path="res://.godot/imported/Layouts.svg-1c07a3528e532f1c03ca36a1edac552d.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Layouts.svg-1c07a3528e532f1c03ca36a1edac552d.svgtex"
[deps]
source_file="res://assets/icons/Layouts.svg"
-dest_files=["res://.godot/imported/Layouts.svg-1c07a3528e532f1c03ca36a1edac552d.ctex"]
+dest_files=["res://.godot/imported/Layouts.svg-1c07a3528e532f1c03ca36a1edac552d.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Link.svg b/assets/icons/Link.svg
index f094400..35f5fb2 100644
--- a/assets/icons/Link.svg
+++ b/assets/icons/Link.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Link.svg.import b/assets/icons/Link.svg.import
index 7d8908e..602d24d 100644
--- a/assets/icons/Link.svg.import
+++ b/assets/icons/Link.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cgxpm1e3v0i3v"
-path="res://.godot/imported/Link.svg-84f27e7b995bc01f3def6f6291cc9881.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Link.svg-84f27e7b995bc01f3def6f6291cc9881.svgtex"
[deps]
source_file="res://assets/icons/Link.svg"
-dest_files=["res://.godot/imported/Link.svg-84f27e7b995bc01f3def6f6291cc9881.ctex"]
+dest_files=["res://.godot/imported/Link.svg-84f27e7b995bc01f3def6f6291cc9881.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Matrix.svg b/assets/icons/Matrix.svg
index bddaa9c..55ae44a 100644
--- a/assets/icons/Matrix.svg
+++ b/assets/icons/Matrix.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Matrix.svg.import b/assets/icons/Matrix.svg.import
index b03ee3e..25e4886 100644
--- a/assets/icons/Matrix.svg.import
+++ b/assets/icons/Matrix.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://crtn52j7mlh11"
-path="res://.godot/imported/Matrix.svg-6cf1c1474bd06db6496e8f3cc865c4b5.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Matrix.svg-6cf1c1474bd06db6496e8f3cc865c4b5.svgtex"
[deps]
source_file="res://assets/icons/Matrix.svg"
-dest_files=["res://.godot/imported/Matrix.svg-6cf1c1474bd06db6496e8f3cc865c4b5.ctex"]
+dest_files=["res://.godot/imported/Matrix.svg-6cf1c1474bd06db6496e8f3cc865c4b5.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Minus.svg b/assets/icons/Minus.svg
index 77fd2c8..5b0c03a 100644
--- a/assets/icons/Minus.svg
+++ b/assets/icons/Minus.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Minus.svg.import b/assets/icons/Minus.svg.import
index b3f5fc2..56ab413 100644
--- a/assets/icons/Minus.svg.import
+++ b/assets/icons/Minus.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c2h5snkvemm4p"
-path="res://.godot/imported/Minus.svg-ad675dfc85c1db1496d38b10f0c0cd89.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Minus.svg-ad675dfc85c1db1496d38b10f0c0cd89.svgtex"
[deps]
source_file="res://assets/icons/Minus.svg"
-dest_files=["res://.godot/imported/Minus.svg-ad675dfc85c1db1496d38b10f0c0cd89.ctex"]
+dest_files=["res://.godot/imported/Minus.svg-ad675dfc85c1db1496d38b10f0c0cd89.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/More.svg b/assets/icons/More.svg
index 67f8928..ca44088 100644
--- a/assets/icons/More.svg
+++ b/assets/icons/More.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/More.svg.import b/assets/icons/More.svg.import
index 1b44a24..6998a2e 100644
--- a/assets/icons/More.svg.import
+++ b/assets/icons/More.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ccbta5q43jobk"
-path="res://.godot/imported/More.svg-5dd0ba59b51b3ab03606873cef088a40.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/More.svg-5dd0ba59b51b3ab03606873cef088a40.svgtex"
[deps]
source_file="res://assets/icons/More.svg"
-dest_files=["res://.godot/imported/More.svg-5dd0ba59b51b3ab03606873cef088a40.ctex"]
+dest_files=["res://.godot/imported/More.svg-5dd0ba59b51b3ab03606873cef088a40.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/MoveDown.svg b/assets/icons/MoveDown.svg
index e0b71db..9630c12 100644
--- a/assets/icons/MoveDown.svg
+++ b/assets/icons/MoveDown.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/MoveDown.svg.import b/assets/icons/MoveDown.svg.import
index 303338f..b7d7168 100644
--- a/assets/icons/MoveDown.svg.import
+++ b/assets/icons/MoveDown.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ciirlvjd2efd3"
-path="res://.godot/imported/MoveDown.svg-f1fb57bee54d2faca78973dd8c78186f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/MoveDown.svg-f1fb57bee54d2faca78973dd8c78186f.svgtex"
[deps]
source_file="res://assets/icons/MoveDown.svg"
-dest_files=["res://.godot/imported/MoveDown.svg-f1fb57bee54d2faca78973dd8c78186f.ctex"]
+dest_files=["res://.godot/imported/MoveDown.svg-f1fb57bee54d2faca78973dd8c78186f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/MoveUp.svg b/assets/icons/MoveUp.svg
index 4066bf1..04af1ff 100644
--- a/assets/icons/MoveUp.svg
+++ b/assets/icons/MoveUp.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/MoveUp.svg.import b/assets/icons/MoveUp.svg.import
index 49c16a4..edf43a1 100644
--- a/assets/icons/MoveUp.svg.import
+++ b/assets/icons/MoveUp.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dgfyegqnsoqgd"
-path="res://.godot/imported/MoveUp.svg-2cc1a895a069a8144f501bfb0706c099.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/MoveUp.svg-2cc1a895a069a8144f501bfb0706c099.svgtex"
[deps]
source_file="res://assets/icons/MoveUp.svg"
-dest_files=["res://.godot/imported/MoveUp.svg-2cc1a895a069a8144f501bfb0706c099.ctex"]
+dest_files=["res://.godot/imported/MoveUp.svg-2cc1a895a069a8144f501bfb0706c099.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/NoneColor.svg b/assets/icons/NoneColor.svg
index 39de2cd..a025321 100644
--- a/assets/icons/NoneColor.svg
+++ b/assets/icons/NoneColor.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/NoneColor.svg.import b/assets/icons/NoneColor.svg.import
index 8dfcf2f..208f242 100644
--- a/assets/icons/NoneColor.svg.import
+++ b/assets/icons/NoneColor.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://d36qn2f7a0nok"
-path="res://.godot/imported/NoneColor.svg-e4f700f4b24e186abc5e7387ac1bab3a.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/NoneColor.svg-e4f700f4b24e186abc5e7387ac1bab3a.svgtex"
[deps]
source_file="res://assets/icons/NoneColor.svg"
-dest_files=["res://.godot/imported/NoneColor.svg-e4f700f4b24e186abc5e7387ac1bab3a.ctex"]
+dest_files=["res://.godot/imported/NoneColor.svg-e4f700f4b24e186abc5e7387ac1bab3a.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/OpenFile.svg b/assets/icons/OpenFile.svg
index 93d6a20..fa4196e 100644
--- a/assets/icons/OpenFile.svg
+++ b/assets/icons/OpenFile.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/OpenFile.svg.import b/assets/icons/OpenFile.svg.import
index 516e884..9e8b1db 100644
--- a/assets/icons/OpenFile.svg.import
+++ b/assets/icons/OpenFile.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ckw03ghmca5ho"
-path="res://.godot/imported/OpenFile.svg-f562e243f1340cda3a0958b28a11a58e.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/OpenFile.svg-f562e243f1340cda3a0958b28a11a58e.svgtex"
[deps]
source_file="res://assets/icons/OpenFile.svg"
-dest_files=["res://.godot/imported/OpenFile.svg-f562e243f1340cda3a0958b28a11a58e.ctex"]
+dest_files=["res://.godot/imported/OpenFile.svg-f562e243f1340cda3a0958b28a11a58e.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/OpenFolder.svg b/assets/icons/OpenFolder.svg
index b5a8769..2eaf88d 100644
--- a/assets/icons/OpenFolder.svg
+++ b/assets/icons/OpenFolder.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/OpenFolder.svg.import b/assets/icons/OpenFolder.svg.import
index d5229cd..893feef 100644
--- a/assets/icons/OpenFolder.svg.import
+++ b/assets/icons/OpenFolder.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dn3bunuaxmdru"
-path="res://.godot/imported/OpenFolder.svg-db8ccfafc61095e1348d9d50464796f6.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/OpenFolder.svg-db8ccfafc61095e1348d9d50464796f6.svgtex"
[deps]
source_file="res://assets/icons/OpenFolder.svg"
-dest_files=["res://.godot/imported/OpenFolder.svg-db8ccfafc61095e1348d9d50464796f6.ctex"]
+dest_files=["res://.godot/imported/OpenFolder.svg-db8ccfafc61095e1348d9d50464796f6.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Paste.svg b/assets/icons/Paste.svg
index 13ea248..e648007 100644
--- a/assets/icons/Paste.svg
+++ b/assets/icons/Paste.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Paste.svg.import b/assets/icons/Paste.svg.import
index c122755..dc416a3 100644
--- a/assets/icons/Paste.svg.import
+++ b/assets/icons/Paste.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dngu00dcl6ate"
-path="res://.godot/imported/Paste.svg-d9eab6865dcb4939a280855c07f79527.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Paste.svg-d9eab6865dcb4939a280855c07f79527.svgtex"
[deps]
source_file="res://assets/icons/Paste.svg"
-dest_files=["res://.godot/imported/Paste.svg-d9eab6865dcb4939a280855c07f79527.ctex"]
+dest_files=["res://.godot/imported/Paste.svg-d9eab6865dcb4939a280855c07f79527.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Placeholder.svg b/assets/icons/Placeholder.svg
index 70b055c..09298c1 100644
--- a/assets/icons/Placeholder.svg
+++ b/assets/icons/Placeholder.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Placeholder.svg.import b/assets/icons/Placeholder.svg.import
index f8d6387..3a84c12 100644
--- a/assets/icons/Placeholder.svg.import
+++ b/assets/icons/Placeholder.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://b4fycrn6ejomu"
-path="res://.godot/imported/Placeholder.svg-9c0dcc2e6f90dd567f3e217a181e4e00.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Placeholder.svg-9c0dcc2e6f90dd567f3e217a181e4e00.svgtex"
[deps]
source_file="res://assets/icons/Placeholder.svg"
-dest_files=["res://.godot/imported/Placeholder.svg-9c0dcc2e6f90dd567f3e217a181e4e00.ctex"]
+dest_files=["res://.godot/imported/Placeholder.svg-9c0dcc2e6f90dd567f3e217a181e4e00.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PlatformAndroid.svg b/assets/icons/PlatformAndroid.svg
index 5c89cf0..649d498 100644
--- a/assets/icons/PlatformAndroid.svg
+++ b/assets/icons/PlatformAndroid.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/PlatformAndroid.svg.import b/assets/icons/PlatformAndroid.svg.import
index 4781138..6e881de 100644
--- a/assets/icons/PlatformAndroid.svg.import
+++ b/assets/icons/PlatformAndroid.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bo5c20hy73tpr"
-path="res://.godot/imported/PlatformAndroid.svg-507e6984f29f635a4ac46090e9514435.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PlatformAndroid.svg-507e6984f29f635a4ac46090e9514435.svgtex"
[deps]
source_file="res://assets/icons/PlatformAndroid.svg"
-dest_files=["res://.godot/imported/PlatformAndroid.svg-507e6984f29f635a4ac46090e9514435.ctex"]
+dest_files=["res://.godot/imported/PlatformAndroid.svg-507e6984f29f635a4ac46090e9514435.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PlatformLinux.svg b/assets/icons/PlatformLinux.svg
index 042f171..c7c3b56 100644
--- a/assets/icons/PlatformLinux.svg
+++ b/assets/icons/PlatformLinux.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/PlatformLinux.svg.import b/assets/icons/PlatformLinux.svg.import
index 440f402..36f6ef6 100644
--- a/assets/icons/PlatformLinux.svg.import
+++ b/assets/icons/PlatformLinux.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bg37vrltk5npr"
-path="res://.godot/imported/PlatformLinux.svg-2b9393fef43df6991d3292a35024aa68.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PlatformLinux.svg-2b9393fef43df6991d3292a35024aa68.svgtex"
[deps]
source_file="res://assets/icons/PlatformLinux.svg"
-dest_files=["res://.godot/imported/PlatformLinux.svg-2b9393fef43df6991d3292a35024aa68.ctex"]
+dest_files=["res://.godot/imported/PlatformLinux.svg-2b9393fef43df6991d3292a35024aa68.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PlatformMacOS.svg b/assets/icons/PlatformMacOS.svg
index 0de9ca7..207e301 100644
--- a/assets/icons/PlatformMacOS.svg
+++ b/assets/icons/PlatformMacOS.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/PlatformMacOS.svg.import b/assets/icons/PlatformMacOS.svg.import
index 054f378..efb3603 100644
--- a/assets/icons/PlatformMacOS.svg.import
+++ b/assets/icons/PlatformMacOS.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c5mof6sypo2j0"
-path="res://.godot/imported/PlatformMacOS.svg-eb55b56d762e1eeb8182c190d04b7895.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PlatformMacOS.svg-eb55b56d762e1eeb8182c190d04b7895.svgtex"
[deps]
source_file="res://assets/icons/PlatformMacOS.svg"
-dest_files=["res://.godot/imported/PlatformMacOS.svg-eb55b56d762e1eeb8182c190d04b7895.ctex"]
+dest_files=["res://.godot/imported/PlatformMacOS.svg-eb55b56d762e1eeb8182c190d04b7895.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PlatformWindows.svg b/assets/icons/PlatformWindows.svg
index efb3782..7a0c2db 100644
--- a/assets/icons/PlatformWindows.svg
+++ b/assets/icons/PlatformWindows.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/PlatformWindows.svg.import b/assets/icons/PlatformWindows.svg.import
index f2ed689..d187e7d 100644
--- a/assets/icons/PlatformWindows.svg.import
+++ b/assets/icons/PlatformWindows.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c0xmtbtcke0hx"
-path="res://.godot/imported/PlatformWindows.svg-d7704fc273c534bb6222a0f5b4001182.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PlatformWindows.svg-d7704fc273c534bb6222a0f5b4001182.svgtex"
[deps]
source_file="res://assets/icons/PlatformWindows.svg"
-dest_files=["res://.godot/imported/PlatformWindows.svg-d7704fc273c534bb6222a0f5b4001182.ctex"]
+dest_files=["res://.godot/imported/PlatformWindows.svg-d7704fc273c534bb6222a0f5b4001182.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Plus.svg b/assets/icons/Plus.svg
index 92db187..379c4ca 100644
--- a/assets/icons/Plus.svg
+++ b/assets/icons/Plus.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Plus.svg.import b/assets/icons/Plus.svg.import
index 0bfd335..55aec7b 100644
--- a/assets/icons/Plus.svg.import
+++ b/assets/icons/Plus.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://eif2ioi0mw17"
-path="res://.godot/imported/Plus.svg-70cbe6fe53491e8891df68dbf74967ef.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Plus.svg-70cbe6fe53491e8891df68dbf74967ef.svgtex"
[deps]
source_file="res://assets/icons/Plus.svg"
-dest_files=["res://.godot/imported/Plus.svg-70cbe6fe53491e8891df68dbf74967ef.ctex"]
+dest_files=["res://.godot/imported/Plus.svg-70cbe6fe53491e8891df68dbf74967ef.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PopupArrow.svg b/assets/icons/PopupArrow.svg
index 9cd4d9f..bdfd115 100644
--- a/assets/icons/PopupArrow.svg
+++ b/assets/icons/PopupArrow.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/PopupArrow.svg.import b/assets/icons/PopupArrow.svg.import
index f88a16c..a17bb2b 100644
--- a/assets/icons/PopupArrow.svg.import
+++ b/assets/icons/PopupArrow.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://crdbyje1tji4h"
-path="res://.godot/imported/PopupArrow.svg-4e1f1544d59b20621caa7c87d9004cd1.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PopupArrow.svg-4e1f1544d59b20621caa7c87d9004cd1.svgtex"
[deps]
source_file="res://assets/icons/PopupArrow.svg"
-dest_files=["res://.godot/imported/PopupArrow.svg-4e1f1544d59b20621caa7c87d9004cd1.ctex"]
+dest_files=["res://.godot/imported/PopupArrow.svg-4e1f1544d59b20621caa7c87d9004cd1.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PresetGrayscale.svg.import b/assets/icons/PresetGrayscale.svg.import
index bfc851f..ccb6b09 100644
--- a/assets/icons/PresetGrayscale.svg.import
+++ b/assets/icons/PresetGrayscale.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dv1aldaqix1bo"
-path="res://.godot/imported/PresetGrayscale.svg-bbea35708ad1c100df741b38f49d3124.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PresetGrayscale.svg-bbea35708ad1c100df741b38f49d3124.svgtex"
[deps]
source_file="res://assets/icons/PresetGrayscale.svg"
-dest_files=["res://.godot/imported/PresetGrayscale.svg-bbea35708ad1c100df741b38f49d3124.ctex"]
+dest_files=["res://.godot/imported/PresetGrayscale.svg-bbea35708ad1c100df741b38f49d3124.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/PresetPure.svg.import b/assets/icons/PresetPure.svg.import
index 77b8ce6..abacb91 100644
--- a/assets/icons/PresetPure.svg.import
+++ b/assets/icons/PresetPure.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://doonh5ev61dlb"
-path="res://.godot/imported/PresetPure.svg-7dd9763847a507207d95c81435faf89f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PresetPure.svg-7dd9763847a507207d95c81435faf89f.svgtex"
[deps]
source_file="res://assets/icons/PresetPure.svg"
-dest_files=["res://.godot/imported/PresetPure.svg-7dd9763847a507207d95c81435faf89f.ctex"]
+dest_files=["res://.godot/imported/PresetPure.svg-7dd9763847a507207d95c81435faf89f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/QuestionMark.svg b/assets/icons/QuestionMark.svg
index 0ac6871..44b37ec 100644
--- a/assets/icons/QuestionMark.svg
+++ b/assets/icons/QuestionMark.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/QuestionMark.svg.import b/assets/icons/QuestionMark.svg.import
index 40a1bf7..763cd3e 100644
--- a/assets/icons/QuestionMark.svg.import
+++ b/assets/icons/QuestionMark.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bi38k4pq83omf"
-path="res://.godot/imported/QuestionMark.svg-df448d271c6b8fa0659330eda85bb8f6.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/QuestionMark.svg-df448d271c6b8fa0659330eda85bb8f6.svgtex"
[deps]
source_file="res://assets/icons/QuestionMark.svg"
-dest_files=["res://.godot/imported/QuestionMark.svg-df448d271c6b8fa0659330eda85bb8f6.ctex"]
+dest_files=["res://.godot/imported/QuestionMark.svg-df448d271c6b8fa0659330eda85bb8f6.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Quit.svg b/assets/icons/Quit.svg
index ee8b477..8d0d7ac 100644
--- a/assets/icons/Quit.svg
+++ b/assets/icons/Quit.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Quit.svg.import b/assets/icons/Quit.svg.import
index c7fefa3..150f3aa 100644
--- a/assets/icons/Quit.svg.import
+++ b/assets/icons/Quit.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cbkrorp0b7qgb"
-path="res://.godot/imported/Quit.svg-27ce495cfd421ac10bdab78eb7fc0164.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Quit.svg-27ce495cfd421ac10bdab78eb7fc0164.svgtex"
[deps]
source_file="res://assets/icons/Quit.svg"
-dest_files=["res://.godot/imported/Quit.svg-27ce495cfd421ac10bdab78eb7fc0164.ctex"]
+dest_files=["res://.godot/imported/Quit.svg-27ce495cfd421ac10bdab78eb7fc0164.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Redo.svg b/assets/icons/Redo.svg
index 164f6a8..7e8e7c3 100644
--- a/assets/icons/Redo.svg
+++ b/assets/icons/Redo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Redo.svg.import b/assets/icons/Redo.svg.import
index 3a23f50..0bcebde 100644
--- a/assets/icons/Redo.svg.import
+++ b/assets/icons/Redo.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://x7hsvbn0k3i8"
-path="res://.godot/imported/Redo.svg-1cd6dd40037832a4dcd7098e88d1d853.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Redo.svg-1cd6dd40037832a4dcd7098e88d1d853.svgtex"
[deps]
source_file="res://assets/icons/Redo.svg"
-dest_files=["res://.godot/imported/Redo.svg-1cd6dd40037832a4dcd7098e88d1d853.ctex"]
+dest_files=["res://.godot/imported/Redo.svg-1cd6dd40037832a4dcd7098e88d1d853.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Reference.svg b/assets/icons/Reference.svg
index 54d3fa9..476ef94 100644
--- a/assets/icons/Reference.svg
+++ b/assets/icons/Reference.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Reference.svg.import b/assets/icons/Reference.svg.import
index c7661bd..d6c9aca 100644
--- a/assets/icons/Reference.svg.import
+++ b/assets/icons/Reference.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://iglrqrqyg4kn"
-path="res://.godot/imported/Reference.svg-c3d4e58aff06c4a897251410324037f7.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Reference.svg-c3d4e58aff06c4a897251410324037f7.svgtex"
[deps]
source_file="res://assets/icons/Reference.svg"
-dest_files=["res://.godot/imported/Reference.svg-c3d4e58aff06c4a897251410324037f7.ctex"]
+dest_files=["res://.godot/imported/Reference.svg-c3d4e58aff06c4a897251410324037f7.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Reload.svg b/assets/icons/Reload.svg
index 827018d..d96092a 100644
--- a/assets/icons/Reload.svg
+++ b/assets/icons/Reload.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Reload.svg.import b/assets/icons/Reload.svg.import
index 8990ad6..d15c611 100644
--- a/assets/icons/Reload.svg.import
+++ b/assets/icons/Reload.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cvh3kwbucf2n1"
-path="res://.godot/imported/Reload.svg-dc62252f416f3dae43a809a2b7e34a97.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Reload.svg-dc62252f416f3dae43a809a2b7e34a97.svgtex"
[deps]
source_file="res://assets/icons/Reload.svg"
-dest_files=["res://.godot/imported/Reload.svg-dc62252f416f3dae43a809a2b7e34a97.ctex"]
+dest_files=["res://.godot/imported/Reload.svg-dc62252f416f3dae43a809a2b7e34a97.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Rename.svg b/assets/icons/Rename.svg
index f618fd6..5cb4d3a 100644
--- a/assets/icons/Rename.svg
+++ b/assets/icons/Rename.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Rename.svg.import b/assets/icons/Rename.svg.import
index 7fa6542..a37405e 100644
--- a/assets/icons/Rename.svg.import
+++ b/assets/icons/Rename.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bjajwlfhfgo38"
-path="res://.godot/imported/Rename.svg-1fe4ae6b401a2b2e6c18a5b851cbea12.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Rename.svg-1fe4ae6b401a2b2e6c18a5b851cbea12.svgtex"
[deps]
source_file="res://assets/icons/Rename.svg"
-dest_files=["res://.godot/imported/Rename.svg-1fe4ae6b401a2b2e6c18a5b851cbea12.ctex"]
+dest_files=["res://.godot/imported/Rename.svg-1fe4ae6b401a2b2e6c18a5b851cbea12.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Rotate.svg b/assets/icons/Rotate.svg
index c1264cb..f132597 100644
--- a/assets/icons/Rotate.svg
+++ b/assets/icons/Rotate.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Rotate.svg.import b/assets/icons/Rotate.svg.import
index f4ed6a8..2274aa1 100644
--- a/assets/icons/Rotate.svg.import
+++ b/assets/icons/Rotate.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://mop8xvnp8qcv"
-path="res://.godot/imported/Rotate.svg-cf69348aedb12eed0517c4deb4d4a3d9.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Rotate.svg-cf69348aedb12eed0517c4deb4d4a3d9.svgtex"
[deps]
source_file="res://assets/icons/Rotate.svg"
-dest_files=["res://.godot/imported/Rotate.svg-cf69348aedb12eed0517c4deb4d4a3d9.ctex"]
+dest_files=["res://.godot/imported/Rotate.svg-cf69348aedb12eed0517c4deb4d4a3d9.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Save.svg b/assets/icons/Save.svg
index a995951..3b1db3f 100644
--- a/assets/icons/Save.svg
+++ b/assets/icons/Save.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Save.svg.import b/assets/icons/Save.svg.import
index 9849c1c..b0831a7 100644
--- a/assets/icons/Save.svg.import
+++ b/assets/icons/Save.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://rxfu7kcmo7c1"
-path="res://.godot/imported/Save.svg-f607b0fa97b42169cf4d3d08791c1dd2.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Save.svg-f607b0fa97b42169cf4d3d08791c1dd2.svgtex"
[deps]
source_file="res://assets/icons/Save.svg"
-dest_files=["res://.godot/imported/Save.svg-f607b0fa97b42169cf4d3d08791c1dd2.ctex"]
+dest_files=["res://.godot/imported/Save.svg-f607b0fa97b42169cf4d3d08791c1dd2.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Scale.svg b/assets/icons/Scale.svg
index 97cb7f2..6e51c1c 100644
--- a/assets/icons/Scale.svg
+++ b/assets/icons/Scale.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Scale.svg.import b/assets/icons/Scale.svg.import
index ffbaacf..ba3970d 100644
--- a/assets/icons/Scale.svg.import
+++ b/assets/icons/Scale.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://b2cpjg74rpkjs"
-path="res://.godot/imported/Scale.svg-e6ed2a774e150c90b08960eddeb56b79.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Scale.svg-e6ed2a774e150c90b08960eddeb56b79.svgtex"
[deps]
source_file="res://assets/icons/Scale.svg"
-dest_files=["res://.godot/imported/Scale.svg-e6ed2a774e150c90b08960eddeb56b79.ctex"]
+dest_files=["res://.godot/imported/Scale.svg-e6ed2a774e150c90b08960eddeb56b79.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/ScrollBackwards.svg b/assets/icons/ScrollBackwards.svg
index 2562102..9dff416 100644
--- a/assets/icons/ScrollBackwards.svg
+++ b/assets/icons/ScrollBackwards.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/ScrollBackwards.svg.import b/assets/icons/ScrollBackwards.svg.import
index e0362b0..c66427f 100644
--- a/assets/icons/ScrollBackwards.svg.import
+++ b/assets/icons/ScrollBackwards.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://b6wvqmor1sq08"
-path="res://.godot/imported/ScrollBackwards.svg-1ff0ea66adb12029ac78f704d80e6248.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/ScrollBackwards.svg-1ff0ea66adb12029ac78f704d80e6248.svgtex"
[deps]
source_file="res://assets/icons/ScrollBackwards.svg"
-dest_files=["res://.godot/imported/ScrollBackwards.svg-1ff0ea66adb12029ac78f704d80e6248.ctex"]
+dest_files=["res://.godot/imported/ScrollBackwards.svg-1ff0ea66adb12029ac78f704d80e6248.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/ScrollForwards.svg b/assets/icons/ScrollForwards.svg
index b8e8c7e..f09ce9a 100644
--- a/assets/icons/ScrollForwards.svg
+++ b/assets/icons/ScrollForwards.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/ScrollForwards.svg.import b/assets/icons/ScrollForwards.svg.import
index 838e820..0a0f272 100644
--- a/assets/icons/ScrollForwards.svg.import
+++ b/assets/icons/ScrollForwards.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://raxijmbc48q5"
-path="res://.godot/imported/ScrollForwards.svg-6f6937f4ac0b631bdce59141e49cba7f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/ScrollForwards.svg-6f6937f4ac0b631bdce59141e49cba7f.svgtex"
[deps]
source_file="res://assets/icons/ScrollForwards.svg"
-dest_files=["res://.godot/imported/ScrollForwards.svg-6f6937f4ac0b631bdce59141e49cba7f.ctex"]
+dest_files=["res://.godot/imported/ScrollForwards.svg-6f6937f4ac0b631bdce59141e49cba7f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Search.svg b/assets/icons/Search.svg
index 884a523..9d10d6f 100644
--- a/assets/icons/Search.svg
+++ b/assets/icons/Search.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Search.svg.import b/assets/icons/Search.svg.import
index 2160cae..89a374d 100644
--- a/assets/icons/Search.svg.import
+++ b/assets/icons/Search.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://d4c7haflm8evm"
-path="res://.godot/imported/Search.svg-d0bd9765f428db07389c3df694314dd0.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Search.svg-d0bd9765f428db07389c3df694314dd0.svgtex"
[deps]
source_file="res://assets/icons/Search.svg"
-dest_files=["res://.godot/imported/Search.svg-d0bd9765f428db07389c3df694314dd0.ctex"]
+dest_files=["res://.godot/imported/Search.svg-d0bd9765f428db07389c3df694314dd0.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/SideSliderArrow.svg b/assets/icons/SideSliderArrow.svg
index 20b64e7..6b884ae 100644
--- a/assets/icons/SideSliderArrow.svg
+++ b/assets/icons/SideSliderArrow.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/SideSliderArrow.svg.import b/assets/icons/SideSliderArrow.svg.import
index ff8de68..939387c 100644
--- a/assets/icons/SideSliderArrow.svg.import
+++ b/assets/icons/SideSliderArrow.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cmu6r4ipti60x"
-path="res://.godot/imported/SideSliderArrow.svg-12020a4c094bbac9e72e1e1468d7b2eb.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/SideSliderArrow.svg-12020a4c094bbac9e72e1e1468d7b2eb.svgtex"
[deps]
source_file="res://assets/icons/SideSliderArrow.svg"
-dest_files=["res://.godot/imported/SideSliderArrow.svg-12020a4c094bbac9e72e1e1468d7b2eb.ctex"]
+dest_files=["res://.godot/imported/SideSliderArrow.svg-12020a4c094bbac9e72e1e1468d7b2eb.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/SkewX.svg b/assets/icons/SkewX.svg
index 18e1270..356a66d 100644
--- a/assets/icons/SkewX.svg
+++ b/assets/icons/SkewX.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/SkewX.svg.import b/assets/icons/SkewX.svg.import
index 9763763..2fa2418 100644
--- a/assets/icons/SkewX.svg.import
+++ b/assets/icons/SkewX.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://mkfxc0srhfek"
-path="res://.godot/imported/SkewX.svg-9d46edf162778638ca700ba521a7233e.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/SkewX.svg-9d46edf162778638ca700ba521a7233e.svgtex"
[deps]
source_file="res://assets/icons/SkewX.svg"
-dest_files=["res://.godot/imported/SkewX.svg-9d46edf162778638ca700ba521a7233e.ctex"]
+dest_files=["res://.godot/imported/SkewX.svg-9d46edf162778638ca700ba521a7233e.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/SkewY.svg b/assets/icons/SkewY.svg
index fd2e4c5..4a6f004 100644
--- a/assets/icons/SkewY.svg
+++ b/assets/icons/SkewY.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/SkewY.svg.import b/assets/icons/SkewY.svg.import
index bfa16f7..6cda010 100644
--- a/assets/icons/SkewY.svg.import
+++ b/assets/icons/SkewY.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c7mdaue5rmbt3"
-path="res://.godot/imported/SkewY.svg-9134b8e566b5fa1dd453f9cc051d0e02.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/SkewY.svg-9134b8e566b5fa1dd453f9cc051d0e02.svgtex"
[deps]
source_file="res://assets/icons/SkewY.svg"
-dest_files=["res://.godot/imported/SkewY.svg-9134b8e566b5fa1dd453f9cc051d0e02.ctex"]
+dest_files=["res://.godot/imported/SkewY.svg-9134b8e566b5fa1dd453f9cc051d0e02.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/SliderArrow.svg b/assets/icons/SliderArrow.svg
index 011e94c..835084a 100644
--- a/assets/icons/SliderArrow.svg
+++ b/assets/icons/SliderArrow.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/SliderArrow.svg.import b/assets/icons/SliderArrow.svg.import
index 7678ff6..7a934ce 100644
--- a/assets/icons/SliderArrow.svg.import
+++ b/assets/icons/SliderArrow.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cnq1u5hrcqrho"
-path="res://.godot/imported/SliderArrow.svg-3255a7e763b23bacca933c954b6460e9.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/SliderArrow.svg-3255a7e763b23bacca933c954b6460e9.svgtex"
[deps]
source_file="res://assets/icons/SliderArrow.svg"
-dest_files=["res://.godot/imported/SliderArrow.svg-3255a7e763b23bacca933c954b6460e9.ctex"]
+dest_files=["res://.godot/imported/SliderArrow.svg-3255a7e763b23bacca933c954b6460e9.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/SmallMore.svg b/assets/icons/SmallMore.svg
index 9821e3d..6c97a7b 100644
--- a/assets/icons/SmallMore.svg
+++ b/assets/icons/SmallMore.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/SmallMore.svg.import b/assets/icons/SmallMore.svg.import
index 033f5b3..c6c229f 100644
--- a/assets/icons/SmallMore.svg.import
+++ b/assets/icons/SmallMore.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cmepkbqde0jh0"
-path="res://.godot/imported/SmallMore.svg-498d9628e37505d7aed18d97a65e9a4f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/SmallMore.svg-498d9628e37505d7aed18d97a65e9a4f.svgtex"
[deps]
source_file="res://assets/icons/SmallMore.svg"
-dest_files=["res://.godot/imported/SmallMore.svg-498d9628e37505d7aed18d97a65e9a4f.ctex"]
+dest_files=["res://.godot/imported/SmallMore.svg-498d9628e37505d7aed18d97a65e9a4f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/SmallQuestionMark.svg b/assets/icons/SmallQuestionMark.svg
index 72e8e0c..d8bf4b7 100644
--- a/assets/icons/SmallQuestionMark.svg
+++ b/assets/icons/SmallQuestionMark.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/SmallQuestionMark.svg.import b/assets/icons/SmallQuestionMark.svg.import
index f22d3fd..0b6b375 100644
--- a/assets/icons/SmallQuestionMark.svg.import
+++ b/assets/icons/SmallQuestionMark.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://crx4kcj4o01bs"
-path="res://.godot/imported/SmallQuestionMark.svg-45851b1324383ed0de300bfbcf33768f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/SmallQuestionMark.svg-45851b1324383ed0de300bfbcf33768f.svgtex"
[deps]
source_file="res://assets/icons/SmallQuestionMark.svg"
-dest_files=["res://.godot/imported/SmallQuestionMark.svg-45851b1324383ed0de300bfbcf33768f.ctex"]
+dest_files=["res://.godot/imported/SmallQuestionMark.svg-45851b1324383ed0de300bfbcf33768f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Snap.svg b/assets/icons/Snap.svg
index 4f39fe8..b64129d 100644
--- a/assets/icons/Snap.svg
+++ b/assets/icons/Snap.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Snap.svg.import b/assets/icons/Snap.svg.import
index 0e6e3ee..bfb035b 100644
--- a/assets/icons/Snap.svg.import
+++ b/assets/icons/Snap.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://buire51l0mifg"
-path="res://.godot/imported/Snap.svg-29a77ee514cb049b624c9e02f460f90d.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Snap.svg-29a77ee514cb049b624c9e02f460f90d.svgtex"
[deps]
source_file="res://assets/icons/Snap.svg"
-dest_files=["res://.godot/imported/Snap.svg-29a77ee514cb049b624c9e02f460f90d.ctex"]
+dest_files=["res://.godot/imported/Snap.svg-29a77ee514cb049b624c9e02f460f90d.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/TabSwitcher.svg.import b/assets/icons/TabSwitcher.svg.import
index 119ab39..caac937 100644
--- a/assets/icons/TabSwitcher.svg.import
+++ b/assets/icons/TabSwitcher.svg.import
@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/TabSwitcher.svg-2223859299d150806d6ebc1516a36
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
@@ -25,6 +27,10 @@ mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
diff --git a/assets/icons/TextFile.svg.import b/assets/icons/TextFile.svg.import
index 85ec33c..25f52ae 100644
--- a/assets/icons/TextFile.svg.import
+++ b/assets/icons/TextFile.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bjlwi2il3cimk"
-path="res://.godot/imported/TextFile.svg-6ff5d6328ddeeb7ed6f836de669cd220.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/TextFile.svg-6ff5d6328ddeeb7ed6f836de669cd220.svgtex"
[deps]
source_file="res://assets/icons/TextFile.svg"
-dest_files=["res://.godot/imported/TextFile.svg-6ff5d6328ddeeb7ed6f836de669cd220.ctex"]
+dest_files=["res://.godot/imported/TextFile.svg-6ff5d6328ddeeb7ed6f836de669cd220.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Translate.svg b/assets/icons/Translate.svg
index 89f58e7..82f2f6b 100644
--- a/assets/icons/Translate.svg
+++ b/assets/icons/Translate.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Translate.svg.import b/assets/icons/Translate.svg.import
index 6631433..bf1e800 100644
--- a/assets/icons/Translate.svg.import
+++ b/assets/icons/Translate.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://b7r171i82g3xl"
-path="res://.godot/imported/Translate.svg-6935e923a254420d209e5265a6bcc11e.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Translate.svg-6935e923a254420d209e5265a6bcc11e.svgtex"
[deps]
source_file="res://assets/icons/Translate.svg"
-dest_files=["res://.godot/imported/Translate.svg-6935e923a254420d209e5265a6bcc11e.ctex"]
+dest_files=["res://.godot/imported/Translate.svg-6935e923a254420d209e5265a6bcc11e.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Undo.svg b/assets/icons/Undo.svg
index 9c136a1..d1dc30d 100644
--- a/assets/icons/Undo.svg
+++ b/assets/icons/Undo.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Undo.svg.import b/assets/icons/Undo.svg.import
index cdc68f1..3bddd82 100644
--- a/assets/icons/Undo.svg.import
+++ b/assets/icons/Undo.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dgwjiijcgblou"
-path="res://.godot/imported/Undo.svg-cf90b08882c5b785e9e31418171ad387.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Undo.svg-cf90b08882c5b785e9e31418171ad387.svgtex"
[deps]
source_file="res://assets/icons/Undo.svg"
-dest_files=["res://.godot/imported/Undo.svg-cf90b08882c5b785e9e31418171ad387.ctex"]
+dest_files=["res://.godot/imported/Undo.svg-cf90b08882c5b785e9e31418171ad387.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Viewport.svg b/assets/icons/Viewport.svg
index b7910b6..a3fa402 100644
--- a/assets/icons/Viewport.svg
+++ b/assets/icons/Viewport.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Viewport.svg.import b/assets/icons/Viewport.svg.import
index a3dec21..5b5df03 100644
--- a/assets/icons/Viewport.svg.import
+++ b/assets/icons/Viewport.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://baxqpqub1hxmr"
-path="res://.godot/imported/Viewport.svg-f8c0ca66b45914e279c67a6c13d5852c.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Viewport.svg-f8c0ca66b45914e279c67a6c13d5852c.svgtex"
[deps]
source_file="res://assets/icons/Viewport.svg"
-dest_files=["res://.godot/imported/Viewport.svg-f8c0ca66b45914e279c67a6c13d5852c.ctex"]
+dest_files=["res://.godot/imported/Viewport.svg-f8c0ca66b45914e279c67a6c13d5852c.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Visuals.svg b/assets/icons/Visuals.svg
index 39d5f46..1520af6 100644
--- a/assets/icons/Visuals.svg
+++ b/assets/icons/Visuals.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Visuals.svg.import b/assets/icons/Visuals.svg.import
index c2d715c..ff4e302 100644
--- a/assets/icons/Visuals.svg.import
+++ b/assets/icons/Visuals.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://kkxyv1gyrjgj"
-path="res://.godot/imported/Visuals.svg-cd178d1fd0b469993938ca905876831b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Visuals.svg-cd178d1fd0b469993938ca905876831b.svgtex"
[deps]
source_file="res://assets/icons/Visuals.svg"
-dest_files=["res://.godot/imported/Visuals.svg-cd178d1fd0b469993938ca905876831b.ctex"]
+dest_files=["res://.godot/imported/Visuals.svg-cd178d1fd0b469993938ca905876831b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/Warning.svg b/assets/icons/Warning.svg
index bca7ff9..b48a34f 100644
--- a/assets/icons/Warning.svg
+++ b/assets/icons/Warning.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/Warning.svg.import b/assets/icons/Warning.svg.import
index 5c247d2..34b848c 100644
--- a/assets/icons/Warning.svg.import
+++ b/assets/icons/Warning.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dbyjet4nt246k"
-path="res://.godot/imported/Warning.svg-1fa9c55d4ce2374a5650b357c6c25038.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Warning.svg-1fa9c55d4ce2374a5650b357c6c25038.svgtex"
[deps]
source_file="res://assets/icons/Warning.svg"
-dest_files=["res://.godot/imported/Warning.svg-1fa9c55d4ce2374a5650b357c6c25038.ctex"]
+dest_files=["res://.godot/imported/Warning.svg-1fa9c55d4ce2374a5650b357c6c25038.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/backgrounds/Checkerboard.svg.import b/assets/icons/backgrounds/Checkerboard.svg.import
index 5146c91..fa94a35 100644
--- a/assets/icons/backgrounds/Checkerboard.svg.import
+++ b/assets/icons/backgrounds/Checkerboard.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c68og6bsqt0lb"
-path="res://.godot/imported/Checkerboard.svg-f7e80961b46cfe0abb1fe7c57bd5c311.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/Checkerboard.svg-f7e80961b46cfe0abb1fe7c57bd5c311.svgtex"
[deps]
source_file="res://assets/icons/backgrounds/Checkerboard.svg"
-dest_files=["res://.godot/imported/Checkerboard.svg-f7e80961b46cfe0abb1fe7c57bd5c311.ctex"]
+dest_files=["res://.godot/imported/Checkerboard.svg-f7e80961b46cfe0abb1fe7c57bd5c311.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/backgrounds/CheckerboardMini.svg.import b/assets/icons/backgrounds/CheckerboardMini.svg.import
index 465afec..1bff5b5 100644
--- a/assets/icons/backgrounds/CheckerboardMini.svg.import
+++ b/assets/icons/backgrounds/CheckerboardMini.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://stpallv5q0rb"
-path="res://.godot/imported/CheckerboardMini.svg-231a39c4ad6a476f0b2ee9407382b18a.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/CheckerboardMini.svg-231a39c4ad6a476f0b2ee9407382b18a.svgtex"
[deps]
source_file="res://assets/icons/backgrounds/CheckerboardMini.svg"
-dest_files=["res://.godot/imported/CheckerboardMini.svg-231a39c4ad6a476f0b2ee9407382b18a.ctex"]
+dest_files=["res://.godot/imported/CheckerboardMini.svg-231a39c4ad6a476f0b2ee9407382b18a.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/backgrounds/ColorButtonBG.svg.import b/assets/icons/backgrounds/ColorButtonBG.svg.import
index db03505..28ea6d0 100644
--- a/assets/icons/backgrounds/ColorButtonBG.svg.import
+++ b/assets/icons/backgrounds/ColorButtonBG.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://y0l74x73w0co"
-path="res://.godot/imported/ColorButtonBG.svg-f05e8d9d784151a74a26cfdebd155a7f.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/ColorButtonBG.svg-f05e8d9d784151a74a26cfdebd155a7f.svgtex"
[deps]
source_file="res://assets/icons/backgrounds/ColorButtonBG.svg"
-dest_files=["res://.godot/imported/ColorButtonBG.svg-f05e8d9d784151a74a26cfdebd155a7f.ctex"]
+dest_files=["res://.godot/imported/ColorButtonBG.svg-f05e8d9d784151a74a26cfdebd155a7f.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/circle.svg b/assets/icons/element/circle.svg
index 0befcc7..8dae339 100644
--- a/assets/icons/element/circle.svg
+++ b/assets/icons/element/circle.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/circle.svg.import b/assets/icons/element/circle.svg.import
index 3ec4af7..150e9c4 100644
--- a/assets/icons/element/circle.svg.import
+++ b/assets/icons/element/circle.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://i3nv3rexgpfx"
-path="res://.godot/imported/circle.svg-254daa85021abdd2364d2dd025bedc16.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/circle.svg-254daa85021abdd2364d2dd025bedc16.svgtex"
[deps]
source_file="res://assets/icons/element/circle.svg"
-dest_files=["res://.godot/imported/circle.svg-254daa85021abdd2364d2dd025bedc16.ctex"]
+dest_files=["res://.godot/imported/circle.svg-254daa85021abdd2364d2dd025bedc16.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/ellipse.svg b/assets/icons/element/ellipse.svg
index 17de190..f576e1d 100644
--- a/assets/icons/element/ellipse.svg
+++ b/assets/icons/element/ellipse.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/ellipse.svg.import b/assets/icons/element/ellipse.svg.import
index 419e5b1..3fff9b8 100644
--- a/assets/icons/element/ellipse.svg.import
+++ b/assets/icons/element/ellipse.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c1atigsxatxdg"
-path="res://.godot/imported/ellipse.svg-f48ede7bc4d2db2cf368294bd6f65f65.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/ellipse.svg-f48ede7bc4d2db2cf368294bd6f65f65.svgtex"
[deps]
source_file="res://assets/icons/element/ellipse.svg"
-dest_files=["res://.godot/imported/ellipse.svg-f48ede7bc4d2db2cf368294bd6f65f65.ctex"]
+dest_files=["res://.godot/imported/ellipse.svg-f48ede7bc4d2db2cf368294bd6f65f65.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/g.svg b/assets/icons/element/g.svg
index 344393c..4e27593 100644
--- a/assets/icons/element/g.svg
+++ b/assets/icons/element/g.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/g.svg.import b/assets/icons/element/g.svg.import
index 2454bf3..7d5ad38 100644
--- a/assets/icons/element/g.svg.import
+++ b/assets/icons/element/g.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://v4diytxx43vs"
-path="res://.godot/imported/g.svg-a723a78028fb034e0a1d8d362d47af18.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/g.svg-a723a78028fb034e0a1d8d362d47af18.svgtex"
[deps]
source_file="res://assets/icons/element/g.svg"
-dest_files=["res://.godot/imported/g.svg-a723a78028fb034e0a1d8d362d47af18.ctex"]
+dest_files=["res://.godot/imported/g.svg-a723a78028fb034e0a1d8d362d47af18.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/image.svg b/assets/icons/element/image.svg
index c1ae0be..0feafc5 100644
--- a/assets/icons/element/image.svg
+++ b/assets/icons/element/image.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/image.svg.import b/assets/icons/element/image.svg.import
index 30b43d7..655eaeb 100644
--- a/assets/icons/element/image.svg.import
+++ b/assets/icons/element/image.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://qolmbksjgn8e"
-path="res://.godot/imported/image.svg-4cc52c9b2f69e61f2b8246fc15eaf0de.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/image.svg-4cc52c9b2f69e61f2b8246fc15eaf0de.svgtex"
[deps]
source_file="res://assets/icons/element/image.svg"
-dest_files=["res://.godot/imported/image.svg-4cc52c9b2f69e61f2b8246fc15eaf0de.ctex"]
+dest_files=["res://.godot/imported/image.svg-4cc52c9b2f69e61f2b8246fc15eaf0de.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/line.svg b/assets/icons/element/line.svg
index 8f49bee..9ee2487 100644
--- a/assets/icons/element/line.svg
+++ b/assets/icons/element/line.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/line.svg.import b/assets/icons/element/line.svg.import
index 116f9be..04a202d 100644
--- a/assets/icons/element/line.svg.import
+++ b/assets/icons/element/line.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dckywhfjhuxke"
-path="res://.godot/imported/line.svg-44f9040ac1bfabe0cb9ef28359626b8e.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/line.svg-44f9040ac1bfabe0cb9ef28359626b8e.svgtex"
[deps]
source_file="res://assets/icons/element/line.svg"
-dest_files=["res://.godot/imported/line.svg-44f9040ac1bfabe0cb9ef28359626b8e.ctex"]
+dest_files=["res://.godot/imported/line.svg-44f9040ac1bfabe0cb9ef28359626b8e.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/linearGradient.svg b/assets/icons/element/linearGradient.svg
index 058681e..afbbcaf 100644
--- a/assets/icons/element/linearGradient.svg
+++ b/assets/icons/element/linearGradient.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/linearGradient.svg.import b/assets/icons/element/linearGradient.svg.import
index 2330d4d..e209dba 100644
--- a/assets/icons/element/linearGradient.svg.import
+++ b/assets/icons/element/linearGradient.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ld6hoxtl7q6y"
-path="res://.godot/imported/linearGradient.svg-8506328381653c4530e74ebe8f871359.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/linearGradient.svg-8506328381653c4530e74ebe8f871359.svgtex"
[deps]
source_file="res://assets/icons/element/linearGradient.svg"
-dest_files=["res://.godot/imported/linearGradient.svg-8506328381653c4530e74ebe8f871359.ctex"]
+dest_files=["res://.godot/imported/linearGradient.svg-8506328381653c4530e74ebe8f871359.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/mask.svg b/assets/icons/element/mask.svg
index 1df7e1a..363bf28 100644
--- a/assets/icons/element/mask.svg
+++ b/assets/icons/element/mask.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/mask.svg.import b/assets/icons/element/mask.svg.import
index bb9d459..4a396a3 100644
--- a/assets/icons/element/mask.svg.import
+++ b/assets/icons/element/mask.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cq12fgmfrreh5"
-path="res://.godot/imported/mask.svg-28cbb8910d54bf756daeb08a25dbd973.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/mask.svg-28cbb8910d54bf756daeb08a25dbd973.svgtex"
[deps]
source_file="res://assets/icons/element/mask.svg"
-dest_files=["res://.godot/imported/mask.svg-28cbb8910d54bf756daeb08a25dbd973.ctex"]
+dest_files=["res://.godot/imported/mask.svg-28cbb8910d54bf756daeb08a25dbd973.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/path.svg b/assets/icons/element/path.svg
index bf27000..08b0bf3 100644
--- a/assets/icons/element/path.svg
+++ b/assets/icons/element/path.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/path.svg.import b/assets/icons/element/path.svg.import
index 162f9af..25a7b9a 100644
--- a/assets/icons/element/path.svg.import
+++ b/assets/icons/element/path.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dtogqqow1jfum"
-path="res://.godot/imported/path.svg-ee6b5ae9f042c5906830667e7a304e4b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/path.svg-ee6b5ae9f042c5906830667e7a304e4b.svgtex"
[deps]
source_file="res://assets/icons/element/path.svg"
-dest_files=["res://.godot/imported/path.svg-ee6b5ae9f042c5906830667e7a304e4b.ctex"]
+dest_files=["res://.godot/imported/path.svg-ee6b5ae9f042c5906830667e7a304e4b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/polygon.svg b/assets/icons/element/polygon.svg
index 334e157..bb713e2 100644
--- a/assets/icons/element/polygon.svg
+++ b/assets/icons/element/polygon.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/polygon.svg.import b/assets/icons/element/polygon.svg.import
index 297e626..6e9ccbd 100644
--- a/assets/icons/element/polygon.svg.import
+++ b/assets/icons/element/polygon.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://g7je50vyh0l8"
-path="res://.godot/imported/polygon.svg-30f7ae5550207b78aaf4e1aa664e8a70.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/polygon.svg-30f7ae5550207b78aaf4e1aa664e8a70.svgtex"
[deps]
source_file="res://assets/icons/element/polygon.svg"
-dest_files=["res://.godot/imported/polygon.svg-30f7ae5550207b78aaf4e1aa664e8a70.ctex"]
+dest_files=["res://.godot/imported/polygon.svg-30f7ae5550207b78aaf4e1aa664e8a70.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/polyline.svg b/assets/icons/element/polyline.svg
index b33495f..9a67505 100644
--- a/assets/icons/element/polyline.svg
+++ b/assets/icons/element/polyline.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/polyline.svg.import b/assets/icons/element/polyline.svg.import
index 3685c6e..fb2d7d7 100644
--- a/assets/icons/element/polyline.svg.import
+++ b/assets/icons/element/polyline.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bmuevffyav7ev"
-path="res://.godot/imported/polyline.svg-2bbaec19007f0e891c2042cdc620cec8.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/polyline.svg-2bbaec19007f0e891c2042cdc620cec8.svgtex"
[deps]
source_file="res://assets/icons/element/polyline.svg"
-dest_files=["res://.godot/imported/polyline.svg-2bbaec19007f0e891c2042cdc620cec8.ctex"]
+dest_files=["res://.godot/imported/polyline.svg-2bbaec19007f0e891c2042cdc620cec8.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/radialGradient.svg b/assets/icons/element/radialGradient.svg
index 76efa05..2a82c82 100644
--- a/assets/icons/element/radialGradient.svg
+++ b/assets/icons/element/radialGradient.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/radialGradient.svg.import b/assets/icons/element/radialGradient.svg.import
index 44521a3..4dae2c3 100644
--- a/assets/icons/element/radialGradient.svg.import
+++ b/assets/icons/element/radialGradient.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://m0bt2nyq6axl"
-path="res://.godot/imported/radialGradient.svg-9a92a6ab7242431f519efb0f151b16d3.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/radialGradient.svg-9a92a6ab7242431f519efb0f151b16d3.svgtex"
[deps]
source_file="res://assets/icons/element/radialGradient.svg"
-dest_files=["res://.godot/imported/radialGradient.svg-9a92a6ab7242431f519efb0f151b16d3.ctex"]
+dest_files=["res://.godot/imported/radialGradient.svg-9a92a6ab7242431f519efb0f151b16d3.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/rect.svg b/assets/icons/element/rect.svg
index 1ba514b..999f2b1 100644
--- a/assets/icons/element/rect.svg
+++ b/assets/icons/element/rect.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/rect.svg.import b/assets/icons/element/rect.svg.import
index 1f8a883..ca3324c 100644
--- a/assets/icons/element/rect.svg.import
+++ b/assets/icons/element/rect.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://d32xg5svmjkb5"
-path="res://.godot/imported/rect.svg-d6a3f7f28d2b15590d408089237cd0f2.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/rect.svg-d6a3f7f28d2b15590d408089237cd0f2.svgtex"
[deps]
source_file="res://assets/icons/element/rect.svg"
-dest_files=["res://.godot/imported/rect.svg-d6a3f7f28d2b15590d408089237cd0f2.ctex"]
+dest_files=["res://.godot/imported/rect.svg-d6a3f7f28d2b15590d408089237cd0f2.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/stop.svg b/assets/icons/element/stop.svg
index c490893..5463c3a 100644
--- a/assets/icons/element/stop.svg
+++ b/assets/icons/element/stop.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/stop.svg.import b/assets/icons/element/stop.svg.import
index fdeba47..5fdc16b 100644
--- a/assets/icons/element/stop.svg.import
+++ b/assets/icons/element/stop.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cpict35mitaab"
-path="res://.godot/imported/stop.svg-2d7bf5bf2ae7f3caeb19ddca64f29801.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/stop.svg-2d7bf5bf2ae7f3caeb19ddca64f29801.svgtex"
[deps]
source_file="res://assets/icons/element/stop.svg"
-dest_files=["res://.godot/imported/stop.svg-2d7bf5bf2ae7f3caeb19ddca64f29801.ctex"]
+dest_files=["res://.godot/imported/stop.svg-2d7bf5bf2ae7f3caeb19ddca64f29801.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/svg.svg b/assets/icons/element/svg.svg
index ad5711a..7e810e3 100644
--- a/assets/icons/element/svg.svg
+++ b/assets/icons/element/svg.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/svg.svg.import b/assets/icons/element/svg.svg.import
index fb555d2..a300ff9 100644
--- a/assets/icons/element/svg.svg.import
+++ b/assets/icons/element/svg.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://d04w7h3k83w8u"
-path="res://.godot/imported/svg.svg-01f7f70f43cb14a0bd0e88e66f5f601c.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/svg.svg-01f7f70f43cb14a0bd0e88e66f5f601c.svgtex"
[deps]
source_file="res://assets/icons/element/svg.svg"
-dest_files=["res://.godot/imported/svg.svg-01f7f70f43cb14a0bd0e88e66f5f601c.ctex"]
+dest_files=["res://.godot/imported/svg.svg-01f7f70f43cb14a0bd0e88e66f5f601c.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/text.svg b/assets/icons/element/text.svg
index fa11868..59505ca 100644
--- a/assets/icons/element/text.svg
+++ b/assets/icons/element/text.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/text.svg.import b/assets/icons/element/text.svg.import
index 496802d..9c02b25 100644
--- a/assets/icons/element/text.svg.import
+++ b/assets/icons/element/text.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c2ienefxrtut"
-path="res://.godot/imported/text.svg-61984c9e1264a1413aac57ad546d8800.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/text.svg-61984c9e1264a1413aac57ad546d8800.svgtex"
[deps]
source_file="res://assets/icons/element/text.svg"
-dest_files=["res://.godot/imported/text.svg-61984c9e1264a1413aac57ad546d8800.ctex"]
+dest_files=["res://.godot/imported/text.svg-61984c9e1264a1413aac57ad546d8800.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/unrecognized.svg b/assets/icons/element/unrecognized.svg
index d020e43..b47b6db 100644
--- a/assets/icons/element/unrecognized.svg
+++ b/assets/icons/element/unrecognized.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/unrecognized.svg.import b/assets/icons/element/unrecognized.svg.import
index 7157acc..b8b3aeb 100644
--- a/assets/icons/element/unrecognized.svg.import
+++ b/assets/icons/element/unrecognized.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://brua6wag257kc"
-path="res://.godot/imported/unrecognized.svg-6aef9b7b04edb69be4536f6db80bf7de.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/unrecognized.svg-6aef9b7b04edb69be4536f6db80bf7de.svgtex"
[deps]
source_file="res://assets/icons/element/unrecognized.svg"
-dest_files=["res://.godot/imported/unrecognized.svg-6aef9b7b04edb69be4536f6db80bf7de.ctex"]
+dest_files=["res://.godot/imported/unrecognized.svg-6aef9b7b04edb69be4536f6db80bf7de.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/use.svg b/assets/icons/element/use.svg
index 4301e10..76df601 100644
--- a/assets/icons/element/use.svg
+++ b/assets/icons/element/use.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/use.svg.import b/assets/icons/element/use.svg.import
index cc0ca0a..e853cf8 100644
--- a/assets/icons/element/use.svg.import
+++ b/assets/icons/element/use.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://c1k88bqfhsvp5"
-path="res://.godot/imported/use.svg-7ae354a656abf9c2d947f0f7d986cf9a.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/use.svg-7ae354a656abf9c2d947f0f7d986cf9a.svgtex"
[deps]
source_file="res://assets/icons/element/use.svg"
-dest_files=["res://.godot/imported/use.svg-7ae354a656abf9c2d947f0f7d986cf9a.ctex"]
+dest_files=["res://.godot/imported/use.svg-7ae354a656abf9c2d947f0f7d986cf9a.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/xmlnodeCDATA.svg b/assets/icons/element/xmlnodeCDATA.svg
index 822c9f4..6db9c84 100644
--- a/assets/icons/element/xmlnodeCDATA.svg
+++ b/assets/icons/element/xmlnodeCDATA.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/xmlnodeCDATA.svg.import b/assets/icons/element/xmlnodeCDATA.svg.import
index 356a45d..4a7b38b 100644
--- a/assets/icons/element/xmlnodeCDATA.svg.import
+++ b/assets/icons/element/xmlnodeCDATA.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://cah2rt7uoi1qe"
-path="res://.godot/imported/xmlnodeCDATA.svg-821b4f23e43a14458164d978a1c917fa.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/xmlnodeCDATA.svg-821b4f23e43a14458164d978a1c917fa.svgtex"
[deps]
source_file="res://assets/icons/element/xmlnodeCDATA.svg"
-dest_files=["res://.godot/imported/xmlnodeCDATA.svg-821b4f23e43a14458164d978a1c917fa.ctex"]
+dest_files=["res://.godot/imported/xmlnodeCDATA.svg-821b4f23e43a14458164d978a1c917fa.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/xmlnodeComment.svg b/assets/icons/element/xmlnodeComment.svg
index f2801b1..9eda589 100644
--- a/assets/icons/element/xmlnodeComment.svg
+++ b/assets/icons/element/xmlnodeComment.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/xmlnodeComment.svg.import b/assets/icons/element/xmlnodeComment.svg.import
index e30985f..95b4100 100644
--- a/assets/icons/element/xmlnodeComment.svg.import
+++ b/assets/icons/element/xmlnodeComment.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://bpr1u3rvovpne"
-path="res://.godot/imported/xmlnodeComment.svg-e64e8cdac96d13dedef1f5b7f5fb6d44.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/xmlnodeComment.svg-e64e8cdac96d13dedef1f5b7f5fb6d44.svgtex"
[deps]
source_file="res://assets/icons/element/xmlnodeComment.svg"
-dest_files=["res://.godot/imported/xmlnodeComment.svg-e64e8cdac96d13dedef1f5b7f5fb6d44.ctex"]
+dest_files=["res://.godot/imported/xmlnodeComment.svg-e64e8cdac96d13dedef1f5b7f5fb6d44.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/element/xmlnodeText.svg b/assets/icons/element/xmlnodeText.svg
index 889e7ed..da983d8 100644
--- a/assets/icons/element/xmlnodeText.svg
+++ b/assets/icons/element/xmlnodeText.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/icons/element/xmlnodeText.svg.import b/assets/icons/element/xmlnodeText.svg.import
index ff4d728..9321f4b 100644
--- a/assets/icons/element/xmlnodeText.svg.import
+++ b/assets/icons/element/xmlnodeText.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://df4xrdgy2buli"
-path="res://.godot/imported/xmlnodeText.svg-1f05904b91e0239ca71b1204fe3661ac.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/xmlnodeText.svg-1f05904b91e0239ca71b1204fe3661ac.svgtex"
[deps]
source_file="res://assets/icons/element/xmlnodeText.svg"
-dest_files=["res://.godot/imported/xmlnodeText.svg-1f05904b91e0239ca71b1204fe3661ac.ctex"]
+dest_files=["res://.godot/imported/xmlnodeText.svg-1f05904b91e0239ca71b1204fe3661ac.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/foreign_logos/GithubLogo.svg.import b/assets/icons/foreign_logos/GithubLogo.svg.import
index 0dbd776..d941cd2 100644
--- a/assets/icons/foreign_logos/GithubLogo.svg.import
+++ b/assets/icons/foreign_logos/GithubLogo.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://ccc0q21h8owg1"
-path="res://.godot/imported/GithubLogo.svg-87728d1afe1eb4558de9b480e244157b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/GithubLogo.svg-87728d1afe1eb4558de9b480e244157b.svgtex"
[deps]
source_file="res://assets/icons/foreign_logos/GithubLogo.svg"
-dest_files=["res://.godot/imported/GithubLogo.svg-87728d1afe1eb4558de9b480e244157b.ctex"]
+dest_files=["res://.godot/imported/GithubLogo.svg-87728d1afe1eb4558de9b480e244157b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/foreign_logos/KoFiLogo.svg.import b/assets/icons/foreign_logos/KoFiLogo.svg.import
index 6801ccf..7e9017d 100644
--- a/assets/icons/foreign_logos/KoFiLogo.svg.import
+++ b/assets/icons/foreign_logos/KoFiLogo.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dcn1rq4e0p2jt"
-path="res://.godot/imported/KoFiLogo.svg-c60c977b7417aae3dea96e2b4511aab1.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/KoFiLogo.svg-c60c977b7417aae3dea96e2b4511aab1.svgtex"
[deps]
source_file="res://assets/icons/foreign_logos/KoFiLogo.svg"
-dest_files=["res://.godot/imported/KoFiLogo.svg-c60c977b7417aae3dea96e2b4511aab1.ctex"]
+dest_files=["res://.godot/imported/KoFiLogo.svg-c60c977b7417aae3dea96e2b4511aab1.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/foreign_logos/PatreonLogo.svg.import b/assets/icons/foreign_logos/PatreonLogo.svg.import
index 21e3675..1a96600 100644
--- a/assets/icons/foreign_logos/PatreonLogo.svg.import
+++ b/assets/icons/foreign_logos/PatreonLogo.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://dq1muwo84c6yv"
-path="res://.godot/imported/PatreonLogo.svg-936c5e07b71ef46c2ce08ed38c6f3f4b.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/PatreonLogo.svg-936c5e07b71ef46c2ce08ed38c6f3f4b.svgtex"
[deps]
source_file="res://assets/icons/foreign_logos/PatreonLogo.svg"
-dest_files=["res://.godot/imported/PatreonLogo.svg-936c5e07b71ef46c2ce08ed38c6f3f4b.ctex"]
+dest_files=["res://.godot/imported/PatreonLogo.svg-936c5e07b71ef46c2ce08ed38c6f3f4b.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/assets/icons/theme/GuiBoxChecked.svg b/assets/icons/theme/GuiBoxChecked.svg
deleted file mode 100644
index db416df..0000000
--- a/assets/icons/theme/GuiBoxChecked.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/GuiBoxChecked.svg.import b/assets/icons/theme/GuiBoxChecked.svg.import
deleted file mode 100644
index a763af2..0000000
--- a/assets/icons/theme/GuiBoxChecked.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://wdrpwa7gwmg"
-path="res://.godot/imported/GuiBoxChecked.svg-0b81fe49eae795bf0c65b284c995bf23.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/GuiBoxChecked.svg"
-dest_files=["res://.godot/imported/GuiBoxChecked.svg-0b81fe49eae795bf0c65b284c995bf23.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/GuiBoxCheckedDisabled.svg b/assets/icons/theme/GuiBoxCheckedDisabled.svg
deleted file mode 100644
index 8e07b5f..0000000
--- a/assets/icons/theme/GuiBoxCheckedDisabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/GuiBoxCheckedDisabled.svg.import b/assets/icons/theme/GuiBoxCheckedDisabled.svg.import
deleted file mode 100644
index bf9ec9a..0000000
--- a/assets/icons/theme/GuiBoxCheckedDisabled.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://d07xfjdtgtvop"
-path="res://.godot/imported/GuiBoxCheckedDisabled.svg-1a93efc893aebadff9e0b4f29007f60b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/GuiBoxCheckedDisabled.svg"
-dest_files=["res://.godot/imported/GuiBoxCheckedDisabled.svg-1a93efc893aebadff9e0b4f29007f60b.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/GuiBoxUnchecked.svg b/assets/icons/theme/GuiBoxUnchecked.svg
deleted file mode 100644
index 3169bf2..0000000
--- a/assets/icons/theme/GuiBoxUnchecked.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/GuiBoxUnchecked.svg.import b/assets/icons/theme/GuiBoxUnchecked.svg.import
deleted file mode 100644
index c52fa69..0000000
--- a/assets/icons/theme/GuiBoxUnchecked.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://d3a3xgsb8klyk"
-path="res://.godot/imported/GuiBoxUnchecked.svg-6e192c9acff30a10fef6cd012185a66d.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/GuiBoxUnchecked.svg"
-dest_files=["res://.godot/imported/GuiBoxUnchecked.svg-6e192c9acff30a10fef6cd012185a66d.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/GuiBoxUncheckedDisabled.svg b/assets/icons/theme/GuiBoxUncheckedDisabled.svg
deleted file mode 100644
index 6456c5a..0000000
--- a/assets/icons/theme/GuiBoxUncheckedDisabled.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/GuiBoxUncheckedDisabled.svg.import b/assets/icons/theme/GuiBoxUncheckedDisabled.svg.import
deleted file mode 100644
index 2d9df12..0000000
--- a/assets/icons/theme/GuiBoxUncheckedDisabled.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://xbycstdv7g3m"
-path="res://.godot/imported/GuiBoxUncheckedDisabled.svg-f3e230fd3d62561ea43cf23f6a6a4132.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/GuiBoxUncheckedDisabled.svg"
-dest_files=["res://.godot/imported/GuiBoxUncheckedDisabled.svg-f3e230fd3d62561ea43cf23f6a6a4132.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/GuiToggleChecked.svg b/assets/icons/theme/GuiToggleChecked.svg
deleted file mode 100644
index c3ed5f0..0000000
--- a/assets/icons/theme/GuiToggleChecked.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/GuiToggleChecked.svg.import b/assets/icons/theme/GuiToggleChecked.svg.import
deleted file mode 100644
index 76d65be..0000000
--- a/assets/icons/theme/GuiToggleChecked.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dwlr4bgptgwho"
-path="res://.godot/imported/GuiToggleChecked.svg-4019ea7f600c5c80e2418ed0d8365df3.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/GuiToggleChecked.svg"
-dest_files=["res://.godot/imported/GuiToggleChecked.svg-4019ea7f600c5c80e2418ed0d8365df3.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/GuiToggleUnchecked.svg b/assets/icons/theme/GuiToggleUnchecked.svg
deleted file mode 100644
index 19b7a6d..0000000
--- a/assets/icons/theme/GuiToggleUnchecked.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/GuiToggleUnchecked.svg.import b/assets/icons/theme/GuiToggleUnchecked.svg.import
deleted file mode 100644
index 8106f30..0000000
--- a/assets/icons/theme/GuiToggleUnchecked.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c12tg3dnydily"
-path="res://.godot/imported/GuiToggleUnchecked.svg-e2841c8a1316d6f4769485b0082b165b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/GuiToggleUnchecked.svg"
-dest_files=["res://.godot/imported/GuiToggleUnchecked.svg-e2841c8a1316d6f4769485b0082b165b.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/SplitGrabber.svg b/assets/icons/theme/SplitGrabber.svg
deleted file mode 100644
index f72bdd8..0000000
--- a/assets/icons/theme/SplitGrabber.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/SplitGrabber.svg.import b/assets/icons/theme/SplitGrabber.svg.import
deleted file mode 100644
index b331cc1..0000000
--- a/assets/icons/theme/SplitGrabber.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cnig3sejwsrf3"
-path="res://.godot/imported/SplitGrabber.svg-b13ab8037db30039b965a06e36bacf27.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/SplitGrabber.svg"
-dest_files=["res://.godot/imported/SplitGrabber.svg-b13ab8037db30039b965a06e36bacf27.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/icons/theme/SplitGrabber2.svg b/assets/icons/theme/SplitGrabber2.svg
deleted file mode 100644
index c3bcb36..0000000
--- a/assets/icons/theme/SplitGrabber2.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icons/theme/SplitGrabber2.svg.import b/assets/icons/theme/SplitGrabber2.svg.import
deleted file mode 100644
index a5a30a7..0000000
--- a/assets/icons/theme/SplitGrabber2.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://co75w07yqmcro"
-path="res://.godot/imported/SplitGrabber2.svg-5f4dbb5977ce370963d5ee5a6881e9b5.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://assets/icons/theme/SplitGrabber2.svg"
-dest_files=["res://.godot/imported/SplitGrabber2.svg-5f4dbb5977ce370963d5ee5a6881e9b5.ctex"]
-
-[params]
-
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
diff --git a/assets/logos/icon.svg.import b/assets/logos/icon.svg.import
index 57dec04..85d78af 100644
--- a/assets/logos/icon.svg.import
+++ b/assets/logos/icon.svg.import
@@ -1,37 +1,18 @@
[remap]
-importer="texture"
-type="CompressedTexture2D"
+importer="svg"
+type="SVGTexture"
uid="uid://barsurula6j8n"
-path="res://.godot/imported/icon.svg-6128c91ba220bf70fcc2a632eba0b81d.ctex"
-metadata={
-"vram_texture": false
-}
+path="res://.godot/imported/icon.svg-6128c91ba220bf70fcc2a632eba0b81d.svgtex"
[deps]
source_file="res://assets/logos/icon.svg"
-dest_files=["res://.godot/imported/icon.svg-6128c91ba220bf70fcc2a632eba0b81d.ctex"]
+dest_files=["res://.godot/imported/icon.svg-6128c91ba220bf70fcc2a632eba0b81d.svgtex"]
[params]
-compress/mode=0
-compress/high_quality=false
-compress/lossy_quality=0.7
-compress/hdr_compression=1
-compress/normal_map=0
-compress/channel_pack=0
-mipmaps/generate=false
-mipmaps/limit=-1
-roughness/mode=0
-roughness/src_normal=""
-process/fix_alpha_border=true
-process/premult_alpha=false
-process/normal_map_invert_y=false
-process/hdr_as_srgb=false
-process/hdr_clamp_exposure=false
-process/size_limit=0
-detect_3d/compress_to=1
-svg/scale=1.0
-editor/scale_with_editor_scale=false
-editor/convert_colors_with_editor_theme=false
+base_scale=1.0
+saturation=1.0
+color_map={}
+compress=true
diff --git a/godot_only/android_icons/monochrome_white.png.import b/godot_only/android_icons/monochrome_white.png.import
index 59112ad..399be42 100644
--- a/godot_only/android_icons/monochrome_white.png.import
+++ b/godot_only/android_icons/monochrome_white.png.import
@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/monochrome_white.png-336fe08161ffbbd756752ed6
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
+compress/uastc_level=0
+compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
@@ -25,6 +27,10 @@ mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
+process/channel_remap/red=0
+process/channel_remap/green=1
+process/channel_remap/blue=2
+process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
diff --git a/godot_only/scripts/Stopwatch.gd b/godot_only/scripts/Stopwatch.gd
new file mode 100644
index 0000000..8062b97
--- /dev/null
+++ b/godot_only/scripts/Stopwatch.gd
@@ -0,0 +1,21 @@
+class_name Stopwatch extends RefCounted
+
+var precise: bool
+var name: String
+var start_ticks: int
+
+static func start(precise_to_microseconds := true, new_name := "Elapsed time") -> Stopwatch:
+ var new_stopwatch := Stopwatch.new()
+ new_stopwatch.precise = precise_to_microseconds
+ new_stopwatch.name = new_name
+ new_stopwatch.start_ticks = new_stopwatch.get_ticks()
+ return new_stopwatch
+
+func measure(reset := false) -> void:
+ var elapsed := get_ticks() - start_ticks
+ print_rich("[b]%s:[/b] %d%s" % [name, elapsed, "us" if precise else "ms"])
+ if reset:
+ start_ticks = get_ticks()
+
+func get_ticks() -> int:
+ return Time.get_ticks_usec() if precise else Time.get_ticks_msec()
diff --git a/godot_only/scripts/Stopwatch.gd.uid b/godot_only/scripts/Stopwatch.gd.uid
new file mode 100644
index 0000000..2300f09
--- /dev/null
+++ b/godot_only/scripts/Stopwatch.gd.uid
@@ -0,0 +1 @@
+uid://c6f4iki4abp4q
diff --git a/godot_only/scripts/tests.gd b/godot_only/scripts/tests.gd
index 38a96a2..35b7417 100644
--- a/godot_only/scripts/tests.gd
+++ b/godot_only/scripts/tests.gd
@@ -4,60 +4,105 @@
@tool
extends EditorScript
+var report := PackedStringArray()
+
func _run() -> void:
pathdata_tests()
transform_list_tests()
+ if report.is_empty():
+ print_rich("[rainbow sat=0.4 val=1.0]Success[/rainbow]")
+ else:
+ for report_line in report:
+ print_rich(report_line)
+
+func add_to_report(test_category: String, test: String, result: String,
+expected: String) -> void:
+ report.append('%s: [b]"%s"[/b] returned [b]"%s"[/b], expected [b]"%s"[/b]' %\
+ [test_category, test, result, expected])
+# This test is dependent on specifics of the Formatter and AttributePathdata classes.
+# But its logic would likely not change enough in the future to make the tests obsolete.
+# https://www.w3.org/TR/SVG11/paths.html#PathDataBNF
+# We have a difference in logic where we don't require starting with MoveTo
+# in order to make pathdata easier to edit.
+# ClosePath are also merged, so you don't end up with invalid syntax after commands are deleted.
func pathdata_tests() -> void:
- const tests: Dictionary[String, Array] = {
- "Jerky": [],
- "M 3s 6 h 6 v 3 z": [],
- "M 3 s6 h 6 v 3 z": [],
- "M 3 .s6 h 6 v 3 z": [],
- " 0 2": [],
- "M 0 0": [["M", 0.0, 0.0]],
- "M2 1 L3 4": [["M", 2.0, 1.0], ["L", 3.0, 4.0]],
- "m2 0 3 4": [["m", 2.0, 0.0], ["l", 3.0, 4.0]],
- "m-2.3.7-4,4": [["m", -2.3, 0.7], ["l", -4.0, 4.0]],
- "m2 3a7 3 0 101.2.3": [["m", 2.0, 3.0], ["a", 7.0, 3.0, 0.0, 1, 0, 1.2, 0.3]],
- "M 2 0 c3 2-.6.8 11.0 3Jh3": [["M", 2.0, 0.0], ["c", 3.0, 2.0, -0.6, 0.8, 11.0, 3.0]],
- "z": [["z"]],
- "M 0 0 z 2 3": [["M", 0.0, 0.0], ["z"]],
- "M3e1 4e-2": [["M", 3e1, 4e-2]],
- "M5,1 A4,4,0,1,1,5,9": [["M", 5.0, 1.0], ["A", 4.0, 4.0, 0.0, 1, 1, 5.0, 9.0]],
- "M4 1 2 - 4 4z": [["M", 4.0, 1.0]],
- "M1 6.9e-1": [["M", 1.0, 0.69]],
+ var spacious_formatter := Formatter.new()
+ spacious_formatter.pathdata_compress_numbers = false
+ spacious_formatter.pathdata_minimize_spacing = false
+ spacious_formatter.pathdata_remove_consecutive_commands = false
+ spacious_formatter.pathdata_remove_spacing_after_flags = false
+ const tests: Dictionary[String, String] = {
+ "": "",
+ " \n\r\t": "",
+ "Jerky": "",
+ "M 3s 6 h 6 v 3 z": "",
+ "M 3 s6 h 6 v 3 z": "",
+ "M 3 .s6 h 6 v 3 z": "",
+ " 0 2": "",
+ "M , 1 2": "",
+ "M1 2": "M 1 2",
+ "M 1 2,": "M 1 2",
+ "M 1 2, h 3": "M 1 2 h 3",
+ "M2..5": "M 2 0.5",
+ "q 1, 2 ,3 , 4 l 5 ,, 6": "q 1 2 3 4",
+ "M2 1 L3 4": "M 2 1 L 3 4",
+ "m2 0 3 4": "m 2 0 l 3 4",
+ "m-2.3.7-4,4": "m -2.3 0.7 l -4 4",
+ "a7 3 0 101.2.3": "a 7 3 0 1 0 1.2 0.3",
+ "A10 10 0 2 0 100 100": "",
+ "a5,5,45,-10,50,50": "",
+ "A4 4 0 1 0. 9 7": "",
+ "A4 4 0 1 0.9 7": "A 4 4 0 1 0 0.9 7",
+ "A 10 0 2 0 100 7": "A 10 0 2 0 1 0 7",
+ "M 2 0 c3 2-.6.8 11.0 3Jh3": "M 2 0 c 3 2 -0.6 0.8 11 3",
+ "z": "z",
+ "M 0 0 z 2 3": "M 0 0 z",
+ "M3e1 4e-2 h2e+2": "M 30 0.04 h 200",
+ "M2. 3.": "M 2 3",
+ "M5,1 A4,4,0,1,1,5,9": "M 5 1 A 4 4 0 1 1 5 9",
+ "M4 1 2 - 4 4z": "M 4 1",
+ "M1 6.9E-1": "M 1 0.69",
+ " \tM\t1\t,\t2": "M 1 2",
+ "M 1 2 zZzz M 3 4": "M 1 2 z M 3 4",
}
for test in tests:
- var result := AttributePathdata.pathdata_to_arrays(test)
- var expected: Array = tests[test]
- if result != expected:
- print('"' + test + '" generated ' + str(result) + ', expected ' + str(expected))
+ var pathdata := AttributePathdata.new("d")
+ var result := pathdata.path_commands_to_text(AttributePathdata.parse_pathdata(test), spacious_formatter)
+ if result != tests[test]:
+ add_to_report("Pathdata parser", test, result, tests[test])
+# This test is dependent on specifics of the Formatter and AttributeTransformList classes.
+# But its logic would likely not change enough in the future to make the tests obsolete.
+# https://www.w3.org/TR/SVG11/coords.html#TransformAttribute
func transform_list_tests() -> void:
- var tests: Dictionary[String, Array] = {
- "Jerky": [],
- "matrix(1, 0, 0, 5, 0, 3)": [Transform.TransformMatrix.new(1, 0, 0, 5, 0, 3)],
- "matrix(1 0 0 5 0 3)": [Transform.TransformMatrix.new(1, 0, 0, 5, 0, 3)],
+ var spacious_formatter := Formatter.new()
+ spacious_formatter.transform_list_compress_numbers = false
+ spacious_formatter.transform_list_minimize_spacing = false
+ spacious_formatter.transform_list_remove_unnecessary_params = false
+ var tests: Dictionary[String, String] = {
+ "": "",
+ " \n\r\t": "",
+ "Jerky": "",
+ "matrix(1 0 0 5 0 3)": "matrix(1 0 0 5 0 3)",
+ "matrix(1, 0, 0 , 5, 0, 3)": "matrix(1 0 0 5 0 3)",
+ "\tmatrix (1. 0. 0. .5 0. 3. )": "matrix(1 0 0 0.5 0 3)",
+ "translate(10.) scale(.5) rotate(7)": "translate(10 0) scale(0.5 0.5) rotate(7 0 0)",
+ "skewX(3) , skewY(4)": "skewX(3) skewY(4)",
+ "skewX(3) , skewY(4 2)": "",
+ "skewX(3) ,, skewY(4)": "",
+ "skewX(3)skewY(4)": "",
+ "scale(2,)": "",
+ "translate(,10)": "",
+ "scale(2, 2": "",
+ "matrix(1e2,0,0,1e-2,1.2E+1.4e1)": "matrix(100 0 0 0.01 12 4)",
+ "matrix(1 0 0 1)": "",
+ "matrix(1.2 0 0 1 0 0 0)": "",
}
for test in tests:
- var test_passed := true
- var result := AttributeTransformList.text_to_transform_list(test)
- var expected := tests[test]
- if expected.size() != result.size():
- test_passed = false
- else:
- for i in expected.size():
- if expected[i] is Transform.TransformMatrix and\
- (not result[i] is Transform.TransformMatrix or\
- expected[i].x1 != result[i].x1 or expected[i].x2 != result[i].x2 or\
- expected[i].y1 != result[i].y1 or expected[i].y2 != result[i].y2 or\
- expected[i].o1 != result[i].o1 or expected[i].o2 != result[i].o2):
- test_passed = false
- break
-
- if not test_passed:
- print('"' + test + '" generated ' + str(result))
+ var result := AttributeTransformList.new("transform")._format(test, spacious_formatter)
+ if result != tests[test]:
+ add_to_report("Transform list parser", test, result, tests[test])
diff --git a/godot_only/scripts/update_translations.gd b/godot_only/scripts/update_translations.gd
index 6221ac0..b4ac7cf 100644
--- a/godot_only/scripts/update_translations.gd
+++ b/godot_only/scripts/update_translations.gd
@@ -7,10 +7,15 @@ const COMMENTS_DICT = {
"CDATA color": "CDATA shouldn't be translated. It's a type of XML section.",
"Editor formatter": "Refers to the formatter used for GodSVG's code editor.",
"Export formatter": "Refers to the formatter used when exporting.",
- "Handle colors": "Refers to the colors of the draggable handles.",
- "Handle size": "Refers to the size of the draggable handles.",
+ "Handles": "Refers to the draggable gizmos.",
+ "Dash length": "Refers to the selection rectangle's animated dashed stroke.",
"Excluded": "Refers to the zero, one, or multiple UI parts to not be shown in the final layout. It's of plural cardinality.",
"Update check failed": "When checking for updates.",
+ "Project Founder and Manager": "If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.",
+ "V-Sync": "Stands for \"Vertical Synchronization\".",
+ "Dark": "Refers to a theme preset.",
+ "Light": "Refers to a theme preset.",
+ "Black (OLED)": "Refers to a theme preset.",
}
const TRANSLATIONS_DIR = "translations"
@@ -92,28 +97,32 @@ func search_directory(dir: String) -> void:
func update_translations() -> void:
var used_comments := PackedStringArray()
- var location := ProjectSettings.globalize_path(TRANSLATIONS_DIR + "/GodSVG.pot")
- var fa := FileAccess.open(location, FileAccess.WRITE)
- fa.store_string(HEADER)
+ var folder_location := ProjectSettings.globalize_path(TRANSLATIONS_DIR)
+ var pot_location := folder_location.path_join("GodSVG.pot")
+ var fa := FileAccess.open(pot_location, FileAccess.WRITE)
+ fa.store_string(HEADER)
for msg in messages:
if COMMENTS_DICT.has(msg.msgid):
fa.store_string("#. %s\n" % COMMENTS_DICT[msg.msgid])
used_comments.append(msg.msgid)
fa.store_string(msg.to_string())
fa = null
- print("Created " + TRANSLATIONS_DIR + "/GodSVG.pot with %d strings" % (messages.size() + 1))
+ print("Created %s with %d strings" % [TRANSLATIONS_DIR.path_join("/GodSVG.pot"),
+ (messages.size() + 1)])
- var files := DirAccess.get_files_at(ProjectSettings.globalize_path(TRANSLATIONS_DIR))
- for file in files:
+ for file in DirAccess.get_files_at(folder_location):
if not (file.get_extension() == "po" or file == "GodSVG.pot"):
continue
var args := PackedStringArray(["--update", "--quiet", "--verbose", "--backup=off",
- ProjectSettings.globalize_path(TRANSLATIONS_DIR).path_join(file), location])
+ folder_location.path_join(file), pot_location])
var output: Array = []
var result := OS.execute("msgmerge", args, output, true)
if not result == -1:
+ var po_location = folder_location.path_join(file)
+ args = PackedStringArray(["--no-wrap", po_location, "-o", po_location])
+ OS.execute("msgcat", args)
if file == "GodSVG.pot":
continue
elif not output.is_empty():
diff --git a/project.godot b/project.godot
index a87a275..84248c4 100644
--- a/project.godot
+++ b/project.godot
@@ -46,6 +46,7 @@ enabled=PackedStringArray()
[filesystem]
+import/fbx2gltf/enabled=false
import/blender/enabled=false
import/fbx/enabled=false
diff --git a/src/autoload/Configs.gd b/src/autoload/Configs.gd
index 0e3481c..48f8d9b 100644
--- a/src/autoload/Configs.gd
+++ b/src/autoload/Configs.gd
@@ -1,42 +1,27 @@
# This singleton handles session data and settings.
extends Node
-@warning_ignore("unused_signal")
+@warning_ignore_start("unused_signal")
signal highlighting_colors_changed
-@warning_ignore("unused_signal")
signal snap_changed
-@warning_ignore("unused_signal")
signal language_changed
-@warning_ignore("unused_signal")
signal ui_scale_changed
-@warning_ignore("unused_signal")
signal theme_changed
-@warning_ignore("unused_signal")
signal shortcuts_changed
-@warning_ignore("unused_signal")
signal basic_colors_changed
-@warning_ignore("unused_signal")
signal handle_visuals_changed
-@warning_ignore("unused_signal")
+signal selection_rectangle_visuals_changed
signal grid_color_changed
-@warning_ignore("unused_signal")
signal shortcut_panel_changed
-@warning_ignore("unused_signal")
signal active_tab_status_changed
-@warning_ignore("unused_signal")
signal active_tab_reference_changed
-@warning_ignore("unused_signal")
signal active_tab_changed
-@warning_ignore("unused_signal")
signal tabs_changed
-@warning_ignore("unused_signal")
signal tab_removed
-@warning_ignore("unused_signal")
signal tab_selected(index: int)
-@warning_ignore("unused_signal")
signal layout_changed
-@warning_ignore("unused_signal")
signal orientation_changed
+@warning_ignore_restore("unused_signal")
var current_sdk: int = -1
@@ -82,7 +67,6 @@ func _enter_tree() -> void:
if InputMap.has_action(action):
default_shortcuts[action] = InputMap.action_get_events(action)
load_config()
- ThemeUtils.generate_and_apply_theme()
func load_config() -> void:
@@ -109,8 +93,10 @@ func reset_settings() -> void:
func post_load() -> void:
savedata.get_active_tab().activate()
- sync_background_color()
+ sync_canvas_color()
sync_locale()
+ sync_max_fps()
+ sync_theme()
func generate_highlighter() -> SVGHighlighter:
@@ -128,11 +114,22 @@ func generate_highlighter() -> SVGHighlighter:
# Global effects from settings. Some of them should also be used on launch.
-func sync_background_color() -> void:
- RenderingServer.set_default_clear_color(savedata.background_color)
+func sync_canvas_color() -> void:
+ RenderingServer.set_default_clear_color(savedata.canvas_color)
func sync_locale() -> void:
if not savedata.language in TranslationServer.get_loaded_locales():
savedata.language = "en"
else:
TranslationServer.set_locale(savedata.language)
+
+func sync_vsync() -> void:
+ DisplayServer.window_set_vsync_mode(
+ DisplayServer.VSYNC_ENABLED if savedata.vsync else DisplayServer.VSYNC_DISABLED)
+
+func sync_max_fps() -> void:
+ Engine.max_fps = savedata.max_fps
+
+func sync_theme() -> void:
+ ThemeUtils.generate_and_apply_theme()
+ theme_changed.emit()
diff --git a/src/autoload/HandlerGUI.gd b/src/autoload/HandlerGUI.gd
index 9713808..86f12dc 100644
--- a/src/autoload/HandlerGUI.gd
+++ b/src/autoload/HandlerGUI.gd
@@ -138,22 +138,40 @@ func remove_all_menus() -> void:
throw_mouse_motion_event()
-func add_popup(new_popup: Control) -> void:
+# The passed popup control may be added to a shadow panel. The shadow panel is
+# returned by the method if that's the case. Otherwise, the original panel is returned.
+func add_popup(new_popup: Control, add_shadow := true) -> Control:
var overlay_ref := Control.new()
overlay_ref.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
overlay_ref.gui_input.connect(_parse_popup_overlay_event)
popup_stack.append(overlay_ref)
get_tree().root.add_child(overlay_ref)
- overlay_ref.add_child(new_popup)
- if new_popup is PanelContainer:
- var stylebox := new_popup.get_theme_stylebox("panel").duplicate()
- stylebox.shadow_color = Color(0, 0, 0, 0.1)
- stylebox.shadow_size = 8
- new_popup.add_theme_stylebox_override("panel", stylebox)
-
- new_popup.reset_size()
- new_popup.tree_exiting.connect(remove_popup.bind(overlay_ref))
- throw_mouse_motion_event()
+ if add_shadow:
+ var shadow_container := PanelContainer.new()
+ var sb := StyleBoxFlat.new()
+ sb.bg_color = Color(0, 0, 0, 0.1)
+ sb.shadow_color = Color(0, 0, 0, 0.1)
+ sb.shadow_size = 8
+ if new_popup is PanelContainer:
+ var stylebox_wrapped := new_popup.get_theme_stylebox("panel")
+ sb.corner_radius_top_left = stylebox_wrapped.corner_radius_top_left
+ sb.corner_radius_bottom_left = stylebox_wrapped.corner_radius_bottom_left
+ sb.corner_radius_top_right = stylebox_wrapped.corner_radius_top_right
+ sb.corner_radius_bottom_right = stylebox_wrapped.corner_radius_bottom_right
+ new_popup.resized.connect(shadow_container.reset_size)
+ shadow_container.add_theme_stylebox_override("panel", sb)
+ shadow_container.add_child(new_popup)
+ overlay_ref.add_child(shadow_container)
+ shadow_container.reset_size()
+ new_popup.tree_exiting.connect(remove_popup.bind(overlay_ref))
+ throw_mouse_motion_event()
+ return shadow_container
+ else:
+ overlay_ref.add_child(new_popup)
+ new_popup.reset_size()
+ new_popup.tree_exiting.connect(remove_popup.bind(overlay_ref))
+ throw_mouse_motion_event()
+ return new_popup
func remove_popup(overlay_ref: Control = null) -> void:
if popup_stack.is_empty():
@@ -178,41 +196,41 @@ func remove_all_popups() -> void:
# Should usually be the global rect of a control.
func popup_under_rect(popup: Control, rect: Rect2, vp: Viewport) -> void:
- add_popup(popup)
+ var top_popup := add_popup(popup)
var screen_transform := vp.get_screen_transform()
var screen_h := vp.get_visible_rect().size.y
var popup_pos := Vector2(rect.position.x, 0)
# Popup below if there's enough space or we're in the bottom half of the screen.
- if rect.position.y + rect.size.y + popup.size.y < screen_h or\
+ if rect.position.y + rect.size.y + top_popup.size.y < screen_h or\
rect.position.y + rect.size.y / 2 <= screen_h / 2.0:
popup_pos.y = rect.position.y + rect.size.y
else:
- popup_pos.y = rect.position.y - popup.size.y
+ popup_pos.y = rect.position.y - top_popup.size.y
popup_pos += screen_transform.get_origin() / screen_transform.get_scale()
- popup.position = popup_clamp_pos(popup, popup_pos, vp)
+ top_popup.position = popup_clamp_pos(top_popup, popup_pos, vp)
# Should usually be the global rect of a control.
func popup_under_rect_center(popup: Control, rect: Rect2, vp: Viewport) -> void:
- add_popup(popup)
+ var top_popup := add_popup(popup)
var screen_transform := vp.get_screen_transform()
var screen_h := vp.get_visible_rect().size.y
- var popup_pos := Vector2(rect.position.x - popup.size.x / 2.0 + rect.size.x / 2, 0)
+ var popup_pos := Vector2(rect.position.x - top_popup.size.x / 2.0 + rect.size.x / 2, 0)
# Popup below if there's enough space or we're in the bottom half of the screen.
- if rect.position.y + rect.size.y + popup.size.y < screen_h or\
+ if rect.position.y + rect.size.y + top_popup.size.y < screen_h or\
rect.position.y + rect.size.y / 2 <= screen_h / 2.0:
popup_pos.y = rect.position.y + rect.size.y
else:
- popup_pos.y = rect.position.y - popup.size.y
+ popup_pos.y = rect.position.y - top_popup.size.y
# Align horizontally and other things.
popup_pos += screen_transform.get_origin() / screen_transform.get_scale()
- popup.position = popup_clamp_pos(popup, popup_pos, vp)
+ top_popup.position = popup_clamp_pos(top_popup, popup_pos, vp)
# Should usually be the global position of the mouse.
func popup_under_pos(popup: Control, pos: Vector2, vp: Viewport) -> void:
- add_popup(popup)
+ var top_popup := add_popup(popup)
var screen_transform := vp.get_screen_transform()
pos += screen_transform.get_origin() / screen_transform.get_scale()
- popup.position = popup_clamp_pos(popup, pos, vp)
+ top_popup.position = popup_clamp_pos(top_popup, pos, vp)
# Helper.
func popup_clamp_pos(popup: Control, attempt_pos: Vector2, vp: Viewport) -> Vector2:
@@ -409,7 +427,6 @@ func get_min_ui_scale(usable_screen_size: Vector2i) -> float:
func get_auto_ui_scale() -> float:
var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen())
- print(dpi)
var base_dpi := 160.0
var scale := dpi / base_dpi
var blend: float = clamp((dpi - 240.0) / 400.0, 0.0, 1.0)
diff --git a/src/config_classes/ConfigResource.gd b/src/config_classes/ConfigResource.gd
index f68b334..2e2d5e4 100644
--- a/src/config_classes/ConfigResource.gd
+++ b/src/config_classes/ConfigResource.gd
@@ -1,18 +1,25 @@
# Implements a very useful signal.
-class_name ConfigResource extends Resource
+@abstract class_name ConfigResource extends Resource
signal changed_deferred
+var _initial_load_finished := false
var _changed_deferred_pending := false
func _init() -> void:
changed.connect(_queue_emit_changed_deferred)
+ set_deferred("_initial_load_finished", true)
func _queue_emit_changed_deferred() -> void:
- emit_changed_deferred.call_deferred()
- _changed_deferred_pending = true
+ if _initial_load_finished:
+ emit_changed_deferred.call_deferred()
+ _changed_deferred_pending = true
func emit_changed_deferred() -> void:
if _changed_deferred_pending:
_changed_deferred_pending = false
changed_deferred.emit()
+
+func external_call(callback: Callable) -> void:
+ if _initial_load_finished:
+ callback.call_deferred()
diff --git a/src/config_classes/SVGHighlighter.gd b/src/config_classes/SVGHighlighter.gd
index c8abfed..1f2cfb6 100644
--- a/src/config_classes/SVGHighlighter.gd
+++ b/src/config_classes/SVGHighlighter.gd
@@ -13,11 +13,11 @@ var error_color := Color("ff866b")
var element_color := Color("ff8ccc"):
set(new_value):
element_color = new_value
- unrecognized_element_color = Color(new_value, new_value.a * 2 / 3.0)
+ unrecognized_element_color = Color(new_value, new_value.a * 0.7)
var attribute_color := Color("bce0ff"):
set(new_value):
attribute_color = new_value
- unrecognized_attribute_color = Color(new_value, new_value.a * 2 / 3.0)
+ unrecognized_attribute_color = Color(new_value, new_value.a * 0.7)
func _get_line_syntax_highlighting(line: int) -> Dictionary:
diff --git a/src/config_classes/SaveData.gd b/src/config_classes/SaveData.gd
index 6b57916..f3d3e15 100644
--- a/src/config_classes/SaveData.gd
+++ b/src/config_classes/SaveData.gd
@@ -1,5 +1,8 @@
class_name SaveData extends ConfigResource
+enum ThemePreset {DARK, LIGHT, BLACK}
+enum HighlighterPreset {DEFAULT_DARK, DEFAULT_LIGHT}
+
const GoodColorPicker = preload("res://src/ui_widgets/good_color_picker.gd")
const ShortcutPanel = preload("res://src/ui_parts/shortcut_panel.gd")
@@ -9,39 +12,108 @@ var _shortcut_validities: Dictionary[Key, bool] = {}
# Most settings don't need a default.
func get_setting_default(setting: String) -> Variant:
match setting:
- "highlighting_symbol_color": return Color("abc9ff")
- "highlighting_element_color": return Color("ff8ccc")
- "highlighting_attribute_color": return Color("bce0ff")
- "highlighting_string_color": return Color("a1ffe0")
- "highlighting_comment_color": return Color("cdcfd280")
- "highlighting_text_color": return Color("cdcfeaac")
- "highlighting_cdata_color": return Color("ffeda1ac")
- "highlighting_error_color": return Color("ff5555")
+ "base_color":
+ match theme_preset:
+ ThemePreset.DARK: return Color("10101d")
+ ThemePreset.LIGHT: return Color("e6e6ff")
+ ThemePreset.BLACK: return Color("000")
+ "accent_color":
+ match theme_preset:
+ ThemePreset.DARK: return Color("668cff")
+ ThemePreset.LIGHT: return Color("0830a6ff")
+ ThemePreset.BLACK: return Color("7c8dbf")
+ "highlighter_preset":
+ match theme_preset:
+ ThemePreset.DARK, ThemePreset.BLACK: return HighlighterPreset.DEFAULT_DARK
+ ThemePreset.LIGHT: return HighlighterPreset.DEFAULT_LIGHT
+ "highlighting_symbol_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("abc9ff")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("23488c")
+ "highlighting_element_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("ff8ccc")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("8c004b")
+ "highlighting_attribute_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("bce0ff")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("003666")
+ "highlighting_string_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("a1ffe0")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("006644")
+ "highlighting_comment_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("d4d6d980")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("3e3e4080")
+ "highlighting_text_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("d5d7f2aa")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("242433aa")
+ "highlighting_cdata_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("ffeda1ac")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("40360dac")
+ "highlighting_error_color":
+ match highlighter_preset:
+ HighlighterPreset.DEFAULT_DARK: return Color("f55")
+ HighlighterPreset.DEFAULT_LIGHT: return Color("cc0000")
+ "basic_color_valid":
+ match theme_preset:
+ ThemePreset.DARK,ThemePreset.BLACK: return Color("9f9")
+ ThemePreset.LIGHT: return Color("2b2")
+ "basic_color_error":
+ match theme_preset:
+ ThemePreset.DARK,ThemePreset.BLACK: return Color("f99")
+ ThemePreset.LIGHT: return Color("b22")
+ "basic_color_warning":
+ match theme_preset:
+ ThemePreset.DARK,ThemePreset.BLACK: return Color("ee5")
+ ThemePreset.LIGHT: return Color("991")
+ "handle_size": return 1.0 if OS.get_name() != "Android" else 2.0
"handle_inner_color": return Color("fff")
"handle_color": return Color("111")
"handle_hovered_color": return Color("aaa")
"handle_selected_color": return Color("46f")
"handle_hovered_selected_color": return Color("f44")
- "background_color": return Color(0.12, 0.132, 0.2, 1)
- "grid_color": return Color(0.5, 0.5, 0.5)
- "basic_color_valid": return Color("9f9")
- "basic_color_error": return Color("f99")
- "basic_color_warning": return Color("ee5")
+ "selection_rectangle_speed": return 30.0
+ "selection_rectangle_width": return 2.0
+ "selection_rectangle_dash_length": return 10.0
+ "selection_rectangle_color1": return Color("fffc")
+ "selection_rectangle_color2": return Color("000c")
+ "canvas_color":
+ match theme_preset:
+ ThemePreset.DARK: return Color("1f2233")
+ ThemePreset.LIGHT: return Color("fff")
+ ThemePreset.BLACK: return Color("000")
+ "grid_color":
+ match theme_preset:
+ ThemePreset.DARK,ThemePreset.BLACK: return Color("808080")
+ ThemePreset.LIGHT: return Color("666")
"invert_zoom": return false
"wraparound_panning": return false
"use_ctrl_for_zoom": return true
"use_native_file_dialog": return true
"use_filename_for_window_title": return true
- "handle_size": return 1.0 if OS.get_name() != "Android" else 2.0
"ui_scale": return ScalingApproach.AUTO
- "custom_ui_scale": return true
+ "vsync": return true
+ "max_fps": return 0
return null
func reset_to_default() -> void:
for setting in _get_setting_names():
set(setting, get_setting_default(setting))
+func reset_theme_items_to_default() -> void:
+ for setting in theme_items:
+ set(setting, get_setting_default(setting))
+ reset_highlighting_items_to_default()
+
+func reset_highlighting_items_to_default() -> void:
+ for setting in highlighting_items:
+ set(setting, get_setting_default(setting))
+
func _get_setting_names() -> PackedStringArray:
var arr := PackedStringArray()
for p in get_property_list():
@@ -50,6 +122,71 @@ func _get_setting_names() -> PackedStringArray:
arr.append(p.name)
return arr
+const theme_items: PackedStringArray = [
+ "base_color",
+ "accent_color",
+ "highlighter_preset",
+ "basic_color_valid",
+ "basic_color_error",
+ "basic_color_warning",
+ "handle_size",
+ "handle_inner_color",
+ "handle_color",
+ "handle_hovered_color",
+ "handle_selected_color",
+ "handle_hovered_selected_color",
+ "selection_rectangle_speed",
+ "selection_rectangle_width",
+ "selection_rectangle_dash_length",
+ "selection_rectangle_color1",
+ "selection_rectangle_color2",
+ "canvas_color",
+ "grid_color",
+]
+
+func is_theming_default() -> bool:
+ for setting in theme_items:
+ if get(setting) != get_setting_default(setting):
+ return false
+ return true
+
+# TODO Typed Dictionary wonkiness Dictionary[ThemePreset, String]. This one was copied
+# from an earlier similar implementation, but I didn't bother to test if it's still
+# necessary because GodSVG was disheveled while I was implementing the feature.
+static func get_theme_preset_value_text_map() -> Dictionary:
+ return {
+ ThemePreset.DARK: Translator.translate("Dark"),
+ ThemePreset.LIGHT: Translator.translate("Light"),
+ ThemePreset.BLACK: Translator.translate("Black (OLED)"),
+ }
+
+const highlighting_items: PackedStringArray = [
+ "highlighting_symbol_color",
+ "highlighting_element_color",
+ "highlighting_attribute_color",
+ "highlighting_string_color",
+ "highlighting_comment_color",
+ "highlighting_text_color",
+ "highlighting_cdata_color",
+ "highlighting_error_color",
+]
+
+func is_highlighting_default() -> bool:
+ for setting in highlighting_items:
+ if get(setting) != get_setting_default(setting):
+ return false
+ return true
+
+# TODO Typed Dictionary wonkiness Dictionary[ThemePreset, String]. This one was copied
+# from an earlier similar implementation, but I didn't bother to test if it's still
+# necessary because GodSVG was disheveled while I was implementing the feature.
+static func get_highlighter_preset_value_text_map() -> Dictionary:
+ return {
+ HighlighterPreset.DEFAULT_DARK: Translator.translate("Default Dark"),
+ HighlighterPreset.DEFAULT_LIGHT: Translator.translate("Default Light"),
+ }
+
+
func validate() -> void:
if not is_instance_valid(editor_formatter):
editor_formatter = Formatter.new(Formatter.Preset.PRETTY)
@@ -79,10 +216,45 @@ const CURRENT_VERSION = 1
if language != new_value:
language = new_value
emit_changed()
- Configs.sync_locale.call_deferred()
- Configs.language_changed.emit.call_deferred()
+ external_call(Configs.sync_locale)
+ external_call(Configs.language_changed.emit)
+
# Theming
+
+@export var theme_preset := ThemePreset.DARK:
+ set(new_value):
+ if theme_preset != new_value:
+ # Validation
+ if not (new_value >= 0 and new_value < ThemePreset.size()):
+ new_value = ThemePreset.DARK
+ theme_preset = new_value
+ emit_changed()
+
+@export var base_color := Color("10101d"):
+ set(new_value):
+ if base_color != new_value:
+ base_color = new_value
+ emit_changed()
+ external_call(Configs.sync_theme)
+
+@export var accent_color := Color("668cff"):
+ set(new_value):
+ if accent_color != new_value:
+ accent_color = new_value
+ emit_changed()
+ external_call(Configs.sync_theme)
+
+
+@export var highlighter_preset := HighlighterPreset.DEFAULT_DARK:
+ set(new_value):
+ if highlighter_preset != new_value:
+ # Validation
+ if not (new_value >= 0 and new_value < HighlighterPreset.size()):
+ new_value = HighlighterPreset.DEFAULT_DARK
+ highlighter_preset = new_value
+ emit_changed()
+
@export var highlighting_symbol_color := Color("abc9ff"):
set(new_value):
if highlighting_symbol_color != new_value:
@@ -111,14 +283,14 @@ const CURRENT_VERSION = 1
emit_changed()
Configs.highlighting_colors_changed.emit()
-@export var highlighting_comment_color := Color("cdcfd280"):
+@export var highlighting_comment_color := Color("d4d6d980"):
set(new_value):
if highlighting_comment_color != new_value:
highlighting_comment_color = new_value
emit_changed()
Configs.highlighting_colors_changed.emit()
-@export var highlighting_text_color := Color("cdcfeaac"):
+@export var highlighting_text_color := Color("d5d7f2aa"):
set(new_value):
if highlighting_text_color != new_value:
highlighting_text_color = new_value
@@ -132,13 +304,51 @@ const CURRENT_VERSION = 1
emit_changed()
Configs.highlighting_colors_changed.emit()
-@export var highlighting_error_color := Color("ff866b"):
+@export var highlighting_error_color := Color("f55"):
set(new_value):
if highlighting_error_color != new_value:
highlighting_error_color = new_value
emit_changed()
Configs.highlighting_colors_changed.emit()
+
+@export var basic_color_valid := Color("9f9"):
+ set(new_value):
+ if basic_color_valid != new_value:
+ basic_color_valid = new_value
+ emit_changed()
+ Configs.basic_colors_changed.emit()
+
+@export var basic_color_error := Color("f99"):
+ set(new_value):
+ if basic_color_error != new_value:
+ basic_color_error = new_value
+ emit_changed()
+ Configs.basic_colors_changed.emit()
+
+@export var basic_color_warning := Color("ee5"):
+ set(new_value):
+ if basic_color_warning != new_value:
+ basic_color_warning = new_value
+ emit_changed()
+ Configs.basic_colors_changed.emit()
+
+
+const HANDLE_SIZE_MIN = 0.5
+const HANDLE_SIZE_MAX = 4.0
+@export var handle_size := 1.0:
+ set(new_value):
+ # Validation
+ if is_nan(new_value):
+ new_value = get_setting_default("handle_size")
+ else:
+ new_value = clampf(new_value, HANDLE_SIZE_MIN, HANDLE_SIZE_MAX)
+ # Main part
+ if handle_size != new_value:
+ handle_size = new_value
+ emit_changed()
+ Configs.handle_visuals_changed.emit()
+
@export var handle_inner_color := Color("fff"):
set(new_value):
if handle_inner_color != new_value:
@@ -174,43 +384,89 @@ const CURRENT_VERSION = 1
emit_changed()
Configs.handle_visuals_changed.emit()
-@export var background_color := Color(0.12, 0.132, 0.2, 1):
+const MAX_SELECTION_RECTANGLE_SPEED = 600.0
+@export var selection_rectangle_speed := 30.0:
set(new_value):
- if background_color != new_value:
- background_color = new_value
+ # Validation
+ if is_nan(new_value):
+ new_value = get_setting_default("selection_rectangle_speed")
+ else:
+ new_value = clampf(new_value, -MAX_SELECTION_RECTANGLE_SPEED,
+ MAX_SELECTION_RECTANGLE_SPEED)
+ # Main part
+ if selection_rectangle_speed != new_value:
+ selection_rectangle_speed = new_value
emit_changed()
- Configs.sync_background_color.call_deferred()
+ Configs.selection_rectangle_visuals_changed.emit()
-@export var grid_color := Color(0.5, 0.5, 0.5):
+const MAX_SELECTION_RECTANGLE_WIDTH = 8.0
+@export var selection_rectangle_width := 2.0:
set(new_value):
- if grid_color != new_value:
- grid_color = new_value
+ # Validation
+ if is_nan(new_value):
+ new_value = get_setting_default("selection_rectangle_width")
+ else:
+ new_value = clampf(new_value, 1.0, MAX_SELECTION_RECTANGLE_WIDTH)
+ # Main part
+ if selection_rectangle_width != new_value:
+ selection_rectangle_width = new_value
emit_changed()
- Configs.grid_color_changed.emit()
+ Configs.selection_rectangle_visuals_changed.emit()
-@export var basic_color_valid := Color("9f9"):
+const MAX_SELECTION_RECTANGLE_DASH_LENGTH = 600.0
+@export var selection_rectangle_dash_length := 10.0:
set(new_value):
- if basic_color_valid != new_value:
- basic_color_valid = new_value
+ # Validation
+ if is_nan(new_value):
+ new_value = get_setting_default("selection_rectangle_dash_length")
+ else:
+ new_value = clampf(new_value, 1.0, MAX_SELECTION_RECTANGLE_DASH_LENGTH)
+ # Main part
+ if selection_rectangle_dash_length != new_value:
+ selection_rectangle_dash_length = new_value
emit_changed()
- Configs.basic_colors_changed.emit()
+ Configs.selection_rectangle_visuals_changed.emit()
-@export var basic_color_error := Color("f99"):
+@export var selection_rectangle_color1 := Color("fffc"):
set(new_value):
- if basic_color_error != new_value:
- basic_color_error = new_value
+ if selection_rectangle_color1 != new_value:
+ selection_rectangle_color1 = new_value
emit_changed()
- Configs.basic_colors_changed.emit()
+ Configs.selection_rectangle_visuals_changed.emit()
-@export var basic_color_warning := Color("ee5"):
+@export var selection_rectangle_color2 := Color("000c"):
set(new_value):
- if basic_color_warning != new_value:
- basic_color_warning = new_value
+ if selection_rectangle_color2 != new_value:
+ selection_rectangle_color2 = new_value
+ emit_changed()
+ Configs.selection_rectangle_visuals_changed.emit()
+
+@export var canvas_color := Color("1f2233"):
+ set(new_value):
+ if canvas_color != new_value:
+ canvas_color = new_value
+ emit_changed()
+ external_call(Configs.sync_canvas_color)
+
+@export var grid_color := Color("808080"):
+ set(new_value):
+ if grid_color != new_value:
+ grid_color = new_value
+ emit_changed()
+ Configs.grid_color_changed.emit()
+
+
+# Tab bar
+
+@export var tab_mmb_close := true:
+ set(new_value):
+ if tab_mmb_close != new_value:
+ tab_mmb_close = new_value
emit_changed()
- Configs.basic_colors_changed.emit()
# Other
+
@export var invert_zoom := false:
set(new_value):
if invert_zoom != new_value:
@@ -240,22 +496,7 @@ const CURRENT_VERSION = 1
if use_filename_for_window_title != new_value:
use_filename_for_window_title = new_value
emit_changed()
- HandlerGUI.update_window_title.call_deferred()
-
-const HANDLE_SIZE_MIN = 0.5
-const HANDLE_SIZE_MAX = 4.0
-@export var handle_size := 1.0:
- set(new_value):
- # Validation
- if is_nan(new_value):
- new_value = get_setting_default("handle_size")
- else:
- new_value = clampf(new_value, HANDLE_SIZE_MIN, HANDLE_SIZE_MAX)
- # Main part
- if handle_size != new_value:
- handle_size = new_value
- emit_changed()
- Configs.handle_visuals_changed.emit()
+ external_call(HandlerGUI.update_window_title)
enum ScalingApproach {AUTO, CONSTANT_075, CONSTANT_100, CONSTANT_125, CONSTANT_150,
CONSTANT_175, CONSTANT_200, CONSTANT_225, CONSTANT_250, CONSTANT_275, CONSTANT_300, CONSTANT_400, MAX}
@@ -270,8 +511,31 @@ enum ScalingApproach {AUTO, CONSTANT_075, CONSTANT_100, CONSTANT_125, CONSTANT_1
emit_changed()
Configs.ui_scale_changed.emit()
+@export var vsync := true:
+ set(new_value):
+ if vsync != new_value:
+ vsync = new_value
+ emit_changed()
+ external_call(Configs.sync_vsync)
+
+const MAX_FPS_MIN = 12
+const MAX_FPS_MAX = 600
+@export var max_fps := 0:
+ set(new_value):
+ # Clamp unless it's 0 (unlimited).
+ if is_nan(new_value):
+ new_value = get_setting_default("max_fps")
+ elif new_value != 0:
+ new_value = clampi(new_value, MAX_FPS_MIN, MAX_FPS_MAX)
+
+ if max_fps != new_value:
+ max_fps = new_value
+ emit_changed()
+ external_call(Configs.sync_max_fps)
+
# Session
+
const MAX_SNAP = 16384
@export var snap := -0.5: # Negative when disabled.
set(new_value):
diff --git a/src/data_classes/Attribute.gd b/src/data_classes/Attribute.gd
index c0d9c80..b3d3ab6 100644
--- a/src/data_classes/Attribute.gd
+++ b/src/data_classes/Attribute.gd
@@ -1,6 +1,6 @@
# Represents an attribute inside an element, i.e. .
# If the Attribute's data type is known, one of the inheriting classes should be used.
-class_name Attribute extends RefCounted
+class_name Attribute
signal value_changed
diff --git a/src/data_classes/AttributePathdata.gd b/src/data_classes/AttributePathdata.gd
index b64fe0c..b65f6f6 100644
--- a/src/data_classes/AttributePathdata.gd
+++ b/src/data_classes/AttributePathdata.gd
@@ -242,169 +242,113 @@ func toggle_relative_command(idx: int) -> void:
static func parse_pathdata(text: String) -> Array[PathCommand]:
- return path_commands_from_parsed_data(pathdata_to_arrays(text))
-
-# godot_only/tests.gd has a test for this.
-static func pathdata_to_arrays(text: String) -> Array[Array]:
- var new_commands: Array[Array] = []
- var curr_command := ""
- var prev_command := ""
- var nums: Array = [] # Not a float array because the arcs are ints.
- var args_left := 0
- var comma_exhausted := false # Can ignore many whitespaces, but only one comma.
+ text = text.strip_edges()
+ var text_length := text.length()
- var idx := -1
- while idx < text.length() - 1:
- idx += 1
- @warning_ignore("shadowed_global_identifier")
- var char := text[idx]
- # Stop parsing if we've hit a character that's not allowed.
- if not char in "MmLlHhVvAaQqTtCcSsZz0123456789-+Ee., \n\t\r":
- return new_commands
- # Logic for finding out what the next command is going to be.
- if args_left == 0:
- match char:
- "M", "m", "L", "l", "H", "h", "V", "v", "A", "a", "Q", "q", "T", "t",\
- "C", "c", "S", "s", "Z", "z":
- curr_command = char
- args_left = PathCommand.arg_count_dict[curr_command.to_upper()]
- " ", "\t", "\n", "\r": continue
- "-", "+", ".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
- if prev_command.is_empty():
- continue
-
- match prev_command:
- "Z", "z":
- return new_commands
- "M", "m":
- curr_command = "L" if prev_command == "M" else "l"
- args_left = PathCommand.arg_count_dict[curr_command.to_upper()]
- "L", "l", "H", "h", "V", "v", "A", "a", "Q", "q", "T", "t", "C", "c",\
- "S", "s":
- curr_command = prev_command
- args_left = PathCommand.arg_count_dict[curr_command.to_upper()]
- idx -= 1
- _: return new_commands
- # Logic for parsing new numbers until args_left == 0.
+ var commands: Array[PathCommand] = []
+ var idx := 0
+ var prev_command := ""
+ while idx < text_length:
+ while idx < text_length and text[idx] in " \t\n\r":
+ idx += 1
+ if idx >= text_length:
+ break
+
+ var current_char := text[idx]
+ var current_command := ""
+ if current_char in "MmLlHhVvAaQqTtCcSs":
+ current_command = current_char
+ idx += 1
+ elif current_char in "Zz":
+ idx += 1
+ if prev_command in "Zz":
+ continue
+ current_command = current_char
+ elif not prev_command.is_empty():
+ match prev_command:
+ "Z", "z": break
+ "M": current_command = "L"
+ "m": current_command = "l"
+ _: current_command = prev_command
else:
- if comma_exhausted and not char in " \n\t\r":
- comma_exhausted = false
- # Arc flags are represented by a single character.
- if curr_command in "Aa" and (args_left == 4 or args_left == 3):
- match char:
- "0": nums.append(0)
- "1": nums.append(1)
- " ", "\n", "\t", "\r": continue
- ",":
- if comma_exhausted:
- return new_commands
- else:
- comma_exhausted = true
- continue
- _: return new_commands
- if args_left == 3 and nums.size() == 5:
- # The number parsing part doesn't account for whitespace at the start,
- # so jump over the whitespace here.
- while idx < text.length() - 1:
+ break
+
+ var key := current_command.to_upper()
+ var arg_count := PathCommand.arg_count_dict[key]
+ var nums := []
+
+ if key == "A":
+ var result := NumstringParser.text_to_number_arr(text, idx, 3)
+ if result.is_empty():
+ return commands
+ var arr: PackedFloat64Array = result[0]
+ idx = result[1]
+ nums.append_array(arr)
+
+ # Handle flags.
+ for _i in 2:
+ @warning_ignore("confusable_local_declaration")
+ var comma_passed := false
+ while idx < text_length:
+ if text[idx] in " \t\n\r":
idx += 1
- match text[idx]:
- " ", "\n", "\t", "\r": continue
- ",":
- if comma_exhausted:
- return new_commands
- else:
- comma_exhausted = true
- continue
- _:
- idx -= 1
- break
- else:
- # Parse the number.
- var start_idx := idx
- var end_idx := idx
- var number_proceed := true
- var passed_decimal_point := false
- var exponent_just_passed := true
- while number_proceed and idx < text.length():
- char = text[idx]
- match char:
- "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
- idx += 1
- end_idx += 1
- if exponent_just_passed:
- exponent_just_passed = false
- "-", "+":
- if end_idx == start_idx or exponent_just_passed:
- end_idx += 1
- idx += 1
- if exponent_just_passed:
- exponent_just_passed = false
- else:
- number_proceed = false
- idx -= 1
- ".":
- if not passed_decimal_point:
- passed_decimal_point = true
- end_idx += 1
- idx += 1
- else:
- idx -= 1
- number_proceed = false
- " ", "\n", "\t", "\r":
- if end_idx == start_idx:
- idx += 1
- start_idx += 1
- end_idx += 1
- continue
- if not text.substr(start_idx, idx - start_idx).is_valid_float():
- return new_commands
- number_proceed = false
- ",":
- if comma_exhausted:
- return new_commands
- else:
- comma_exhausted = true
- number_proceed = false
- "e", "E":
- end_idx += 1
- idx += 1
- exponent_just_passed = true
- _:
- if args_left >= 1 and\
- not text.substr(start_idx, end_idx - start_idx).is_valid_float():
- return new_commands
- else:
- idx -= 1
- break
- nums.append(text.substr(start_idx, end_idx - start_idx).to_float())
- args_left -= 1
+ elif text[idx] == ",":
+ if comma_passed:
+ return commands
+ comma_passed = true
+ idx += 1
+ else:
+ break
+ if idx >= text_length or not text[idx] in "01":
+ return commands
+ else:
+ nums.append(text[idx].to_int())
+ idx += 1
+
+ result = NumstringParser.text_to_number_arr(text, idx, 2, true)
+ if result.is_empty():
+ return commands
+ arr = result[0]
+ idx = result[1]
+ nums.append_array(arr)
+ elif arg_count > 0:
+ var result := NumstringParser.text_to_number_arr(text, idx, arg_count)
+ if result.is_empty():
+ return commands
+
+ var arr: PackedFloat64Array = result[0]
+ idx = result[1]
+ nums.append_array(arr)
- # Wrap up the array.
- if args_left == 0:
- prev_command = curr_command
- var finalized_arr: Array = [curr_command]
- curr_command = ""
- finalized_arr.append_array(nums)
- nums.clear()
- new_commands.append(finalized_arr)
- return new_commands
-
-static func path_commands_from_parsed_data(data: Array[Array]) -> Array[PathCommand]:
- var cmds: Array[PathCommand] = []
- for a in data:
+ var cmd_type := PathCommand.translation_dict[key]
+ var relative := Utils.is_string_lower(current_command)
var new_cmd: PathCommand
- # The idx 0 element is the command char, the rest are the arguments.
- var cmd_type: Script = PathCommand.translation_dict[a[0].to_upper()]
- var relative := Utils.is_string_lower(a[0])
- match a.size():
- 1: new_cmd = cmd_type.new(relative)
- 2: new_cmd = cmd_type.new(a[1], relative)
- 3: new_cmd = cmd_type.new(a[1], a[2], relative)
- 5: new_cmd = cmd_type.new(a[1], a[2], a[3], a[4], relative)
- 7: new_cmd = cmd_type.new(a[1], a[2], a[3], a[4], a[5], a[6], relative)
- 8: new_cmd = cmd_type.new(a[1], a[2], a[3], a[4], a[5], a[6], a[7], relative)
- cmds.append(new_cmd)
- return cmds
+ match arg_count:
+ 0: new_cmd = cmd_type.new(relative)
+ 1: new_cmd = cmd_type.new(nums[0], relative)
+ 2: new_cmd = cmd_type.new(nums[0], nums[1], relative)
+ 4: new_cmd = cmd_type.new(nums[0], nums[1], nums[2], nums[3], relative)
+ 6: new_cmd = cmd_type.new(nums[0], nums[1], nums[2], nums[3], nums[4], nums[5], relative)
+ 7: new_cmd = cmd_type.new(nums[0], nums[1], nums[2], nums[3], nums[4], nums[5], nums[6], relative)
+ 8: new_cmd = cmd_type.new(nums[0], nums[1], nums[2], nums[3], nums[4], nums[5], nums[6], nums[7], relative)
+ _: continue
+
+ commands.append(new_cmd)
+ prev_command = current_command
+
+ var comma_passed := false
+ while idx < text_length:
+ var c := text[idx]
+ if c in " \t\n\r":
+ idx += 1
+ elif c == ",":
+ if comma_passed:
+ return commands
+ comma_passed = true
+ idx += 1
+ else:
+ break
+ return commands
func path_commands_to_text(commands_arr: Array[PathCommand],
diff --git a/src/data_classes/AttributeTransformList.gd b/src/data_classes/AttributeTransformList.gd
index 6bedb0c..77b65a1 100644
--- a/src/data_classes/AttributeTransformList.gd
+++ b/src/data_classes/AttributeTransformList.gd
@@ -101,129 +101,81 @@ formatter := Configs.savedata.editor_formatter) -> String:
static func text_to_transform_list(text: String) -> Array[Transform]:
text = text.strip_edges()
- if text.is_empty():
+ if text.is_empty() or not text.ends_with(")"):
return []
var output: Array[Transform] = []
var transforms := text.split(")", false)
- for transform in transforms:
+ for idx in transforms.size():
+ var transform := transforms[idx]
var transform_info := transform.split("(")
if transform_info.size() != 2:
return []
var transform_params := transform_info[1].strip_edges()
- var nums: Array[float] = []
-
- # Parse the numbers.
- # TODO maybe this can be moved to NumstringParser.
- var comma_exhausted := false # Can ignore many whitespaces, but only one comma.
- var idx := -1
- while idx < transform_params.length() - 1:
- idx += 1
- @warning_ignore("shadowed_global_identifier")
- var char := transform_params[idx]
-
- var start_idx := idx
- var end_idx := idx
- var number_proceed := true
- var passed_decimal_point := false
- var exponent_just_passed := true
- while number_proceed and idx < transform_params.length():
- if comma_exhausted and not char in " \n\t\r":
- comma_exhausted = false
-
- char = transform_params[idx]
- match char:
- "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":
- idx += 1
- end_idx += 1
- if exponent_just_passed:
- exponent_just_passed = false
- "-", "+":
- if end_idx == start_idx or exponent_just_passed:
- end_idx += 1
- idx += 1
- if exponent_just_passed:
- exponent_just_passed = false
- else:
- number_proceed = false
- idx -= 1
- ".":
- if not passed_decimal_point:
- passed_decimal_point = true
- end_idx += 1
- idx += 1
- else:
- idx -= 1
- number_proceed = false
- " ", "\n", "\t", "\r":
- if end_idx == start_idx:
- idx += 1
- start_idx += 1
- end_idx += 1
- continue
- if not transform_params.substr(
- start_idx, idx - start_idx).is_valid_float():
- return []
- number_proceed = false
- ",":
- if comma_exhausted:
- return []
- else:
- comma_exhausted = true
- number_proceed = false
- "e", "E":
- end_idx += 1
- idx += 1
- exponent_just_passed = true
- _:
- if not transform_params.substr(
- start_idx, end_idx - start_idx).is_valid_float():
- return []
- else:
- idx -= 1
- break
- nums.append(transform_params.substr(start_idx, end_idx - start_idx).to_float())
+ var transform_name := transform_info[0].strip_edges(false, true)
+ if transform_name.is_empty() or (idx > 0 and not transform_name[0] in ", \t\n\r"):
+ return []
- match transform_info[0].strip_edges():
+ match transform_name.strip_edges(true, false).trim_prefix(",").strip_edges(true, false):
"matrix":
- if nums.size() == 6:
- output.append(Transform.TransformMatrix.new(nums[0], nums[1],
- nums[2], nums[3], nums[4], nums[5]))
- else:
+ var result := NumstringParser.text_to_number_arr(transform_params, 0, 6)
+ if result.is_empty() or result[1] < transform_params.length():
return []
+ output.append(Transform.TransformMatrix.new(result[0][0], result[0][1],
+ result[0][2], result[0][3], result[0][4], result[0][5]))
"translate":
- if nums.size() == 1:
- output.append(Transform.TransformTranslate.new(nums[0], 0.0))
- elif nums.size() == 2:
- output.append(Transform.TransformTranslate.new(nums[0], nums[1]))
+ var result1 := NumstringParser.text_to_number_arr(transform_params, 0, 1)
+ if result1.is_empty():
+ return []
+ var result2 := NumstringParser.text_to_number_arr(transform_params, result1[1], 1, true)
+ if result2.is_empty():
+ if result1[1] >= transform_params.length():
+ output.append(Transform.TransformTranslate.new(result1[0][0], 0.0))
+ else:
+ return []
+ elif result2[1] >= transform_params.length():
+ output.append(Transform.TransformTranslate.new(result1[0][0], result2[0][0]))
else:
return []
"rotate":
- if nums.size() == 1:
- output.append(Transform.TransformRotate.new(nums[0], 0.0, 0.0))
- elif nums.size() == 3:
- output.append(Transform.TransformRotate.new(
- nums[0], nums[1], nums[2]))
+ var result1 := NumstringParser.text_to_number_arr(transform_params, 0, 1)
+ if result1.is_empty():
+ return []
+ var result2 := NumstringParser.text_to_number_arr(transform_params, result1[1], 2, true)
+ if result2.is_empty():
+ if result1[1] >= transform_params.length():
+ output.append(Transform.TransformRotate.new(result1[0][0], 0.0, 0.0))
+ else:
+ return []
+ elif result2[1] >= transform_params.length():
+ output.append(Transform.TransformRotate.new(result1[0][0], result2[0][0], result2[0][1]))
else:
return []
"scale":
- if nums.size() == 1:
- output.append(Transform.TransformScale.new(nums[0], nums[0]))
- elif nums.size() == 2:
- output.append(Transform.TransformScale.new(nums[0], nums[1]))
+ var result1 := NumstringParser.text_to_number_arr(transform_params, 0, 1)
+ if result1.is_empty():
+ return []
+ var result2 := NumstringParser.text_to_number_arr(transform_params, result1[1], 1, true)
+ if result2.is_empty():
+ if result1[1] >= transform_params.length():
+ output.append(Transform.TransformScale.new(result1[0][0], result1[0][0]))
+ else:
+ return []
+ elif result2[1] >= transform_params.length():
+ output.append(Transform.TransformScale.new(result1[0][0], result2[0][0]))
else:
return []
"skewX":
- if nums.size() == 1:
- output.append(Transform.TransformSkewX.new(nums[0]))
- else:
+ var result := NumstringParser.text_to_number_arr(transform_params, 0, 1)
+ if result.is_empty() or result[1] < transform_params.length():
return []
+ output.append(Transform.TransformSkewX.new(result[0][0]))
"skewY":
- if nums.size() == 1:
- output.append(Transform.TransformSkewY.new(nums[0]))
- else:
+ var result := NumstringParser.text_to_number_arr(transform_params, 0, 1)
+ if result.is_empty() or result[1] < transform_params.length():
return []
+ output.append(Transform.TransformSkewY.new(result[0][0]))
_:
return []
diff --git a/src/data_classes/ColorParser.gd b/src/data_classes/ColorParser.gd
index cc2cc5f..a9397d9 100644
--- a/src/data_classes/ColorParser.gd
+++ b/src/data_classes/ColorParser.gd
@@ -1,4 +1,4 @@
-class_name ColorParser extends RefCounted
+@abstract class_name ColorParser
static func add_hash_if_hex(color: String) -> String:
diff --git a/src/data_classes/DB.gd b/src/data_classes/DB.gd
index 08e1ca2..782a4ed 100644
--- a/src/data_classes/DB.gd
+++ b/src/data_classes/DB.gd
@@ -1,4 +1,4 @@
-class_name DB extends RefCounted
+@abstract class_name DB
enum AttributeType {NUMERIC, COLOR, LIST, PATHDATA, ENUM, TRANSFORM_LIST, ID, HREF, UNKNOWN}
enum PercentageHandling {FRACTION, HORIZONTAL, VERTICAL, NORMALIZED}
@@ -43,7 +43,7 @@ const recognized_attributes: Dictionary[String, Array] = {
"linearGradient": ["id", "gradientTransform", "gradientUnits", "spreadMethod",
"x1", "y1", "x2", "y2"],
"radialGradient": ["id", "gradientTransform", "gradientUnits", "spreadMethod",
- "cx", "cy", "r"],
+ "cx", "cy", "r", "fx", "fy"],
"circle": ["transform", "opacity", "fill", "fill-opacity", "stroke", "stroke-opacity",
"stroke-width", "cx", "cy", "r"],
"ellipse": ["transform", "opacity", "fill", "fill-opacity", "stroke", "stroke-opacity",
@@ -98,6 +98,8 @@ const _attribute_types: Dictionary[String, AttributeType] = {
"r": AttributeType.NUMERIC,
"rx": AttributeType.NUMERIC,
"ry": AttributeType.NUMERIC,
+ "fx": AttributeType.NUMERIC,
+ "fy": AttributeType.NUMERIC,
"opacity": AttributeType.NUMERIC,
"fill": AttributeType.COLOR,
"fill-opacity": AttributeType.NUMERIC,
@@ -141,6 +143,8 @@ const attribute_number_range: Dictionary[String, NumberRange] = {
"r": NumberRange.POSITIVE,
"rx": NumberRange.POSITIVE,
"ry": NumberRange.POSITIVE,
+ "fx": NumberRange.ARBITRARY,
+ "fy": NumberRange.ARBITRARY,
"opacity": NumberRange.UNIT,
"fill-opacity": NumberRange.UNIT,
"stroke-opacity": NumberRange.UNIT,
@@ -200,6 +204,8 @@ attribute_name: String) -> PercentageHandling:
"y2": return PercentageHandling.VERTICAL
"cx": return PercentageHandling.HORIZONTAL
"cy": return PercentageHandling.VERTICAL
+ "fx": return PercentageHandling.HORIZONTAL
+ "fy": return PercentageHandling.VERTICAL
"r": return PercentageHandling.NORMALIZED
_: return PercentageHandling.FRACTION
@@ -237,8 +243,3 @@ static func attribute(name: String, value: String) -> Attribute:
DB.AttributeType.ID: return AttributeID.new(name, value)
DB.AttributeType.HREF: return AttributeHref.new(name, value)
_: return Attribute.new(name, value)
-
-
-static func is_element_gradient(checked_element: Element) -> bool:
- return checked_element != null and (checked_element is ElementLinearGradient or\
- checked_element is ElementRadialGradient)
diff --git a/src/data_classes/Element.gd b/src/data_classes/Element.gd
index 554fb7f..97a4c26 100644
--- a/src/data_classes/Element.gd
+++ b/src/data_classes/Element.gd
@@ -1,5 +1,5 @@
-# An SVG element, standalone () or container (...).
-class_name Element extends XNode
+# Represents an element, either standalone () or container (...).
+@abstract class_name Element extends XNode
signal attribute_changed(name: String)
signal ancestor_attribute_changed(name: String)
@@ -187,9 +187,9 @@ func get_attribute_num(attribute_name: String) -> float:
DB.PercentageHandling.NORMALIZED: return 1024 * num
else:
match percentage_handling:
- DB.PercentageHandling.HORIZONTAL: return svg.width * num
- DB.PercentageHandling.VERTICAL: return svg.height * num
- DB.PercentageHandling.NORMALIZED: return svg.normalized_diagonal * num
+ DB.PercentageHandling.HORIZONTAL: return svg.viewbox.size.x * num
+ DB.PercentageHandling.VERTICAL: return svg.viewbox.size.y * num
+ DB.PercentageHandling.NORMALIZED: return svg.viewbox_normalized_diagonal * num
return num
func is_attribute_percentage(attribute_name: String) -> bool:
diff --git a/src/data_classes/GradientUtils.gd b/src/data_classes/ElementBaseGradient.gd
similarity index 57%
rename from src/data_classes/GradientUtils.gd
rename to src/data_classes/ElementBaseGradient.gd
index f340f1f..006579a 100644
--- a/src/data_classes/GradientUtils.gd
+++ b/src/data_classes/ElementBaseGradient.gd
@@ -1,41 +1,12 @@
-class_name GradientUtils extends RefCounted
+@abstract class_name ElementBaseGradient extends Element
-static func generate_gradient(element: Element) -> Gradient:
- if not (element is ElementLinearGradient or element is ElementRadialGradient):
- return null
-
- var gradient := Gradient.new()
- gradient.remove_point(0)
-
- var current_offset := 0.0
- var is_gradient_empty := true
-
- for child in element.get_children():
- if not child is ElementStop:
- continue
-
- current_offset = clamp(child.get_attribute_num("offset"), current_offset, 1.0)
- gradient.add_point(current_offset,
- Color(ColorParser.text_to_color(child.get_attribute_true_color("stop-color")),
- child.get_attribute_num("stop-opacity")))
-
- if is_gradient_empty:
- is_gradient_empty = false
- gradient.remove_point(0)
-
- if is_gradient_empty:
- gradient.set_color(0, Color.TRANSPARENT)
-
- return gradient
+const possible_conversions: PackedStringArray = []
-static func get_gradient_warnings(element: Element) -> PackedStringArray:
- if not (element is ElementLinearGradient or element is ElementRadialGradient):
- return PackedStringArray()
+func get_config_warnings() -> PackedStringArray:
+ var warnings := super()
- var warnings := PackedStringArray()
-
- if not element.has_attribute("id"):
+ if not has_attribute("id"):
warnings.append(Translator.translate("No \"id\" attribute defined."))
var prev_offset := -1.0
@@ -43,7 +14,7 @@ static func get_gradient_warnings(element: Element) -> PackedStringArray:
var initial_opacity := -1.0
var has_effective_transition := false
- for child in element.get_children():
+ for child in get_children():
if not child is ElementStop:
continue
@@ -77,3 +48,6 @@ static func get_gradient_warnings(element: Element) -> PackedStringArray:
warnings.append(Translator.translate("This gradient is a solid color."))
return warnings
+
+
+@abstract func generate_texture() -> SVGTexture
diff --git a/src/data_classes/ElementBaseGradient.gd.uid b/src/data_classes/ElementBaseGradient.gd.uid
new file mode 100644
index 0000000..9e4a8b8
--- /dev/null
+++ b/src/data_classes/ElementBaseGradient.gd.uid
@@ -0,0 +1 @@
+uid://cqpplak413bai
diff --git a/src/data_classes/ElementCircle.gd b/src/data_classes/ElementCircle.gd
index a068f2b..0a45fec 100644
--- a/src/data_classes/ElementCircle.gd
+++ b/src/data_classes/ElementCircle.gd
@@ -2,7 +2,7 @@
class_name ElementCircle extends Element
const name = "circle"
-const possible_conversions: Array[String] = ["ellipse", "rect", "path"]
+const possible_conversions: PackedStringArray = ["ellipse", "rect", "path"]
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
set_attribute("r", 1.0)
diff --git a/src/data_classes/ElementEllipse.gd b/src/data_classes/ElementEllipse.gd
index 28931ae..dbd47d2 100644
--- a/src/data_classes/ElementEllipse.gd
+++ b/src/data_classes/ElementEllipse.gd
@@ -2,7 +2,7 @@
class_name ElementEllipse extends Element
const name = "ellipse"
-const possible_conversions: Array[String] = ["circle", "rect", "path"]
+const possible_conversions: PackedStringArray = ["circle", "rect", "path"]
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
set_attribute("rx", 1.0)
diff --git a/src/data_classes/ElementG.gd b/src/data_classes/ElementG.gd
index 06e6ef8..4d2718a 100644
--- a/src/data_classes/ElementG.gd
+++ b/src/data_classes/ElementG.gd
@@ -2,28 +2,13 @@
class_name ElementG extends Element
const name = "g"
-const possible_conversions: Array[String] = []
+const possible_conversions: PackedStringArray = []
func _get_own_default(attribute_name: String) -> String:
match attribute_name:
"opacity": return "1"
_: return ""
-# TODO: It's not enough to merge up with the bounding boxes of the children.
-# If they are transformed it would be wrong.
-func get_bounding_box() -> Rect2:
- var bounding_box := Rect2()
- #var established_bb := false
- #for child in get_children():
- #if DB.is_attribute_recognized(child.name, "transform"):
- #var cbb: Rect2 = child.get_transformed_bounding_box()
- #if not established_bb:
- #bounding_box = cbb
- #established_bb = true
- #else:
- #bounding_box = bounding_box.merge(cbb)
- return bounding_box
-
func get_config_warnings() -> PackedStringArray:
var warnings := super()
if get_child_count() == 0:
diff --git a/src/data_classes/ElementLine.gd b/src/data_classes/ElementLine.gd
index b60dbe6..028d43e 100644
--- a/src/data_classes/ElementLine.gd
+++ b/src/data_classes/ElementLine.gd
@@ -2,7 +2,7 @@
class_name ElementLine extends Element
const name = "line"
-const possible_conversions: Array[String] = ["path", "polyline"]
+const possible_conversions: PackedStringArray = ["path", "polyline"]
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
if precise_pos != PackedFloat64Array([0.0, 0.0]):
diff --git a/src/data_classes/ElementLinearGradient.gd b/src/data_classes/ElementLinearGradient.gd
index a1f5b6a..561b7a1 100644
--- a/src/data_classes/ElementLinearGradient.gd
+++ b/src/data_classes/ElementLinearGradient.gd
@@ -1,8 +1,7 @@
# A element.
-class_name ElementLinearGradient extends Element
+class_name ElementLinearGradient extends ElementBaseGradient
const name = "linearGradient"
-const possible_conversions: Array[String] = []
func _get_own_default(attribute_name: String) -> String:
match attribute_name:
@@ -19,23 +18,53 @@ func get_percentage_handling(attribute_name: String) -> DB.PercentageHandling:
else:
return super(attribute_name)
-func get_config_warnings() -> PackedStringArray:
- var warnings := super()
- warnings += GradientUtils.get_gradient_warnings(self)
- return warnings
-
-func generate_texture() -> GradientTexture2D:
- var texture := GradientTexture2D.new()
- texture.gradient = GradientUtils.generate_gradient(self)
- texture.fill_from = Vector2(get_attribute_num("x1"), get_attribute_num("y1"))
- texture.fill_to = Vector2(get_attribute_num("x2"), get_attribute_num("y2"))
+func generate_texture() -> SVGTexture:
+ var svg_texture_text := """"""
+ return SVGTexture.create_from_string(svg_texture_text)
diff --git a/src/data_classes/ElementPath.gd b/src/data_classes/ElementPath.gd
index 89766be..054a07a 100644
--- a/src/data_classes/ElementPath.gd
+++ b/src/data_classes/ElementPath.gd
@@ -2,7 +2,7 @@
class_name ElementPath extends Element
const name = "path"
-const possible_conversions: Array[String] = []
+const possible_conversions: PackedStringArray = []
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
if precise_pos != PackedFloat64Array([0.0, 0.0]):
diff --git a/src/data_classes/ElementPolygon.gd b/src/data_classes/ElementPolygon.gd
index 92193a8..fdc0e9c 100644
--- a/src/data_classes/ElementPolygon.gd
+++ b/src/data_classes/ElementPolygon.gd
@@ -2,7 +2,7 @@
class_name ElementPolygon extends Element
const name = "polygon"
-const possible_conversions: Array[String] = ["path", "rect"]
+const possible_conversions: PackedStringArray = ["path", "rect"]
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
if precise_pos != PackedFloat64Array([0.0, 0.0]):
diff --git a/src/data_classes/ElementPolyline.gd b/src/data_classes/ElementPolyline.gd
index a75f0f6..97f4d55 100644
--- a/src/data_classes/ElementPolyline.gd
+++ b/src/data_classes/ElementPolyline.gd
@@ -2,7 +2,7 @@
class_name ElementPolyline extends Element
const name = "polyline"
-const possible_conversions: Array[String] = ["path", "line"]
+const possible_conversions: PackedStringArray = ["path", "line"]
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
if precise_pos != PackedFloat64Array([0.0, 0.0]):
diff --git a/src/data_classes/ElementRadialGradient.gd b/src/data_classes/ElementRadialGradient.gd
index c90f199..b678557 100644
--- a/src/data_classes/ElementRadialGradient.gd
+++ b/src/data_classes/ElementRadialGradient.gd
@@ -1,42 +1,77 @@
# A element.
-class_name ElementRadialGradient extends Element
+class_name ElementRadialGradient extends ElementBaseGradient
const name = "radialGradient"
-const possible_conversions: Array[String] = []
func _get_own_default(attribute_name: String) -> String:
match attribute_name:
"cx", "cy", "r": return "50%"
+ "fx": return get_implied_attribute_value("cx")
+ "fy": return get_implied_attribute_value("cy")
"gradientUnits": return "objectBoundingBox"
"spreadMethod": return "pad"
_: return ""
func get_percentage_handling(attribute_name: String) -> DB.PercentageHandling:
if get_attribute_value("gradientUnits") in ["objectBoundingBox", ""] and\
- attribute_name in ["cx", "cy", "r"]:
+ attribute_name in ["cx", "cy", "r", "fx", "fy"]:
return DB.PercentageHandling.FRACTION
else:
return super(attribute_name)
-func get_config_warnings() -> PackedStringArray:
- var warnings := super()
- warnings += GradientUtils.get_gradient_warnings(self)
- return warnings
-
-func generate_texture() -> GradientTexture2D:
- var texture := GradientTexture2D.new()
- texture.gradient = GradientUtils.generate_gradient(self)
- texture.fill = GradientTexture2D.FILL_RADIAL
- texture.fill_from = Vector2(get_attribute_num("cx"), get_attribute_num("cy"))
- texture.fill_to = Vector2(get_attribute_num("cx") + get_attribute_num("r"),
- get_attribute_num("cy"))
-
- if get_attribute_value("gradientUnits") == "userSpaceOnUse":
- texture.fill_from /= svg.get_size()
- texture.fill_to /= svg.get_size()
-
- match get_attribute_value("spreadMethod"):
- "repeat": texture.repeat = GradientTexture2D.REPEAT
- "reflect": texture.repeat = GradientTexture2D.REPEAT_MIRROR
-
- return texture
+func generate_texture() -> SVGTexture:
+ var svg_texture_text := """"""
+ return SVGTexture.create_from_string(svg_texture_text)
diff --git a/src/data_classes/ElementRect.gd b/src/data_classes/ElementRect.gd
index 95cd554..883825b 100644
--- a/src/data_classes/ElementRect.gd
+++ b/src/data_classes/ElementRect.gd
@@ -2,7 +2,7 @@
class_name ElementRect extends Element
const name = "rect"
-const possible_conversions: Array[String] = ["circle", "ellipse", "polygon", "path"]
+const possible_conversions: PackedStringArray = ["circle", "ellipse", "polygon", "path"]
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
set_attribute("width", 1.0)
diff --git a/src/data_classes/ElementSVG.gd b/src/data_classes/ElementSVG.gd
index 25dde34..2ee5fe4 100644
--- a/src/data_classes/ElementSVG.gd
+++ b/src/data_classes/ElementSVG.gd
@@ -3,8 +3,8 @@ class_name ElementSVG extends Element
var width: float
var height: float
-var normalized_diagonal: float
var viewbox: Rect2
+var viewbox_normalized_diagonal: float
var canvas_transform: Transform2D # Automatically updated with the precise transform.
var canvas_precise_transform: PackedFloat64Array:
@@ -13,7 +13,7 @@ var canvas_precise_transform: PackedFloat64Array:
canvas_transform = Utils64Bit.get_transform(canvas_precise_transform)
const name = "svg"
-const possible_conversions: Array[String] = []
+const possible_conversions: PackedStringArray = []
func _init() -> void:
canvas_precise_transform = PackedFloat64Array([1.0, 0.0, 0.0, 1.0, 0.0, 0.0])
@@ -37,8 +37,8 @@ func update_cache() -> void:
if not has_valid_viewbox and not (has_valid_width and has_valid_height):
width = get_attribute_num("width") if has_valid_width else 0.0
height = get_attribute_num("height") if has_valid_height else 0.0
- normalized_diagonal = Vector2(width, height).length() / sqrt(2)
viewbox = Rect2(0, 0, 0, 0)
+ viewbox_normalized_diagonal = 0.0
canvas_precise_transform = PackedFloat64Array([1.0, 0.0, 0.0, 1.0, 0.0, 0.0])
return
@@ -78,7 +78,7 @@ func update_cache() -> void:
(width - height_ratio * viewbox.size.x) / 2, -viewbox.position.y * height_ratio])
if not canvas_transform.is_finite():
canvas_precise_transform = PackedFloat64Array([1.0, 0.0, 0.0, 1.0, 0.0, 0.0])
- normalized_diagonal = Vector2(width, height).length() / sqrt(2)
+ viewbox_normalized_diagonal = Vector2(viewbox.size.x, viewbox.size.y).length() / sqrt(2)
func canvas_to_world(pos: Vector2) -> Vector2:
diff --git a/src/data_classes/ElementStop.gd b/src/data_classes/ElementStop.gd
index 18c7eb2..8723fe6 100644
--- a/src/data_classes/ElementStop.gd
+++ b/src/data_classes/ElementStop.gd
@@ -2,7 +2,7 @@
class_name ElementStop extends Element
const name = "stop"
-const possible_conversions: Array[String] = []
+const possible_conversions: PackedStringArray = []
func _get_own_default(attribute_name: String) -> String:
match attribute_name:
diff --git a/src/data_classes/ElementUnrecognized.gd b/src/data_classes/ElementUnrecognized.gd
index 5c3ad23..48010c6 100644
--- a/src/data_classes/ElementUnrecognized.gd
+++ b/src/data_classes/ElementUnrecognized.gd
@@ -2,7 +2,7 @@
class_name ElementUnrecognized extends Element
var name: String
-const possible_conversions: Array[String] = []
+const possible_conversions: PackedStringArray = []
func _init(new_name: String) -> void:
name = new_name
diff --git a/src/data_classes/ElementUse.gd b/src/data_classes/ElementUse.gd
index f8127e4..661077b 100644
--- a/src/data_classes/ElementUse.gd
+++ b/src/data_classes/ElementUse.gd
@@ -2,16 +2,13 @@
class_name ElementUse extends Element
const name = "use"
-const possible_conversions: Array[String] = []
+const possible_conversions: PackedStringArray = []
func user_setup(precise_pos := PackedFloat64Array([0.0, 0.0])) -> void:
if precise_pos != PackedFloat64Array([0.0, 0.0]):
set_attribute("x", precise_pos[0])
set_attribute("y", precise_pos[1])
-func get_bounding_box() -> Rect2:
- return Rect2()
-
func _get_own_default(attribute_name: String) -> String:
match attribute_name:
"x", "y": return "0"
diff --git a/src/data_classes/GradientUtils.gd.uid b/src/data_classes/GradientUtils.gd.uid
deleted file mode 100644
index a0160a4..0000000
--- a/src/data_classes/GradientUtils.gd.uid
+++ /dev/null
@@ -1 +0,0 @@
-uid://bcprbwp8itu4
diff --git a/src/data_classes/ListParser.gd b/src/data_classes/ListParser.gd
index d59dd93..f791182 100644
--- a/src/data_classes/ListParser.gd
+++ b/src/data_classes/ListParser.gd
@@ -1,5 +1,5 @@
# A parser to turn AttributeList's list into other useful things.
-class_name ListParser extends RefCounted
+@abstract class_name ListParser
static func rect_to_list(rect: Rect2) -> PackedFloat64Array:
return PackedFloat64Array([rect.position.x, rect.position.y, rect.size.x, rect.size.y])
diff --git a/src/data_classes/NumberParser.gd b/src/data_classes/NumberParser.gd
index 43cdbf3..c4f75c7 100644
--- a/src/data_classes/NumberParser.gd
+++ b/src/data_classes/NumberParser.gd
@@ -1,5 +1,5 @@
# Common parser for AttributeNumeric and AttributeList
-class_name NumberParser extends RefCounted
+@abstract class_name NumberParser
static func num_to_text(number: float, formatter: Formatter) -> String:
if not is_finite(number):
diff --git a/src/data_classes/NumstringParser.gd b/src/data_classes/NumstringParser.gd
index 90f6bab..2354b0e 100644
--- a/src/data_classes/NumstringParser.gd
+++ b/src/data_classes/NumstringParser.gd
@@ -1,5 +1,7 @@
-# A parser for compressed number arrays, used in TransformListParser and PathDataParser.
-class_name NumstringParser extends RefCounted
+# A parser for compressed number arrays, used in pathdata and transform lists.
+# Also for general utility around parsing numeric text.
+# This parser has situational configuration options, so it isn't abstract.
+class_name NumstringParser
var compress_numbers: bool
var minimize_spacing: bool
@@ -57,3 +59,215 @@ static func evaluate(text: String) -> float:
if not expr.has_execute_failed() and typeof(result) in [TYPE_FLOAT, TYPE_INT]:
return result
return NAN
+
+
+enum NumberJumbleParseState {
+ OUTSIDE_NUMBER_COMMA_FORBIDDEN,
+ OUTSIDE_NUMBER_COMMA_ALLOWED,
+ DIRECTLY_AFTER_SIGN,
+ INSIDE_NUMBER,
+ INSIDE_NUMBER_DIRECTLY_AFTER_NON_LEADING_FLOATING_POINT,
+ INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT,
+ INSIDE_NUMBER_INDIRECTLY_AFTER_FLOATING_POINT,
+ INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT,
+ INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT_SIGN,
+ INSIDE_NUMBER_INDIRECTLY_AFTER_EXPONENT
+}
+
+# Returns an array with a PackedFloat64Array and an int for the final current index.
+# Returns an empty array if there's a parsing error.
+# TODO In 4.5, I had to avoid the match keyword in this parser for performance: #75682.
+static func text_to_number_arr(text: String, current_index: int, expected_count: int,
+allow_starting_comma := false) -> Array:
+ var text_length := text.length()
+ if current_index >= text_length:
+ return []
+
+ var state := NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_ALLOWED if \
+ allow_starting_comma else NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN
+ var current_number_start_idx := -1
+ var parsed_numbers := PackedFloat64Array()
+ while true:
+ var unrecognized_symbol := false
+ if current_index == text_length:
+ unrecognized_symbol = true
+ else:
+ var current_char := text[current_index]
+ if state == NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN:
+ if current_char in " \t\n\r":
+ pass
+ elif current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER
+ current_number_start_idx = current_index
+ elif current_char in "-+":
+ state = NumberJumbleParseState.DIRECTLY_AFTER_SIGN
+ current_number_start_idx = current_index
+ elif current_char == ".":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT
+ current_number_start_idx = current_index
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_ALLOWED:
+ if current_char in " \t\n\r":
+ pass
+ elif current_char == ",":
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN
+ elif current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER
+ current_number_start_idx = current_index
+ elif current_char in "-+":
+ state = NumberJumbleParseState.DIRECTLY_AFTER_SIGN
+ current_number_start_idx = current_index
+ elif current_char == ".":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT
+ current_number_start_idx = current_index
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.DIRECTLY_AFTER_SIGN:
+ if current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER
+ elif current_char == ".":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER:
+ if current_char in "1234567890":
+ pass
+ elif current_char in " \t\n\r":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_ALLOWED
+ current_number_start_idx = -1
+ elif current_char == ",":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN
+ current_number_start_idx = -1
+ elif current_char in "-+":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.DIRECTLY_AFTER_SIGN
+ current_number_start_idx = current_index
+ elif current_char == ".":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_NON_LEADING_FLOATING_POINT
+ elif current_char in "eE":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_NON_LEADING_FLOATING_POINT:
+ if current_char == ".":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT
+ current_number_start_idx = current_index
+ elif current_char in "-+":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.DIRECTLY_AFTER_SIGN
+ current_number_start_idx = current_index
+ elif current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER_INDIRECTLY_AFTER_FLOATING_POINT
+ elif current_char in " \t\n\r":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_ALLOWED
+ current_number_start_idx = -1
+ elif current_char == ",":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN
+ current_number_start_idx = -1
+ elif current_char == "eE":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT:
+ if current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER_INDIRECTLY_AFTER_FLOATING_POINT
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER_INDIRECTLY_AFTER_FLOATING_POINT:
+ if current_char in "1234567890":
+ pass
+ elif current_char == ".":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT
+ current_number_start_idx = current_index
+ elif current_char in " \t\n\r":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_ALLOWED
+ current_number_start_idx = -1
+ elif current_char == ",":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN
+ current_number_start_idx = -1
+ elif current_char in "-+":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.DIRECTLY_AFTER_SIGN
+ current_number_start_idx = current_index
+ elif current_char in "eE":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT:
+ if current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER_INDIRECTLY_AFTER_EXPONENT
+ elif current_char in "-+":
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT_SIGN
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT_SIGN:
+ if current_char in "1234567890":
+ state = NumberJumbleParseState.INSIDE_NUMBER_INDIRECTLY_AFTER_EXPONENT
+ else:
+ unrecognized_symbol = true
+ elif state == NumberJumbleParseState.INSIDE_NUMBER_INDIRECTLY_AFTER_EXPONENT:
+ if current_char in "01234567890":
+ pass
+ elif current_char == ".":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT
+ current_number_start_idx = current_index
+ elif current_char in " \t\n\r":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_ALLOWED
+ current_number_start_idx = -1
+ elif current_char == ",":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.OUTSIDE_NUMBER_COMMA_FORBIDDEN
+ current_number_start_idx = -1
+ elif current_char in "-+":
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ state = NumberJumbleParseState.DIRECTLY_AFTER_SIGN
+ current_number_start_idx = current_index
+ else:
+ unrecognized_symbol = true
+
+ if unrecognized_symbol:
+ if current_number_start_idx >= 0 and parsed_numbers.size() == expected_count - 1 and\
+ not state in [NumberJumbleParseState.DIRECTLY_AFTER_SIGN,
+ NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT,
+ NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_LEADING_FLOATING_POINT,
+ NumberJumbleParseState.INSIDE_NUMBER_DIRECTLY_AFTER_EXPONENT_SIGN]:
+ parsed_numbers.append(text.substr(current_number_start_idx,
+ current_index - current_number_start_idx).to_float())
+ return [parsed_numbers, current_index]
+ elif (current_number_start_idx < 0 and parsed_numbers.size() == expected_count):
+ return [parsed_numbers, current_index]
+ else:
+ return []
+
+ if parsed_numbers.size() == expected_count:
+ return [parsed_numbers, current_index]
+
+ current_index += 1
+
+ return []
diff --git a/src/data_classes/PathCommand.gd b/src/data_classes/PathCommand.gd
index f15b0c6..08517d9 100644
--- a/src/data_classes/PathCommand.gd
+++ b/src/data_classes/PathCommand.gd
@@ -1,5 +1,5 @@
# A native class that represents a path command and its parameters.
-class_name PathCommand extends RefCounted
+@abstract class_name PathCommand
const translation_dict: Dictionary[String, GDScript] = {
"M": MoveCommand, "L": LineCommand, "H": HorizontalLineCommand,
diff --git a/src/data_classes/SVGParser.gd b/src/data_classes/SVGParser.gd
index 01dad10..d14c187 100644
--- a/src/data_classes/SVGParser.gd
+++ b/src/data_classes/SVGParser.gd
@@ -1,4 +1,4 @@
-class_name SVGParser extends RefCounted
+@abstract class_name SVGParser
# For checking if an SVG is empty. If the text errors out, it's as if the SVG is empty.
static func text_check_is_root_empty(text: String) -> bool:
diff --git a/src/data_classes/Transform.gd b/src/data_classes/Transform.gd
index 9b49e4a..7fbf087 100644
--- a/src/data_classes/Transform.gd
+++ b/src/data_classes/Transform.gd
@@ -1,4 +1,4 @@
-class_name Transform extends RefCounted
+@abstract class_name Transform
class TransformMatrix extends Transform:
var x1: float
diff --git a/src/data_classes/XNode.gd b/src/data_classes/XNode.gd
index aa70541..461114d 100644
--- a/src/data_classes/XNode.gd
+++ b/src/data_classes/XNode.gd
@@ -1,5 +1,5 @@
# Abstract base class for XML nodes.
-class_name XNode extends RefCounted
+@abstract class_name XNode
var xid: PackedInt32Array
diff --git a/src/shaders/animated_stroke_static.gdshader b/src/shaders/animated_stroke_static.gdshader
new file mode 100644
index 0000000..8b98f30
--- /dev/null
+++ b/src/shaders/animated_stroke_static.gdshader
@@ -0,0 +1,21 @@
+// Same as animated_stroke.gdshader, but without speed.
+// Seemed like a good way to avoid GPU strain.
+shader_type canvas_item;
+
+uniform vec4 ant_color_1: source_color = vec4(1.0, 1.0, 1.0, 1.0);
+uniform vec4 ant_color_2: source_color = vec4(0.0, 0.0, 0.0, 1.0);
+uniform float ant_width = 2.0;
+uniform float ant_length = 10.0;
+
+void fragment() {
+ vec2 uv = UV;
+ vec2 fw = fwidth(uv);
+ float adjusted_ant_width = min(ant_width, min(0.5 / fw.x, 0.5 / fw.y));
+ vec2 aw = fw * adjusted_ant_width;
+
+ vec2 cond = (sign(abs(uv - 0.5) - 0.5 + aw) + 1.0) * 0.5 * ceil(((sign(uv.yx - aw.yx) + 1.0) * 0.5 * (sign(uv - 0.5) * vec2(0.5, -0.5) + 0.5) * 0.5 + (sign(1.0 - aw.yx - uv.yx) + 1.0) * 0.5 * (sign(uv - 0.5) * vec2(-0.5, 0.5)+ 0.5) * 0.5));
+ float dir = dot(vec2(cond.y, -cond.x), sign(uv.yx - 0.5) * uv / aw);
+ float ant_type = round(fract((dir * adjusted_ant_width) * 0.5 / ant_length));
+ vec4 ant_color = mix(ant_color_1, ant_color_2, ant_type);
+ COLOR = (cond.x + cond.y) * ant_color;
+}
diff --git a/src/shaders/animated_stroke_static.gdshader.uid b/src/shaders/animated_stroke_static.gdshader.uid
new file mode 100644
index 0000000..d804321
--- /dev/null
+++ b/src/shaders/animated_stroke_static.gdshader.uid
@@ -0,0 +1 @@
+uid://powapyoj7i5p
diff --git a/src/ui_parts/about_menu.gd b/src/ui_parts/about_menu.gd
index b4f5f95..1fd3d9c 100644
--- a/src/ui_parts/about_menu.gd
+++ b/src/ui_parts/about_menu.gd
@@ -131,7 +131,8 @@ func _on_tab_changed(idx: int) -> void:
license_texts_label.text = "Licenses"
for label: Label in [godsvg_parts_label, godot_parts_label, license_texts_label]:
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
- label.add_theme_font_size_override("font_size", 16)
+ label.theme_type_variation = "TitleLabel"
+ label.add_theme_font_size_override("font_size", 17)
%GodSVGParts.add_child(godsvg_parts_label)
%GodotParts.add_child(godot_parts_label)
%LicenseTexts.add_child(license_texts_label)
diff --git a/src/ui_parts/about_menu.tscn b/src/ui_parts/about_menu.tscn
index ff55ddc..7c77073 100644
--- a/src/ui_parts/about_menu.tscn
+++ b/src/ui_parts/about_menu.tscn
@@ -34,10 +34,12 @@ layout_mode = 2
[node name="VersionLabel" type="Label" parent="VBoxContainer/HBoxContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
[node name="CopyLabel" type="Label" parent="VBoxContainer/HBoxContainer/VBoxContainer"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_constants/line_spacing = 0
theme_override_font_sizes/font_size = 12
text = "© 2025 Anish Mishra
@@ -70,6 +72,7 @@ theme_override_constants/separation = 8
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 50)
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
vertical_alignment = 1
@@ -77,6 +80,7 @@ vertical_alignment = 1
[node name="DevelopersLabel" type="Label" parent="VBoxContainer/TabContainer/Authors/MarginContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -89,6 +93,7 @@ columns = 2
[node name="TranslatorsLabel" type="Label" parent="VBoxContainer/TabContainer/Authors/MarginContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -122,6 +127,7 @@ theme_override_constants/separation = 6
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Donors/MarginContainer/VBoxContainer/DiamondDonors"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -139,6 +145,7 @@ theme_override_constants/separation = 6
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Donors/MarginContainer/VBoxContainer/GoldenDonors"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -155,6 +162,7 @@ theme_override_constants/separation = 6
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Donors/MarginContainer/VBoxContainer/Donors"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -172,6 +180,7 @@ theme_override_constants/separation = 6
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Donors/MarginContainer/VBoxContainer/PastDiamondDonors"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -189,6 +198,7 @@ theme_override_constants/separation = 6
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Donors/MarginContainer/VBoxContainer/PastGoldenDonors"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
@@ -206,6 +216,7 @@ theme_override_constants/separation = 6
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Donors/MarginContainer/VBoxContainer/PastDonors"]
layout_mode = 2
+theme_type_variation = &"TitleLabel"
theme_override_font_sizes/font_size = 16
horizontal_alignment = 1
diff --git a/src/ui_parts/code_editor.gd b/src/ui_parts/code_editor.gd
index fb38b6c..de2634d 100644
--- a/src/ui_parts/code_editor.gd
+++ b/src/ui_parts/code_editor.gd
@@ -7,8 +7,8 @@ extends VBoxContainer
@onready var options_button: Button = %MetaActions/OptionsButton
func _ready() -> void:
- Configs.theme_changed.connect(setup_theme)
- setup_theme()
+ Configs.theme_changed.connect(update_theme)
+ update_theme()
State.parsing_finished.connect(update_error)
Configs.highlighting_colors_changed.connect(update_syntax_highlighter)
update_syntax_highlighter()
@@ -26,15 +26,15 @@ func update_error(err_id: SVGParser.ParseError) -> void:
if err_id == SVGParser.ParseError.OK:
if error_bar.visible:
error_bar.hide()
- setup_theme()
+ update_theme()
else:
# When the error is shown, the code editor's theme is changed to match up.
if not error_bar.visible:
error_bar.show()
error_label.text = SVGParser.get_error_string(err_id)
- setup_theme()
+ update_theme()
-func setup_theme() -> void:
+func update_theme() -> void:
# Set up the code edit.
code_edit.begin_bulk_theme_override()
const CONST_ARR_1: PackedStringArray = ["normal", "focus", "hover"]
@@ -43,6 +43,7 @@ func setup_theme() -> void:
stylebox.corner_radius_top_right = 0
stylebox.corner_radius_top_left = 0
stylebox.border_width_top = 2
+ stylebox.bg_color = ThemeUtils.line_edit_inner_color.lerp(ThemeUtils.extreme_theme_color, 0.1)
if error_bar.visible:
stylebox.corner_radius_bottom_right = 0
stylebox.corner_radius_bottom_left = 0
@@ -71,7 +72,7 @@ func setup_theme() -> void:
var panel_stylebox := get_theme_stylebox("panel", "PanelContainer")
# Set up the top panel.
var top_stylebox := panel_stylebox.duplicate()
- top_stylebox.border_color = code_edit.get_theme_stylebox("normal").border_color
+ top_stylebox.border_color = ThemeUtils.subtle_panel_border_color
top_stylebox.border_width_bottom = 0
top_stylebox.corner_radius_bottom_right = 0
top_stylebox.corner_radius_bottom_left = 0
@@ -82,7 +83,7 @@ func setup_theme() -> void:
panel_container.add_theme_stylebox_override("panel", top_stylebox)
# Set up the bottom panel.
var bottom_stylebox := panel_stylebox.duplicate()
- bottom_stylebox.border_color = code_edit.get_theme_stylebox("normal").border_color
+ bottom_stylebox.border_color = ThemeUtils.subtle_panel_border_color
bottom_stylebox.corner_radius_top_right = 0
bottom_stylebox.corner_radius_top_left = 0
bottom_stylebox.content_margin_left = 10.0
diff --git a/src/ui_parts/display.gd b/src/ui_parts/display.gd
index 355f31d..be270e8 100644
--- a/src/ui_parts/display.gd
+++ b/src/ui_parts/display.gd
@@ -44,7 +44,7 @@ func update_translations() -> void:
func update_theme() -> void:
var toolbar_stylebox := StyleBoxFlat.new()
- toolbar_stylebox.bg_color = ThemeUtils.overlay_panel_inner_color.lerp(Color.WHITE, 0.01)
+ toolbar_stylebox.bg_color = ThemeUtils.soft_base_color
toolbar_stylebox.set_content_margin_all(4)
toolbar.add_theme_stylebox_override("panel", toolbar_stylebox)
@@ -54,7 +54,7 @@ func update_theme() -> void:
frame.border_width_top = 2
else:
frame.border_width_left = 2
- frame.border_color = ThemeUtils.connected_button_border_color_pressed
+ frame.border_color = ThemeUtils.selected_tab_color.lerp(ThemeUtils.max_contrast_color, 0.16)
frame.set_content_margin_all(2.0)
viewport_panel.add_theme_stylebox_override("panel", frame)
@@ -152,6 +152,8 @@ func _update_input_debug(event: InputEvent) -> void:
if debug_container.visible and event.is_pressed():
var new_text := input_debug_label.text
var event_text := event.as_text()
+ if event is InputEventMouse:
+ event_text += " (" + String.num(event.position.x, 2) + ", " + String.num(event.position.y, 2) + ")"
if event_text == last_event_text:
last_event_repeat_count += 1
new_text = new_text.left(new_text.rfind("\n", new_text.length() - 2) + 1)
diff --git a/src/ui_parts/display_texture.gd b/src/ui_parts/display_texture.gd
index de1e769..2649c59 100644
--- a/src/ui_parts/display_texture.gd
+++ b/src/ui_parts/display_texture.gd
@@ -44,9 +44,6 @@ func _update() -> void:
var svg_text := SVGParser.root_cutout_to_text(State.root_element, display_rect.size.x,
display_rect.size.y, Rect2(State.root_element.world_to_canvas(display_rect.position),
display_rect.size / State.root_element.canvas_transform.get_scale()))
- var img := Image.new()
- var err := img.load_svg_from_string(svg_text, image_zoom)
- if err == OK:
- Utils.set_control_position_fixed(self, display_rect.position)
- set_deferred("size", display_rect.size)
- texture = ImageTexture.create_from_image(img)
+ Utils.set_control_position_fixed(self, display_rect.position)
+ set_deferred("size", display_rect.size)
+ texture = SVGTexture.create_from_string(svg_text, image_zoom)
diff --git a/src/ui_parts/donate_menu.gd b/src/ui_parts/donate_menu.gd
index 37e41db..0298736 100644
--- a/src/ui_parts/donate_menu.gd
+++ b/src/ui_parts/donate_menu.gd
@@ -17,6 +17,13 @@ var current_link := Link.NONE
@onready var title_label: Label = %TitleLabel
func _ready() -> void:
+ for button: Button in [github_link, ko_fi_link, patreon_link]:
+ button.begin_bulk_theme_override()
+ button.add_theme_color_override("icon_normal_color", Color.WHITE)
+ button.add_theme_color_override("icon_hover_color", Color.WHITE)
+ button.add_theme_color_override("icon_pressed_color", Color.WHITE)
+ button.end_bulk_theme_override()
+
title_label.text = Translator.translate("Links to donation platforms")
close_button.text = Translator.translate("Cancel")
close_button.pressed.connect(queue_free)
@@ -54,7 +61,7 @@ func set_link(new_link: Link) -> void:
current_link = new_link
if new_link == Link.NONE:
clarifications.clear()
- clarifications.push_color(ThemeUtils.common_subtle_text_color)
+ clarifications.push_color(ThemeUtils.subtle_text_color)
clarifications.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
clarifications.add_text("\nHover a platform for details.")
return
@@ -64,7 +71,7 @@ func set_link(new_link: Link) -> void:
var cons: PackedStringArray
match new_link:
Link.GITHUB:
- title = "Guthub Sponsors"
+ title = "Github Sponsors"
pros = PackedStringArray(["Low extra fees", "Can donate an arbitrary amount",
"Includes all perks"])
cons = PackedStringArray()
diff --git a/src/ui_parts/donate_menu.tscn b/src/ui_parts/donate_menu.tscn
index 463c1aa..3166555 100644
--- a/src/ui_parts/donate_menu.tscn
+++ b/src/ui_parts/donate_menu.tscn
@@ -63,6 +63,9 @@ focus_mode = 0
mouse_filter = 1
mouse_default_cursor_shape = 2
theme_type_variation = &"TranslucentButton"
+theme_override_colors/icon_normal_color = Color(1, 1, 1, 1)
+theme_override_colors/icon_pressed_color = Color(1, 1, 1, 1)
+theme_override_colors/icon_hover_color = Color(1, 1, 1, 1)
icon = ExtResource("3_5q1ti")
expand_icon = true
@@ -73,6 +76,9 @@ focus_mode = 0
mouse_filter = 1
mouse_default_cursor_shape = 2
theme_type_variation = &"TranslucentButton"
+theme_override_colors/icon_normal_color = Color(1, 1, 1, 1)
+theme_override_colors/icon_pressed_color = Color(1, 1, 1, 1)
+theme_override_colors/icon_hover_color = Color(1, 1, 1, 1)
icon = ExtResource("4_0irlu")
expand_icon = true
diff --git a/src/ui_parts/export_menu.gd b/src/ui_parts/export_menu.gd
index 51081df..4472b43 100644
--- a/src/ui_parts/export_menu.gd
+++ b/src/ui_parts/export_menu.gd
@@ -29,6 +29,7 @@ var dimensions := Vector2.ZERO
func _ready() -> void:
+ final_size_label.add_theme_color_override("font_color", ThemeUtils.subtle_text_color)
cancel_button.pressed.connect(queue_free)
export_button.pressed.connect(_on_export_button_pressed)
scale_edit.value_changed.connect(_on_scale_edit_value_changed)
@@ -52,15 +53,16 @@ func _ready() -> void:
export_data.changed.connect(update)
# Setup the warning for when the image is too big to have a preview.
- var scaling_factor: float = texture_preview.MAX_IMAGE_DIMENSION / bigger_dimension
+ var scaling_factor := texture_preview.MAX_IMAGE_DIMENSION / bigger_dimension
info_tooltip.tooltip_text = Translator.translate(
"Preview image size is limited to {dimensions}").format(
{"dimensions": get_dimensions_text(Vector2(
maxf(dimensions.x * scaling_factor, 1.0),
maxf(dimensions.y * scaling_factor, 1.0)), true)})
+ info_tooltip.modulate = ThemeUtils.info_icon_color
if Configs.savedata.get_active_tab().svg_file_path.is_empty():
- file_title.add_theme_color_override("font_color", ThemeUtils.common_subtle_text_color)
+ file_title.add_theme_color_override("font_color", ThemeUtils.subtle_text_color)
file_title.text = Configs.savedata.get_active_tab().presented_name
final_size_label.text = Translator.translate("Size") + ": " +\
diff --git a/src/ui_parts/export_menu.tscn b/src/ui_parts/export_menu.tscn
index 6b621dc..e59405e 100644
--- a/src/ui_parts/export_menu.tscn
+++ b/src/ui_parts/export_menu.tscn
@@ -1,9 +1,8 @@
-[gd_scene load_steps=7 format=3 uid="uid://c13dadqbljqlu"]
+[gd_scene load_steps=6 format=3 uid="uid://c13dadqbljqlu"]
[ext_resource type="Script" uid="uid://bouo2y3v0gy4a" path="res://src/ui_parts/export_menu.gd" id="1_objnb"]
[ext_resource type="PackedScene" uid="uid://xh26qa68xed4" path="res://src/ui_widgets/preview_rect.tscn" id="2_ewk0a"]
[ext_resource type="Texture2D" uid="uid://v0lqyuvo50yq" path="res://assets/icons/Info.svg" id="2_rk3rd"]
-[ext_resource type="FontFile" uid="uid://clpf84p1lfwlp" path="res://assets/fonts/Font.ttf" id="5_s3e6m"]
[ext_resource type="PackedScene" uid="uid://dbu1lvajypafb" path="res://src/ui_widgets/dropdown.tscn" id="5_y6ex0"]
[ext_resource type="PackedScene" uid="uid://dad7fkhmsooc6" path="res://src/ui_widgets/number_edit.tscn" id="6_w1sag"]
@@ -34,7 +33,7 @@ theme_override_constants/separation = 8
[node name="TitleLabel" type="Label" parent="MarginContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
-theme_override_font_sizes/font_size = 15
+theme_type_variation = &"TitleLabel"
horizontal_alignment = 1
[node name="TitledPanel" type="VBoxContainer" parent="MarginContainer/VBoxContainer"]
@@ -61,7 +60,6 @@ unique_name_in_owner = true
custom_minimum_size = Vector2(132, 20)
layout_mode = 2
size_flags_horizontal = 3
-theme_override_colors/font_color = Color(0.866667, 0.866667, 0.866667, 1)
horizontal_alignment = 1
vertical_alignment = 1
text_overrun_behavior = 3
@@ -92,7 +90,6 @@ theme_override_constants/separation = 12
[node name="DimensionsLabel" type="Label" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
-theme_override_colors/font_color = Color(0.866667, 0.866667, 0.866667, 1)
horizontal_alignment = 1
[node name="CenterContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer"]
@@ -128,8 +125,6 @@ editing_enabled = true
[node name="FinalSizeLabel" type="Label" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer/CenterContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
-theme_override_colors/font_color = Color(0.666667, 0.666667, 0.666667, 1)
-theme_override_fonts/font = ExtResource("5_s3e6m")
theme_override_font_sizes/font_size = 12
[node name="QualityRelatedContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer/CenterContainer/VBoxContainer"]
@@ -174,7 +169,7 @@ theme_override_constants/separation = 6
[node name="LeftPanel" type="PanelContainer" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer/CenterContainer/VBoxContainer/SizeContainer/HBoxContainer"]
layout_mode = 2
-theme_type_variation = &"LightPanel"
+theme_type_variation = &"ContrastFlatPanel"
[node name="ScaleContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer/CenterContainer/VBoxContainer/SizeContainer/HBoxContainer/LeftPanel"]
unique_name_in_owner = true
@@ -198,7 +193,7 @@ allow_higher = false
[node name="RightPanel" type="PanelContainer" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer/CenterContainer/VBoxContainer/SizeContainer/HBoxContainer"]
layout_mode = 2
-theme_type_variation = &"LightPanel"
+theme_type_variation = &"ContrastFlatPanel"
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/TitledPanel/VBoxContainer/CenterContainer/VBoxContainer/SizeContainer/HBoxContainer/RightPanel"]
layout_mode = 2
diff --git a/src/ui_parts/global_actions.gd b/src/ui_parts/global_actions.gd
index 16d3042..f4d861c 100644
--- a/src/ui_parts/global_actions.gd
+++ b/src/ui_parts/global_actions.gd
@@ -14,24 +14,27 @@ func update_translation() -> void:
func _ready() -> void:
State.svg_changed.connect(update_size_button)
update_size_button()
+ Configs.theme_changed.connect(update_theme)
Configs.basic_colors_changed.connect(update_size_button_colors)
+ update_theme()
Configs.language_changed.connect(update_translation)
update_translation()
-
- # Fix the size button sizing.
+ more_options.pressed.connect(_on_more_options_pressed)
+ size_button.pressed.connect(_on_size_button_pressed)
+ layout_button.pressed.connect(_on_layout_button_pressed)
+
+
+func update_theme() -> void:
size_button.begin_bulk_theme_override()
const CONST_ARR: PackedStringArray = ["normal", "focus", "hover", "disabled"]
for theme_type in CONST_ARR:
+ size_button.remove_theme_stylebox_override(theme_type)
var stylebox := size_button.get_theme_stylebox(theme_type).duplicate()
stylebox.content_margin_bottom = 0.0
stylebox.content_margin_top = 0.0
size_button.add_theme_stylebox_override(theme_type, stylebox)
size_button.end_bulk_theme_override()
-
- more_options.pressed.connect(_on_more_options_pressed)
- size_button.pressed.connect(_on_size_button_pressed)
- layout_button.pressed.connect(_on_layout_button_pressed)
-
+ update_size_button_colors()
func _on_size_button_pressed() -> void:
var btn_array: Array[Button] = [
@@ -43,7 +46,7 @@ func _on_size_button_pressed() -> void:
func _on_more_options_pressed() -> void:
var can_show_savedata_folder := DisplayServer.has_feature(
- DisplayServer.FEATURE_NATIVE_DIALOG_FILE)
+ DisplayServer.FEATURE_NATIVE_DIALOG_FILE_EXTRA)
var buttons_arr: Array[Button] = []
buttons_arr.append(ContextPopup.create_shortcut_button("check_updates"))
@@ -89,7 +92,7 @@ func update_size_button_colors() -> void:
"font_pressed_color"]
for theme_type in CONST_ARR:
size_button.add_theme_color_override(theme_type,
- Configs.savedata.basic_color_warning.lerp(Color.WHITE, 0.5))
+ Configs.savedata.basic_color_warning.lerp(ThemeUtils.max_contrast_color, 0.4))
size_button.end_bulk_theme_override()
func _on_layout_button_pressed() -> void:
diff --git a/src/ui_parts/good_file_dialog.gd b/src/ui_parts/good_file_dialog.gd
index 8272a7a..dedf846 100644
--- a/src/ui_parts/good_file_dialog.gd
+++ b/src/ui_parts/good_file_dialog.gd
@@ -21,7 +21,7 @@ var mode: FileMode
var current_dir := ""
var extensions := PackedStringArray()
-var item_height := 16
+var item_height := 16.0
var search_text := ""
var default_saved_file := "" # The file you opened this dialog with.
@@ -110,9 +110,10 @@ func _ready() -> void:
if mode == FileMode.MULTI_SELECT:
file_list.select_mode = ItemList.SELECT_MULTI
- var extension_panel_stylebox := extension_panel.get_theme_stylebox("panel")
+ var extension_panel_stylebox := extension_panel.get_theme_stylebox("panel").duplicate()
extension_panel_stylebox.content_margin_top -= 4.0
extension_panel.add_theme_stylebox_override("panel", extension_panel_stylebox)
+ extension_label.add_theme_color_override("font_color", ThemeUtils.dim_text_color)
if Configs.savedata.file_dialog_show_hidden:
show_hidden_button.set_pressed_no_signal(true)
folder_up_button.tooltip_text = Translator.translate("Go to parent folder")
@@ -175,6 +176,7 @@ func open_dir(dir: String) -> void:
continue
var item_idx := drives_list.add_item(drive_name, get_drive_icon(drive_path))
+ drives_list.set_item_icon_modulate(item_idx, ThemeUtils.tinted_contrast_color)
drives_list.set_item_metadata(item_idx,
Actions.new(Callable(), open_dir.bind(drive_path)))
if current_dir == drive_path:
@@ -251,16 +253,15 @@ func _setup_file_images() -> void:
file_list.set_item_icon(item_idx, text_file_icon)
"svg":
# Setup a clean SVG graphic by using the scaling parameter.
- var svg_buffer := FileAccess.get_file_as_bytes(current_dir.path_join(file))
+ var svg_text := FileAccess.get_file_as_string(current_dir.path_join(file))
var img := Image.new()
- img.load_svg_from_buffer(svg_buffer)
+ img.load_svg_from_string(svg_text)
if !is_instance_valid(img) or img.is_empty():
file_list.set_item_icon(item_idx, broken_file_icon)
else:
- var factor := item_height / maxf(img.get_width(), img.get_height())
- if not is_equal_approx(factor, 1.0):
- img.load_svg_from_buffer(svg_buffer, factor)
- file_list.set_item_icon(item_idx, ImageTexture.create_from_image(img))
+ var svg_texture := SVGTexture.create_from_string(svg_text,
+ minf(item_height / img.get_width(), item_height / img.get_height()))
+ file_list.set_item_icon(item_idx, svg_texture)
_:
var img := Image.load_from_file(current_dir.path_join(file))
if !is_instance_valid(img) or img.is_empty():
diff --git a/src/ui_parts/good_file_dialog.tscn b/src/ui_parts/good_file_dialog.tscn
index be1c14b..77c4c33 100644
--- a/src/ui_parts/good_file_dialog.tscn
+++ b/src/ui_parts/good_file_dialog.tscn
@@ -112,11 +112,10 @@ script = ExtResource("2_52puw")
[node name="ExtensionPanel" type="PanelContainer" parent="VBoxContainer/MainContainer/FilePicker/FileContainer"]
layout_mode = 2
-theme_type_variation = &"DarkPanel"
+theme_type_variation = &"ContrastFlatPanel"
[node name="ExtensionLabel" type="Label" parent="VBoxContainer/MainContainer/FilePicker/FileContainer/ExtensionPanel"]
layout_mode = 2
-theme_override_colors/font_color = Color(0.866667, 0.933333, 1, 0.533333)
[node name="ButtonContainer" type="HBoxContainer" parent="VBoxContainer"]
unique_name_in_owner = true
diff --git a/src/ui_parts/handles_manager.gd b/src/ui_parts/handles_manager.gd
index 10f369f..63fc6a0 100644
--- a/src/ui_parts/handles_manager.gd
+++ b/src/ui_parts/handles_manager.gd
@@ -7,6 +7,7 @@ var selected_handle_textures: Dictionary[Handle.Display, Texture2D]
var hovered_selected_handle_textures: Dictionary[Handle.Display, Texture2D]
const stroke_shader = preload("res://src/shaders/animated_stroke.gdshader")
+const stroke_shader_static = preload("res://src/shaders/animated_stroke_static.gdshader")
const DEFAULT_GRAB_DISTANCE_SQUARED := 81.0
const CONTOUR_WIDTH = 1.0
@@ -23,6 +24,9 @@ var hovered_color: Color
var selected_color: Color
var hovered_selected_color: Color
+# FIXME this shouldn't be needed, but otherwise the shader doesn't want to work.
+@onready var animated_stroke_hacky_fix_node := Control.new()
+
func _exit_tree() -> void:
RenderingServer.free_rid(surface)
@@ -69,24 +73,40 @@ func render_handle_textures() -> void:
img.load_svg_from_string(handle_type_svg % [inside_str, hovered_selected_str])
img.fix_alpha_edges()
hovered_selected_handle_textures[handle_type] = ImageTexture.create_from_image(img)
+ queue_redraw()
+
+func sync_selection_rectangle_shader() -> void:
+ var stroke_material := ShaderMaterial.new()
+ if is_zero_approx(Configs.savedata.selection_rectangle_speed):
+ stroke_material.shader = stroke_shader_static
+ else:
+ stroke_material.shader = stroke_shader
+ stroke_material.set_shader_parameter("ant_speed",
+ Configs.savedata.selection_rectangle_speed)
+ stroke_material.set_shader_parameter("ant_color_1",
+ Configs.savedata.selection_rectangle_color1)
+ stroke_material.set_shader_parameter("ant_color_2",
+ Configs.savedata.selection_rectangle_color2)
+ stroke_material.set_shader_parameter("ant_width",
+ Configs.savedata.selection_rectangle_width)
+ stroke_material.set_shader_parameter("ant_length",
+ Configs.savedata.selection_rectangle_dash_length)
+ RenderingServer.canvas_item_set_material(selections_surface, stroke_material.get_rid())
+ animated_stroke_hacky_fix_node.material = stroke_material
+ # If the ant width was changed, the buffer must be updated.
queue_redraw()
func _ready() -> void:
+ add_child(animated_stroke_hacky_fix_node, false, InternalMode.INTERNAL_MODE_BACK)
+
Configs.handle_visuals_changed.connect(render_handle_textures)
render_handle_textures()
+ Configs.selection_rectangle_visuals_changed.connect(sync_selection_rectangle_shader)
+ sync_selection_rectangle_shader()
+
RenderingServer.canvas_item_set_parent(surface, get_canvas_item())
RenderingServer.canvas_item_set_parent(selections_surface, get_canvas_item())
- var stroke_material := ShaderMaterial.new()
- stroke_material.shader = stroke_shader
- stroke_material.set_shader_parameter("ant_color_1", Color(1, 1, 1, 0.8))
- stroke_material.set_shader_parameter("ant_color_2", Color(0, 0, 0, 0.8))
- RenderingServer.canvas_item_set_material(selections_surface, stroke_material.get_rid())
-
- # FIXME this shouldn't be needed, but otherwise the shader doesn't want to work.
- var c := Control.new()
- c.material = stroke_material
- add_child(c, false, InternalMode.INTERNAL_MODE_BACK)
State.any_attribute_changed.connect(sync_handles)
State.xnode_layout_changed.connect(queue_update_handles)
@@ -242,7 +262,8 @@ func _draw() -> void:
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
- var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
+ var grow_amount_unscaled := (2.0 + Configs.savedata.selection_rectangle_width) /\
+ State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
@@ -285,7 +306,8 @@ func _draw() -> void:
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
- var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
+ var grow_amount_unscaled := (2.0 + Configs.savedata.selection_rectangle_width) /\
+ State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
@@ -362,7 +384,8 @@ func _draw() -> void:
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
- var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
+ var grow_amount_unscaled := (2.0 + Configs.savedata.selection_rectangle_width) /\
+ State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
@@ -394,7 +417,8 @@ func _draw() -> void:
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
- var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
+ var grow_amount_unscaled := (2.0 + Configs.savedata.selection_rectangle_width) /\
+ State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
@@ -454,7 +478,8 @@ func _draw() -> void:
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
- var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
+ var grow_amount_unscaled := (2.0 + Configs.savedata.selection_rectangle_width) /\
+ State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
@@ -674,7 +699,8 @@ func _draw() -> void:
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
- var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
+ var grow_amount_unscaled := (2.0 + Configs.savedata.selection_rectangle_width) /\
+ State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
diff --git a/src/ui_parts/inspector.gd b/src/ui_parts/inspector.gd
index 009372e..f856b7f 100644
--- a/src/ui_parts/inspector.gd
+++ b/src/ui_parts/inspector.gd
@@ -17,8 +17,8 @@ func _ready() -> void:
func update_theme() -> void:
color = Color.TRANSPARENT
- border_color = ThemeUtils.common_panel_inner_color
- title_color = Color(ThemeUtils.common_panel_inner_color, 0.4)
+ border_color = ThemeUtils.subtle_panel_border_color
+ title_color = ThemeUtils.basic_panel_inner_color
func update_translation() -> void:
add_button.text = Translator.translate("Add element")
diff --git a/src/ui_parts/layout_popup.gd b/src/ui_parts/layout_popup.gd
index 9296879..1268656 100644
--- a/src/ui_parts/layout_popup.gd
+++ b/src/ui_parts/layout_popup.gd
@@ -96,13 +96,14 @@ func _draw() -> void:
# Fixed viewport location for now.
var stylebox := StyleBoxFlat.new()
stylebox.set_corner_radius_all(4)
- stylebox.bg_color = ThemeUtils.translucent_button_color_normal
+ stylebox.bg_color = ThemeUtils.hover_overlay_color
var disabled_stylebox := stylebox.duplicate()
disabled_stylebox.bg_color = ThemeUtils.translucent_button_color_disabled
disabled_stylebox.draw(ci, right_rect.grow(-BUFFER_SIZE))
var viewport_icon := Utils.get_layout_part_icon(Utils.LayoutPart.VIEWPORT)
- viewport_icon.draw(ci, right_rect.get_center() - viewport_icon.get_size() / 2)
+ viewport_icon.draw(ci, right_rect.get_center() - viewport_icon.get_size() / 2,
+ ThemeUtils.tinted_contrast_color)
for layout_location in section_areas:
var area := section_areas[layout_location].grow(-BUFFER_SIZE)
@@ -134,7 +135,7 @@ func _draw() -> void:
disabled_stylebox.draw(ci, rect)
elif hovered_part == layout_part:
var hover_stylebox := stylebox.duplicate()
- hover_stylebox.bg_color = ThemeUtils.translucent_button_color_hover
+ hover_stylebox.bg_color = ThemeUtils.strong_hover_overlay_color
hover_stylebox.draw(ci, rect)
else:
stylebox.draw(ci, rect)
@@ -157,11 +158,11 @@ func _draw() -> void:
drop_sb.border_width_right = 2
drop_sb.draw(ci, rect)
- icon.draw(ci, rect.get_center() - icon.get_size() / 2.0)
+ icon.draw(ci, rect.get_center() - icon.get_size() / 2.0, ThemeUtils.tinted_contrast_color)
ThemeUtils.regular_font.draw_string(ci, Vector2(0, size.x * 0.75 - 5),
Translator.translate("Excluded") + ":", HORIZONTAL_ALIGNMENT_CENTER, size.x,
- get_theme_font_size("font_size", "Label"))
+ get_theme_font_size("font_size", "Label"), ThemeUtils.text_color)
# Drag and drop
@@ -333,7 +334,7 @@ func _make_custom_tooltip(for_text: String) -> Object:
vbox.add_child(main_label)
if for_text != TranslationUtils.get_layout_part_name(Utils.LayoutPart.VIEWPORT):
var dim_label := Label.new()
- dim_label.add_theme_color_override("font_color", ThemeUtils.common_dimmer_text_color)
+ dim_label.add_theme_color_override("font_color", ThemeUtils.dimmer_text_color)
dim_label.text = Translator.translate("Drag and drop to change the layout")
vbox.add_child(dim_label)
return vbox
diff --git a/src/ui_parts/settings_menu.gd b/src/ui_parts/settings_menu.gd
index c82e3e7..36f8c85 100644
--- a/src/ui_parts/settings_menu.gd
+++ b/src/ui_parts/settings_menu.gd
@@ -20,7 +20,7 @@ const reset_icon = preload("res://assets/icons/Reload.svg")
var focused_tab := ""
var current_setup_setting := ""
-var current_setup_resource: Resource
+var current_setup_resource: ConfigResource
var setting_container: VBoxContainer
var advice: Dictionary[String, String] = {}
@@ -38,10 +38,8 @@ func _ready() -> void:
update_close_button()
setup_tabs()
tabs.get_child(0).button_pressed = true
- Configs.theme_changed.connect(setup_theming)
- setup_theming()
- Configs.savedata.editor_formatter.changed_deferred.connect(show_formatter.bind("editor"))
- Configs.savedata.export_formatter.changed_deferred.connect(show_formatter.bind("export"))
+ Configs.theme_changed.connect(update_theme)
+ update_theme()
func change_orientation():
if Configs.current_orientation == Configs.orientation.PORTRAIT:
@@ -51,8 +49,8 @@ func change_orientation():
$VBoxContainer/BoxContainer.vertical = false
$VBoxContainer/BoxContainer/PanelContainer.size_flags_horizontal = SIZE_EXPAND_FILL
-func setup_theming() -> void:
- var stylebox := get_theme_stylebox("panel").duplicate()
+func update_theme() -> void:
+ var stylebox := ThemeDB.get_default_theme().get_stylebox("panel", theme_type_variation).duplicate()
stylebox.content_margin_top += 4.0
add_theme_stylebox_override("panel", stylebox)
@@ -100,8 +98,10 @@ func _on_tab_toggled(toggled_on: bool, tab_name: String) -> void:
focused_tab = tab_name
setup_content()
-func setup_content() -> void:
- scroll_container.scroll_vertical = 0
+func setup_content(reset_scroll := true) -> void:
+ if reset_scroll:
+ scroll_container.scroll_vertical = 0
+
for child in content_container.get_children():
child.queue_free()
@@ -168,7 +168,26 @@ func setup_content() -> void:
content_container.add_child(setting_container)
current_setup_resource = Configs.savedata
+
+ current_setup_setting = "theme_preset"
+ add_profile_picker(Translator.translate("Theme preset"),
+ current_setup_resource.reset_theme_items_to_default,
+ SaveData.ThemePreset.size(), SaveData.get_theme_preset_value_text_map(),
+ current_setup_resource.is_theming_default)
+
+ add_section(Translator.translate("Primary theme colors"))
+ current_setup_setting = "base_color"
+ add_color_edit(Translator.translate("Base color"), false)
+ current_setup_setting = "accent_color"
+ add_color_edit(Translator.translate("Accent color"), false)
+
add_section(Translator.translate("SVG Text colors"))
+ current_setup_setting = "highlighter_preset"
+ add_profile_picker(Translator.translate("Highlighter preset"),
+ current_setup_resource.reset_highlighting_items_to_default,
+ SaveData.HighlighterPreset.size(),
+ SaveData.get_highlighter_preset_value_text_map(),
+ current_setup_resource.is_highlighting_default)
current_setup_setting = "highlighting_symbol_color"
add_color_edit(Translator.translate("Symbol color"))
current_setup_setting = "highlighting_element_color"
@@ -186,7 +205,11 @@ func setup_content() -> void:
current_setup_setting = "highlighting_error_color"
add_color_edit(Translator.translate("Error color"))
- add_section(Translator.translate("Handle colors"))
+ add_section(Translator.translate("Handles"))
+ current_setup_setting = "handle_size"
+ add_number_dropdown(Translator.translate("Size"),
+ [0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0], false, false,
+ SaveData.HANDLE_SIZE_MIN, SaveData.HANDLE_SIZE_MAX)
current_setup_setting = "handle_inner_color"
add_color_edit(Translator.translate("Inside color"), false)
current_setup_setting = "handle_color"
@@ -198,9 +221,28 @@ func setup_content() -> void:
current_setup_setting = "handle_hovered_selected_color"
add_color_edit(Translator.translate("Hovered selected color"), false)
+ add_section(Translator.translate("Selection rectangle"))
+ current_setup_setting = "selection_rectangle_speed"
+ add_number_dropdown(Translator.translate("Speed"),
+ [0.0, 10.0, 20.0, 30.0, 50.0, 80.0, 130.0], false, false,
+ -SaveData.MAX_SELECTION_RECTANGLE_SPEED,
+ SaveData.MAX_SELECTION_RECTANGLE_SPEED)
+ current_setup_setting = "selection_rectangle_width"
+ add_number_dropdown(Translator.translate("Width"),
+ [1.0, 2.0, 3.0, 4.0], false, false, 1.0,
+ SaveData.MAX_SELECTION_RECTANGLE_WIDTH)
+ current_setup_setting = "selection_rectangle_dash_length"
+ add_number_dropdown(Translator.translate("Dash length"),
+ [5.0, 10.0, 15.0, 20.0], false, false, 1.0,
+ SaveData.MAX_SELECTION_RECTANGLE_DASH_LENGTH)
+ current_setup_setting = "selection_rectangle_color1"
+ add_color_edit(Translator.translate("Color {index}").format({"index": "1"}))
+ current_setup_setting = "selection_rectangle_color2"
+ add_color_edit(Translator.translate("Color {index}").format({"index": "2"}))
+
add_section(Translator.translate("Basic colors"))
- current_setup_setting = "background_color"
- add_color_edit(Translator.translate("Background color"), false)
+ current_setup_setting = "canvas_color"
+ add_color_edit(Translator.translate("Canvas color"), false)
current_setup_setting = "grid_color"
add_color_edit(Translator.translate("Grid color"), false)
current_setup_setting = "basic_color_valid"
@@ -218,45 +260,26 @@ func setup_content() -> void:
add_section(Translator.translate("Input"))
current_setup_setting = "tab_mmb_close"
add_checkbox(Translator.translate("Close tabs with middle mouse button"))
- add_advice(Translator.translate(
- "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."))
+ add_advice(Translator.translate("If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."))
"other":
advice_panel.show()
create_setting_container()
content_container.add_child(setting_container)
-
current_setup_resource = Configs.savedata
+
add_section(Translator.translate("Input"))
current_setup_setting = "invert_zoom"
add_checkbox(Translator.translate("Invert zoom direction"))
- add_advice(Translator.translate(
- "Swaps the scroll directions for zooming in and zooming out."))
+ add_advice(Translator.translate("Swaps the scroll directions for zooming in and zooming out."))
current_setup_setting = "wraparound_panning"
var wraparound_panning := add_checkbox(Translator.translate("Wrap-around panning"))
- add_advice(Translator.translate(
- "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."))
+ add_advice(Translator.translate("Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."))
current_setup_setting = "use_ctrl_for_zoom"
add_checkbox(Translator.translate("Use CTRL for zooming"))
- add_advice(Translator.translate(
- "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."))
-
- add_section(Translator.translate("Miscellaneous"))
- current_setup_setting = "use_native_file_dialog"
- var use_native_file_dialog := add_checkbox(
- Translator.translate("Use native file dialog"))
- add_advice(Translator.translate(
- "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."))
- current_setup_setting = "use_filename_for_window_title"
- add_checkbox(Translator.translate("Sync window title to file name"))
- add_advice(Translator.translate(
- "If turned off, the window title remains as \"GodSVG\" without including the current file."))
- current_setup_setting = "handle_size"
- add_number_dropdown(Translator.translate("Handle size"),
- [0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0], false, false,
- SaveData.HANDLE_SIZE_MIN, SaveData.HANDLE_SIZE_MAX)
- add_advice(Translator.translate(
- "Changes the visual size and grabbing area of handles."))
+ add_advice(Translator.translate("If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."))
+ add_section(Translator.translate("Display"))
+ # Prepare parameters for the UI scale setting.
current_setup_setting = "ui_scale"
var auto_scale: float = HandlerGUI.get_auto_ui_scale()
@@ -280,6 +303,23 @@ func setup_content() -> void:
add_dropdown(Translator.translate("UI scale"), dropdown_map.keys(), dropdown_map)
add_advice(Translator.translate("Changes the scale factor for the interface."))
+
+ current_setup_setting = "vsync"
+ add_checkbox(Translator.translate("V-Sync"))
+ add_advice(Translator.translate("Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."))
+
+ current_setup_setting = "max_fps"
+ add_fps_limit_dropdown(Translator.translate("Maximum FPS"))
+ add_advice(Translator.translate("Determines the maximum number of frames per second."))
+
+ add_section(Translator.translate("Miscellaneous"))
+ current_setup_setting = "use_native_file_dialog"
+ var use_native_file_dialog := add_checkbox(Translator.translate("Use native file dialog"))
+ add_advice(Translator.translate("If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."))
+ current_setup_setting = "use_filename_for_window_title"
+ add_checkbox(Translator.translate("Sync window title to file name"))
+ add_advice(Translator.translate("If turned off, the window title remains as \"GodSVG\" without including the current file."))
+
# Disable mouse wrap if not available.
if not DisplayServer.has_feature(DisplayServer.FEATURE_MOUSE_WARP):
wraparound_panning.permanent_disable_checkbox(false)
@@ -288,6 +328,9 @@ func setup_content() -> void:
use_native_file_dialog.permanent_disable_checkbox(true)
elif not DisplayServer.has_feature(DisplayServer.FEATURE_NATIVE_DIALOG_FILE):
use_native_file_dialog.permanent_disable_checkbox(false)
+
+ # Update hover.
+ HandlerGUI.throw_mouse_motion_event()
func add_section(section_name: String) -> void:
@@ -295,6 +338,7 @@ func add_section(section_name: String) -> void:
vbox.add_theme_constant_override("separation", 0)
var label := Label.new()
label.add_theme_font_size_override("font_size", 15)
+ label.theme_type_variation = "TitleLabel"
label.text = section_name
vbox.add_child(label)
var spacer := Control.new()
@@ -302,6 +346,27 @@ func add_section(section_name: String) -> void:
vbox.add_child(spacer)
setting_container.add_child(vbox)
+func add_profile_picker(text: String, application_callback: Callable, profile_count: int,
+value_text_map: Dictionary, disabled_check_callback: Callable) -> void:
+ var bind := current_setup_setting
+ var frame := ProfileFrameScene.instantiate()
+ frame.setup_dropdown(range(profile_count), value_text_map)
+ frame.getter = current_setup_resource.get.bind(bind)
+ var resource_permanent_ref := current_setup_resource
+ frame.setter = func(p: Variant) -> void:
+ resource_permanent_ref.set(bind, p)
+ frame.text = text
+ frame.disabled_check_callback = disabled_check_callback
+ frame.value_changed.connect.call_deferred(setup_content.bind(false))
+ frame.defaults_applied.connect(application_callback)
+ frame.defaults_applied.connect(setup_content.bind(false))
+ add_frame(frame)
+
+ resource_permanent_ref.changed_deferred.connect(frame.button_update_disabled)
+ frame.tree_exited.connect(resource_permanent_ref.changed_deferred.disconnect.bind(
+ frame.button_update_disabled), CONNECT_ONE_SHOT)
+
+
func add_checkbox(text: String, dim_text := false) -> Control:
var frame := SettingFrameScene.instantiate()
frame.dim_text = dim_text
@@ -309,6 +374,10 @@ func add_checkbox(text: String, dim_text := false) -> Control:
setup_frame(frame)
frame.setup_checkbox()
add_frame(frame)
+ # Some checkboxes need to update the dimness of the text of other settings.
+ # There's nothing persistent in checkboxes, so it's safe to just rebuild the content
+ # for them, specifically.
+ frame.value_changed.connect(setup_content.bind(false))
return frame
# TODO Typed Dictionary wonkiness
@@ -330,6 +399,15 @@ restricted := true, min_value := -INF, max_value := INF, dim_text := false) -> C
add_frame(frame)
return frame
+func add_fps_limit_dropdown(text: String, dim_text := false) -> Control:
+ var frame := SettingFrameScene.instantiate()
+ frame.dim_text = dim_text
+ frame.text = text
+ setup_frame(frame)
+ frame.setup_fps_limit_dropdown()
+ add_frame(frame)
+ return frame
+
func add_color_edit(text: String, enable_alpha := true) -> Control:
var frame := SettingFrameScene.instantiate()
frame.text = text
@@ -347,7 +425,10 @@ func setup_frame(frame: Control) -> void:
frame.mouse_exited.connect(hide_advice.bind(current_setup_setting))
func add_frame(frame: Control) -> void:
- setting_container.get_child(-1).add_child(frame)
+ if setting_container.get_child_count() > 0:
+ setting_container.get_child(-1).add_child(frame)
+ else:
+ setting_container.add_child(frame)
func add_advice(text: String) -> void:
advice[current_setup_setting] = text
@@ -502,25 +583,10 @@ func show_formatter(category: String) -> void:
"editor": current_setup_resource = Configs.savedata.editor_formatter
"export": current_setup_resource = Configs.savedata.export_formatter
- var button := Button.new()
- button.theme_type_variation = "TranslucentButton"
- button.text = Translator.translate("Reset all to default")
- button.icon = reset_icon
- button.focus_mode = Control.FOCUS_NONE
- button.disabled = current_setup_resource.is_everything_default()
- button.mouse_default_cursor_shape = Control.CURSOR_ARROW if\
- button.disabled else Control.CURSOR_POINTING_HAND
- setting_container.add_child(button)
- button.pressed.connect(current_setup_resource.reset_to_default)
-
- # The preset field shouldn't have a reset button or a section, so set it up manually.
- var frame := ProfileFrameScene.instantiate()
- frame.setup_dropdown(range(Formatter.Preset.size()),
- Formatter.get_preset_value_text_map())
- frame.getter = current_setup_resource.get.bind("preset")
- frame.setter = func(p: Variant) -> void: current_setup_resource.set("preset", p)
- frame.text = Translator.translate("Preset")
- setting_container.add_child(frame)
+ current_setup_setting = "preset"
+ add_profile_picker(Translator.translate("Preset"),
+ current_setup_resource.reset_to_default, Formatter.Preset.size(),
+ Formatter.get_preset_value_text_map(), current_setup_resource.is_everything_default)
add_section("XML")
current_setup_setting = "xml_keep_comments"
diff --git a/src/ui_parts/settings_menu.tscn b/src/ui_parts/settings_menu.tscn
index b3cf8a0..05538c5 100644
--- a/src/ui_parts/settings_menu.tscn
+++ b/src/ui_parts/settings_menu.tscn
@@ -68,7 +68,6 @@ theme_type_variation = &"TextBox"
[node name="AdviceLabel" type="Label" parent="VBoxContainer/AdvicePanel"]
layout_mode = 2
size_flags_vertical = 1
-theme_override_colors/font_color = Color(0.878431, 0.878431, 0.878431, 1)
theme_override_constants/line_spacing = 2
autowrap_mode = 3
diff --git a/src/ui_parts/shortcut_panel.gd b/src/ui_parts/shortcut_panel.gd
index bafee80..fecd77c 100644
--- a/src/ui_parts/shortcut_panel.gd
+++ b/src/ui_parts/shortcut_panel.gd
@@ -16,15 +16,17 @@ const config_icon = preload("res://assets/icons/Config.svg")
# Where on the dotted pattern the dragging started.
var drag_offset := Vector2.ZERO
+var drag_texture_rect: TextureRect
# This property is used to ensure that the panel stays in roughly the same position
# on the window when it resizes.
var position_window_relative: Vector2
func update_theme() -> void:
- var stylebox := get_theme_stylebox("panel", "DarkPanel").duplicate()
+ var stylebox := get_theme_stylebox("panel", "SubtleFlatPanel").duplicate()
stylebox.set_content_margin_all(0)
add_theme_stylebox_override("panel", stylebox)
+ drag_texture_rect.modulate = ThemeUtils.tinted_contrast_color
func set_position_absolute(new_position: Vector2) -> void:
var usable_area_size := get_usable_area_size()
@@ -37,10 +39,10 @@ func set_position_relative(new_position: Vector2) -> void:
position = usable_area_size * position_window_relative
func _ready() -> void:
- Configs.theme_changed.connect(update_theme)
Configs.shortcut_panel_changed.connect(update_layout)
- update_theme()
update_layout()
+ Configs.theme_changed.connect(update_theme)
+ update_theme()
# Positioning callbacks and logic.
get_window().size_changed.connect(sync_relative_position)
resized.connect(sync_relative_position)
@@ -64,16 +66,16 @@ func update_layout() -> void:
main_container.add_theme_constant_override("separation", 6)
add_child(main_container)
- var drag_texture := TextureRect.new()
- drag_texture.stretch_mode = TextureRect.STRETCH_TILE
- drag_texture.texture = dot_pattern
+ drag_texture_rect = TextureRect.new()
+ drag_texture_rect.stretch_mode = TextureRect.STRETCH_TILE
+ drag_texture_rect.texture = dot_pattern
match Configs.savedata.shortcut_panel_layout:
Layout.HORIZONTAL_STRIP:
- drag_texture.custom_minimum_size = Vector2(16, 24)
+ drag_texture_rect.custom_minimum_size = Vector2(16, 24)
Layout.HORIZONTAL_TWO_ROWS:
- drag_texture.custom_minimum_size = Vector2(16, 56)
+ drag_texture_rect.custom_minimum_size = Vector2(16, 56)
Layout.VERTICAL_STRIP:
- drag_texture.custom_minimum_size = Vector2(24, 16)
+ drag_texture_rect.custom_minimum_size = Vector2(24, 16)
var drag_handle := CenterContainer.new()
drag_handle.mouse_default_cursor_shape = Control.CURSOR_DRAG
@@ -83,7 +85,7 @@ func update_layout() -> void:
Layout.VERTICAL_STRIP:
drag_handle.custom_minimum_size.y = 30
drag_handle.gui_input.connect(_on_drag_handle_gui_input)
- drag_handle.add_child(drag_texture)
+ drag_handle.add_child(drag_texture_rect)
main_container.add_child(drag_handle)
var config_button := Button.new()
diff --git a/src/ui_parts/shortcut_panel_config.gd b/src/ui_parts/shortcut_panel_config.gd
index e55d777..558a210 100644
--- a/src/ui_parts/shortcut_panel_config.gd
+++ b/src/ui_parts/shortcut_panel_config.gd
@@ -38,8 +38,13 @@ func update_shortcut_slots() -> void:
var icon_presentation := PanelContainer.new()
icon_presentation.custom_minimum_size = Vector2(28, 28)
- if not current_shortcut.is_empty():
+ if current_shortcut.is_empty():
+ var sb := icon_presentation.get_theme_stylebox("panel").duplicate()
+ sb.border_color.a *= 0.5
+ icon_presentation.add_theme_stylebox_override("panel", sb)
+ else:
var icon := TextureRect.new()
+ icon.modulate = ThemeUtils.tinted_contrast_color
icon.stretch_mode = TextureRect.STRETCH_KEEP_CENTERED
icon.texture = ShortcutUtils.get_action_icon(current_shortcut)
icon_presentation.add_child(icon)
diff --git a/src/ui_parts/shortcut_panel_config.tscn b/src/ui_parts/shortcut_panel_config.tscn
index bf793e3..28be390 100644
--- a/src/ui_parts/shortcut_panel_config.tscn
+++ b/src/ui_parts/shortcut_panel_config.tscn
@@ -26,6 +26,7 @@ theme_override_constants/separation = 8
[node name="Title" type="Label" parent="VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
+theme_type_variation = &"TitleLabel"
horizontal_alignment = 1
[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"]
diff --git a/src/ui_parts/tab_bar.gd b/src/ui_parts/tab_bar.gd
index efc98e4..c36f438 100644
--- a/src/ui_parts/tab_bar.gd
+++ b/src/ui_parts/tab_bar.gd
@@ -38,12 +38,7 @@ func _ready() -> void:
set_process(false)
func _draw() -> void:
- var background_stylebox: StyleBoxFlat =\
- get_theme_stylebox("tab_unselected", "TabContainer").duplicate()
- background_stylebox.corner_radius_top_left += 1
- background_stylebox.corner_radius_top_right += 1
- background_stylebox.bg_color = Color(ThemeUtils.common_panel_inner_color, 0.4)
- draw_style_box(background_stylebox, get_rect())
+ get_theme_stylebox("tabbar_background", "TabContainer").draw(ci, get_rect())
var has_transient_tab := not State.transient_tab_path.is_empty()
var mouse_pos := get_local_mouse_position()
@@ -74,14 +69,16 @@ func _draw() -> void:
var text_line := TextLine.new()
text_line.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS
text_line.add_string(current_tab_name, ThemeUtils.regular_font, 13)
- text_line.width = text_line_width
+ text_line.width = text_line_width - 2
text_line.draw(ci, rect.position + Vector2(4, 3),
get_theme_color("font_selected_color", "TabContainer"))
- var close_rect := get_close_button_rect()
- if close_rect.has_area():
- var close_icon_size := close_icon.get_size()
- draw_texture_rect(close_icon, Rect2(close_rect.position +\
- (close_rect.size - close_icon_size) / 2.0, close_icon_size), false)
+ if not drawing_transient_tab:
+ var close_rect := get_close_button_rect()
+ if close_rect.has_area():
+ var close_icon_size := close_icon.get_size()
+ draw_texture_rect(close_icon, Rect2(close_rect.position +\
+ (close_rect.size - close_icon_size) / 2.0, close_icon_size), false,
+ ThemeUtils.tinted_contrast_color)
else:
var is_hovered := rect.has_point(mouse_pos)
var tab_style := "tab_hovered" if is_hovered else "tab_unselected"
@@ -101,7 +98,8 @@ func _draw() -> void:
var add_button_rect := get_add_button_rect()
var plus_icon_size := plus_icon.get_size()
draw_texture_rect(plus_icon, Rect2(add_button_rect.position +\
- (add_button_rect.size - plus_icon_size) / 2.0, plus_icon_size), false)
+ (add_button_rect.size - plus_icon_size) / 2.0, plus_icon_size), false,
+ ThemeUtils.tinted_contrast_color)
var scroll_backwards_rect := get_scroll_backwards_area_rect()
if scroll_backwards_rect.has_area():
@@ -112,7 +110,7 @@ func _draw() -> void:
else:
var line_x := scroll_backwards_rect.end.x + 1
draw_line(Vector2(line_x, 0), Vector2(line_x, size.y),
- ThemeUtils.common_panel_border_color)
+ ThemeUtils.basic_panel_border_color)
if scroll_backwards_rect.has_point(mouse_pos):
var stylebox_theme := "pressed" if\
Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) else "hover"
@@ -131,7 +129,7 @@ func _draw() -> void:
else:
var line_x := scroll_forwards_rect.position.x
draw_line(Vector2(line_x, 0), Vector2(line_x, size.y),
- ThemeUtils.common_panel_border_color)
+ ThemeUtils.basic_panel_border_color)
if scroll_forwards_rect.has_point(mouse_pos):
var stylebox_theme := "pressed" if\
Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT) else "hover"
@@ -425,24 +423,20 @@ func _get_tooltip(at_position: Vector2) -> String:
return Translator.translate("Scroll forwards")
return ""
-
- var hovered_tab := Configs.savedata.get_tab(hovered_tab_idx)
- # We have to pass some metadata to the tooltip.
- # Since "*" isn't valid in filepaths, we use it as a delimiter.
- if hovered_tab_idx == Configs.savedata.get_active_tab_index():
- return "%s*active" % hovered_tab.get_presented_svg_file_path()
-
- return "%s*%d" % [hovered_tab.get_presented_svg_file_path(), hovered_tab.id]
+ else:
+ # Return tab index as metadata so _make_custom_tooltip can determine the tab
+ # even if the mouse moves.
+ return String.num_int64(hovered_tab_idx)
func _make_custom_tooltip(for_text: String) -> Object:
- var asterisk_pos := for_text.find("*")
- if asterisk_pos == -1:
+ if not for_text.is_valid_int():
return null
- var hovered_tab := Configs.savedata.get_tab(get_hovered_index())
+ var hovered_tab_idx := for_text.to_int()
+ var hovered_tab := Configs.savedata.get_tab(hovered_tab_idx)
var is_saved := not hovered_tab.svg_file_path.is_empty()
- var path := for_text.left(asterisk_pos)
+ var path := hovered_tab.get_presented_svg_file_path()
var label := Label.new()
label.add_theme_font_override("font", ThemeUtils.mono_font if is_saved\
else ThemeUtils.regular_font)
@@ -453,11 +447,9 @@ func _make_custom_tooltip(for_text: String) -> Object:
Utils.set_max_text_width(label, 192.0, 4.0)
# If the tab is active or empty, no need for an SVG preview.
- var metadata := for_text.right(-asterisk_pos - 1)
- if metadata == "active" or hovered_tab.empty_unsaved:
+ if hovered_tab.empty_unsaved or hovered_tab_idx == Configs.savedata.get_active_tab_index():
return label
- var id := metadata.to_int()
var margin_container := MarginContainer.new()
var tooltip_panel_stylebox := get_theme_stylebox("panel", "TooltipPanel")
margin_container.begin_bulk_theme_override()
@@ -475,7 +467,7 @@ func _make_custom_tooltip(for_text: String) -> Object:
preview_rect.custom_minimum_size = Vector2(96, 96)
preview_rect.size = Vector2.ZERO
preview_rect.setup_svg_without_dimensions(FileAccess.get_file_as_string(
- TabData.get_edited_file_path_for_id(id)))
+ hovered_tab.get_edited_file_path()))
preview_rect.shrink_to_fit(16, 16)
hbox.add_child(label)
margin_container.add_child(hbox)
@@ -491,7 +483,7 @@ func get_tab_index_at(pos: Vector2) -> int:
return -1
-class TabDragData:
+class DragData:
var index := -1
func _init(new_index: int) -> void:
index = new_index
@@ -542,10 +534,10 @@ func _get_drag_data(at_position: Vector2) -> Variant:
set_drag_preview(preview)
set_process(true)
- return TabDragData.new(tab_index_at_position)
+ return DragData.new(tab_index_at_position)
func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
- if not data is TabDragData:
+ if not data is DragData:
proposed_drop_idx = -1
return false
var current_drop_idx := get_drop_index_at(at_position)
@@ -557,7 +549,7 @@ func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
return true
func _drop_data(at_position: Vector2, data: Variant) -> void:
- if not data is TabDragData:
+ if not data is DragData:
return
set_process(false)
Configs.savedata.move_tab(data.index, get_drop_index_at(at_position))
diff --git a/src/ui_widgets/BetterButton.gd b/src/ui_widgets/BetterButton.gd
index e189e31..83dd696 100644
--- a/src/ui_widgets/BetterButton.gd
+++ b/src/ui_widgets/BetterButton.gd
@@ -7,13 +7,6 @@ const HIGHLIGHT_TIME = 0.2
var just_pressed := false
var timer: SceneTreeTimer
-var _hovered := false
-
-## Overlaid on top when the Button is hovered while pressed.
-@export var hover_pressed_stylebox: StyleBox
-## Overlaid on top when the Button is hovered while pressed.
-@export var hover_pressed_font_color := Color.TRANSPARENT
-
## A shortcut that corresponds to the same action that this button does.
@export var action := ""
@@ -21,28 +14,6 @@ var _hovered := false
func _ready() -> void:
if not action.is_empty() and not toggle_mode:
pressed.connect(_on_pressed)
-
- mouse_entered.connect(_on_mouse_entered)
- mouse_exited.connect(_on_mouse_exited)
- add_theme_color_override("font_hover_color", get_theme_color(
- "font_hover_color", "Button").blend(hover_pressed_font_color))
-
-func _on_mouse_entered() -> void:
- _hovered = true
- if not disabled and hover_pressed_font_color != Color.BLACK:
- add_theme_color_override("font_pressed_color", get_theme_color(
- "font_pressed_color", "Button").blend(hover_pressed_font_color))
- queue_redraw()
-
-func _on_mouse_exited() -> void:
- _hovered = false
- remove_theme_color_override("font_pressed_color")
- queue_redraw()
-
-func _draw() -> void:
- if _hovered and not disabled and button_pressed and\
- is_instance_valid(hover_pressed_stylebox):
- draw_style_box(hover_pressed_stylebox, Rect2(Vector2.ZERO, size))
func _make_custom_tooltip(_for_text: String) -> Object:
@@ -65,7 +36,7 @@ func _make_custom_tooltip(_for_text: String) -> Object:
shortcut_label.add_theme_font_size_override("font_size",
get_theme_font_size("font_size", "TooltipLabel"))
shortcut_label.add_theme_color_override("font_color",
- ThemeUtils.common_subtle_text_color)
+ ThemeUtils.subtle_text_color)
shortcut_label.text = "(%s)" % action_showcase_text
var hbox := HBoxContainer.new()
@@ -83,11 +54,12 @@ func _unhandled_input(event: InputEvent) -> void:
if action.is_empty() or toggle_mode:
return
- if not just_pressed and ShortcutUtils.is_action_pressed(event, action) and\
- not is_instance_valid(timer):
+ if not just_pressed and ShortcutUtils.is_action_pressed(event, action):
add_theme_color_override("icon_normal_color", get_theme_color("icon_pressed_color"))
add_theme_color_override("icon_hover_color", get_theme_color("icon_pressed_color"))
add_theme_stylebox_override("normal", get_theme_stylebox("pressed"))
+ if is_instance_valid(timer):
+ timer.timeout.disconnect(end_highlight)
timer = get_tree().create_timer(HIGHLIGHT_TIME)
timer.timeout.connect(end_highlight)
diff --git a/src/ui_widgets/BetterLineEdit.gd b/src/ui_widgets/BetterLineEdit.gd
index 3dffd25..feb2996 100644
--- a/src/ui_widgets/BetterLineEdit.gd
+++ b/src/ui_widgets/BetterLineEdit.gd
@@ -2,6 +2,8 @@
class_name BetterLineEdit extends LineEdit
## A LineEdit with a few tweaks to make it nicer to use.
+var original_selection_color: Color
+
## Emitted when Esc is pressed to cancel the current text change.
signal text_change_canceled
@@ -29,15 +31,15 @@ func _init() -> void:
focus_exited.connect(_on_base_class_focus_exited)
mouse_exited.connect(_on_base_class_mouse_exited)
text_submitted.connect(release_focus.unbind(1))
+ original_selection_color = get_theme_color("selection_color")
Configs.theme_changed.connect(update_theme)
update_theme()
func update_theme() -> void:
if editable:
- remove_theme_color_override("selection_color")
+ add_theme_color_override("selection_color", original_selection_color)
else:
- add_theme_color_override("selection_color",
- get_theme_color("disabled_selection_color"))
+ add_theme_color_override("selection_color", get_theme_color("disabled_selection_color"))
var first_click := false
var text_before_focus := ""
diff --git a/src/ui_widgets/BetterTextEdit.gd b/src/ui_widgets/BetterTextEdit.gd
index 65e6076..ad9a23f 100644
--- a/src/ui_widgets/BetterTextEdit.gd
+++ b/src/ui_widgets/BetterTextEdit.gd
@@ -2,8 +2,6 @@
class_name BetterTextEdit extends TextEdit
## A TextEdit with some improvements.
-const caret_color = Color("defd")
-
var _surface := RenderingServer.canvas_item_create()
var _timer := Timer.new()
@@ -96,7 +94,8 @@ func _redraw_caret() -> void:
caret_end.x += char_width
else:
caret_end.y -= char_size.y + 1
- RenderingServer.canvas_item_add_line(_surface, caret_pos, caret_end, caret_color, 1)
+ RenderingServer.canvas_item_add_line(_surface, caret_pos, caret_end,
+ ThemeUtils.caret_color, 1)
var _blonk := true
func blink() -> void:
diff --git a/src/ui_widgets/ContextPopup.gd b/src/ui_widgets/ContextPopup.gd
index 23500b8..57e1e01 100644
--- a/src/ui_widgets/ContextPopup.gd
+++ b/src/ui_widgets/ContextPopup.gd
@@ -88,7 +88,7 @@ icon: Texture2D = null, dim_text := "") -> Button:
var label := Label.new()
label.text = dim_text
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
- var shortcut_text_color := ThemeUtils.common_subtle_text_color
+ var shortcut_text_color := ThemeUtils.subtle_text_color
if disabled:
shortcut_text_color.a *= 0.75
label.add_theme_color_override("font_color", shortcut_text_color)
@@ -165,7 +165,7 @@ start_pressed: bool, dim_text := "") -> CheckBox:
var label := Label.new()
label.text = dim_text
label.horizontal_alignment = HORIZONTAL_ALIGNMENT_RIGHT
- var shortcut_text_color := ThemeUtils.common_subtle_text_color
+ var shortcut_text_color := ThemeUtils.subtle_text_color
#if disabled:
#shortcut_text_color.a *= 0.75
label.add_theme_color_override("font_color", shortcut_text_color)
@@ -242,20 +242,18 @@ min_width := -1.0, max_height := -1.0, separator_indices := PackedInt32Array())
# Setup the title.
var title_container := PanelContainer.new()
var stylebox := StyleBoxFlat.new()
- stylebox.bg_color = Color("0003")
+ stylebox.bg_color = Color(ThemeUtils.extreme_theme_color, 0.2)
stylebox.content_margin_bottom = 3.0
stylebox.content_margin_left = 8.0
stylebox.content_margin_right = 8.0
stylebox.border_width_bottom = 2
- stylebox.border_color = ThemeUtils.common_panel_border_color
+ stylebox.border_color = ThemeUtils.basic_panel_border_color
title_container.add_theme_stylebox_override("panel", stylebox)
var title_label := Label.new()
title_label.text = top_title
title_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
- title_label.begin_bulk_theme_override()
- title_label.add_theme_color_override("font_color", Color("def"))
+ title_label.theme_type_variation = "TitleLabel"
title_label.add_theme_font_size_override("font_size", 14)
- title_label.end_bulk_theme_override()
title_container.add_child(title_label)
main_container.add_child(title_container)
# Continue with regular setup logic.
diff --git a/src/ui_widgets/Handle.gd b/src/ui_widgets/Handle.gd
index 16e6038..8b57f81 100644
--- a/src/ui_widgets/Handle.gd
+++ b/src/ui_widgets/Handle.gd
@@ -1,5 +1,5 @@
# Base class for handles.
-class_name Handle extends RefCounted
+@abstract class_name Handle
enum Display {BIG, SMALL}
var display_mode := Display.BIG
diff --git a/src/ui_widgets/LineEditButton.gd b/src/ui_widgets/LineEditButton.gd
index 6c94fc9..3d537dc 100644
--- a/src/ui_widgets/LineEditButton.gd
+++ b/src/ui_widgets/LineEditButton.gd
@@ -174,7 +174,8 @@ func _draw() -> void:
if is_instance_valid(icon):
var icon_side := BUTTON_WIDTH - horizontal_margin_width + 2
icon.draw_rect(ci, Rect2(size.x - (BUTTON_WIDTH + 0.5 + icon_side) / 2,
- (size.y - icon_side) / 2, icon_side, icon_side), false)
+ (size.y - icon_side) / 2, icon_side, icon_side), false,
+ get_theme_color("icon_normal_color", "LeftConnectedButton"))
# Helpers
diff --git a/src/ui_widgets/PanelGrid.gd b/src/ui_widgets/PanelGrid.gd
index 03dc0c2..dbfe259 100644
--- a/src/ui_widgets/PanelGrid.gd
+++ b/src/ui_widgets/PanelGrid.gd
@@ -2,8 +2,6 @@
class_name PanelGrid extends Control
# Can be made into vars if necessary.
-const inner_color = Color("#32324d")
-const border_color = Color("#4d4d66")
const border_width = 1
const side_spacing = 6
const top_spacing = 2
@@ -13,11 +11,15 @@ const bottom_spacing = 2
@export var items: PackedStringArray
@export var dim_last_item := false
+
func _draw() -> void:
var item_count := items.size()
if item_count == 0:
return
+ var inner_color := ThemeUtils.desaturated_color.lerp(ThemeUtils.extreme_theme_color, 0.75)
+ var border_color := ThemeUtils.desaturated_color.lerp(ThemeUtils.extreme_theme_color, 0.55)
+
var effective_columns := clampi(columns, 1, item_count)
var text_color := get_theme_color("font_color", "Label")
var text_font := get_theme_font("font", "Label")
@@ -43,7 +45,7 @@ func _draw() -> void:
RenderingServer.canvas_item_add_rect(ci,
Rect2(pos_x, pos_y, box_width, box_height), inner_color)
if dim_last_item:
- text_color = ThemeUtils.common_dim_text_color
+ text_color = ThemeUtils.dim_text_color
# Sigh...
if is_zero_approx(pos_x):
diff --git a/src/ui_widgets/TitledPanel.gd b/src/ui_widgets/TitledPanel.gd
index 4df86ad..ab8dd9e 100644
--- a/src/ui_widgets/TitledPanel.gd
+++ b/src/ui_widgets/TitledPanel.gd
@@ -1,6 +1,6 @@
# Titled panels have two children: The first is on top and it's the title,
# the second one is on the bottom and it's the panel.
-class_name TitledPanel extends Container
+@abstract class_name TitledPanel extends Container
@export var border_width: int
@export var corner_radius_top_left: int
diff --git a/src/ui_widgets/UndoRedoRef.gd b/src/ui_widgets/UndoRedoRef.gd
index dcbbf59..52318ef 100644
--- a/src/ui_widgets/UndoRedoRef.gd
+++ b/src/ui_widgets/UndoRedoRef.gd
@@ -2,7 +2,7 @@
# I mean, every class you're expected to construct is a RefCounted. Objects are used
# for sitting ducks like singletons and read-only stuff. Except UndoRedo, which is easy
# memory leaks if you forget to free it.
-class_name UndoRedoRef extends RefCounted
+class_name UndoRedoRef
signal version_changed
diff --git a/src/ui_widgets/alert_dialog.tscn b/src/ui_widgets/alert_dialog.tscn
index 77c05f4..192b644 100644
--- a/src/ui_widgets/alert_dialog.tscn
+++ b/src/ui_widgets/alert_dialog.tscn
@@ -1,6 +1,5 @@
-[gd_scene load_steps=3 format=3 uid="uid://c0x44loihhyyo"]
+[gd_scene load_steps=2 format=3 uid="uid://c0x44loihhyyo"]
-[ext_resource type="FontFile" uid="uid://dc0w4sx0h0fui" path="res://assets/fonts/FontBold.ttf" id="1_3yrpq"]
[ext_resource type="Script" uid="uid://dlsd0uctldklk" path="res://src/ui_widgets/alert_dialog.gd" id="1_qntyo"]
[node name="AlertDialog" type="PanelContainer"]
@@ -28,8 +27,7 @@ theme_override_constants/separation = 8
[node name="Title" type="Label" parent="MainContainer/TextContainer"]
layout_mode = 2
-theme_override_fonts/font = ExtResource("1_3yrpq")
-theme_override_font_sizes/font_size = 16
+theme_type_variation = &"BoldTitleLabel"
horizontal_alignment = 1
[node name="Label" type="RichTextLabel" parent="MainContainer/TextContainer"]
diff --git a/src/ui_widgets/basic_xnode_frame.gd b/src/ui_widgets/basic_xnode_frame.gd
index aa88224..141f04e 100644
--- a/src/ui_widgets/basic_xnode_frame.gd
+++ b/src/ui_widgets/basic_xnode_frame.gd
@@ -17,7 +17,10 @@ func _ready() -> void:
State.xnode_dragging_state_changed.connect(_on_xnodes_dragging_state_changed)
title_bar.draw.connect(_on_title_bar_draw)
mouse_exited.connect(_on_mouse_exited)
+ Configs.theme_changed.connect(determine_selection_highlight)
determine_selection_highlight()
+ Configs.theme_changed.connect(set_default_font_color)
+ set_default_font_color()
title_bar.queue_redraw()
text_edit.text_set.connect(_on_text_modified)
text_edit.text_changed.connect(_on_text_modified)
@@ -86,6 +89,9 @@ func _on_mouse_exited() -> void:
determine_selection_highlight()
+func set_default_font_color() -> void:
+ text_edit.add_theme_color_override("font_color", ThemeUtils.editable_text_color)
+
func determine_selection_highlight() -> void:
var is_selected := xnode.xid in State.selected_xids
var is_hovered := State.hovered_xid == xnode.xid
@@ -107,6 +113,21 @@ func determine_selection_highlight() -> void:
title_color = Color.from_hsv(0.625, 0.45, 0.17)
border_color = Color.from_hsv(0.6, 0.5, 0.35)
+ if not ThemeUtils.is_theme_dark:
+ color.s *= 0.2
+ color.v = lerpf(color.v, 1.0, 0.875)
+ title_color.s *= 0.2
+ title_color.v = lerpf(title_color.v, 1.0, 0.875)
+ border_color.v = lerpf(border_color.v, 1.0, 0.8)
+ if is_hovered:
+ color.s = lerpf(color.s, 1.0, 0.05)
+ title_color.s = lerpf(title_color.s, 1.0, 0.05)
+ border_color.v *= 0.9
+ if is_selected:
+ color.s = lerpf(color.s, 1.0, 0.15)
+ title_color.s = lerpf(title_color.s, 1.0, 0.15)
+ border_color.v *= 0.65
+
var depth := xnode.xid.size() - 1
var depth_tint := depth * 0.12
if depth > 0:
@@ -160,7 +181,7 @@ func _on_title_bar_draw() -> void:
var xnode_icon := DB.get_xnode_icon(xnode.get_type())
var xnode_icon_size := xnode_icon.get_size()
xnode_icon.draw_rect(title_bar_ci, Rect2(title_bar.size / 2 - xnode_icon_size / 2,
- xnode_icon_size), false)
+ xnode_icon_size), false, ThemeUtils.tinted_contrast_color)
func _on_text_modified() -> void:
# TODO figure out a way to make this work.
@@ -176,6 +197,6 @@ func _on_text_modified() -> void:
if xnode.check_text_validity(text_edit.text):
xnode.set_text(text_edit.text)
- text_edit.remove_theme_color_override("font_color")
+ set_default_font_color()
else:
text_edit.add_theme_color_override("font_color", Configs.savedata.basic_color_error)
diff --git a/src/ui_widgets/choose_name_dialog.gd b/src/ui_widgets/choose_name_dialog.gd
index 0e6965c..536821b 100644
--- a/src/ui_widgets/choose_name_dialog.gd
+++ b/src/ui_widgets/choose_name_dialog.gd
@@ -19,9 +19,11 @@ func _ready() -> void:
name_edit.text_submitted.connect(_on_name_edit_text_submitted)
name_edit.add_theme_font_override("font", ThemeUtils.regular_font)
-func _on_name_edit_text_submitted() -> void:
+func _on_name_edit_text_submitted(_text: String) -> void:
if not action_button.disabled:
action_button.grab_focus()
+ else:
+ cancel_button.grab_focus()
# The error/warning callables should take the stripped text and return a string.
func setup(title: String, action: Callable, error_callable := Callable(),
diff --git a/src/ui_widgets/choose_name_dialog.tscn b/src/ui_widgets/choose_name_dialog.tscn
index 6b6dce2..10c4ffb 100644
--- a/src/ui_widgets/choose_name_dialog.tscn
+++ b/src/ui_widgets/choose_name_dialog.tscn
@@ -1,7 +1,6 @@
-[gd_scene load_steps=4 format=3 uid="uid://2vlktxj118su"]
+[gd_scene load_steps=3 format=3 uid="uid://2vlktxj118su"]
[ext_resource type="Script" uid="uid://qiuaih0hajks" path="res://src/ui_widgets/choose_name_dialog.gd" id="1_qr08l"]
-[ext_resource type="FontFile" uid="uid://dc0w4sx0h0fui" path="res://assets/fonts/FontBold.ttf" id="2_h3hxy"]
[ext_resource type="Script" uid="uid://1hox6gd5pxku" path="res://src/ui_widgets/BetterLineEdit.gd" id="3_q0a2q"]
[node name="ChooseNameDialog" type="PanelContainer"]
@@ -29,8 +28,7 @@ theme_override_constants/separation = 8
[node name="Title" type="Label" parent="MainContainer/TextContainer"]
layout_mode = 2
-theme_override_fonts/font = ExtResource("2_h3hxy")
-theme_override_font_sizes/font_size = 16
+theme_type_variation = &"BoldTitleLabel"
horizontal_alignment = 1
[node name="NameEdit" type="LineEdit" parent="MainContainer/TextContainer"]
diff --git a/src/ui_widgets/color_field.gd b/src/ui_widgets/color_field.gd
index dd60379..366fa0a 100644
--- a/src/ui_widgets/color_field.gd
+++ b/src/ui_widgets/color_field.gd
@@ -19,7 +19,7 @@ const ColorFieldPopupScene = preload("res://src/ui_widgets/color_field_popup.tsc
const checkerboard = preload("res://assets/icons/backgrounds/ColorButtonBG.svg")
var color_popup: ColorFieldPopup
-var gradient_texture: GradientTexture2D
+var gradient_texture: SVGTexture
func set_value(new_value: String, save := false) -> void:
if not new_value.is_empty():
@@ -113,7 +113,7 @@ func _draw() -> void:
if cached_allow_url and ColorParser.is_valid_url(color_value):
var id := color_value.substr(5, color_value.length() - 6)
var gradient_element := State.root_element.get_element_by_id(id)
- if DB.is_element_gradient(gradient_element):
+ if is_instance_valid(gradient_element) and gradient_element is ElementBaseGradient:
# Complex drawing logic, because StyleBoxTexture isn't advanced enough.
var points := PackedVector2Array()
var colors := PackedColorArray()
@@ -179,7 +179,7 @@ func update_gradient_texture() -> void:
if ColorParser.is_valid_url(color_value):
var id := color_value.substr(5, color_value.length() - 6)
var gradient_element := State.root_element.get_element_by_id(id)
- if DB.is_element_gradient(gradient_element):
+ if is_instance_valid(gradient_element) and gradient_element is ElementBaseGradient:
gradient_texture = gradient_element.generate_texture()
else:
gradient_texture = null
diff --git a/src/ui_widgets/color_field_popup.gd b/src/ui_widgets/color_field_popup.gd
index 3008bae..d354b4d 100644
--- a/src/ui_widgets/color_field_popup.gd
+++ b/src/ui_widgets/color_field_popup.gd
@@ -113,7 +113,7 @@ func update_palettes(search_text := "") -> void:
if not palette.title.is_empty():
var palette_label := Label.new()
palette_label.text = palette.title
- palette_label.add_theme_font_size_override("font_size", 15)
+ palette_label.theme_type_variation = "TitleLabel"
palette_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
palette_container.add_child(palette_label)
diff --git a/src/ui_widgets/color_swatch.gd b/src/ui_widgets/color_swatch.gd
index 9eb7283..738cda8 100644
--- a/src/ui_widgets/color_swatch.gd
+++ b/src/ui_widgets/color_swatch.gd
@@ -8,7 +8,7 @@ var color: String
var color_name: String
var ci := get_canvas_item()
-var gradient_texture: GradientTexture2D
+var gradient_texture: SVGTexture
var current_color := Color.BLACK
@@ -18,7 +18,7 @@ func _ready() -> void:
if ColorParser.is_valid_url(color):
var id := color.substr(5, color.length() - 6)
var gradient_element := State.root_element.get_element_by_id(id)
- if DB.is_element_gradient(gradient_element):
+ if is_instance_valid(gradient_element) and gradient_element is ElementBaseGradient:
gradient_texture = gradient_element.generate_texture()
func _draw() -> void:
diff --git a/src/ui_widgets/configure_color_popup.gd b/src/ui_widgets/configure_color_popup.gd
index 5f00582..45c3b82 100644
--- a/src/ui_widgets/configure_color_popup.gd
+++ b/src/ui_widgets/configure_color_popup.gd
@@ -48,7 +48,7 @@ func set_label_text(new_text: String) -> void:
if new_text.is_empty():
color_label.text = Translator.translate("Unnamed")
color_label.add_theme_color_override("font_color",
- ThemeUtils.common_subtle_text_color)
+ ThemeUtils.subtle_text_color)
else:
color_label.text = new_text
color_label.remove_theme_color_override("font_color")
diff --git a/src/ui_widgets/confirm_dialog.tscn b/src/ui_widgets/confirm_dialog.tscn
index 3197974..43baa15 100644
--- a/src/ui_widgets/confirm_dialog.tscn
+++ b/src/ui_widgets/confirm_dialog.tscn
@@ -1,7 +1,6 @@
-[gd_scene load_steps=3 format=3 uid="uid://ywarfvqdho0"]
+[gd_scene load_steps=2 format=3 uid="uid://ywarfvqdho0"]
[ext_resource type="Script" uid="uid://3gwwpcy3jctv" path="res://src/ui_widgets/confirm_dialog.gd" id="1_g3djf"]
-[ext_resource type="FontFile" uid="uid://dc0w4sx0h0fui" path="res://assets/fonts/FontBold.ttf" id="2_drhgn"]
[node name="ConfirmDialog" type="PanelContainer"]
anchors_preset = 8
@@ -28,8 +27,7 @@ theme_override_constants/separation = 8
[node name="Title" type="Label" parent="MainContainer/TextContainer"]
layout_mode = 2
-theme_override_fonts/font = ExtResource("2_drhgn")
-theme_override_font_sizes/font_size = 16
+theme_type_variation = &"BoldTitleLabel"
horizontal_alignment = 1
[node name="Label" type="RichTextLabel" parent="MainContainer/TextContainer"]
diff --git a/src/ui_widgets/element_frame.gd b/src/ui_widgets/element_frame.gd
index c430aa5..1de21b6 100644
--- a/src/ui_widgets/element_frame.gd
+++ b/src/ui_widgets/element_frame.gd
@@ -44,6 +44,7 @@ func _ready() -> void:
element.ancestor_attribute_changed.connect(title_bar.queue_redraw.unbind(1))
element.descendant_attribute_changed.connect(title_bar.queue_redraw.unbind(1))
element.attribute_changed.connect(title_bar.queue_redraw.unbind(1))
+ Configs.theme_changed.connect(determine_selection_highlight)
determine_selection_highlight()
title_bar.queue_redraw()
@@ -222,6 +223,21 @@ func determine_selection_highlight() -> void:
title_color = Color.from_hsv(0.625, 0.45, 0.17)
border_color = Color.from_hsv(0.6, 0.5, 0.35)
+ if not ThemeUtils.is_theme_dark:
+ color.s *= 0.2
+ color.v = lerpf(color.v, 1.0, 0.875)
+ title_color.s *= 0.2
+ title_color.v = lerpf(title_color.v, 1.0, 0.875)
+ border_color.v = lerpf(border_color.v, 1.0, 0.8)
+ if is_hovered:
+ color.s = lerpf(color.s, 1.0, 0.05)
+ title_color.s = lerpf(title_color.s, 1.0, 0.05)
+ border_color.v *= 0.9
+ if is_selected:
+ color.s = lerpf(color.s, 1.0, 0.15)
+ title_color.s = lerpf(title_color.s, 1.0, 0.15)
+ border_color.v *= 0.65
+
var depth := element.xid.size() - 1
var depth_tint := depth * 0.12
if depth > 0:
@@ -282,14 +298,14 @@ func _on_title_bar_draw() -> void:
HORIZONTAL_ALIGNMENT_LEFT, 180, 12).x / 2
ThemeUtils.mono_font.draw_string(title_bar_ci, Vector2(half_bar_width -\
half_title_width + element_icon_size.x / 2, 15), element.name,
- HORIZONTAL_ALIGNMENT_LEFT, 180, 12)
+ HORIZONTAL_ALIGNMENT_LEFT, 180, 12, ThemeUtils.editable_text_color)
element_icon.draw_rect(title_bar_ci, Rect2(Vector2(half_bar_width - half_title_width -\
- element_icon_size.x + 6, 1).round(), element_icon_size), false)
+ element_icon_size.x + 6, 1).round(), element_icon_size), false, ThemeUtils.tinted_contrast_color)
var element_warnings := element.get_config_warnings()
if not element_warnings.is_empty():
warning_icon.draw_rect(title_bar_ci, Rect2(Vector2(title_bar.size.x - 23, 2),
- warning_icon.get_size()), false)
+ warning_icon.get_size()), false, ThemeUtils.warning_icon_color)
# Block dragging from starting when pressing the title button.
func _on_title_button_gui_input(event: InputEvent) -> void:
diff --git a/src/ui_widgets/flag_field.tscn b/src/ui_widgets/flag_field.tscn
index abbaa08..6870de6 100644
--- a/src/ui_widgets/flag_field.tscn
+++ b/src/ui_widgets/flag_field.tscn
@@ -8,16 +8,14 @@ base_font = ExtResource("1_p8s8y")
spacing_top = -1
spacing_bottom = -1
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_kfgda"]
-
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oo47u"]
content_margin_left = 5.0
content_margin_top = 0.0
content_margin_right = 5.0
content_margin_bottom = 0.0
-bg_color = Color(0.4, 0.121569, 0.121569, 1)
+bg_color = Color(0.65835345, 0.1463947, 0.15940602, 0.6)
border_width_bottom = 2
-border_color = Color(0.85098, 0.168627, 0.168627, 1)
+border_color = Color(0.9900269, 0.5077327, 0.4781272, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
@@ -26,12 +24,14 @@ content_margin_left = 5.0
content_margin_top = 0.0
content_margin_right = 5.0
content_margin_bottom = 0.0
-bg_color = Color(0.12, 0.4, 0.12, 1)
+bg_color = Color(0.24323256, 0.42435676, 0.115875855, 0.4)
border_width_bottom = 2
-border_color = Color(0.466667, 0.85098, 0.0862745, 1)
+border_color = Color(0.7655958, 0.9776526, 0.25387198, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_kfgda"]
+
[node name="FlagField" type="Button"]
custom_minimum_size = Vector2(0, 18)
offset_right = 19.0
@@ -39,14 +39,14 @@ offset_bottom = 18.0
focus_mode = 0
mouse_filter = 1
mouse_default_cursor_shape = 2
-theme_override_colors/font_pressed_color = Color(0.74902, 1, 0.74902, 1)
-theme_override_colors/font_color = Color(1, 0.75, 0.75, 1)
+theme_override_colors/font_color = Color(1, 0.8456523, 0.8433526, 1)
+theme_override_colors/font_pressed_color = Color(0.6350836, 1, 0.5034966, 1)
theme_override_fonts/font = SubResource("FontVariation_46ud6")
theme_override_font_sizes/font_size = 14
-theme_override_styles/disabled = SubResource("StyleBoxEmpty_kfgda")
-theme_override_styles/hover = SubResource("StyleBoxFlat_oo47u")
-theme_override_styles/pressed = SubResource("StyleBoxFlat_uepoa")
theme_override_styles/normal = SubResource("StyleBoxFlat_oo47u")
+theme_override_styles/pressed = SubResource("StyleBoxFlat_uepoa")
+theme_override_styles/hover = SubResource("StyleBoxFlat_oo47u")
+theme_override_styles/disabled = SubResource("StyleBoxEmpty_kfgda")
toggle_mode = true
text = "0"
script = ExtResource("2_0bhg4")
diff --git a/src/ui_widgets/fps_limit_dropdown.gd b/src/ui_widgets/fps_limit_dropdown.gd
new file mode 100644
index 0000000..1ba6683
--- /dev/null
+++ b/src/ui_widgets/fps_limit_dropdown.gd
@@ -0,0 +1,47 @@
+# The need for a unique 0 value made the regular numeric dropdown unusable.
+extends HBoxContainer
+
+signal value_changed(new_value: String)
+
+@onready var line_edit: BetterLineEdit = $LineEdit
+@onready var button: Button = $Button
+
+const values: PackedInt32Array = [0, 30, 60, 90, 120, 144, 240, 360]
+const min_value := SaveData.MAX_FPS_MIN
+const max_value := SaveData.MAX_FPS_MAX
+
+var _value := ""
+
+func set_value(new_value: String) -> void:
+ var current_num := roundi(_value.to_float())
+ var proposed_num := roundi(new_value.to_float())
+ if is_nan(proposed_num) or proposed_num == INF:
+ proposed_num = 0
+ elif proposed_num != 0:
+ proposed_num = clampi(proposed_num, min_value, max_value)
+
+ if not is_equal_approx(current_num, proposed_num):
+ _value = to_str(proposed_num)
+ value_changed.emit(_value)
+ elif _value.is_empty():
+ _value = to_str(proposed_num)
+ if is_instance_valid(line_edit):
+ line_edit.text = _value
+
+func _ready() -> void:
+ line_edit.text_submitted.connect(set_value)
+ button.pressed.connect(_on_button_pressed)
+
+func _on_button_pressed() -> void:
+ var btn_arr: Array[Button] = []
+ for val in values:
+ var new_value := to_str(val)
+ btn_arr.append(ContextPopup.create_button(new_value,
+ set_value.bind(new_value), new_value == _value))
+ var value_picker := ContextPopup.new()
+ value_picker.setup(btn_arr, false, size.x)
+ HandlerGUI.popup_under_rect(value_picker, line_edit.get_global_rect(), get_viewport())
+
+
+func to_str(num: int) -> String:
+ return Translator.translate("Unlimited") if num == 0 else String.num_int64(num)
diff --git a/src/ui_widgets/fps_limit_dropdown.gd.uid b/src/ui_widgets/fps_limit_dropdown.gd.uid
new file mode 100644
index 0000000..070a17a
--- /dev/null
+++ b/src/ui_widgets/fps_limit_dropdown.gd.uid
@@ -0,0 +1 @@
+uid://bfpf8mrhc3135
diff --git a/src/ui_widgets/fps_limit_dropdown.tscn b/src/ui_widgets/fps_limit_dropdown.tscn
new file mode 100644
index 0000000..36361c1
--- /dev/null
+++ b/src/ui_widgets/fps_limit_dropdown.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 format=3 uid="uid://ihq4xu3ehh6u"]
+
+[ext_resource type="Script" uid="uid://bfpf8mrhc3135" path="res://src/ui_widgets/fps_limit_dropdown.gd" id="1_y7tut"]
+[ext_resource type="FontFile" uid="uid://clpf84p1lfwlp" path="res://assets/fonts/Font.ttf" id="2_ew4ut"]
+[ext_resource type="Script" uid="uid://1hox6gd5pxku" path="res://src/ui_widgets/BetterLineEdit.gd" id="3_rmrur"]
+[ext_resource type="Texture2D" uid="uid://coda6chhcatal" path="res://assets/icons/Arrow.svg" id="4_cvdg3"]
+
+[node name="FPSLimitDropdown" type="HBoxContainer"]
+custom_minimum_size = Vector2(0, 22)
+offset_right = 49.0
+offset_bottom = 22.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+theme_override_constants/separation = 0
+script = ExtResource("1_y7tut")
+
+[node name="LineEdit" type="LineEdit" parent="."]
+layout_mode = 2
+theme_type_variation = &"RightConnectedLineEdit"
+theme_override_fonts/font = ExtResource("2_ew4ut")
+script = ExtResource("3_rmrur")
+
+[node name="Button" type="Button" parent="."]
+custom_minimum_size = Vector2(15, 0)
+layout_mode = 2
+focus_mode = 0
+mouse_filter = 1
+mouse_default_cursor_shape = 2
+theme_type_variation = &"LeftConnectedButton"
+icon = ExtResource("4_cvdg3")
+expand_icon = true
diff --git a/src/ui_widgets/good_color_picker.gd b/src/ui_widgets/good_color_picker.gd
index 3f04c8c..51498b8 100644
--- a/src/ui_widgets/good_color_picker.gd
+++ b/src/ui_widgets/good_color_picker.gd
@@ -89,18 +89,21 @@ func setup_color(new_color: String, default_color: Color) -> void:
update()
-func add_color_space_buttons() -> void:
+func update_color_space_buttons() -> void:
+ for child in color_space_container.get_children():
+ child.queue_free()
+
var normal_stylebox := StyleBoxFlat.new()
- normal_stylebox.bg_color = ThemeUtils.translucent_button_color_normal
+ normal_stylebox.bg_color = ThemeUtils.hover_overlay_color
var hover_stylebox := normal_stylebox.duplicate()
- hover_stylebox.bg_color = ThemeUtils.translucent_button_color_hover
+ hover_stylebox.bg_color = ThemeUtils.strong_hover_overlay_color
var pressed_stylebox := StyleBoxFlat.new()
- pressed_stylebox.bg_color = ThemeUtils.translucent_button_color_pressed
+ pressed_stylebox.bg_color = ThemeUtils.hover_pressed_overlay_color
pressed_stylebox.border_width_top = 2
pressed_stylebox.content_margin_bottom = 2.0
- pressed_stylebox.border_color = Color(ThemeUtils.common_editable_text_color, 0.7)
+ pressed_stylebox.border_color = Color(ThemeUtils.editable_text_color, 0.7)
for color_space: SliderMode in [SliderMode.RGB, SliderMode.HSV]:
var btn := Button.new()
@@ -109,6 +112,7 @@ func add_color_space_buttons() -> void:
btn.add_theme_stylebox_override("normal", normal_stylebox)
btn.add_theme_stylebox_override("hover", hover_stylebox)
btn.add_theme_stylebox_override("pressed", pressed_stylebox)
+ btn.add_theme_stylebox_override("hover_pressed", pressed_stylebox)
btn.end_bulk_theme_override()
btn.size_flags_horizontal = Control.SIZE_EXPAND_FILL
btn.focus_mode = Control.FOCUS_NONE
@@ -136,7 +140,8 @@ func update_keyword_button() -> void:
keyword_button.show()
func _ready() -> void:
- add_color_space_buttons()
+ Configs.theme_changed.connect(update_color_space_buttons)
+ update_color_space_buttons()
# Set up signals.
widgets_arr[0].gui_input.connect(parse_slider_input.bind(0, true))
widgets_arr[1].gui_input.connect(parse_slider_input.bind(1))
@@ -431,7 +436,9 @@ func _on_color_rect_draw() -> void:
# Draw inside the side slider to give it a little arrow to the side.
func _on_side_slider_draw() -> void:
- var arrow_modulate := Color(1, 1, 1) if sliders_dragged[0] else Color(1, 1, 1, 0.7)
+ var arrow_modulate := ThemeUtils.tinted_contrast_color
+ if not sliders_dragged[0]:
+ arrow_modulate.a = 0.7
widgets_arr[0].draw_texture(side_slider_arrow, Vector2(0, tracks_arr[0].position.y +\
tracks_arr[0].size.y * (1 - display_color.v) -\
side_slider_arrow.get_height() / 2.0), arrow_modulate)
@@ -446,12 +453,14 @@ func _draw() -> void:
# Helper for drawing the horizontal sliders.
func draw_hslider(idx: int, offset: float, chr: String) -> void:
- var arrow_modulate := Color(1, 1, 1) if sliders_dragged[idx] else Color(1, 1, 1, 0.7)
+ var arrow_modulate := ThemeUtils.tinted_contrast_color
+ if not sliders_dragged[idx]:
+ arrow_modulate.a = 0.7
widgets_arr[idx].draw_texture(slider_arrow, Vector2(tracks_arr[idx].position.x +\
tracks_arr[idx].size.x * offset - slider_arrow.get_width() / 2.0,
tracks_arr[idx].size.y), arrow_modulate)
- widgets_arr[idx].draw_string(get_theme_default_font(),
- Vector2(-12, 11), chr, HORIZONTAL_ALIGNMENT_CENTER, 12, 14)
+ widgets_arr[idx].draw_string(get_theme_default_font(), Vector2(-12, 11), chr,
+ HORIZONTAL_ALIGNMENT_CENTER, 12, 14, ThemeUtils.text_color)
# Make sure the arrows are redrawn when the tracks finish resizing.
func _on_track_resized() -> void:
@@ -534,4 +543,4 @@ func _unhandled_input(event: InputEvent) -> void:
func _on_eyedropper_pressed() -> void:
var eyedropper_popup := EyedropperPopupScene.instantiate()
eyedropper_popup.color_picked.connect(register_visual_change.bind(false))
- HandlerGUI.add_popup(eyedropper_popup)
+ HandlerGUI.add_popup(eyedropper_popup, false)
diff --git a/src/ui_widgets/good_color_picker.tscn b/src/ui_widgets/good_color_picker.tscn
index 60e83cc..37690e7 100644
--- a/src/ui_widgets/good_color_picker.tscn
+++ b/src/ui_widgets/good_color_picker.tscn
@@ -126,8 +126,8 @@ grow_horizontal = 2
grow_vertical = 2
focus_mode = 0
theme_type_variation = &"TextButton"
-theme_override_colors/icon_disabled_color = Color(0, 0, 0, 0)
theme_override_colors/icon_normal_color = Color(0, 0, 0, 0)
+theme_override_colors/icon_disabled_color = Color(0, 0, 0, 0)
icon = ExtResource("5_rh0xc")
icon_alignment = 1
diff --git a/src/ui_widgets/number_dropdown.gd b/src/ui_widgets/number_dropdown.gd
index b35ae7d..62e6309 100644
--- a/src/ui_widgets/number_dropdown.gd
+++ b/src/ui_widgets/number_dropdown.gd
@@ -4,6 +4,7 @@ extends HBoxContainer
signal value_changed(new_value: String)
@onready var line_edit: BetterLineEdit = $LineEdit
+@onready var button: Button = $Button
@export var values: PackedFloat64Array
@export var is_integer := false
@@ -23,9 +24,16 @@ func set_value(new_value: String) -> void:
if not is_equal_approx(current_num, proposed_num):
_value = to_str(proposed_num)
value_changed.emit(_value)
+ elif _value.is_empty():
+ _value = to_str(proposed_num)
if is_instance_valid(line_edit):
line_edit.text = _value
+func _ready() -> void:
+ line_edit.text_changed.connect(_on_text_changed)
+ line_edit.text_submitted.connect(_on_text_submitted)
+ button.pressed.connect(_on_button_pressed)
+
func _on_button_pressed() -> void:
var btn_arr: Array[Button] = []
for val in values:
diff --git a/src/ui_widgets/number_dropdown.tscn b/src/ui_widgets/number_dropdown.tscn
index ecd0939..c589176 100644
--- a/src/ui_widgets/number_dropdown.tscn
+++ b/src/ui_widgets/number_dropdown.tscn
@@ -29,7 +29,3 @@ mouse_default_cursor_shape = 2
theme_type_variation = &"LeftConnectedButton"
icon = ExtResource("4_vet1k")
expand_icon = true
-
-[connection signal="text_changed" from="LineEdit" to="." method="_on_text_changed"]
-[connection signal="text_submitted" from="LineEdit" to="." method="_on_text_submitted"]
-[connection signal="pressed" from="Button" to="." method="_on_button_pressed"]
diff --git a/src/ui_widgets/number_field.gd b/src/ui_widgets/number_field.gd
index 68251e0..d146c95 100644
--- a/src/ui_widgets/number_field.gd
+++ b/src/ui_widgets/number_field.gd
@@ -41,6 +41,9 @@ func _ready() -> void:
element.attribute_changed.connect(_on_element_attribute_changed)
if attribute_name in DB.propagated_attributes:
element.ancestor_attribute_changed.connect(_on_element_ancestor_attribute_changed)
+ # These default attributes can change when cx and cy change.
+ if element is ElementRadialGradient and attribute_name in ["fx", "fy"]:
+ element.attribute_changed.connect(_on_element_other_attribute_changed)
tooltip_text = attribute_name
text_submitted.connect(set_value.bind(true))
text_change_canceled.connect(sync)
@@ -52,6 +55,12 @@ func _on_element_attribute_changed(attribute_changed: String) -> void:
if attribute_name == attribute_changed:
set_value(element.get_attribute_value(attribute_name))
+func _on_element_other_attribute_changed(attribute_changed: String) -> void:
+ if (attribute_name == "fx" and attribute_changed == "cx") or\
+ (attribute_name == "fy" and attribute_changed == "cy"):
+ setup_placeholder()
+ sync()
+
func _on_element_ancestor_attribute_changed(attribute_changed: String) -> void:
if attribute_name == attribute_changed:
setup_placeholder()
diff --git a/src/ui_widgets/number_field_with_slider.gd b/src/ui_widgets/number_field_with_slider.gd
index 6e1d256..7900988 100644
--- a/src/ui_widgets/number_field_with_slider.gd
+++ b/src/ui_widgets/number_field_with_slider.gd
@@ -103,11 +103,11 @@ func _draw() -> void:
MIN_VALUE) / MAX_VALUE
# Create a stylebox that'll occupy the exact amount of space.
var fill_stylebox := StyleBoxFlat.new()
- fill_stylebox.bg_color = Color("def")
+ fill_stylebox.bg_color = ThemeUtils.tinted_contrast_color
if not slider_dragged and slider_hovered:
- fill_stylebox.bg_color.a = 0.75
+ fill_stylebox.bg_color.a = 0.8
elif not slider_hovered:
- fill_stylebox.bg_color.a = 0.5
+ fill_stylebox.bg_color.a = 0.6
fill_stylebox.draw(ci, Rect2(get_size().x - BUTTON_WIDTH,
get_size().y - 2 - fill_height, BUTTON_WIDTH - 2, fill_height))
if slider_dragged:
diff --git a/src/ui_widgets/options_dialog.gd b/src/ui_widgets/options_dialog.gd
index 6ef1d36..0d603a8 100644
--- a/src/ui_widgets/options_dialog.gd
+++ b/src/ui_widgets/options_dialog.gd
@@ -11,7 +11,7 @@ extends PanelContainer
@onready var checkbox: CheckBox = $MainContainer/TextContainer/CheckBox
func setup(title: String, message: String, list := PackedStringArray(),
-checkbox_text := "", ) -> void:
+checkbox_text := "") -> void:
label.text = message
title_label.text = title
if not list.is_empty():
diff --git a/src/ui_widgets/options_dialog.tscn b/src/ui_widgets/options_dialog.tscn
index a815513..cc1f2fb 100644
--- a/src/ui_widgets/options_dialog.tscn
+++ b/src/ui_widgets/options_dialog.tscn
@@ -1,7 +1,6 @@
-[gd_scene load_steps=3 format=3 uid="uid://rsf6f7pytv7u"]
+[gd_scene load_steps=2 format=3 uid="uid://rsf6f7pytv7u"]
[ext_resource type="Script" uid="uid://vjqyfycqgf8h" path="res://src/ui_widgets/options_dialog.gd" id="1_shf74"]
-[ext_resource type="FontFile" uid="uid://dc0w4sx0h0fui" path="res://assets/fonts/FontBold.ttf" id="2_it3qh"]
[node name="OptionsDialog" type="PanelContainer"]
anchors_preset = 8
@@ -28,8 +27,7 @@ theme_override_constants/separation = 8
[node name="Title" type="Label" parent="MainContainer/TextContainer"]
layout_mode = 2
-theme_override_fonts/font = ExtResource("2_it3qh")
-theme_override_font_sizes/font_size = 16
+theme_type_variation = &"BoldTitleLabel"
horizontal_alignment = 1
[node name="Label" type="RichTextLabel" parent="MainContainer/TextContainer"]
diff --git a/src/ui_widgets/palette_config.gd b/src/ui_widgets/palette_config.gd
index 2e3998f..2b12c8e 100644
--- a/src/ui_widgets/palette_config.gd
+++ b/src/ui_widgets/palette_config.gd
@@ -16,7 +16,8 @@ var currently_edited_idx := -1
@onready var colors_container: HFlowContainer = $MainContainer/ColorsContainer
@onready var warning_sign: TextureRect = $WarningSign/TextureRect
-func setup_theme() -> void:
+func update_theme() -> void:
+ warning_sign.modulate = ThemeUtils.warning_icon_color
palette_button.begin_bulk_theme_override()
const CONST_ARR: PackedStringArray = ["normal", "hover", "pressed"]
for theme_type in CONST_ARR:
@@ -45,8 +46,8 @@ func _ready() -> void:
name_edit.text_changed.connect(_on_name_edit_text_changed)
name_edit.text_submitted.connect(_on_name_edit_text_submitted)
mouse_exited.connect(clear_proposed_drop)
- Configs.theme_changed.connect(setup_theme)
- setup_theme()
+ Configs.theme_changed.connect(update_theme)
+ update_theme()
# Rebuilds the content of the colors container.
func rebuild_colors() -> void:
@@ -162,7 +163,7 @@ func set_label_text(new_text: String) -> void:
if palette.title.is_empty():
for theme_type in CONST_ARR:
palette_button.add_theme_color_override(theme_type,
- ThemeUtils.common_subtle_text_color)
+ ThemeUtils.subtle_text_color)
else:
if not Configs.savedata.is_palette_valid(palette):
for theme_type in CONST_ARR:
diff --git a/src/ui_widgets/path_command_button.gd b/src/ui_widgets/path_command_button.gd
index 8787b5f..0655097 100644
--- a/src/ui_widgets/path_command_button.gd
+++ b/src/ui_widgets/path_command_button.gd
@@ -25,9 +25,9 @@ func set_warning(new_state := true) -> void:
# Couldn't think of any way to get RichTextLabel to autoresize its font on one line.
func _draw() -> void:
var text_obj := TextLine.new()
- var text_color := Color(1, 1, 1)
+ var text_color := ThemeUtils.highlighted_text_color
if disabled:
- text_color = Color(0.5, 0.5, 0.5)
+ text_color = ThemeUtils.dimmer_text_color
elif warned:
text_color = Configs.savedata.basic_color_warning
diff --git a/src/ui_widgets/path_command_button.tscn b/src/ui_widgets/path_command_button.tscn
index b5042f7..9e47849 100644
--- a/src/ui_widgets/path_command_button.tscn
+++ b/src/ui_widgets/path_command_button.tscn
@@ -10,5 +10,5 @@ grow_horizontal = 2
size_flags_horizontal = 3
size_flags_vertical = 3
mouse_default_cursor_shape = 2
-theme_type_variation = &"FlatButton"
+theme_type_variation = &"ContextButton"
script = ExtResource("1_q6blt")
diff --git a/src/ui_widgets/path_popup.gd b/src/ui_widgets/path_popup.gd
index b5fc466..0b5847e 100644
--- a/src/ui_widgets/path_popup.gd
+++ b/src/ui_widgets/path_popup.gd
@@ -43,4 +43,5 @@ func force_relativity(relative: bool) -> void:
else:
command_button.command_char = command_button.command_char.to_upper()
command_button.queue_redraw()
+ await get_tree().process_frame
reset_size()
diff --git a/src/ui_widgets/path_popup.tscn b/src/ui_widgets/path_popup.tscn
index 2feb9fa..41d161c 100644
--- a/src/ui_widgets/path_popup.tscn
+++ b/src/ui_widgets/path_popup.tscn
@@ -18,11 +18,7 @@ layout_mode = 2
theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 4
-[node name="MainContainer" type="VBoxContainer" parent="VBoxContainer/MarginContainer"]
-layout_mode = 2
-theme_override_constants/separation = 2
-
-[node name="RelativeToggle" type="CheckButton" parent="VBoxContainer/MarginContainer/MainContainer"]
+[node name="RelativeToggle" type="CheckButton" parent="VBoxContainer/MarginContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 8
diff --git a/src/ui_widgets/pathdata_field.gd b/src/ui_widgets/pathdata_field.gd
index 8d00885..fdce2b5 100644
--- a/src/ui_widgets/pathdata_field.gd
+++ b/src/ui_widgets/pathdata_field.gd
@@ -11,13 +11,6 @@ const attribute_name = "d" # Never propagates.
const STRIP_HEIGHT = 22.0
-@export var absolute_button_normal: StyleBoxFlat
-@export var absolute_button_hovered: StyleBoxFlat
-@export var absolute_button_pressed: StyleBoxFlat
-@export var relative_button_normal: StyleBoxFlat
-@export var relative_button_hovered: StyleBoxFlat
-@export var relative_button_pressed: StyleBoxFlat
-
signal focused
const MiniNumberFieldScene = preload("mini_number_field.tscn")
@@ -59,6 +52,9 @@ func set_value(new_value: String, save := false) -> void:
func setup() -> void:
Configs.language_changed.connect(update_translation)
+ update_translation()
+ Configs.theme_changed.connect(update_theme)
+ update_theme()
sync()
element.attribute_changed.connect(_on_element_attribute_changed)
line_edit.tooltip_text = attribute_name
@@ -77,7 +73,6 @@ func setup() -> void:
# This is because the widget can sometimes be created before they are cleared
# from a past state of the SVG. So we trigger this method to update those.
_on_selections_or_hover_changed()
- update_translation()
func get_inner_rect(index: int) -> Rect2:
@@ -92,6 +87,12 @@ func _on_element_attribute_changed(attribute_changed: String) -> void:
func update_translation() -> void:
line_edit.placeholder_text = Translator.translate("No path data")
+func update_theme() -> void:
+ mini_line_edit_stylebox = get_theme_stylebox("normal", "MiniLineEdit")
+ mini_line_edit_font_size = get_theme_font_size("font_size", "MiniLineEdit")
+ mini_line_edit_font_color = get_theme_color("font_color", "MiniLineEdit")
+ queue_redraw()
+
func _on_line_edit_focus_entered() -> void:
focused.emit()
@@ -237,11 +238,10 @@ func _commands_draw() -> void:
if selected or hovered:
var stylebox := StyleBoxFlat.new()
stylebox.set_corner_radius_all(3)
- if selected:
- stylebox.bg_color = Color(0.7, 0.7, 1.0, 0.18) if hovered else\
- Color(0.6, 0.6, 1.0, 0.16)
- else:
- stylebox.bg_color = Color(0.8, 0.8, 1.0, 0.05)
+ stylebox.bg_color = ThemeUtils.soft_pressed_overlay_color if selected else\
+ Color.TRANSPARENT
+ if hovered:
+ stylebox.bg_color = stylebox.bg_color.blend(Color(ThemeUtils.soft_hover_overlay_color))
stylebox.draw(ci, Rect2(Vector2(0, v_offset), Vector2(commands_container.size.x,
STRIP_HEIGHT)))
# Draw the child controls. They are going to be drawn, not added as a node unless
@@ -253,14 +253,14 @@ func _commands_draw() -> void:
var cmd_char := cmd.command_char
# Draw the action button.
more_icon.draw_rect(ci, Rect2(Vector2(commands_container.size.x - 19, 4 + v_offset),
- Vector2(14, 14)), false, ThemeUtils.icon_normal_color)
+ Vector2(14, 14)), false, ThemeUtils.context_icon_normal_color)
# Draw the relative/absolute button.
- var relative_stylebox := absolute_button_normal if\
- Utils.is_string_upper(cmd_char) else relative_button_normal
+ var relative_stylebox := get_theme_stylebox("normal", "PathCommandAbsoluteButton") if\
+ Utils.is_string_upper(cmd_char) else get_theme_stylebox("normal", "PathCommandRelativeButton")
relative_stylebox.draw(ci, Rect2(Vector2(3, 2 + v_offset),
Vector2(18, STRIP_HEIGHT - 4)))
ThemeUtils.mono_font.draw_string(ci, Vector2(6, v_offset + STRIP_HEIGHT - 6),
- cmd_char, HORIZONTAL_ALIGNMENT_CENTER, 12, 13)
+ cmd_char, HORIZONTAL_ALIGNMENT_CENTER, 12, 13, ThemeUtils.text_color)
# Draw the fields.
var rect := Rect2(Vector2(25, 2 + v_offset), Vector2(44, 18))
match cmd_char.to_upper():
@@ -379,24 +379,11 @@ func setup_path_command_controls(idx: int) -> Control:
relative_button.focus_mode = Control.FOCUS_NONE
relative_button.mouse_filter = Control.MOUSE_FILTER_PASS
relative_button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- relative_button.begin_bulk_theme_override()
relative_button.add_theme_font_override("font", ThemeUtils.mono_font)
- relative_button.add_theme_color_override("font_color", Color(1, 1, 1))
- # Disabled styleboxes are unused, but must be set for the correct content margins.
- if is_absolute:
- relative_button.add_theme_stylebox_override("disabled", absolute_button_normal)
- relative_button.add_theme_stylebox_override("normal", absolute_button_normal)
- relative_button.add_theme_stylebox_override("hover", absolute_button_hovered)
- relative_button.add_theme_stylebox_override("pressed", absolute_button_pressed)
- else:
- relative_button.add_theme_stylebox_override("disabled", relative_button_normal)
- relative_button.add_theme_stylebox_override("normal", relative_button_normal)
- relative_button.add_theme_stylebox_override("hover", relative_button_hovered)
- relative_button.add_theme_stylebox_override("pressed", relative_button_pressed)
- relative_button.end_bulk_theme_override()
+ relative_button.theme_type_variation = "PathCommandAbsoluteButton" if is_absolute else\
+ "PathCommandRelativeButton"
relative_button.text = cmd_char
- relative_button.tooltip_text =\
- TranslationUtils.get_path_command_description(cmd_char)
+ relative_button.tooltip_text = TranslationUtils.get_path_command_description(cmd_char)
container.add_child(relative_button)
relative_button.pressed.connect(_on_relative_button_pressed)
relative_button.gui_input.connect(_eat_double_clicks.bind(relative_button))
diff --git a/src/ui_widgets/pathdata_field.tscn b/src/ui_widgets/pathdata_field.tscn
index 47116f6..0482b7f 100644
--- a/src/ui_widgets/pathdata_field.tscn
+++ b/src/ui_widgets/pathdata_field.tscn
@@ -1,115 +1,13 @@
-[gd_scene load_steps=9 format=3 uid="uid://dqy5lv33sy5r7"]
+[gd_scene load_steps=3 format=3 uid="uid://dqy5lv33sy5r7"]
[ext_resource type="Script" uid="uid://p4nyhlbpwxe2" path="res://src/ui_widgets/pathdata_field.gd" id="1_22rk2"]
[ext_resource type="Script" uid="uid://1hox6gd5pxku" path="res://src/ui_widgets/BetterLineEdit.gd" id="2_48xgh"]
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2f3ln"]
-content_margin_left = 5.0
-content_margin_top = 0.0
-content_margin_right = 5.0
-content_margin_bottom = 0.0
-bg_color = Color(0.8, 0.48, 0.16, 1)
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color(0.9, 0.684, 0.36, 1)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_2rd4c"]
-content_margin_left = 5.0
-content_margin_top = 0.0
-content_margin_right = 5.0
-content_margin_bottom = 0.0
-bg_color = Color(0.85, 0.51, 0.17, 1)
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color(0.95, 0.798, 0.57, 1)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_thafs"]
-content_margin_left = 5.0
-content_margin_top = 0.0
-content_margin_right = 5.0
-content_margin_bottom = 0.0
-bg_color = Color(1, 0.75, 0.25, 1)
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color(1, 0.925, 0.7, 1)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g3fx0"]
-content_margin_left = 5.0
-content_margin_top = 0.0
-content_margin_right = 5.0
-content_margin_bottom = 0.0
-bg_color = Color(0.64, 0.16, 0.8, 1)
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color(0.7425, 0.45, 0.9, 1)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7fw87"]
-content_margin_left = 5.0
-content_margin_top = 0.0
-content_margin_right = 5.0
-content_margin_bottom = 0.0
-bg_color = Color(0.678431, 0.168627, 0.85098, 1)
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color(0.823333, 0.57, 0.95, 1)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l7drx"]
-content_margin_left = 5.0
-content_margin_top = 0.0
-content_margin_right = 5.0
-content_margin_bottom = 0.0
-bg_color = Color(0.75, 0.25, 1, 1)
-border_width_left = 2
-border_width_top = 2
-border_width_right = 2
-border_width_bottom = 2
-border_color = Color(0.875, 0.7, 1, 1)
-corner_radius_top_left = 4
-corner_radius_top_right = 4
-corner_radius_bottom_right = 4
-corner_radius_bottom_left = 4
-
[node name="PathdataField" type="VBoxContainer"]
offset_right = 250.0
offset_bottom = 45.0
theme_override_constants/separation = 2
script = ExtResource("1_22rk2")
-absolute_button_normal = SubResource("StyleBoxFlat_2f3ln")
-absolute_button_hovered = SubResource("StyleBoxFlat_2rd4c")
-absolute_button_pressed = SubResource("StyleBoxFlat_thafs")
-relative_button_normal = SubResource("StyleBoxFlat_g3fx0")
-relative_button_hovered = SubResource("StyleBoxFlat_7fw87")
-relative_button_pressed = SubResource("StyleBoxFlat_l7drx")
[node name="LineEdit" type="LineEdit" parent="."]
custom_minimum_size = Vector2(250, 0)
diff --git a/src/ui_widgets/points_field.gd b/src/ui_widgets/points_field.gd
index 9fb7081..a0f7519 100644
--- a/src/ui_widgets/points_field.gd
+++ b/src/ui_widgets/points_field.gd
@@ -51,6 +51,9 @@ func set_value(new_value: String, save := false) -> void:
func setup() -> void:
Configs.language_changed.connect(update_translation)
+ update_translation()
+ Configs.theme_changed.connect(update_theme)
+ update_theme()
sync()
element.attribute_changed.connect(_on_element_attribute_changed)
line_edit.tooltip_text = attribute_name
@@ -68,7 +71,6 @@ func setup() -> void:
# This is because the widget can sometimes be created before they are cleared
# from a past state of the SVG. So we trigger this method to update those.
_on_selections_or_hover_changed()
- update_translation()
func get_inner_rect(index: int) -> Rect2:
@@ -83,6 +85,12 @@ func _on_element_attribute_changed(attribute_changed: String) -> void:
func update_translation() -> void:
line_edit.placeholder_text = Translator.translate("No points")
+func update_theme() -> void:
+ mini_line_edit_stylebox = get_theme_stylebox("normal", "MiniLineEdit")
+ mini_line_edit_font_size = get_theme_font_size("font_size", "MiniLineEdit")
+ mini_line_edit_font_color = get_theme_color("font_color", "MiniLineEdit")
+ queue_redraw()
+
func _on_line_edit_focus_entered() -> void:
focused.emit()
@@ -231,11 +239,10 @@ func points_draw() -> void:
if selected or hovered:
var stylebox := StyleBoxFlat.new()
stylebox.set_corner_radius_all(3)
- if selected:
- stylebox.bg_color = Color(0.7, 0.7, 1.0, 0.18) if hovered else\
- Color(0.6, 0.6, 1.0, 0.16)
- else:
- stylebox.bg_color = Color(0.8, 0.8, 1.0, 0.05)
+ stylebox.bg_color = ThemeUtils.soft_pressed_overlay_color if selected else\
+ Color.TRANSPARENT
+ if hovered:
+ stylebox.bg_color = stylebox.bg_color.blend(Color(ThemeUtils.soft_hover_overlay_color))
stylebox.draw(ci, Rect2(Vector2(0, v_offset), Vector2(points_container.size.x,
STRIP_HEIGHT)))
# Draw the child controls. They are going to be drawn, not added as a node unless
@@ -247,7 +254,7 @@ func points_draw() -> void:
var point_y := element.get_attribute_list(attribute_name)[i * 2 + 1]
# Draw the action button.
more_icon.draw_rect(ci, Rect2(Vector2(points_container.size.x - 19, 4 + v_offset),
- Vector2(14, 14)), false, ThemeUtils.icon_normal_color)
+ Vector2(14, 14)), false, ThemeUtils.tinted_contrast_color)
# Draw the fields.
draw_numfield(Rect2(Vector2(4, 2 + v_offset), Vector2(44, 18)), point_x)
draw_numfield(Rect2(Vector2(52, 2 + v_offset), Vector2(44, 18)), point_y)
diff --git a/src/ui_widgets/profile_frame.gd b/src/ui_widgets/profile_frame.gd
index 16c82ce..259966b 100644
--- a/src/ui_widgets/profile_frame.gd
+++ b/src/ui_widgets/profile_frame.gd
@@ -1,14 +1,16 @@
# This is similar to SettingFrame, but specifically for dropdowns without a default value.
-extends Control
+extends MarginContainer
const Dropdown = preload("res://src/ui_widgets/dropdown.gd")
signal value_changed
+signal defaults_applied
const DropdownScene = preload("res://src/ui_widgets/dropdown.tscn")
var getter: Callable
var setter: Callable
+var disabled_check_callback: Callable
var text: String
var ci := get_canvas_item()
@@ -16,22 +18,36 @@ var dropdown: Dropdown
var is_hovered := false
+@onready var button: Button = $HBoxContainer/Button
+@onready var control: Control = $HBoxContainer/Control
+
func setup_dropdown(values: Array, value_text_map: Dictionary) -> void:
dropdown = DropdownScene.instantiate()
dropdown.values = values
dropdown.value_text_map = value_text_map
func _ready() -> void:
- add_child(dropdown)
+ button.text = Translator.translate("Apply")
+ button.tooltip_text = Translator.translate("Apply all of this preset's defaults")
+ control.add_child(dropdown)
dropdown.value_changed.connect(_dropdown_modification)
mouse_entered.connect(_on_mouse_entered)
mouse_exited.connect(_on_mouse_exited)
resized.connect(setup_size)
dropdown.set_value(getter.call())
- setup_size()
+ button_update_disabled()
+ button.pressed.connect(defaults_applied.emit)
+ control.resized.connect(setup_size.call_deferred)
+ setup_size.call_deferred()
+
+func button_update_disabled() -> void:
+ var should_disable: bool = disabled_check_callback.call()
+ button.disabled = should_disable
+ button.mouse_default_cursor_shape = Control.CURSOR_ARROW if should_disable else\
+ Control.CURSOR_POINTING_HAND
func setup_size() -> void:
- dropdown.position = Vector2(size.x - 102, 3)
+ dropdown.position = Vector2(control.size.x - 102, 2)
dropdown.size = Vector2(98, 22)
queue_redraw()
@@ -53,5 +69,5 @@ func _on_mouse_exited() -> void:
func _draw() -> void:
if is_hovered:
get_theme_stylebox("hover", "FlatButton").draw(ci, Rect2(Vector2.ZERO, size))
- ThemeUtils.regular_font.draw_string(ci, Vector2(4, 18), text,
- HORIZONTAL_ALIGNMENT_LEFT, -1, 13, Color(1, 1, 1, 0.9))
+ ThemeUtils.regular_font.draw_string(ci, Vector2(4, 20), text,
+ HORIZONTAL_ALIGNMENT_LEFT, -1, 13, ThemeUtils.text_color)
diff --git a/src/ui_widgets/profile_frame.tscn b/src/ui_widgets/profile_frame.tscn
index 0c2e84c..48fc25a 100644
--- a/src/ui_widgets/profile_frame.tscn
+++ b/src/ui_widgets/profile_frame.tscn
@@ -2,11 +2,29 @@
[ext_resource type="Script" uid="uid://dfp0yap8evr57" path="res://src/ui_widgets/profile_frame.gd" id="1_urnhl"]
-[node name="ProfileFrame" type="Control"]
+[node name="ProfileFrame" type="MarginContainer"]
custom_minimum_size = Vector2(0, 28)
-layout_mode = 3
anchors_preset = 10
anchor_right = 1.0
+offset_bottom = 28.0
grow_horizontal = 2
-mouse_filter = 1
+theme_override_constants/margin_top = 2
+theme_override_constants/margin_right = 2
+theme_override_constants/margin_bottom = 2
script = ExtResource("1_urnhl")
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="Control" type="Control" parent="HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_stretch_ratio = 3.0
+mouse_filter = 2
+
+[node name="Button" type="Button" parent="HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+focus_mode = 0
+mouse_filter = 1
+theme_type_variation = &"TranslucentButton"
diff --git a/src/ui_widgets/setting_frame.gd b/src/ui_widgets/setting_frame.gd
index e65146e..1e52e8d 100644
--- a/src/ui_widgets/setting_frame.gd
+++ b/src/ui_widgets/setting_frame.gd
@@ -8,6 +8,7 @@ signal value_changed
const ColorEditScene = preload("res://src/ui_widgets/color_edit.tscn")
const DropdownScene = preload("res://src/ui_widgets/dropdown.tscn")
const NumberDropdownScene = preload("res://src/ui_widgets/number_dropdown.tscn")
+const FpsLimitDropdownScene = preload("res://src/ui_widgets/fps_limit_dropdown.tscn")
var getter: Callable
var setter: Callable
@@ -80,6 +81,13 @@ min_value: float, max_value: float) -> void:
type = Type.NUMBER_DROPDOWN
panel_width = 100
+func setup_fps_limit_dropdown() -> void:
+ widget = FpsLimitDropdownScene.instantiate()
+ add_child(widget)
+ widget.value_changed.connect(_fps_limit_dropdown_modification)
+ type = Type.NUMBER_DROPDOWN
+ panel_width = 100
+
func _ready() -> void:
widget.size = Vector2(panel_width - 32, 22)
mouse_entered.connect(_on_mouse_entered)
@@ -125,6 +133,22 @@ func _number_dropdown_modification(value: String) -> void:
setter.call(actual_number)
post_modification()
+# TODO This was written very hastily, probably has a lot of redundancy.
+func _fps_limit_dropdown_modification(value: String) -> void:
+ var actual_number: int
+ if value == Translator.translate("Unlimited"):
+ actual_number = 0
+ else:
+ actual_number = roundi(NumstringParser.evaluate(value))
+
+ if is_nan(actual_number) or actual_number == INF:
+ actual_number = 0
+ elif actual_number != 0:
+ actual_number = clampi(actual_number, widget.min_value, widget.max_value)
+ setter.call(actual_number)
+ post_modification()
+
+
func post_modification() -> void:
update_widgets()
value_changed.emit()
@@ -163,13 +187,17 @@ func _on_mouse_exited() -> void:
func _draw() -> void:
if is_hovered:
- get_theme_stylebox("hover", "FlatButton").draw(ci, Rect2(Vector2.ZERO, size))
+ var sb := StyleBoxFlat.new()
+ sb.set_corner_radius_all(3)
+ sb.set_content_margin_all(2)
+ sb.bg_color = ThemeUtils.soft_hover_overlay_color
+ sb.draw(ci, Rect2(Vector2.ZERO, size))
- var color := ThemeUtils.common_text_color
+ var color := ThemeUtils.text_color
if disabled:
- color = ThemeUtils.common_subtle_text_color
+ color = ThemeUtils.subtle_text_color
elif dim_text:
- color = ThemeUtils.common_dimmer_text_color
+ color = ThemeUtils.dimmer_text_color
var non_panel_width := size.x - panel_width
var text_obj := TextLine.new()
@@ -177,5 +205,5 @@ func _draw() -> void:
text_obj.width = non_panel_width - 16
text_obj.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS
text_obj.draw(ci, Vector2(4, 5), color)
- get_theme_stylebox("panel", "DarkPanel").draw(ci, Rect2(non_panel_width - 2, 2,
+ get_theme_stylebox("panel", "SubtleFlatPanel").draw(ci, Rect2(non_panel_width - 2, 2,
panel_width, size.y - 4))
diff --git a/src/ui_widgets/setting_shortcut.gd b/src/ui_widgets/setting_shortcut.gd
index fc9d89f..8ed4b20 100644
--- a/src/ui_widgets/setting_shortcut.gd
+++ b/src/ui_widgets/setting_shortcut.gd
@@ -72,9 +72,9 @@ func sync() -> void:
new_btn.pressed.connect(enter_listening_mode.bind(i, true))
else:
new_btn.begin_bulk_theme_override()
- new_btn.add_theme_color_override("font_color", Color("def6"))
- new_btn.add_theme_color_override("font_hover_color", Color("def6"))
- new_btn.add_theme_color_override("font_pressed_color", Color("def8"))
+ new_btn.add_theme_color_override("font_color", Color(ThemeUtils.editable_text_color, 0.4))
+ new_btn.add_theme_color_override("font_hover_color", Color(ThemeUtils.editable_text_color, 0.4))
+ new_btn.add_theme_color_override("font_pressed_color", Color(ThemeUtils.editable_text_color, 0.6))
new_btn.end_bulk_theme_override()
set_shortcut_button_text(new_btn, Translator.translate("Unused"))
if i == events.size():
@@ -89,7 +89,7 @@ func sync() -> void:
func enter_listening_mode(idx: int, show_delete_button := false) -> void:
listening_idx = idx
var btn := shortcut_buttons[idx]
- setup_shortcut_button_font_colors(btn, Color("def"))
+ setup_shortcut_button_font_colors(btn, ThemeUtils.editable_text_color)
btn.focus_mode = Control.FOCUS_CLICK
btn.grab_focus()
if btn.pressed.is_connected(enter_listening_mode):
@@ -163,7 +163,7 @@ func _input(event: InputEvent) -> void:
if event.is_action("ui_cancel"):
cancel_listening()
pending_event = null
- setup_shortcut_button_font_colors(shortcut_button, Color("def"))
+ setup_shortcut_button_font_colors(shortcut_button, ThemeUtils.editable_text_color)
accept_event()
elif event.is_pressed():
set_shortcut_button_text(shortcut_button, event.as_text_keycode())
@@ -172,7 +172,7 @@ func _input(event: InputEvent) -> void:
setup_shortcut_button_font_colors(shortcut_button,
Configs.savedata.basic_color_warning)
else:
- setup_shortcut_button_font_colors(shortcut_button, Color("def"))
+ setup_shortcut_button_font_colors(shortcut_button, ThemeUtils.editable_text_color)
accept_event()
elif event.is_released():
if pending_event.keycode & KEY_MODIFIER_MASK == 0:
@@ -193,7 +193,7 @@ func _input(event: InputEvent) -> void:
update_shortcut()
sync()
pending_event = null
- setup_shortcut_button_font_colors(shortcut_button, Color("def"))
+ setup_shortcut_button_font_colors(shortcut_button, ThemeUtils.editable_text_color)
listening_idx = -1
func _on_reset_button_pressed() -> void:
diff --git a/src/utils/AttributeFieldBuilder.gd b/src/utils/AttributeFieldBuilder.gd
index dbed640..6c0d78c 100644
--- a/src/utils/AttributeFieldBuilder.gd
+++ b/src/utils/AttributeFieldBuilder.gd
@@ -1,4 +1,4 @@
-class_name AttributeFieldBuilder
+@abstract class_name AttributeFieldBuilder
const TransformFieldScene = preload("res://src/ui_widgets/transform_field.tscn")
const NumberFieldScene = preload("res://src/ui_widgets/number_field.tscn")
diff --git a/src/utils/ClipboardUtils.gd b/src/utils/ClipboardUtils.gd
new file mode 100644
index 0000000..99fa8ac
--- /dev/null
+++ b/src/utils/ClipboardUtils.gd
@@ -0,0 +1,151 @@
+# This class adds support for copying images. Currently not supported by Godot.
+@abstract class_name ClipboardUtils
+
+## Returns true if this clipboard util is supported on the current platform.
+static func is_supported(format: String) -> bool:
+ if OS.get_name() == "Web" and format not in ["png", "svg"]:
+ return false # Copying most image formats is not currently supported on web.
+ return OS.get_name() in ["Windows", "Linux", "Web"] or "BSD" in OS.get_name()
+
+## Returns an object containing the error information, as well as an "OK" type.
+static func copy_image(export_data: ImageExportData) -> ClipboardError:
+ if not is_supported(export_data.format):
+ return ClipboardError.new(ErrorType.UnsupportedPlatform, [])
+ if export_data.format == "svg":
+ DisplayServer.clipboard_set(State.get_export_text())
+ return ClipboardError.new(ErrorType.Ok, [])
+ var mime_type := ImageExportData.image_types_dict[export_data.format]
+ var cmd_output := []
+ match OS.get_name():
+ "Windows":
+ var temp_path := _save_temp_to_disk(export_data)
+ var ps_script := ""
+ if export_data.format == "webp":
+ ps_script = """
+ Add-Type -AssemblyName PresentationCore
+ $uri = [Uri]'file:///%s'
+ $img = [System.Windows.Media.Imaging.BitmapFrame]::Create($uri)
+ [System.Windows.Clipboard]::SetImage($img)
+ """ % temp_path.replace('\\', '/')
+ else: # PresentationCore does not appear to support transparency.
+ ps_script = """
+ Add-Type -AssemblyName System.Windows.Forms;
+ $bmp = New-Object Drawing.Bitmap('%s');
+ [Windows.Forms.Clipboard]::SetImage($bmp)
+ """ % temp_path.replace('\\', '/')
+ var e := OS.execute("powershell.exe", ["-Command", ps_script], cmd_output, true)
+ _clean_temp(temp_path)
+ return ClipboardError.new(ErrorType.FailedExecuting if e < 0 else ErrorType.Ok, cmd_output)
+ "Linux", "FreeBSD", "NetBSD", "OpenBSD", "BSD":
+ # Finding out the display manager type.
+ var display_manager_arr := []
+ OS.execute("echo", ["$XDG_SESSION_TYPE"], display_manager_arr)
+ var using_x11 := "x11" in "".join(display_manager_arr)
+
+ # System clipboard utils.
+ const x11_utils := ["xclip"]
+ const wayland_utils := ["xclip", "wl-copy"]
+ var usable_utils := (x11_utils if using_x11 else wayland_utils)
+
+ # Trying every available clipboard util
+ var cmd := []
+ var exit_code := -99
+ var temp_path := _save_temp_to_disk(export_data)
+ for util in usable_utils:
+ if OS.execute("which", [util]) == 0:
+ match util:
+ "xclip":
+ cmd = ["xclip", "-selection", "clipboard", "-l", "1", "-quiet", "-t", mime_type, "-i", temp_path]
+ exit_code = OS.execute(cmd[0], cmd.slice(1, len(cmd)-1), cmd_output, true)
+ "wl-copy":
+ cmd = ["wl-copy -f -t %s < '%s'" % [mime_type, temp_path]]
+ var dict := OS.execute_with_pipe("bash", ["-c", "".join(cmd)], false)
+ if dict.is_empty():
+ return ClipboardError.new(ErrorType.FailedExecuting, cmd_output, " ".join(cmd))
+ var stdio: FileAccess = dict.stdio
+ cmd_output.append(stdio.get_pascal_string())
+ stdio.close()
+ var secs_waited := 0
+ while OS.is_process_running(dict.pid):
+ OS.delay_msec(1000)
+ secs_waited += 1
+ if secs_waited > 2:
+ OS.kill(dict.pid)
+ push_error("Timed out waiting for wl-copy")
+ exit_code = OS.get_process_exit_code(dict.pid)
+ if exit_code == 0:
+ _clean_temp(temp_path)
+ return ClipboardError.new(ErrorType.Ok, cmd_output)
+ _clean_temp(temp_path)
+ if exit_code == -99:
+ return ClipboardError.new(ErrorType.NoClipboardUtil, cmd_output, ", ".join(usable_utils))
+ else:
+ return ClipboardError.new(ErrorType.FailedExecuting, cmd_output, " ".join(cmd))
+ "macOS":
+ #_save_temp_to_disk(export_data)
+ #var picture_type := export_data.format.to_upper()
+ #var e := OS.execute("osascript", ["-e", "set the clipboard to (read (POSIX file \"%s\") as %s picture)" % [_get_temp_path(export_data), picture_type]], cmd_output, true)
+ #_clean_temp(export_data)
+ #return ClipboardError.new(ErrorType.FailedExecuting if e == -1 else ErrorType.Ok, cmd_output, "osascript")
+ return ClipboardError.new(ErrorType.UnsupportedPlatform, cmd_output)
+ "Android":
+ # TODO: Implement "copy to clipboard" util for Android.
+ return ClipboardError.new(ErrorType.UnsupportedPlatform, cmd_output)
+ "Web":
+ JavaScriptBridge.eval("""
+ window.copyImageToClipboard = (data, mimeType) => {
+ const blob = new Blob([data], { "type": mimeType });
+ console.log(mimeType);
+ navigator.clipboard.write([new ClipboardItem({ [mimeType]: blob })]);
+ }
+ """)
+
+ var image_buf := export_data.image_to_buffer(export_data.generate_image())
+ var buf = JavaScriptBridge.create_object("ArrayBuffer", image_buf.size())
+ var data = JavaScriptBridge.create_object("Uint8Array", buf)
+ for i in len(image_buf):
+ data[i] = image_buf[i]
+ JavaScriptBridge.get_interface("window").window.copyImageToClipboard(data, mime_type)
+ return ClipboardError.new(ErrorType.Ok, cmd_output)
+ _:
+ return ClipboardError.new(ErrorType.UnsupportedPlatform, cmd_output)
+
+static func _save_temp_to_disk(export_data: ImageExportData) -> String:
+ var image_buf := export_data.image_to_buffer(export_data.generate_image())
+ var file := FileAccess.create_temp(FileAccess.ModeFlags.WRITE, "export", export_data.format, true)
+ file.store_buffer(image_buf)
+ file.close()
+ return file.get_path_absolute()
+
+static func _clean_temp(temp_path: String) -> void:
+ DirAccess.remove_absolute(temp_path)
+
+enum ErrorType {
+ Ok,
+ Unknown,
+ UnsupportedPlatform,
+ FailedExecuting,
+ NoClipboardUtil
+}
+
+class ClipboardError:
+ var type: ErrorType
+ var extra: String
+ var command_output: PackedStringArray
+ var message: String
+ func _init(_type: ErrorType, _cmd_out: PackedStringArray, _extra: String = "") -> void:
+ type = _type
+ extra = _extra
+ command_output = _cmd_out
+ match type:
+ ErrorType.FailedExecuting:
+ var cmd_out := '\n'.join(_cmd_out).strip_edges().replace("\n\n", '\n')
+ message = "Failed executing \"%s\"\n\n%s" % [extra, cmd_out]
+ if "xclip" in extra and "no authorization protocol" in cmd_out:
+ message += "\n\nConsider installing 'wl-clipboard' if you're using Wayland."
+ ErrorType.NoClipboardUtil:
+ message = "Failed to find a clipboard util.\nMake sure you've installed one of the following:\n%s" % extra
+ ErrorType.UnsupportedPlatform:
+ message = "Unsupported platform"
+ _:
+ message = "Unknown error"
diff --git a/src/utils/ClipboardUtils.gd.uid b/src/utils/ClipboardUtils.gd.uid
new file mode 100644
index 0000000..8c87000
--- /dev/null
+++ b/src/utils/ClipboardUtils.gd.uid
@@ -0,0 +1 @@
+uid://de0iyf4t86si6
diff --git a/src/utils/FileUtils.gd b/src/utils/FileUtils.gd
index 9047ab8..27f4017 100644
--- a/src/utils/FileUtils.gd
+++ b/src/utils/FileUtils.gd
@@ -1,5 +1,5 @@
# This class has functionality for importing, exporting, and saving files.
-class_name FileUtils extends RefCounted
+@abstract class_name FileUtils
enum FileState {SAME, DIFFERENT, DOES_NOT_EXIST}
enum TabCloseMode {SINGLE, ALL_OTHERS, TO_LEFT, TO_RIGHT, EMPTY, SAVED}
diff --git a/src/utils/ImageExportData.gd b/src/utils/ImageExportData.gd
index dc24b64..1a8cf33 100644
--- a/src/utils/ImageExportData.gd
+++ b/src/utils/ImageExportData.gd
@@ -1,4 +1,4 @@
-class_name ImageExportData extends RefCounted
+class_name ImageExportData
const image_types_dict: Dictionary[String, String] = {
"svg": "image/svg+xml",
diff --git a/src/utils/ShortcutUtils.gd b/src/utils/ShortcutUtils.gd
index 4c3b654..490ae28 100644
--- a/src/utils/ShortcutUtils.gd
+++ b/src/utils/ShortcutUtils.gd
@@ -1,4 +1,4 @@
-class_name ShortcutUtils extends RefCounted
+@abstract class_name ShortcutUtils
# Can be activated in all contexts.
const UNIVERSAL_ACTIONS: PackedStringArray = ["quit", "toggle_fullscreen", "about_info",
diff --git a/src/utils/ThemeUtils.gd b/src/utils/ThemeUtils.gd
index 8b8406f..683b8ea 100644
--- a/src/utils/ThemeUtils.gd
+++ b/src/utils/ThemeUtils.gd
@@ -1,80 +1,206 @@
-class_name ThemeUtils extends RefCounted
+@abstract class_name ThemeUtils
const regular_font = preload("res://assets/fonts/Font.ttf")
const bold_font = preload("res://assets/fonts/FontBold.ttf")
const mono_font = preload("res://assets/fonts/FontMono.ttf")
-const focus_color = Color("66ccffcc")
-const common_panel_inner_color = Color("191926")
-const common_panel_border_color = Color("414159")
-const common_caret_color = Color("ddeeffdd")
-const common_selection_color = Color("668cff66")
-const common_disabled_selection_color = Color("aaaaaa66")
-const common_inner_color_disabled = Color("0e0e12")
-const common_border_color_disabled = Color("1e1f24")
-
-const common_text_color = Color("ffffffdd")
-const common_highlighted_text_color = Color("ffffff")
-const common_dim_text_color = Color("ffffffbb")
-const common_dimmer_text_color = Color("ffffff77")
-const common_subtle_text_color = Color("ffffff55")
-const common_editable_text_color = Color("ddeeff")
-
-const common_button_inner_color_normal = Color("1c1e38")
-const common_button_border_color_normal = Color("313859")
-const common_button_inner_color_hover = Color("232840")
-const common_button_border_color_hover = Color("43567a")
-const common_button_inner_color_pressed = Color("3d5499")
-const common_button_border_color_pressed = Color("608fbf")
-
-const connected_button_inner_color_normal = Color("10101a")
-const connected_button_border_color_normal = Color("272733")
-const connected_button_inner_color_hover = Color("181826")
-const connected_button_border_color_hover = Color("3a3a4d")
-const connected_button_inner_color_pressed = Color("313559")
-const connected_button_border_color_pressed = Color("54678c")
-
-const icon_normal_color = Color("bfbfbf")
-const context_icon_normal_color = Color("d9d9d9")
-const icon_hover_color = Color("ffffff")
-const icon_pressed_color = Color("bfdfff")
-const icon_toggled_off_color = Color("808080")
-const icon_toggled_on_color = Color("ddeeffdd")
-
-const translucent_button_color_normal = Color("ddeeff11")
-const translucent_button_color_hover = Color("ddeeff22")
-const translucent_button_color_pressed = Color("ddeeff44")
-const translucent_button_color_disabled = Color("05060755")
-const flat_button_color_hover = Color("ddeeff11")
-const flat_button_color_pressed = Color("ddeeff33")
-const flat_button_color_hovered_pressed = Color("ddeeff41") # hover.blend(pressed)
-const flat_button_color_disabled = Color("05060744")
-
-const dark_panel_color = Color("11111a")
-const light_panel_color = Color("ddeeff0c")
-const overlay_panel_inner_color = Color("060614")
-const overlay_panel_border_color = Color("344166")
-
-const scrollbar_normal_color = Color("344166")
-const scrollbar_hover_color = Color("465580")
-const scrollbar_pressed_color = Color("608fbf")
-const scrollbar_background_color = Color("0f0f1a99")
-
-const line_edit_focus_color = Color("3d6b99")
-const line_edit_background_color = Color("10101a")
-const line_edit_normal_border_color = Color("272733")
-const line_edit_hover_border_overlay_color = Color("ddeeff1b")
-const mini_line_edit_normal_border_color = Color("4d4e66")
-
-const tab_container_panel_inner_color = Color("171726")
-const tab_container_panel_border_color = Color("2a2e4d")
-const tabbar_background_color = Color("13131f80")
-const hovered_tab_color = Color("1f2138")
-const normal_tab_color = Color("17192e")
-const selected_tab_color = Color("293052")
-const selected_tab_border_color = Color("608fbf")
+static var base_color: Color
+static var accent_color: Color
+static var is_theme_dark: bool
+
+static var max_contrast_color: Color # White on dark theme, black on light theme.
+static var extreme_theme_color: Color # Black on dark theme, white on light theme.
+static var tinted_contrast_color: Color # Base color used to derive icon colors and other UI elements.
+static var gray_color: Color # Light gray on dark theme, darker gray on light theme.
+static var black_or_white_counter_accent_color: Color
+
+static var warning_icon_color: Color
+static var info_icon_color: Color
+
+static var intermediate_color: Color # Color of button borders, derived from the accent color.
+static var soft_intermediate_color: Color # Color of button insides.
+static var softer_intermediate_color: Color # Color of tabs.
+static var intermediate_hover_color: Color
+static var soft_intermediate_hover_color: Color
+static var softer_intermediate_hover_color: Color
+
+static var desaturated_color: Color # Color of line edits and others.
+static var disabled_color: Color
+
+static var soft_base_color: Color
+static var softer_base_color: Color
+static var soft_accent_color: Color
+
+static var hover_overlay_color: Color
+static var pressed_overlay_color: Color
+static var hover_pressed_overlay_color: Color
+
+static var soft_hover_overlay_color: Color
+static var soft_pressed_overlay_color: Color
+static var soft_hover_pressed_overlay_color: Color
+
+static var strong_hover_overlay_color: Color
+static var stronger_hover_overlay_color: Color
+
+static var basic_panel_inner_color: Color
+static var basic_panel_border_color: Color
+static var subtle_panel_border_color: Color
+
+static var caret_color: Color
+static var selection_color: Color
+static var disabled_selection_color: Color
+
+static var text_color: Color
+static var highlighted_text_color: Color
+static var dim_text_color: Color
+static var dimmer_text_color: Color
+static var subtle_text_color: Color
+static var editable_text_color: Color
+
+static var common_button_inner_color_pressed: Color
+static var common_button_border_color_pressed: Color
+static var common_button_inner_color_disabled: Color
+static var common_button_border_color_disabled: Color
+
+static var connected_button_inner_color_hover: Color
+static var connected_button_border_color_hover: Color
+static var connected_button_inner_color_pressed: Color
+static var connected_button_border_color_pressed: Color
+
+static var context_icon_normal_color: Color
+static var context_icon_hover_color: Color
+static var context_icon_pressed_color: Color
+
+static var translucent_button_color_disabled: Color
+static var flat_button_color_disabled: Color
+
+static var subtle_flat_panel_color: Color
+static var contrast_flat_panel_color: Color
+static var overlay_panel_inner_color: Color
+static var overlay_panel_subtler_inner_color: Color
+
+static var scrollbar_pressed_color: Color
+
+static var line_edit_focus_color: Color
+static var line_edit_inner_color: Color
+static var line_edit_normal_border_color: Color
+static var mini_line_edit_normal_border_color: Color
+static var line_edit_inner_color_disabled: Color
+static var line_edit_border_color_disabled: Color
+
+static var tab_container_panel_inner_color: Color
+static var tab_container_panel_border_color: Color
+static var selected_tab_color: Color
+static var selected_tab_border_color: Color
+
+static func color_difference(color1: Color, color2: Color) -> float:
+ return (absf(color1.r - color2.r) + absf(color1.g - color2.g) + absf(color1.b - color2.b)) / 3.0
+
+static func recalculate_colors() -> void:
+ base_color = Configs.savedata.base_color
+ accent_color = Configs.savedata.accent_color
+ is_theme_dark = (base_color.get_luminance() < 0.455)
+
+ max_contrast_color = Color("#fff") if is_theme_dark else Color("000")
+ extreme_theme_color = Color("#000") if is_theme_dark else Color("fff")
+ tinted_contrast_color = Color("#def") if is_theme_dark else Color("061728")
+ gray_color = Color("808080") if is_theme_dark else Color("666")
+ black_or_white_counter_accent_color = Color("#000") if\
+ accent_color.get_luminance() > 0.69 else Color("fff")
+
+ warning_icon_color = Color("fca") if is_theme_dark else Color("96592c")
+ info_icon_color = Color("acf") if is_theme_dark else Color("3a6ab0")
+
+ intermediate_color = accent_color.lerp(extreme_theme_color, 0.6)
+ if is_theme_dark:
+ intermediate_color.s *= 0.8
+ else:
+ intermediate_color.s = lerpf(intermediate_color.s, 1.0, minf(0.2, intermediate_color.s))
+ intermediate_color.v **= 0.75
+
+ desaturated_color = intermediate_color.lerp(gray_color, 0.3).lerp(extreme_theme_color, 0.08)
+ if not is_theme_dark:
+ desaturated_color.v *= 0.9
+ disabled_color = intermediate_color.lerp(gray_color, 0.8)
+
+ soft_base_color = base_color.lerp(max_contrast_color, 0.015 if is_theme_dark else 0.03)
+ softer_base_color = base_color.lerp(max_contrast_color, 0.04 if is_theme_dark else 0.08)
+ soft_accent_color = accent_color.lerp(extreme_theme_color, 0.1)
+ var intense_accent_color = accent_color.lerp(max_contrast_color, 0.1)
+ hover_overlay_color = Color(tinted_contrast_color, 0.08)
+ pressed_overlay_color = Color(tinted_contrast_color.lerp(soft_accent_color, 0.6), 0.24)
+ hover_pressed_overlay_color = hover_overlay_color.blend(pressed_overlay_color)
+
+ soft_hover_overlay_color = Color(tinted_contrast_color, 0.06)
+ soft_pressed_overlay_color = Color(tinted_contrast_color.lerp(soft_accent_color, 0.4), 0.18)
+ soft_hover_pressed_overlay_color = soft_hover_overlay_color.blend(soft_pressed_overlay_color)
+
+ strong_hover_overlay_color = Color(tinted_contrast_color, 0.12)
+ stronger_hover_overlay_color = Color(tinted_contrast_color, 0.16)
+
+ intermediate_hover_color = intermediate_color.blend(
+ hover_overlay_color if is_theme_dark else stronger_hover_overlay_color)
+ soft_intermediate_color = intermediate_color.lerp(extreme_theme_color, 0.36)
+ soft_intermediate_hover_color = soft_intermediate_color.blend(
+ soft_hover_overlay_color if is_theme_dark else hover_overlay_color)
+ softer_intermediate_color = intermediate_color.lerp(extreme_theme_color, 0.44)
+ if not is_theme_dark:
+ softer_intermediate_color.s *= 0.8
+ softer_intermediate_hover_color = softer_intermediate_color.blend(
+ soft_hover_overlay_color if is_theme_dark else hover_overlay_color)
+
+ text_color = Color(max_contrast_color, 0.875)
+ highlighted_text_color = Color(max_contrast_color)
+ dim_text_color = Color(max_contrast_color, 0.75)
+ dimmer_text_color = Color(max_contrast_color, 0.5)
+ subtle_text_color = Color(max_contrast_color, 0.375)
+ editable_text_color = tinted_contrast_color
+
+ basic_panel_inner_color = base_color.lerp(max_contrast_color, 0.05)
+ basic_panel_border_color = desaturated_color
+ subtle_panel_border_color = basic_panel_border_color.lerp(basic_panel_inner_color, 0.64)
+ caret_color = Color(tinted_contrast_color, 0.875)
+ selection_color = Color(accent_color, 0.375)
+ disabled_selection_color = Color(gray_color, 0.4)
+
+ common_button_inner_color_pressed = intermediate_color.lerp(accent_color, 0.64).lerp(extreme_theme_color, 0.4)
+ common_button_border_color_pressed = intermediate_color.lerp(accent_color, 0.8)
+ common_button_inner_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.72)
+ common_button_border_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.56)
+
+ context_icon_normal_color = tinted_contrast_color.lerp(extreme_theme_color, 0.2)
+ context_icon_hover_color = tinted_contrast_color
+ context_icon_pressed_color = max_contrast_color
+
+ translucent_button_color_disabled = Color(disabled_color, 0.2)
+ flat_button_color_disabled = Color(disabled_color, 0.15)
+
+ subtle_flat_panel_color = base_color
+ contrast_flat_panel_color = Color(tinted_contrast_color, 0.1)
+ overlay_panel_inner_color = base_color.lerp(extreme_theme_color, 0.1)
+ overlay_panel_subtler_inner_color = base_color.lerp(extreme_theme_color, 0.075)
+
+ scrollbar_pressed_color = intermediate_color.blend(Color(tinted_contrast_color.lerp(intense_accent_color, 0.2), 0.4))
+
+ line_edit_focus_color = Color(accent_color, 0.4)
+ line_edit_inner_color = desaturated_color.lerp(extreme_theme_color, 0.74)
+ line_edit_normal_border_color = desaturated_color.lerp(extreme_theme_color, 0.42)
+ mini_line_edit_normal_border_color = desaturated_color.lerp(extreme_theme_color, 0.225)
+ line_edit_inner_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.88)
+ line_edit_border_color_disabled = desaturated_color.lerp(gray_color, 0.4).lerp(extreme_theme_color, 0.68)
+
+ connected_button_inner_color_hover = line_edit_inner_color.blend(hover_overlay_color)
+ connected_button_border_color_hover = line_edit_normal_border_color.blend(strong_hover_overlay_color)
+ connected_button_inner_color_pressed = line_edit_inner_color.lerp(common_button_inner_color_pressed, 0.8)
+ connected_button_border_color_pressed = line_edit_normal_border_color.lerp(common_button_border_color_pressed, 0.6)
+
+ tab_container_panel_inner_color = base_color.lerp(intermediate_color, 0.15).lerp(extreme_theme_color, 0.02)
+ tab_container_panel_border_color = desaturated_color.lerp(extreme_theme_color, 0.4)
+ selected_tab_color = softer_intermediate_hover_color.lerp(accent_color, 0.2)
+ selected_tab_border_color = accent_color
static func generate_theme() -> Theme:
+ recalculate_colors()
var theme := Theme.new()
theme.default_font = regular_font
theme.default_font_size = 13
@@ -90,6 +216,7 @@ static func generate_theme() -> Theme:
_setup_tabcontainer(theme)
_setup_textedit(theme)
_setup_tooltip(theme)
+ _setup_splitcontainer(theme)
return theme
static func generate_and_apply_theme() -> void:
@@ -107,8 +234,8 @@ static func _setup_panelcontainer(theme: Theme) -> void:
stylebox.set_border_width_all(2)
stylebox.content_margin_left = 2.0
stylebox.content_margin_right = 2.0
- stylebox.bg_color = common_panel_inner_color
- stylebox.border_color = common_panel_border_color
+ stylebox.bg_color = basic_panel_inner_color
+ stylebox.border_color = basic_panel_border_color
theme.set_stylebox("panel", "PanelContainer", stylebox)
theme.add_type("SpaciousPanel")
@@ -126,27 +253,27 @@ static func _setup_panelcontainer(theme: Theme) -> void:
theme.add_type("AcceptDialog")
theme.set_stylebox("panel", "AcceptDialog", spacious_stylebox)
- theme.add_type("DarkPanel")
- theme.set_type_variation("DarkPanel", "PanelContainer")
- var dark_stylebox := StyleBoxFlat.new()
- dark_stylebox.set_corner_radius_all(3)
- dark_stylebox.content_margin_left = 4.0
- dark_stylebox.content_margin_right = 4.0
- dark_stylebox.content_margin_top = 2.0
- dark_stylebox.content_margin_bottom = 2.0
- dark_stylebox.bg_color = dark_panel_color
- theme.set_stylebox("panel", "DarkPanel", dark_stylebox)
-
- theme.add_type("LightPanel")
- theme.set_type_variation("LightPanel", "PanelContainer")
- var light_stylebox := StyleBoxFlat.new()
- light_stylebox.set_corner_radius_all(5)
- light_stylebox.content_margin_left = 4.0
- light_stylebox.content_margin_right = 4.0
- light_stylebox.content_margin_top = 2.0
- light_stylebox.content_margin_bottom = 2.0
- light_stylebox.bg_color = light_panel_color
- theme.set_stylebox("panel", "LightPanel", light_stylebox)
+ theme.add_type("SubtleFlatPanel")
+ theme.set_type_variation("SubtleFlatPanel", "PanelContainer")
+ var subtle_panel_stylebox := StyleBoxFlat.new()
+ subtle_panel_stylebox.set_corner_radius_all(3)
+ subtle_panel_stylebox.content_margin_left = 4.0
+ subtle_panel_stylebox.content_margin_right = 4.0
+ subtle_panel_stylebox.content_margin_top = 2.0
+ subtle_panel_stylebox.content_margin_bottom = 2.0
+ subtle_panel_stylebox.bg_color = subtle_flat_panel_color
+ theme.set_stylebox("panel", "SubtleFlatPanel", subtle_panel_stylebox)
+
+ theme.add_type("ContrastFlatPanel")
+ theme.set_type_variation("ContrastFlatPanel", "PanelContainer")
+ var contrast_panel_stylebox := StyleBoxFlat.new()
+ contrast_panel_stylebox.set_corner_radius_all(5)
+ contrast_panel_stylebox.content_margin_left = 4.0
+ contrast_panel_stylebox.content_margin_right = 4.0
+ contrast_panel_stylebox.content_margin_top = 2.0
+ contrast_panel_stylebox.content_margin_bottom = 2.0
+ contrast_panel_stylebox.bg_color = contrast_flat_panel_color
+ theme.set_stylebox("panel", "ContrastFlatPanel", contrast_panel_stylebox)
theme.add_type("OverlayPanel")
theme.set_type_variation("OverlayPanel", "PanelContainer")
@@ -158,7 +285,7 @@ static func _setup_panelcontainer(theme: Theme) -> void:
overlay_stylebox.content_margin_top = 6.0
overlay_stylebox.content_margin_bottom = 10.0
overlay_stylebox.bg_color = overlay_panel_inner_color
- overlay_stylebox.border_color = overlay_panel_border_color
+ overlay_stylebox.border_color = intermediate_color
theme.set_stylebox("panel", "OverlayPanel", overlay_stylebox)
theme.add_type("TabItem")
@@ -189,14 +316,14 @@ static func _setup_panelcontainer(theme: Theme) -> void:
textbox_stylebox.content_margin_right = 6.0
textbox_stylebox.content_margin_top = 2.0
textbox_stylebox.content_margin_bottom = 4.0
- textbox_stylebox.bg_color = overlay_panel_inner_color * 0.8 + Color.BLACK * 0.2
- textbox_stylebox.border_color = Color(overlay_panel_border_color, 0.6)
+ textbox_stylebox.bg_color = overlay_panel_inner_color.lerp(extreme_theme_color, 0.2)
+ textbox_stylebox.border_color = subtle_panel_border_color
theme.set_stylebox("panel", "TextBox", textbox_stylebox)
theme.add_type("SideTabBar")
theme.set_type_variation("SideTabBar", "PanelContainer")
var side_tabbar_stylebox := StyleBoxFlat.new()
- side_tabbar_stylebox.bg_color = tabbar_background_color
+ side_tabbar_stylebox.bg_color = soft_base_color
side_tabbar_stylebox.set_content_margin_all(0)
side_tabbar_stylebox.corner_radius_top_left = 5
side_tabbar_stylebox.corner_radius_bottom_left = 5
@@ -219,12 +346,18 @@ static func _setup_panelcontainer(theme: Theme) -> void:
static func _setup_button(theme: Theme) -> void:
theme.add_type("Button")
theme.set_constant("h_separation", "Button", 5)
- theme.set_color("font_color", "Button", common_text_color)
- theme.set_color("font_disabled_color", "Button", common_subtle_text_color)
- theme.set_color("font_focus_color", "Button", common_highlighted_text_color)
- theme.set_color("font_hover_color", "Button", common_highlighted_text_color)
- theme.set_color("font_pressed_color", "Button", common_highlighted_text_color)
- theme.set_color("font_hover_pressed_color", "Button", common_highlighted_text_color)
+ theme.set_color("font_color", "Button", text_color)
+ theme.set_color("font_disabled_color", "Button", subtle_text_color)
+ theme.set_color("font_focus_color", "Button", highlighted_text_color)
+ theme.set_color("font_hover_color", "Button", highlighted_text_color)
+ theme.set_color("font_pressed_color", "Button", highlighted_text_color)
+ theme.set_color("font_hover_pressed_color", "Button", highlighted_text_color)
+ theme.set_color("icon_normal_color", "Button", tinted_contrast_color)
+ theme.set_color("icon_hover_color", "Button", tinted_contrast_color)
+ theme.set_color("icon_pressed_color", "Button", max_contrast_color)
+ theme.set_color("icon_hover_pressed_color", "Button", max_contrast_color)
+ theme.set_color("icon_focus_color", "Button", max_contrast_color)
+ theme.set_color("icon_disabled_color", "Button", gray_color)
var button_stylebox := StyleBoxFlat.new()
button_stylebox.set_corner_radius_all(5)
button_stylebox.set_border_width_all(2)
@@ -234,13 +367,13 @@ static func _setup_button(theme: Theme) -> void:
button_stylebox.content_margin_right = 6.0
var normal_button_stylebox := button_stylebox.duplicate()
- normal_button_stylebox.bg_color = common_button_inner_color_normal
- normal_button_stylebox.border_color = common_button_border_color_normal
+ normal_button_stylebox.bg_color = soft_intermediate_color
+ normal_button_stylebox.border_color = intermediate_color
theme.set_stylebox("normal", "Button", normal_button_stylebox)
var hover_button_stylebox := button_stylebox.duplicate()
- hover_button_stylebox.bg_color = common_button_inner_color_hover
- hover_button_stylebox.border_color = common_button_border_color_hover
+ hover_button_stylebox.bg_color = soft_intermediate_hover_color
+ hover_button_stylebox.border_color = intermediate_hover_color
theme.set_stylebox("hover", "Button", hover_button_stylebox)
var pressed_button_stylebox := button_stylebox.duplicate()
@@ -248,48 +381,48 @@ static func _setup_button(theme: Theme) -> void:
pressed_button_stylebox.border_color = common_button_border_color_pressed
theme.set_stylebox("pressed", "Button", pressed_button_stylebox)
+ var hover_pressed_button_stylebox := button_stylebox.duplicate()
+ hover_pressed_button_stylebox.bg_color = common_button_inner_color_pressed.blend(hover_overlay_color)
+ hover_pressed_button_stylebox.border_color = common_button_border_color_pressed.blend(hover_overlay_color)
+ theme.set_stylebox("hover_pressed", "Button", hover_pressed_button_stylebox)
+
var disabled_button_stylebox := button_stylebox.duplicate()
- disabled_button_stylebox.bg_color = common_inner_color_disabled
- disabled_button_stylebox.border_color = common_border_color_disabled
+ disabled_button_stylebox.bg_color = common_button_inner_color_disabled
+ disabled_button_stylebox.border_color = common_button_border_color_disabled
theme.set_stylebox("disabled", "Button", disabled_button_stylebox)
var focus_button_stylebox := button_stylebox.duplicate()
focus_button_stylebox.draw_center = false
- focus_button_stylebox.border_color = focus_color
+ focus_button_stylebox.border_color = Configs.savedata.accent_color
theme.set_stylebox("focus", "Button", focus_button_stylebox)
theme.add_type("IconButton")
theme.set_type_variation("IconButton", "Button")
- var icon_button_stylebox := StyleBoxFlat.new()
- icon_button_stylebox.set_corner_radius_all(5)
- icon_button_stylebox.set_border_width_all(2)
- icon_button_stylebox.set_content_margin_all(4)
-
- var normal_icon_button_stylebox := icon_button_stylebox.duplicate()
- normal_icon_button_stylebox.bg_color = common_button_inner_color_normal
- normal_icon_button_stylebox.border_color = common_button_border_color_normal
+
+ var normal_icon_button_stylebox := normal_button_stylebox.duplicate()
+ normal_icon_button_stylebox.set_content_margin_all(4)
theme.set_stylebox("normal", "IconButton", normal_icon_button_stylebox)
- var hover_icon_button_stylebox := icon_button_stylebox.duplicate()
- hover_icon_button_stylebox.bg_color = common_button_inner_color_hover
- hover_icon_button_stylebox.border_color = common_button_border_color_hover
+ var hover_icon_button_stylebox := hover_button_stylebox.duplicate()
+ hover_icon_button_stylebox.set_content_margin_all(4)
theme.set_stylebox("hover", "IconButton", hover_icon_button_stylebox)
- var pressed_icon_button_stylebox := icon_button_stylebox.duplicate()
- pressed_icon_button_stylebox.bg_color = common_button_inner_color_pressed
- pressed_icon_button_stylebox.border_color = common_button_border_color_pressed
+ var pressed_icon_button_stylebox := pressed_button_stylebox.duplicate()
+ pressed_icon_button_stylebox.set_content_margin_all(4)
theme.set_stylebox("pressed", "IconButton", pressed_icon_button_stylebox)
- var disabled_icon_button_stylebox := icon_button_stylebox.duplicate()
- disabled_icon_button_stylebox.bg_color = common_inner_color_disabled
- disabled_icon_button_stylebox.border_color = common_border_color_disabled
+ var hover_pressed_icon_button_stylebox := hover_pressed_button_stylebox.duplicate()
+ hover_pressed_icon_button_stylebox.set_content_margin_all(4)
+ theme.set_stylebox("hover_pressed", "IconButton", hover_pressed_icon_button_stylebox)
+
+ var disabled_icon_button_stylebox := disabled_button_stylebox.duplicate()
+ disabled_icon_button_stylebox.set_content_margin_all(4)
theme.set_stylebox("disabled", "IconButton", disabled_icon_button_stylebox)
theme.add_type("LeftConnectedButton")
theme.set_type_variation("LeftConnectedButton", "Button")
- theme.set_color("icon_normal_color", "LeftConnectedButton", icon_normal_color)
- theme.set_color("icon_hover_color", "LeftConnectedButton", icon_hover_color)
- theme.set_color("icon_pressed_color", "LeftConnectedButton", icon_pressed_color)
+ theme.set_color("icon_normal_color", "LeftConnectedButton", context_icon_normal_color)
+ theme.set_color("icon_hover_color", "LeftConnectedButton", context_icon_hover_color)
var left_connected_button_stylebox := StyleBoxFlat.new()
left_connected_button_stylebox.corner_radius_bottom_left = 0
left_connected_button_stylebox.corner_radius_top_left = 0
@@ -305,8 +438,8 @@ static func _setup_button(theme: Theme) -> void:
left_connected_button_stylebox.content_margin_right = 5.0
var normal_left_connected_button_stylebox := left_connected_button_stylebox.duplicate()
- normal_left_connected_button_stylebox.bg_color = connected_button_inner_color_normal
- normal_left_connected_button_stylebox.border_color = connected_button_border_color_normal
+ normal_left_connected_button_stylebox.bg_color = line_edit_inner_color
+ normal_left_connected_button_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "LeftConnectedButton", normal_left_connected_button_stylebox)
# Disabled theme is not currently used, but is needed for correct spacing.
theme.set_stylebox("disabled", "LeftConnectedButton", normal_left_connected_button_stylebox)
@@ -321,11 +454,13 @@ static func _setup_button(theme: Theme) -> void:
pressed_left_connected_button_stylebox.border_color = connected_button_border_color_pressed
theme.set_stylebox("pressed", "LeftConnectedButton", pressed_left_connected_button_stylebox)
+ var hover_pressed_left_connected_button_stylebox := left_connected_button_stylebox.duplicate()
+ hover_pressed_left_connected_button_stylebox.bg_color = connected_button_inner_color_pressed.blend(hover_overlay_color)
+ hover_pressed_left_connected_button_stylebox.border_color = connected_button_border_color_pressed.blend(hover_overlay_color)
+ theme.set_stylebox("hover_pressed", "LeftConnectedButton", hover_pressed_left_connected_button_stylebox)
+
theme.add_type("LeftConnectedButtonTransparent")
theme.set_type_variation("LeftConnectedButtonTransparent", "Button")
- theme.set_color("icon_normal_color", "LeftConnectedButtonTransparent", icon_normal_color)
- theme.set_color("icon_hover_color", "LeftConnectedButtonTransparent", icon_hover_color)
- theme.set_color("icon_pressed_color", "LeftConnectedButtonTransparent", icon_pressed_color)
var left_connected_button_transparent_stylebox := StyleBoxFlat.new()
left_connected_button_transparent_stylebox.corner_radius_bottom_left = 0
left_connected_button_transparent_stylebox.corner_radius_top_left = 0
@@ -338,7 +473,7 @@ static func _setup_button(theme: Theme) -> void:
var normal_left_connected_button_transparent_stylebox := left_connected_button_transparent_stylebox.duplicate()
normal_left_connected_button_transparent_stylebox.draw_center = false
- normal_left_connected_button_transparent_stylebox.border_color = connected_button_border_color_normal
+ normal_left_connected_button_transparent_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "LeftConnectedButtonTransparent", normal_left_connected_button_transparent_stylebox)
var hover_left_connected_button_transparent_stylebox := left_connected_button_transparent_stylebox.duplicate()
@@ -351,11 +486,15 @@ static func _setup_button(theme: Theme) -> void:
pressed_left_connected_button_transparent_stylebox.border_color = connected_button_border_color_pressed
theme.set_stylebox("pressed", "LeftConnectedButtonTransparent", pressed_left_connected_button_transparent_stylebox)
+ var hover_pressed_left_connected_button_transparent_stylebox := left_connected_button_transparent_stylebox.duplicate()
+ hover_pressed_left_connected_button_transparent_stylebox.draw_center = false
+ hover_pressed_left_connected_button_transparent_stylebox.border_color = connected_button_border_color_pressed.blend(hover_overlay_color)
+ theme.set_stylebox("hover_pressed", "LeftConnectedButtonTransparent", hover_pressed_left_connected_button_transparent_stylebox)
+
theme.add_type("RightConnectedButton")
theme.set_type_variation("RightConnectedButton", "Button")
- theme.set_color("icon_normal_color", "RightConnectedButton", icon_normal_color)
- theme.set_color("icon_hover_color", "RightConnectedButton", icon_hover_color)
- theme.set_color("icon_pressed_color", "RightConnectedButton", icon_pressed_color)
+ theme.set_color("icon_normal_color", "RightConnectedButton", context_icon_normal_color)
+ theme.set_color("icon_hover_color", "RightConnectedButton", context_icon_hover_color)
var right_connected_button_stylebox := StyleBoxFlat.new()
right_connected_button_stylebox.corner_radius_bottom_left = 5
right_connected_button_stylebox.corner_radius_top_left = 5
@@ -371,8 +510,8 @@ static func _setup_button(theme: Theme) -> void:
right_connected_button_stylebox.content_margin_right = 4.0
var normal_right_connected_button_stylebox := right_connected_button_stylebox.duplicate()
- normal_right_connected_button_stylebox.bg_color = connected_button_inner_color_normal
- normal_right_connected_button_stylebox.border_color = connected_button_border_color_normal
+ normal_right_connected_button_stylebox.bg_color = line_edit_inner_color
+ normal_right_connected_button_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "RightConnectedButton", normal_right_connected_button_stylebox)
# Disabled theme is not currently used, but is needed for correct spacing.
theme.set_stylebox("disabled", "RightConnectedButton", normal_right_connected_button_stylebox)
@@ -387,11 +526,13 @@ static func _setup_button(theme: Theme) -> void:
pressed_right_connected_button_stylebox.border_color = connected_button_border_color_pressed
theme.set_stylebox("pressed", "RightConnectedButton", pressed_right_connected_button_stylebox)
+ var hover_pressed_right_connected_button_stylebox := right_connected_button_stylebox.duplicate()
+ hover_pressed_right_connected_button_stylebox.bg_color = connected_button_inner_color_pressed.blend(hover_overlay_color)
+ hover_pressed_right_connected_button_stylebox.border_color = connected_button_border_color_pressed.blend(hover_overlay_color)
+ theme.set_stylebox("hover_pressed", "RightConnectedButton", hover_pressed_right_connected_button_stylebox)
+
theme.add_type("RightConnectedButtonTransparent")
theme.set_type_variation("RightConnectedButtonTransparent", "Button")
- theme.set_color("icon_normal_color", "RightConnectedButtonTransparent", icon_normal_color)
- theme.set_color("icon_hover_color", "RightConnectedButtonTransparent", icon_hover_color)
- theme.set_color("icon_pressed_color", "RightConnectedButtonTransparent", icon_pressed_color)
var right_connected_button_transparent_stylebox := StyleBoxFlat.new()
right_connected_button_transparent_stylebox.corner_radius_bottom_left = 5
right_connected_button_transparent_stylebox.corner_radius_top_left = 5
@@ -404,7 +545,7 @@ static func _setup_button(theme: Theme) -> void:
var normal_right_connected_button_transparent_stylebox := right_connected_button_transparent_stylebox.duplicate()
normal_right_connected_button_transparent_stylebox.draw_center = false
- normal_right_connected_button_transparent_stylebox.border_color = connected_button_border_color_normal
+ normal_right_connected_button_transparent_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "RightConnectedButtonTransparent", normal_right_connected_button_transparent_stylebox)
var hover_right_connected_button_transparent_stylebox := right_connected_button_transparent_stylebox.duplicate()
@@ -417,34 +558,41 @@ static func _setup_button(theme: Theme) -> void:
pressed_right_connected_button_transparent_stylebox.border_color = connected_button_border_color_pressed
theme.set_stylebox("pressed", "RightConnectedButtonTransparent", pressed_right_connected_button_transparent_stylebox)
+ var hover_pressed_right_connected_button_transparent_stylebox := right_connected_button_transparent_stylebox.duplicate()
+ hover_pressed_right_connected_button_transparent_stylebox.draw_center = false
+ hover_pressed_right_connected_button_transparent_stylebox.border_color = connected_button_border_color_pressed.blend(hover_overlay_color)
+ theme.set_stylebox("hover_pressed", "RightConnectedButtonTransparent", hover_pressed_right_connected_button_transparent_stylebox)
+
theme.add_type("TranslucentButton")
theme.set_type_variation("TranslucentButton", "Button")
- var translucent_button_stylebox := StyleBoxFlat.new()
- translucent_button_stylebox.set_corner_radius_all(5)
- translucent_button_stylebox.set_content_margin_all(4)
-
- var normal_translucent_button_stylebox := translucent_button_stylebox.duplicate()
- normal_translucent_button_stylebox.bg_color = translucent_button_color_normal
+ theme.set_color("icon_normal_color", "TranslucentButton", context_icon_normal_color)
+ theme.set_color("icon_hover_color", "TranslucentButton", context_icon_normal_color)
+ theme.set_color("icon_pressed_color", "TranslucentButton", context_icon_normal_color)
+
+ var normal_translucent_button_stylebox := StyleBoxFlat.new()
+ normal_translucent_button_stylebox.set_corner_radius_all(5)
+ normal_translucent_button_stylebox.set_content_margin_all(4)
+ normal_translucent_button_stylebox.bg_color = hover_overlay_color
theme.set_stylebox("normal", "TranslucentButton", normal_translucent_button_stylebox)
- var hover_translucent_button_stylebox := translucent_button_stylebox.duplicate()
- hover_translucent_button_stylebox.bg_color = translucent_button_color_hover
+ var hover_translucent_button_stylebox := normal_translucent_button_stylebox.duplicate()
+ hover_translucent_button_stylebox.bg_color = strong_hover_overlay_color
theme.set_stylebox("hover", "TranslucentButton", hover_translucent_button_stylebox)
- var pressed_translucent_button_stylebox := translucent_button_stylebox.duplicate()
- pressed_translucent_button_stylebox.bg_color = translucent_button_color_pressed
+ var pressed_translucent_button_stylebox := normal_translucent_button_stylebox.duplicate()
+ pressed_translucent_button_stylebox.bg_color = hover_pressed_overlay_color
theme.set_stylebox("pressed", "TranslucentButton", pressed_translucent_button_stylebox)
- var disabled_translucent_button_stylebox := translucent_button_stylebox.duplicate()
+ var disabled_translucent_button_stylebox := normal_translucent_button_stylebox.duplicate()
disabled_translucent_button_stylebox.bg_color = translucent_button_color_disabled
theme.set_stylebox("disabled", "TranslucentButton", disabled_translucent_button_stylebox)
theme.add_type("FlatButton")
theme.set_type_variation("FlatButton", "Button")
- theme.set_color("icon_normal_color", "FlatButton", icon_normal_color)
- theme.set_color("icon_hover_color", "FlatButton", icon_hover_color)
- theme.set_color("icon_pressed_color", "FlatButton", icon_pressed_color)
- theme.set_color("icon_hover_pressed_color", "FlatButton", icon_pressed_color)
+ theme.set_color("icon_normal_color", "FlatButton", context_icon_normal_color)
+ theme.set_color("icon_hover_color", "FlatButton", context_icon_hover_color)
+ theme.set_color("icon_pressed_color", "FlatButton", context_icon_pressed_color)
+ theme.set_color("icon_hover_pressed_color", "FlatButton", context_icon_pressed_color)
var flat_button_stylebox := StyleBoxFlat.new()
flat_button_stylebox.set_corner_radius_all(3)
flat_button_stylebox.set_content_margin_all(2)
@@ -454,11 +602,11 @@ static func _setup_button(theme: Theme) -> void:
theme.set_stylebox("normal", "FlatButton", normal_flat_button_stylebox)
var hover_flat_button_stylebox := flat_button_stylebox.duplicate()
- hover_flat_button_stylebox.bg_color = flat_button_color_hover
+ hover_flat_button_stylebox.bg_color = hover_overlay_color
theme.set_stylebox("hover", "FlatButton", hover_flat_button_stylebox)
var pressed_flat_button_stylebox := flat_button_stylebox.duplicate()
- pressed_flat_button_stylebox.bg_color = flat_button_color_pressed
+ pressed_flat_button_stylebox.bg_color = pressed_overlay_color
theme.set_stylebox("pressed", "FlatButton", pressed_flat_button_stylebox)
var disabled_flat_button_stylebox := flat_button_stylebox.duplicate()
@@ -468,8 +616,9 @@ static func _setup_button(theme: Theme) -> void:
theme.add_type("ContextButton")
theme.set_type_variation("ContextButton", "Button")
theme.set_color("icon_normal_color", "ContextButton", context_icon_normal_color)
- theme.set_color("icon_hover_color", "ContextButton", icon_hover_color)
- theme.set_color("icon_pressed_color", "ContextButton", icon_hover_color)
+ theme.set_color("icon_hover_color", "ContextButton", context_icon_hover_color)
+ theme.set_color("icon_pressed_color", "ContextButton", context_icon_pressed_color)
+ theme.set_color("icon_disabled_color", "ContextButton", gray_color)
var context_button_stylebox := StyleBoxFlat.new()
context_button_stylebox.set_corner_radius_all(3)
context_button_stylebox.content_margin_bottom = 2.0
@@ -485,39 +634,106 @@ static func _setup_button(theme: Theme) -> void:
theme.set_stylebox("normal", "ContextButton", normal_context_button_stylebox)
var hover_context_button_stylebox := context_button_stylebox.duplicate()
- hover_context_button_stylebox.bg_color = flat_button_color_hover
+ hover_context_button_stylebox.bg_color = hover_overlay_color
theme.set_stylebox("hover", "ContextButton", hover_context_button_stylebox)
var pressed_context_button_stylebox := context_button_stylebox.duplicate()
- pressed_context_button_stylebox.bg_color = flat_button_color_pressed
+ pressed_context_button_stylebox.bg_color = pressed_overlay_color
theme.set_stylebox("pressed", "ContextButton", pressed_context_button_stylebox)
var disabled_context_button_stylebox := context_button_stylebox.duplicate()
- disabled_context_button_stylebox.bg_color = flat_button_color_disabled
+ # Ensure enough contrast.
+ disabled_context_button_stylebox.bg_color = Color(Color.BLACK, maxf(0.16,
+ 0.48 - color_difference(Color.BLACK, basic_panel_inner_color) * 2))
theme.set_stylebox("disabled", "ContextButton", disabled_context_button_stylebox)
+ theme.add_type("PathCommandAbsoluteButton")
+ theme.set_type_variation("PathCommandAbsoluteButton", "Button")
+ var path_command_absolute_button_stylebox_normal := StyleBoxFlat.new()
+ path_command_absolute_button_stylebox_normal.set_border_width_all(2)
+ path_command_absolute_button_stylebox_normal.set_corner_radius_all(4)
+ path_command_absolute_button_stylebox_normal.content_margin_left = 5.0
+ path_command_absolute_button_stylebox_normal.content_margin_right = 5.0
+ path_command_absolute_button_stylebox_normal.content_margin_top = 0.0
+ path_command_absolute_button_stylebox_normal.content_margin_bottom = 0.0
+ path_command_absolute_button_stylebox_normal.bg_color = Color("cc7a29") if\
+ ThemeUtils.is_theme_dark else Color("f2cb91")
+ path_command_absolute_button_stylebox_normal.border_color = Color("e6ae5c") if\
+ ThemeUtils.is_theme_dark else Color("ffaa33")
+ theme.set_stylebox("normal", "PathCommandAbsoluteButton",
+ path_command_absolute_button_stylebox_normal)
+ theme.set_stylebox("disabled", "PathCommandAbsoluteButton",
+ path_command_absolute_button_stylebox_normal)
+
+ var path_command_absolute_button_stylebox_hover :=\
+ path_command_absolute_button_stylebox_normal.duplicate()
+ path_command_absolute_button_stylebox_hover.bg_color = Color("d9822b") if\
+ ThemeUtils.is_theme_dark else Color("f2c279")
+ path_command_absolute_button_stylebox_hover.border_color = Color("f2cb91") if\
+ ThemeUtils.is_theme_dark else Color("f29718")
+ theme.set_stylebox("hover", "PathCommandAbsoluteButton",
+ path_command_absolute_button_stylebox_hover)
+
+ var path_command_absolute_button_stylebox_pressed :=\
+ path_command_absolute_button_stylebox_normal.duplicate()
+ path_command_absolute_button_stylebox_pressed.bg_color = Color("ffbf40") if\
+ ThemeUtils.is_theme_dark else Color("f2ae49")
+ path_command_absolute_button_stylebox_pressed.border_color = Color("ffecb3") if\
+ ThemeUtils.is_theme_dark else Color("e68600")
+ theme.set_stylebox("pressed", "PathCommandAbsoluteButton",
+ path_command_absolute_button_stylebox_pressed)
+
+ theme.add_type("PathCommandRelativeButton")
+ theme.set_type_variation("PathCommandRelativeButton", "Button")
+ var path_command_relative_button_stylebox_normal :=\
+ path_command_absolute_button_stylebox_normal.duplicate()
+ path_command_relative_button_stylebox_normal.bg_color = Color("a329cc") if\
+ ThemeUtils.is_theme_dark else Color("d291f2")
+ path_command_relative_button_stylebox_normal.border_color = Color("bd73e6") if\
+ ThemeUtils.is_theme_dark else Color("bb33ff")
+ theme.set_stylebox("normal", "PathCommandRelativeButton",
+ path_command_relative_button_stylebox_normal)
+ theme.set_stylebox("disabled", "PathCommandRelativeButton",
+ path_command_relative_button_stylebox_normal)
+
+ var path_command_relative_button_stylebox_hover :=\
+ path_command_absolute_button_stylebox_normal.duplicate()
+ path_command_relative_button_stylebox_hover.bg_color = Color("ad2bd9") if\
+ ThemeUtils.is_theme_dark else Color("ca79f2")
+ path_command_relative_button_stylebox_hover.border_color = Color("d291f2") if\
+ ThemeUtils.is_theme_dark else Color("aa18f2")
+ theme.set_stylebox("hover", "PathCommandRelativeButton",
+ path_command_relative_button_stylebox_hover)
+
+ var path_command_relative_button_stylebox_pressed :=\
+ path_command_absolute_button_stylebox_normal.duplicate()
+ path_command_relative_button_stylebox_pressed.bg_color = Color("bf40ff") if\
+ ThemeUtils.is_theme_dark else Color("ba49f2")
+ path_command_relative_button_stylebox_pressed.border_color = Color("dfb3ff") if\
+ ThemeUtils.is_theme_dark else Color("9900e6")
+ theme.set_stylebox("pressed", "PathCommandRelativeButton",
+ path_command_relative_button_stylebox_pressed)
+
theme.add_type("TextButton")
theme.set_type_variation("TextButton", "Button")
- theme.set_color("font_color", "TextButton", icon_toggled_off_color)
- theme.set_color("font_hover_color", "TextButton", icon_toggled_off_color)
- theme.set_color("font_pressed_color", "TextButton", icon_toggled_on_color)
+ theme.set_color("font_color", "TextButton", dimmer_text_color)
+ theme.set_color("font_hover_color", "TextButton", dim_text_color)
+ theme.set_color("font_pressed_color", "TextButton", text_color)
+ theme.set_color("font_hover_pressed_color", "TextButton", highlighted_text_color)
var text_button_empty_stylebox := StyleBoxEmpty.new()
text_button_empty_stylebox.content_margin_left = 2.0
text_button_empty_stylebox.content_margin_right = 2.0
theme.set_stylebox("normal", "TextButton", text_button_empty_stylebox)
theme.set_stylebox("hover", "TextButton", text_button_empty_stylebox)
theme.set_stylebox("pressed", "TextButton", text_button_empty_stylebox)
+ theme.set_stylebox("hover_pressed", "TextButton", text_button_empty_stylebox)
theme.set_stylebox("disabled", "TextButton", text_button_empty_stylebox)
theme.add_type("SideTab")
theme.set_type_variation("SideTab", "Button")
- theme.set_color("font_color", "SideTab", common_dim_text_color)
- theme.set_color("font_hover_color", "SideTab", common_highlighted_text_color)
- theme.set_color("font_pressed_color", "SideTab", common_highlighted_text_color)
- theme.set_color("font_hover_pressed_color", "SideTab", common_highlighted_text_color)
var normal_sidetab_stylebox := StyleBoxFlat.new()
- normal_sidetab_stylebox.bg_color = normal_tab_color
+ normal_sidetab_stylebox.bg_color = softer_intermediate_color
normal_sidetab_stylebox.corner_radius_top_left = 4
normal_sidetab_stylebox.corner_radius_bottom_left = 4
normal_sidetab_stylebox.content_margin_left = 6.0
@@ -527,7 +743,7 @@ static func _setup_button(theme: Theme) -> void:
theme.set_stylebox("normal", "SideTab", normal_sidetab_stylebox)
var hovered_sidetab_stylebox := normal_sidetab_stylebox.duplicate()
- hovered_sidetab_stylebox.bg_color = hovered_tab_color
+ hovered_sidetab_stylebox.bg_color = softer_intermediate_hover_color
theme.set_stylebox("hover", "SideTab", hovered_sidetab_stylebox)
var pressed_sidetab_stylebox := StyleBoxFlat.new()
@@ -539,6 +755,7 @@ static func _setup_button(theme: Theme) -> void:
pressed_sidetab_stylebox.content_margin_bottom = 3.0
pressed_sidetab_stylebox.content_margin_top = 3.0
theme.set_stylebox("pressed", "SideTab", pressed_sidetab_stylebox)
+ theme.set_stylebox("hover_pressed", "SideTab", pressed_sidetab_stylebox)
theme.add_type("Swatch")
theme.set_type_variation("Swatch", "Button")
@@ -546,11 +763,11 @@ static func _setup_button(theme: Theme) -> void:
swatch_stylebox.set_corner_radius_all(3)
var normal_swatch_stylebox := swatch_stylebox.duplicate()
- normal_swatch_stylebox.bg_color = common_button_border_color_normal
+ normal_swatch_stylebox.bg_color = intermediate_color
theme.set_stylebox("normal", "Swatch", normal_swatch_stylebox)
var hover_swatch_stylebox := swatch_stylebox.duplicate()
- hover_swatch_stylebox.bg_color = common_button_border_color_hover
+ hover_swatch_stylebox.bg_color = intermediate_color.blend(stronger_hover_overlay_color)
theme.set_stylebox("hover", "Swatch", hover_swatch_stylebox)
var pressed_swatch_stylebox := swatch_stylebox.duplicate()
@@ -561,17 +778,41 @@ static func _setup_button(theme: Theme) -> void:
static func _setup_checkbox(theme: Theme) -> void:
theme.add_type("CheckBox")
theme.set_constant("h_separation", "CheckBox", 5)
- theme.set_color("font_color", "CheckBox", common_text_color)
- theme.set_color("font_color", "CheckBox", common_text_color)
- theme.set_color("font_disabled_color", "CheckBox", common_subtle_text_color)
- theme.set_color("font_focus_color", "CheckBox", common_highlighted_text_color)
- theme.set_color("font_hover_color", "CheckBox", common_highlighted_text_color)
- theme.set_color("font_pressed_color", "CheckBox", common_highlighted_text_color)
- theme.set_color("font_hover_pressed_color", "CheckBox", common_highlighted_text_color)
- theme.set_icon("checked", "CheckBox", _icon("GuiBoxChecked"))
- theme.set_icon("checked_disabled", "CheckBox", _icon("GuiBoxCheckedDisabled"))
- theme.set_icon("unchecked", "CheckBox", _icon("GuiBoxUnchecked"))
- theme.set_icon("unchecked_disabled", "CheckBox", _icon("GuiBoxUncheckedDisabled"))
+ theme.set_color("font_color", "CheckBox", text_color)
+ theme.set_color("font_color", "CheckBox", text_color)
+ theme.set_color("font_disabled_color", "CheckBox", subtle_text_color)
+ theme.set_color("font_focus_color", "CheckBox", highlighted_text_color)
+ theme.set_color("font_hover_color", "CheckBox", highlighted_text_color)
+ theme.set_color("font_pressed_color", "CheckBox", highlighted_text_color)
+ theme.set_color("font_hover_pressed_color", "CheckBox", highlighted_text_color)
+ theme.set_icon("checked", "CheckBox",
+ SVGTexture.create_from_string("""
+ """ %\
+ [soft_accent_color.to_html(false), black_or_white_counter_accent_color.to_html(false)])
+ )
+ theme.set_icon("checked_disabled", "CheckBox",
+ SVGTexture.create_from_string("""
+ """ %\
+ [soft_accent_color.lerp(gray_color, 0.2).to_html(false), black_or_white_counter_accent_color.to_html(false)])
+ )
+ theme.set_icon("unchecked", "CheckBox",
+ SVGTexture.create_from_string("""
+ """ % gray_color.to_html(false))
+ )
+ theme.set_icon("unchecked_disabled", "CheckBox",
+ SVGTexture.create_from_string("""
+ """ % gray_color.to_html(false))
+ )
var checkbox_stylebox := StyleBoxFlat.new()
checkbox_stylebox.set_corner_radius_all(4)
@@ -589,7 +830,7 @@ static func _setup_checkbox(theme: Theme) -> void:
theme.set_stylebox("pressed", "CheckBox", empty_checkbox_stylebox)
var hover_checkbox_stylebox := checkbox_stylebox.duplicate()
- hover_checkbox_stylebox.bg_color = flat_button_color_hover
+ hover_checkbox_stylebox.bg_color = hover_overlay_color
theme.set_stylebox("hover", "CheckBox", hover_checkbox_stylebox)
theme.set_stylebox("hover_pressed", "CheckBox", hover_checkbox_stylebox)
@@ -599,20 +840,35 @@ static func _setup_checkbox(theme: Theme) -> void:
static func _setup_checkbutton(theme: Theme) -> void:
theme.add_type("CheckButton")
- theme.set_color("font_color", "CheckButton", common_text_color)
- theme.set_color("font_disabled_color", "CheckButton", common_subtle_text_color)
- theme.set_color("font_focus_color", "CheckButton", common_highlighted_text_color)
- theme.set_color("font_hover_color", "CheckButton", common_highlighted_text_color)
- theme.set_color("font_pressed_color", "CheckButton", common_highlighted_text_color)
- theme.set_color("font_hover_pressed_color", "CheckButton", common_highlighted_text_color)
- theme.set_icon("checked", "CheckButton", _icon("GuiToggleChecked"))
- theme.set_icon("unchecked", "CheckButton", _icon("GuiToggleUnchecked"))
+ theme.set_color("font_color", "CheckButton", text_color)
+ theme.set_color("font_disabled_color", "CheckButton", subtle_text_color)
+ theme.set_color("font_focus_color", "CheckButton", highlighted_text_color)
+ theme.set_color("font_hover_color", "CheckButton", highlighted_text_color)
+ theme.set_color("font_pressed_color", "CheckButton", highlighted_text_color)
+ theme.set_color("font_hover_pressed_color", "CheckButton", highlighted_text_color)
+ theme.set_icon("checked", "CheckButton",
+ SVGTexture.create_from_string("""
+ """ %\
+ [soft_accent_color.to_html(false), black_or_white_counter_accent_color.to_html(false)])
+ )
+ theme.set_icon("unchecked", "CheckButton",
+ SVGTexture.create_from_string("""
+ """ %\
+ [gray_color.to_html(false), black_or_white_counter_accent_color.to_html(false)])
+ )
static func _setup_itemlist(theme: Theme) -> void:
theme.add_type("ItemList")
- theme.set_color("font_color", "ItemList", Color(0.9, 0.9, 0.9))
- theme.set_color("font_hovered", "ItemList", Color.WHITE)
- theme.set_color("font_selected", "ItemList", Color.WHITE)
+ theme.set_color("font_color", "ItemList", text_color)
+ theme.set_color("font_hovered_color", "ItemList", highlighted_text_color)
+ theme.set_color("font_selected_color", "ItemList", highlighted_text_color)
+ theme.set_color("font_hovered_selected_color", "ItemList", highlighted_text_color)
theme.set_color("guide_color", "ItemList", Color.TRANSPARENT)
theme.set_constant("icon_margin", "ItemList", 4)
@@ -628,26 +884,27 @@ static func _setup_itemlist(theme: Theme) -> void:
item_stylebox.set_content_margin_all(2)
var hover_item_stylebox := item_stylebox.duplicate()
- hover_item_stylebox.bg_color = flat_button_color_hover
+ hover_item_stylebox.bg_color = hover_overlay_color
theme.set_stylebox("hovered", "ItemList", hover_item_stylebox)
var selected_item_stylebox := item_stylebox.duplicate()
- selected_item_stylebox.bg_color = flat_button_color_pressed
+ selected_item_stylebox.bg_color = pressed_overlay_color
theme.set_stylebox("selected", "ItemList", selected_item_stylebox)
theme.set_stylebox("selected_focus", "ItemList", selected_item_stylebox)
var hovered_selected_item_stylebox := item_stylebox.duplicate()
- hovered_selected_item_stylebox.bg_color = flat_button_color_hovered_pressed
+ hovered_selected_item_stylebox.bg_color = hover_pressed_overlay_color
theme.set_stylebox("hovered_selected", "ItemList", hovered_selected_item_stylebox)
theme.set_stylebox("hovered_selected_focus", "ItemList", hovered_selected_item_stylebox)
static func _setup_lineedit(theme: Theme) -> void:
theme.add_type("LineEdit")
- theme.set_color("caret_color", "LineEdit", common_caret_color)
- theme.set_color("font_color", "LineEdit", common_editable_text_color)
- theme.set_color("font_placeholder_color", "LineEdit", common_subtle_text_color)
- theme.set_color("selection_color", "LineEdit", common_selection_color)
- theme.set_color("disabled_selection_color", "LineEdit", common_disabled_selection_color)
+ theme.set_color("caret_color", "LineEdit", caret_color)
+ theme.set_color("font_color", "LineEdit", editable_text_color)
+ theme.set_color("font_uneditable_color", "LineEdit", dimmer_text_color)
+ theme.set_color("font_placeholder_color", "LineEdit", subtle_text_color)
+ theme.set_color("selection_color", "LineEdit", selection_color)
+ theme.set_color("disabled_selection_color", "LineEdit", disabled_selection_color)
theme.set_font_size("font_size", "LineEdit", 12)
theme.set_font("font", "LineEdit", mono_font)
@@ -658,18 +915,19 @@ static func _setup_lineedit(theme: Theme) -> void:
stylebox.content_margin_right = 5.0
var disabled_stylebox := stylebox.duplicate()
- disabled_stylebox.bg_color = common_inner_color_disabled
- disabled_stylebox.border_color = common_border_color_disabled
+ disabled_stylebox.bg_color = line_edit_inner_color_disabled
+ disabled_stylebox.border_color = line_edit_border_color_disabled
theme.set_stylebox("read_only", "LineEdit", disabled_stylebox)
var normal_stylebox := stylebox.duplicate()
- normal_stylebox.bg_color = line_edit_background_color
+ normal_stylebox.bg_color = line_edit_inner_color
normal_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "LineEdit", normal_stylebox)
var hover_stylebox := stylebox.duplicate()
hover_stylebox.draw_center = false
- hover_stylebox.border_color = line_edit_hover_border_overlay_color
+ hover_stylebox.border_color = strong_hover_overlay_color if is_theme_dark else\
+ stronger_hover_overlay_color
theme.set_stylebox("hover", "LineEdit", hover_stylebox)
var focus_stylebox := stylebox.duplicate()
@@ -696,18 +954,19 @@ static func _setup_lineedit(theme: Theme) -> void:
left_connected_stylebox.content_margin_bottom = 0.0
var left_connected_disabled_stylebox := left_connected_stylebox.duplicate()
- left_connected_disabled_stylebox.bg_color = common_inner_color_disabled
- left_connected_disabled_stylebox.border_color = common_border_color_disabled
+ left_connected_disabled_stylebox.bg_color = line_edit_inner_color_disabled
+ left_connected_disabled_stylebox.border_color = line_edit_border_color_disabled
theme.set_stylebox("read_only", "LeftConnectedLineEdit", left_connected_disabled_stylebox)
var left_connected_normal_stylebox := left_connected_stylebox.duplicate()
- left_connected_normal_stylebox.bg_color = line_edit_background_color
+ left_connected_normal_stylebox.bg_color = line_edit_inner_color
left_connected_normal_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "LeftConnectedLineEdit", left_connected_normal_stylebox)
var left_connected_hover_stylebox := left_connected_stylebox.duplicate()
left_connected_hover_stylebox.draw_center = false
- left_connected_hover_stylebox.border_color = line_edit_hover_border_overlay_color
+ left_connected_hover_stylebox.border_color = strong_hover_overlay_color if is_theme_dark else\
+ stronger_hover_overlay_color
theme.set_stylebox("hover", "LeftConnectedLineEdit", left_connected_hover_stylebox)
var left_connected_focus_stylebox := left_connected_stylebox.duplicate()
@@ -734,18 +993,19 @@ static func _setup_lineedit(theme: Theme) -> void:
right_connected_stylebox.content_margin_bottom = 0.0
var right_connected_disabled_stylebox := right_connected_stylebox.duplicate()
- right_connected_disabled_stylebox.bg_color = common_inner_color_disabled
- right_connected_disabled_stylebox.border_color = common_border_color_disabled
+ right_connected_disabled_stylebox.bg_color = line_edit_inner_color_disabled
+ right_connected_disabled_stylebox.border_color = line_edit_border_color_disabled
theme.set_stylebox("read_only", "RightConnectedLineEdit", right_connected_disabled_stylebox)
var right_connected_normal_stylebox := right_connected_stylebox.duplicate()
- right_connected_normal_stylebox.bg_color = line_edit_background_color
+ right_connected_normal_stylebox.bg_color = line_edit_inner_color
right_connected_normal_stylebox.border_color = line_edit_normal_border_color
theme.set_stylebox("normal", "RightConnectedLineEdit", right_connected_normal_stylebox)
var right_connected_hover_stylebox := right_connected_stylebox.duplicate()
right_connected_hover_stylebox.draw_center = false
- right_connected_hover_stylebox.border_color = line_edit_hover_border_overlay_color
+ right_connected_hover_stylebox.border_color = strong_hover_overlay_color if is_theme_dark else\
+ stronger_hover_overlay_color
theme.set_stylebox("hover", "RightConnectedLineEdit", right_connected_hover_stylebox)
var right_connected_focus_stylebox := right_connected_stylebox.duplicate()
@@ -754,7 +1014,7 @@ static func _setup_lineedit(theme: Theme) -> void:
theme.set_stylebox("focus", "RightConnectedLineEdit", right_connected_focus_stylebox)
theme.add_type("MiniLineEdit")
- theme.set_color("font_color", "MiniLineEdit", common_editable_text_color)
+ theme.set_color("font_color", "MiniLineEdit", editable_text_color)
theme.set_type_variation("MiniLineEdit", "LineEdit")
theme.set_font_size("font_size", "MiniLineEdit", 10)
theme.set_font("font", "MiniLineEdit", mono_font)
@@ -772,20 +1032,19 @@ static func _setup_lineedit(theme: Theme) -> void:
mini_stylebox.content_margin_bottom = 0.0
var mini_stylebox_normal := mini_stylebox.duplicate()
- mini_stylebox_normal.bg_color = line_edit_background_color
+ mini_stylebox_normal.bg_color = line_edit_inner_color
mini_stylebox_normal.border_color = mini_line_edit_normal_border_color
theme.set_stylebox("normal", "MiniLineEdit", mini_stylebox_normal)
var mini_stylebox_hover := mini_stylebox.duplicate()
mini_stylebox_hover.draw_center = false
- var mini_line_edit_hover_border_overlay_color := line_edit_hover_border_overlay_color
- mini_line_edit_hover_border_overlay_color.a *= 1.5
- mini_stylebox_hover.border_color = mini_line_edit_hover_border_overlay_color
+ mini_stylebox_hover.border_color = strong_hover_overlay_color if is_theme_dark else\
+ stronger_hover_overlay_color
theme.set_stylebox("hover", "MiniLineEdit", mini_stylebox_hover)
var mini_stylebox_pressed := mini_stylebox.duplicate()
mini_stylebox_pressed.draw_center = false
- mini_stylebox_pressed.border_color = line_edit_focus_color
+ mini_stylebox_pressed.border_color = mini_line_edit_normal_border_color.blend(line_edit_focus_color)
theme.set_stylebox("focus", "MiniLineEdit", mini_stylebox_pressed)
theme.add_type("GoodColorPickerLineEdit")
@@ -794,7 +1053,7 @@ static func _setup_lineedit(theme: Theme) -> void:
theme.set_font("font", "GoodColorPickerLineEdit", mono_font)
var color_picker_line_edit_stylebox := StyleBoxFlat.new()
color_picker_line_edit_stylebox.set_corner_radius_all(2)
- color_picker_line_edit_stylebox.bg_color = line_edit_background_color
+ color_picker_line_edit_stylebox.bg_color = line_edit_inner_color
theme.set_stylebox("normal", "GoodColorPickerLineEdit", color_picker_line_edit_stylebox)
var empty_stylebox := StyleBoxEmpty.new()
theme.set_stylebox("hover", "GoodColorPickerLineEdit", empty_stylebox)
@@ -809,11 +1068,11 @@ static func _setup_scrollbar(theme: Theme) -> void:
h_stylebox.content_margin_right = 2.0
var h_grabber_stylebox := h_stylebox.duplicate()
- h_grabber_stylebox.bg_color = scrollbar_normal_color
+ h_grabber_stylebox.bg_color = intermediate_color
theme.set_stylebox("grabber", "HScrollBar", h_grabber_stylebox)
var h_grabber_stylebox_hover := h_stylebox.duplicate()
- h_grabber_stylebox_hover.bg_color = scrollbar_hover_color
+ h_grabber_stylebox_hover.bg_color = intermediate_hover_color
theme.set_stylebox("grabber_highlight", "HScrollBar", h_grabber_stylebox_hover)
var h_grabber_stylebox_pressed := h_stylebox.duplicate()
@@ -822,9 +1081,9 @@ static func _setup_scrollbar(theme: Theme) -> void:
var h_scroll_stylebox := StyleBoxFlat.new()
h_scroll_stylebox.set_corner_radius_all(3)
- h_scroll_stylebox.content_margin_top = 8
- h_scroll_stylebox.content_margin_bottom = 8
- h_scroll_stylebox.bg_color = scrollbar_background_color
+ h_scroll_stylebox.content_margin_top = 8.0
+ h_scroll_stylebox.content_margin_bottom = 8.0
+ h_scroll_stylebox.bg_color = softer_base_color
theme.set_stylebox("scroll", "HScrollBar", h_scroll_stylebox)
theme.add_type("VScrollBar")
@@ -834,11 +1093,11 @@ static func _setup_scrollbar(theme: Theme) -> void:
v_stylebox.content_margin_bottom = 2.0
var v_grabber_stylebox := v_stylebox.duplicate()
- v_grabber_stylebox.bg_color = scrollbar_normal_color
+ v_grabber_stylebox.bg_color = intermediate_color
theme.set_stylebox("grabber", "VScrollBar", v_grabber_stylebox)
var v_grabber_stylebox_hover := v_stylebox.duplicate()
- v_grabber_stylebox_hover.bg_color = scrollbar_hover_color
+ v_grabber_stylebox_hover.bg_color = intermediate_hover_color
theme.set_stylebox("grabber_highlight", "VScrollBar", v_grabber_stylebox_hover)
var v_grabber_stylebox_pressed := v_stylebox.duplicate()
@@ -846,39 +1105,53 @@ static func _setup_scrollbar(theme: Theme) -> void:
theme.set_stylebox("grabber_pressed", "VScrollBar", v_grabber_stylebox_pressed)
var v_scroll_stylebox := StyleBoxFlat.new()
+ # TODO Make the background more coherent, without corners.
v_scroll_stylebox.set_corner_radius_all(3)
- v_scroll_stylebox.content_margin_left = 8
- v_scroll_stylebox.content_margin_right = 8
- v_scroll_stylebox.bg_color = scrollbar_background_color
+ v_scroll_stylebox.content_margin_left = 8.0
+ v_scroll_stylebox.content_margin_right = 8.0
+ v_scroll_stylebox.bg_color = softer_base_color
theme.set_stylebox("scroll", "VScrollBar", v_scroll_stylebox)
static func _setup_separator(theme: Theme) -> void:
theme.add_type("HSeparator")
var stylebox := StyleBoxLine.new()
- stylebox.color = common_panel_border_color
+ stylebox.color = basic_panel_border_color
stylebox.thickness = 2
theme.set_stylebox("separator", "HSeparator", stylebox)
theme.add_type("SmallHSeparator")
theme.set_type_variation("SmallHSeparator", "HSeparator")
var small_stylebox := stylebox.duplicate()
- small_stylebox.color = Color(common_panel_border_color, 0.5)
+ small_stylebox.color = Color(basic_panel_border_color, 0.5)
small_stylebox.grow_begin = -3
small_stylebox.grow_end = -3
theme.set_stylebox("separator", "SmallHSeparator", small_stylebox)
static func _setup_label(theme: Theme) -> void:
theme.add_type("Label")
+ theme.set_color("font_color", "Label", text_color)
+
+ theme.add_type("TitleLabel")
+ theme.set_type_variation("TitleLabel", "Label")
+ theme.set_font_size("font_size", "TitleLabel", 15)
+ theme.set_color("font_color", "TitleLabel", highlighted_text_color)
+
+ theme.add_type("BoldTitleLabel")
+ theme.set_type_variation("BoldTitleLabel", "Label")
+ theme.set_font_size("font_size", "BoldTitleLabel", 16)
+ theme.set_font("font", "BoldTitleLabel", bold_font)
+ theme.set_color("font_color", "BoldTitleLabel", highlighted_text_color)
theme.add_type("RichTextLabel")
- theme.set_color("selection_color", "RichTextLabel", common_selection_color)
+ theme.set_color("default_color", "RichTextLabel", text_color)
+ theme.set_color("selection_color", "RichTextLabel", selection_color)
theme.set_font("bold_font", "RichTextLabel", bold_font)
static func _setup_tabcontainer(theme: Theme) -> void:
theme.add_type("TabContainer")
- theme.set_color("font_unselected_color", "TabContainer", common_dim_text_color)
- theme.set_color("font_hovered_color", "TabContainer", common_text_color)
- theme.set_color("font_selected_color", "TabContainer", common_highlighted_text_color)
+ theme.set_color("font_unselected_color", "TabContainer", dim_text_color)
+ theme.set_color("font_hovered_color", "TabContainer", text_color)
+ theme.set_color("font_selected_color", "TabContainer", highlighted_text_color)
theme.set_constant("side_margin", "TabContainer", 0)
theme.set_font_size("font_size", "TabContainer", 14)
@@ -905,7 +1178,7 @@ static func _setup_tabcontainer(theme: Theme) -> void:
theme.set_stylebox("tab_focus", "TabContainer", StyleBoxEmpty.new())
var tab_hover_stylebox := StyleBoxFlat.new()
- tab_hover_stylebox.bg_color = hovered_tab_color
+ tab_hover_stylebox.bg_color = softer_intermediate_hover_color
tab_hover_stylebox.corner_radius_top_left = 4
tab_hover_stylebox.corner_radius_top_right = 4
tab_hover_stylebox.content_margin_left = 12.0
@@ -925,7 +1198,7 @@ static func _setup_tabcontainer(theme: Theme) -> void:
theme.set_stylebox("tab_selected", "TabContainer", tab_selected_stylebox)
var tab_unselected_stylebox := StyleBoxFlat.new()
- tab_unselected_stylebox.bg_color = normal_tab_color
+ tab_unselected_stylebox.bg_color = softer_intermediate_color
tab_unselected_stylebox.corner_radius_top_left = 4
tab_unselected_stylebox.corner_radius_top_right = 4
tab_unselected_stylebox.content_margin_left = 12.0
@@ -935,7 +1208,7 @@ static func _setup_tabcontainer(theme: Theme) -> void:
theme.set_stylebox("tab_unselected", "TabContainer", tab_unselected_stylebox)
var tabbar_background_stylebox := StyleBoxFlat.new()
- tabbar_background_stylebox.bg_color = tabbar_background_color
+ tabbar_background_stylebox.bg_color = soft_base_color
tabbar_background_stylebox.set_content_margin_all(0)
tabbar_background_stylebox.corner_radius_top_left = 5
tabbar_background_stylebox.corner_radius_top_right = 5
@@ -944,12 +1217,12 @@ static func _setup_tabcontainer(theme: Theme) -> void:
static func _setup_textedit(theme: Theme) -> void:
theme.add_type("TextEdit")
theme.set_color("caret_color", "TextEdit", Color.TRANSPARENT)
- theme.set_color("selection_color", "TextEdit", common_selection_color)
+ theme.set_color("selection_color", "TextEdit", selection_color)
theme.set_font_size("font_size", "TextEdit", 12)
theme.set_font("font", "TextEdit", mono_font)
var normal_stylebox := StyleBoxFlat.new()
- normal_stylebox.bg_color = line_edit_background_color
+ normal_stylebox.bg_color = line_edit_inner_color
normal_stylebox.border_color = line_edit_normal_border_color
normal_stylebox.set_border_width_all(2)
normal_stylebox.set_corner_radius_all(5)
@@ -965,7 +1238,8 @@ static func _setup_textedit(theme: Theme) -> void:
var hover_stylebox := StyleBoxFlat.new()
hover_stylebox.draw_center = false
- hover_stylebox.border_color = line_edit_hover_border_overlay_color
+ hover_stylebox.border_color = strong_hover_overlay_color if is_theme_dark else\
+ stronger_hover_overlay_color
hover_stylebox.set_border_width_all(2)
hover_stylebox.set_corner_radius_all(5)
theme.set_stylebox("hover", "TextEdit", hover_stylebox)
@@ -973,8 +1247,8 @@ static func _setup_textedit(theme: Theme) -> void:
static func _setup_tooltip(theme: Theme) -> void:
theme.add_type("TooltipPanel")
var stylebox := StyleBoxFlat.new()
- stylebox.bg_color = common_panel_inner_color
- stylebox.border_color = common_panel_border_color
+ stylebox.bg_color = basic_panel_inner_color
+ stylebox.border_color = basic_panel_border_color
stylebox.set_border_width_all(2)
stylebox.set_corner_radius_all(2)
stylebox.content_margin_left = 6.0
@@ -984,10 +1258,21 @@ static func _setup_tooltip(theme: Theme) -> void:
theme.set_stylebox("panel", "TooltipPanel", stylebox)
theme.add_type("TooltipLabel")
- theme.set_color("font_color", "TooltipLabel", common_text_color)
+ theme.set_color("font_color", "TooltipLabel", text_color)
theme.set_font_size("font_size", "TooltipLabel", 14)
theme.set_font("font", "TooltipLabel", regular_font)
-
-static func _icon(name: String) -> Texture2D:
- return load("res://assets/icons/theme/" + name + ".svg")
+static func _setup_splitcontainer(theme: Theme) -> void:
+ theme.add_type("SplitContainer")
+ theme.set_icon("grabber", "VSplitContainer",
+ SVGTexture.create_from_string("""
+ """ % desaturated_color.to_html(false))
+ )
+ theme.set_icon("grabber", "HSplitContainer",
+ SVGTexture.create_from_string("""
+ """ % desaturated_color.to_html(false))
+ )
diff --git a/src/utils/TranslationUtils.gd b/src/utils/TranslationUtils.gd
index 34ee248..6580287 100644
--- a/src/utils/TranslationUtils.gd
+++ b/src/utils/TranslationUtils.gd
@@ -1,4 +1,4 @@
-class_name TranslationUtils extends RefCounted
+@abstract class_name TranslationUtils
static func _get_locale_name(locale: String) -> String:
match locale:
diff --git a/src/utils/Translator.gd b/src/utils/Translator.gd
index d24dcc1..743e5f7 100644
--- a/src/utils/Translator.gd
+++ b/src/utils/Translator.gd
@@ -1,6 +1,6 @@
# A wrapper around basic TranslationServer methods. There is an update_translations script
# which checks all Translator methods used across the codebase to collect their strings.
-class_name Translator extends RefCounted
+@abstract class_name Translator
static func translate(string: String) -> String:
return TranslationServer.translate(string)
diff --git a/src/utils/Utils.gd b/src/utils/Utils.gd
index 98761d6..0c82c50 100644
--- a/src/utils/Utils.gd
+++ b/src/utils/Utils.gd
@@ -1,4 +1,4 @@
-class_name Utils extends RefCounted
+@abstract class_name Utils
const MAX_NUMERIC_PRECISION = 6
const MAX_ANGLE_PRECISION = 4
diff --git a/src/utils/Utils64Bit.gd b/src/utils/Utils64Bit.gd
index d327f8c..00900f6 100644
--- a/src/utils/Utils64Bit.gd
+++ b/src/utils/Utils64Bit.gd
@@ -1,7 +1,7 @@
# Vector2 and Transform2D aren't precise enough to have their numbers used directly
# in the SVG, as they are 32-bit. GodSVG uses PackedFloat64Array to mock them
# and this class implements the necessary functionality to make them work.
-class_name Utils64Bit extends RefCounted
+@abstract class_name Utils64Bit
static func get_vector(vector: PackedFloat64Array) -> Vector2:
return Vector2(vector[0], vector[1])
diff --git a/src/utils/XIDUtils.gd b/src/utils/XIDUtils.gd
index fde5294..8db32bd 100644
--- a/src/utils/XIDUtils.gd
+++ b/src/utils/XIDUtils.gd
@@ -1,4 +1,4 @@
-class_name XIDUtils extends RefCounted
+@abstract class_name XIDUtils
# [1] > [1, 2] > [1, 0] > [0]
static func compare(xid1: PackedInt32Array, xid2: PackedInt32Array) -> bool:
diff --git a/src/utils/XNodeChildrenBuilder.gd b/src/utils/XNodeChildrenBuilder.gd
index d33cdcb..b6d6d93 100644
--- a/src/utils/XNodeChildrenBuilder.gd
+++ b/src/utils/XNodeChildrenBuilder.gd
@@ -1,4 +1,4 @@
-class_name XNodeChildrenBuilder
+@abstract class_name XNodeChildrenBuilder
const ElementFrameScene = preload("res://src/ui_widgets/element_frame.tscn")
const BasicXNodeFrameScene = preload("res://src/ui_widgets/basic_xnode_frame.tscn")
diff --git a/translations/GodSVG.pot b/translations/GodSVG.pot
index 1d73b22..dbedc76 100644
--- a/translations/GodSVG.pot
+++ b/translations/GodSVG.pot
@@ -31,9 +31,7 @@ msgid "Check for updates?"
msgstr ""
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
msgstr ""
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
@@ -54,14 +52,11 @@ msgid "Export"
msgstr ""
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
msgstr ""
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
+msgid "The graphic can be exported only as SVG because its size is not defined."
msgstr ""
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
@@ -94,9 +89,7 @@ msgid "The last edited state of this tab could not be found."
msgstr ""
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
msgstr ""
#: src/config_classes/Formatter.gd:
@@ -135,6 +128,29 @@ msgstr ""
msgid "6-digit hex"
msgstr ""
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Light"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr ""
@@ -155,24 +171,24 @@ msgstr ""
msgid "{element} must be inside {allowed} to have any effect."
msgstr ""
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
+#: src/data_classes/ElementBaseGradient.gd:
+msgid "No \"id\" attribute defined."
msgstr ""
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
+#: src/data_classes/ElementBaseGradient.gd:
+msgid "No elements under this gradient."
msgstr ""
-#: src/data_classes/GradientUtils.gd:
-msgid "No \"id\" attribute defined."
+#: src/data_classes/ElementBaseGradient.gd:
+msgid "This gradient is a solid color."
msgstr ""
-#: src/data_classes/GradientUtils.gd:
-msgid "No elements under this gradient."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
msgstr ""
-#: src/data_classes/GradientUtils.gd:
-msgid "This gradient is a solid color."
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
msgstr ""
#: src/data_classes/SVGParser.gd:
@@ -205,6 +221,7 @@ msgstr ""
msgid "Third-party licenses"
msgstr ""
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr ""
@@ -259,7 +276,7 @@ msgstr ""
msgid "Dimensions"
msgstr ""
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr ""
@@ -283,7 +300,7 @@ msgstr ""
msgid "Scale"
msgstr ""
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr ""
@@ -364,9 +381,7 @@ msgid "Copy path"
msgstr ""
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
msgstr ""
#: src/ui_parts/handles_manager.gd:
@@ -450,10 +465,30 @@ msgstr ""
msgid "Other"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Theme preset"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Base color"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Accent color"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr ""
@@ -487,9 +522,9 @@ msgstr ""
msgid "Error color"
msgstr ""
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
+msgid "Handles"
msgstr ""
#: src/ui_parts/settings_menu.gd:
@@ -512,12 +547,29 @@ msgstr ""
msgid "Hovered selected color"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Selection rectangle"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Color {index}"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
+msgid "Canvas color"
msgstr ""
#: src/ui_parts/settings_menu.gd:
@@ -540,41 +592,81 @@ msgstr ""
msgid "Close tabs with middle mouse button"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Miscellaneous"
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Use native file dialog"
+msgid "Display"
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
+msgid "UI scale"
msgstr ""
-#. Refers to the size of the draggable handles.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
+msgid "Determines the scale factor for the interface."
msgstr ""
+#. Stands for "Vertical Synchronization".
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Use native file dialog"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Sync window title to file name"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
msgstr ""
#: src/ui_parts/settings_menu.gd:
@@ -611,10 +703,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr ""
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr ""
@@ -707,43 +795,6 @@ msgstr ""
msgid "Remove unnecessary parameters"
msgstr ""
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr ""
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr ""
@@ -833,6 +884,10 @@ msgstr ""
msgid "Unnamed"
msgstr ""
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr ""
@@ -898,6 +953,14 @@ msgstr ""
msgid "Also used by"
msgstr ""
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr ""
diff --git a/translations/bg.po b/translations/bg.po
index bd04d9f..5cc9353 100644
--- a/translations/bg.po
+++ b/translations/bg.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Провери за ъпдейти?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Това ще се свърже с github.com за да сравни числата на версиите. Не се "
-"събират или изпращат никакви други данни."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Това ще се свърже с github.com за да сравни числата на версиите. Не се събират или изпращат никакви други данни."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,19 +53,12 @@ msgid "Export"
msgstr "Експортирай"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Графиката може да бъде експортирана само като SVG защото височината и "
-"широчината са твърде различни."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Графиката може да бъде експортирана само като SVG защото височината и широчината са твърде различни."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Графиката може да бъде експортирана само като SVG защото размерът не е "
-"определен."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Графиката може да бъде експортирана само като SVG защото размерът не е определен."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -101,12 +90,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "Последното състояние на този раздел не беше намерено."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"Този раздел е свързан с пътеката {file_path}. Искаш ли да го възстановиш SVG-"
-"то от тази пътека?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "Този раздел е свързан с пътеката {file_path}. Искаш ли да го възстановиш SVG-то от тази пътека?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -144,6 +129,29 @@ msgstr "Хекс с 3 или 6 цифри"
msgid "6-digit hex"
msgstr "Хекс с 6 цифри"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr "Тъмна"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Light"
+msgstr "Светла"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr "Черна (OLED)"
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr "Тъмна по подразбиране"
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr "Светла по подразбиране"
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Празен"
@@ -164,26 +172,26 @@ msgstr "Текст"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} трябва да е във {allowed} за да има ефект."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Тази група няма елементи."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Тази група има само един елемент."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Не е дефиниран \"id\" атрибут."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Няма елемент под този градиент."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Този градиент е едноцветен."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Тази група няма елементи."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Тази група има само един елемент."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Текстът не описва SVG."
@@ -214,6 +222,7 @@ msgstr "Лиценз"
msgid "Third-party licenses"
msgstr "Лицензи от трети партии"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Основател и мениджър на проекта"
@@ -268,7 +277,7 @@ msgstr "Добави елемент"
msgid "Dimensions"
msgstr "Измерения"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Размер"
@@ -292,7 +301,7 @@ msgstr "Качество"
msgid "Scale"
msgstr "Мащаб"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Широчина"
@@ -373,12 +382,8 @@ msgid "Copy path"
msgstr "Копирай пътеката"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Файл с името \"{file_name}\" вече съществува. Заместването ще пренапише "
-"неговото съдържание!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Файл с името \"{file_name}\" вече съществува. Заместването ще пренапише неговото съдържание!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -461,10 +466,30 @@ msgstr "Лента с раздели"
msgid "Other"
msgstr "Други"
+#: src/ui_parts/settings_menu.gd:
+msgid "Theme preset"
+msgstr "Шаблон на тема"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr "Основни цветове на темата"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Base color"
+msgstr "Базов цвят"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Accent color"
+msgstr "Акцентен цвят"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "Цветове на SVG текста"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr "Шаблон на синтаксово маркиране"
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Цвят на символите"
@@ -498,10 +523,10 @@ msgstr "Цвят на CDATA"
msgid "Error color"
msgstr "Цвят на грешките"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Цвят на дръжките"
+msgid "Handles"
+msgstr "Дръжки"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -523,13 +548,30 @@ msgstr "Избран цвят"
msgid "Hovered selected color"
msgstr "Избран цвят под курсора"
+#: src/ui_parts/settings_menu.gd:
+msgid "Selection rectangle"
+msgstr "Правоъгълник за селекцията"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr "Скорост"
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr "Дължина на чертичките"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Color {index}"
+msgstr "Цвят {index}"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Основни цветове"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Цвят на задния фон"
+msgid "Canvas color"
+msgstr "Цвят на платното"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -551,18 +593,63 @@ msgstr "Входни сигнали"
msgid "Close tabs with middle mouse button"
msgstr "Затваряне на раздели със средното копче на мишката"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Когато е включено, натискането на раздел със средното копче на мишката затваря раздела. Ако е изключено, средното копче фокусира раздела."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Обърни посоката на увеличение"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Разменя посоките на влачене за намаляване и увеличаване"
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Превъртане на курсора"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Превърта курсора когато той достигне краищата на екрана докато влачи гледката."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Използвай CTRL за увеличение"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Когато е включено, влаченето премества гледката. За увеличение, натисни CTRL докато влачиш."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr "Дисплей"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Мащаб на интерфейса"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the scale factor for the interface."
+msgstr "Определя мащаба на интерфейса."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr "Вертикална синхронизация"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr "Синхронизира рендирането с честотата на опресняване на дисплея, за да предотврати артефакти от разкъсване на екранното изображение. Може леко да забави входните сигнали."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr "Максимални кадри в секунда"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr "Определя максималния брой кадри в секунда."
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Разни"
@@ -572,21 +659,16 @@ msgid "Use native file dialog"
msgstr "Използвай местния файлов мениджър"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Синхронизирай името на прозореца с файла"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Размер на дръжките"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Когато е включено, ще бъде използван файловият мениджър на твоята операционна система. Ако е изключено, използва вградения файлов мениджър на GodSVG."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Мащаб на интерфейса"
+msgid "Sync window title to file name"
+msgstr "Синхронизирай името на прозореца с файла"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Увеличава мащаба на интерфейса."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Когато е изключено, името на прозореца остава \"GodSVG\" без да включва настоящия файл."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -622,10 +704,6 @@ msgstr "Форматировач за експортиране"
msgid "Help"
msgstr "Помощ"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Възстанови всички до началната стойност"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Шаблон"
@@ -718,54 +796,6 @@ msgstr "Поредици от трансформации"
msgid "Remove unnecessary parameters"
msgstr "Премахни ненужните параметри"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Когато е включено, натискането на раздел със средното копче на мишката "
-"затваря раздела. Ако е изключено, средното копче фокусира раздела."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Разменя посоките на влачене за намаляване и увеличаване"
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Превърта курсора когато той достигне краищата на екрана докато влачи "
-"гледката."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Когато е включено, влаченето премества гледката. За увеличение, натисни CTRL "
-"докато влачиш."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Когато е включено, ще бъде използван файловият мениджър на твоята "
-"операционна система. Ако е изключено, използва вградения файлов мениджър на "
-"GodSVG."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Когато е изключено, името на прозореца остава \"GodSVG\" без да включва "
-"настоящия файл."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Увеличава размера и площта в която дръжките могат да бъдат хванати."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Хоризонтална лента"
@@ -855,6 +885,10 @@ msgstr "Изтрий цвета"
msgid "Unnamed"
msgstr "Неименуван"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr "Неограничено"
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Ключови цветове"
@@ -920,6 +954,14 @@ msgstr "Няма точки"
msgid "Also used by"
msgstr "Използва се също от..."
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr "Приложи"
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr "Приложи всички настройки по подразбиране на този шаблон"
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Възстанови началната стойност"
@@ -1014,9 +1056,7 @@ msgstr "{file_path} вече се редактира в GodSVG."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Ако искаш да премахнеш промените след последното записване, използвай "
-"{reset_svg}."
+msgstr "Ако искаш да премахнеш промените след последното записване, използвай {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
diff --git a/translations/de.po b/translations/de.po
index 66d64e0..31b5f41 100644
--- a/translations/de.po
+++ b/translations/de.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Nach Aktualisierungen suchen?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Dadurch wird eine Verbindung zu github.com hergestellt, um Versionsnummern "
-"zu vergleichen. Es werden keine weiteren Daten gesammelt oder übertragen."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Dadurch wird eine Verbindung zu github.com hergestellt, um Versionsnummern zu vergleichen. Es werden keine weiteren Daten gesammelt oder übertragen."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,19 +53,12 @@ msgid "Export"
msgstr "Exportieren"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Die Grafik kann nur als SVG exportiert werden, da ihre Proportionen zu "
-"extrem sind."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Die Grafik kann nur als SVG exportiert werden, da ihre Proportionen zu extrem sind."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Die Grafik kann nur als SVG exportiert werden, da ihre Größe nicht definiert "
-"ist."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Die Grafik kann nur als SVG exportiert werden, da ihre Größe nicht definiert ist."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -98,17 +87,11 @@ msgstr "Danach einsetzen"
#: src/autoload/State.gd:
msgid "The last edited state of this tab could not be found."
-msgstr ""
-"Der letzte Bearbeitungsstand dieser Registerkarte konnte nicht gefunden "
-"werden."
+msgstr "Der letzte Bearbeitungsstand dieser Registerkarte konnte nicht gefunden werden."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"Die Registerkarte ist an den Dateipfad {file_path} gebunden. Möchten Sie die "
-"SVG-Datei aus diesem Pfad wiederherstellen?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "Die Registerkarte ist an den Dateipfad {file_path} gebunden. Möchten Sie die SVG-Datei aus diesem Pfad wiederherstellen?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -146,6 +129,30 @@ msgstr "3-stelligen oder 6-stelligen Hex"
msgid "6-digit hex"
msgstr "6-stelligen Hex"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Höhe"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Leer"
@@ -164,29 +171,28 @@ msgstr "Text"
#: src/data_classes/Element.gd:
msgid "{element} must be inside {allowed} to have any effect."
-msgstr ""
-"{element} muss sich innerhalb {allowed} befinden, um einen Effekt zu haben."
+msgstr "{element} muss sich innerhalb {allowed} befinden, um einen Effekt zu haben."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Diese Gruppe hat keine Elemente."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Diese Gruppe hat nur ein Element."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Kein \"id\" Attribut definiert."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Keine Elemente unter diesem Farbverlauf."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Dieser Farbverlauf ist einfarbig."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Diese Gruppe hat keine Elemente."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Diese Gruppe hat nur ein Element."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Beschreibt kein SVG."
@@ -217,6 +223,7 @@ msgstr "Lizenz"
msgid "Third-party licenses"
msgstr "Drittanbieter-Lizenzen"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Projektgründer und Manager"
@@ -271,7 +278,7 @@ msgstr "Neues Element"
msgid "Dimensions"
msgstr "Dimensionen"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Größe"
@@ -295,7 +302,7 @@ msgstr "Qualität"
msgid "Scale"
msgstr "Skalieren"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Breite"
@@ -376,12 +383,8 @@ msgid "Copy path"
msgstr "Pfad kopieren"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Eine Datei mit dem Namen \"{file_name}\" existiert bereits. Ersetzen wird "
-"den Inhalt überschreiben!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Eine Datei mit dem Namen \"{file_name}\" existiert bereits. Ersetzen wird den Inhalt überschreiben!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -464,10 +467,34 @@ msgstr "Tableiste"
msgid "Other"
msgstr "Anderes"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Zoom zurücksetzen"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Primary theme colors"
+msgstr "Farbe deaktivieren"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Allgemeine Farben"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Textfarbe"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "SVG Textfarben"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Symbolfarbe"
@@ -501,10 +528,11 @@ msgstr "CDATA-Farbe"
msgid "Error color"
msgstr "Fehlerfarbe"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Grifffarbe"
+#, fuzzy
+msgid "Handles"
+msgstr "Griffgröße"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -526,13 +554,33 @@ msgstr "Auswahlfarbe"
msgid "Hovered selected color"
msgstr "Ausgewählte Farbe unter der Maus"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Bild auswählen"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Farbauswahl"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Allgemeine Farben"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Hintergrundfarben"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Innenfarbe"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -554,18 +602,64 @@ msgstr "Eingabe"
msgid "Close tabs with middle mouse button"
msgstr "Registerkarten mit mittlerer Maustaste schließen"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Wenn diese Option aktiviert ist, wird die Registerkarte durch Anklicken mit der mittleren Maustaste geschlossen. Wenn diese Option ausgeschaltet ist, wird die Registerkarte stattdessen fokussiert."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Zoomrichtung umkehren"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Tauscht die Scrollrichtung für das Rein- und Rauszoomen."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Herumwickelndes Verschieben"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Teleportiert den Mauszeiger zur gegenüberliegenden Seite, soblald eine Bildschirmgrenze während des Verschiebens erreicht wird."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Strg-Taste zum Zoomen benutzen"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Wenn diese Option aktiviert ist, wird die Ansicht durch Scrollen verschoben. Um zu zoomen muss beim Scrollen die STRG-Taste gedrückt werden."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Benutzeroberflächenskalierung"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "Verändert den Skalierungsfaktor der Benutzeroberfläche."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Verschiedenes"
@@ -575,21 +669,16 @@ msgid "Use native file dialog"
msgstr "Nativen Dateidialog verwenden"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Fenstertitel mit Dateinamen synchronisieren"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Griffgröße"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Wenn diese Option aktiviert ist, wird der Dateidialog des Betriebssystems verwendet. Wenn diese Option deaktiviert ist, wird GodSVG's eingebauter Dateidialog verwendet."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Benutzeroberflächenskalierung"
+msgid "Sync window title to file name"
+msgstr "Fenstertitel mit Dateinamen synchronisieren"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Verändert den Skalierungsfaktor der Benutzeroberfläche."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Wenn diese Option deaktiviert ist, bleibt der Fenstertitel \"GodSVG\", ohne die aktuelle Datei anzuzeigen."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -625,10 +714,6 @@ msgstr "Export-Formatierer"
msgid "Help"
msgstr "Hilfe"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Alle auf Standardeinstellung zurücksetzen"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Voreinstellung"
@@ -721,55 +806,6 @@ msgstr "Transformationlisten"
msgid "Remove unnecessary parameters"
msgstr "Unnötige Parameter entfernen"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Wenn diese Option aktiviert ist, wird die Registerkarte durch Anklicken mit "
-"der mittleren Maustaste geschlossen. Wenn diese Option ausgeschaltet ist, "
-"wird die Registerkarte stattdessen fokussiert."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Tauscht die Scrollrichtung für das Rein- und Rauszoomen."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Teleportiert den Mauszeiger zur gegenüberliegenden Seite, soblald eine "
-"Bildschirmgrenze während des Verschiebens erreicht wird."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Wenn diese Option aktiviert ist, wird die Ansicht durch Scrollen verschoben. "
-"Um zu zoomen muss beim Scrollen die STRG-Taste gedrückt werden."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Wenn diese Option aktiviert ist, wird der Dateidialog des Betriebssystems "
-"verwendet. Wenn diese Option deaktiviert ist, wird GodSVG's eingebauter "
-"Dateidialog verwendet."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Wenn diese Option deaktiviert ist, bleibt der Fenstertitel \"GodSVG\", ohne "
-"die aktuelle Datei anzuzeigen."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Erhöht die visuelle Größe und den Interaktionsbereich von Griffen."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Horizontaler Streifen"
@@ -859,6 +895,10 @@ msgstr "Farbe löschen"
msgid "Unnamed"
msgstr "Unbenannt"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Farbschlüsselwörter"
@@ -924,6 +964,14 @@ msgstr "Keine Punkte"
msgid "Also used by"
msgstr "Auch genutzt von"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Zurücksetzen"
@@ -1018,9 +1066,7 @@ msgstr "{file_path} wird bereits in GodSVG bearbeitet."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Wenn Sie Ihre Änderungen seit dem letzten Speichern rückgängig machen "
-"wollen, verwenden Sie {reset_svg}."
+msgstr "Wenn Sie Ihre Änderungen seit dem letzten Speichern rückgängig machen wollen, verwenden Sie {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1327,12 +1373,21 @@ msgstr "Die {format}-Datei speichern"
msgid "Only {extension_list} files are supported for this operation."
msgstr "Nur {extension_list}-Dateien werden für diese Operation unterstützt."
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "Die Dateierweiterung \"{extension}\" ist für diese Operation nicht "
-#~ "unterstützt. Nur {extension_list} Dateien werden unterstützt."
+#~ msgid "Handle colors"
+#~ msgstr "Grifffarbe"
+
+#~ msgid "Background color"
+#~ msgstr "Hintergrundfarben"
+
+#~ msgid "Reset all to default"
+#~ msgstr "Alle auf Standardeinstellung zurücksetzen"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Erhöht die visuelle Größe und den Interaktionsbereich von Griffen."
+
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "Die Dateierweiterung \"{extension}\" ist für diese Operation nicht unterstützt. Nur {extension_list} Dateien werden unterstützt."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Die .\"{format}\" Datei speichern"
@@ -1358,19 +1413,14 @@ msgstr "Nur {extension_list}-Dateien werden für diese Operation unterstützt."
#~ msgid "Save as"
#~ msgstr "Speichern als"
-#~ msgid ""
-#~ "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
-#~ msgstr ""
-#~ "Wenn Sie den ungespeicherten Dateizustand anwenden möchten, benutzen sie "
-#~ "stattdessen \"SVG zurücksetzen\"."
+#~ msgid "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
+#~ msgstr "Wenn Sie den ungespeicherten Dateizustand anwenden möchten, benutzen sie stattdessen \"SVG zurücksetzen\"."
#~ msgid "Auto UI scale"
#~ msgstr "Automatische Benutzeroberflächenskalierung"
#~ msgid "Scales the interface automatically based on the screen size."
-#~ msgstr ""
-#~ "Skaliert die Benutzeroberfläche automatisch basierend auf der "
-#~ "Bildschirmgröße."
+#~ msgstr "Skaliert die Benutzeroberfläche automatisch basierend auf der Bildschirmgröße."
#~ msgid "Wrap mouse"
#~ msgstr "Maus einschließen"
@@ -1407,9 +1457,6 @@ msgstr "Nur {extension_list}-Dateien werden für diese Operation unterstützt."
#~ msgid "Enable the color"
#~ msgstr "Farbe aktivieren"
-#~ msgid "Disable the color"
-#~ msgstr "Farbe deaktivieren"
-
#~ msgid "Invalid"
#~ msgstr "Ungültig"
@@ -1418,12 +1465,10 @@ msgstr "Nur {extension_list}-Dateien werden für diese Operation unterstützt."
#~ msgid ""
#~ "The file couldn't be opened.\n"
-#~ "Try checking the file path, ensure that the file is not deleted, or "
-#~ "choose a different file."
+#~ "Try checking the file path, ensure that the file is not deleted, or choose a different file."
#~ msgstr ""
#~ "Die Datei konnte nicht geöffnet werden.\n"
-#~ "Überprüfe den Dateipfad, ob die Datei existiert, oder wähle eine andere "
-#~ "Datei."
+#~ "Überprüfe den Dateipfad, ob die Datei existiert, oder wähle eine andere Datei."
#~ msgid "Enable snap"
#~ msgstr "Einrasten aktivieren"
diff --git a/translations/en.po b/translations/en.po
index 0c69444..6fc2741 100644
--- a/translations/en.po
+++ b/translations/en.po
@@ -32,9 +32,7 @@ msgid "Check for updates?"
msgstr ""
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
msgstr ""
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
@@ -55,14 +53,11 @@ msgid "Export"
msgstr ""
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
msgstr ""
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
+msgid "The graphic can be exported only as SVG because its size is not defined."
msgstr ""
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
@@ -95,9 +90,7 @@ msgid "The last edited state of this tab could not be found."
msgstr ""
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
msgstr ""
#: src/config_classes/Formatter.gd:
@@ -136,6 +129,29 @@ msgstr ""
msgid "6-digit hex"
msgstr ""
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Light"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr ""
@@ -156,24 +172,24 @@ msgstr ""
msgid "{element} must be inside {allowed} to have any effect."
msgstr ""
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
+#: src/data_classes/ElementBaseGradient.gd:
+msgid "No \"id\" attribute defined."
msgstr ""
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
+#: src/data_classes/ElementBaseGradient.gd:
+msgid "No elements under this gradient."
msgstr ""
-#: src/data_classes/GradientUtils.gd:
-msgid "No \"id\" attribute defined."
+#: src/data_classes/ElementBaseGradient.gd:
+msgid "This gradient is a solid color."
msgstr ""
-#: src/data_classes/GradientUtils.gd:
-msgid "No elements under this gradient."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
msgstr ""
-#: src/data_classes/GradientUtils.gd:
-msgid "This gradient is a solid color."
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
msgstr ""
#: src/data_classes/SVGParser.gd:
@@ -206,6 +222,7 @@ msgstr ""
msgid "Third-party licenses"
msgstr ""
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr ""
@@ -260,7 +277,7 @@ msgstr ""
msgid "Dimensions"
msgstr ""
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr ""
@@ -284,7 +301,7 @@ msgstr ""
msgid "Scale"
msgstr ""
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr ""
@@ -365,9 +382,7 @@ msgid "Copy path"
msgstr ""
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
msgstr ""
#: src/ui_parts/handles_manager.gd:
@@ -451,10 +466,30 @@ msgstr ""
msgid "Other"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Theme preset"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Base color"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Accent color"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr ""
@@ -488,9 +523,9 @@ msgstr ""
msgid "Error color"
msgstr ""
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
+msgid "Handles"
msgstr ""
#: src/ui_parts/settings_menu.gd:
@@ -513,12 +548,29 @@ msgstr ""
msgid "Hovered selected color"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Selection rectangle"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Color {index}"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
+msgid "Canvas color"
msgstr ""
#: src/ui_parts/settings_menu.gd:
@@ -541,41 +593,81 @@ msgstr ""
msgid "Close tabs with middle mouse button"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Miscellaneous"
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Use native file dialog"
+msgid "Display"
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
+msgid "UI scale"
msgstr ""
-#. Refers to the size of the draggable handles.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
+msgid "Determines the scale factor for the interface."
msgstr ""
+#. Stands for "Vertical Synchronization".
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
msgstr ""
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Use native file dialog"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Sync window title to file name"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
msgstr ""
#: src/ui_parts/settings_menu.gd:
@@ -612,10 +704,6 @@ msgstr ""
msgid "Help"
msgstr ""
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr ""
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr ""
@@ -708,43 +796,6 @@ msgstr ""
msgid "Remove unnecessary parameters"
msgstr ""
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr ""
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr ""
@@ -834,6 +885,10 @@ msgstr ""
msgid "Unnamed"
msgstr ""
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr ""
@@ -899,6 +954,14 @@ msgstr ""
msgid "Also used by"
msgstr ""
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr ""
diff --git a/translations/es.po b/translations/es.po
index a745039..553b1e6 100644
--- a/translations/es.po
+++ b/translations/es.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "¿Buscar actualizaciones?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Esto se conectará a github.com para comparar los números de versión. No se "
-"recopilan ni transmiten otros datos."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Esto se conectará a github.com para comparar los números de versión. No se recopilan ni transmiten otros datos."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,18 +53,12 @@ msgid "Export"
msgstr "Exportar"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"El gráfico solo se puede exportar como SVG porque sus proporciones son "
-"demasiado extremas."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "El gráfico solo se puede exportar como SVG porque sus proporciones son demasiado extremas."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"El gráfico solo se puede exportar como SVG porque su tamaño no está definido."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "El gráfico solo se puede exportar como SVG porque su tamaño no está definido."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -100,12 +90,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "No se pudo encontrar el último estado editado de esta pestaña."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"La pestaña está vinculada a la ruta del archivo {file_path}. ¿Quieres "
-"restaurar el SVG desde esta ruta?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "La pestaña está vinculada a la ruta del archivo {file_path}. ¿Quieres restaurar el SVG desde esta ruta?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -143,6 +129,30 @@ msgstr "Hexadecimal de 3 o 6 dígitos"
msgid "6-digit hex"
msgstr "Hexadecimal de 6 dígitos"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Alto"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Vacío"
@@ -163,26 +173,26 @@ msgstr "Texto"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} debe estar dentro de {allowed} para tener algún efecto."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Este grupo no tiene elementos."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Este grupo solo tiene un elemento."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "No hay ningún atributo \"id\" definido."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "No hay elementos en este gradiente."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Este gradiente es un color sólido."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Este grupo no tiene elementos."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Este grupo solo tiene un elemento."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "No describe un SVG."
@@ -213,6 +223,7 @@ msgstr "Licencia"
msgid "Third-party licenses"
msgstr "Licencias de terceros"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Fundador y administrador del proyecto"
@@ -267,7 +278,7 @@ msgstr "Nuevo elemento"
msgid "Dimensions"
msgstr "Dimensiones"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Tamaño"
@@ -291,7 +302,7 @@ msgstr "Calidad"
msgid "Scale"
msgstr "Escala"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Ancho"
@@ -372,12 +383,8 @@ msgid "Copy path"
msgstr "Copiar ruta"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Ya existe un archivo llamado \"{file_name}\". ¡Reemplazarlo sobrescribirá su "
-"contenido!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Ya existe un archivo llamado \"{file_name}\". ¡Reemplazarlo sobrescribirá su contenido!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -460,10 +467,33 @@ msgstr "Barra de pestañas"
msgid "Other"
msgstr "Otro"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Reestablecer el zoom"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Colores básicos"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Color del texto"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "Colores del texto de los SVG"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Color de los símbolos"
@@ -497,10 +527,11 @@ msgstr "Color de CDATA"
msgid "Error color"
msgstr "Color de los errores"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Colores de los controladores"
+#, fuzzy
+msgid "Handles"
+msgstr "Tamaño de los controladores"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -522,13 +553,33 @@ msgstr "Color seleccionado"
msgid "Hovered selected color"
msgstr "Color flotante seleccionado"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Selecciona una imagen"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Cuentagotas"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Colores básicos"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Color del fondo"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Color interno"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -550,18 +601,65 @@ msgstr "Entrada"
msgid "Close tabs with middle mouse button"
msgstr "Cerrar pestañas con el botón central del ratón"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Si está activado, al hacer clic en una pestaña con el botón central del ratón, esta se cierra. Si está desactivado, se centra en la pestaña."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Invertir dirección de zoom"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Intercambia las direcciones de desplazamiento para acercar y alejar."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Desplazamiento envolvente"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Mueve el cursor hacia el lado opuesto cada vez que alcanza el límite de la ventana gráfica mientras se desplaza."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Usar Ctrl para hacer zoom"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Si está activado, el desplazamiento panorámico permite ver la vista panorámica. Para hacer zoom, mantén presionada la tecla Ctrl mientras te desplazas."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr "Visualización"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Escala de la interfaz de usuario"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the scale factor for the interface."
+msgstr "Determina el factor de escala de la interfaz."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Maximum FPS"
+msgstr "FPS máximos personalizados"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the maximum number of frames per second."
+msgstr "Si la velocidad de fotogramas está limitada, este valor determina la cantidad máxima de fotogramas por segundo."
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Misceláneos"
@@ -571,21 +669,16 @@ msgid "Use native file dialog"
msgstr "Usar diálogo de archivos nativo"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Sincronizar título de la ventana con el nombre del archivo"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Si está activado, usa el cuadro de diálogo de archivos nativo de tu sistema operativo. Si está desactivado, usa el cuadro de diálogo de archivos integrado de GodSVG."
-#. Refers to the size of the draggable handles.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Tamaño de los controladores"
-
-#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Escala de la interfaz de usuario"
+msgid "Sync window title to file name"
+msgstr "Sincronizar título de la ventana con el nombre del archivo"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Cambia el factor de escala de la interfaz."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Si está desactivado, el título de la ventana permanece como \"GodSVG\" sin incluir el archivo actual."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -621,10 +714,6 @@ msgstr "Formato de exportación"
msgid "Help"
msgstr "Ayuda"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Restablecer todo a los valores predeterminados"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Preajuste"
@@ -717,55 +806,6 @@ msgstr "Transformar listas"
msgid "Remove unnecessary parameters"
msgstr "Eliminar parámetros innecesarios"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Si está activado, al hacer clic en una pestaña con el botón central del "
-"ratón, esta se cierra. Si está desactivado, se centra en la pestaña."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Intercambia las direcciones de desplazamiento para acercar y alejar."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Mueve el cursor hacia el lado opuesto cada vez que alcanza el límite de la "
-"ventana gráfica mientras se desplaza."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Si está activado, el desplazamiento panorámico permite ver la vista "
-"panorámica. Para hacer zoom, mantén presionada la tecla Ctrl mientras te "
-"desplazas."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Si está activado, usa el cuadro de diálogo de archivos nativo de tu sistema "
-"operativo. Si está desactivado, usa el cuadro de diálogo de archivos "
-"integrado de GodSVG."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Si está desactivado, el título de la ventana permanece como \"GodSVG\" sin "
-"incluir el archivo actual."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Cambia el tamaño visual y el área de agarre de los controladores."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Franja horizontal"
@@ -855,6 +895,10 @@ msgstr "Eliminar color"
msgid "Unnamed"
msgstr "Sin nombre"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Palabras clave de colores"
@@ -920,6 +964,14 @@ msgstr "Sin puntos"
msgid "Also used by"
msgstr "También usado por"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Reestablecer a los valores predeterminados"
@@ -958,37 +1010,35 @@ msgstr "GodSVG no reconoce este atributo"
#: src/utils/FileUtils.gd:
msgid "The following files were discarded:"
-msgstr ""
+msgstr "Se descartaron los siguientes archivos:"
#: src/utils/FileUtils.gd:
msgid "{file_name} was discarded."
-msgstr ""
+msgstr "{file_name} fue descartado."
#: src/utils/FileUtils.gd:
msgid "Discarded files"
-msgstr ""
+msgstr "Archivos descartados"
#: src/utils/FileUtils.gd:
msgid "Proceed"
-msgstr ""
+msgstr "Continuar"
#: src/utils/FileUtils.gd:
-#, fuzzy
msgid "{file_name} couldn't be opened."
-msgstr "No se pudo abrir el archivo."
+msgstr "{file_name} no pudo ser abierto."
#: src/utils/FileUtils.gd:
msgid "Check if the file still exists in the selected file path."
-msgstr ""
-"Compruebe si el archivo todavía existe en la ruta de archivo seleccionada."
+msgstr "Compruebe si el archivo todavía existe en la ruta de archivo seleccionada."
#: src/utils/FileUtils.gd:
msgid "Proceed with importing the rest of the files?"
-msgstr ""
+msgstr "¿Continuar con la importación del resto de los archivos?"
#: src/utils/FileUtils.gd:
msgid "Proceed for all files that can't be opened"
-msgstr ""
+msgstr "Continuar para todos los archivos que no se pueden abrir"
#: src/utils/FileUtils.gd:
msgid "Save the file?"
@@ -1011,15 +1061,12 @@ msgid "Don't save"
msgstr "No guardar"
#: src/utils/FileUtils.gd:
-#, fuzzy
msgid "{file_path} is already being edited inside GodSVG."
-msgstr "El archivo importado ya se está editando dentro de GodSVG."
+msgstr "{file_path} ya se está editando dentro de GodSVG."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Si deseas revertir las ediciones realizadas desde la última vez que se "
-"guardó, utiliza {reset_svg}."
+msgstr "Si deseas revertir las ediciones realizadas desde la última vez que se guardó, utiliza {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1046,14 +1093,12 @@ msgid "Close all other tabs"
msgstr "Cerrar todas las demás pestañas"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Close empty tabs"
-msgstr "Cerrar pestaña"
+msgstr "Cerrar pestañas vacías"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Close saved tabs"
-msgstr "Cerrar todas las demás pestañas"
+msgstr "Cerrar pestañas guardadas"
#: src/utils/TranslationUtils.gd:
msgid "Create tab"
@@ -1309,9 +1354,8 @@ msgid "Viewport"
msgstr "Ventana gráfica"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Select {format} files"
-msgstr "Selecciona un archivo {format}"
+msgstr "Selecciona archivos {format}"
#: src/utils/TranslationUtils.gd:
msgid "Select an image"
@@ -1326,15 +1370,26 @@ msgid "Save the {format} file"
msgstr "Guardar el archivo {format}"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Only {extension_list} files are supported for this operation."
-msgstr ""
-"La extensión del archivo está vacía. Solo se admiten los archivos "
-"{extension_list}."
-
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "La extensión de archivo {extension} no es compatible con esta operación. "
-#~ "Solo se admiten los archivos {extension_list}."
+msgstr "Solo se admiten archivos {extension_list} para esta operación."
+
+#~ msgid "Handle colors"
+#~ msgstr "Colores de los controladores"
+
+#~ msgid "Background color"
+#~ msgstr "Color del fondo"
+
+#~ msgid "Uncapped framerate"
+#~ msgstr "Velocidad ilimitada de fotogramas"
+
+#~ msgid "Determines if frames are rendered as fast as possible (may increase power consumption and heat)."
+#~ msgstr "Determina si los fotogramas se procesan lo más rápido posible (puede aumentar el consumo de energía y el calor)."
+
+#~ msgid "Reset all to default"
+#~ msgstr "Restablecer todo a los valores predeterminados"
+
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Determina el tamaño visual y el área de agarre de los controladores."
+
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "La extensión de archivo {extension} no es compatible con esta operación. Solo se admiten los archivos {extension_list}."
diff --git a/translations/et.po b/translations/et.po
index f430bad..b1b9478 100644
--- a/translations/et.po
+++ b/translations/et.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Otsi uuendusi?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"See ühendab github.com-i, et saada versioonide teabe. Muid andmeid ei koguta "
-"ega edastata."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "See ühendab github.com-i, et saada versioonide teabe. Muid andmeid ei koguta ega edastata."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,18 +53,12 @@ msgid "Export"
msgstr "Ekspordi"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Graafika saab eksportida ainult SVG-na, sest selle proportsioonid on liiga "
-"ekstreemsed."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Graafika saab eksportida ainult SVG-na, sest selle proportsioonid on liiga ekstreemsed."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Graafika saab eksportida ainult SVG-na, sest selle suurus pole defineeritud."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Graafika saab eksportida ainult SVG-na, sest selle suurus pole defineeritud."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -100,12 +90,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "Selle kaardi viimast seisu polnud võimalik leida."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"See vahekaart on seotud failiga asukohas {file_path}. Kas te soovite "
-"taastada SVG sellest failist?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "See vahekaart on seotud failiga asukohas {file_path}. Kas te soovite taastada SVG sellest failist?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -143,6 +129,30 @@ msgstr "3- või 6-kohaline hex"
msgid "6-digit hex"
msgstr "6-kohaline hex"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Kõrgus"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Tühi"
@@ -163,26 +173,26 @@ msgstr "Tekst"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} peab olema {allowed} sees, et sellel oleks mõju."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Grupis pole ühtegi elementi."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Grupis on ainult üks element."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "\"id\" atribuut pole defineeritud."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Gradiendis puuduvad elemendid."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Gradient on ühevärviline."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Grupis pole ühtegi elementi."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Grupis on ainult üks element."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Ei kirjelda SVGd."
@@ -213,6 +223,7 @@ msgstr "Litsents"
msgid "Third-party licenses"
msgstr "Kolmandad litsentsid"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Projekti asutaja ja juht"
@@ -267,7 +278,7 @@ msgstr "Uus element"
msgid "Dimensions"
msgstr "Dimensioonid"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Suurus"
@@ -291,7 +302,7 @@ msgstr "Kvaliteet"
msgid "Scale"
msgstr "Skaala"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Laius"
@@ -372,12 +383,8 @@ msgid "Copy path"
msgstr "Kopeeri asukoht"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Fail nimega \"{file_name}\" on juba olemas, asendamine kirjutab selle sisu "
-"üle!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Fail nimega \"{file_name}\" on juba olemas, asendamine kirjutab selle sisu üle!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -460,10 +467,33 @@ msgstr "Kaardiriba"
msgid "Other"
msgstr "Muu"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Taasta suurendus"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Alusvärvid"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Teksti värv"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "SVG teksti värvid"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Sümboli värv"
@@ -497,10 +527,11 @@ msgstr "CDATA värv"
msgid "Error color"
msgstr "Errori värv"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Pideme värv"
+#, fuzzy
+msgid "Handles"
+msgstr "Pidemete suurus"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -522,13 +553,33 @@ msgstr "Valiku värv"
msgid "Hovered selected color"
msgstr "Esiletõstetud valiku värv"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Vali pilt"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Värvivalija"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Alusvärvid"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Tausta värv"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Seesmine värv"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -550,18 +601,64 @@ msgstr "Sisend"
msgid "Close tabs with middle mouse button"
msgstr "Sulge vahekaarte keskmise hiireklahviga"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Sisselülitamisel sulgeb keskmise hiireklahviga kaardile vajutamine selle. Väljalülitamisel fokuseeriks see selle."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Inverteeri suurendussuund"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Vahetab kerimissuunad suurendamiseks ja vähendamiseks ümber."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Takistusteta vaate liigutamine"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Viib kursori akna vastaspoolele, kui see jõuab vaate liigutamise ajal selle servani, et see liikumist ei takistaks."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Kasuta CTRL klahvi suurendamiseks"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Sisselülitamisel kerimine liigutab vaadet. Suurendamiseks hoia CTRL klahvi kerimise ajal."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Kasutajaliidese suurus"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "Muudab kasutajaliidese suurust."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Mitmesugust"
@@ -571,21 +668,16 @@ msgid "Use native file dialog"
msgstr "Kasuta süsteemi failidialoogi"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Sünkrooni akna tiitel avatud faili nimega"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Pidemete suurus"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Sisselülitamisel kasutab süsteemi vaikefailidialoogi. Väljalülitamisel GodSVG sisseehitatud failidialoogi."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Kasutajaliidese suurus"
+msgid "Sync window title to file name"
+msgstr "Sünkrooni akna tiitel avatud faili nimega"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Muudab kasutajaliidese suurust."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Väljalülitamisel jääb akna nimieks \"GodSVG\" sõltumata avatud failist."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -621,10 +713,6 @@ msgstr "Ekspordi vormindus"
msgid "Help"
msgstr "Abi"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Lähtesta kõik vaikeväärtustele"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Eelseadistus"
@@ -717,52 +805,6 @@ msgstr "Teisendused"
msgid "Remove unnecessary parameters"
msgstr "Eemalda ebavajalikud parameetrid"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Sisselülitamisel sulgeb keskmise hiireklahviga kaardile vajutamine selle. "
-"Väljalülitamisel fokuseeriks see selle."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Vahetab kerimissuunad suurendamiseks ja vähendamiseks ümber."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Viib kursori akna vastaspoolele, kui see jõuab vaate liigutamise ajal selle "
-"servani, et see liikumist ei takistaks."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Sisselülitamisel kerimine liigutab vaadet. Suurendamiseks hoia CTRL klahvi "
-"kerimise ajal."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Sisselülitamisel kasutab süsteemi vaikefailidialoogi. Väljalülitamisel "
-"GodSVG sisseehitatud failidialoogi."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Väljalülitamisel jääb akna nimieks \"GodSVG\" sõltumata avatud failist."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Muudab pidemete nähtavat ja interaktiivse ala suurust."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Horisontaalne riba"
@@ -852,6 +894,10 @@ msgstr "Kustuta värv"
msgid "Unnamed"
msgstr "Nimetu"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Värvi võtmesõnad"
@@ -917,6 +963,14 @@ msgstr "Puuduvad punktid"
msgid "Also used by"
msgstr "Seda kasutab ka"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Lähtesta vaikeväärtusele"
@@ -1011,9 +1065,7 @@ msgstr "{file_path} on juba avatud GodSVGs."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Kui te soovite taastada muudatused alates eelmise salvestamise hetkest, "
-"kasutage {reset_svg}-d."
+msgstr "Kui te soovite taastada muudatused alates eelmise salvestamise hetkest, kasutage {reset_svg}-d."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1320,12 +1372,21 @@ msgstr "Salvesta {format} fail"
msgid "Only {extension_list} files are supported for this operation."
msgstr "Ainult {extension_list} failid on toetatud selle tehingu jaoks."
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "Faililaiend {extension} ei ole selle operatsiooni jaoks toetatud. "
-#~ "Toetatud on {extension_list} failid."
+#~ msgid "Handle colors"
+#~ msgstr "Pideme värv"
+
+#~ msgid "Background color"
+#~ msgstr "Tausta värv"
+
+#~ msgid "Reset all to default"
+#~ msgstr "Lähtesta kõik vaikeväärtustele"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Muudab pidemete nähtavat ja interaktiivse ala suurust."
+
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "Faililaiend {extension} ei ole selle operatsiooni jaoks toetatud. Toetatud on {extension_list} failid."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Salvesta .\"{format}\" fail"
diff --git a/translations/fr.po b/translations/fr.po
index 8b54156..1d906aa 100644
--- a/translations/fr.po
+++ b/translations/fr.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Vérifier les mises à jour ?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Cette action effectuera une connexion à github.com pour comparer les numéros "
-"de version. Aucune autre information ne sera transmise ou collectée."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Une connexion à github.com sera effectuée pour comparer les numéros de version. Aucune autre information ne sera transmise ou collectée."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -45,7 +41,7 @@ msgstr "OK"
#: src/autoload/HandlerGUI.gd:
msgid "Do you want to proceed?"
-msgstr "Voulez-vous procéder ?"
+msgstr "Voulez-vous poursuivre ?"
#: src/autoload/HandlerGUI.gd:
msgid "Export SVG"
@@ -57,18 +53,12 @@ msgid "Export"
msgstr "Exporter"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Le graphique ne peut être exporté qu'en SVG car ses proportions sont trop "
-"extrêmes."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Le graphique ne peut être exporté qu'en SVG car ses proportions sont trop extrêmes."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Le graphique ne peut être exporté qu'en SVG car sa taille n'est pas définie."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Le graphique ne peut être exporté qu'en SVG car sa taille n'a pas été pas définie."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -84,9 +74,8 @@ msgid "Restore"
msgstr "Restaurer"
#: src/autoload/State.gd:
-#, fuzzy
msgid "View in Inspector"
-msgstr "Voir en liste"
+msgstr "Voir dans l'inspecteur"
#: src/autoload/State.gd:
msgid "Convert To"
@@ -101,12 +90,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "Le dernier état modifié de cet onglet n'a pas pu être trouvé."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"L'onglet est lié au chemin d'accès {file_path}. Voulez-vous restaurer le SVG "
-"à partir de ce chemin ?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "L'onglet est lié au chemin d'accès {file_path}. Voulez-vous restaurer le SVG à partir de ce chemin ?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -122,7 +107,7 @@ msgstr "Toujours"
#: src/config_classes/Formatter.gd:
msgid "All except containers"
-msgstr "Pour tout sauf les conteneurs"
+msgstr "Sauf pour les conteneurs"
#: src/config_classes/Formatter.gd:
msgid "Never"
@@ -144,6 +129,30 @@ msgstr "Héxadécimal de 3 ou 6 chiffres"
msgid "6-digit hex"
msgstr "Héxadécimal de 6 chiffres"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Hauteur"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Vide"
@@ -164,26 +173,26 @@ msgstr "Texte"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} doit être à l'intérieur de {allowed} pour avoir un effet."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Ce groupe n'a aucun élément."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Ce groupe n'a qu'un seul élément."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Aucun attribut « id » défini."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Aucun élément en dessous de ce dégradé."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Ce dégradé est une couleur solide."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Ce groupe n'a aucun élément."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Ce groupe n'a qu'un seul élément."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Ne décrit pas un SVG."
@@ -200,11 +209,11 @@ msgstr "Fermer"
#: src/ui_parts/about_menu.gd:
msgid "Authors"
-msgstr "Auteurs"
+msgstr "Auteur·rices"
#: src/ui_parts/about_menu.gd:
msgid "Donors"
-msgstr "Donateurs"
+msgstr "Donateur·rices"
#: src/ui_parts/about_menu.gd:
msgid "License"
@@ -214,25 +223,26 @@ msgstr "Licence"
msgid "Third-party licenses"
msgstr "Licences tierces"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
-msgstr "Fondateur et gestionnaire du projet"
+msgstr "Fondatrice et gestionnaire du projet"
#: src/ui_parts/about_menu.gd:
msgid "Developers"
-msgstr "Développeurs"
+msgstr "Développeur·ses"
#: src/ui_parts/about_menu.gd:
msgid "Translators"
-msgstr "Traducteurs"
+msgstr "Traducteur·rices"
#: src/ui_parts/about_menu.gd:
msgid "Golden donors"
-msgstr "Donateurs Or"
+msgstr "Donateur·rices Or"
#: src/ui_parts/about_menu.gd:
msgid "Diamond donors"
-msgstr "Donateurs Diamant"
+msgstr "Donateur·rices Diamant"
#: src/ui_parts/current_file_button.gd:
msgid "Save SVG as…"
@@ -247,13 +257,12 @@ msgid "Snap size"
msgstr "Taille d'aimantation"
#: src/ui_parts/display.gd:
-#, fuzzy
msgid "Paste reference image"
-msgstr "Charger une image de référence"
+msgstr "Coller une image de référence"
#: src/ui_parts/donate_menu.gd:
msgid "Links to donation platforms"
-msgstr ""
+msgstr "Liens vers les plateformes de dons"
#: src/ui_parts/donate_menu.gd: src/ui_parts/export_menu.gd:
#: src/ui_parts/import_warning_menu.gd: src/ui_widgets/choose_name_dialog.gd:
@@ -269,7 +278,7 @@ msgstr "Nouvel élément"
msgid "Dimensions"
msgstr "Dimensions"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Taille"
@@ -293,7 +302,7 @@ msgstr "Qualité"
msgid "Scale"
msgstr "Échelle"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Largeur"
@@ -374,12 +383,8 @@ msgid "Copy path"
msgstr "Copier le chemin"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Un fichier nommé « {file_name} » existe déjà. Le remplacer écrasera son "
-"contenu !"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Un fichier nommé « {file_name} » existe déjà. Le remplacer écrasera son contenu !"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -412,11 +417,11 @@ msgstr "Ajouter un élément"
#. Refers to the zero, one, or multiple UI parts to not be shown in the final layout. It's of plural cardinality.
#: src/ui_parts/layout_popup.gd:
msgid "Excluded"
-msgstr ""
+msgstr "Exclu(s)"
#: src/ui_parts/layout_popup.gd:
msgid "Drag and drop to change the layout"
-msgstr ""
+msgstr "Glissez-déposez pour modifier la disposition"
#: src/ui_parts/mac_menu.gd: src/ui_parts/settings_menu.gd:
msgid "File"
@@ -456,16 +461,40 @@ msgstr "Thèmes"
#: src/ui_parts/settings_menu.gd:
msgid "Tab bar"
-msgstr ""
+msgstr "Barre d'onglets"
#: src/ui_parts/settings_menu.gd:
msgid "Other"
msgstr "Autre"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Réinitialiser le zoom"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Primary theme colors"
+msgstr "Désactiver la couleur"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Couleurs basiques"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Couleur de texte"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "Couleurs de texte SVG"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Couleur de symbole"
@@ -499,10 +528,11 @@ msgstr "Couleur de CDATA"
msgid "Error color"
msgstr "Couleur d'erreur"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Couleurs des poignées"
+#, fuzzy
+msgid "Handles"
+msgstr "Taille des poignées"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -524,18 +554,37 @@ msgstr "Couleur d'élément selectionné"
msgid "Hovered selected color"
msgstr "Couleur d'élément selectionné survolé"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Sélectionnez une image"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Pipette"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Couleurs basiques"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Couleur d'arrière-plan"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Couleur d'intérieur"
#: src/ui_parts/settings_menu.gd:
-#, fuzzy
msgid "Grid color"
-msgstr "Couleur valide"
+msgstr "Couleur de la grille"
#: src/ui_parts/settings_menu.gd:
msgid "Valid color"
@@ -551,44 +600,86 @@ msgstr "Entrée"
#: src/ui_parts/settings_menu.gd:
msgid "Close tabs with middle mouse button"
-msgstr ""
+msgstr "Fermer les onglets avec la molette de la souris"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Si activé, cliquer sur un onglet avec la molette de la souris fermera l'onglet. Si désactivé, cette action le rendra actif."
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Inverser la direction du zoom"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Inverser les sens de défilement pour le zoom avant et le zoom arrière."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Défilement bouclé"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Téléporte le curseur de l'autre côté de la vue à chaque fois qu'il en atteind la limite."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Utiliser CTRL pour zoomer"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Si activé, défiler fera balayer la vue. Pour zoomer, maintenez CTRL en défilant."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Échelle de l'interface"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the scale factor for the interface."
+msgstr "Détermine le facteur d'échelle de l'interface."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Maximum FPS"
+msgstr "Valeur d'IPS maximale personnalisée"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the maximum number of frames per second."
+msgstr "Si le taux de rafraîchissement est limité, cette valeur déterminera le nombre maximum d'images par seconde."
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Divers"
#: src/ui_parts/settings_menu.gd:
msgid "Use native file dialog"
-msgstr "Utiliser la boîte de dialogue de fichiers native"
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Synchroniser le titre de la fenêtre au nom du fichier"
+msgstr "Utiliser le sélecteur de fichiers natif"
-#. Refers to the size of the draggable handles.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Taille des poignées"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Si activé, utilise le sélecteur de fichiers système. Si désactivé, utilise la boîte de dialogue intégrée de GodSVG."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Échelle de l'interface"
+msgid "Sync window title to file name"
+msgstr "Synchroniser le titre de la fenêtre avec le nom du fichier"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Change le facteur d'échelle de l'interface."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Si désactivé, le titre de la fenêtre restera simplement « GodSVG » quel que soit le fichier actuel."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -613,21 +704,17 @@ msgstr "Nouvelle palette depuis du XML"
#. Refers to the formatter used for GodSVG's code editor.
#: src/ui_parts/settings_menu.gd:
msgid "Editor formatter"
-msgstr "Formateur de l'éditeur"
+msgstr "Formatage de l'éditeur"
#. Refers to the formatter used when exporting.
#: src/ui_parts/settings_menu.gd:
msgid "Export formatter"
-msgstr "Formateur d'exportation"
+msgstr "Formatage des fichiers exportés"
#: src/ui_parts/settings_menu.gd:
msgid "Help"
msgstr "Aide"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Tout rénitialiser par défaut"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Préréglage"
@@ -674,7 +761,7 @@ msgstr "Retirer le zéro initial"
#: src/ui_parts/settings_menu.gd:
msgid "Use exponential when shorter"
-msgstr "Noter en exponentiel si c'est plus court"
+msgstr "Noter en écriture scientifique si c'est plus court"
#: src/ui_parts/settings_menu.gd:
msgid "Colors"
@@ -686,7 +773,7 @@ msgstr "Utiliser des couleurs nommées"
#: src/ui_parts/settings_menu.gd:
msgid "Primary syntax"
-msgstr "Syntaxe primaire"
+msgstr "Syntaxe principale"
#: src/ui_parts/settings_menu.gd:
msgid "Capitalize hexadecimal letters"
@@ -694,7 +781,7 @@ msgstr "Mettre en majuscule les nombres héxadécimaux"
#: src/ui_parts/settings_menu.gd:
msgid "Pathdata"
-msgstr "Données de chemin d'accès"
+msgstr "Données des chemins"
#: src/ui_parts/settings_menu.gd:
msgid "Compress numbers"
@@ -720,55 +807,6 @@ msgstr "Transformer les listes"
msgid "Remove unnecessary parameters"
msgstr "Retirer les paramètres inutiles"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr ""
-"Inverser les directions de défilement pour le zoom avant et le zoom arrière."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Téléporte le curseur de l'autre côté de la vue à chaque fois qu'il en "
-"atteind la limite."
-
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Si activé, défiler fera balayer la vue. Pour zoomer, maintenez CTRL en "
-"défilant."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Si activé, utilise la boîte de dialogue de fichiers native de votre système "
-"d'exploitation. Si désactivé, utilise la boîte de dialogue intégrée de "
-"GodSVG."
-
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Si désactivé, le titre de la fenêtre restera simplement « GodSVG » quel que "
-"soit le fichier actuel."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Change la taille visuelle et la zone de saisie des poignées"
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Rayure horizontale"
@@ -807,7 +845,7 @@ msgstr "Réessayer"
#: src/ui_parts/update_menu.gd:
msgid "Show prereleases"
-msgstr "Inclure les versions préliminaires"
+msgstr "Afficher les versions préliminaires"
#: src/ui_parts/update_menu.gd:
msgid "Current Version"
@@ -815,7 +853,7 @@ msgstr "Version actuelle"
#: src/ui_parts/update_menu.gd:
msgid "Retrieving information..."
-msgstr "Récupération d'information en cours…"
+msgstr "Récupération d'informations en cours…"
#. When checking for updates.
#: src/ui_parts/update_menu.gd:
@@ -823,18 +861,16 @@ msgid "Update check failed"
msgstr "Échec de la vérification de mise à jour"
#: src/ui_parts/update_menu.gd:
-#, fuzzy
msgid "View all releases"
-msgstr "Sélectionner tous les éléments"
+msgstr "Voir toutes les versions"
#: src/ui_parts/update_menu.gd:
msgid "GodSVG is up-to-date."
msgstr "GodSVG est à jour."
#: src/ui_parts/update_menu.gd:
-#, fuzzy
msgid "New versions available!"
-msgstr "Nouvelles versions"
+msgstr "De nouvelles versions sont disponibles !"
#: src/ui_widgets/choose_name_dialog.gd:
msgid "Create"
@@ -850,7 +886,7 @@ msgstr "Pipette"
#: src/ui_widgets/configure_color_popup.gd:
msgid "Edit color name"
-msgstr "Éditer le nom de la couleur"
+msgstr "Modifier le nom de la couleur"
#: src/ui_widgets/configure_color_popup.gd:
msgid "Delete color"
@@ -860,6 +896,10 @@ msgstr "Supprimer la couleur"
msgid "Unnamed"
msgstr "Sans nom"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Colorier les mots-clés"
@@ -870,7 +910,7 @@ msgstr "Pipette"
#: src/ui_widgets/palette_config.gd:
msgid "Unnamed palettes won't be shown."
-msgstr "Les palettes sans nom ne seront pas affichées."
+msgstr "Les palettes sans nom ne seront pas montrées."
#: src/ui_widgets/palette_config.gd:
msgid "Multiple palettes can't have the same name."
@@ -925,9 +965,17 @@ msgstr "Aucun point"
msgid "Also used by"
msgstr "Aussi utilisé par"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
-msgstr "Rénitialiser par défaut"
+msgstr "Réinitialiser par défaut"
#: src/ui_widgets/setting_shortcut.gd:
msgid "Unused"
@@ -939,7 +987,7 @@ msgstr "Ajouter un raccourci"
#: src/ui_widgets/setting_shortcut.gd:
msgid "Press keys…"
-msgstr "Appuyez sur les touches…"
+msgstr "Appuyez sur des touches…"
#: src/ui_widgets/transform_field.gd:
msgid "No transforms"
@@ -963,24 +1011,23 @@ msgstr "GodSVG ne reconnaît pas cet attribut"
#: src/utils/FileUtils.gd:
msgid "The following files were discarded:"
-msgstr ""
+msgstr "Les fichiers suivants ont été abandonnés :"
#: src/utils/FileUtils.gd:
msgid "{file_name} was discarded."
-msgstr ""
+msgstr "{file_name} a été abandonné."
#: src/utils/FileUtils.gd:
msgid "Discarded files"
-msgstr ""
+msgstr "Fichiers abandonnés"
#: src/utils/FileUtils.gd:
msgid "Proceed"
-msgstr ""
+msgstr "Poursuivre"
#: src/utils/FileUtils.gd:
-#, fuzzy
msgid "{file_name} couldn't be opened."
-msgstr "Le fichier n'a pas pu être ouvert."
+msgstr "{file_name} n'a pas pu être ouvert."
#: src/utils/FileUtils.gd:
msgid "Check if the file still exists in the selected file path."
@@ -988,11 +1035,11 @@ msgstr "Vérifiez si le fichier existe encore au chemin selectionné."
#: src/utils/FileUtils.gd:
msgid "Proceed with importing the rest of the files?"
-msgstr ""
+msgstr "Poursuivre en important le reste des fichiers ?"
#: src/utils/FileUtils.gd:
msgid "Proceed for all files that can't be opened"
-msgstr ""
+msgstr "Poursuivre pour chaque fichier ne pouvant être ouvert"
#: src/utils/FileUtils.gd:
msgid "Save the file?"
@@ -1000,11 +1047,11 @@ msgstr "Enregistrer le fichier ?"
#: src/utils/FileUtils.gd:
msgid "Do you want to save this file?"
-msgstr "Voulez-vous enregistrer ce fichier ?"
+msgstr "Voulez-vous sauvegarder ce fichier ?"
#: src/utils/FileUtils.gd:
msgid "Save the changes?"
-msgstr "Enregistrer les changements?"
+msgstr "Sauvegarder les modifications ?"
#: src/utils/FileUtils.gd:
msgid "Your changes will be lost if you don't save them."
@@ -1015,15 +1062,12 @@ msgid "Don't save"
msgstr "Ne pas enregistrer"
#: src/utils/FileUtils.gd:
-#, fuzzy
msgid "{file_path} is already being edited inside GodSVG."
-msgstr "Le fichier importé est déjà en cours de modification dans GodSVG."
+msgstr "{file_path} est déjà en cours de modification dans GodSVG."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Si vous voulez rénitialiser vos changements au dernier enregistrement, "
-"utilisez {reset_svg}."
+msgstr "Si vous voulez réinitialiser vos modifications au dernier enregistrement, utilisez {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1034,9 +1078,8 @@ msgid "Save SVG"
msgstr "Sauvegarder le SVG"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Save SVG as"
-msgstr "Sauvegarder le SVG sous…"
+msgstr "Sauvegarder le SVG sous"
#: src/utils/TranslationUtils.gd:
msgid "Close tabs to the left"
@@ -1051,14 +1094,12 @@ msgid "Close all other tabs"
msgstr "Fermer les autres onglets"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Close empty tabs"
-msgstr "Fermer l'onglet"
+msgstr "Fermer les onglets vides"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Close saved tabs"
-msgstr "Fermer les autres onglets"
+msgstr "Fermer les onglets enregistrés"
#: src/utils/TranslationUtils.gd:
msgid "Create tab"
@@ -1066,33 +1107,31 @@ msgstr "Créer un onglet"
#: src/utils/TranslationUtils.gd:
msgid "Select the next tab"
-msgstr "Sélectionner l'onglet suivant"
+msgstr "Basculer à l'onglet suivant"
#: src/utils/TranslationUtils.gd:
msgid "Select the previous tab"
-msgstr "Sélectionner l'onglet précédent"
+msgstr "Basculer à l'onglet précédent"
#: src/utils/TranslationUtils.gd:
msgid "Optimize"
msgstr "Optimiser"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Optimize SVG"
-msgstr "Optimiser"
+msgstr "Optimiser le SVG"
#: src/utils/TranslationUtils.gd:
msgid "Copy all text"
msgstr "Copier tout le texte"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Copy the SVG text"
-msgstr "Copier tout le texte"
+msgstr "Copier le texte SVG"
#: src/utils/TranslationUtils.gd:
msgid "Reset SVG"
-msgstr "Rénitialiser le SVG"
+msgstr "Réinitialiser le SVG"
#: src/utils/TranslationUtils.gd:
msgid "Open externally"
@@ -1143,7 +1182,6 @@ msgid "Delete the selection"
msgstr "Supprimer les éléments sélectionnés"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Move up"
msgstr "Remonter"
@@ -1152,7 +1190,6 @@ msgid "Move the selection up"
msgstr "Remonter les éléments sélectionnés"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Move down"
msgstr "Descendre"
@@ -1174,7 +1211,7 @@ msgstr "Zoom arrière"
#: src/utils/TranslationUtils.gd:
msgid "Zoom reset"
-msgstr "Rénitialiser le zoom"
+msgstr "Réinitialiser le zoom"
#: src/utils/TranslationUtils.gd:
msgid "Show grid"
@@ -1258,7 +1295,7 @@ msgstr "Quitter l'application"
#: src/utils/TranslationUtils.gd:
msgid "Toggle fullscreen"
-msgstr ""
+msgstr "Activer/Désactiver le mode plein écran"
#: src/utils/TranslationUtils.gd:
msgid "Move to"
@@ -1306,50 +1343,57 @@ msgstr "Absolu"
#: src/utils/TranslationUtils.gd:
msgid "Code editor"
-msgstr ""
+msgstr "Éditeur de code"
#: src/utils/TranslationUtils.gd:
msgid "Inspector"
-msgstr ""
+msgstr "Inspecteur"
#. The viewport is the area where the graphic is displayed. In similar applications, it's often called the canvas.
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Viewport"
-msgstr "Affichage"
+msgstr "Zone d'affichage"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Select {format} files"
-msgstr "Sélectionner un fichier XML"
+msgstr "Sélectionner des fichiers {format}"
#: src/utils/TranslationUtils.gd:
msgid "Select an image"
-msgstr "Sélectionner une image"
+msgstr "Sélectionnez une image"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Select an {format} file"
-msgstr "Sélectionner un fichier XML"
+msgstr "Sélectionner un fichier {format}"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Save the {format} file"
-msgstr "Enregistrer le fichier .\"{format}\""
+msgstr "Enregistrer le fichier {format}"
#: src/utils/TranslationUtils.gd:
-#, fuzzy
msgid "Only {extension_list} files are supported for this operation."
-msgstr ""
-"L'extension de fichier est vide. Seuls les fichiers {extension_list} sont "
-"supportés."
+msgstr "Seuls les fichiers {extension_list} sont supportés par cette opération."
+
+#~ msgid "Handle colors"
+#~ msgstr "Couleurs des poignées"
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "L'extension de fichier {extension} n'est pas supportée pour cette "
-#~ "opération. Seuls les fichiers {extension_list} sont supportés."
+#~ msgid "Background color"
+#~ msgstr "Couleur d'arrière-plan"
+
+#~ msgid "Uncapped framerate"
+#~ msgstr "Taux de rafraîchissement sans limite"
+
+#~ msgid "Determines if frames are rendered as fast as possible (may increase power consumption and heat)."
+#~ msgstr "Détermine si les rafraîchissements sont rendus aussi vite que possible (peut augmenter la consommation d'énergie et la chaleur)."
+
+#~ msgid "Reset all to default"
+#~ msgstr "Tout réinitialiser par défaut"
+
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Détermine la taille visuelle et la zone de saisie des poignées."
+
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "L'extension de fichier {extension} n'est pas supportée pour cette opération. Seuls les fichiers {extension_list} sont supportés."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Enregistrer le fichier .\"{format}\""
@@ -1383,17 +1427,13 @@ msgstr ""
#~ msgstr "Redimensionne l'interface utilisateur selon la taille de l'écran."
#~ msgid "Wrap mouse"
-#~ msgstr ""
-#~ "Déplacer la souris d'un bout à l'autre de l'écran lorsque le bord est "
-#~ "atteint"
+#~ msgstr "Déplacer la souris d'un bout à l'autre de l'écran lorsque le bord est atteint"
#~ msgid "Swaps zoom in and zoom out with the mouse wheel."
#~ msgstr "Échanger le zoom avant et le zoom arrière par molette de souris."
#~ msgid "Wraps the mouse cursor around when panning the viewport."
-#~ msgstr ""
-#~ "Déplace le pointeur de souris d'un bout à l'autre de l'écran lorsque le "
-#~ "bord est atteint lors d'un balayage."
+#~ msgstr "Déplace le pointeur de souris d'un bout à l'autre de l'écran lorsque le bord est atteint lors d'un balayage."
#~ msgid "This requires GodSVG to connect to the internet."
#~ msgstr "Ceci nécessite que GodSVG se connecte à Internet."
@@ -1416,6 +1456,3 @@ msgstr ""
#~ msgid "Enable the color"
#~ msgstr "Activer la couleur"
-
-#~ msgid "Disable the color"
-#~ msgstr "Désactiver la couleur"
diff --git a/translations/nl.po b/translations/nl.po
index e3c99dc..c4feffa 100644
--- a/translations/nl.po
+++ b/translations/nl.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Voor updates controleren?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Dit zal een verbinding maken naar github.com om de versienummers te "
-"vergelijken. Er wordt geen andere data verzameld of verzonden."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Dit zal een verbinding maken naar github.com om de versienummers te vergelijken. Er wordt geen andere data verzameld of verzonden."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,19 +53,12 @@ msgid "Export"
msgstr "Exporteren"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"De afbeelding kan alleen maar als SVG geëxporteerd worden door zijn extreme "
-"verhoudingen."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "De afbeelding kan alleen maar als SVG geëxporteerd worden door zijn extreme verhoudingen."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"De afbeelding kan alleen maar als SVG geëxporteerd worden want zijn maat is "
-"niet gedefiniëerd."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "De afbeelding kan alleen maar als SVG geëxporteerd worden want zijn maat is niet gedefiniëerd."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -102,12 +91,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "De laatst aangepaste stand van dit tabblad kon niet gevonden worden."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"Het tablad is gebonden aan het bestandspad {file_path}. Wil je de SVG "
-"herstellen vanuit dit pad?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "Het tablad is gebonden aan het bestandspad {file_path}. Wil je de SVG herstellen vanuit dit pad?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -145,6 +130,30 @@ msgstr "3-cijferig of 6-cijferige hex"
msgid "6-digit hex"
msgstr "6-cijferige hex"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Hoogte"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Leeg"
@@ -165,26 +174,26 @@ msgstr "Tekst"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} moet aanwezig zijn in {allowed} om enig effect te hebben."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Deze groep bevat geen elementen."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Deze groep bevat maar één element."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Geen \"id\" attribuut gedefineerd."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Geen elementen onder deze kleurovergang."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Deze kleurovergang is een vaste kleur."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Deze groep bevat geen elementen."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Deze groep bevat maar één element."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Beschrijft geen SVG."
@@ -215,6 +224,7 @@ msgstr "Licentie"
msgid "Third-party licenses"
msgstr "Derde partij Licenties"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Projectoprichter en Manager"
@@ -270,7 +280,7 @@ msgstr "Nieuw element"
msgid "Dimensions"
msgstr "Afmetingen"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Maat"
@@ -294,7 +304,7 @@ msgstr "Kwaliteit"
msgid "Scale"
msgstr "Schaal"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Breedte"
@@ -375,12 +385,8 @@ msgid "Copy path"
msgstr "Pad kopiëren"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Er bestaat al een bestand genaamt \"{file_name}\". Deze vervangen zal zijn "
-"inhoud aanpassen!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Er bestaat al een bestand genaamt \"{file_name}\". Deze vervangen zal zijn inhoud aanpassen!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -463,10 +469,34 @@ msgstr "Tabladbalk"
msgid "Other"
msgstr "Overige"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Zoom resetten"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Primary theme colors"
+msgstr "De kleur uitzetten"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Basiskleuren"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Textkleur"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "SVG tekstkleuren"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Symboolkleur"
@@ -500,10 +530,11 @@ msgstr "CDATA-kleur"
msgid "Error color"
msgstr "Fout-kleur"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Handvatkleuren"
+#, fuzzy
+msgid "Handles"
+msgstr "Handvat maat"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -525,13 +556,33 @@ msgstr "Gekozen kleur"
msgid "Hovered selected color"
msgstr "Zweefde gekozen kleur"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Kies een afbeedling"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Kleurenplukker"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Basiskleuren"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Achtergrondskleur"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Binnenkantkleuren"
#: src/ui_parts/settings_menu.gd:
#, fuzzy
@@ -554,18 +605,65 @@ msgstr "Invoer"
msgid "Close tabs with middle mouse button"
msgstr "Sluit tabbladen met de middelste muisknop"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "inzoomrichting tegenstellen"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Verwisselt de scroll richtingen voor inzoomen en uitzoomen."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Omwikkeld rondkijken"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Verplaatst de cursur naar de overkant wanneer het buiten de viewport gaat tijdens het rondkijken."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Gebruik CTRL om in te zoomen"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Als ingeschakeld, scrollen zal het weergave verschuiven. Om te zoomen,houd CTRL ingedrukt tijdens scrollen."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Gebruiksinterface maat"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "Verandert het maat-factor van de gebruikersinterface."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Overige"
@@ -575,21 +673,17 @@ msgid "Use native file dialog"
msgstr "Gebruik inheemse bestandendialoog"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Synchroniseer venstertitel naar bestandsnaam"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Waneer ingeschakeld, gebruikt jouw besturingssysteem's inheemse bestandendialoog. Wanneer uitgeschakeld, gebruikt GodSVG's ingebouwde bestandendialoog."
-#. Refers to the size of the draggable handles.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Handvat maat"
-
-#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Gebruiksinterface maat"
+msgid "Sync window title to file name"
+msgstr "Synchroniseer venstertitel naar bestandsnaam"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Verandert het maat-factor van de gebruikersinterface."
+#, fuzzy
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Als dit uitgeschakelt is, blijft de venstertitel simpelweg \"GodSVG\" achteloos van het huidige bestand."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -625,10 +719,6 @@ msgstr "Exportformatter"
msgid "Help"
msgstr "Help"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Reset allen naar standaard"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Voorinstelling"
@@ -721,54 +811,6 @@ msgstr "Transformeer lijsten"
msgid "Remove unnecessary parameters"
msgstr "Verwijder onnodige parameters"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Verwisselt de scroll richtingen voor inzoomen en uitzoomen."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Verplaatst de cursur naar de overkant wanneer het buiten de viewport gaat "
-"tijdens het rondkijken."
-
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Als ingeschakeld, scrollen zal het weergave verschuiven. Om te zoomen,houd "
-"CTRL ingedrukt tijdens scrollen."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Waneer ingeschakeld, gebruikt jouw besturingssysteem's inheemse "
-"bestandendialoog. Wanneer uitgeschakeld, gebruikt GodSVG's ingebouwde "
-"bestandendialoog."
-
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Als dit uitgeschakelt is, blijft de venstertitel simpelweg \"GodSVG\" "
-"achteloos van het huidige bestand."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "verandert de visuele grootte en grijpgebieden van handvaten."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Horizontale lijn"
@@ -860,6 +902,10 @@ msgstr "Kleur verwijderen"
msgid "Unnamed"
msgstr "Onbenoemd"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "kleur trefwoorden"
@@ -925,6 +971,14 @@ msgstr "Geen punten"
msgid "Also used by"
msgstr "Ook gebruikt door"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Reset naar standaard"
@@ -1021,9 +1075,7 @@ msgstr "Het geïmporteerde bestand is al geöpend in GodSVG"
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Als u uw aanpassingen van de vorige opslag wilt ongedaanmaken, gebruik "
-"{reset_svg}"
+msgstr "Als u uw aanpassingen van de vorige opslag wilt ongedaanmaken, gebruik {reset_svg}"
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1340,16 +1392,23 @@ msgstr "Bewaar het .\"{format}\" bestand"
#: src/utils/TranslationUtils.gd:
#, fuzzy
msgid "Only {extension_list} files are supported for this operation."
-msgstr ""
-"Deze bestandsextensie is leeg. Alleen {extension_list} bestanden zijn "
-"ondersteund."
+msgstr "Deze bestandsextensie is leeg. Alleen {extension_list} bestanden zijn ondersteund."
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "Deze operatie is niet ondersteund voor de bestandsextensie {extension}."
-#~ "Alleen {extension_list} bestanden zijn ondersteund."
+#~ msgid "Handle colors"
+#~ msgstr "Handvatkleuren"
+
+#~ msgid "Background color"
+#~ msgstr "Achtergrondskleur"
+
+#~ msgid "Reset all to default"
+#~ msgstr "Reset allen naar standaard"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "verandert de visuele grootte en grijpgebieden van handvaten."
+
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "Deze operatie is niet ondersteund voor de bestandsextensie {extension}.Alleen {extension_list} bestanden zijn ondersteund."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Bewaar het .\"{format}\" bestand"
@@ -1389,8 +1448,7 @@ msgstr ""
#~ msgstr "Wisselt in- en uitzoemen met de muiswiel."
#~ msgid "Wraps the mouse cursor around when panning the viewport."
-#~ msgstr ""
-#~ "Wikkelt de muiscursor rond tijdens het verschuiven van de kijkvenster."
+#~ msgstr "Wikkelt de muiscursor rond tijdens het verschuiven van de kijkvenster."
#~ msgid "This requires GodSVG to connect to the internet."
#~ msgstr "Hiervoor moet GodSVG verbinding maken met het internet."
@@ -1413,9 +1471,6 @@ msgstr ""
#~ msgid "Enable the color"
#~ msgstr "De kleur inschakelen"
-#~ msgid "Disable the color"
-#~ msgstr "De kleur uitzetten"
-
#~ msgid "Invalid"
#~ msgstr "Ongeldig"
@@ -1424,12 +1479,10 @@ msgstr ""
#~ msgid ""
#~ "The file couldn't be opened.\n"
-#~ "Try checking the file path, ensure that the file is not deleted, or "
-#~ "choose a different file."
+#~ "Try checking the file path, ensure that the file is not deleted, or choose a different file."
#~ msgstr ""
#~ "Het bestand kon niet geopend worden.\n"
-#~ "Probeer the bestandspad te controleren, zorg ervoor dat de bestand niet "
-#~ "verwijdert is, of kies een ander bestand uit."
+#~ "Probeer the bestandspad te controleren, zorg ervoor dat de bestand niet verwijdert is, of kies een ander bestand uit."
#~ msgid "Enable snap"
#~ msgstr "Knappen inschakelen"
diff --git a/translations/pt_BR.po b/translations/pt_BR.po
index dc0a4bd..162f711 100644
--- a/translations/pt_BR.po
+++ b/translations/pt_BR.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Verificar atualizações?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Isso irá conectar ao github.com para comparar o número de versionamento. "
-"Nenhum outro dado será colecionado ou transmitido."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Isso irá conectar ao github.com para comparar o número de versionamento. Nenhum outro dado será colecionado ou transmitido."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,19 +53,12 @@ msgid "Export"
msgstr "Exportar"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Esse gráfico pode ser exportado apenas como um SVG pois as suas proporções "
-"são extremas."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Esse gráfico pode ser exportado apenas como um SVG pois as suas proporções são extremas."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Esse gráfico pode ser exportado apenas como SVG pois o seu tamanho não foi "
-"definido."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Esse gráfico pode ser exportado apenas como SVG pois o seu tamanho não foi definido."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -101,12 +90,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "O último estado editado desta guia não foi encontrado."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"A guia está vinculada ao caminho do arquivo {file_path}. Você deseja "
-"restaurar o SVG deste caminho?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "A guia está vinculada ao caminho do arquivo {file_path}. Você deseja restaurar o SVG deste caminho?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -144,6 +129,30 @@ msgstr "Hexadecimal de 3 dígitos ou 6 dígitos"
msgid "6-digit hex"
msgstr "Hexadecimal de 6 dígitos"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Altura"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Vazio"
@@ -165,26 +174,26 @@ msgstr "Texto"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} deve estar dentro de {allowed} para ter qualquer efeito."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Este grupo não possui elementos."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Este grupo possui apenas um elemento."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Nenhum atributo \"id\" definido."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Nenhum elemento sob / abaixo este gradiente."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Este gradiente é uma cor sólida."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Este grupo não possui elementos."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Este grupo possui apenas um elemento."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Não descreve um SVG."
@@ -215,6 +224,7 @@ msgstr "Licença"
msgid "Third-party licenses"
msgstr "Licenças de terceiros"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Fundador e Gerente do Projeto"
@@ -269,7 +279,7 @@ msgstr "Novo elemento"
msgid "Dimensions"
msgstr "Dimensões"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Tamanho"
@@ -293,7 +303,7 @@ msgstr "Qualidade"
msgid "Scale"
msgstr "Escala"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Largura"
@@ -307,8 +317,7 @@ msgstr "Copiar"
#: src/ui_parts/export_menu.gd:
msgid "Preview image size is limited to {dimensions}"
-msgstr ""
-"O tamanho da visualização da prévia de imagem é limitado à {dimensions}"
+msgstr "O tamanho da visualização da prévia de imagem é limitado à {dimensions}"
#: src/ui_parts/global_actions.gd: src/ui_parts/shortcut_panel_config.gd:
msgid "Layout"
@@ -375,12 +384,8 @@ msgid "Copy path"
msgstr "Copiar caminho"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Um arquivo nomeado \"{file_name}\" já existe. Substituir este arquivo irá "
-"sobrescrever os seus conteúdos!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Um arquivo nomeado \"{file_name}\" já existe. Substituir este arquivo irá sobrescrever os seus conteúdos!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -463,10 +468,33 @@ msgstr "Barra de guias"
msgid "Other"
msgstr "Outro"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Redefinir zoom"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Cores básicas"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Cor de texto"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "Cores de texto SVG"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Cor de símbolo"
@@ -500,10 +528,11 @@ msgstr "Cor de CDATA"
msgid "Error color"
msgstr "Cor de erro"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Cor de alça"
+#, fuzzy
+msgid "Handles"
+msgstr "Tamanho de alça"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -525,13 +554,33 @@ msgstr "Cor de selecionado"
msgid "Hovered selected color"
msgstr "Cor de pairado e selecionado"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Selecionar uma imagem"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Seletor de Cores"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Cores básicas"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Cor do plano de fundo"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Cor interna"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -553,18 +602,64 @@ msgstr "Entrada"
msgid "Close tabs with middle mouse button"
msgstr "Fechar guias com o botão do meio do mouse"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Se ligado, clicar em uma guia com o botão do meio do mouse fechará a guia. Se desligado, irá focar na guia."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Inverter direção do zoom"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Troca as direções de rolagem para aumentar e diminuir o zoom."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Movimentação envolvente"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Passa o cursor para o lado oposto da tela quando ele atinge uma borda da viewport quando movimentando a visualização."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Utilizar CTRL para zoom"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Se habilitado, a rolagem do mouse irá movimentar a tela. Para realizar o zoom, pressione CTRL enquanto rola."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Escala da interface"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "Muda o fator de escala da interfaçe."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Variados"
@@ -574,21 +669,16 @@ msgid "Use native file dialog"
msgstr "Utilizar diálogo de arquivos nativo"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Sincronizar título de janela com o nome do arquivo"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Tamanho de alça"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Se habilitado, usa o diálogo de arquivo nativo do sistema operacional. Se desabilitado, usa o diálogo de arquivo embutido no GodSVG."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Escala da interface"
+msgid "Sync window title to file name"
+msgstr "Sincronizar título de janela com o nome do arquivo"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Muda o fator de escala da interfaçe."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Se desabilitado, o título da janela permanecerá como \"GodSVG\" sem incluir o nome do arquivo aberto."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -624,10 +714,6 @@ msgstr "Formatador de exportação"
msgid "Help"
msgstr "Ajuda"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Redefinir tudo para o padrão"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Predefinição"
@@ -720,53 +806,6 @@ msgstr "Transformar listas"
msgid "Remove unnecessary parameters"
msgstr "Remover parâmetros desnecessários"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Se ligado, clicar em uma guia com o botão do meio do mouse fechará a guia. "
-"Se desligado, irá focar na guia."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Troca as direções de rolagem para aumentar e diminuir o zoom."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Passa o cursor para o lado oposto da tela quando ele atinge uma borda da "
-"viewport quando movimentando a visualização."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Se habilitado, a rolagem do mouse irá movimentar a tela. Para realizar o "
-"zoom, pressione CTRL enquanto rola."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Se habilitado, usa o diálogo de arquivo nativo do sistema operacional. Se "
-"desabilitado, usa o diálogo de arquivo embutido no GodSVG."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Se desabilitado, o título da janela permanecerá como \"GodSVG\" sem incluir "
-"o nome do arquivo aberto."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Muda o tamanho e a área de agarramento das alças."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Faixa horizontal"
@@ -856,6 +895,10 @@ msgstr "Remover cor"
msgid "Unnamed"
msgstr "Sem nome"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Palavras-chave de cor"
@@ -921,6 +964,14 @@ msgstr "Sem pontos"
msgid "Also used by"
msgstr "Também usado por"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Redefinir para o padrão"
@@ -1015,9 +1066,7 @@ msgstr "{file_path} já está sendo editado dentro do GodSVG."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Se você deseja reverter as suas edições desde o último salvamento, use "
-"{reset_svg}."
+msgstr "Se você deseja reverter as suas edições desde o último salvamento, use {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1322,16 +1371,23 @@ msgstr "Salvar o arquivo do tipo {format}"
#: src/utils/TranslationUtils.gd:
msgid "Only {extension_list} files are supported for this operation."
-msgstr ""
-"A extensão de arquivo está vazia. Somente arquivos {extension_list} são "
-"suportados."
+msgstr "A extensão de arquivo está vazia. Somente arquivos {extension_list} são suportados."
+
+#~ msgid "Handle colors"
+#~ msgstr "Cor de alça"
+
+#~ msgid "Background color"
+#~ msgstr "Cor do plano de fundo"
+
+#~ msgid "Reset all to default"
+#~ msgstr "Redefinir tudo para o padrão"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Muda o tamanho e a área de agarramento das alças."
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "A extensão de arquivo {extension} não é compatível com esta operação. "
-#~ "Somente arquivos {extension_list} são suportados."
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "A extensão de arquivo {extension} não é compatível com esta operação. Somente arquivos {extension_list} são suportados."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Salvar o arquivo .\"{format}\""
@@ -1358,11 +1414,8 @@ msgstr ""
#~ msgstr "Salvar como"
# Wonky translation but source is alwo wonky
-#~ msgid ""
-#~ "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
-#~ msgstr ""
-#~ "Se você deseja aplicar o estado de arquivo não salvo, utilize \"Redefinir "
-#~ "SVG\"."
+#~ msgid "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
+#~ msgstr "Se você deseja aplicar o estado de arquivo não salvo, utilize \"Redefinir SVG\"."
#~ msgid "Auto UI scale"
#~ msgstr "Escala de interface automárica"
diff --git a/translations/ru.po b/translations/ru.po
index 20d0259..66d74aa 100644
--- a/translations/ru.po
+++ b/translations/ru.po
@@ -33,12 +33,8 @@ msgid "Check for updates?"
msgstr "Проверить обновления?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Требуется подключение к github.com, чтобы сравнить номер версии. Никакие "
-"другие данные не собираются и не передаются."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Требуется подключение к github.com, чтобы сравнить номер версии. Никакие другие данные не собираются и не передаются."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -58,19 +54,12 @@ msgid "Export"
msgstr "Экспортовать"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Изображение можно экспортировать только как SVG, поскольку его пропорции "
-"слишком экстремальные."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Изображение можно экспортировать только как SVG, поскольку его пропорции слишком экстремальные."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Изображение можно экспортировать только как SVG, поскольку его размеры не "
-"заданы."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Изображение можно экспортировать только как SVG, поскольку его размеры не заданы."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -102,12 +91,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "Последнее редактированное состояние этой вкладки невозможно найти."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"Вкладка связана с путем к файлу {file_path}. Вы желаете восстановить SVG из "
-"этого пути?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "Вкладка связана с путем к файлу {file_path}. Вы желаете восстановить SVG из этого пути?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -145,6 +130,30 @@ msgstr "3 или 6 цифровое шестандацитиричное зна
msgid "6-digit hex"
msgstr "6 цифровое шестандцатяричное значение"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Высота"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Пусто"
@@ -165,26 +174,26 @@ msgstr "Текст"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} должен быть внутри {allowed} чтобы это имело эффект."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "В этой групе нет элементов."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "В этой группе только один элемент."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Атрибут \"id\" не задан."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Нет элемента в этом градиенте."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Этот градиент описывает сплошной цвет."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "В этой групе нет элементов."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "В этой группе только один элемент."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Не является описанием SVG."
@@ -215,6 +224,7 @@ msgstr "Лицензия"
msgid "Third-party licenses"
msgstr "Лицензии третьих лиц"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Основатель и руководитель проекта"
@@ -269,7 +279,7 @@ msgstr "Новый элемент"
msgid "Dimensions"
msgstr "Размеры"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Размер"
@@ -293,7 +303,7 @@ msgstr "Качество"
msgid "Scale"
msgstr "Масштаб"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Ширина"
@@ -307,8 +317,7 @@ msgstr "Скопировать"
#: src/ui_parts/export_menu.gd:
msgid "Preview image size is limited to {dimensions}"
-msgstr ""
-"Размер предварительного просмотра изображения ограничен до {dimensions}"
+msgstr "Размер предварительного просмотра изображения ограничен до {dimensions}"
#: src/ui_parts/global_actions.gd: src/ui_parts/shortcut_panel_config.gd:
msgid "Layout"
@@ -375,12 +384,8 @@ msgid "Copy path"
msgstr "Скопировать путь"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Файл с названием \"{file_name}\" уже существует. Его замена перезапишет его "
-"содержимое!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Файл с названием \"{file_name}\" уже существует. Его замена перезапишет его содержимое!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -463,10 +468,33 @@ msgstr "Вкладки"
msgid "Other"
msgstr "Другие"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Сбросить масштаб"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Базовый цвет"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Цвет текста"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "Цвет SVG текста"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Цвет символа"
@@ -500,10 +528,11 @@ msgstr "Цвет CDATA"
msgid "Error color"
msgstr "Цвет ошибки"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Цвет ручки редактирования"
+#, fuzzy
+msgid "Handles"
+msgstr "Размер ручек"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -525,13 +554,33 @@ msgstr "Цвет выбранного"
msgid "Hovered selected color"
msgstr "Цвет выделенного-наведенного"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Выбрать изображение"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Цветовая пипетка"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Базовый цвет"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Цвет фона"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Внутренний цвет"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -553,18 +602,64 @@ msgstr "Устройства ввода"
msgid "Close tabs with middle mouse button"
msgstr "Закрывать вкладки средней клавишей мыши"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Если включено - нажатие на вкладку средней кнопкой мыши закроет ее. Если выключено - вкладка получит фокус."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Инвертировать направление масштабирования"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Поменяет местами направление прокрутки при масштабировании."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Захват курсора при прокрутке"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Курсор будет телепортироваться от одного до противоположного края на границе окна просмотра."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Использовать CTRL для масштабирования"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Если включено - прокрутка будет перемещать окно просмотра. Чтобы масштабировать зажмите CTRL при прокручивании."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Масштаб интерфейса"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "Изменить масштаб пользовательского интерфейса."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Разное"
@@ -574,21 +669,16 @@ msgid "Use native file dialog"
msgstr "Использовать родной файловый диалог системы"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Синхронизировать заголовок окна с названием файла"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Размер ручек"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Если включено, то будет использоваться родной файловый диалог вашей операционной системы для выбора файлов. Если выключено, то будет использоваться встроенный файловый диалог."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Масштаб интерфейса"
+msgid "Sync window title to file name"
+msgstr "Синхронизировать заголовок окна с названием файла"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Изменить масштаб пользовательского интерфейса."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Если выключено - заголовок окна будет просто \"GodSVG\", не включая текущий файл."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -624,10 +714,6 @@ msgstr "Форматер экспорта"
msgid "Help"
msgstr "Помощь"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Восстановить значения по умолчанию"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "Пресет"
@@ -720,54 +806,6 @@ msgstr "Список трансформаций"
msgid "Remove unnecessary parameters"
msgstr "Удалить ненужные параметры"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Если включено - нажатие на вкладку средней кнопкой мыши закроет ее. Если "
-"выключено - вкладка получит фокус."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Поменяет местами направление прокрутки при масштабировании."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Курсор будет телепортироваться от одного до противоположного края на границе "
-"окна просмотра."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Если включено - прокрутка будет перемещать окно просмотра. Чтобы "
-"масштабировать зажмите CTRL при прокручивании."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Если включено, то будет использоваться родной файловый диалог вашей "
-"операционной системы для выбора файлов. Если выключено, то будет "
-"использоваться встроенный файловый диалог."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Если выключено - заголовок окна будет просто \"GodSVG\", не включая текущий "
-"файл."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Изменит визуальный размер и область захвата ручек редактирования."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Горизонтальная полоса"
@@ -857,6 +895,10 @@ msgstr "Удалить цвет"
msgid "Unnamed"
msgstr "Без названия"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Ключевые слова цвета"
@@ -922,6 +964,14 @@ msgstr "Нет точек"
msgid "Also used by"
msgstr "Так же используется"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Восстановить значение по умолчанию"
@@ -1016,9 +1066,7 @@ msgstr "Файл {file_path} уже редактируется внутри GodS
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Если вы хотите отменить внесенные после после сохранения изменения, "
-"воспользуйтесь {reset_svg}."
+msgstr "Если вы хотите отменить внесенные после после сохранения изменения, воспользуйтесь {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1323,16 +1371,23 @@ msgstr "Сохранить {format} файл"
#: src/utils/TranslationUtils.gd:
msgid "Only {extension_list} files are supported for this operation."
-msgstr ""
-"Только файлы с расширениями {extension_list} поддерживаются для этой "
-"операции."
+msgstr "Только файлы с расширениями {extension_list} поддерживаются для этой операции."
+
+#~ msgid "Handle colors"
+#~ msgstr "Цвет ручки редактирования"
+
+#~ msgid "Background color"
+#~ msgstr "Цвет фона"
+
+#~ msgid "Reset all to default"
+#~ msgstr "Восстановить значения по умолчанию"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Изменит визуальный размер и область захвата ручек редактирования."
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "Расширение файла {extension} не поддерживается для этой операции. Только "
-#~ "{extension_list} файлы поддерживаются."
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "Расширение файла {extension} не поддерживается для этой операции. Только {extension_list} файлы поддерживаются."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Сохранить .\"{format}\" файл"
@@ -1358,16 +1413,11 @@ msgstr ""
#~ msgid "Save as"
#~ msgstr "Сохранить как"
-#~ msgid ""
-#~ "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
-#~ msgstr ""
-#~ "Если вы хотите применить не сохраненное состояние файла, используйте "
-#~ "\"Скинуть SVG\"."
+#~ msgid "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
+#~ msgstr "Если вы хотите применить не сохраненное состояние файла, используйте \"Скинуть SVG\"."
#~ msgid "Auto UI scale"
#~ msgstr "Автоматический маштаб интерфейса пользователя"
#~ msgid "Scales the interface automatically based on the screen size."
-#~ msgstr ""
-#~ "Автоматически масштабировать интерфейс пользователя в зависимости от "
-#~ "размера экрана."
+#~ msgstr "Автоматически масштабировать интерфейс пользователя в зависимости от размера экрана."
diff --git a/translations/uk.po b/translations/uk.po
index 1d8f596..4fba247 100644
--- a/translations/uk.po
+++ b/translations/uk.po
@@ -32,12 +32,8 @@ msgid "Check for updates?"
msgstr "Перевірити оновлення?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
-msgstr ""
-"Це потребує з'єднання з github.com, щоб порівняти цифри версії. Жодна інша "
-"інформація не збирається і не передається."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
+msgstr "Це потребує з'єднання з github.com, щоб порівняти цифри версії. Жодна інша інформація не збирається і не передається."
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
msgid "OK"
@@ -57,19 +53,12 @@ msgid "Export"
msgstr "Експортувати"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
-msgstr ""
-"Це зображення може бути експортоване тільки як SVG, оскільки його пропорції "
-"занадто екстремальні."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
+msgstr "Це зображення може бути експортоване тільки як SVG, оскільки його пропорції занадто екстремальні."
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
-msgstr ""
-"Це зображення може бути експортоване тільки як SVG, оскільки його розмір не "
-"завданий."
+msgid "The graphic can be exported only as SVG because its size is not defined."
+msgstr "Це зображення може бути експортоване тільки як SVG, оскільки його розмір не завданий."
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
#: src/ui_widgets/alert_dialog.gd: src/utils/FileUtils.gd:
@@ -101,12 +90,8 @@ msgid "The last edited state of this tab could not be found."
msgstr "Останній редагований стан цієї вкладки не може бути знайдено."
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
-msgstr ""
-"Ця вкладка пов'язана з шляхом до файлу {file_path}. Бажаєте відновити SVG з "
-"цього шляху?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
+msgstr "Ця вкладка пов'язана з шляхом до файлу {file_path}. Бажаєте відновити SVG з цього шляху?"
#: src/config_classes/Formatter.gd:
msgid "Compact"
@@ -144,6 +129,30 @@ msgstr "3 або 6 значне шістнадцятирічне число"
msgid "6-digit hex"
msgstr "6 значне шістнадцятирічне число"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "Висота"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr "Порожньо"
@@ -164,26 +173,26 @@ msgstr "Текст"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} повинен бути всередині {allowed} щоб зміни вступили в силу."
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "Ця група не має елементів."
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "Ця група має тільки один елемент."
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "Не вказано \"id\" атрибуту."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "Немає елементів під цим градієнтом."
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "Цей градієнт це суцільний колір."
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "Ця група не має елементів."
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "Ця група має тільки один елемент."
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "Не є описом SVG."
@@ -214,6 +223,7 @@ msgstr "Ліцензія"
msgid "Third-party licenses"
msgstr "Ліцензії третіх осіб"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "Засновник і керівник проекту"
@@ -268,7 +278,7 @@ msgstr "Новий елемент"
msgid "Dimensions"
msgstr "Розміри"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "Розмір"
@@ -292,7 +302,7 @@ msgstr "Якість"
msgid "Scale"
msgstr "Масштаб"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "Ширина"
@@ -373,12 +383,8 @@ msgid "Copy path"
msgstr "Скопіювати шлях"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
-msgstr ""
-"Файл з назваою \"{file_name}\" вже існує. Його заміна призведе до перезапису "
-"його вмісту!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
+msgstr "Файл з назваою \"{file_name}\" вже існує. Його заміна призведе до перезапису його вмісту!"
#: src/ui_parts/handles_manager.gd:
msgid "New shape"
@@ -461,10 +467,33 @@ msgstr "Вкладка"
msgid "Other"
msgstr "Інше"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "Скинути масштаб"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Primary theme colors"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "Базовий колір"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "Колір тексту"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "Колір SVG тексту"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "Колір символу"
@@ -498,10 +527,11 @@ msgstr "Колір CDATA"
msgid "Error color"
msgstr "Колір помилки"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "Колір ручки редагування"
+#, fuzzy
+msgid "Handles"
+msgstr "Розмір ручок редагування"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -523,13 +553,33 @@ msgstr "Колір обраного"
msgid "Hovered selected color"
msgstr "Колір наведено-виділеного"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "Обрати зображення"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "Кольорова піпетка"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "Базовий колір"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "Колір фону"
+#, fuzzy
+msgid "Canvas color"
+msgstr "Внутрішній колір"
#: src/ui_parts/settings_menu.gd:
msgid "Grid color"
@@ -551,18 +601,64 @@ msgstr "Пристрої вводу"
msgid "Close tabs with middle mouse button"
msgstr "Закривати вкладки при натисканні середньої кнопки миші"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr "Якщо увімкнено - клацання на вкладку середньою кнопкою миші закриє її. Якщо вимкнено - фокус буде замінено на неї."
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "Інвертувати напрямок масштабування"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr "Міняє напрям гортання при масштабуванні."
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr "Захопити курсор при гортанні"
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr "Курсор буде телепортуватися від одного краю до протилежного при пересуванні вікна перегляду."
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "Використовувати CTRL для масштабування"
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "Якщо увімкнено - гортання буде рухати вікно перегляду. Щоб масштабувати, затисніть CTRL доки гортаєте."
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "Масштаб інтерфейсу"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "Змінити масштаб інтерфейсу користувача."
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "Різне"
@@ -572,21 +668,16 @@ msgid "Use native file dialog"
msgstr "Використовувати рідний файловий діалог"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "Синхронізувати заголовок вікна з назвою поточного файлу"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "Розмір ручок редагування"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "Якщо увімкнено, то буде використовувати рідний файловий діалог вашої операційної системи для обирання файлів. Якщо вимкнено, то замість буде використовуватися вбудований файловий діалог."
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "Масштаб інтерфейсу"
+msgid "Sync window title to file name"
+msgstr "Синхронізувати заголовок вікна з назвою поточного файлу"
#: src/ui_parts/settings_menu.gd:
-msgid "Changes the scale factor for the interface."
-msgstr "Змінити масштаб інтерфейсу користувача."
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "Якщо вимкнено - заголовок вікна залишиться як \"GodSVG\", не включаючи назву поточного файлу."
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -622,10 +713,6 @@ msgstr "Форматер експорту"
msgid "Help"
msgstr "Допомога"
-#: src/ui_parts/settings_menu.gd:
-msgid "Reset all to default"
-msgstr "Скинути до замовчування"
-
# не знаю
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
@@ -722,54 +809,6 @@ msgstr "Список трансформацій"
msgid "Remove unnecessary parameters"
msgstr "Видалити необов'язкові параметри"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-"Якщо увімкнено - клацання на вкладку середньою кнопкою миші закриє її. Якщо "
-"вимкнено - фокус буде замінено на неї."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr "Міняє напрям гортання при масштабуванні."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-"Курсор буде телепортуватися від одного краю до протилежного при пересуванні "
-"вікна перегляду."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr ""
-"Якщо увімкнено - гортання буде рухати вікно перегляду. Щоб масштабувати, "
-"затисніть CTRL доки гортаєте."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"Якщо увімкнено, то буде використовувати рідний файловий діалог вашої "
-"операційної системи для обирання файлів. Якщо вимкнено, то замість буде "
-"використовуватися вбудований файловий діалог."
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr ""
-"Якщо вимкнено - заголовок вікна залишиться як \"GodSVG\", не включаючи назву "
-"поточного файлу."
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "Змінює візуальний розмір та область захоплення для ручок."
-
#: src/ui_parts/shortcut_panel.gd:
msgid "Horizontal strip"
msgstr "Горизонтальна смужка"
@@ -859,6 +898,10 @@ msgstr "Видалити колір"
msgid "Unnamed"
msgstr "Без назви"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
msgid "Color keywords"
msgstr "Ключові слова кольорів"
@@ -924,6 +967,14 @@ msgstr "Немає точок"
msgid "Also used by"
msgstr "Також використовується"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "Скинути значення до замовчування"
@@ -1018,9 +1069,7 @@ msgstr "Файл {file_path} вже редагується в GodSVG."
#: src/utils/FileUtils.gd:
msgid "If you want to revert your edits since the last save, use {reset_svg}."
-msgstr ""
-"Якщо ви бажаєте повернути свої зміни з останнього збереження, використовуйте "
-"{reset_svg}."
+msgstr "Якщо ви бажаєте повернути свої зміни з останнього збереження, використовуйте {reset_svg}."
#: src/utils/FileUtils.gd:
msgid "Do you want to save the changes made to {file_name}?"
@@ -1326,15 +1375,23 @@ msgstr "Зберегти {format} файл"
#: src/utils/TranslationUtils.gd:
msgid "Only {extension_list} files are supported for this operation."
-msgstr ""
-"Тільки файли з розширеннями {extension_list} підтримуються для цієї операції."
+msgstr "Тільки файли з розширеннями {extension_list} підтримуються для цієї операції."
+
+#~ msgid "Handle colors"
+#~ msgstr "Колір ручки редагування"
+
+#~ msgid "Background color"
+#~ msgstr "Колір фону"
+
+#~ msgid "Reset all to default"
+#~ msgstr "Скинути до замовчування"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "Змінює візуальний розмір та область захоплення для ручок."
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "Розширення файлу {extension} не підтримується для цієї операції. Тільки "
-#~ "{extension_list} файли підтримуються."
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "Розширення файлу {extension} не підтримується для цієї операції. Тільки {extension_list} файли підтримуються."
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "Зберегти .\"{format}\" файл"
@@ -1361,16 +1418,11 @@ msgstr ""
#~ msgid "Save as"
#~ msgstr "Зберегти як"
-#~ msgid ""
-#~ "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
-#~ msgstr ""
-#~ "Якщо ви бажаєте застосувати не збережений стан файлу, використайте "
-#~ "\"Скинути SVG\"."
+#~ msgid "If you want to apply the unsaved file state, use \"Reset SVG\" instead."
+#~ msgstr "Якщо ви бажаєте застосувати не збережений стан файлу, використайте \"Скинути SVG\"."
#~ msgid "Auto UI scale"
#~ msgstr "Автоматичний масштаб інтерфейсу"
#~ msgid "Scales the interface automatically based on the screen size."
-#~ msgstr ""
-#~ "Автоматично масштабувати інтерфейс користувача в залежності від розміру "
-#~ "екрану."
+#~ msgstr "Автоматично масштабувати інтерфейс користувача в залежності від розміру екрану."
diff --git a/translations/zh_CN.po b/translations/zh_CN.po
index 1f1844c..e562e82 100644
--- a/translations/zh_CN.po
+++ b/translations/zh_CN.po
@@ -32,9 +32,7 @@ msgid "Check for updates?"
msgstr "检查更新?"
#: src/autoload/HandlerGUI.gd:
-msgid ""
-"This will connect to github.com to compare version numbers. No other data is "
-"collected or transmitted."
+msgid "This will connect to github.com to compare version numbers. No other data is collected or transmitted."
msgstr ""
#: src/autoload/HandlerGUI.gd: src/ui_widgets/alert_dialog.gd:
@@ -57,15 +55,12 @@ msgstr "导出"
#: src/autoload/HandlerGUI.gd:
#, fuzzy
-msgid ""
-"The graphic can be exported only as SVG because its proportions are too "
-"extreme."
+msgid "The graphic can be exported only as SVG because its proportions are too extreme."
msgstr "此图像只能以 SVG 格式导出,因为其大小未定义。您确定要继续吗?"
#: src/autoload/HandlerGUI.gd:
#, fuzzy
-msgid ""
-"The graphic can be exported only as SVG because its size is not defined."
+msgid "The graphic can be exported only as SVG because its size is not defined."
msgstr "此图像只能以 SVG 格式导出,因为其大小未定义。您确定要继续吗?"
#: src/autoload/State.gd: src/ui_parts/good_file_dialog.gd:
@@ -100,9 +95,7 @@ msgid "The last edited state of this tab could not be found."
msgstr ""
#: src/autoload/State.gd:
-msgid ""
-"The tab is bound to the file path {file_path}. Do you want to restore the "
-"SVG from this path?"
+msgid "The tab is bound to the file path {file_path}. Do you want to restore the SVG from this path?"
msgstr ""
#: src/config_classes/Formatter.gd:
@@ -141,6 +134,30 @@ msgstr "3 位或 6 位十六进制"
msgid "6-digit hex"
msgstr "6 位十六进制"
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Dark"
+msgstr ""
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+#, fuzzy
+msgid "Light"
+msgstr "高度"
+
+#. Refers to a theme preset.
+#: src/config_classes/SaveData.gd:
+msgid "Black (OLED)"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Dark"
+msgstr ""
+
+#: src/config_classes/SaveData.gd:
+msgid "Default Light"
+msgstr ""
+
#: src/config_classes/TabData.gd:
msgid "Empty"
msgstr ""
@@ -161,26 +178,26 @@ msgstr "文本"
msgid "{element} must be inside {allowed} to have any effect."
msgstr "{element} 必须在 {allowed} 内才能产生作用。"
-#: src/data_classes/ElementG.gd:
-msgid "This group has no elements."
-msgstr "此组内没有元素。"
-
-#: src/data_classes/ElementG.gd:
-msgid "This group has only one element."
-msgstr "此组内只有一个元素。"
-
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No \"id\" attribute defined."
msgstr "\"id\" 属性未定义。"
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "No elements under this gradient."
msgstr "此渐变下没有 元素。"
-#: src/data_classes/GradientUtils.gd:
+#: src/data_classes/ElementBaseGradient.gd:
msgid "This gradient is a solid color."
msgstr "此渐变为单一颜色。"
+#: src/data_classes/ElementG.gd:
+msgid "This group has no elements."
+msgstr "此组内没有元素。"
+
+#: src/data_classes/ElementG.gd:
+msgid "This group has only one element."
+msgstr "此组内只有一个元素。"
+
#: src/data_classes/SVGParser.gd:
msgid "Doesn’t describe an SVG."
msgstr "文本不是 SVG 格式。"
@@ -211,6 +228,7 @@ msgstr "协议"
msgid "Third-party licenses"
msgstr "第三方协议"
+#. If the language has different gendered versions, prefer the most neutral-sounding one, i.e., the one used when you don't know the person's gender. If that's not possible, use feminine.
#: src/ui_parts/about_menu.gd:
msgid "Project Founder and Manager"
msgstr "项目创立者与管理者"
@@ -267,7 +285,7 @@ msgstr "新元素"
msgid "Dimensions"
msgstr "大小"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Size"
msgstr "大小"
@@ -291,7 +309,7 @@ msgstr "质量"
msgid "Scale"
msgstr "缩放"
-#: src/ui_parts/export_menu.gd:
+#: src/ui_parts/export_menu.gd: src/ui_parts/settings_menu.gd:
msgid "Width"
msgstr "宽度"
@@ -372,9 +390,7 @@ msgid "Copy path"
msgstr "复制路径"
#: src/ui_parts/good_file_dialog.gd:
-msgid ""
-"A file named \"{file_name}\" already exists. Replacing will overwrite its "
-"contents!"
+msgid "A file named \"{file_name}\" already exists. Replacing will overwrite its contents!"
msgstr "文件 “{file_name}” 已经存在。替换操作将会覆写它的内容!"
#: src/ui_parts/handles_manager.gd:
@@ -458,10 +474,34 @@ msgstr ""
msgid "Other"
msgstr "其他"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Theme preset"
+msgstr "重置缩放"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Primary theme colors"
+msgstr "禁用该颜色"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Base color"
+msgstr "基本颜色"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Accent color"
+msgstr "文本颜色"
+
#: src/ui_parts/settings_menu.gd:
msgid "SVG Text colors"
msgstr "SVG 文本颜色"
+#: src/ui_parts/settings_menu.gd:
+msgid "Highlighter preset"
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Symbol color"
msgstr "符号颜色"
@@ -495,10 +535,11 @@ msgstr "CDATA 颜色"
msgid "Error color"
msgstr "错误颜色"
-#. Refers to the colors of the draggable handles.
+#. Refers to the draggable gizmos.
#: src/ui_parts/settings_menu.gd:
-msgid "Handle colors"
-msgstr "拖拽框颜色"
+#, fuzzy
+msgid "Handles"
+msgstr "拖拽框大小"
#: src/ui_parts/settings_menu.gd:
msgid "Inside color"
@@ -520,13 +561,33 @@ msgstr "选中颜色"
msgid "Hovered selected color"
msgstr "悬停且选中颜色"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Selection rectangle"
+msgstr "选择图像"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Speed"
+msgstr ""
+
+#. Refers to the selection rectangle's animated dashed stroke.
+#: src/ui_parts/settings_menu.gd:
+msgid "Dash length"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Color {index}"
+msgstr "取色器"
+
#: src/ui_parts/settings_menu.gd:
msgid "Basic colors"
msgstr "基本颜色"
#: src/ui_parts/settings_menu.gd:
-msgid "Background color"
-msgstr "背景颜色"
+#, fuzzy
+msgid "Canvas color"
+msgstr "内部颜色"
#: src/ui_parts/settings_menu.gd:
#, fuzzy
@@ -549,18 +610,65 @@ msgstr "输入"
msgid "Close tabs with middle mouse button"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "If turned on, clicking on a tab with the middle mouse button closes the tab. If turned off, it focuses the tab instead."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Invert zoom direction"
msgstr "反转缩放方向"
+#: src/ui_parts/settings_menu.gd:
+msgid "Swaps the scroll directions for zooming in and zooming out."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Wrap-around panning"
msgstr ""
+#: src/ui_parts/settings_menu.gd:
+msgid "Warps the cursor to the opposite side whenever it reaches a viewport boundary while panning."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Use CTRL for zooming"
msgstr "使用 CTRL 键缩放"
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
+msgstr "如果启用,滚动鼠标滚轮将移动视图。按住 CTRL 并滚动滚轮以缩放。"
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Display"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "UI scale"
+msgstr "UI 缩放"
+
+#: src/ui_parts/settings_menu.gd:
+#, fuzzy
+msgid "Determines the scale factor for the interface."
+msgstr "改变用户界面的缩放尺寸。"
+
+#. Stands for "Vertical Synchronization".
+#: src/ui_parts/settings_menu.gd:
+msgid "V-Sync"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Synchronizes graphics rendering with display refresh rate to prevent screen tearing artifacts. May increase input lag slightly."
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/ui_parts/settings_menu.gd:
+msgid "Determines the maximum number of frames per second."
+msgstr ""
+
#: src/ui_parts/settings_menu.gd:
msgid "Miscellaneous"
msgstr "杂项"
@@ -570,22 +678,17 @@ msgid "Use native file dialog"
msgstr "使用系统自带文件选择窗口"
#: src/ui_parts/settings_menu.gd:
-msgid "Sync window title to file name"
-msgstr "同步窗口标题为文件名"
-
-#. Refers to the size of the draggable handles.
-#: src/ui_parts/settings_menu.gd:
-msgid "Handle size"
-msgstr "拖拽框大小"
+msgid "If turned on, uses your operating system's native file dialog. If turned off, uses GodSVG's built-in file dialog."
+msgstr "如果启用,将使用操作系统自带的文件选择窗口。反之,将使用 GodSVG 内置的文件选择窗口。"
#: src/ui_parts/settings_menu.gd:
-msgid "UI scale"
-msgstr "UI 缩放"
+msgid "Sync window title to file name"
+msgstr "同步窗口标题为文件名"
#: src/ui_parts/settings_menu.gd:
#, fuzzy
-msgid "Changes the scale factor for the interface."
-msgstr "改变用户界面的缩放尺寸。"
+msgid "If turned off, the window title remains as \"GodSVG\" without including the current file."
+msgstr "如果禁用,不论当前打开的文件是什么,窗口标题都将固定为 “GodSVG”。"
#: src/ui_parts/settings_menu.gd:
msgid "Language"
@@ -623,11 +726,6 @@ msgstr "导出格式"
msgid "Help"
msgstr "帮助"
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid "Reset all to default"
-msgstr "恢复默认"
-
#: src/ui_parts/settings_menu.gd:
msgid "Preset"
msgstr "预设"
@@ -720,47 +818,6 @@ msgstr "变换列表"
msgid "Remove unnecessary parameters"
msgstr "移除不必要的参数"
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, clicking on a tab with the middle mouse button closes the tab. "
-"If turned off, it focuses the tab instead."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Swaps the scroll directions for zooming in and zooming out."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"Warps the cursor to the opposite side whenever it reaches a viewport "
-"boundary while panning."
-msgstr ""
-
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid ""
-"If turned on, scrolling pans the view. To zoom, hold CTRL while scrolling."
-msgstr "如果启用,滚动鼠标滚轮将移动视图。按住 CTRL 并滚动滚轮以缩放。"
-
-#: src/ui_parts/settings_menu.gd:
-msgid ""
-"If turned on, uses your operating system's native file dialog. If turned "
-"off, uses GodSVG's built-in file dialog."
-msgstr ""
-"如果启用,将使用操作系统自带的文件选择窗口。反之,将使用 GodSVG 内置的文件选"
-"择窗口。"
-
-#: src/ui_parts/settings_menu.gd:
-#, fuzzy
-msgid ""
-"If turned off, the window title remains as \"GodSVG\" without including the "
-"current file."
-msgstr "如果禁用,不论当前打开的文件是什么,窗口标题都将固定为 “GodSVG”。"
-
-#: src/ui_parts/settings_menu.gd:
-msgid "Changes the visual size and grabbing area of handles."
-msgstr "改变拖拽框的视觉和操作区域大小。"
-
#: src/ui_parts/shortcut_panel.gd:
#, fuzzy
msgid "Horizontal strip"
@@ -857,6 +914,10 @@ msgstr "删除颜色"
msgid "Unnamed"
msgstr "未命名"
+#: src/ui_widgets/fps_limit_dropdown.gd: src/ui_widgets/setting_frame.gd:
+msgid "Unlimited"
+msgstr ""
+
#: src/ui_widgets/good_color_picker.gd:
#, fuzzy
msgid "Color keywords"
@@ -924,6 +985,14 @@ msgstr "没有点"
msgid "Also used by"
msgstr "还用于"
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply"
+msgstr ""
+
+#: src/ui_widgets/profile_frame.gd:
+msgid "Apply all of this preset's defaults"
+msgstr ""
+
#: src/ui_widgets/setting_frame.gd: src/ui_widgets/setting_shortcut.gd:
msgid "Reset to default"
msgstr "恢复默认"
@@ -1347,11 +1416,22 @@ msgstr "保存 .\"{format}\" 文件"
msgid "Only {extension_list} files are supported for this operation."
msgstr "文件扩展名为空。只有 {extension_list} 内的文件受支持。"
-#~ msgid ""
-#~ "The file extension {extension} is unsupported for this operation. Only "
-#~ "{extension_list} files are supported."
-#~ msgstr ""
-#~ "扩展名 {extension} 不支持此操作。只有 {extension_list} 内的文件受支持。"
+#~ msgid "Handle colors"
+#~ msgstr "拖拽框颜色"
+
+#~ msgid "Background color"
+#~ msgstr "背景颜色"
+
+#, fuzzy
+#~ msgid "Reset all to default"
+#~ msgstr "恢复默认"
+
+#, fuzzy
+#~ msgid "Determines the visual size and grabbing area of handles."
+#~ msgstr "改变拖拽框的视觉和操作区域大小。"
+
+#~ msgid "The file extension {extension} is unsupported for this operation. Only {extension_list} files are supported."
+#~ msgstr "扩展名 {extension} 不支持此操作。只有 {extension_list} 内的文件受支持。"
#~ msgid "Save the .\"{format}\" file"
#~ msgstr "保存 .\"{format}\" 文件"
@@ -1420,9 +1500,6 @@ msgstr "文件扩展名为空。只有 {extension_list} 内的文件受支持。
#~ msgid "Enable the color"
#~ msgstr "启用该颜色"
-#~ msgid "Disable the color"
-#~ msgstr "禁用该颜色"
-
#~ msgid "Invalid"
#~ msgstr "无效"
@@ -1431,8 +1508,7 @@ msgstr "文件扩展名为空。只有 {extension_list} 内的文件受支持。
#~ msgid ""
#~ "The file couldn't be opened.\n"
-#~ "Try checking the file path, ensure that the file is not deleted, or "
-#~ "choose a different file."
+#~ "Try checking the file path, ensure that the file is not deleted, or choose a different file."
#~ msgstr ""
#~ "文件无法打开。\n"
#~ "尝试检查路径,确保文件没有被删除,或选择一个不同的文件。"