Compare commits

...

16 Commits

55 changed files with 1004 additions and 372 deletions

View File

@@ -1,4 +1,4 @@
[gd_resource type="Theme" load_steps=229 format=3 uid="uid://b8rk41gjual2b"]
[gd_resource type="Theme" load_steps=238 format=3 uid="uid://b8rk41gjual2b"]
[ext_resource type="FontFile" uid="uid://501bous51s3p" path="res://Assets/Fonts/Inter-Regular.ttf" id="1_a74l0"]
[ext_resource type="Texture2D" uid="uid://blqywcg2e22in" path="res://Assets/Icons/checked.svg" id="2_jlkvh"]
@@ -115,13 +115,17 @@ content_margin_left = 4.0
content_margin_top = 6.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(0.145098, 0.145098, 0.145098, 1)
bg_color = Color(0.14902, 0.14902, 0.14902, 1)
draw_center = false
border_color = Color(0.0870588, 0.0870588, 0.0870588, 1)
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8loco"]
bg_color = Color(0.321569, 0.321569, 0.321569, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jduyo"]
content_margin_left = 5.0
content_margin_top = 4.0
@@ -1700,7 +1704,7 @@ corner_radius_bottom_left = 3
corner_detail = 3
anti_aliasing = false
[sub_resource type="Image" id="Image_8w8ju"]
[sub_resource type="Image" id="Image_hry0s"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 255, 255, 255, 41, 255, 255, 255, 67, 255, 255, 255, 67, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 41, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 67, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 67, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 67, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 67, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 40, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 74, 255, 255, 255, 40, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 255, 255, 255, 40, 255, 255, 255, 67, 255, 255, 255, 67, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
"format": "RGBA8",
@@ -1710,7 +1714,7 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_bk0hb"]
image = SubResource("Image_8w8ju")
image = SubResource("Image_hry0s")
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_0hke8"]
content_margin_left = 7.0
@@ -1723,7 +1727,7 @@ texture_margin_top = 6.0
texture_margin_right = 6.0
texture_margin_bottom = 6.0
[sub_resource type="Image" id="Image_tx7cq"]
[sub_resource type="Image" id="Image_4rrmf"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 6, 248, 248, 248, 102, 249, 249, 249, 168, 249, 249, 249, 168, 248, 248, 248, 101, 213, 213, 213, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 248, 248, 248, 102, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 248, 248, 248, 101, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 249, 249, 249, 168, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 249, 249, 249, 168, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 248, 248, 248, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 248, 248, 248, 101, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 249, 249, 249, 186, 250, 250, 250, 99, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 213, 213, 213, 6, 248, 248, 248, 101, 249, 249, 249, 168, 248, 248, 248, 168, 250, 250, 250, 99, 213, 213, 213, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
"format": "RGBA8",
@@ -1733,7 +1737,7 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_uc42h"]
image = SubResource("Image_tx7cq")
image = SubResource("Image_4rrmf")
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_asndq"]
content_margin_left = 6.0
@@ -1746,7 +1750,7 @@ texture_margin_top = 5.0
texture_margin_right = 5.0
texture_margin_bottom = 5.0
[sub_resource type="Image" id="Image_8almr"]
[sub_resource type="Image" id="Image_xd5fw"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 213, 213, 213, 6, 180, 180, 180, 102, 181, 181, 181, 168, 181, 181, 181, 168, 179, 179, 179, 101, 170, 170, 170, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 180, 180, 180, 102, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 179, 179, 179, 101, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 181, 181, 181, 168, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 181, 181, 181, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 181, 181, 181, 168, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 179, 179, 179, 168, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 179, 179, 179, 101, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 180, 180, 180, 186, 181, 181, 181, 99, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 170, 170, 170, 6, 179, 179, 179, 101, 181, 181, 181, 168, 179, 179, 179, 168, 181, 181, 181, 99, 170, 170, 170, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
"format": "RGBA8",
@@ -1756,7 +1760,7 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_y6fi8"]
image = SubResource("Image_8almr")
image = SubResource("Image_xd5fw")
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_7amsq"]
content_margin_left = 7.0
@@ -1769,7 +1773,7 @@ texture_margin_top = 6.0
texture_margin_right = 6.0
texture_margin_bottom = 6.0
[sub_resource type="Image" id="Image_kfbnc"]
[sub_resource type="Image" id="Image_jkmfx"]
data = {
"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 7, 255, 255, 255, 19, 255, 255, 255, 19, 255, 255, 255, 7, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 19, 255, 255, 255, 21, 255, 255, 255, 21, 255, 255, 255, 19, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 19, 255, 255, 255, 21, 255, 255, 255, 21, 255, 255, 255, 19, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 7, 255, 255, 255, 19, 255, 255, 255, 19, 255, 255, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
"format": "RGBA8",
@@ -1779,7 +1783,7 @@ data = {
}
[sub_resource type="ImageTexture" id="ImageTexture_lfhcu"]
image = SubResource("Image_kfbnc")
image = SubResource("Image_jkmfx")
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_tef5f"]
content_margin_left = 0.0
@@ -1913,72 +1917,68 @@ corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0uu8j"]
content_margin_left = 6.0
content_margin_top = 5.0
content_margin_right = 6.0
content_margin_bottom = 5.0
bg_color = Color(0.130588, 0.130588, 0.130588, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_uqdmw"]
content_margin_left = 8.0
content_margin_top = 4.0
content_margin_right = 8.0
content_margin_bottom = 4.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
border_color = Color(0.101569, 0.101569, 0.101569, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_40oom"]
content_margin_left = 6.0
content_margin_top = 5.0
content_margin_right = 6.0
content_margin_bottom = 5.0
bg_color = Color(1, 1, 1, 0.11)
border_color = Color(1, 1, 1, 0.05)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ru5vq"]
content_margin_left = 16.0
content_margin_top = 4.0
content_margin_right = 16.0
content_margin_bottom = 4.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
border_color = Color(0.101569, 0.101569, 0.101569, 1)
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pe0jj"]
content_margin_left = 6.0
content_margin_top = 5.0
content_margin_right = 6.0
content_margin_bottom = 5.0
content_margin_left = 16.0
content_margin_top = 4.0
content_margin_right = 16.0
content_margin_bottom = 4.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
border_width_bottom = 1
border_color = Color(1, 1, 1, 1)
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dyudt"]
content_margin_left = 16.0
content_margin_top = 4.0
content_margin_right = 16.0
content_margin_bottom = 4.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
border_color = Color(0.101569, 0.101569, 0.101569, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tbd5c"]
content_margin_left = 6.0
content_margin_top = 5.0
content_margin_right = 6.0
content_margin_bottom = 5.0
bg_color = Color(0.101569, 0.101569, 0.101569, 1)
border_color = Color(0.101569, 0.101569, 0.101569, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_radius_bottom_right = 3
corner_radius_bottom_left = 3
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_sra54"]
bg_color = Color(0.14902, 0.14902, 0.14902, 1)
draw_center = false
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l5ore"]
content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
bg_color = Color(1, 1, 1, 0.0588235)
corner_radius_top_left = 4
corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.223529, 0.223529, 0.223529, 1)
corner_detail = 4
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_woj82"]
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.298039, 0.298039, 0.298039, 1)
corner_detail = 4
anti_aliasing = false
@@ -2081,7 +2081,7 @@ content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
bg_color = Color(0.0862745, 0.0862745, 0.0862745, 1)
corner_detail = 3
anti_aliasing = false
@@ -2142,7 +2142,7 @@ corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wdhdm"]
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
bg_color = Color(0.0862745, 0.0862745, 0.0862745, 1)
corner_detail = 3
anti_aliasing = false
@@ -2159,11 +2159,7 @@ shadow_size = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yg4d4"]
bg_color = Color(1, 1, 1, 0.0588235)
corner_radius_top_left = 4
corner_radius_top_right = 4
corner_radius_bottom_right = 4
corner_radius_bottom_left = 4
bg_color = Color(0.2, 0.2, 0.2, 1)
[sub_resource type="StyleBoxLine" id="StyleBoxLine_f3cpk"]
color = Color(1, 1, 1, 0.1)
@@ -2174,14 +2170,14 @@ color = Color(1, 1, 1, 0.1)
grow_end = 8.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cbgao"]
content_margin_left = 6.0
content_margin_top = 6.0
content_margin_right = 6.0
content_margin_bottom = 6.0
bg_color = Color(0.11, 0.11, 0.11, 1)
content_margin_left = 0.0
content_margin_top = 4.0
content_margin_right = 0.0
content_margin_bottom = 4.0
bg_color = Color(0.14902, 0.14902, 0.14902, 1)
[sub_resource type="StyleBoxLine" id="StyleBoxLine_rijeh"]
color = Color(1, 1, 1, 0.0784314)
color = Color(0.223529, 0.223529, 0.223529, 1)
grow_begin = -6.0
grow_end = -6.0
@@ -2312,23 +2308,20 @@ corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lgkqp"]
content_margin_left = 11.0
content_margin_top = 5.0
content_margin_right = 11.0
content_margin_bottom = 5.0
content_margin_left = 16.0
content_margin_right = 16.0
bg_color = Color(0.145098, 0.145098, 0.145098, 1)
border_width_top = 2
border_color = Color(0.278333, 0.490098, 0.775392, 1)
draw_center = false
border_width_bottom = 1
border_color = Color(0.270588, 0.537255, 1, 1)
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6fhxt"]
content_margin_left = 11.0
content_margin_top = 5.0
content_margin_right = 11.0
content_margin_bottom = 5.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
border_color = Color(0, 0, 0, 0)
draw_center = false
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_detail = 3
@@ -2337,12 +2330,33 @@ anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kwdgv"]
bg_color = Color(1, 1, 1, 0)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4rrmf"]
content_margin_left = 16.0
content_margin_right = 16.0
bg_color = Color(0.145098, 0.145098, 0.145098, 1)
draw_center = false
border_width_bottom = 1
border_color = Color(0.321569, 0.321569, 0.321569, 1)
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xd5fw"]
content_margin_left = 16.0
content_margin_right = 16.0
bg_color = Color(0.145098, 0.145098, 0.145098, 1)
draw_center = false
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o0sc5"]
content_margin_left = 0.0
content_margin_top = 0.0
content_margin_right = 0.0
content_margin_bottom = 0.0
bg_color = Color(0.116078, 0.116078, 0.116078, 1)
draw_center = false
corner_radius_top_left = 3
corner_radius_top_right = 3
corner_detail = 3
@@ -2442,7 +2456,7 @@ content_margin_left = 7.0
content_margin_top = 2.0
content_margin_right = 7.0
content_margin_bottom = 2.0
bg_color = Color(0.101961, 0.101961, 0.101961, 1)
bg_color = Color(0.0862745, 0.0862745, 0.0862745, 1)
border_color = Color(0.101569, 0.101569, 0.101569, 1)
corner_radius_top_left = 4
corner_radius_top_right = 4
@@ -2454,8 +2468,10 @@ content_margin_left = 6.0
content_margin_top = 4.0
content_margin_right = 6.0
content_margin_bottom = 4.0
bg_color = Color(0.06, 0.06, 0.06, 1)
corner_detail = 3
bg_color = Color(0.14902, 0.14902, 0.14902, 1)
draw_center = false
border_width_bottom = 1
border_color = Color(0.14902, 0.14902, 0.14902, 1)
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_qr21i"]
@@ -2472,6 +2488,38 @@ corner_radius_bottom_left = 8
corner_detail = 4
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jkmfx"]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.19, 0.19, 0.19, 1)
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c8ejd"]
content_margin_left = 16.0
content_margin_top = 16.0
content_margin_right = 16.0
content_margin_bottom = 16.0
bg_color = Color(0.14902, 0.14902, 0.14902, 1)
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jmej4"]
content_margin_left = 32.0
content_margin_top = 32.0
content_margin_right = 32.0
content_margin_bottom = 32.0
bg_color = Color(0.14902, 0.14902, 0.14902, 1)
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hry0s"]
draw_center = false
border_width_bottom = 1
border_color = Color(0.223529, 0.223529, 0.223529, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_68sxm"]
content_margin_left = 3.0
content_margin_right = 3.0
@@ -2677,8 +2725,10 @@ AssetLib/colors/status_color = Color(0.5, 0.5, 0.5, 1)
AssetLib/icons/dismiss = null
AssetLib/styles/bg = SubResource("StyleBoxEmpty_6c8sw")
AssetLib/styles/panel = SubResource("StyleBoxFlat_0c4py")
AudioClip/base_type = &"Panel"
AudioClip/colors/deselected_modulate = Color(0.552941, 0.552941, 0.552941, 1)
AudioClip/colors/selected_modulate = Color(1, 1, 1, 1)
AudioClip/styles/panel = SubResource("StyleBoxFlat_8loco")
BottomPanelButton/styles/hover = SubResource("StyleBoxFlat_jduyo")
BottomPanelButton/styles/hover_pressed = SubResource("StyleBoxFlat_jduyo")
BottomPanelButton/styles/normal = SubResource("StyleBoxFlat_sxnkh")
@@ -4250,10 +4300,12 @@ MenuBar/colors/icon_normal_color = Color(1, 1, 1, 1)
MenuBar/colors/icon_pressed_color = Color(0.387843, 0.712549, 1.15, 1)
MenuBar/constants/h_separation = 4
MenuBar/constants/outline_size = 0
MenuBar/styles/disabled = SubResource("StyleBoxFlat_0uu8j")
MenuBar/styles/hover = SubResource("StyleBoxFlat_40oom")
MenuBar/styles/disabled = SubResource("StyleBoxFlat_uqdmw")
MenuBar/styles/hover = SubResource("StyleBoxFlat_ru5vq")
MenuBar/styles/normal = SubResource("StyleBoxFlat_pe0jj")
MenuBar/styles/pressed = SubResource("StyleBoxFlat_tbd5c")
MenuBar/styles/pressed = SubResource("StyleBoxFlat_dyudt")
MenuBarPanel/base_type = &"Panel"
MenuBarPanel/styles/panel = SubResource("StyleBoxFlat_sra54")
MenuButton/colors/font_color = Color(0.786274, 0.786274, 0.786274, 1)
MenuButton/colors/font_focus_color = Color(0.893137, 0.893137, 0.893137, 1)
MenuButton/colors/font_hover_color = Color(0.893137, 0.893137, 0.893137, 1)
@@ -4263,7 +4315,7 @@ MenuButton/constants/outline_size = 0
MenuButton/styles/disabled = SubResource("StyleBoxFlat_l5ore")
MenuButton/styles/disabled_mirrored = SubResource("StyleBoxFlat_l5ore")
MenuButton/styles/focus = SubResource("StyleBoxFlat_l5ore")
MenuButton/styles/hover = SubResource("StyleBoxFlat_5kevk")
MenuButton/styles/hover = SubResource("StyleBoxFlat_woj82")
MenuButton/styles/hover_mirrored = SubResource("StyleBoxFlat_5kevk")
MenuButton/styles/hover_pressed = SubResource("StyleBoxFlat_jccna")
MenuButton/styles/hover_pressed_mirrored = SubResource("StyleBoxFlat_jccna")
@@ -4398,10 +4450,10 @@ TabBar/styles/tab_hovered = SubResource("StyleBoxFlat_tmq75")
TabBar/styles/tab_selected = SubResource("StyleBoxFlat_lgkqp")
TabBar/styles/tab_unselected = SubResource("StyleBoxFlat_6fhxt")
TabContainer/colors/drop_mark_color = Color(0.278333, 0.490098, 0.775392, 1)
TabContainer/colors/font_hovered_color = Color(0.786274, 0.786274, 0.786274, 1)
TabContainer/colors/font_outline_color = Color(0, 0, 0, 0)
TabContainer/colors/font_selected_color = Color(0.786274, 0.786274, 0.786274, 1)
TabContainer/colors/font_unselected_color = Color(1, 1, 1, 0.235294)
TabContainer/colors/font_hovered_color = Color(0.956863, 0.956863, 0.956863, 1)
TabContainer/colors/font_outline_color = Color(0.96, 0.96, 0.96, 0)
TabContainer/colors/font_selected_color = Color(0.956863, 0.956863, 0.956863, 1)
TabContainer/colors/font_unselected_color = Color(0.75, 0.75, 0.75, 1)
TabContainer/constants/outline_size = 0
TabContainer/constants/side_margin = 0
TabContainer/icons/decrement = null
@@ -4414,9 +4466,9 @@ TabContainer/icons/menu_highlight = null
TabContainer/styles/panel = SubResource("StyleBoxFlat_0c4py")
TabContainer/styles/tab_disabled = SubResource("StyleBoxFlat_lrq1b")
TabContainer/styles/tab_focus = SubResource("StyleBoxFlat_kwdgv")
TabContainer/styles/tab_hovered = SubResource("StyleBoxFlat_tmq75")
TabContainer/styles/tab_hovered = SubResource("StyleBoxFlat_4rrmf")
TabContainer/styles/tab_selected = SubResource("StyleBoxFlat_lgkqp")
TabContainer/styles/tab_unselected = SubResource("StyleBoxFlat_6fhxt")
TabContainer/styles/tab_unselected = SubResource("StyleBoxFlat_xd5fw")
TabContainer/styles/tabbar_background = SubResource("StyleBoxFlat_o0sc5")
TabContainerOdd/styles/panel = SubResource("StyleBoxFlat_plrjc")
TabContainerOdd/styles/tab_selected = SubResource("StyleBoxFlat_ecmpj")
@@ -4438,8 +4490,8 @@ TextEdit/styles/read_only = SubResource("StyleBoxFlat_6ucq2")
ThemeEditor/colors/preview_picker_overlay_color = Color(0.1, 0.1, 0.1, 0.25)
ThemeEditor/styles/preview_picker_label = SubResource("StyleBoxFlat_jtsa3")
ThemeEditor/styles/preview_picker_overlay = SubResource("StyleBoxFlat_qixj3")
Timeline/colors/line_primary_color = Color(0.4, 0.4, 0.4, 1)
Timeline/colors/line_secondary_color = Color(0.2, 0.2, 0.2, 1)
Timeline/colors/line_primary_color = Color(0.223529, 0.223529, 0.223529, 1)
Timeline/colors/line_secondary_color = Color(0.14902, 0.14902, 0.14902, 1)
Timeline/constants/time_label_offset_x = 30
Timeline/constants/time_label_offset_y = 20
Timeline/styles/background = SubResource("StyleBoxFlat_k6s8r")
@@ -4449,6 +4501,12 @@ TooltipLabel/colors/font_shadow_color = Color(0, 0, 0, 0)
TooltipPanel/styles/panel = SubResource("StyleBoxFlat_qr21i")
TopBarOptionButton/font_sizes/font_size = 14
TopBarOptionButton/fonts/font = ExtResource("1_a74l0")
Track/base_type = &"Button"
Track/styles/focus = SubResource("StyleBoxFlat_jkmfx")
Track/styles/hover = SubResource("StyleBoxFlat_c8ejd")
Track/styles/normal = SubResource("StyleBoxFlat_jmej4")
Transport/base_type = &"PanelContainer"
Transport/styles/panel = SubResource("StyleBoxFlat_hry0s")
Tree/colors/children_hl_line_color = Color(1, 1, 1, 0.0196078)
Tree/colors/custom_button_font_highlight = Color(0.893137, 0.893137, 0.893137, 1)
Tree/colors/drop_position_color = Color(1, 1, 1, 0.392157)

View File

@@ -23,6 +23,7 @@ allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
keep_rounding_remainders=true
oversampling=0.0
Fallbacks=null
fallbacks=[]

View File

@@ -23,6 +23,7 @@ allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
keep_rounding_remainders=true
oversampling=0.0
Fallbacks=null
fallbacks=[]

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#e8eaed"><path d="M560-131v-82q90-26 145-100t55-168q0-94-55-168T560-749v-82q124 28 202 125.5T840-481q0 127-78 224.5T560-131ZM120-360v-240h160l200-200v640L280-360H120Zm440 40v-322q47 22 73.5 66t26.5 96q0 51-26.5 94.5T560-320Z"/></svg>

After

Width:  |  Height:  |  Size: 331 B

View File

@@ -0,0 +1,37 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://doq1jqfntrjrc"
path="res://.godot/imported/audio_track_2.svg-73627df2be28a19ef8ff0e0571aff244.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/Icons/audio_track_2.svg"
dest_files=["res://.godot/imported/audio_track_2.svg-73627df2be28a19ef8ff0e0571aff244.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=true
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=8.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -1,8 +1,9 @@
<Project Sdk="Godot.NET.Sdk/4.3.0">
<Project Sdk="Godot.NET.Sdk/4.4.1">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net7.0</TargetFramework>
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'ios' ">net8.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NAudio" Version="2.2.1" />
</ItemGroup>
</Project>

View File

@@ -1,42 +1,73 @@
[gd_scene load_steps=3 format=3 uid="uid://dmmgalpx4fcc7"]
[ext_resource type="Script" path="res://Scripts/AudioClip.gd" id="1_iy5jd"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8tb17"]
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.273873, 0.273873, 0.273873, 1)
border_blend = true
[ext_resource type="Script" uid="uid://cxgi7wpdim7xs" path="res://Scripts/AudioClip.gd" id="1_iy5jd"]
[ext_resource type="Script" uid="uid://wrxkvb8fkmlp" path="res://Source/Waveform.cs" id="2_43oho"]
[node name="AudioClip" type="Panel"]
modulate = Color(0.552956, 0.552956, 0.552956, 1)
self_modulate = Color(1, 1, 1, 0.588235)
clip_contents = true
custom_minimum_size = Vector2(4, 64)
custom_minimum_size = Vector2(4, 32)
anchors_preset = -1
anchor_right = 0.104
anchor_bottom = 0.059
offset_right = 0.319992
offset_bottom = 0.279995
theme_override_styles/panel = SubResource("StyleBoxFlat_8tb17")
theme_type_variation = &"AudioClip"
script = ExtResource("1_iy5jd")
[node name="Panel" type="Panel" parent="."]
custom_minimum_size = Vector2(0, 14)
custom_minimum_size = Vector2(0, 20)
layout_mode = 1
anchors_preset = 10
anchors_preset = -1
anchor_right = 1.0
anchor_bottom = 0.312
offset_bottom = 0.0319996
grow_horizontal = 2
[node name="Label" type="Label" parent="Panel"]
[node name="ClipName" type="Label" parent="Panel"]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_font_sizes/font_size = 8
theme_override_font_sizes/font_size = 10
text = "New Audio Clip"
vertical_alignment = 1
text_overrun_behavior = 3
[node name="Window" type="ConfirmationDialog" parent="."]
title = "\"New Audio Clip\" Properties"
size = Vector2i(400, 600)
[node name="Control" type="Control" parent="Window"]
layout_mode = 3
anchors_preset = 0
offset_left = 8.0
offset_top = 8.0
offset_right = 92.0
offset_bottom = 51.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Label" type="Label" parent="Window/Control"]
layout_mode = 0
offset_right = 40.0
offset_bottom = 23.0
text = "Clip properties!"
[node name="Waveform" type="Control" parent="."]
unique_name_in_owner = true
modulate = Color(0.779291, 0.779291, 0.779291, 1)
layout_mode = 1
anchor_top = 0.312
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 0.0319996
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("2_43oho")
[connection signal="on_double_click" from="." to="Window" method="popup_centered"]

View File

@@ -1,53 +0,0 @@
[gd_scene load_steps=6 format=3 uid="uid://dlb5xpe1t8rrk"]
[ext_resource type="PackedScene" uid="uid://c3kajrpp2ux7" path="res://Controls/Track.tscn" id="1_envsv"]
[ext_resource type="Texture2D" uid="uid://cc0dy71y8shcx" path="res://Assets/Icons/record.svg" id="2_iwhga"]
[ext_resource type="Texture2D" uid="uid://c8napjmkltpr" path="res://Assets/Icons/slider_grabber.svg" id="3_y81l0"]
[sub_resource type="StyleBoxLine" id="StyleBoxLine_ixeae"]
color = Color(0.1, 0.1, 0.1, 1)
thickness = 8
[sub_resource type="StyleBoxLine" id="StyleBoxLine_vrgqc"]
color = Color(0.5, 0.5, 0.5, 1)
thickness = 8
[node name="Track" instance=ExtResource("1_envsv")]
[node name="HBoxContainer" parent="PanelContainer/HBoxContainer/Body" index="0"]
theme_override_constants/separation = 8
[node name="MuteSolo" type="VBoxContainer" parent="PanelContainer/HBoxContainer/Body/HBoxContainer" index="0"]
layout_mode = 2
theme_override_constants/separation = 4
alignment = 1
[node name="Mute" type="Button" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/MuteSolo" index="0"]
modulate = Color(1, 0, 0, 1)
layout_mode = 2
toggle_mode = true
text = "M"
[node name="Solo" type="Button" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/MuteSolo" index="1"]
modulate = Color(1, 1, 0, 1)
layout_mode = 2
toggle_mode = true
text = "S"
[node name="Record" type="Button" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName" index="2"]
self_modulate = Color(1, 0.373852, 0.504338, 1)
layout_mode = 2
size_flags_horizontal = 8
toggle_mode = true
icon = ExtResource("2_iwhga")
icon_alignment = 1
[node name="VolumeSlider" type="HSlider" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls" index="1"]
layout_mode = 2
theme_override_icons/grabber = ExtResource("3_y81l0")
theme_override_icons/grabber_highlight = ExtResource("3_y81l0")
theme_override_styles/slider = SubResource("StyleBoxLine_ixeae")
theme_override_styles/grabber_area = SubResource("StyleBoxLine_vrgqc")
theme_override_styles/grabber_area_highlight = SubResource("StyleBoxLine_vrgqc")
min_value = -80.0
max_value = 0.0

View File

@@ -1,106 +0,0 @@
[gd_scene load_steps=4 format=3 uid="uid://y1aeb1b7cgh3"]
[ext_resource type="Theme" uid="uid://b8rk41gjual2b" path="res://Assets/DefaultTheme.tres" id="1_7wbal"]
[ext_resource type="Texture2D" uid="uid://bwfbs4jxbia3o" path="res://Assets/Icons/microphone_track.svg" id="2_ek3ni"]
[ext_resource type="Texture2D" uid="uid://cc0dy71y8shcx" path="res://Assets/Icons/record.svg" id="3_2mwx3"]
[node name="Track" type="Control"]
clip_children = 1
custom_minimum_size = Vector2(128, 74)
layout_mode = 3
anchors_preset = 0
offset_right = 382.0
offset_bottom = 74.0
theme = ExtResource("1_7wbal")
[node name="PanelContainer" type="PanelContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"]
clip_children = 1
layout_mode = 2
[node name="Panel" type="Panel" parent="PanelContainer/HBoxContainer"]
visible = false
custom_minimum_size = Vector2(4, 0)
layout_mode = 2
[node name="ColorRect" type="ColorRect" parent="PanelContainer/HBoxContainer"]
self_modulate = Color(0.699653, 0.699654, 0.699653, 1)
clip_contents = true
custom_minimum_size = Vector2(4, 0)
layout_mode = 2
[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/margin_left = 4
theme_override_constants/margin_top = 4
theme_override_constants/margin_right = 4
theme_override_constants/margin_bottom = 4
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/HBoxContainer/MarginContainer"]
layout_mode = 2
[node name="MuteSolo" type="VBoxContainer" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer"]
layout_mode = 2
theme_override_constants/separation = 4
alignment = 1
[node name="Mute" type="Button" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/MuteSolo"]
modulate = Color(1, 0, 0, 1)
layout_mode = 2
toggle_mode = true
text = "M"
[node name="Solo" type="Button" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/MuteSolo"]
modulate = Color(1, 1, 0, 1)
layout_mode = 2
toggle_mode = true
text = "S"
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer"]
clip_children = 1
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/separation = 4
alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="TrackIcon" type="TextureRect" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"]
modulate = Color(0.43134, 0.43134, 0.43134, 1)
custom_minimum_size = Vector2(16, 16)
layout_mode = 2
size_flags_horizontal = 0
texture = ExtResource("2_ek3ni")
expand_mode = 2
[node name="TrackName" type="LineEdit" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
text = "Track Name"
expand_to_text_length = true
context_menu_enabled = false
caret_blink = true
[node name="Record" type="Button" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer"]
self_modulate = Color(1, 0.373852, 0.504338, 1)
layout_mode = 2
size_flags_horizontal = 8
toggle_mode = true
icon = ExtResource("3_2mwx3")
icon_alignment = 1
[node name="VolumeSlider" type="HSlider" parent="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer"]
layout_mode = 2
min_value = -80.0
max_value = 0.0
[connection signal="text_submitted" from="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/TrackName" to="PanelContainer/HBoxContainer/MarginContainer/HBoxContainer/VBoxContainer/HBoxContainer/TrackName" method="release_focus" unbinds=1]

View File

@@ -1,9 +1,5 @@
[gd_scene load_steps=3 format=3 uid="uid://bhe0fbxuxrgjk"]
[gd_scene load_steps=2 format=3 uid="uid://bir03dfqbxgmh"]
[ext_resource type="PackedScene" uid="uid://c3kajrpp2ux7" path="res://Controls/Track.tscn" id="1_oloar"]
[ext_resource type="Texture2D" uid="uid://c1m8c0h70mpa5" path="res://Assets/Icons/label_track.svg" id="2_v5n7i"]
[node name="LabelTrack" instance=ExtResource("1_oloar")]
[node name="TrackIcon" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName" index="0"]
texture = ExtResource("2_v5n7i")

View File

@@ -1,8 +1,9 @@
[gd_scene load_steps=5 format=3 uid="uid://c3kajrpp2ux7"]
[gd_scene load_steps=6 format=3 uid="uid://c3kajrpp2ux7"]
[ext_resource type="Theme" uid="uid://b8rk41gjual2b" path="res://Assets/DefaultTheme.tres" id="1_tbi88"]
[ext_resource type="Texture2D" uid="uid://bwfbs4jxbia3o" path="res://Assets/Icons/microphone_track.svg" id="2_r2pin"]
[ext_resource type="Script" uid="uid://nq2n8r8tq3nt" path="res://Scripts/Track.gd" id="2_rsf0h"]
[ext_resource type="FontFile" uid="uid://ctw3g5gundhpj" path="res://Assets/Fonts/InterVariable.ttf" id="3_12y3l"]
[ext_resource type="Script" uid="uid://dxqa86sq21uac" path="res://Scripts/TrackLineEdit.gd" id="4_2nwak"]
[sub_resource type="FontVariation" id="FontVariation_lbdn3"]
base_font = ExtResource("3_12y3l")
@@ -11,70 +12,85 @@ variation_opentype = {
2003265652: 500
}
[node name="Track" type="Control"]
clip_children = 1
custom_minimum_size = Vector2(128, 74)
layout_mode = 3
anchors_preset = 0
offset_right = 382.0
offset_bottom = 74.0
theme = ExtResource("1_tbi88")
[node name="Track" type="Button"]
clip_children = 2
custom_minimum_size = Vector2(0, 40)
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_right = -1466.0
offset_bottom = -1040.0
grow_horizontal = 2
grow_vertical = 2
theme_type_variation = &"Track"
script = ExtResource("2_rsf0h")
[node name="PanelContainer" type="PanelContainer" parent="."]
[node name="HBoxContainer" type="HBoxContainer" parent="."]
clip_children = 1
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer"]
clip_children = 1
layout_mode = 2
[node name="ColorStrip" type="ColorRect" parent="PanelContainer/HBoxContainer"]
[node name="ColorStrip" type="ColorRect" parent="HBoxContainer"]
self_modulate = Color(0.699653, 0.699654, 0.699653, 1)
clip_contents = true
custom_minimum_size = Vector2(4, 0)
custom_minimum_size = Vector2(2, 0)
layout_mode = 2
mouse_filter = 2
color = Color(0.435294, 0.435294, 0.435294, 1)
[node name="Body" type="MarginContainer" parent="PanelContainer/HBoxContainer"]
[node name="Body" type="MarginContainer" parent="HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
mouse_filter = 2
theme_override_constants/margin_left = 4
theme_override_constants/margin_top = 4
theme_override_constants/margin_right = 4
theme_override_constants/margin_bottom = 4
[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/HBoxContainer/Body"]
[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer/Body"]
layout_mode = 2
mouse_filter = 2
[node name="NameIconControls" type="VBoxContainer" parent="PanelContainer/HBoxContainer/Body/HBoxContainer"]
[node name="NameIconControls" type="VBoxContainer" parent="HBoxContainer/Body/HBoxContainer"]
clip_children = 1
layout_mode = 2
size_flags_horizontal = 3
mouse_filter = 2
theme_override_constants/separation = 4
alignment = 1
[node name="IconAndName" type="HBoxContainer" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls"]
[node name="IconAndName" type="HBoxContainer" parent="HBoxContainer/Body/HBoxContainer/NameIconControls"]
custom_minimum_size = Vector2(0, 32)
layout_mode = 2
mouse_filter = 2
[node name="TrackIcon" type="TextureRect" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName"]
[node name="TrackIcon" type="TextureRect" parent="HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName"]
visible = false
modulate = Color(0.43134, 0.43134, 0.43134, 1)
custom_minimum_size = Vector2(16, 16)
layout_mode = 2
size_flags_horizontal = 0
mouse_filter = 2
texture = ExtResource("2_r2pin")
expand_mode = 2
[node name="TrackName" type="LineEdit" parent="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName"]
[node name="TrackName" type="LineEdit" parent="HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName"]
unique_name_in_owner = true
custom_minimum_size = Vector2(256, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
theme_override_fonts/font = SubResource("FontVariation_lbdn3")
text = "Track Name"
expand_to_text_length = true
placeholder_text = "Empty Track"
context_menu_enabled = false
draw_control_chars = true
caret_blink = true
script = ExtResource("4_2nwak")
[connection signal="text_submitted" from="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName/TrackName" to="PanelContainer/HBoxContainer/Body/HBoxContainer/NameIconControls/IconAndName/TrackName" method="release_focus" unbinds=1]
[node name="PopupMenu" type="PopupMenu" parent="."]
unique_name_in_owner = true

View File

@@ -12,6 +12,8 @@ mouse_filter = 2
[node name="HBoxContainer" type="HBoxContainer" parent="."]
layout_mode = 2
theme_override_constants/separation = 16
alignment = 1
[node name="Controls" type="MarginContainer" parent="HBoxContainer"]
layout_mode = 2
@@ -25,7 +27,7 @@ theme_override_constants/margin_bottom = 8
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
theme_override_constants/separation = 8
theme_override_constants/separation = 0
[node name="Play" type="Button" parent="HBoxContainer/Controls/HBoxContainer"]
modulate = Color(0.253333, 1, 0.2, 1)

View File

@@ -1,30 +1,45 @@
class_name AudioClip
extends Panel
@export var clip_name: String = "New Audio Clip"
@export var start_time: float = 0.0
@export var end_time: float = 0.0
@export var track_idx: int = 0
signal on_selected
signal on_deselected
signal on_double_click
var clip_path: String
var timeline: Timeline
var dragging: bool
var selected: bool
var accumulated_movement := 0.0
var was_snapping := false
func _ready():
timeline = get_parent()
%ClipName.text = clip_name
func _input(event):
var rect = get_global_rect()
var mouse_position = get_global_mouse_position()
if event is InputEventMouseButton:
if selected and event.double_click:
print("double clicked!")
on_double_click.emit()
return
if event.pressed and event.button_mask == MOUSE_BUTTON_LEFT:
if selected:
mouse_default_cursor_shape = CURSOR_MOVE
Input.set_default_cursor_shape(Input.CursorShape.CURSOR_MOVE)
dragging = true
else:
dragging = false
mouse_default_cursor_shape = CURSOR_ARROW
Input.set_default_cursor_shape(Input.CursorShape.CURSOR_ARROW)
if rect.has_point(mouse_position):
selected = true
make_selected()
@@ -36,28 +51,59 @@ func _input(event):
if !event.pressed and dragging:
dragging = false
mouse_default_cursor_shape = CURSOR_ARROW
Input.set_default_cursor_shape(Input.CursorShape.CURSOR_ARROW)
if selected and dragging:
if event is InputEventMouseMotion:
var movement = event.relative.x / timeline.get_pixels_per_unit() * timeline.time_interval
var movement_time = event.relative.x / timeline.get_pixels_per_unit() * timeline.time_interval
start_time += movement
end_time += movement
var track = timeline.get_track_idx_by_y(event.position.y)
if track != -1:
track_idx = track
var clip_length = end_time - start_time
if event.is_command_or_control_pressed():
if not was_snapping:
start_time = snapped(start_time, timeline.time_interval)
end_time = snapped(end_time, timeline.time_interval)
end_time = start_time + clip_length
accumulated_movement = 0
was_snapping = true
accumulated_movement += movement_time
var snapped_movement = snapped(accumulated_movement, timeline.time_interval)
if snapped_movement != 0:
if start_time + snapped_movement < 0:
start_time = 0
end_time = start_time + clip_length
return
start_time += snapped_movement
end_time += snapped_movement
accumulated_movement -= snapped_movement
else:
if start_time + movement_time < 0:
start_time = 0
end_time = start_time + clip_length
return
start_time += movement_time
end_time += movement_time
was_snapping = false
timeline.queue_sort()
pass
func make_selected():
on_selected.emit()
var color = get_theme_color("selected_modulate", "AudioClip")
z_index = 1
modulate = color
pass
func make_deselected():
on_deselected.emit()
var color = get_theme_color("deselected_modulate", "AudioClip")
z_index = 0
modulate = color
pass

1
Scripts/AudioClip.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://cxgi7wpdim7xs

View File

@@ -0,0 +1 @@
uid://cscqkg5w0nqaf

View File

@@ -1,4 +1,3 @@
@tool
class_name Timeline
extends Container
@@ -9,7 +8,7 @@ extends Container
@export var time_interval: float = 1000.0 # 1 second
@export var grid_space_ms: float = 250 # 0.25 seconds
@export var label_interval_ms: float = 1000.0 # 1 second
@export var line_thickness: int = 1
@export var line_thickness: int = 2
@export var major_line_step: int = 4
@export var cursor_width: int = 8
@export var zoom: float = 1.0
@@ -19,6 +18,10 @@ extends Container
@export var min_zoom: float = 0.1
@export var audio_clip_scene: PackedScene
signal clip_added(clip: Control)
func format_time_ms_hours(ms: float) -> String:
var total_seconds = ms / 1000
var hours = int(total_seconds / 3600)
@@ -34,6 +37,19 @@ func format_time_ms_minutes(ms: float) -> String:
var milliseconds = fmod(ms, 1000.0)
return "%02d:%02d.%03d" % [minutes, seconds, milliseconds]
func get_track_idx_by_y(y: float):
var idx = 0
for track in track_list.get_children():
if y >= track.global_position.y and y <= track.global_position.y + track.size.y:
return idx
idx += 1
pass
return -1
func get_track_by_idx(idx: int) -> Control:
if idx > track_list.get_child_count() - 1:
return null
return track_list.get_child(idx)
func get_pixels_per_unit() -> float:
return 50.0 * zoom
@@ -64,16 +80,23 @@ func _draw():
var start := (time_offset / pixels_per_unit) - 1
var end := start + (screen_width / pixels_per_unit) + 2
# measure lines
for t in range(int(start), int(end) + 1):
var x := t * pixels_per_unit - time_offset
if x >= 0 and x <= screen_width:
if t % 4 == 0:
draw_line(Vector2(x, 28.0), Vector2(x, size.y), primary_color, 2)
draw_line(Vector2(x, 28.0), Vector2(x, size.y), primary_color, line_thickness)
var time = t * int(time_interval)
draw_string(font, Vector2(x - time_label_offset_x, time_label_offset_y), format_time_ms_minutes(time), HORIZONTAL_ALIGNMENT_CENTER, -1, font_size, primary_color)
else:
draw_line(Vector2(x, 28.0), Vector2(x, timeline_y), secondary_color, 1)
draw_line(Vector2(x, 28.0), Vector2(x, timeline_y), secondary_color, line_thickness)
pass
# track horizontal lines
for t in track_list.get_children():
draw_line(Vector2(0.0, t.global_position.y - global_position.y + t.size.y), Vector2(size.x, t.global_position.y - global_position.y + t.size.y), secondary_color, line_thickness)
pass
queue_sort()
pass
@@ -82,12 +105,17 @@ func _notification(what):
if what == NOTIFICATION_SORT_CHILDREN:
for c in get_children():
if c is not AudioClip: continue
var track = get_track_by_idx(c.track_idx)
if track == null: return
var pixels_per_unit := 50.0 * zoom
var start = ((c.start_time / time_interval) * pixels_per_unit) - time_offset
var width = (c.end_time - c.start_time) / time_interval * pixels_per_unit
c.position = Vector2(start, 0.0)
c.size = Vector2(width, c.size.y)
c.position = Vector2(start, track.global_position.y - global_position.y)
c.size = Vector2(width, track.size.y)
func _gui_input(event):
var zoom_factor = 1.1
@@ -106,3 +134,29 @@ func _gui_input(event):
zoom = max(min_zoom, zoom)
time_offset = max(0.0, time_offset)
func local_x_to_timeline(x: float) -> float:
return (x + time_offset) / get_pixels_per_unit() * time_interval
func clip_dropped(at_position: Vector2, path: String, clip_name: String, clip_start_time: float, clip_end_time: float):
var local_position = at_position - global_position
var timeline_position = local_x_to_timeline(local_position.x)
var track_idx = get_track_idx_by_y(at_position.y)
add_audio_clip(path, clip_name, track_idx, timeline_position + clip_start_time, timeline_position + clip_end_time)
pass
func add_audio_clip(path: String, clip_name: String, track_idx: int, clip_start_time: float, clip_end_time: float):
var audio_clip = audio_clip_scene.instantiate() as AudioClip
audio_clip.clip_path = path
audio_clip.clip_name = clip_name
audio_clip.track_idx = track_idx
audio_clip.start_time = clip_start_time
audio_clip.end_time = clip_end_time
add_child(audio_clip)
clip_added.emit(audio_clip)
queue_redraw()
pass

1
Scripts/Timeline.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://2t7cikq15q48

46
Scripts/Track.gd Normal file
View File

@@ -0,0 +1,46 @@
class_name Track
extends Button
signal on_deleted(idx: int)
signal on_renamed
signal on_duplicated
func _ready():
var menu: PopupMenu = $PopupMenu
menu.add_item("Rename", 0)
menu.add_item("Duplicate", 2)
menu.add_item("Delete", 1)
menu.add_separator()
menu.add_item("Properties")
menu.id_pressed.connect(_on_menu_option)
func _on_menu_option(id: int):
match id:
0:
rename()
1:
delete()
2:
duplicate_track()
pass
func delete():
on_deleted.emit(get_index())
pass
func rename():
%TrackName.grab_focus()
pass
func duplicate_track():
pass
func _gui_input(event):
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
var popup = %PopupMenu
#%PopupMenu.popup(get_global_mouse_position())
var pos = get_global_mouse_position()
var rect = Rect2i(pos, popup.get_contents_minimum_size())
popup.popup(rect)

1
Scripts/Track.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://nq2n8r8tq3nt

14
Scripts/TrackLineEdit.gd Normal file
View File

@@ -0,0 +1,14 @@
extends LineEdit
func _ready() -> void:
text_submitted.connect(submit)
func submit(text: String):
release_focus()
var owner = get_owner()
if owner is Control:
var c = owner as Control
c.grab_focus()
pass

View File

@@ -0,0 +1 @@
uid://dxqa86sq21uac

44
Scripts/TrackView.gd Normal file
View File

@@ -0,0 +1,44 @@
extends Control
class_name TrackView
@export var controller: Node
@export var track_scene: PackedScene
@onready var track_list: VBoxContainer = %TrackList
signal track_added(idx: int)
signal track_deleted(idx: int)
signal tracks_updated()
func _ready() -> void:
pass
func add_track(idx: int):
track_added.emit(idx)
tracks_updated.emit()
pass
func delete_track(idx: int):
track_deleted.emit(idx)
_track_deleted(idx)
tracks_updated.emit()
pass
func _track_added():
var track = track_scene.instantiate() as Track
track.on_deleted.connect(delete_track)
track_list.add_child(track)
pass
func _track_duplicated(idx: int):
pass
func _track_renamed(idx: int):
pass
func _track_deleted(idx: int):
var track = track_list.get_child(idx)
track.call_deferred("free")
pass
func get_track_elements() -> Array[Node]:
return track_list.get_children()

1
Scripts/TrackView.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://y5e28thwmx7e

View File

@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.IO;
using Godot;
using NAudio.Wave;
namespace AudioEditor;
public partial class AudioFileAnalyzer : Node
{
public static AudioFileAnalyzer Instance { get; private set; }
public override void _Ready()
{
base._Ready();
Instance = this;
}
public void AnalyzeFile(string path, out WaveformInfo waveformInfo)
{
waveformInfo = new();
if (_waveformInfoCache.ContainsKey(path))
{
waveformInfo = _waveformInfoCache[path];
return;
}
var ext = Path.GetExtension(path);
switch (ext)
{
case ".wav":
GD.Print("Analyzing a WAV file...");
AnalyzeWav(path, out waveformInfo);
break;
default:
GD.Print($"Format {ext} is not supported!");
break;
}
_waveformInfoCache.Add(path, waveformInfo);
}
public bool TryGetFromCache(string path, out WaveformInfo waveformInfo)
{
return _waveformInfoCache.TryGetValue(path, out waveformInfo);
}
private void AnalyzeWav(string path, out WaveformInfo waveformInfo)
{
waveformInfo = new WaveformInfo();
using (var reader = new WaveFileReader(path))
{
waveformInfo.Length = reader.TotalTime;
waveformInfo.SampleRate = reader.WaveFormat.SampleRate;
long sampleCount = reader.Length / reader.WaveFormat.BlockAlign;
waveformInfo.Samples = new float[sampleCount];
byte[] buffer = new byte[reader.WaveFormat.BlockAlign];
for (int i = 0; i < sampleCount; i++)
{
int sampleIndex = i * reader.WaveFormat.BlockAlign;
while (reader.Position < reader.Length)
{
// Read the raw bytes for the current sample
reader.Read(buffer, 0, buffer.Length);
// Convert the byte array to a 16-bit sample
short sample = BitConverter.ToInt16(buffer, 0);
waveformInfo.Samples[sampleIndex++] = (float)sample / short.MaxValue;
}
}
}
}
private Dictionary<string, WaveformInfo> _waveformInfoCache = new();
}
public class WaveformInfo
{
public int SampleRate { get; set; }
public TimeSpan Length { get; set; }
public float[] Samples { get; set; }
}

View File

@@ -0,0 +1 @@
uid://bhypae8nci75e

9
Source/Clip.cs Normal file
View File

@@ -0,0 +1,9 @@
using System;
namespace AudioEditor;
public class Clip
{
public TimeSpan StartTime { get; private set; }
public TimeSpan EndTime { get; private set; }
}

1
Source/Clip.cs.uid Normal file
View File

@@ -0,0 +1 @@
uid://b20juoqt3ac8x

46
Source/Project.cs Normal file
View File

@@ -0,0 +1,46 @@
using System.Collections.Generic;
namespace AudioEditor;
public class Project
{
public int TrackCount => _tracks.Count;
public void AddTrack()
{
var idx = _tracks.Count;
_tracks.Add(new Track(idx, string.Empty));
}
public void DuplicateTrack(int idx)
{
if (idx < 0 && idx > _tracks.Count - 1)
{
return;
}
var track = _tracks[idx];
var duplicate = track.Duplicate();
_tracks.Add(duplicate);
}
public void RenameTrack(int idx, string name)
{
if (idx < 0 && idx > _tracks.Count - 1)
{
return;
}
}
public void DeleteTrack(int idx)
{
if (idx < 0 && idx > _tracks.Count - 1)
{
return;
}
_tracks.RemoveAt(idx);
}
private List<Track> _tracks = new();
}

1
Source/Project.cs.uid Normal file
View File

@@ -0,0 +1 @@
uid://bvgn3tf07jspe

View File

@@ -0,0 +1,81 @@
using System.IO;
using Godot;
namespace AudioEditor;
[GlobalClass]
public partial class ProjectController : Node
{
[Signal] public delegate void AudioClipDroppedEventHandler(Vector2 atPosition, string path, string clipName, double startTime, double endTime);
[Signal] public delegate void OnTrackAddedEventHandler(int idx);
[Signal] public delegate void OnTrackRenamedEventHandler(int idx, string name);
[Signal] public delegate void OnTrackDuplicatedEventHandler(int idx);
[Signal] public delegate void OnTrackDeletedEventHandler(int trackIdx);
public override void _Ready()
{
GetWindow().FilesDropped += FilesDropped;
}
public void AddTrack(int idx = 0)
{
_project.AddTrack();
EmitSignal(SignalName.OnTrackAdded, _project.TrackCount - 1);
}
public void DuplicateTrack(int idx)
{
_project.DuplicateTrack(idx);
EmitSignal(SignalName.OnTrackDuplicated, idx);
}
public void RenameTrack(int idx, string name)
{
_project.RenameTrack(idx, name);
EmitSignal(SignalName.OnTrackRenamed, idx, name);
}
public void DeleteTrack(int idx)
{
_project.DeleteTrack(idx);
EmitSignal(SignalName.OnTrackDeleted, idx);
}
public void CreateAudioClipPreview(Control audioClip)
{
// GD.Print(audioClip.Clas());
var path = audioClip.Get("clip_path").AsString();
if (string.IsNullOrEmpty(path))
{
return;
}
if (!AudioFileAnalyzer.Instance.TryGetFromCache(path, out WaveformInfo waveformInfo))
{
return;
}
if (audioClip.HasNode("%Waveform"))
{
var waveform = audioClip.GetNode<Waveform>("%Waveform");
waveform.SetWaveformInfo(waveformInfo);
}
}
private void FilesDropped(string[] files)
{
var mousePosition = GetViewport().GetMousePosition();
var path = files[0];
var fileName = Path.GetFileName(path);
AudioFileAnalyzer.Instance.AnalyzeFile(path, out WaveformInfo waveformInfo);
GD.Print(path);
EmitSignal(SignalName.AudioClipDropped, mousePosition, path, fileName, 0, waveformInfo.Length.TotalMilliseconds);
}
private Project _project = new();
}

View File

@@ -0,0 +1 @@
uid://dtomx04m445em

33
Source/Track.cs Normal file
View File

@@ -0,0 +1,33 @@
using System.Collections.Generic;
using System.Linq;
namespace AudioEditor;
public class Track
{
public int Idx { get; private set; }
public string Name { get; private set; }
public Track(int idx, string name)
{
Idx = idx;
Name = name;
}
public Track(int idx, string name, IEnumerable<Clip> clips)
{
Idx = idx;
Name = name;
_clips = clips.ToList();
}
public bool TryAddClip(Clip clip)
{
_clips.Add(clip);
return false;
}
public Track Duplicate() => new(Idx, Name, _clips);
private List<Clip> _clips = new();
}

1
Source/Track.cs.uid Normal file
View File

@@ -0,0 +1 @@
uid://dtk58stvxxdyl

101
Source/Waveform.cs Normal file
View File

@@ -0,0 +1,101 @@
using Godot;
using System;
namespace AudioEditor;
public partial class Waveform : Control
{
private WaveformInfo _waveform;
public void SetWaveformInfo(WaveformInfo waveform)
{
_waveform = waveform;
QueueRedraw();
}
public override void _Draw()
{
if (_waveform == null) return;
base._Draw();
int width = (int)Size.X;
int height = (int)Size.Y;
// Downsample the waveform to get a reasonable number of peaks to draw
float[] averagePeaks = DownsampleToAveragePeaks(_waveform.Samples, width, _waveform.SampleRate);
// Begin drawing the waveform
for (int i = 0; i < width; i++)
{
float averagePeak = averagePeaks[i];
// Normalize the average peak to fit within the height of the control
int y = (int)(averagePeak * height / 2);
// Drawing the line in the positive and negative direction from the center
DrawLine(new Vector2(i, height / 2 - y), new Vector2(i, height / 2 + y), new Color(1, 1, 1, 0.7f)); // White with transparency
}
}
private float[] DownsampleToAveragePeaks(float[] samples, int targetWidth, int sampleRate)
{
int totalSamples = samples.Length;
float durationInSeconds = totalSamples / (float)sampleRate; // Calculate the total duration in seconds
int stepSize = totalSamples / targetWidth; // Larger chunks for downsampling
// If stepSize is 0 (due to rounding), default to 1 to prevent division by zero
if (stepSize == 0) stepSize = 1;
float[] averagePeaks = new float[targetWidth];
for (int i = 0; i < targetWidth; i++)
{
int startIndex = i * stepSize;
int endIndex = Math.Min(startIndex + stepSize, totalSamples);
// Calculate the average or peak for this window (you can use GetPeak if needed)
averagePeaks[i] = GetAverage(samples, startIndex, endIndex);
}
return averagePeaks;
}
// Get the average value of samples in the current window
private float GetAverage(float[] samples, int startIndex, int endIndex)
{
float sum = 0f;
int count = 0;
for (int i = startIndex; i < endIndex; i++)
{
sum += Math.Abs(samples[i]); // Use absolute values for consistency
count++;
}
return count > 0 ? sum / count : 0f;
}
// Optional: You could use this method if you prefer showing the peak values
private float GetPeak(float[] samples, int startIndex, int endIndex)
{
float maxPeak = 0f;
for (int i = startIndex; i < endIndex; i++)
{
maxPeak = Math.Max(maxPeak, Math.Abs(samples[i]));
}
return maxPeak;
}
// This can be an alternative to GetAverage if you want to show average peak
private float GetAveragePeak(float[] samples, int startIndex, int endIndex)
{
float sum = 0f;
int count = 0;
for (int i = startIndex; i < endIndex; i++)
{
sum += Math.Abs(samples[i]); // Use absolute value for a more stable peak
count++;
}
return count > 0 ? sum / count : 0f; // Return the average
}
}

1
Source/Waveform.cs.uid Normal file
View File

@@ -0,0 +1 @@
uid://wrxkvb8fkmlp

View File

@@ -1,15 +1,16 @@
[gd_scene load_steps=16 format=3 uid="uid://cr2f68sbsegai"]
[ext_resource type="Theme" uid="uid://b8rk41gjual2b" path="res://Assets/DefaultTheme.tres" id="1_s6hk6"]
[ext_resource type="Script" path="res://addons/dockable_container/dockable_container.gd" id="2_7b0h5"]
[ext_resource type="Script" path="res://Scripts/NestablePopupMenu.gd" id="2_lsrne"]
[ext_resource type="Script" uid="uid://mw1o44i8qxmk" path="res://addons/dockable_container/dockable_container.gd" id="2_7b0h5"]
[ext_resource type="Script" uid="uid://cscqkg5w0nqaf" path="res://Scripts/NestablePopupMenu.gd" id="2_lsrne"]
[ext_resource type="Texture2D" uid="uid://vd53o7va0tni" path="res://Assets/Icons/tracks.svg" id="2_nidjn"]
[ext_resource type="Texture2D" uid="uid://dxl2qel0qbxrn" path="res://Assets/Icons/mixer.svg" id="3_4tblp"]
[ext_resource type="Script" path="res://addons/dockable_container/layout_panel.gd" id="3_4twnq"]
[ext_resource type="Script" path="res://addons/dockable_container/layout.gd" id="4_ixaqo"]
[ext_resource type="Script" uid="uid://otsc040yabxa" path="res://addons/dockable_container/layout_panel.gd" id="3_4twnq"]
[ext_resource type="Script" uid="uid://sgl6svfbs2v6" path="res://addons/dockable_container/layout.gd" id="4_ixaqo"]
[ext_resource type="PackedScene" uid="uid://bgh1og6p43lsp" path="res://Controls/Transport.tscn" id="5_aq6v8"]
[ext_resource type="PackedScene" uid="uid://bpd6g2b3s7tqa" path="res://Views/TrackView.tscn" id="5_rgxdu"]
[ext_resource type="PackedScene" uid="uid://v4oljx3qrk5q" path="res://Views/Timeline.tscn" id="7_xu70y"]
[ext_resource type="Script" uid="uid://dtomx04m445em" path="res://Source/ProjectController.cs" id="11_gc3ui"]
[sub_resource type="Resource" id="Resource_pfnfv"]
resource_name = "Tabs"
@@ -35,9 +36,6 @@ script = ExtResource("4_ixaqo")
root = SubResource("Resource_xnlko")
hidden_tabs = {}
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3f3qp"]
bg_color = Color(0.180005, 0.180005, 0.180005, 1)
[node name="MainView" type="Control"]
layout_mode = 3
anchors_preset = 15
@@ -58,12 +56,12 @@ grow_vertical = 2
[node name="MenuBar" type="MenuBar" parent="VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 13
flat = true
[node name="File" type="PopupMenu" parent="VBoxContainer/MenuBar"]
item_count = 3
item_0/text = "New..."
item_0/id = 0
item_1/text = "Open..."
item_1/id = 1
item_2/id = 2
@@ -74,12 +72,14 @@ script = ExtResource("2_lsrne")
auto_translate_mode = 1
item_count = 2
item_0/text = "Audio Clip"
item_0/id = 0
item_1/text = "Label Clip"
item_1/id = 1
[node name="Export" type="PopupMenu" parent="VBoxContainer/MenuBar/File"]
item_count = 2
item_0/text = "Project"
item_0/id = 0
item_1/text = "Region"
item_1/id = 1
@@ -87,6 +87,7 @@ item_1/id = 1
auto_translate_mode = 1
item_count = 2
item_0/text = "Add Audio Track"
item_0/id = 0
item_1/text = "Add Label Track"
item_1/id = 1
@@ -98,6 +99,7 @@ item_0/text = "Tracks"
item_0/icon = ExtResource("2_nidjn")
item_0/checkable = 1
item_0/checked = true
item_0/id = 0
item_1/text = "Mixer"
item_1/icon = ExtResource("3_4tblp")
item_1/checkable = 1
@@ -109,6 +111,7 @@ auto_translate_mode = 1
hide_on_checkable_item_selection = false
item_count = 2
item_0/text = "Project Settings"
item_0/id = 0
item_1/text = "System Settings"
item_1/id = 1
@@ -121,6 +124,7 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
theme_type_variation = &"MenuBarPanel"
[node name="VSplitContainer" type="VSplitContainer" parent="VBoxContainer"]
layout_mode = 2
@@ -128,6 +132,7 @@ size_flags_vertical = 3
[node name="Transport" parent="VBoxContainer/VSplitContainer" instance=ExtResource("5_aq6v8")]
layout_mode = 2
size_flags_horizontal = 1
[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer/VSplitContainer"]
layout_mode = 2
@@ -135,6 +140,7 @@ size_flags_horizontal = 3
size_flags_vertical = 3
[node name="LeftDock" type="Container" parent="VBoxContainer/VSplitContainer/HSplitContainer"]
z_index = 2
custom_minimum_size = Vector2(200, 0)
layout_mode = 2
size_flags_horizontal = 3
@@ -146,10 +152,10 @@ layout = SubResource("Resource_20kxa")
[node name="Tracks" parent="VBoxContainer/VSplitContainer/HSplitContainer/LeftDock" instance=ExtResource("5_rgxdu")]
layout_mode = 2
mouse_filter = 2
[node name="Timeline" parent="VBoxContainer/VSplitContainer/HSplitContainer" node_paths=PackedStringArray("track_list") instance=ExtResource("7_xu70y")]
layout_mode = 2
size_flags_vertical = 3
track_list = NodePath("../LeftDock/Tracks/VBoxContainer/TrackList")
[node name="BottomDock" type="Container" parent="VBoxContainer/VSplitContainer"]
@@ -178,6 +184,12 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_3f3qp")
[editable path="VBoxContainer/VSplitContainer/HSplitContainer/LeftDock/Tracks"]
[node name="ProjectController" type="Node" parent="."]
script = ExtResource("11_gc3ui")
[connection signal="track_added" from="VBoxContainer/VSplitContainer/HSplitContainer/LeftDock/Tracks" to="ProjectController" method="AddTrack"]
[connection signal="tracks_updated" from="VBoxContainer/VSplitContainer/HSplitContainer/LeftDock/Tracks" to="VBoxContainer/VSplitContainer/HSplitContainer/Timeline" method="queue_redraw"]
[connection signal="clip_added" from="VBoxContainer/VSplitContainer/HSplitContainer/Timeline" to="ProjectController" method="CreateAudioClipPreview"]
[connection signal="AudioClipDropped" from="ProjectController" to="VBoxContainer/VSplitContainer/HSplitContainer/Timeline" method="clip_dropped"]
[connection signal="OnTrackAdded" from="ProjectController" to="VBoxContainer/VSplitContainer/HSplitContainer/LeftDock/Tracks" method="_track_added" unbinds=1]

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=3 format=3 uid="uid://v4oljx3qrk5q"]
[ext_resource type="Script" path="res://Scripts/Timeline.gd" id="1_h2mev"]
[ext_resource type="Script" uid="uid://2t7cikq15q48" path="res://Scripts/Timeline.gd" id="1_h2mev"]
[ext_resource type="PackedScene" uid="uid://dmmgalpx4fcc7" path="res://Controls/AudioClip.tscn" id="2_an2hv"]
[node name="Timeline" type="Container"]
@@ -13,7 +13,9 @@ grow_vertical = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("1_h2mev")
line_thickness = 1
end_time = 4000.0
audio_clip_scene = ExtResource("2_an2hv")
[node name="ScrollBar" type="HScrollBar" parent="."]
visible = false
@@ -22,10 +24,10 @@ layout_mode = 2
[node name="AudioClip" parent="." instance=ExtResource("2_an2hv")]
layout_mode = 2
start_time = 4000.0
end_time = 8000.0
end_time = 1000.0
[node name="AudioClip2" parent="." instance=ExtResource("2_an2hv")]
layout_mode = 2
start_time = 8000.0
end_time = 12000.0
start_time = 3000.0
end_time = 10000.0
track_idx = 1

View File

@@ -1,48 +1,38 @@
[gd_scene load_steps=3 format=3 uid="uid://bpd6g2b3s7tqa"]
[gd_scene load_steps=4 format=3 uid="uid://bpd6g2b3s7tqa"]
[ext_resource type="PackedScene" uid="uid://dlb5xpe1t8rrk" path="res://Controls/AudioTrack.tscn" id="1_ueogm"]
[ext_resource type="Script" uid="uid://y5e28thwmx7e" path="res://Scripts/TrackView.gd" id="1_8piyd"]
[ext_resource type="PackedScene" uid="uid://c3kajrpp2ux7" path="res://Controls/Track.tscn" id="1_qr47w"]
[ext_resource type="Texture2D" uid="uid://b3mydiolrvqlr" path="res://Assets/Icons/add.svg" id="2_rekuu"]
[node name="Tracks" type="Control"]
clip_children = 1
custom_minimum_size = Vector2(200, 0)
[node name="TrackView" type="Control"]
clip_children = 2
custom_minimum_size = Vector2(264, 0)
layout_mode = 3
anchors_preset = 9
anchor_bottom = 1.0
grow_vertical = 2
script = ExtResource("1_8piyd")
track_scene = ExtResource("1_qr47w")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
custom_minimum_size = Vector2(128, 0)
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
[node name="TrackList" type="VBoxContainer" parent="VBoxContainer"]
custom_minimum_size = Vector2(128, 0)
unique_name_in_owner = true
clip_children = 1
layout_mode = 2
size_flags_vertical = 3
mouse_filter = 2
[node name="Track" parent="VBoxContainer/TrackList" instance=ExtResource("1_ueogm")]
layout_mode = 2
[node name="Track2" parent="VBoxContainer/TrackList" instance=ExtResource("1_ueogm")]
layout_mode = 2
[node name="Track3" parent="VBoxContainer/TrackList" instance=ExtResource("1_ueogm")]
layout_mode = 2
[node name="Track4" parent="VBoxContainer/TrackList" instance=ExtResource("1_ueogm")]
layout_mode = 2
[node name="AddTrack" type="MenuButton" parent="VBoxContainer"]
[node name="AddTrack" type="Button" parent="VBoxContainer"]
layout_mode = 2
icon = ExtResource("2_rekuu")
flat = false
icon_alignment = 1
item_count = 2
popup/item_0/text = "Audio Track"
popup/item_1/text = "Label Track"
popup/item_1/id = 1
[connection signal="pressed" from="VBoxContainer/AddTrack" to="." method="add_track" binds= [-1]]

View File

@@ -0,0 +1 @@
uid://mw1o44i8qxmk

View File

@@ -0,0 +1 @@
uid://cvb3prw3wrl8y

View File

@@ -0,0 +1 @@
uid://c2aoiosenaiwf

View File

@@ -0,0 +1 @@
uid://ivfobwd6lvm1

View File

@@ -0,0 +1 @@
uid://d1l3xaxj0w3vy

View File

@@ -0,0 +1 @@
uid://cbpxkf5rmukr3

View File

@@ -0,0 +1 @@
uid://sgl6svfbs2v6

View File

@@ -0,0 +1 @@
uid://8ooorbaky8jx

View File

@@ -0,0 +1 @@
uid://otsc040yabxa

View File

@@ -0,0 +1 @@
uid://dd7uypdhptv1n

View File

@@ -0,0 +1 @@
uid://bb6danhejnf2o

View File

@@ -0,0 +1 @@
uid://bwo33n0cfouad

View File

@@ -1,10 +1,10 @@
[gd_scene load_steps=16 format=3 uid="uid://drlvhuchtk6if"]
[ext_resource type="Script" path="res://addons/dockable_container/dockable_container.gd" id="1"]
[ext_resource type="Script" path="res://addons/dockable_container/layout.gd" id="2"]
[ext_resource type="Script" path="res://addons/dockable_container/samples/TestScene.gd" id="4"]
[ext_resource type="Script" path="res://addons/dockable_container/layout_split.gd" id="4_yhgfb"]
[ext_resource type="Script" path="res://addons/dockable_container/layout_panel.gd" id="5"]
[ext_resource type="Script" uid="uid://mw1o44i8qxmk" path="res://addons/dockable_container/dockable_container.gd" id="1"]
[ext_resource type="Script" uid="uid://sgl6svfbs2v6" path="res://addons/dockable_container/layout.gd" id="2"]
[ext_resource type="Script" uid="uid://bwo33n0cfouad" path="res://addons/dockable_container/samples/TestScene.gd" id="4"]
[ext_resource type="Script" uid="uid://dd7uypdhptv1n" path="res://addons/dockable_container/layout_split.gd" id="4_yhgfb"]
[ext_resource type="Script" uid="uid://otsc040yabxa" path="res://addons/dockable_container/layout_panel.gd" id="5"]
[sub_resource type="Resource" id="Resource_8aoc2"]
resource_name = "Tabs"

View File

@@ -0,0 +1 @@
uid://dkagjri75ub62

3
default_bus_layout.tres Normal file
View File

@@ -0,0 +1,3 @@
[gd_resource type="AudioBusLayout" format=3 uid="uid://sgfaybyy2lvn"]
[resource]

44
export_presets.cfg Normal file
View File

@@ -0,0 +1,44 @@
[preset.0]
name="Linux"
platform="Linux"
runnable=true
advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path="../../Audio Editor Builds/AudioEditor.x86_64"
patches=PackedStringArray()
encryption_include_filters=""
encryption_exclude_filters=""
seed=0
encrypt_pck=false
encrypt_directory=false
script_export_mode=2
[preset.0.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=true
texture_format/s3tc_bptc=true
texture_format/etc2_astc=false
binary_format/architecture="x86_64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
dotnet/include_scripts_content=false
dotnet/include_debug_symbols=true
dotnet/embed_build_outputs=false

View File

@@ -12,11 +12,20 @@ config_version=5
config/name="AudioEditor"
run/main_scene="res://Views/MainView.tscn"
config/features=PackedStringArray("4.3", "C#", "GL Compatibility")
config/features=PackedStringArray("4.4", "C#", "GL Compatibility")
run/low_processor_mode=true
run/delta_smoothing=false
boot_splash/show_image=false
config/icon="res://icon.svg"
[audio]
driver/driver="Dummy"
[autoload]
AudioFileAnalyzer="*res://Source/AudioFileAnalyzer.cs"
[display]
window/size/viewport_width=1920
@@ -39,3 +48,4 @@ enabled=PackedStringArray("res://addons/dockable_container/plugin.cfg")
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
environment/defaults/default_clear_color=Color(0.0862745, 0.0862745, 0.0862745, 1)