├── icon.png ├── medias ├── header.png ├── screenshots.jpg ├── header.png.import └── screenshots.jpg.import ├── visuals ├── godot_icon.png ├── icons │ ├── add.png │ ├── cross.png │ ├── delete.png │ ├── download.png │ ├── settings.png │ ├── add.png.import │ ├── cross.png.import │ ├── delete.png.import │ ├── download.png.import │ └── settings.png.import ├── splashscreen.png ├── Poppins-Regular.ttf ├── fonts │ ├── Poppins-Medium.ttf │ └── MontserratAlternates-Regular.ttf ├── godot_icon.png.import └── splashscreen.png.import ├── addons └── google_fonts │ ├── test.ttf │ ├── plugin.cfg │ ├── plugin.gd │ ├── Menu.tscn │ └── Menu.gd ├── default_env.tres ├── scripts ├── notification.gd ├── settings.gd ├── notifications.gd ├── setup.gd ├── card.gd ├── download_popup.gd └── cards_view.gd ├── scenes ├── top_bar.gd ├── main.tscn ├── buton.tscn ├── notification.tscn ├── top_bar.tscn ├── main.gd ├── card_view.tscn ├── visuals │ └── app_theme.tres ├── card.tscn ├── settings.tscn ├── download_popup.tscn └── setup.tscn ├── .gitignore ├── autoload ├── network.tscn ├── globals.gd ├── user_settings.gd ├── network.gd └── file_manager.gd ├── icon.png.import ├── LICENSE ├── project.godot └── README.md /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/icon.png -------------------------------------------------------------------------------- /medias/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/medias/header.png -------------------------------------------------------------------------------- /medias/screenshots.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/medias/screenshots.jpg -------------------------------------------------------------------------------- /visuals/godot_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/godot_icon.png -------------------------------------------------------------------------------- /visuals/icons/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/icons/add.png -------------------------------------------------------------------------------- /visuals/icons/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/icons/cross.png -------------------------------------------------------------------------------- /visuals/icons/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/icons/delete.png -------------------------------------------------------------------------------- /visuals/splashscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/splashscreen.png -------------------------------------------------------------------------------- /visuals/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/Poppins-Regular.ttf -------------------------------------------------------------------------------- /visuals/icons/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/icons/download.png -------------------------------------------------------------------------------- /visuals/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/icons/settings.png -------------------------------------------------------------------------------- /addons/google_fonts/test.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/addons/google_fonts/test.ttf -------------------------------------------------------------------------------- /visuals/fonts/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/fonts/Poppins-Medium.ttf -------------------------------------------------------------------------------- /visuals/fonts/MontserratAlternates-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MrEliptik/godownloader/HEAD/visuals/fonts/MontserratAlternates-Regular.ttf -------------------------------------------------------------------------------- /addons/google_fonts/plugin.cfg: -------------------------------------------------------------------------------- 1 | [plugin] 2 | 3 | name="GoogleFonts" 4 | description="simple addon to choose and download google fonts" 5 | author="Aknakos" 6 | version="1.0" 7 | script="plugin.gd" 8 | -------------------------------------------------------------------------------- /default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_mode = 2 7 | background_sky = SubResource( 1 ) 8 | -------------------------------------------------------------------------------- /scripts/notification.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | var text: String = "" 4 | 5 | onready var text_label = $MarginContainer/HBoxContainer/Text 6 | 7 | func _ready() -> void: 8 | text_label.text = text 9 | 10 | func _on_CloseBtn_pressed() -> void: 11 | queue_free() 12 | -------------------------------------------------------------------------------- /scenes/top_bar.gd: -------------------------------------------------------------------------------- 1 | extends MarginContainer 2 | 3 | signal add_version() 4 | signal settings() 5 | 6 | func _ready() -> void: 7 | pass 8 | 9 | func _on_AddBtn_pressed() -> void: 10 | emit_signal("add_version") 11 | 12 | func _on_SettingsBtn_pressed() -> void: 13 | emit_signal("settings") 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .import 2 | .vscode 3 | 4 | # Godot-specific ignores 5 | .import/ 6 | export.cfg 7 | export_presets.cfg 8 | 9 | # Imported translations (automatically generated from CSV files) 10 | *.translation 11 | 12 | # Mono-specific ignores 13 | .mono/ 14 | data_*/ 15 | 16 | /addons/godot-plugin-refresher 17 | build/* 18 | -------------------------------------------------------------------------------- /autoload/network.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://autoload/network.gd" type="Script" id=1] 4 | 5 | [node name="Network" type="Node2D"] 6 | script = ExtResource( 1 ) 7 | 8 | [node name="HTTPRequest" type="HTTPRequest" parent="."] 9 | use_threads = true 10 | 11 | [node name="DownloadReq" type="HTTPRequest" parent="."] 12 | use_threads = true 13 | 14 | [connection signal="request_completed" from="HTTPRequest" to="." method="_on_HTTPRequest_request_completed"] 15 | [connection signal="request_completed" from="DownloadReq" to="." method="_on_DownloadReq_request_completed"] 16 | -------------------------------------------------------------------------------- /autoload/globals.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | enum TYPE {STABLE, RC, BETA, ALPHA, PRE_ALPHA} 4 | 5 | var TYPE_TO_STRING = { 6 | TYPE.STABLE: "stable", 7 | TYPE.RC: "rc", 8 | TYPE.BETA: "beta", 9 | TYPE.ALPHA: "alpha", 10 | TYPE.PRE_ALPHA: "dev" 11 | } 12 | 13 | var version = { 14 | "path": "", 15 | "version": "", 16 | "type": TYPE.STABLE 17 | } 18 | 19 | var install_path: String = "" 20 | var setup_complete: bool = false 21 | 22 | var launch_startup: bool = true 23 | var check_update_auto: bool = true 24 | var auto_delete_install_file: bool = true 25 | var godot_versions = [] 26 | 27 | var available_versions = [] 28 | -------------------------------------------------------------------------------- /icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /medias/header.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/header.png-f44621d7d416ab674b1299e95563cc18.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://medias/header.png" 13 | dest_files=[ "res://.import/header.png-f44621d7d416ab674b1299e95563cc18.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/icons/add.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/add.png-a4004089473e9c22b2bff2d5ed84ac27.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/icons/add.png" 13 | dest_files=[ "res://.import/add.png-a4004089473e9c22b2bff2d5ed84ac27.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/icons/cross.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/cross.png-512e03f7f6c1ad7ba0eb616041866ac1.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/icons/cross.png" 13 | dest_files=[ "res://.import/cross.png-512e03f7f6c1ad7ba0eb616041866ac1.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/icons/delete.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/delete.png-a26a67a2558febfcf658c46fadd455d9.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/icons/delete.png" 13 | dest_files=[ "res://.import/delete.png-a26a67a2558febfcf658c46fadd455d9.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /medias/screenshots.jpg.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/screenshots.jpg-39990cc2064265b355f040f559d92fb4.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://medias/screenshots.jpg" 13 | dest_files=[ "res://.import/screenshots.jpg-39990cc2064265b355f040f559d92fb4.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/godot_icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/godot_icon.png-8200d807580e8ef9bd80be7bd5ddfe1d.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/godot_icon.png" 13 | dest_files=[ "res://.import/godot_icon.png-8200d807580e8ef9bd80be7bd5ddfe1d.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/icons/download.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/download.png-4883107b972ef21624c7af365fd7d496.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/icons/download.png" 13 | dest_files=[ "res://.import/download.png-4883107b972ef21624c7af365fd7d496.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/icons/settings.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/settings.png-ad7bbc7a1e3344e950640e290efe8a72.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/icons/settings.png" 13 | dest_files=[ "res://.import/settings.png-ad7bbc7a1e3344e950640e290efe8a72.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /visuals/splashscreen.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/splashscreen.png-9e639f42aeb9bba09eba5604a64030bb.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://visuals/splashscreen.png" 13 | dest_files=[ "res://.import/splashscreen.png-9e639f42aeb9bba09eba5604a64030bb.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | process/normal_map_invert_y=false 32 | stream=false 33 | size_limit=0 34 | detect_3d=true 35 | svg/scale=1.0 36 | -------------------------------------------------------------------------------- /scripts/settings.gd: -------------------------------------------------------------------------------- 1 | extends ScrollContainer 2 | 3 | signal finish() 4 | 5 | onready var dir_path = $ContentMargin/VBoxContainer/GodotInstalls/HBoxContainer/DirPath 6 | 7 | func _ready() -> void: 8 | # TODO: handle multiple paths 9 | dir_path.text = Globals.install_path 10 | 11 | func _on_Startup_toggled(button_pressed: bool) -> void: 12 | Globals.launch_startup = button_pressed 13 | 14 | func _on_AutoUpdate_toggled(button_pressed: bool) -> void: 15 | Globals.check_update_auto = button_pressed 16 | 17 | func _on_DesktopShortcut_toggled(button_pressed: bool) -> void: 18 | pass 19 | 20 | func _on_AutoDeleteInstall_toggled(button_pressed: bool) -> void: 21 | Globals.auto_delete_install_file = button_pressed 22 | 23 | func _on_FinishBtn_pressed() -> void: 24 | UserSettings.apply_settings(UserSettings.load_settings()) 25 | emit_signal("finish") 26 | 27 | func _on_CancelBtn_pressed() -> void: 28 | UserSettings.grab_settings() 29 | UserSettings.save_settings() 30 | emit_signal("finish") 31 | -------------------------------------------------------------------------------- /scripts/notifications.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | export var notification_scene: PackedScene = preload("res://scenes/notification.tscn") 4 | export var notification_time: float = 4.0 5 | 6 | var queue: Array 7 | 8 | func _ready() -> void: 9 | pass 10 | 11 | func queue_notification(text: String) -> void: 12 | var instance = notification_scene.instance() 13 | instance.text = text 14 | queue.append(instance) 15 | 16 | # Check if timer is already running, 17 | # if not, we can pop a notification 18 | if $Timer.time_left > 0: return 19 | 20 | $Timer.start(notification_time) 21 | var inst = queue.pop_front() 22 | $Container.add_child(inst) 23 | $Tween.interpolate_property(inst, "rect_position", Vector2(0, 150), Vector2.ZERO, 24 | 0.3, Tween.TRANS_CUBIC, Tween.EASE_OUT) 25 | $Tween.start() 26 | 27 | func _on_Timer_timeout() -> void: 28 | var notif = $Container.get_child(0) 29 | if not notif: return 30 | $Tween.interpolate_property(notif, "modulate", 31 | Color(1, 1, 1, 1), Color(1, 1, 1, 0), 32 | 0.4, Tween.TRANS_CUBIC, Tween.EASE_IN) 33 | $Tween.start() 34 | yield(get_tree().create_timer(0.45), "timeout") 35 | notif.queue_free() 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Victor Meunier (MrEliptik) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /addons/google_fonts/plugin.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends EditorPlugin 3 | 4 | 5 | const MainPanel = preload("res://addons/google_fonts/Menu.tscn") 6 | var main_panel_instance 7 | 8 | 9 | func _enter_tree(): 10 | main_panel_instance = MainPanel.instance() 11 | # Add the main panel to the editor's main viewport. 12 | get_editor_interface().get_editor_viewport().add_child(main_panel_instance) 13 | # Hide the main panel. Very much required. 14 | make_visible(false) 15 | main_panel_instance.connect('update_filesystem', self, '_update_filesystem') 16 | 17 | func _exit_tree(): 18 | if main_panel_instance: 19 | main_panel_instance.queue_free() 20 | 21 | func make_visible(visible): 22 | if main_panel_instance: 23 | main_panel_instance.visible = visible 24 | 25 | func get_plugin_name(): 26 | return "Fonts" 27 | 28 | func has_main_screen(): 29 | return true 30 | 31 | func get_plugin_icon(): 32 | return get_editor_interface().get_base_control().get_icon("Font", "EditorIcons") 33 | 34 | # var editor_settings = EditorPlugin.get_editor_interface().get_editor_settings() 35 | # var my_theme = editor_settings.get_setting("interface/theme/preset") 36 | 37 | func _update_filesystem(): 38 | get_editor_interface().get_resource_filesystem().scan() 39 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | [application] 12 | 13 | config/name="godownloader" 14 | run/main_scene="res://scenes/main.tscn" 15 | run/low_processor_mode=true 16 | boot_splash/image="res://visuals/splashscreen.png" 17 | boot_splash/bg_color=Color( 0.113725, 0.105882, 0.133333, 1 ) 18 | config/icon="res://icon.png" 19 | 20 | [autoload] 21 | 22 | Globals="*res://autoload/globals.gd" 23 | FileManager="*res://autoload/file_manager.gd" 24 | UserSettings="*res://autoload/user_settings.gd" 25 | 26 | [display] 27 | 28 | window/size/width=1280 29 | window/size/height=720 30 | window/size/test_width=960 31 | window/size/test_height=540 32 | window/stretch/mode="2d" 33 | window/stretch/aspect="expand" 34 | 35 | [editor_plugins] 36 | 37 | enabled=PoolStringArray( "res://addons/google_fonts/plugin.cfg" ) 38 | 39 | [physics] 40 | 41 | common/enable_pause_aware_picking=true 42 | 43 | [rendering] 44 | 45 | vram_compression/import_etc=true 46 | vram_compression/import_etc2=false 47 | environment/default_environment="res://default_env.tres" 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | A Godot download manager: easily manage, download and update your Godot installations. 6 | 7 | *NOTE: This app is currently under development!* 8 | 9 | ## Screenshots 10 | 11 |

12 | 13 |

14 | 15 | 16 | ## About me 17 | 18 | Full time indie gamedev: 3D, 2D & VR. 19 | 20 | - [Discord](https://discord.gg/83nFRPTP6t) 21 | - [YouTube](https://www.youtube.com/c/MrEliptik) 22 | - [TikTok](https://www.tiktok.com/@mreliptik) 23 | - [Twitter](https://twitter.com/mreliptik_) 24 | - [Instagram](https://www.instagram.com/_mreliptik) 25 | - [Itch.io](https://mreliptik.itch.io/) 26 | - [Sketchfab](https://sketchfab.com/victor.meunierpk) 27 | 28 | If you enjoyed this project and want to support me: 29 | 30 | Buy Me a Coffee at ko-fi.com 31 | 32 | ## LICENSE & Credits 33 | 34 | This project is distributed under the MIT license, which it's free to use, modify and redistribute, for both personnal and commercial projects. For more information see [LICENSE.md](https://github.com/MrEliptik/godownloader/blob/master/LICENSE). 35 | -------------------------------------------------------------------------------- /scripts/setup.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | signal finish() 4 | 5 | var desktop_shortcut: bool = true 6 | 7 | onready var dirPath = $Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer/DirPath 8 | onready var finishBtn = $Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5/FinishBtn 9 | onready var executablesFound = $Control/VBoxContainer/ContentMargin/VBoxContainer/ExecutablesFound 10 | 11 | func _ready() -> void: 12 | finishBtn.disabled = true 13 | executablesFound.modulate.a = 0 14 | 15 | func _on_BrowseBtn_pressed() -> void: 16 | $Control/FileDialog.show() 17 | 18 | func _on_FinishBtn_pressed() -> void: 19 | emit_signal("finish") 20 | call_deferred("queue_free") 21 | 22 | func _on_Startup_pressed() -> void: 23 | Globals.launch_startup 24 | 25 | func _on_FileDialog_dir_selected(dir: String) -> void: 26 | dirPath.text = dir 27 | finishBtn.disabled = false 28 | 29 | Globals.install_path = dir 30 | var res = FileManager.look_for_godot_in_dir(dir) 31 | executablesFound.text = "Found %s Godot executables" % res.size() 32 | executablesFound.modulate.a = 1.0 33 | 34 | for version in res: 35 | Globals.godot_versions.append(version) 36 | 37 | func _on_Startup_toggled(button_pressed): 38 | Globals.launch_startup = button_pressed 39 | 40 | func _on_CheckUpdateAuto_toggled(button_pressed): 41 | Globals.check_update_auto = button_pressed 42 | 43 | func _on_AutoDeleteInstall_toggled(button_pressed: bool) -> void: 44 | Globals.auto_delete_install_file = button_pressed 45 | 46 | func _on_DesktopShortcut_toggled(button_pressed): 47 | desktop_shortcut = button_pressed 48 | -------------------------------------------------------------------------------- /scripts/card.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends Control 3 | 4 | export var installed: bool = false setget set_installed 5 | 6 | var version: String = "x.x.x" setget set_version 7 | var path: String = "path/to/somewhere" setget set_path 8 | var type: String = "" 9 | 10 | onready var version_label = $ContentMargin/HBoxContainer/VBoxContainer/Version 11 | onready var path_label = $ContentMargin/HBoxContainer/VBoxContainer/Path 12 | 13 | func _ready() -> void: 14 | version_label.text = version + " - " + type 15 | path_label.text = path 16 | # Set values 17 | $ContentMargin/HBoxContainer/DownloadBtn.visible = !installed 18 | $ContentMargin/HBoxContainer/EraseBtn.visible = installed 19 | $ContentMargin/HBoxContainer/LaunchBtn.visible = installed 20 | 21 | func set_installed(val: bool) -> void: 22 | installed = val 23 | if has_node("ContentMargin/HBoxContainer/DownloadBtn"): 24 | $ContentMargin/HBoxContainer/DownloadBtn.visible = !installed 25 | if has_node("ContentMargin/HBoxContainer/EraseBtn"): 26 | $ContentMargin/HBoxContainer/EraseBtn.visible = installed 27 | 28 | func set_version(new_version: String) -> void: 29 | version = new_version 30 | if version_label: 31 | version_label.text = version 32 | 33 | func set_path(new_path: String) -> void: 34 | path = new_path 35 | if path_label: 36 | path_label.text = path 37 | 38 | func launch(path: String) -> void: 39 | var output = [] 40 | # -p to launch project manager 41 | # https://godotengine.org/qa/99353/opening-a-godot-game-from-another-wrong-project-lauches 42 | var pid = OS.execute(path, ["-p"], false, output) 43 | print(pid) 44 | print(output) 45 | 46 | func _on_LaunchBtn_pressed() -> void: 47 | launch(path) 48 | -------------------------------------------------------------------------------- /scenes/main.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://scenes/top_bar.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://scenes/card_view.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://scripts/notifications.gd" type="Script" id=4] 6 | [ext_resource path="res://scenes/main.gd" type="Script" id=6] 7 | 8 | [node name="Main" type="Control"] 9 | anchor_right = 1.0 10 | anchor_bottom = 1.0 11 | script = ExtResource( 6 ) 12 | 13 | [node name="ColorRect" type="ColorRect" parent="."] 14 | anchor_right = 1.0 15 | anchor_bottom = 1.0 16 | color = Color( 0.113725, 0.105882, 0.133333, 1 ) 17 | 18 | [node name="VBoxContainer" type="VBoxContainer" parent="."] 19 | anchor_right = 1.0 20 | anchor_bottom = 1.0 21 | 22 | [node name="TopBar" parent="VBoxContainer" instance=ExtResource( 1 )] 23 | 24 | [node name="View" type="Control" parent="VBoxContainer"] 25 | margin_top = 64.0 26 | margin_right = 1280.0 27 | margin_bottom = 720.0 28 | size_flags_horizontal = 3 29 | size_flags_vertical = 3 30 | 31 | [node name="CardView" parent="VBoxContainer/View" instance=ExtResource( 2 )] 32 | 33 | [node name="PopupContainer" type="Control" parent="."] 34 | anchor_right = 1.0 35 | anchor_bottom = 1.0 36 | mouse_filter = 2 37 | 38 | [node name="Notifications" type="Control" parent="."] 39 | anchor_left = 0.5 40 | anchor_top = 1.0 41 | anchor_right = 0.5 42 | anchor_bottom = 1.0 43 | margin_left = -341.0 44 | margin_top = -144.0 45 | margin_right = 341.0 46 | margin_bottom = -17.0 47 | script = ExtResource( 4 ) 48 | 49 | [node name="Container" type="Control" parent="Notifications"] 50 | anchor_right = 1.0 51 | anchor_bottom = 1.0 52 | 53 | [node name="Timer" type="Timer" parent="Notifications"] 54 | one_shot = true 55 | 56 | [node name="Tween" type="Tween" parent="Notifications"] 57 | 58 | [connection signal="add_version" from="VBoxContainer/TopBar" to="." method="_on_TopBar_add_version"] 59 | [connection signal="settings" from="VBoxContainer/TopBar" to="." method="_on_TopBar_settings"] 60 | [connection signal="timeout" from="Notifications/Timer" to="Notifications" method="_on_Timer_timeout"] 61 | -------------------------------------------------------------------------------- /scenes/buton.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=8 format=2] 2 | 3 | [ext_resource path="res://visuals/fonts/Poppins-Medium.ttf" type="DynamicFontData" id=1] 4 | 5 | [sub_resource type="DynamicFont" id=7] 6 | size = 28 7 | use_mipmaps = true 8 | use_filter = true 9 | font_data = ExtResource( 1 ) 10 | 11 | [sub_resource type="StyleBoxFlat" id=15] 12 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 13 | border_width_left = 3 14 | border_width_top = 3 15 | border_width_right = 3 16 | border_width_bottom = 3 17 | border_color = Color( 1, 1, 1, 1 ) 18 | corner_radius_top_left = 5 19 | corner_radius_top_right = 5 20 | corner_radius_bottom_right = 5 21 | corner_radius_bottom_left = 5 22 | 23 | [sub_resource type="StyleBoxFlat" id=16] 24 | bg_color = Color( 0.235294, 0.564706, 0.505882, 1 ) 25 | corner_radius_top_left = 5 26 | corner_radius_top_right = 5 27 | corner_radius_bottom_right = 5 28 | corner_radius_bottom_left = 5 29 | 30 | [sub_resource type="StyleBoxEmpty" id=9] 31 | 32 | [sub_resource type="StyleBoxFlat" id=13] 33 | bg_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 34 | corner_radius_top_left = 5 35 | corner_radius_top_right = 5 36 | corner_radius_bottom_right = 5 37 | corner_radius_bottom_left = 5 38 | 39 | [sub_resource type="StyleBoxFlat" id=17] 40 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 41 | corner_radius_top_left = 5 42 | corner_radius_top_right = 5 43 | corner_radius_bottom_right = 5 44 | corner_radius_bottom_left = 5 45 | 46 | [node name="Button" type="Button"] 47 | margin_right = 200.0 48 | margin_bottom = 65.0 49 | rect_min_size = Vector2( 200, 65 ) 50 | size_flags_vertical = 4 51 | custom_colors/font_color_disabled = Color( 0.113725, 0.105882, 0.133333, 1 ) 52 | custom_colors/font_color_focus = Color( 0.203922, 0.203922, 0.231373, 1 ) 53 | custom_colors/font_color = Color( 0.203922, 0.203922, 0.231373, 1 ) 54 | custom_colors/font_color_hover = Color( 0.203922, 0.203922, 0.231373, 1 ) 55 | custom_colors/font_color_pressed = Color( 0.203922, 0.203922, 0.231373, 1 ) 56 | custom_fonts/font = SubResource( 7 ) 57 | custom_styles/hover = SubResource( 15 ) 58 | custom_styles/pressed = SubResource( 16 ) 59 | custom_styles/focus = SubResource( 9 ) 60 | custom_styles/disabled = SubResource( 13 ) 61 | custom_styles/normal = SubResource( 17 ) 62 | text = "DOWNLOAD" 63 | -------------------------------------------------------------------------------- /autoload/user_settings.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | const SAVE_PATH = "user://config.cfg" 4 | 5 | var config_file = ConfigFile.new() 6 | var settings = { 7 | "godot": { 8 | "install_path": "", 9 | "setup_complete": false, 10 | "godot_versions": [], 11 | }, 12 | "user": { 13 | "launch_startup": true, 14 | "check_update_auto": true, 15 | "auto_delete_install_file": true 16 | } 17 | } 18 | 19 | func _ready() -> void: 20 | ## Create config file if not existing 21 | ## otherwise, load values 22 | var file_check = File.new() 23 | if file_check.file_exists(SAVE_PATH): 24 | var values = load_settings() 25 | apply_settings(values) 26 | else: 27 | save_settings() 28 | 29 | func save_settings(): 30 | for section in settings.keys(): 31 | for key in settings[section].keys(): 32 | config_file.set_value(section, key, settings[section][key]) 33 | 34 | config_file.save(SAVE_PATH) 35 | 36 | func load_settings(): 37 | var err = config_file.load(SAVE_PATH) 38 | if err != OK: 39 | print("Error loading the settings. Error code: %s" % err) 40 | return [] 41 | 42 | var values = [] 43 | for section in settings.keys(): 44 | for key in settings[section].keys(): 45 | var val = settings[section][key] 46 | values.append(config_file.get_value(section, key, val)) 47 | settings[section][key] = config_file.get_value(section, key, val) 48 | # print("%s: %s" % [key, val]) 49 | return settings 50 | 51 | func grab_settings(): 52 | settings["godot"]["install_path"] = Globals.install_path 53 | settings["godot"]["setup_complete"] = Globals.setup_complete 54 | settings["godot"]["godot_versions"] = Globals.godot_versions 55 | settings["user"]["launch_startup"] = Globals.launch_startup 56 | settings["user"]["check_update_auto"] = Globals.check_update_auto 57 | settings["user"]["auto_delete_install_file"] = Globals.auto_delete_install_file 58 | 59 | func apply_settings(values: Dictionary): 60 | Globals.install_path = values["godot"]["install_path"] 61 | Globals.setup_complete = values["godot"]["setup_complete"] 62 | Globals.godot_versions = values["godot"]["godot_versions"] 63 | Globals.launch_startup = values["user"]["launch_startup"] 64 | Globals.check_update_auto = values["user"]["check_update_auto"] 65 | Globals.auto_delete_install_file = values["user"]["auto_delete_install_file"] 66 | 67 | -------------------------------------------------------------------------------- /scenes/notification.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://visuals/icons/cross.png" type="Texture" id=2] 5 | [ext_resource path="res://scripts/notification.gd" type="Script" id=3] 6 | 7 | [sub_resource type="StyleBoxFlat" id=1] 8 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 9 | corner_radius_top_left = 5 10 | corner_radius_top_right = 5 11 | corner_radius_bottom_right = 5 12 | corner_radius_bottom_left = 5 13 | 14 | [sub_resource type="DynamicFont" id=2] 15 | size = 24 16 | use_mipmaps = true 17 | use_filter = true 18 | font_data = ExtResource( 1 ) 19 | 20 | [node name="Notification" type="Control"] 21 | anchor_right = 1.0 22 | anchor_bottom = 1.0 23 | script = ExtResource( 3 ) 24 | 25 | [node name="Panel" type="Panel" parent="."] 26 | anchor_right = 1.0 27 | anchor_bottom = 1.0 28 | custom_styles/panel = SubResource( 1 ) 29 | 30 | [node name="MarginContainer" type="MarginContainer" parent="."] 31 | anchor_right = 1.0 32 | anchor_bottom = 1.0 33 | custom_constants/margin_right = 15 34 | custom_constants/margin_left = 15 35 | 36 | [node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] 37 | margin_left = 15.0 38 | margin_right = 1265.0 39 | margin_bottom = 720.0 40 | size_flags_horizontal = 3 41 | size_flags_vertical = 3 42 | alignment = 1 43 | 44 | [node name="Text" type="Label" parent="MarginContainer/HBoxContainer"] 45 | margin_right = 1226.0 46 | margin_bottom = 720.0 47 | size_flags_horizontal = 3 48 | size_flags_vertical = 3 49 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 50 | custom_fonts/font = SubResource( 2 ) 51 | text = "Example notification blahhhhh 52 | bkaaaaa" 53 | valign = 1 54 | autowrap = true 55 | 56 | [node name="CloseBtn" type="TextureButton" parent="MarginContainer/HBoxContainer"] 57 | margin_left = 1230.0 58 | margin_right = 1250.0 59 | margin_bottom = 720.0 60 | rect_min_size = Vector2( 20, 0 ) 61 | size_flags_vertical = 3 62 | texture_normal = ExtResource( 2 ) 63 | texture_pressed = ExtResource( 2 ) 64 | texture_hover = ExtResource( 2 ) 65 | texture_disabled = ExtResource( 2 ) 66 | texture_focused = ExtResource( 2 ) 67 | expand = true 68 | stretch_mode = 5 69 | 70 | [connection signal="pressed" from="MarginContainer/HBoxContainer/CloseBtn" to="." method="_on_CloseBtn_pressed"] 71 | -------------------------------------------------------------------------------- /autoload/network.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | signal versions_updated() 4 | signal download_progress(progress) 5 | signal download_finished(complete, download_path) 6 | 7 | var mirror = "https://downloads.tuxfamily.org/godotengine/" 8 | 9 | onready var http_req = $HTTPRequest 10 | onready var download_req = $DownloadReq 11 | 12 | var version_regex = RegEx.new() 13 | var type_regex = RegEx.new() 14 | 15 | var downloading_version: String = "" 16 | 17 | var last_download_percent: int = 0 18 | var downloading: bool = false 19 | var download_path: String = "" 20 | 21 | func _ready() -> void: 22 | version_regex.compile("(?<=>)(?:[0-9]\\.){1,2}[0-9](?=<)") 23 | type_regex.compile("(?<=-)(.*?)(?=_)") 24 | 25 | # get_available_versions() 26 | 27 | func _process(delta: float) -> void: 28 | if not downloading: return 29 | var bodySize = download_req.get_body_size() 30 | var downloadedBytes = download_req.get_downloaded_bytes() 31 | print("Download: %smb" % str(downloadedBytes/1000000.0)) 32 | 33 | var percent = ceil(downloadedBytes*100/bodySize) 34 | if percent > last_download_percent: 35 | last_download_percent = percent 36 | emit_signal("download_progress", percent) 37 | 38 | func get_available_versions() -> void: 39 | http_req.request(mirror) 40 | yield(http_req, "request_completed") 41 | emit_signal("versions_updated") 42 | 43 | func download_version(version: String) -> void: 44 | downloading_version = version 45 | download_path = "user://download_tmp_godot_%s.zip" % version 46 | download_req.set_download_file(download_path) 47 | download_req.request(mirror+"/"+version+"/Godot_v"+version+"-stable_win64.exe.zip") 48 | downloading = true 49 | last_download_percent = 0 50 | 51 | func cancel_download() -> void: 52 | download_req.cancel_request() 53 | downloading = false 54 | emit_signal("download_finished", false, download_path) 55 | 56 | func _on_HTTPRequest_request_completed(result: int, response_code: int, headers: PoolStringArray, body: PoolByteArray) -> void: 57 | # print(body.get_string_from_utf8()) 58 | var res = version_regex.search_all(body.get_string_from_utf8()) 59 | for r in res: 60 | Globals.available_versions.append({"version":r.get_string(), "type":Globals.TYPE.STABLE}) 61 | 62 | func _on_DownloadReq_request_completed(result: int, response_code: int, headers: PoolStringArray, body: PoolByteArray) -> void: 63 | print(result) 64 | print(response_code) 65 | if response_code == 200: 66 | # Load a zip file 67 | emit_signal("download_finished", true, download_path) 68 | emit_signal("download_finished", false, download_path) 69 | downloading = false 70 | 71 | 72 | -------------------------------------------------------------------------------- /scenes/top_bar.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=7 format=2] 2 | 3 | [ext_resource path="res://visuals/icons/settings.png" type="Texture" id=1] 4 | [ext_resource path="res://visuals/fonts/Poppins-Medium.ttf" type="DynamicFontData" id=2] 5 | [ext_resource path="res://icon.png" type="Texture" id=3] 6 | [ext_resource path="res://visuals/icons/download.png" type="Texture" id=4] 7 | [ext_resource path="res://scenes/top_bar.gd" type="Script" id=5] 8 | 9 | [sub_resource type="DynamicFont" id=1] 10 | size = 25 11 | use_mipmaps = true 12 | use_filter = true 13 | font_data = ExtResource( 2 ) 14 | 15 | [node name="TopBar" type="MarginContainer"] 16 | margin_right = 1280.0 17 | margin_bottom = 60.0 18 | script = ExtResource( 5 ) 19 | 20 | [node name="ColorRect" type="ColorRect" parent="."] 21 | margin_right = 1280.0 22 | margin_bottom = 60.0 23 | color = Color( 0.14902, 0.14902, 0.180392, 1 ) 24 | 25 | [node name="ContentMargin" type="MarginContainer" parent="."] 26 | margin_right = 1280.0 27 | margin_bottom = 60.0 28 | rect_min_size = Vector2( 0, 60 ) 29 | custom_constants/margin_right = 20 30 | custom_constants/margin_top = 10 31 | custom_constants/margin_left = 20 32 | custom_constants/margin_bottom = 10 33 | 34 | [node name="HBoxContainer" type="HBoxContainer" parent="ContentMargin"] 35 | margin_left = 20.0 36 | margin_top = 10.0 37 | margin_right = 1260.0 38 | margin_bottom = 50.0 39 | 40 | [node name="TextureRect" type="TextureRect" parent="ContentMargin/HBoxContainer"] 41 | margin_right = 60.0 42 | margin_bottom = 40.0 43 | rect_min_size = Vector2( 60, 0 ) 44 | size_flags_vertical = 3 45 | texture = ExtResource( 3 ) 46 | expand = true 47 | stretch_mode = 6 48 | 49 | [node name="Label" type="Label" parent="ContentMargin/HBoxContainer"] 50 | margin_left = 64.0 51 | margin_top = 2.0 52 | margin_right = 1112.0 53 | margin_bottom = 38.0 54 | size_flags_horizontal = 3 55 | size_flags_vertical = 6 56 | custom_fonts/font = SubResource( 1 ) 57 | text = "Godownloader v0.1" 58 | align = 1 59 | valign = 1 60 | 61 | [node name="AddBtn" type="TextureButton" parent="ContentMargin/HBoxContainer"] 62 | margin_left = 1116.0 63 | margin_right = 1176.0 64 | margin_bottom = 40.0 65 | rect_min_size = Vector2( 60, 0 ) 66 | size_flags_vertical = 3 67 | texture_normal = ExtResource( 4 ) 68 | expand = true 69 | stretch_mode = 5 70 | 71 | [node name="SettingsBtn" type="TextureButton" parent="ContentMargin/HBoxContainer"] 72 | margin_left = 1180.0 73 | margin_right = 1240.0 74 | margin_bottom = 40.0 75 | rect_min_size = Vector2( 60, 0 ) 76 | size_flags_vertical = 3 77 | texture_normal = ExtResource( 1 ) 78 | expand = true 79 | stretch_mode = 5 80 | 81 | [connection signal="pressed" from="ContentMargin/HBoxContainer/AddBtn" to="." method="_on_AddBtn_pressed"] 82 | [connection signal="pressed" from="ContentMargin/HBoxContainer/SettingsBtn" to="." method="_on_SettingsBtn_pressed"] 83 | -------------------------------------------------------------------------------- /scripts/download_popup.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | signal download(version) 4 | signal cancel() 5 | 6 | onready var version_btn = $Control/VBoxContainer/ContentMargin/VBoxContainer/VersionContainer/VersionBtn 7 | onready var download_btn = $Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5/DownloadBtn 8 | onready var cancel_btn = $Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5/CancelBtn 9 | onready var download_label = $Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer/DownloadLabel 10 | onready var download_bar = $Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer/ProgressBar 11 | 12 | var alpha: bool = true 13 | var beta: bool = true 14 | var stable: bool = true 15 | 16 | func _ready() -> void: 17 | fill_in_versions() 18 | $Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer.show() 19 | $Control/VBoxContainer/ContentMargin/VBoxContainer/VersionContainer.show() 20 | $Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer.hide() 21 | download_btn.show() 22 | cancel_btn.hide() 23 | download_bar.value = 0 24 | 25 | func update_progress(val: float) -> void: 26 | download_bar.value = val 27 | 28 | func fill_in_versions() -> void: 29 | for version in Globals.available_versions: 30 | # Skip the version we don't want to see 31 | if version["type"] == Globals.TYPE.ALPHA && not alpha: continue 32 | if version["type"] == Globals.TYPE.BETA && not beta: continue 33 | if version["type"] == Globals.TYPE.STABLE && not stable: continue 34 | 35 | version_btn.add_item(version["version"]) 36 | 37 | func erase_options() -> void: 38 | version_btn.clear() 39 | 40 | func _on_Alpha_toggled(button_pressed: bool) -> void: 41 | alpha = button_pressed 42 | erase_options() 43 | fill_in_versions() 44 | 45 | func _on_Beta_toggled(button_pressed: bool) -> void: 46 | beta = button_pressed 47 | erase_options() 48 | fill_in_versions() 49 | 50 | func _on_Stable_toggled(button_pressed: bool) -> void: 51 | stable = button_pressed 52 | erase_options() 53 | fill_in_versions() 54 | 55 | func _on_VersionBtn_item_selected(index: int) -> void: 56 | download_btn.text = "DOWNLOAD v%s" % version_btn.get_item_text(index) 57 | 58 | func _on_DownloadBtn_pressed() -> void: 59 | var version = version_btn.get_item_text(version_btn.selected) 60 | emit_signal("download", version) 61 | download_label.text = "Downloading Godot %s" % version 62 | $Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer.hide() 63 | $Control/VBoxContainer/ContentMargin/VBoxContainer/VersionContainer.hide() 64 | $Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer.show() 65 | download_btn.hide() 66 | cancel_btn.show() 67 | 68 | func _on_CloseBtn_pressed() -> void: 69 | queue_free() 70 | 71 | func _on_CancelBtn_pressed() -> void: 72 | emit_signal("cancel") 73 | -------------------------------------------------------------------------------- /addons/google_fonts/Menu.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://addons/google_fonts/Menu.gd" type="Script" id=1] 4 | 5 | [node name="Menu" type="PanelContainer"] 6 | anchor_right = 1.0 7 | anchor_bottom = 1.0 8 | size_flags_horizontal = 3 9 | size_flags_vertical = 3 10 | script = ExtResource( 1 ) 11 | __meta__ = { 12 | "_edit_use_anchors_": false 13 | } 14 | 15 | [node name="split" type="HSplitContainer" parent="."] 16 | margin_left = 7.0 17 | margin_top = 7.0 18 | margin_right = 1017.0 19 | margin_bottom = 593.0 20 | __meta__ = { 21 | "_edit_use_anchors_": false 22 | } 23 | 24 | [node name="box" type="VBoxContainer" parent="split"] 25 | margin_right = 261.0 26 | margin_bottom = 586.0 27 | size_flags_horizontal = 3 28 | size_flags_stretch_ratio = 0.36 29 | 30 | [node name="Tree" type="Tree" parent="split/box"] 31 | margin_right = 261.0 32 | margin_bottom = 562.0 33 | size_flags_horizontal = 3 34 | size_flags_vertical = 3 35 | size_flags_stretch_ratio = 0.35 36 | hide_root = true 37 | __meta__ = { 38 | "_edit_use_anchors_": false 39 | } 40 | 41 | [node name="Button" type="Button" parent="split/box"] 42 | margin_top = 566.0 43 | margin_right = 261.0 44 | margin_bottom = 586.0 45 | text = "Reload" 46 | 47 | [node name="PanelContainer" type="PanelContainer" parent="split"] 48 | margin_left = 273.0 49 | margin_right = 1010.0 50 | margin_bottom = 586.0 51 | size_flags_horizontal = 3 52 | size_flags_vertical = 3 53 | 54 | [node name="VBoxContainer" type="VBoxContainer" parent="split/PanelContainer"] 55 | margin_left = 7.0 56 | margin_top = 7.0 57 | margin_right = 730.0 58 | margin_bottom = 579.0 59 | size_flags_horizontal = 3 60 | size_flags_vertical = 3 61 | 62 | [node name="TextEdit" type="TextEdit" parent="split/PanelContainer/VBoxContainer"] 63 | margin_right = 723.0 64 | margin_bottom = 572.0 65 | size_flags_horizontal = 3 66 | size_flags_vertical = 3 67 | text = "lorem ipsum" 68 | context_menu_enabled = false 69 | shortcut_keys_enabled = false 70 | virtual_keyboard_enabled = false 71 | selecting_enabled = false 72 | wrap_enabled = true 73 | 74 | [node name="save" type="Button" parent="split/PanelContainer/VBoxContainer"] 75 | visible = false 76 | margin_top = 502.0 77 | margin_right = 723.0 78 | margin_bottom = 572.0 79 | size_flags_vertical = 3 80 | size_flags_stretch_ratio = 0.14 81 | text = "Save Font to Project" 82 | __meta__ = { 83 | "_edit_use_anchors_": false 84 | } 85 | 86 | [node name="HTTPRequest" type="HTTPRequest" parent="."] 87 | use_threads = true 88 | 89 | [connection signal="cell_selected" from="split/box/Tree" to="." method="_on_Tree_cell_selected"] 90 | [connection signal="pressed" from="split/box/Button" to="." method="_on_Button_pressed"] 91 | [connection signal="pressed" from="split/PanelContainer/VBoxContainer/save" to="." method="_on_save_pressed"] 92 | [connection signal="request_completed" from="HTTPRequest" to="." method="_on_HTTPRequest_request_completed"] 93 | -------------------------------------------------------------------------------- /scenes/main.gd: -------------------------------------------------------------------------------- 1 | extends Control 2 | 3 | export var setup_scene = preload("res://scenes/setup.tscn") 4 | export var cardview_scene = preload("res://scenes/card_view.tscn") 5 | export var settings_scene = preload("res://scenes/settings.tscn") 6 | export var network = preload("res://autoload/network.tscn") 7 | export var download_popup_scene = preload("res://scenes/download_popup.tscn") 8 | 9 | var download_popup = null 10 | 11 | onready var net_instance = network.instance() 12 | onready var view_container = $VBoxContainer/View 13 | onready var popup_container = $PopupContainer 14 | onready var notifications = $Notifications 15 | 16 | func _ready() -> void: 17 | add_child(net_instance) 18 | net_instance.get_available_versions() 19 | net_instance.connect("download_progress", self, "on_download_progress") 20 | net_instance.connect("download_finished", self, "on_download_finished") 21 | net_instance.connect("versions_updated", $VBoxContainer/View/CardView, "on_versions_updated") 22 | 23 | if Globals.setup_complete: 24 | pass 25 | else: 26 | var instance = setup_scene.instance() 27 | popup_container.add_child(instance) 28 | instance.connect("finish", $VBoxContainer/View/CardView, "_on_Setup_finish") 29 | 30 | # notifications.queue_notification("Test blabla bla, long test, bla bla bla") 31 | 32 | func _on_TopBar_add_version() -> void: 33 | var instance = download_popup_scene.instance() 34 | add_child(instance) 35 | instance.connect("download", self, "on_download_popup_download") 36 | instance.connect("cancel", self, "on_download_popup_cancel") 37 | download_popup = instance 38 | 39 | func _on_TopBar_settings() -> void: 40 | var curr_scene = view_container.get_child(0) 41 | if curr_scene.get_name() == "Settings": return 42 | var instance = settings_scene.instance() 43 | view_container.add_child(instance) 44 | instance.connect("finish", self, "on_settings_finish") 45 | curr_scene.queue_free() 46 | 47 | func on_download_popup_download(version: String) -> void: 48 | net_instance.download_version(version) 49 | 50 | func on_download_popup_cancel() -> void: 51 | net_instance.cancel_download() 52 | 53 | func on_download_progress(progress: int) -> void: 54 | download_popup.update_progress(progress) 55 | 56 | func on_download_finished(complete: bool, path:String) -> void: 57 | download_popup.queue_free() 58 | if complete: 59 | notifications.queue_notification("Download finished! Unzipping..") 60 | # Unzip to install dir 61 | FileManager.unzip_to(path, Globals.install_path) 62 | 63 | notifications.queue_notification("Successfuly unzipped: %s" % path) 64 | # Remove download 65 | FileManager.delete_file(path) 66 | else: 67 | notifications.queue_notification("Download stopped. Deleting file..") 68 | # Remove download 69 | FileManager.delete_file(path) 70 | 71 | func on_settings_finish() -> void: 72 | var curr_scene = view_container.get_child(0) 73 | var instance = cardview_scene.instance() 74 | view_container.add_child(instance) 75 | curr_scene.queue_free() 76 | -------------------------------------------------------------------------------- /autoload/file_manager.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | static func look_for_godot_in_dir(dir_path: String) -> Array: 4 | var res = [] 5 | var dir = Directory.new() 6 | 7 | var godot_regex = RegEx.new() 8 | godot_regex.compile("(Godot_.*)") 9 | 10 | var version_regex = RegEx.new() 11 | version_regex.compile("((?:[0-9]\\.){1,2}[0-9])") 12 | 13 | var type_regex = RegEx.new() 14 | type_regex.compile("(?<=-)(.*?)(?=_)") 15 | 16 | if dir.open(dir_path) == OK: 17 | dir.list_dir_begin() 18 | var file_name = dir.get_next() 19 | while file_name != "": 20 | if dir.current_is_dir(): 21 | print("Found directory: " + file_name) 22 | else: 23 | print("Found file: " + file_name) 24 | # Check if godot 25 | var result = godot_regex.search(file_name) 26 | if result: 27 | print(result.get_string()) 28 | var version_res = version_regex.search(file_name) 29 | if version_res: 30 | var type = "" 31 | print(version_res.get_string()) 32 | var type_res = type_regex.search(file_name) 33 | if type_res: 34 | print(type_res.get_string()) 35 | type = type_res.get_string() 36 | 37 | match type: 38 | "stable": 39 | type = Globals.TYPE.STABLE 40 | "rc": 41 | type = Globals.TYPE.RC 42 | "beta": 43 | type = Globals.TYPE.BETA 44 | "alpha": 45 | type = Globals.TYPE.ALPHA 46 | "dev": 47 | type = Globals.TYPE.PRE_ALPHA 48 | _: 49 | type = Globals.TYPE.PRE_ALPHA 50 | 51 | var version = { 52 | "path":dir_path.plus_file(file_name), 53 | "version": version_res.get_string(), 54 | "type": type 55 | } 56 | res.append(version) 57 | file_name = dir.get_next() 58 | else: 59 | print("An error occurred when trying to access the path.") 60 | 61 | return res 62 | 63 | static func unzip_to(path: String, to: String) -> void: 64 | # Convert relative path to absolute 65 | var abs_path = get_abs_path(path) 66 | # Convert path to "windows" path, necessary for "del" 67 | abs_path = abs_path.replacen("/", "\\") 68 | 69 | to = to.replacen("/", "\\") 70 | 71 | print("\"%s\""%to) 72 | 73 | var output = [] 74 | # Expand-Archive -LiteralPath .\Godot_v3.4.3-stable_win64.exe.zip -DestinationPath "C:\Users\Victor\Downloads\Godot_v3.4.3" -Force 75 | if OS.execute("powershell.exe", 76 | ["-Command", "Expand-Archive", "-LiteralPath", abs_path, "-DestinationPath", "\'%s\'"%to, "-Force"], 77 | true, output, true) != OK: 78 | print("Unzipping %s failed" % abs_path) 79 | print(output) 80 | 81 | static func delete_file(path: String) -> void: 82 | # Convert relative path to absolute 83 | var abs_path = get_abs_path(path) 84 | # Convert path to "windows" path, necessary for "del" 85 | abs_path = abs_path.replacen("/", "\\") 86 | var output = [] 87 | if OS.execute("del", [abs_path], true, output, true) != OK: 88 | print("Deleting %s failed" % abs_path) 89 | print(output) 90 | 91 | # Converts relative path to absolute 92 | static func get_abs_path(path: String) -> String: 93 | var file = File.new() 94 | file.open(path, File.READ) 95 | var abs_path = file.get_path_absolute() 96 | file.close() 97 | return abs_path 98 | -------------------------------------------------------------------------------- /scenes/card_view.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=7 format=2] 2 | 3 | [ext_resource path="res://scripts/cards_view.gd" type="Script" id=1] 4 | [ext_resource path="res://scenes/card.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=4] 6 | [ext_resource path="res://scenes/visuals/app_theme.tres" type="Theme" id=5] 7 | 8 | [sub_resource type="DynamicFont" id=1] 9 | size = 34 10 | use_mipmaps = true 11 | use_filter = true 12 | font_data = ExtResource( 4 ) 13 | 14 | [sub_resource type="DynamicFont" id=2] 15 | size = 30 16 | use_mipmaps = true 17 | use_filter = true 18 | font_data = ExtResource( 4 ) 19 | 20 | [node name="CardView" type="ScrollContainer"] 21 | anchor_right = 1.0 22 | anchor_bottom = 1.0 23 | margin_right = -6.0 24 | size_flags_horizontal = 3 25 | size_flags_vertical = 3 26 | theme = ExtResource( 5 ) 27 | follow_focus = true 28 | script = ExtResource( 1 ) 29 | 30 | [node name="ContentMargin" type="MarginContainer" parent="."] 31 | margin_right = 1274.0 32 | margin_bottom = 720.0 33 | size_flags_horizontal = 3 34 | size_flags_vertical = 3 35 | custom_constants/margin_right = 20 36 | custom_constants/margin_top = 30 37 | custom_constants/margin_left = 20 38 | custom_constants/margin_bottom = 15 39 | 40 | [node name="VBoxContainer" type="VBoxContainer" parent="ContentMargin"] 41 | margin_left = 20.0 42 | margin_top = 30.0 43 | margin_right = 1254.0 44 | margin_bottom = 705.0 45 | size_flags_horizontal = 3 46 | size_flags_vertical = 3 47 | custom_constants/separation = 15 48 | 49 | [node name="LatestVersion" type="VBoxContainer" parent="ContentMargin/VBoxContainer"] 50 | visible = false 51 | margin_right = 1234.0 52 | margin_bottom = 190.0 53 | custom_constants/separation = 10 54 | 55 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/LatestVersion"] 56 | margin_right = 1234.0 57 | margin_bottom = 60.0 58 | rect_min_size = Vector2( 0, 60 ) 59 | size_flags_horizontal = 3 60 | custom_colors/font_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 61 | custom_fonts/font = SubResource( 1 ) 62 | text = "New version available!" 63 | 64 | [node name="HSeparator" type="HSeparator" parent="ContentMargin/VBoxContainer/LatestVersion/Label"] 65 | margin_top = 41.0 66 | margin_right = 1228.0 67 | margin_bottom = 67.0 68 | size_flags_horizontal = 3 69 | 70 | [node name="Card" parent="ContentMargin/VBoxContainer/LatestVersion" instance=ExtResource( 2 )] 71 | margin_top = 70.0 72 | margin_right = 1234.0 73 | margin_bottom = 190.0 74 | 75 | [node name="Installed" type="VBoxContainer" parent="ContentMargin/VBoxContainer"] 76 | margin_right = 1234.0 77 | margin_bottom = 60.0 78 | custom_constants/separation = 10 79 | 80 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/Installed"] 81 | margin_right = 1234.0 82 | margin_bottom = 60.0 83 | rect_min_size = Vector2( 0, 60 ) 84 | size_flags_horizontal = 3 85 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 86 | custom_fonts/font = SubResource( 2 ) 87 | text = "Installed" 88 | 89 | [node name="HSeparator" type="HSeparator" parent="ContentMargin/VBoxContainer/Installed/Label"] 90 | margin_top = 38.0 91 | margin_right = 1228.0 92 | margin_bottom = 62.0 93 | size_flags_horizontal = 3 94 | -------------------------------------------------------------------------------- /scripts/cards_view.gd: -------------------------------------------------------------------------------- 1 | extends ScrollContainer 2 | 3 | export var card_scene: PackedScene = preload("res://scenes/card.tscn") 4 | 5 | onready var latest_version = $ContentMargin/VBoxContainer/LatestVersion 6 | onready var installed = $ContentMargin/VBoxContainer/Installed 7 | 8 | func _ready() -> void: 9 | display_installed() 10 | 11 | func display_installed() -> void: 12 | for version in Globals.godot_versions: 13 | var instance = card_scene.instance() 14 | instance.path = version["path"] 15 | instance.version = version["version"] 16 | instance.type = Globals.TYPE_TO_STRING[version["type"]] 17 | instance.installed = true 18 | installed.add_child(instance) 19 | 20 | func check_new_version_available() -> String: 21 | var latest_version = "" 22 | var latest_installed_version = "" 23 | 24 | for version in Globals.available_versions: 25 | if version["type"] != Globals.TYPE.STABLE: continue 26 | latest_version = get_higher_version(version["version"], latest_version) 27 | 28 | # print(latest_version) 29 | 30 | for version in Globals.godot_versions: 31 | if version["type"] != Globals.TYPE.STABLE: continue 32 | latest_installed_version = get_higher_version(version["version"], latest_installed_version) 33 | 34 | print(latest_installed_version) 35 | 36 | var new_version = get_higher_version(latest_version, latest_installed_version) 37 | if new_version != latest_installed_version: 38 | print("new_version: ", new_version) 39 | 40 | return new_version 41 | 42 | func get_higher_version(vA, vB) -> String: 43 | var higher_version: String = "" 44 | 45 | # Get only the numbers in array form 46 | var splitA = vA.split(".") 47 | var splitB = vB.split(".") 48 | 49 | # initiliaze to one of the split 50 | # if they the versions are the same, we can return that 51 | # otherwise, it'll be overwritten 52 | var higher_version_arr = splitA 53 | 54 | # Make sure version are the same length by adding 55 | # zeros to the end 56 | while (splitA.size() < splitB.size()): 57 | splitA.append("0") 58 | while (splitB.size() < splitA.size()): 59 | splitB.append("0") 60 | 61 | # Start comparing 62 | for i in range(splitA.size()): 63 | 64 | # Same number, we can continue 65 | if int(splitA[i]) == int(splitB[i]): continue 66 | 67 | # A has bigger number, we don't need to continue 68 | # the rest doesn't matter 69 | elif int(splitA[i]) > int(splitB[i]): 70 | higher_version_arr = splitA 71 | break 72 | # B has bigger number, we don't need to continue 73 | # the rest doesn't matter 74 | else: 75 | higher_version_arr = splitB 76 | break 77 | 78 | # Turn the split into a semantic version string again 79 | for i in range(higher_version_arr.size()): 80 | if i == (higher_version_arr.size()-1): 81 | higher_version += str(higher_version_arr[i]) 82 | else: 83 | higher_version += str(higher_version_arr[i]) + "." 84 | 85 | return higher_version 86 | 87 | func on_versions_updated() -> void: 88 | var new_version = check_new_version_available() 89 | if not new_version: return 90 | $ContentMargin/VBoxContainer/LatestVersion/Card.version = new_version 91 | $ContentMargin/VBoxContainer/LatestVersion/Card.path = "" 92 | $ContentMargin/VBoxContainer/LatestVersion.show() 93 | 94 | func _on_Setup_finish() -> void: 95 | display_installed() 96 | 97 | Globals.setup_complete = true 98 | UserSettings.grab_settings() 99 | UserSettings.save_settings() 100 | 101 | check_new_version_available() 102 | -------------------------------------------------------------------------------- /scenes/visuals/app_theme.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Theme" load_steps=9 format=2] 2 | 3 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=1] 4 | 5 | [sub_resource type="DynamicFont" id=6] 6 | use_mipmaps = true 7 | use_filter = true 8 | font_data = ExtResource( 1 ) 9 | 10 | [sub_resource type="DynamicFont" id=7] 11 | size = 20 12 | use_mipmaps = true 13 | use_filter = true 14 | font_data = ExtResource( 1 ) 15 | 16 | [sub_resource type="StyleBoxEmpty" id=4] 17 | content_margin_left = 10.0 18 | 19 | [sub_resource type="StyleBoxFlat" id=5] 20 | content_margin_left = 10.0 21 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 22 | corner_radius_top_left = 5 23 | corner_radius_top_right = 5 24 | corner_radius_bottom_right = 5 25 | corner_radius_bottom_left = 5 26 | 27 | [sub_resource type="StyleBoxFlat" id=1] 28 | bg_color = Color( 0.203922, 0.203922, 0.231373, 1 ) 29 | corner_radius_top_left = 5 30 | corner_radius_top_right = 5 31 | corner_radius_bottom_right = 5 32 | corner_radius_bottom_left = 5 33 | 34 | [sub_resource type="StyleBoxFlat" id=2] 35 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 36 | corner_radius_top_left = 5 37 | corner_radius_top_right = 5 38 | corner_radius_bottom_right = 5 39 | corner_radius_bottom_left = 5 40 | 41 | [sub_resource type="StyleBoxFlat" id=3] 42 | bg_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 43 | corner_radius_top_left = 5 44 | corner_radius_top_right = 5 45 | corner_radius_bottom_right = 5 46 | corner_radius_bottom_left = 5 47 | 48 | [resource] 49 | default_font = SubResource( 6 ) 50 | CheckBox/colors/font_color = Color( 0, 0, 0, 1 ) 51 | CheckBox/colors/font_color_disabled = Color( 0, 0, 0, 1 ) 52 | CheckBox/colors/font_color_focus = Color( 0, 0, 0, 1 ) 53 | CheckBox/colors/font_color_hover = Color( 0, 0, 0, 1 ) 54 | CheckBox/colors/font_color_hover_pressed = Color( 0, 0, 0, 1 ) 55 | CheckBox/colors/font_color_pressed = Color( 0, 0, 0, 1 ) 56 | CheckBox/constants/check_vadjust = 0 57 | CheckBox/constants/hseparation = 0 58 | CheckBox/fonts/font = SubResource( 6 ) 59 | CheckBox/icons/checked = null 60 | CheckBox/icons/checked_disabled = null 61 | CheckBox/icons/radio_checked = null 62 | CheckBox/icons/radio_checked_disabled = null 63 | CheckBox/icons/radio_unchecked = null 64 | CheckBox/icons/radio_unchecked_disabled = null 65 | CheckBox/icons/unchecked = null 66 | CheckBox/icons/unchecked_disabled = null 67 | CheckBox/styles/disabled = null 68 | CheckBox/styles/focus = null 69 | CheckBox/styles/hover = null 70 | CheckBox/styles/hover_pressed = null 71 | CheckBox/styles/normal = null 72 | CheckBox/styles/pressed = null 73 | LineEdit/colors/clear_button_color = Color( 0, 0, 0, 1 ) 74 | LineEdit/colors/clear_button_color_pressed = Color( 0, 0, 0, 1 ) 75 | LineEdit/colors/cursor_color = Color( 0.8, 0.8, 0.807843, 1 ) 76 | LineEdit/colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 77 | LineEdit/colors/font_color_selected = Color( 0.8, 0.8, 0.807843, 1 ) 78 | LineEdit/colors/font_color_uneditable = Color( 0.8, 0.8, 0.807843, 1 ) 79 | LineEdit/colors/selection_color = Color( 0, 0, 0, 1 ) 80 | LineEdit/constants/minimum_spaces = 10 81 | LineEdit/fonts/font = SubResource( 7 ) 82 | LineEdit/icons/clear = null 83 | LineEdit/styles/focus = SubResource( 4 ) 84 | LineEdit/styles/normal = SubResource( 5 ) 85 | LineEdit/styles/read_only = SubResource( 5 ) 86 | VScrollBar/icons/decrement = null 87 | VScrollBar/icons/decrement_highlight = null 88 | VScrollBar/icons/decrement_pressed = null 89 | VScrollBar/icons/increment = null 90 | VScrollBar/icons/increment_highlight = null 91 | VScrollBar/icons/increment_pressed = null 92 | VScrollBar/styles/grabber = SubResource( 1 ) 93 | VScrollBar/styles/grabber_highlight = SubResource( 2 ) 94 | VScrollBar/styles/grabber_pressed = SubResource( 3 ) 95 | VScrollBar/styles/scroll = null 96 | VScrollBar/styles/scroll_focus = null 97 | -------------------------------------------------------------------------------- /scenes/card.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=10 format=2] 2 | 3 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=1] 4 | [ext_resource path="res://scenes/buton.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://scripts/card.gd" type="Script" id=3] 6 | [ext_resource path="res://visuals/icons/delete.png" type="Texture" id=4] 7 | 8 | [sub_resource type="StyleBoxFlat" id=8] 9 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 10 | corner_radius_top_left = 5 11 | corner_radius_top_right = 5 12 | corner_radius_bottom_right = 5 13 | corner_radius_bottom_left = 5 14 | 15 | [sub_resource type="DynamicFont" id=1] 16 | size = 28 17 | use_mipmaps = true 18 | use_filter = true 19 | font_data = ExtResource( 1 ) 20 | 21 | [sub_resource type="DynamicFont" id=2] 22 | size = 24 23 | use_mipmaps = true 24 | use_filter = true 25 | font_data = ExtResource( 1 ) 26 | 27 | [sub_resource type="StyleBoxFlat" id=10] 28 | bg_color = Color( 0.839216, 0.34902, 0.345098, 1 ) 29 | border_width_left = 3 30 | border_width_top = 3 31 | border_width_right = 3 32 | border_width_bottom = 3 33 | border_color = Color( 1, 1, 1, 1 ) 34 | corner_radius_top_left = 5 35 | corner_radius_top_right = 5 36 | corner_radius_bottom_right = 5 37 | corner_radius_bottom_left = 5 38 | 39 | [sub_resource type="StyleBoxFlat" id=9] 40 | bg_color = Color( 0.839216, 0.34902, 0.345098, 1 ) 41 | corner_radius_top_left = 5 42 | corner_radius_top_right = 5 43 | corner_radius_bottom_right = 5 44 | corner_radius_bottom_left = 5 45 | 46 | [node name="Card" type="Control"] 47 | margin_right = 648.0 48 | margin_bottom = 82.0 49 | rect_min_size = Vector2( 0, 120 ) 50 | size_flags_horizontal = 3 51 | script = ExtResource( 3 ) 52 | 53 | [node name="Panel" type="Panel" parent="."] 54 | anchor_right = 1.0 55 | anchor_bottom = 1.0 56 | custom_styles/panel = SubResource( 8 ) 57 | 58 | [node name="ContentMargin" type="MarginContainer" parent="."] 59 | anchor_right = 1.0 60 | anchor_bottom = 1.0 61 | size_flags_horizontal = 3 62 | size_flags_vertical = 3 63 | custom_constants/margin_right = 10 64 | custom_constants/margin_top = 10 65 | custom_constants/margin_left = 10 66 | custom_constants/margin_bottom = 5 67 | 68 | [node name="HBoxContainer" type="HBoxContainer" parent="ContentMargin"] 69 | margin_left = 10.0 70 | margin_top = 10.0 71 | margin_right = 638.0 72 | margin_bottom = 115.0 73 | custom_constants/separation = 15 74 | 75 | [node name="VBoxContainer" type="VBoxContainer" parent="ContentMargin/HBoxContainer"] 76 | margin_top = 12.0 77 | margin_right = 246.0 78 | margin_bottom = 92.0 79 | size_flags_vertical = 4 80 | custom_constants/separation = 5 81 | 82 | [node name="Version" type="Label" parent="ContentMargin/HBoxContainer/VBoxContainer"] 83 | margin_right = 246.0 84 | margin_bottom = 40.0 85 | size_flags_horizontal = 3 86 | size_flags_vertical = 6 87 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 88 | custom_fonts/font = SubResource( 1 ) 89 | text = "x.x.x - " 90 | valign = 1 91 | 92 | [node name="Path" type="Label" parent="ContentMargin/HBoxContainer/VBoxContainer"] 93 | margin_top = 45.0 94 | margin_right = 246.0 95 | margin_bottom = 80.0 96 | size_flags_horizontal = 3 97 | size_flags_vertical = 6 98 | custom_colors/font_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 99 | custom_fonts/font = SubResource( 2 ) 100 | text = "path/to/somewhere" 101 | valign = 1 102 | 103 | [node name="HSeparator" type="HSeparator" parent="ContentMargin/HBoxContainer"] 104 | self_modulate = Color( 1, 1, 1, 0 ) 105 | margin_left = 261.0 106 | margin_right = 413.0 107 | margin_bottom = 105.0 108 | size_flags_horizontal = 3 109 | 110 | [node name="DownloadBtn" parent="ContentMargin/HBoxContainer" instance=ExtResource( 2 )] 111 | margin_left = 428.0 112 | margin_top = 20.0 113 | margin_right = 628.0 114 | margin_bottom = 85.0 115 | expand_icon = true 116 | 117 | [node name="LaunchBtn" parent="ContentMargin/HBoxContainer" instance=ExtResource( 2 )] 118 | visible = false 119 | margin_left = 348.0 120 | margin_top = 20.0 121 | margin_right = 548.0 122 | margin_bottom = 85.0 123 | text = "Launch" 124 | expand_icon = true 125 | 126 | [node name="EraseBtn" parent="ContentMargin/HBoxContainer" instance=ExtResource( 2 )] 127 | visible = false 128 | margin_left = 563.0 129 | margin_top = 20.0 130 | margin_right = 628.0 131 | margin_bottom = 85.0 132 | rect_min_size = Vector2( 65, 65 ) 133 | custom_styles/hover = SubResource( 10 ) 134 | custom_styles/normal = SubResource( 9 ) 135 | text = "" 136 | 137 | [node name="TextureRect" type="TextureRect" parent="ContentMargin/HBoxContainer/EraseBtn"] 138 | anchor_left = 0.5 139 | anchor_top = 0.5 140 | anchor_right = 0.5 141 | anchor_bottom = 0.5 142 | margin_left = -20.0 143 | margin_top = -20.0 144 | margin_right = 20.0 145 | margin_bottom = 20.0 146 | texture = ExtResource( 4 ) 147 | expand = true 148 | stretch_mode = 6 149 | 150 | [connection signal="pressed" from="ContentMargin/HBoxContainer/LaunchBtn" to="." method="_on_LaunchBtn_pressed"] 151 | -------------------------------------------------------------------------------- /addons/google_fonts/Menu.gd: -------------------------------------------------------------------------------- 1 | tool 2 | extends PanelContainer 3 | 4 | signal update_filesystem 5 | 6 | onready var tree:Tree = $split/box/Tree 7 | onready var text:TextEdit = $split/PanelContainer/VBoxContainer/TextEdit 8 | onready var http:HTTPRequest = $HTTPRequest 9 | onready var saveb:Button = $split/PanelContainer/VBoxContainer/save 10 | 11 | var fonts 12 | var tree_map = {} 13 | var tree_map_index = 0 14 | var display_type = 0 15 | var font_name := '' 16 | 17 | var dummy = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\neiusmod tempor incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco\nlaboris nisi ut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident,\nsunt in culpa qui officia deserunt mollit anim id est laborum.' 18 | 19 | 20 | func load_json(path): 21 | var file = File.new() 22 | if file.open(path, file.READ) != OK: 23 | return 24 | var data_text = file.get_as_text() 25 | file.close() 26 | var data_parse = JSON.parse(data_text) 27 | if data_parse.error != OK: 28 | return 29 | return data_parse.result 30 | 31 | 32 | 33 | func save_json(path, data:Dictionary): 34 | var file = File.new() 35 | if file.open(path, file.WRITE) != OK: 36 | return 37 | file.store_string(JSON.print(data)) 38 | file.close() 39 | 40 | 41 | func update_font_file(): 42 | var response = load_json("res://addons/google_fonts/response.json") 43 | var files = {} 44 | for r in response['tree']: 45 | if not r['path'].begins_with('.') and '/' in r['path']: 46 | var p = r['path'].split('/') 47 | var pointer = files 48 | for pp in p: 49 | if not pointer.has(pp): 50 | pointer[pp] = {} 51 | if not '.' in pp: 52 | pointer = pointer[pp] 53 | else: 54 | pointer[pp] = r['url'] 55 | # print(Marshalls.base64_to_utf8('IyBPbmx5IHJ1biBnZnRvb2xzIHFhIG9uIHBycyB3aGljaCBoYXZlIG1vZGlm\naWVkIGZpbGVzIGluIGRpcmVjdG9yaWVzIHdoaWNoCiMgY29udGFpbiBmb250\nIGJpbmFyaWVzLgoKIyBGaW5kIGRpcmVjdG9yaWVzIHdoaWNoIGNvbnRhaW4g\nZmlsZXMgdGhhdCBoYXZlIGJlZW4gYWx0ZXJlZCBvciBhZGRlZC4gQWxzbwoj\nIFNraXAgL3N0YXRpYyBkaXJlY3Rvcmllcy4KQ0hBTkdFRF9ESVJTPSQoZ2l0\nIGRpZmYgb3JpZ2luL21haW4gLS1kaXJzdGF0PWZpbGVzIC0tZGlmZi1maWx0\nZXIgZCB8IHNlZCAicy9bMC05LiBdLiolLy9nIiB8IGdyZXAgLXYgInN0YXRp\nYyIpCk9VVD1vdXQKClBSX1VSTD0iJEdJVEhVQl9TRVJWRVJfVVJMLyRHSVRI\nVUJfUkVQT1NJVE9SWS9wdWxsLyRQUl9OVU1CRVIiCmVjaG8gIlBSIHVybDog\nJFBSX1VSTCIKCmZvciBkaXIgaW4gJENIQU5HRURfRElSUwpkbwogICAgZm9u\ndF9jb3VudD0kKGxzIC0xICRkaXIqLnR0ZiAyPi9kZXYvbnVsbCB8IHdjIC1s\nKQogICAgaXNfZGVzaWduZXJfZGlyPSQoZWNobyAkZGlyIHwgZ3JlcCAiZGVz\naWduZXJzIikKICAgIGlmIFsgJGZvbnRfY291bnQgIT0gMCBdCiAgICB0aGVu\nCgllY2hvICJDaGVja2luZyAkZGlyIgoJbWtkaXIgLXAgJE9VVAoJIyBJZiBw\nciBjb250YWlucyBtb2RpZmllZCBmb250cywgY2hlY2sgd2l0aCBGb250YmFr\nZXJ5LCBEaWZmZW5hdG9yIGFuZCBEaWZmQnJvd3NlcnMuCgkjIElmIHByIGRv\nZXNuJ3QgY29udGFpbiBtb2RpZmllZCBmb250cywganVzdCBjaGVjayB3aXRo\nIEZvbnRiYWtlcnkuCgltb2RpZmllZF9mb250cz0kKGdpdCBkaWZmIC0tbmFt\nZS1vbmx5IG9yaWdpbi9tYWluIEhFQUQgJGRpcioudHRmKQoJaWYgWyAtbiAi\nJG1vZGlmaWVkX2ZvbnRzIiBdCgl0aGVuCgkgICAgZWNobyAiRm9udHMgaGF2\nZSBiZWVuIG1vZGlmaWVkLiBDaGVja2luZyBmb250cyB3aXRoIGFsbCB0b29s\ncyIKCSAgICBnZnRvb2xzIHFhIC1mICRkaXIqLnR0ZiAtZ2ZiIC1hIC1vICRP\nVVQvJChiYXNlbmFtZSAkZGlyKV9xYSAtLW91dC11cmwgJFBSX1VSTAoJZWxz\nZQoJICAgIGVjaG8gIkZvbnRzIGhhdmUgbm90IGJlZW4gbW9kaWZpZWQuIENo\nZWNraW5nIGZvbnRzIHdpdGggRm9udGJha2VyeSBvbmx5IgoJICAgIGdmdG9v\nbHMgcWEgLWYgJGRpcioudHRmIC0tZm9udGJha2VyeSAtbyAkT1VULyQoYmFz\nZW5hbWUgJGRpcilfcWEgLS1vdXQtdXJsICRQUl9VUkwKCWZpCiAgICBlbGlm\nIFsgISAteiAkaXNfZGVzaWduZXJfZGlyIF0KICAgIHRoZW4KICAgICAgICBl\nY2hvICJDaGVja2luZyBkZXNpZ25lciBwcm9maWxlIgogICAgICAgIHB5dGVz\ndCAuY2kvdGVzdF9wcm9maWxlcy5weSAkZGlyCiAgICBlbHNlCgllY2hvICJT\na2lwcGluZyAkZGlyLiBEaXJlY3RvcnkgZG9lcyBub3QgY29udGFpbiBmb250\ncyIKICAgIGZpCmRvbmUKCg==\n') 56 | save_json('res://addons/google_fonts/fonts.json', files) 57 | print('fonts updated') 58 | return files 59 | 60 | 61 | func populate_branch(tree, root, pointer:Dictionary): 62 | for p in pointer.keys(): 63 | var branch = tree.create_item(root) 64 | branch.set_text(0, p) 65 | if typeof(pointer[p]) == TYPE_DICTIONARY: 66 | populate_branch(tree, branch, pointer[p]) 67 | else: 68 | branch.set_meta('url', pointer[p]) 69 | 70 | func populate_tree(): 71 | tree.clear() 72 | var root = tree.create_item() 73 | populate_branch(tree, root, fonts) 74 | 75 | 76 | func _ready(): 77 | var f = File.new() 78 | if f.file_exists('res://addons/google_fonts/fonts.json'): 79 | fonts = load_json("res://addons/google_fonts/fonts.json") 80 | else: 81 | fonts = update_font_file() 82 | populate_tree() 83 | saveb.hide() 84 | 85 | 86 | # Called every frame. 'delta' is the elapsed time since the previous frame. 87 | #func _process(delta): 88 | # pass 89 | 90 | 91 | func _on_Tree_cell_selected(): 92 | var selected = tree.get_selected() 93 | if 'ttf' in selected.get_text(0): 94 | display_type = 1 95 | font_name = selected.get_text(0) 96 | else: 97 | display_type = 0 98 | font_name = '' 99 | saveb.hide() 100 | var url = selected.get_meta('url') 101 | if url != null: 102 | http.request(url) 103 | 104 | 105 | func _on_HTTPRequest_request_completed(result, response_code, headers, body): 106 | if response_code == 200: 107 | if display_type == 0: 108 | var content = Marshalls.base64_to_utf8(JSON.parse(body.get_string_from_utf8()).result['content']) 109 | text.text = content 110 | text.set("custom_fonts/font", null) 111 | saveb.hide() 112 | else: 113 | var f = DynamicFont.new() 114 | text.set("custom_fonts/font", f) 115 | var data = Marshalls.base64_to_raw(JSON.parse(body.get_string_from_utf8()).result['content']) 116 | var dir = Directory.new() 117 | var file = File.new() 118 | if file.file_exists('res://addons/google_fonts/test.ttf'): 119 | if dir.remove('res://addons/google_fonts/test.ttf') != OK: 120 | print('unabel to delete') 121 | file.open('res://addons/google_fonts/test.ttf', file.WRITE) 122 | file.store_buffer(data) 123 | file.close() 124 | text.text = dummy 125 | f.font_data = load('res://addons/google_fonts/test.ttf') 126 | saveb.show() 127 | 128 | 129 | func _on_save_pressed(): 130 | if font_name != '': 131 | var dir = Directory.new() 132 | dir.copy('res://addons/google_fonts/test.ttf', 'res://' + font_name) 133 | emit_signal('update_filesystem') 134 | 135 | 136 | func _on_Button_pressed(): 137 | _ready() 138 | -------------------------------------------------------------------------------- /scenes/settings.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=24 format=2] 2 | 3 | [ext_resource path="res://scripts/settings.gd" type="Script" id=1] 4 | [ext_resource path="res://scenes/buton.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=3] 6 | [ext_resource path="res://scenes/visuals/app_theme.tres" type="Theme" id=4] 7 | [ext_resource path="res://visuals/fonts/Poppins-Medium.ttf" type="DynamicFontData" id=5] 8 | [ext_resource path="res://visuals/icons/add.png" type="Texture" id=6] 9 | 10 | [sub_resource type="DynamicFont" id=2] 11 | size = 30 12 | use_mipmaps = true 13 | use_filter = true 14 | font_data = ExtResource( 3 ) 15 | 16 | [sub_resource type="DynamicFont" id=3] 17 | size = 23 18 | use_mipmaps = true 19 | use_filter = true 20 | font_data = ExtResource( 3 ) 21 | 22 | [sub_resource type="DynamicFont" id=4] 23 | size = 21 24 | use_mipmaps = true 25 | use_filter = true 26 | font_data = ExtResource( 3 ) 27 | 28 | [sub_resource type="DynamicFont" id=5] 29 | size = 28 30 | use_mipmaps = true 31 | use_filter = true 32 | font_data = ExtResource( 5 ) 33 | 34 | [sub_resource type="StyleBoxFlat" id=6] 35 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 36 | border_width_left = 3 37 | border_width_top = 3 38 | border_width_right = 3 39 | border_width_bottom = 3 40 | border_color = Color( 1, 1, 1, 1 ) 41 | corner_radius_top_left = 5 42 | corner_radius_top_right = 5 43 | corner_radius_bottom_right = 5 44 | corner_radius_bottom_left = 5 45 | 46 | [sub_resource type="StyleBoxFlat" id=7] 47 | bg_color = Color( 0.0862745, 0.0862745, 0.105882, 1 ) 48 | corner_radius_top_left = 5 49 | corner_radius_top_right = 5 50 | corner_radius_bottom_right = 5 51 | corner_radius_bottom_left = 5 52 | 53 | [sub_resource type="StyleBoxEmpty" id=8] 54 | 55 | [sub_resource type="StyleBoxFlat" id=9] 56 | bg_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 57 | corner_radius_top_left = 5 58 | corner_radius_top_right = 5 59 | corner_radius_bottom_right = 5 60 | corner_radius_bottom_left = 5 61 | 62 | [sub_resource type="StyleBoxFlat" id=10] 63 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 64 | corner_radius_top_left = 5 65 | corner_radius_top_right = 5 66 | corner_radius_bottom_right = 5 67 | corner_radius_bottom_left = 5 68 | 69 | [sub_resource type="StyleBoxFlat" id=17] 70 | bg_color = Color( 0.839216, 0.34902, 0.345098, 1 ) 71 | border_width_left = 3 72 | border_width_top = 3 73 | border_width_right = 3 74 | border_width_bottom = 3 75 | border_color = Color( 1, 1, 1, 1 ) 76 | corner_radius_top_left = 5 77 | corner_radius_top_right = 5 78 | corner_radius_bottom_right = 5 79 | corner_radius_bottom_left = 5 80 | 81 | [sub_resource type="StyleBoxFlat" id=18] 82 | bg_color = Color( 0.839216, 0.34902, 0.345098, 1 ) 83 | corner_radius_top_left = 5 84 | corner_radius_top_right = 5 85 | corner_radius_bottom_right = 5 86 | corner_radius_bottom_left = 5 87 | 88 | [sub_resource type="DynamicFont" id=11] 89 | size = 28 90 | use_mipmaps = true 91 | use_filter = true 92 | font_data = ExtResource( 5 ) 93 | 94 | [sub_resource type="StyleBoxFlat" id=12] 95 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 96 | border_width_left = 3 97 | border_width_top = 3 98 | border_width_right = 3 99 | border_width_bottom = 3 100 | border_color = Color( 1, 1, 1, 1 ) 101 | corner_radius_top_left = 5 102 | corner_radius_top_right = 5 103 | corner_radius_bottom_right = 5 104 | corner_radius_bottom_left = 5 105 | 106 | [sub_resource type="StyleBoxFlat" id=13] 107 | bg_color = Color( 0.235294, 0.564706, 0.505882, 1 ) 108 | corner_radius_top_left = 5 109 | corner_radius_top_right = 5 110 | corner_radius_bottom_right = 5 111 | corner_radius_bottom_left = 5 112 | 113 | [sub_resource type="StyleBoxEmpty" id=14] 114 | 115 | [sub_resource type="StyleBoxFlat" id=15] 116 | bg_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 117 | corner_radius_top_left = 5 118 | corner_radius_top_right = 5 119 | corner_radius_bottom_right = 5 120 | corner_radius_bottom_left = 5 121 | 122 | [sub_resource type="StyleBoxFlat" id=16] 123 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 124 | corner_radius_top_left = 5 125 | corner_radius_top_right = 5 126 | corner_radius_bottom_right = 5 127 | corner_radius_bottom_left = 5 128 | 129 | [node name="Settings" type="ScrollContainer"] 130 | anchor_right = 1.0 131 | anchor_bottom = 1.0 132 | margin_right = -6.0 133 | size_flags_horizontal = 3 134 | size_flags_vertical = 3 135 | theme = ExtResource( 4 ) 136 | script = ExtResource( 1 ) 137 | 138 | [node name="ContentMargin" type="MarginContainer" parent="."] 139 | margin_right = 1274.0 140 | margin_bottom = 720.0 141 | size_flags_horizontal = 3 142 | size_flags_vertical = 3 143 | custom_constants/margin_right = 20 144 | custom_constants/margin_top = 10 145 | custom_constants/margin_left = 20 146 | custom_constants/margin_bottom = 15 147 | 148 | [node name="VBoxContainer" type="VBoxContainer" parent="ContentMargin"] 149 | margin_left = 20.0 150 | margin_top = 10.0 151 | margin_right = 1254.0 152 | margin_bottom = 705.0 153 | size_flags_horizontal = 3 154 | size_flags_vertical = 3 155 | custom_constants/separation = 35 156 | 157 | [node name="General" type="VBoxContainer" parent="ContentMargin/VBoxContainer"] 158 | margin_right = 1234.0 159 | margin_bottom = 236.0 160 | custom_constants/separation = 10 161 | 162 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/General"] 163 | margin_right = 1234.0 164 | margin_bottom = 60.0 165 | rect_min_size = Vector2( 0, 60 ) 166 | size_flags_horizontal = 3 167 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 168 | custom_fonts/font = SubResource( 2 ) 169 | text = "General" 170 | 171 | [node name="HSeparator" type="HSeparator" parent="ContentMargin/VBoxContainer/General/Label"] 172 | margin_top = 38.0 173 | margin_right = 1228.0 174 | margin_bottom = 62.0 175 | size_flags_horizontal = 3 176 | 177 | [node name="HBoxContainer2" type="HBoxContainer" parent="ContentMargin/VBoxContainer/General"] 178 | margin_top = 70.0 179 | margin_right = 1234.0 180 | margin_bottom = 104.0 181 | custom_constants/separation = 10 182 | 183 | [node name="Startup" type="CheckBox" parent="ContentMargin/VBoxContainer/General/HBoxContainer2"] 184 | margin_right = 24.0 185 | margin_bottom = 34.0 186 | theme = ExtResource( 4 ) 187 | pressed = true 188 | 189 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/General/HBoxContainer2"] 190 | margin_left = 34.0 191 | margin_right = 1234.0 192 | margin_bottom = 34.0 193 | size_flags_horizontal = 3 194 | size_flags_vertical = 6 195 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 196 | custom_fonts/font = SubResource( 3 ) 197 | text = "Launch at startup" 198 | valign = 1 199 | 200 | [node name="HBoxContainer3" type="HBoxContainer" parent="ContentMargin/VBoxContainer/General"] 201 | margin_top = 114.0 202 | margin_right = 1234.0 203 | margin_bottom = 148.0 204 | custom_constants/separation = 10 205 | 206 | [node name="AutoUpdate" type="CheckBox" parent="ContentMargin/VBoxContainer/General/HBoxContainer3"] 207 | margin_right = 24.0 208 | margin_bottom = 34.0 209 | theme = ExtResource( 4 ) 210 | pressed = true 211 | 212 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/General/HBoxContainer3"] 213 | margin_left = 34.0 214 | margin_right = 1234.0 215 | margin_bottom = 34.0 216 | size_flags_horizontal = 3 217 | size_flags_vertical = 6 218 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 219 | custom_fonts/font = SubResource( 3 ) 220 | text = "Automatically check for updates" 221 | valign = 1 222 | 223 | [node name="HBoxContainer4" type="HBoxContainer" parent="ContentMargin/VBoxContainer/General"] 224 | margin_top = 158.0 225 | margin_right = 1234.0 226 | margin_bottom = 192.0 227 | custom_constants/separation = 10 228 | 229 | [node name="DesktopShortcut" type="CheckBox" parent="ContentMargin/VBoxContainer/General/HBoxContainer4"] 230 | margin_right = 24.0 231 | margin_bottom = 34.0 232 | theme = ExtResource( 4 ) 233 | pressed = true 234 | 235 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/General/HBoxContainer4"] 236 | margin_left = 34.0 237 | margin_right = 1234.0 238 | margin_bottom = 34.0 239 | size_flags_horizontal = 3 240 | size_flags_vertical = 6 241 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 242 | custom_fonts/font = SubResource( 3 ) 243 | text = "Add shortcut to desktop" 244 | valign = 1 245 | 246 | [node name="HBoxContainer5" type="HBoxContainer" parent="ContentMargin/VBoxContainer/General"] 247 | margin_top = 202.0 248 | margin_right = 1234.0 249 | margin_bottom = 236.0 250 | custom_constants/separation = 10 251 | 252 | [node name="AutoDeleteInstall" type="CheckBox" parent="ContentMargin/VBoxContainer/General/HBoxContainer5"] 253 | margin_right = 24.0 254 | margin_bottom = 34.0 255 | theme = ExtResource( 4 ) 256 | pressed = true 257 | 258 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/General/HBoxContainer5"] 259 | margin_left = 34.0 260 | margin_right = 1234.0 261 | margin_bottom = 34.0 262 | size_flags_horizontal = 3 263 | size_flags_vertical = 6 264 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 265 | custom_fonts/font = SubResource( 3 ) 266 | text = "Auto delete install file after installation" 267 | valign = 1 268 | 269 | [node name="GodotInstalls" type="VBoxContainer" parent="ContentMargin/VBoxContainer"] 270 | margin_top = 271.0 271 | margin_right = 1234.0 272 | margin_bottom = 502.0 273 | custom_constants/separation = 10 274 | 275 | [node name="Label" type="Label" parent="ContentMargin/VBoxContainer/GodotInstalls"] 276 | margin_right = 1234.0 277 | margin_bottom = 60.0 278 | rect_min_size = Vector2( 0, 60 ) 279 | size_flags_horizontal = 3 280 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 281 | custom_fonts/font = SubResource( 2 ) 282 | text = "Godot installation fodler(s)" 283 | 284 | [node name="HSeparator" type="HSeparator" parent="ContentMargin/VBoxContainer/GodotInstalls/Label"] 285 | margin_top = 38.0 286 | margin_right = 1228.0 287 | margin_bottom = 62.0 288 | size_flags_horizontal = 3 289 | 290 | [node name="Label2" type="Label" parent="ContentMargin/VBoxContainer/GodotInstalls"] 291 | margin_top = 70.0 292 | margin_right = 1234.0 293 | margin_bottom = 101.0 294 | size_flags_horizontal = 3 295 | size_flags_vertical = 6 296 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 297 | custom_fonts/font = SubResource( 4 ) 298 | text = "The folder will be scanned to find Godot executables" 299 | valign = 1 300 | autowrap = true 301 | 302 | [node name="HBoxContainer" type="HBoxContainer" parent="ContentMargin/VBoxContainer/GodotInstalls"] 303 | margin_top = 111.0 304 | margin_right = 1234.0 305 | margin_bottom = 176.0 306 | custom_constants/separation = 30 307 | 308 | [node name="DirPath" type="LineEdit" parent="ContentMargin/VBoxContainer/GodotInstalls/HBoxContainer"] 309 | margin_right = 1004.0 310 | margin_bottom = 65.0 311 | size_flags_horizontal = 3 312 | size_flags_vertical = 3 313 | theme = ExtResource( 4 ) 314 | 315 | [node name="BrowseBtn" parent="ContentMargin/VBoxContainer/GodotInstalls/HBoxContainer" instance=ExtResource( 2 )] 316 | margin_left = 1034.0 317 | margin_right = 1234.0 318 | custom_colors/font_color_disabled = Color( 0.427451, 0.427451, 0.447059, 1 ) 319 | custom_colors/font_color_focus = Color( 0.8, 0.8, 0.807843, 1 ) 320 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 321 | custom_colors/font_color_hover = Color( 0.8, 0.8, 0.807843, 1 ) 322 | custom_colors/font_color_pressed = Color( 0.8, 0.8, 0.807843, 1 ) 323 | custom_fonts/font = SubResource( 5 ) 324 | custom_styles/hover = SubResource( 6 ) 325 | custom_styles/pressed = SubResource( 7 ) 326 | custom_styles/focus = SubResource( 8 ) 327 | custom_styles/disabled = SubResource( 9 ) 328 | custom_styles/normal = SubResource( 10 ) 329 | text = "Browse" 330 | 331 | [node name="HBoxContainer2" type="HBoxContainer" parent="ContentMargin/VBoxContainer/GodotInstalls"] 332 | margin_top = 186.0 333 | margin_right = 1234.0 334 | margin_bottom = 231.0 335 | custom_constants/separation = 30 336 | alignment = 1 337 | 338 | [node name="TextureButton" type="TextureButton" parent="ContentMargin/VBoxContainer/GodotInstalls/HBoxContainer2"] 339 | margin_left = 594.0 340 | margin_right = 639.0 341 | margin_bottom = 45.0 342 | rect_min_size = Vector2( 45, 45 ) 343 | texture_normal = ExtResource( 6 ) 344 | expand = true 345 | stretch_mode = 5 346 | 347 | [node name="VSeparator" type="VSeparator" parent="ContentMargin/VBoxContainer"] 348 | modulate = Color( 1, 1, 1, 0 ) 349 | margin_top = 537.0 350 | margin_right = 1234.0 351 | margin_bottom = 595.0 352 | size_flags_vertical = 3 353 | 354 | [node name="HBoxContainer" type="HBoxContainer" parent="ContentMargin/VBoxContainer"] 355 | margin_top = 630.0 356 | margin_right = 1234.0 357 | margin_bottom = 695.0 358 | alignment = 1 359 | 360 | [node name="CancelBtn" parent="ContentMargin/VBoxContainer/HBoxContainer" instance=ExtResource( 2 )] 361 | custom_colors/font_color_disabled = Color( 0.427451, 0.427451, 0.447059, 1 ) 362 | custom_colors/font_color_focus = Color( 1, 1, 1, 1 ) 363 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 364 | custom_colors/font_color_hover = Color( 1, 1, 1, 1 ) 365 | custom_colors/font_color_pressed = Color( 1, 1, 1, 1 ) 366 | custom_styles/hover = SubResource( 17 ) 367 | custom_styles/normal = SubResource( 18 ) 368 | text = "DISCARD" 369 | 370 | [node name="HSeparator" type="HSeparator" parent="ContentMargin/VBoxContainer/HBoxContainer"] 371 | modulate = Color( 1, 1, 1, 0 ) 372 | margin_left = 204.0 373 | margin_right = 1030.0 374 | margin_bottom = 65.0 375 | size_flags_horizontal = 3 376 | 377 | [node name="FinishBtn" parent="ContentMargin/VBoxContainer/HBoxContainer" instance=ExtResource( 2 )] 378 | margin_left = 1034.0 379 | margin_right = 1234.0 380 | custom_fonts/font = SubResource( 11 ) 381 | custom_styles/hover = SubResource( 12 ) 382 | custom_styles/pressed = SubResource( 13 ) 383 | custom_styles/focus = SubResource( 14 ) 384 | custom_styles/disabled = SubResource( 15 ) 385 | custom_styles/normal = SubResource( 16 ) 386 | text = "FINISH" 387 | 388 | [connection signal="toggled" from="ContentMargin/VBoxContainer/General/HBoxContainer2/Startup" to="." method="_on_Startup_toggled"] 389 | [connection signal="toggled" from="ContentMargin/VBoxContainer/General/HBoxContainer3/AutoUpdate" to="." method="_on_AutoUpdate_toggled"] 390 | [connection signal="toggled" from="ContentMargin/VBoxContainer/General/HBoxContainer4/DesktopShortcut" to="." method="_on_DesktopShortcut_toggled"] 391 | [connection signal="toggled" from="ContentMargin/VBoxContainer/General/HBoxContainer5/AutoDeleteInstall" to="." method="_on_AutoDeleteInstall_toggled"] 392 | [connection signal="pressed" from="ContentMargin/VBoxContainer/HBoxContainer/CancelBtn" to="." method="_on_CancelBtn_pressed"] 393 | [connection signal="pressed" from="ContentMargin/VBoxContainer/HBoxContainer/FinishBtn" to="." method="_on_FinishBtn_pressed"] 394 | -------------------------------------------------------------------------------- /scenes/download_popup.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=27 format=2] 2 | 3 | [ext_resource path="res://scenes/buton.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://visuals/fonts/Poppins-Medium.ttf" type="DynamicFontData" id=2] 5 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=3] 6 | [ext_resource path="res://scenes/visuals/app_theme.tres" type="Theme" id=4] 7 | [ext_resource path="res://scripts/download_popup.gd" type="Script" id=5] 8 | [ext_resource path="res://visuals/icons/cross.png" type="Texture" id=6] 9 | 10 | [sub_resource type="Shader" id=18] 11 | code = "shader_type canvas_item; 12 | 13 | uniform float blur_amount : hint_range(-2.0, 10.0); 14 | uniform float mix_amount : hint_range(0.0, 1.0); 15 | uniform vec4 color_over : hint_color; 16 | 17 | void fragment() { 18 | vec4 blurred = textureLod(SCREEN_TEXTURE, SCREEN_UV, blur_amount); 19 | vec4 fin = mix(blurred, color_over, mix_amount); 20 | COLOR = fin; 21 | }" 22 | 23 | [sub_resource type="ShaderMaterial" id=19] 24 | shader = SubResource( 18 ) 25 | shader_param/blur_amount = 1.343 26 | shader_param/mix_amount = 0.471 27 | shader_param/color_over = Color( 0.113725, 0.105882, 0.133333, 1 ) 28 | 29 | [sub_resource type="StyleBoxFlat" id=3] 30 | bg_color = Color( 0.203922, 0.203922, 0.231373, 1 ) 31 | corner_radius_top_left = 5 32 | corner_radius_top_right = 5 33 | corner_radius_bottom_right = 5 34 | corner_radius_bottom_left = 5 35 | 36 | [sub_resource type="DynamicFont" id=5] 37 | size = 25 38 | use_mipmaps = true 39 | use_filter = true 40 | font_data = ExtResource( 2 ) 41 | 42 | [sub_resource type="StyleBoxFlat" id=4] 43 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 44 | corner_radius_top_left = 5 45 | corner_radius_top_right = 5 46 | 47 | [sub_resource type="DynamicFont" id=14] 48 | size = 23 49 | use_mipmaps = true 50 | use_filter = true 51 | font_data = ExtResource( 3 ) 52 | 53 | [sub_resource type="DynamicFont" id=8] 54 | size = 34 55 | use_mipmaps = true 56 | use_filter = true 57 | font_data = ExtResource( 3 ) 58 | 59 | [sub_resource type="DynamicFont" id=20] 60 | size = 25 61 | use_mipmaps = true 62 | use_filter = true 63 | font_data = ExtResource( 3 ) 64 | 65 | [sub_resource type="StyleBoxFlat" id=21] 66 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 67 | corner_radius_top_left = 5 68 | corner_radius_top_right = 5 69 | corner_radius_bottom_right = 5 70 | corner_radius_bottom_left = 5 71 | 72 | [sub_resource type="StyleBoxFlat" id=22] 73 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 74 | corner_radius_top_left = 5 75 | corner_radius_top_right = 5 76 | corner_radius_bottom_right = 5 77 | corner_radius_bottom_left = 5 78 | 79 | [sub_resource type="DynamicFont" id=26] 80 | size = 23 81 | use_mipmaps = true 82 | use_filter = true 83 | font_data = ExtResource( 3 ) 84 | 85 | [sub_resource type="DynamicFont" id=7] 86 | size = 28 87 | use_mipmaps = true 88 | use_filter = true 89 | font_data = ExtResource( 2 ) 90 | 91 | [sub_resource type="StyleBoxFlat" id=15] 92 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 93 | border_width_left = 3 94 | border_width_top = 3 95 | border_width_right = 3 96 | border_width_bottom = 3 97 | border_color = Color( 1, 1, 1, 1 ) 98 | corner_radius_top_left = 5 99 | corner_radius_top_right = 5 100 | corner_radius_bottom_right = 5 101 | corner_radius_bottom_left = 5 102 | 103 | [sub_resource type="StyleBoxFlat" id=16] 104 | bg_color = Color( 0.235294, 0.564706, 0.505882, 1 ) 105 | corner_radius_top_left = 5 106 | corner_radius_top_right = 5 107 | corner_radius_bottom_right = 5 108 | corner_radius_bottom_left = 5 109 | 110 | [sub_resource type="StyleBoxEmpty" id=9] 111 | 112 | [sub_resource type="StyleBoxFlat" id=13] 113 | bg_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 114 | corner_radius_top_left = 5 115 | corner_radius_top_right = 5 116 | corner_radius_bottom_right = 5 117 | corner_radius_bottom_left = 5 118 | 119 | [sub_resource type="StyleBoxFlat" id=17] 120 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 121 | corner_radius_top_left = 5 122 | corner_radius_top_right = 5 123 | corner_radius_bottom_right = 5 124 | corner_radius_bottom_left = 5 125 | 126 | [sub_resource type="StyleBoxFlat" id=23] 127 | bg_color = Color( 0.839216, 0.34902, 0.345098, 1 ) 128 | border_width_left = 3 129 | border_width_top = 3 130 | border_width_right = 3 131 | border_width_bottom = 3 132 | border_color = Color( 1, 1, 1, 1 ) 133 | corner_radius_top_left = 5 134 | corner_radius_top_right = 5 135 | corner_radius_bottom_right = 5 136 | corner_radius_bottom_left = 5 137 | 138 | [sub_resource type="StyleBoxFlat" id=24] 139 | bg_color = Color( 0.662745, 0.270588, 0.266667, 1 ) 140 | corner_radius_top_left = 5 141 | corner_radius_top_right = 5 142 | corner_radius_bottom_right = 5 143 | corner_radius_bottom_left = 5 144 | 145 | [sub_resource type="StyleBoxFlat" id=25] 146 | bg_color = Color( 0.839216, 0.34902, 0.345098, 1 ) 147 | corner_radius_top_left = 5 148 | corner_radius_top_right = 5 149 | corner_radius_bottom_right = 5 150 | corner_radius_bottom_left = 5 151 | 152 | [node name="DownloadPopup" type="Control"] 153 | anchor_right = 1.0 154 | anchor_bottom = 1.0 155 | grow_horizontal = 2 156 | grow_vertical = 2 157 | size_flags_horizontal = 3 158 | size_flags_vertical = 3 159 | theme = ExtResource( 4 ) 160 | script = ExtResource( 5 ) 161 | 162 | [node name="Blur" type="ColorRect" parent="."] 163 | material = SubResource( 19 ) 164 | anchor_right = 1.0 165 | anchor_bottom = 1.0 166 | 167 | [node name="Control" type="Control" parent="."] 168 | anchor_left = 0.5 169 | anchor_top = 0.5 170 | anchor_right = 0.5 171 | anchor_bottom = 0.5 172 | margin_left = -304.0 173 | margin_top = -203.5 174 | margin_right = 304.0 175 | margin_bottom = 203.5 176 | 177 | [node name="Background" type="Panel" parent="Control"] 178 | anchor_right = 1.0 179 | anchor_bottom = 1.0 180 | custom_styles/panel = SubResource( 3 ) 181 | 182 | [node name="VBoxContainer" type="VBoxContainer" parent="Control"] 183 | anchor_right = 1.0 184 | anchor_bottom = 1.0 185 | 186 | [node name="Label" type="Label" parent="Control/VBoxContainer"] 187 | margin_right = 608.0 188 | margin_bottom = 65.0 189 | rect_min_size = Vector2( 0, 65 ) 190 | size_flags_horizontal = 3 191 | size_flags_vertical = 1 192 | custom_fonts/font = SubResource( 5 ) 193 | text = "Download a Godot version" 194 | align = 1 195 | valign = 1 196 | 197 | [node name="Panel2" type="Panel" parent="Control/VBoxContainer/Label"] 198 | show_behind_parent = true 199 | anchor_right = 1.0 200 | anchor_bottom = 1.0 201 | custom_styles/panel = SubResource( 4 ) 202 | 203 | [node name="CloseBtn" type="TextureButton" parent="Control/VBoxContainer/Label"] 204 | anchor_left = 1.0 205 | anchor_top = 0.5 206 | anchor_right = 1.0 207 | anchor_bottom = 0.5 208 | margin_left = -71.0 209 | margin_top = -19.5 210 | margin_bottom = 20.5 211 | texture_normal = ExtResource( 6 ) 212 | expand = true 213 | stretch_mode = 5 214 | 215 | [node name="ContentMargin" type="MarginContainer" parent="Control/VBoxContainer"] 216 | margin_top = 69.0 217 | margin_right = 608.0 218 | margin_bottom = 407.0 219 | size_flags_vertical = 3 220 | custom_constants/margin_right = 20 221 | custom_constants/margin_top = 10 222 | custom_constants/margin_left = 20 223 | custom_constants/margin_bottom = 20 224 | 225 | [node name="VBoxContainer" type="VBoxContainer" parent="Control/VBoxContainer/ContentMargin"] 226 | margin_left = 20.0 227 | margin_top = 25.0 228 | margin_right = 588.0 229 | margin_bottom = 302.0 230 | size_flags_vertical = 4 231 | custom_constants/separation = 35 232 | 233 | [node name="TypeContainer" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 234 | margin_right = 568.0 235 | margin_bottom = 34.0 236 | custom_constants/separation = 20 237 | alignment = 1 238 | 239 | [node name="HBoxContainer2" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer"] 240 | margin_left = 115.0 241 | margin_right = 218.0 242 | margin_bottom = 34.0 243 | custom_constants/separation = 10 244 | 245 | [node name="Alpha" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer2"] 246 | margin_right = 24.0 247 | margin_bottom = 34.0 248 | theme = ExtResource( 4 ) 249 | pressed = true 250 | 251 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer2"] 252 | margin_left = 34.0 253 | margin_right = 103.0 254 | margin_bottom = 34.0 255 | size_flags_horizontal = 3 256 | size_flags_vertical = 6 257 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 258 | custom_fonts/font = SubResource( 14 ) 259 | text = "Alpha" 260 | valign = 1 261 | 262 | [node name="HBoxContainer3" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer"] 263 | margin_left = 238.0 264 | margin_right = 325.0 265 | margin_bottom = 34.0 266 | custom_constants/separation = 10 267 | 268 | [node name="Beta" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer3"] 269 | margin_right = 24.0 270 | margin_bottom = 34.0 271 | pressed = true 272 | 273 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer3"] 274 | margin_left = 34.0 275 | margin_right = 87.0 276 | margin_bottom = 34.0 277 | size_flags_horizontal = 3 278 | size_flags_vertical = 6 279 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 280 | custom_fonts/font = SubResource( 14 ) 281 | text = "Beta" 282 | valign = 1 283 | 284 | [node name="HBoxContainer4" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer"] 285 | margin_left = 345.0 286 | margin_right = 453.0 287 | margin_bottom = 34.0 288 | custom_constants/separation = 10 289 | 290 | [node name="Stable" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer4"] 291 | margin_right = 24.0 292 | margin_bottom = 34.0 293 | pressed = true 294 | 295 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer4"] 296 | margin_left = 34.0 297 | margin_right = 108.0 298 | margin_bottom = 34.0 299 | size_flags_horizontal = 3 300 | size_flags_vertical = 6 301 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 302 | custom_fonts/font = SubResource( 14 ) 303 | text = "Stable" 304 | valign = 1 305 | 306 | [node name="VersionContainer" type="VBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 307 | margin_top = 69.0 308 | margin_right = 568.0 309 | margin_bottom = 177.0 310 | custom_constants/separation = 10 311 | 312 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/VersionContainer"] 313 | margin_right = 568.0 314 | margin_bottom = 48.0 315 | size_flags_horizontal = 3 316 | size_flags_vertical = 6 317 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 318 | custom_fonts/font = SubResource( 8 ) 319 | text = "Choose version" 320 | align = 1 321 | valign = 1 322 | 323 | [node name="VersionBtn" type="OptionButton" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/VersionContainer"] 324 | margin_top = 58.0 325 | margin_right = 568.0 326 | margin_bottom = 108.0 327 | rect_min_size = Vector2( 0, 50 ) 328 | 329 | [node name="DownloadContainer" type="VBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 330 | visible = false 331 | margin_right = 568.0 332 | margin_bottom = 104.0 333 | custom_constants/separation = 20 334 | alignment = 1 335 | 336 | [node name="DownloadLabel" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer"] 337 | margin_right = 568.0 338 | margin_bottom = 48.0 339 | size_flags_horizontal = 3 340 | size_flags_vertical = 6 341 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 342 | custom_fonts/font = SubResource( 8 ) 343 | text = "Downloading Godot 3.4.3" 344 | align = 1 345 | valign = 1 346 | 347 | [node name="ProgressBar" type="ProgressBar" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer"] 348 | margin_top = 68.0 349 | margin_right = 568.0 350 | margin_bottom = 104.0 351 | theme = ExtResource( 4 ) 352 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 353 | custom_fonts/font = SubResource( 20 ) 354 | custom_styles/fg = SubResource( 21 ) 355 | custom_styles/bg = SubResource( 22 ) 356 | value = 50.0 357 | 358 | [node name="Speed" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/DownloadContainer"] 359 | visible = false 360 | margin_top = 124.0 361 | margin_right = 568.0 362 | margin_bottom = 158.0 363 | size_flags_horizontal = 3 364 | size_flags_vertical = 6 365 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 366 | custom_fonts/font = SubResource( 26 ) 367 | text = "34 mb/s" 368 | align = 2 369 | valign = 1 370 | 371 | [node name="HBoxContainer5" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 372 | margin_top = 212.0 373 | margin_right = 568.0 374 | margin_bottom = 277.0 375 | size_flags_horizontal = 3 376 | custom_constants/separation = 30 377 | alignment = 2 378 | 379 | [node name="DownloadBtn" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5" instance=ExtResource( 1 )] 380 | margin_left = 268.0 381 | margin_right = 568.0 382 | rect_min_size = Vector2( 300, 65 ) 383 | custom_fonts/font = SubResource( 7 ) 384 | custom_styles/hover = SubResource( 15 ) 385 | custom_styles/pressed = SubResource( 16 ) 386 | custom_styles/focus = SubResource( 9 ) 387 | custom_styles/disabled = SubResource( 13 ) 388 | custom_styles/normal = SubResource( 17 ) 389 | text = "DOWNLOAD v3.4.3" 390 | 391 | [node name="CancelBtn" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5" instance=ExtResource( 1 )] 392 | visible = false 393 | margin_left = 368.0 394 | margin_right = 568.0 395 | custom_colors/font_color_focus = Color( 1, 1, 1, 1 ) 396 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 397 | custom_colors/font_color_hover = Color( 1, 1, 1, 1 ) 398 | custom_colors/font_color_pressed = Color( 1, 1, 1, 1 ) 399 | custom_fonts/font = SubResource( 7 ) 400 | custom_styles/hover = SubResource( 23 ) 401 | custom_styles/pressed = SubResource( 24 ) 402 | custom_styles/focus = SubResource( 9 ) 403 | custom_styles/disabled = SubResource( 25 ) 404 | custom_styles/normal = SubResource( 25 ) 405 | text = "Cancel" 406 | 407 | [connection signal="pressed" from="Control/VBoxContainer/Label/CloseBtn" to="." method="_on_CloseBtn_pressed"] 408 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer2/Alpha" to="." method="_on_Alpha_toggled"] 409 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer3/Beta" to="." method="_on_Beta_toggled"] 410 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/TypeContainer/HBoxContainer4/Stable" to="." method="_on_Stable_toggled"] 411 | [connection signal="item_selected" from="Control/VBoxContainer/ContentMargin/VBoxContainer/VersionContainer/VersionBtn" to="." method="_on_VersionBtn_item_selected"] 412 | [connection signal="pressed" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5/DownloadBtn" to="." method="_on_DownloadBtn_pressed"] 413 | [connection signal="pressed" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5/CancelBtn" to="." method="_on_CancelBtn_pressed"] 414 | -------------------------------------------------------------------------------- /scenes/setup.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=26 format=2] 2 | 3 | [ext_resource path="res://scenes/buton.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://visuals/fonts/Poppins-Medium.ttf" type="DynamicFontData" id=2] 5 | [ext_resource path="res://visuals/Poppins-Regular.ttf" type="DynamicFontData" id=3] 6 | [ext_resource path="res://scenes/visuals/app_theme.tres" type="Theme" id=4] 7 | [ext_resource path="res://scripts/setup.gd" type="Script" id=5] 8 | 9 | [sub_resource type="Shader" id=18] 10 | code = "shader_type canvas_item; 11 | 12 | uniform float blur_amount : hint_range(-2.0, 10.0); 13 | uniform float mix_amount : hint_range(0.0, 1.0); 14 | uniform vec4 color_over : hint_color; 15 | 16 | void fragment() { 17 | vec4 blurred = textureLod(SCREEN_TEXTURE, SCREEN_UV, blur_amount); 18 | vec4 fin = mix(blurred, color_over, mix_amount); 19 | COLOR = fin; 20 | }" 21 | 22 | [sub_resource type="ShaderMaterial" id=19] 23 | shader = SubResource( 18 ) 24 | shader_param/blur_amount = 1.343 25 | shader_param/mix_amount = 0.471 26 | shader_param/color_over = Color( 0.113725, 0.105882, 0.133333, 1 ) 27 | 28 | [sub_resource type="StyleBoxFlat" id=3] 29 | bg_color = Color( 0.203922, 0.203922, 0.231373, 1 ) 30 | corner_radius_top_left = 5 31 | corner_radius_top_right = 5 32 | corner_radius_bottom_right = 5 33 | corner_radius_bottom_left = 5 34 | 35 | [sub_resource type="DynamicFont" id=5] 36 | size = 25 37 | use_mipmaps = true 38 | use_filter = true 39 | font_data = ExtResource( 2 ) 40 | 41 | [sub_resource type="StyleBoxFlat" id=4] 42 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 43 | corner_radius_top_left = 5 44 | corner_radius_top_right = 5 45 | 46 | [sub_resource type="DynamicFont" id=21] 47 | size = 32 48 | use_mipmaps = true 49 | use_filter = true 50 | font_data = ExtResource( 3 ) 51 | 52 | [sub_resource type="DynamicFont" id=22] 53 | size = 24 54 | use_mipmaps = true 55 | use_filter = true 56 | font_data = ExtResource( 3 ) 57 | 58 | [sub_resource type="DynamicFont" id=7] 59 | size = 28 60 | use_mipmaps = true 61 | use_filter = true 62 | font_data = ExtResource( 2 ) 63 | 64 | [sub_resource type="StyleBoxFlat" id=10] 65 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 66 | border_width_left = 3 67 | border_width_top = 3 68 | border_width_right = 3 69 | border_width_bottom = 3 70 | border_color = Color( 1, 1, 1, 1 ) 71 | corner_radius_top_left = 5 72 | corner_radius_top_right = 5 73 | corner_radius_bottom_right = 5 74 | corner_radius_bottom_left = 5 75 | 76 | [sub_resource type="StyleBoxFlat" id=11] 77 | bg_color = Color( 0.0862745, 0.0862745, 0.105882, 1 ) 78 | corner_radius_top_left = 5 79 | corner_radius_top_right = 5 80 | corner_radius_bottom_right = 5 81 | corner_radius_bottom_left = 5 82 | 83 | [sub_resource type="StyleBoxEmpty" id=9] 84 | 85 | [sub_resource type="StyleBoxFlat" id=13] 86 | bg_color = Color( 0.427451, 0.427451, 0.447059, 1 ) 87 | corner_radius_top_left = 5 88 | corner_radius_top_right = 5 89 | corner_radius_bottom_right = 5 90 | corner_radius_bottom_left = 5 91 | 92 | [sub_resource type="StyleBoxFlat" id=12] 93 | bg_color = Color( 0.14902, 0.14902, 0.180392, 1 ) 94 | corner_radius_top_left = 5 95 | corner_radius_top_right = 5 96 | corner_radius_bottom_right = 5 97 | corner_radius_bottom_left = 5 98 | 99 | [sub_resource type="DynamicFont" id=20] 100 | size = 21 101 | use_mipmaps = true 102 | use_filter = true 103 | font_data = ExtResource( 3 ) 104 | 105 | [sub_resource type="DynamicFont" id=14] 106 | size = 23 107 | use_mipmaps = true 108 | use_filter = true 109 | font_data = ExtResource( 3 ) 110 | 111 | [sub_resource type="DynamicFont" id=23] 112 | size = 23 113 | use_mipmaps = true 114 | use_filter = true 115 | font_data = ExtResource( 3 ) 116 | 117 | [sub_resource type="DynamicFont" id=6] 118 | size = 28 119 | use_mipmaps = true 120 | use_filter = true 121 | font_data = ExtResource( 3 ) 122 | 123 | [sub_resource type="StyleBoxFlat" id=15] 124 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 125 | border_width_left = 3 126 | border_width_top = 3 127 | border_width_right = 3 128 | border_width_bottom = 3 129 | border_color = Color( 1, 1, 1, 1 ) 130 | corner_radius_top_left = 5 131 | corner_radius_top_right = 5 132 | corner_radius_bottom_right = 5 133 | corner_radius_bottom_left = 5 134 | 135 | [sub_resource type="StyleBoxFlat" id=16] 136 | bg_color = Color( 0.235294, 0.564706, 0.505882, 1 ) 137 | corner_radius_top_left = 5 138 | corner_radius_top_right = 5 139 | corner_radius_bottom_right = 5 140 | corner_radius_bottom_left = 5 141 | 142 | [sub_resource type="StyleBoxFlat" id=17] 143 | bg_color = Color( 0.345098, 0.839216, 0.74902, 1 ) 144 | corner_radius_top_left = 5 145 | corner_radius_top_right = 5 146 | corner_radius_bottom_right = 5 147 | corner_radius_bottom_left = 5 148 | 149 | [node name="Setup" type="Control"] 150 | anchor_right = 1.0 151 | anchor_bottom = 1.0 152 | grow_horizontal = 2 153 | grow_vertical = 2 154 | size_flags_horizontal = 3 155 | size_flags_vertical = 3 156 | script = ExtResource( 5 ) 157 | 158 | [node name="Blur" type="ColorRect" parent="."] 159 | material = SubResource( 19 ) 160 | anchor_right = 1.0 161 | anchor_bottom = 1.0 162 | 163 | [node name="Control" type="Control" parent="."] 164 | anchor_left = 0.5 165 | anchor_top = 0.5 166 | anchor_right = 0.5 167 | anchor_bottom = 0.5 168 | margin_left = -568.0 169 | margin_top = -281.0 170 | margin_right = 568.0 171 | margin_bottom = 281.0 172 | 173 | [node name="Background" type="Panel" parent="Control"] 174 | anchor_right = 1.0 175 | anchor_bottom = 1.0 176 | custom_styles/panel = SubResource( 3 ) 177 | 178 | [node name="VBoxContainer" type="VBoxContainer" parent="Control"] 179 | anchor_right = 1.0 180 | anchor_bottom = 1.0 181 | 182 | [node name="Label" type="Label" parent="Control/VBoxContainer"] 183 | margin_right = 1136.0 184 | margin_bottom = 65.0 185 | rect_min_size = Vector2( 0, 65 ) 186 | size_flags_horizontal = 3 187 | size_flags_vertical = 1 188 | custom_fonts/font = SubResource( 5 ) 189 | text = "Setup" 190 | align = 1 191 | valign = 1 192 | 193 | [node name="Panel2" type="Panel" parent="Control/VBoxContainer/Label"] 194 | show_behind_parent = true 195 | anchor_right = 1.0 196 | anchor_bottom = 1.0 197 | custom_styles/panel = SubResource( 4 ) 198 | 199 | [node name="ContentMargin" type="MarginContainer" parent="Control/VBoxContainer"] 200 | margin_top = 69.0 201 | margin_right = 1136.0 202 | margin_bottom = 557.0 203 | custom_constants/margin_right = 20 204 | custom_constants/margin_top = 10 205 | custom_constants/margin_left = 20 206 | custom_constants/margin_bottom = 20 207 | 208 | [node name="VBoxContainer" type="VBoxContainer" parent="Control/VBoxContainer/ContentMargin"] 209 | margin_left = 20.0 210 | margin_top = 10.0 211 | margin_right = 1116.0 212 | margin_bottom = 468.0 213 | custom_constants/separation = 10 214 | 215 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 216 | margin_right = 1096.0 217 | margin_bottom = 46.0 218 | size_flags_horizontal = 3 219 | size_flags_vertical = 6 220 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 221 | custom_fonts/font = SubResource( 21 ) 222 | text = "Choose Godot installation folder" 223 | valign = 1 224 | 225 | [node name="Label2" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 226 | margin_top = 56.0 227 | margin_right = 1096.0 228 | margin_bottom = 91.0 229 | size_flags_horizontal = 3 230 | size_flags_vertical = 6 231 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 232 | custom_fonts/font = SubResource( 22 ) 233 | text = "The folder will be scanned to find already installed Godot executables" 234 | valign = 1 235 | autowrap = true 236 | 237 | [node name="HBoxContainer" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 238 | margin_top = 101.0 239 | margin_right = 1096.0 240 | margin_bottom = 166.0 241 | custom_constants/separation = 30 242 | 243 | [node name="DirPath" type="LineEdit" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer"] 244 | margin_right = 866.0 245 | margin_bottom = 65.0 246 | size_flags_horizontal = 3 247 | size_flags_vertical = 3 248 | theme = ExtResource( 4 ) 249 | 250 | [node name="BrowseBtn" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer" instance=ExtResource( 1 )] 251 | margin_left = 896.0 252 | margin_right = 1096.0 253 | custom_colors/font_color_disabled = Color( 0.427451, 0.427451, 0.447059, 1 ) 254 | custom_colors/font_color_focus = Color( 0.8, 0.8, 0.807843, 1 ) 255 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 256 | custom_colors/font_color_hover = Color( 0.8, 0.8, 0.807843, 1 ) 257 | custom_colors/font_color_pressed = Color( 0.8, 0.8, 0.807843, 1 ) 258 | custom_fonts/font = SubResource( 7 ) 259 | custom_styles/hover = SubResource( 10 ) 260 | custom_styles/pressed = SubResource( 11 ) 261 | custom_styles/focus = SubResource( 9 ) 262 | custom_styles/disabled = SubResource( 13 ) 263 | custom_styles/normal = SubResource( 12 ) 264 | text = "Browse" 265 | 266 | [node name="ExecutablesFound" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 267 | modulate = Color( 0.345098, 0.839216, 0.74902, 1 ) 268 | margin_top = 176.0 269 | margin_right = 1096.0 270 | margin_bottom = 207.0 271 | size_flags_horizontal = 3 272 | size_flags_vertical = 6 273 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 274 | custom_fonts/font = SubResource( 20 ) 275 | text = "3 Godot executables found" 276 | valign = 1 277 | autowrap = true 278 | 279 | [node name="HBoxContainer2" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 280 | margin_top = 217.0 281 | margin_right = 1096.0 282 | margin_bottom = 251.0 283 | custom_constants/separation = 30 284 | 285 | [node name="Startup" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer2"] 286 | margin_right = 24.0 287 | margin_bottom = 34.0 288 | theme = ExtResource( 4 ) 289 | pressed = true 290 | 291 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer2"] 292 | margin_left = 54.0 293 | margin_right = 1096.0 294 | margin_bottom = 34.0 295 | size_flags_horizontal = 3 296 | size_flags_vertical = 6 297 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 298 | custom_fonts/font = SubResource( 14 ) 299 | text = "Launch at startup" 300 | valign = 1 301 | 302 | [node name="HBoxContainer3" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 303 | margin_top = 261.0 304 | margin_right = 1096.0 305 | margin_bottom = 295.0 306 | custom_constants/separation = 30 307 | 308 | [node name="CheckUpdateAuto" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer3"] 309 | margin_right = 24.0 310 | margin_bottom = 34.0 311 | pressed = true 312 | 313 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer3"] 314 | margin_left = 54.0 315 | margin_right = 1096.0 316 | margin_bottom = 34.0 317 | size_flags_horizontal = 3 318 | size_flags_vertical = 6 319 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 320 | custom_fonts/font = SubResource( 14 ) 321 | text = "Automatically check for updates" 322 | valign = 1 323 | 324 | [node name="HBoxContainer4" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 325 | margin_top = 305.0 326 | margin_right = 1096.0 327 | margin_bottom = 339.0 328 | custom_constants/separation = 30 329 | 330 | [node name="DesktopShortcut" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer4"] 331 | margin_right = 24.0 332 | margin_bottom = 34.0 333 | pressed = true 334 | 335 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer4"] 336 | margin_left = 54.0 337 | margin_right = 1096.0 338 | margin_bottom = 34.0 339 | size_flags_horizontal = 3 340 | size_flags_vertical = 6 341 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 342 | custom_fonts/font = SubResource( 14 ) 343 | text = "Add shortcut to desktop" 344 | valign = 1 345 | 346 | [node name="HBoxContainer6" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 347 | margin_top = 349.0 348 | margin_right = 1096.0 349 | margin_bottom = 383.0 350 | custom_constants/separation = 30 351 | alignment = 1 352 | 353 | [node name="AutoDeleteInstall" type="CheckBox" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer6"] 354 | margin_right = 24.0 355 | margin_bottom = 34.0 356 | theme = ExtResource( 4 ) 357 | pressed = true 358 | 359 | [node name="Label" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer6"] 360 | margin_left = 54.0 361 | margin_right = 1096.0 362 | margin_bottom = 34.0 363 | size_flags_horizontal = 3 364 | size_flags_vertical = 6 365 | custom_colors/font_color = Color( 1, 1, 1, 1 ) 366 | custom_fonts/font = SubResource( 23 ) 367 | text = "Auto delete install file after installation" 368 | valign = 1 369 | 370 | [node name="HBoxContainer5" type="HBoxContainer" parent="Control/VBoxContainer/ContentMargin/VBoxContainer"] 371 | margin_top = 393.0 372 | margin_right = 1096.0 373 | margin_bottom = 458.0 374 | size_flags_vertical = 3 375 | custom_constants/separation = 30 376 | 377 | [node name="Label2" type="Label" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5"] 378 | margin_top = 12.0 379 | margin_right = 866.0 380 | margin_bottom = 52.0 381 | size_flags_horizontal = 3 382 | size_flags_vertical = 6 383 | custom_colors/font_color = Color( 0.8, 0.8, 0.807843, 1 ) 384 | custom_fonts/font = SubResource( 6 ) 385 | text = "You can change these settings later in the settings page" 386 | valign = 1 387 | autowrap = true 388 | 389 | [node name="FinishBtn" parent="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5" instance=ExtResource( 1 )] 390 | margin_left = 896.0 391 | margin_right = 1096.0 392 | custom_fonts/font = SubResource( 7 ) 393 | custom_styles/hover = SubResource( 15 ) 394 | custom_styles/pressed = SubResource( 16 ) 395 | custom_styles/focus = SubResource( 9 ) 396 | custom_styles/disabled = SubResource( 13 ) 397 | custom_styles/normal = SubResource( 17 ) 398 | text = "FINISH" 399 | 400 | [node name="FileDialog" type="FileDialog" parent="Control"] 401 | anchor_right = 1.0 402 | anchor_bottom = 1.0 403 | rect_min_size = Vector2( 210, 73.5 ) 404 | theme = ExtResource( 4 ) 405 | window_title = "Open a Directory" 406 | mode = 2 407 | access = 2 408 | show_hidden_files = true 409 | 410 | [connection signal="pressed" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer/BrowseBtn" to="." method="_on_BrowseBtn_pressed"] 411 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer2/Startup" to="." method="_on_Startup_toggled"] 412 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer3/CheckUpdateAuto" to="." method="_on_CheckUpdateAuto_toggled"] 413 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer4/DesktopShortcut" to="." method="_on_DesktopShortcut_toggled"] 414 | [connection signal="toggled" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer6/AutoDeleteInstall" to="." method="_on_AutoDeleteInstall_toggled"] 415 | [connection signal="pressed" from="Control/VBoxContainer/ContentMargin/VBoxContainer/HBoxContainer5/FinishBtn" to="." method="_on_FinishBtn_pressed"] 416 | [connection signal="dir_selected" from="Control/FileDialog" to="." method="_on_FileDialog_dir_selected"] 417 | --------------------------------------------------------------------------------