diff --git a/API/Tiri.py b/API/Tiri.py
index e67c115..2cf0721 100644
--- a/API/Tiri.py
+++ b/API/Tiri.py
@@ -41,6 +41,11 @@ def tiropit_add_user():
return jsonify({"error": "UserPIN must be 4 characters long"}), 400
+ if isinstance(awards_data, str):
+ awards_data = json.loads(awards_data)
+ if isinstance(user_games_data, str):
+ user_games_data = json.loads(user_games_data)
+
connection = get_db_connection()
if connection is None:
diff --git a/CLI/Init.py b/CLI/Init.py
index 01518b9..126119c 100644
--- a/CLI/Init.py
+++ b/CLI/Init.py
@@ -4,6 +4,8 @@ from pathlib import Path
import requests
import argparse
import sys
+import tkinter as tk
+from tkinter import filedialog
parser = argparse.ArgumentParser(description='TiropitLauncher CLI & Back-End')
parser.add_argument('-backend', help="Runs the app in backend mode (no UI)", action="store_true")
@@ -74,6 +76,19 @@ def makeConfig():
config.write(configfile)
+def select_folder():
+ root = tk.Tk()
+ root.withdraw()
+
+ folder_path = filedialog.askdirectory()
+ if folder_path:
+ print(f"Selected folder: {folder_path}")
+ else:
+ print("No folder was selected.")
+
+ return folder_path
+
+
def TiropitLogin():
class menuData():
@@ -230,7 +245,61 @@ def debugMenu():
case _:
menuData.mainMenu()
+def Gamesmenu():
+ class menuData():
+ def mainMenu():
+ Display.Clear()
+ showIntroText()
+ print(f"|[Games] [{Server.Icon}]|")
+ print("|1. Minecraft Tiropit |")
+ print("|2. CS2 (Comming Soon) |")
+ print("| |")
+ print("|[e] Exit |")
+ print("======================================================")
+ option = input(">> ")
+ if option == "": menuData.mainMenu()
+ match option:
+ case "e":
+ showMenu(1)
+ return 0
+ case "1":
+ menuData.MinecraftMenu()
+ case _:
+ menuData.mainMenu()
+ def MinecraftMenu():
+ Display.Clear()
+ showIntroText()
+ print(f"|[Minecraft] [{Server.Icon}]|")
+ print("|1. Update |")
+ print("|2. Install |")
+ print("| |")
+ print("|[e] Exit |")
+ print("======================================================")
+ option = input(">> ")
+ if option == "": menuData.mainMenu()
+ match option:
+ case "e":
+ menuData.mainMenu()
+ return 0
+ case "2":
+ menuData.installMenu()
+ case _:
+ menuData.MinecraftMenu()
+ def installMenu():
+ Display.Clear()
+ showIntroText()
+ print(f"|[Minecraft] [{Server.Icon}]|")
+ print("|1. Select Install Location |")
+ print("======================================================")
+ print(select_folder())
+ print("| |")
+ print("|[e] Exit |")
+ print("======================================================")
+
+
+
+ menuData.mainMenu()
@@ -244,7 +313,7 @@ def showMenu(menuID):
print("|[Main menu] |")
print("|[1] Log in to tiropit | [2] Reset Data & Config |")
print("|[3] Send / Get Request| [4] My Profile |")
- print("|[5] Debug Data | |")
+ print("|[5] Debug Data | [6] Games |")
print("|[e] Exit |")
print("======================================================")
option = input(">> ")
@@ -257,6 +326,8 @@ def showMenu(menuID):
TiropitLogin()
case "5":
debugMenu()
+ case "6":
+ Gamesmenu()
case "e":
print("Cya!")
exit();
diff --git a/GUI/.gitattributes b/GUI/.gitattributes
new file mode 100644
index 0000000..8ad74f7
--- /dev/null
+++ b/GUI/.gitattributes
@@ -0,0 +1,2 @@
+# Normalize EOL for all files that Git considers text files.
+* text=auto eol=lf
diff --git a/GUI/.gitignore b/GUI/.gitignore
new file mode 100644
index 0000000..4709183
--- /dev/null
+++ b/GUI/.gitignore
@@ -0,0 +1,2 @@
+# Godot 4+ specific ignores
+.godot/
diff --git a/GUI/ErrorPanel.gd b/GUI/ErrorPanel.gd
new file mode 100644
index 0000000..a257fb8
--- /dev/null
+++ b/GUI/ErrorPanel.gd
@@ -0,0 +1,16 @@
+extends Panel
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+ pass
+
+
+func _on_show_error_pressed():
+ $"../../AnimationPlayer".play("Show_Error")
+ pass # Replace with function body.
diff --git a/GUI/Throbber.gd b/GUI/Throbber.gd
new file mode 100644
index 0000000..ee3d967
--- /dev/null
+++ b/GUI/Throbber.gd
@@ -0,0 +1,40 @@
+extends TextureRect
+
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ pass # Replace with function body.
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _process(delta):
+ if $".".rotation < 360: $".".rotation = rotation + 0.1
+ else: $".".rotation = -360
+
+
+ pass
+
+func showThrobber():
+ $"../AnimationPlayer".play("RESET")
+ $"../AnimationPlayer".play("Show_Throbber")
+ pass
+
+
+func hideThrobber():
+
+ $"../AnimationPlayer".play("Hide_Throbber")
+ pass
+
+
+func _on_button_pressed():
+
+ showThrobber()
+ await get_tree().create_timer(10).timeout
+ hideThrobber()
+
+ pass # Replace with function body.
+
+
+func _on_show_throbber_2_pressed():
+ hideThrobber()
+ pass # Replace with function body.
diff --git a/GUI/loading.tscn b/GUI/loading.tscn
new file mode 100644
index 0000000..c3c9935
--- /dev/null
+++ b/GUI/loading.tscn
@@ -0,0 +1,428 @@
+[gd_scene load_steps=30 format=3 uid="uid://b608tqke81k8v"]
+
+[ext_resource type="Script" path="res://ErrorPanel.gd" id="1_joc8o"]
+[ext_resource type="Texture2D" uid="uid://5xvpmo6a3yoo" path="res://svg/Warning.svg" id="1_w7hak"]
+[ext_resource type="Texture2D" uid="uid://ilik5t6splna" path="res://svg/Settings.svg" id="2_1x1hs"]
+[ext_resource type="Texture2D" uid="uid://33jm85imdybv" path="res://svg/Throbber.svg" id="2_wvjlw"]
+[ext_resource type="Texture2D" uid="uid://cr41ebynd12bw" path="res://svg/Trophys.svg" id="3_4tgp2"]
+[ext_resource type="Script" path="res://Throbber.gd" id="3_l17jk"]
+[ext_resource type="Texture2D" uid="uid://j7rt1ewft5qs" path="res://svg/User.svg" id="3_n26ui"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4t4qt"]
+bg_color = Color(0.141176, 0.145098, 0.14902, 1)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+corner_detail = 20
+shadow_offset = Vector2(0, 1)
+
+[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cg2pq"]
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_d5ykn"]
+bg_color = Color(0.435294, 0.439216, 0.447059, 1)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+corner_detail = 20
+shadow_offset = Vector2(0, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_hh8sq"]
+bg_color = Color(0.360525, 0.364431, 0.372244, 1)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+corner_detail = 20
+shadow_offset = Vector2(0, 1)
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1elua"]
+bg_color = Color(0.231373, 0.235294, 0.239216, 1)
+corner_radius_top_left = 5
+corner_radius_top_right = 5
+corner_radius_bottom_right = 5
+corner_radius_bottom_left = 5
+corner_detail = 20
+shadow_offset = Vector2(0, 1)
+
+[sub_resource type="Gradient" id="Gradient_8qfvq"]
+colors = PackedColorArray(0.109422, 0.117235, 0.125536, 1, 0.195895, 0.203708, 0.211521, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_mmhso"]
+gradient = SubResource("Gradient_8qfvq")
+fill_from = Vector2(1, 1)
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_x56fa"]
+texture = SubResource("GradientTexture2D_mmhso")
+
+[sub_resource type="Theme" id="Theme_03exx"]
+Button/styles/disabled = SubResource("StyleBoxFlat_4t4qt")
+Button/styles/focus = SubResource("StyleBoxEmpty_cg2pq")
+Button/styles/hover = SubResource("StyleBoxFlat_d5ykn")
+Button/styles/normal = SubResource("StyleBoxFlat_hh8sq")
+Button/styles/pressed = SubResource("StyleBoxFlat_1elua")
+CheckButton/icons/checked = null
+CheckButton/icons/unchecked = null
+Panel/styles/panel = SubResource("StyleBoxTexture_x56fa")
+
+[sub_resource type="Theme" id="Theme_hd0cq"]
+CheckButton/icons/checked = null
+
+[sub_resource type="Gradient" id="Gradient_dgi3k"]
+colors = PackedColorArray(0.0596131, 0.0652199, 0.0739803, 1, 0.163357, 0.170321, 0.177272, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_p352m"]
+gradient = SubResource("Gradient_dgi3k")
+fill_from = Vector2(0, 0.978495)
+fill_to = Vector2(0, 0)
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_fp6ob"]
+texture = SubResource("GradientTexture2D_p352m")
+
+[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mqokj"]
+bg_color = Color(0.188235, 0.2, 0.211765, 1)
+border_width_left = 2
+border_width_top = 2
+border_width_right = 2
+border_width_bottom = 2
+border_color = Color(0.45098, 0.45098, 0.45098, 1)
+border_blend = true
+corner_radius_top_left = 25
+corner_radius_top_right = 25
+corner_radius_bottom_right = 25
+corner_radius_bottom_left = 25
+shadow_size = 10
+
+[sub_resource type="Gradient" id="Gradient_fu1yj"]
+colors = PackedColorArray(0.105516, 0.113329, 0.125536, 1, 0.25421, 0.175074, 0.177013, 1)
+
+[sub_resource type="GradientTexture2D" id="GradientTexture2D_y0xvk"]
+gradient = SubResource("Gradient_fu1yj")
+fill_from = Vector2(1, 1)
+
+[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_l51jq"]
+texture = SubResource("GradientTexture2D_y0xvk")
+
+[sub_resource type="Animation" id="Animation_s5qm1"]
+resource_name = "Show_Throbber"
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Throbber:modulate")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 1),
+"transitions": PackedFloat32Array(2.21914, 2.21914),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+
+[sub_resource type="Animation" id="Animation_b0age"]
+length = 0.001
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Throbber:modulate")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 1)]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Panel/ErrorPanel:visible")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [true]
+}
+tracks/2/type = "value"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Panel/ErrorPanel:modulate")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 0,
+"values": [Color(1, 1, 1, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_ngvoo"]
+resource_name = "Hide_Throbber"
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Throbber:modulate")
+tracks/0/interp = 2
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0, 1),
+"transitions": PackedFloat32Array(2.21914, 2.21914),
+"update": 0,
+"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)]
+}
+
+[sub_resource type="Animation" id="Animation_syso0"]
+resource_name = "Show_Error"
+tracks/0/type = "value"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Panel/ErrorPanel:visible")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"times": PackedFloat32Array(0),
+"transitions": PackedFloat32Array(1),
+"update": 1,
+"values": [true]
+}
+tracks/1/type = "value"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Panel/ErrorPanel:modulate")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"times": PackedFloat32Array(0, 1),
+"transitions": PackedFloat32Array(1, 1),
+"update": 0,
+"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)]
+}
+
+[sub_resource type="AnimationLibrary" id="AnimationLibrary_h86lq"]
+_data = {
+"Hide_Throbber": SubResource("Animation_ngvoo"),
+"RESET": SubResource("Animation_b0age"),
+"Show_Error": SubResource("Animation_syso0"),
+"Show_Throbber": SubResource("Animation_s5qm1")
+}
+
+[node name="Control" type="Control"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = SubResource("Theme_03exx")
+
+[node name="Panel" type="Panel" parent="."]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = SubResource("Theme_hd0cq")
+
+[node name="Panel" type="Panel" parent="Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="HSplitContainer" type="HSplitContainer" parent="Panel/Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Panel" type="Panel" parent="Panel/Panel/HSplitContainer"]
+custom_minimum_size = Vector2(250, 0)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxTexture_fp6ob")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/Panel/HSplitContainer/Panel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="ScrollContainer" type="ScrollContainer" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+
+[node name="Account" type="Panel" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer"]
+custom_minimum_size = Vector2(0, 80)
+layout_mode = 2
+theme_override_styles/panel = SubResource("StyleBoxFlat_mqokj")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 14.0
+offset_top = -1.0
+offset_right = -18.0
+offset_bottom = 2.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account/VBoxContainer"]
+layout_mode = 2
+
+[node name="TextureRect" type="TextureRect" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 0
+texture = ExtResource("3_n26ui")
+expand_mode = 1
+stretch_mode = 5
+
+[node name="OptionButton" type="OptionButton" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+expand_icon = true
+item_count = 4
+selected = 1
+popup/item_0/text = "Tiropit Accounts"
+popup/item_0/id = 3
+popup/item_1/text = "user 1"
+popup/item_1/id = 1
+popup/item_2/text = "Steam Accounts"
+popup/item_2/id = 2
+popup/item_3/text = "Kevin"
+popup/item_3/id = 1
+
+[node name="Button" type="Button" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 0
+icon = ExtResource("2_1x1hs")
+
+[node name="Button2" type="Button" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 0
+icon = ExtResource("3_4tgp2")
+
+[node name="ProgressBar" type="ProgressBar" parent="Panel/Panel/HSplitContainer/Panel/VBoxContainer/Account/VBoxContainer"]
+layout_mode = 2
+value = 24.38
+
+[node name="HBoxContainer" type="HBoxContainer" parent="Panel/Panel/HSplitContainer"]
+layout_mode = 2
+
+[node name="ErrorPanel" type="Panel" parent="Panel"]
+modulate = Color(1, 1, 1, 0)
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+theme = SubResource("Theme_hd0cq")
+theme_override_styles/panel = SubResource("StyleBoxTexture_l51jq")
+script = ExtResource("1_joc8o")
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Panel/ErrorPanel"]
+layout_mode = 1
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="Container" type="Container" parent="Panel/ErrorPanel/VBoxContainer"]
+custom_minimum_size = Vector2(0, 50)
+layout_mode = 2
+
+[node name="TextureRect" type="TextureRect" parent="Panel/ErrorPanel/VBoxContainer"]
+custom_minimum_size = Vector2(0, 161.305)
+layout_mode = 2
+size_flags_vertical = 0
+texture = ExtResource("1_w7hak")
+expand_mode = 3
+stretch_mode = 5
+
+[node name="Container2" type="Container" parent="Panel/ErrorPanel/VBoxContainer"]
+custom_minimum_size = Vector2(0, 50)
+layout_mode = 2
+size_flags_vertical = 0
+
+[node name="Label" type="Label" parent="Panel/ErrorPanel/VBoxContainer"]
+layout_mode = 2
+text = "An Error Has Occured"
+horizontal_alignment = 1
+
+[node name="Throbber" type="TextureRect" parent="."]
+custom_minimum_size = Vector2(0, 60)
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 1.01226
+anchor_top = 1.02244
+anchor_right = 1.01226
+anchor_bottom = 1.02244
+offset_left = -124.128
+offset_top = -124.539
+offset_right = -64.1284
+offset_bottom = -64.5386
+grow_horizontal = 0
+grow_vertical = 0
+rotation = 6.28319
+pivot_offset = Vector2(30, 30)
+size_flags_horizontal = 10
+size_flags_vertical = 10
+texture = ExtResource("2_wvjlw")
+expand_mode = 3
+script = ExtResource("3_l17jk")
+metadata/_edit_use_anchors_ = true
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+libraries = {
+"": SubResource("AnimationLibrary_h86lq")
+}
+
+[node name="Window" type="Window" parent="."]
+position = Vector2i(0, 36)
+size = Vector2i(500, 600)
+
+[node name="Panel" type="Panel" parent="Window"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+
+[node name="VBoxContainer" type="VBoxContainer" parent="Window/Panel"]
+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="Window/Panel/VBoxContainer"]
+layout_mode = 2
+
+[node name="ShowThrobber" type="Button" parent="Window/Panel/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "testTHR"
+
+[node name="ShowThrobber2" type="Button" parent="Window/Panel/VBoxContainer/HBoxContainer"]
+layout_mode = 2
+text = "EndTHR"
+
+[node name="ShowError" type="Button" parent="Window/Panel/VBoxContainer"]
+layout_mode = 2
+text = "Show Error Panel"
+
+[connection signal="pressed" from="Window/Panel/VBoxContainer/HBoxContainer/ShowThrobber" to="Throbber" method="_on_button_pressed"]
+[connection signal="pressed" from="Window/Panel/VBoxContainer/HBoxContainer/ShowThrobber2" to="Throbber" method="_on_show_throbber_2_pressed"]
+[connection signal="pressed" from="Window/Panel/VBoxContainer/ShowError" to="Panel/ErrorPanel" method="_on_show_error_pressed"]
diff --git a/GUI/project.godot b/GUI/project.godot
new file mode 100644
index 0000000..411cf23
--- /dev/null
+++ b/GUI/project.godot
@@ -0,0 +1,20 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+; [section] ; section goes between []
+; param=value ; assign values to parameters
+
+config_version=5
+
+[application]
+
+config/name="Tiropit Launcher"
+run/main_scene="res://loading.tscn"
+config/features=PackedStringArray("4.2", "Forward Plus")
+config/icon="res://svg/icon.svg"
+
+[display]
+
+window/subwindows/embed_subwindows=false
diff --git a/GUI/svg/Settings.svg b/GUI/svg/Settings.svg
new file mode 100644
index 0000000..d6931b8
--- /dev/null
+++ b/GUI/svg/Settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/GUI/svg/Settings.svg.import b/GUI/svg/Settings.svg.import
new file mode 100644
index 0000000..bd7d2fc
--- /dev/null
+++ b/GUI/svg/Settings.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ilik5t6splna"
+path="res://.godot/imported/Settings.svg-aac7abdc1412f4fca2ee10e9f8197b96.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://svg/Settings.svg"
+dest_files=["res://.godot/imported/Settings.svg-aac7abdc1412f4fca2ee10e9f8197b96.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/GUI/svg/Throbber.svg b/GUI/svg/Throbber.svg
new file mode 100644
index 0000000..4f8ddca
--- /dev/null
+++ b/GUI/svg/Throbber.svg
@@ -0,0 +1,8 @@
+
+
+
\ No newline at end of file
diff --git a/GUI/svg/Throbber.svg.import b/GUI/svg/Throbber.svg.import
new file mode 100644
index 0000000..a16fc32
--- /dev/null
+++ b/GUI/svg/Throbber.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://33jm85imdybv"
+path="res://.godot/imported/Throbber.svg-d7a8a7e32f427294b2f28808be17521d.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://svg/Throbber.svg"
+dest_files=["res://.godot/imported/Throbber.svg-d7a8a7e32f427294b2f28808be17521d.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/GUI/svg/Trophys.svg b/GUI/svg/Trophys.svg
new file mode 100644
index 0000000..ffed9da
--- /dev/null
+++ b/GUI/svg/Trophys.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/GUI/svg/Trophys.svg.import b/GUI/svg/Trophys.svg.import
new file mode 100644
index 0000000..7435c7b
--- /dev/null
+++ b/GUI/svg/Trophys.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cr41ebynd12bw"
+path="res://.godot/imported/Trophys.svg-15f8dbc92eaae84c764edba7553bc13b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://svg/Trophys.svg"
+dest_files=["res://.godot/imported/Trophys.svg-15f8dbc92eaae84c764edba7553bc13b.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/GUI/svg/User.svg b/GUI/svg/User.svg
new file mode 100644
index 0000000..548abc7
--- /dev/null
+++ b/GUI/svg/User.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/GUI/svg/User.svg.import b/GUI/svg/User.svg.import
new file mode 100644
index 0000000..39cd7ae
--- /dev/null
+++ b/GUI/svg/User.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://j7rt1ewft5qs"
+path="res://.godot/imported/User.svg-8d14732b500396fc0cbb7793502f83d5.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://svg/User.svg"
+dest_files=["res://.godot/imported/User.svg-8d14732b500396fc0cbb7793502f83d5.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/GUI/svg/Warning.svg b/GUI/svg/Warning.svg
new file mode 100644
index 0000000..ab396b0
--- /dev/null
+++ b/GUI/svg/Warning.svg
@@ -0,0 +1,50 @@
+
+
+
+
diff --git a/GUI/svg/Warning.svg.import b/GUI/svg/Warning.svg.import
new file mode 100644
index 0000000..eae10b4
--- /dev/null
+++ b/GUI/svg/Warning.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://5xvpmo6a3yoo"
+path="res://.godot/imported/Warning.svg-70bbaae63956a1633ed5782b5c6028ed.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://svg/Warning.svg"
+dest_files=["res://.godot/imported/Warning.svg-70bbaae63956a1633ed5782b5c6028ed.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/GUI/svg/icon.svg b/GUI/svg/icon.svg
new file mode 100644
index 0000000..b370ceb
--- /dev/null
+++ b/GUI/svg/icon.svg
@@ -0,0 +1 @@
+
diff --git a/GUI/svg/icon.svg.import b/GUI/svg/icon.svg.import
new file mode 100644
index 0000000..236b3c0
--- /dev/null
+++ b/GUI/svg/icon.svg.import
@@ -0,0 +1,37 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bf8dix406fsis"
+path="res://.godot/imported/icon.svg-b25f6a603df3da61d09977cc64cb8f32.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://svg/icon.svg"
+dest_files=["res://.godot/imported/icon.svg-b25f6a603df3da61d09977cc64cb8f32.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/GUI/svg/switchOFF.svg b/GUI/svg/switchOFF.svg
new file mode 100644
index 0000000..3f4876d
--- /dev/null
+++ b/GUI/svg/switchOFF.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/GUI/svg/switchOFF.svg.import b/GUI/svg/switchOFF.svg.import
new file mode 100644
index 0000000..f00fb92
--- /dev/null
+++ b/GUI/svg/switchOFF.svg.import
@@ -0,0 +1,14 @@
+[remap]
+
+importer="image"
+type="Image"
+uid="uid://7dki3t6t65f3"
+path="res://.godot/imported/switchOFF.svg-e91f8f0e748425937a55a08a448c43ec.image"
+
+[deps]
+
+source_file="res://svg/switchOFF.svg"
+dest_files=["res://.godot/imported/switchOFF.svg-e91f8f0e748425937a55a08a448c43ec.image"]
+
+[params]
+
diff --git a/GUI/svg/switchON.svg b/GUI/svg/switchON.svg
new file mode 100644
index 0000000..6a18cba
--- /dev/null
+++ b/GUI/svg/switchON.svg
@@ -0,0 +1,57 @@
+
+
+
+
diff --git a/GUI/svg/switchON.svg.import b/GUI/svg/switchON.svg.import
new file mode 100644
index 0000000..8e5070c
--- /dev/null
+++ b/GUI/svg/switchON.svg.import
@@ -0,0 +1,14 @@
+[remap]
+
+importer="image"
+type="Image"
+uid="uid://du6bf46c7h0ao"
+path="res://.godot/imported/switchON.svg-73394c3394b3307efd9de9e29bef49df.image"
+
+[deps]
+
+source_file="res://svg/switchON.svg"
+dest_files=["res://.godot/imported/switchON.svg-73394c3394b3307efd9de9e29bef49df.image"]
+
+[params]
+