generated from krampus/template-godot4
	
		
			
	
	
		
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
| 
								 | 
							
								#######################################################################
							 | 
						||
| 
								 | 
							
								# Credit goes to the Dialogue Manager plugin for this script
							 | 
						||
| 
								 | 
							
								# Check it out at: https://github.com/nathanhoad/godot_dialogue_manager
							 | 
						||
| 
								 | 
							
								#######################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@tool
							 | 
						||
| 
								 | 
							
								extends Control
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Constants
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const TEMP_FILE_NAME = "user://temp.zip"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Signals
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								signal failed()
							 | 
						||
| 
								 | 
							
								signal updated(updated_to_version: String)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region @onready
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#@onready var logo: TextureRect = %Logo
							 | 
						||
| 
								 | 
							
								@onready var _download_verion: Label = %DownloadVersionLabel
							 | 
						||
| 
								 | 
							
								@onready var _download_http_request: HTTPRequest = %DownloadHTTPRequest
							 | 
						||
| 
								 | 
							
								@onready var _download_button: Button = %DownloadButton
							 | 
						||
| 
								 | 
							
								@onready var _download_button_bg: NinePatchRect = %DownloadButtonBG
							 | 
						||
| 
								 | 
							
								@onready var _download_label: Label = %UpdateLabel
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@onready var _breaking_label: Label = %BreakingLabel
							 | 
						||
| 
								 | 
							
								@onready var _breaking_margin_container: MarginContainer = %BreakingMarginContainer
							 | 
						||
| 
								 | 
							
								@onready var _breaking_options_button: OptionButton = %BreakingOptionButton
							 | 
						||
| 
								 | 
							
								#@onready var current_version_label: Label = %CurrentVersionLabel
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Todo - For 4.2 upgrade - Shows current version
							 | 
						||
| 
								 | 
							
								var _download_dialogue: AcceptDialog
							 | 
						||
| 
								 | 
							
								var _button_texture_default: Texture2D = load("res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png")
							 | 
						||
| 
								 | 
							
								var _button_texture_hover: Texture2D = load("res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var next_version_release: Dictionary:
							 | 
						||
| 
								 | 
							
									set(value):
							 | 
						||
| 
								 | 
							
										next_version_release = value
							 | 
						||
| 
								 | 
							
										_download_verion.text = "%s update is available for download" % value.tag_name.substr(1)
							 | 
						||
| 
								 | 
							
										# Todo - For 4.2 upgrade
							 | 
						||
| 
								 | 
							
										#current_version_label.text = "Current version is " + editor_plugin.get_version()
							 | 
						||
| 
								 | 
							
									get:
							 | 
						||
| 
								 | 
							
										return next_version_release
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _breaking_window_height: float = 520
							 | 
						||
| 
								 | 
							
								var _breaking_window_height_update: float = 600
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Private Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _ready() -> void:
							 | 
						||
| 
								 | 
							
									_download_http_request.request_completed.connect(_on_http_request_request_completed)
							 | 
						||
| 
								 | 
							
									_download_button.pressed.connect(_on_download_button_pressed)
							 | 
						||
| 
								 | 
							
									_download_button.mouse_entered.connect(_on_mouse_entered)
							 | 
						||
| 
								 | 
							
									_download_button.mouse_exited.connect(_on_mouse_exited)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_breaking_label.hide()
							 | 
						||
| 
								 | 
							
									_breaking_margin_container.hide()
							 | 
						||
| 
								 | 
							
									_breaking_options_button.hide()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_breaking_options_button.item_selected.connect(_on_item_selected)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_item_selected(index: int) -> void:
							 | 
						||
| 
								 | 
							
									if index == 1:
							 | 
						||
| 
								 | 
							
										_download_button.show()
							 | 
						||
| 
								 | 
							
										_download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height_update)
							 | 
						||
| 
								 | 
							
									else:
							 | 
						||
| 
								 | 
							
										_download_button.hide()
							 | 
						||
| 
								 | 
							
										_download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_download_button_pressed() -> void:
							 | 
						||
| 
								 | 
							
									_download_http_request.request(next_version_release.zipball_url)
							 | 
						||
| 
								 | 
							
									_download_button.disabled = true
							 | 
						||
| 
								 | 
							
									_download_label.text = "Downloading..."
							 | 
						||
| 
								 | 
							
									_download_button_bg.hide()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_mouse_entered() -> void:
							 | 
						||
| 
								 | 
							
									_download_button_bg.set_texture(_button_texture_hover)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_mouse_exited() -> void:
							 | 
						||
| 
								 | 
							
									_download_button_bg.set_texture(_button_texture_default)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_http_request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
							 | 
						||
| 
								 | 
							
									if result != HTTPRequest.RESULT_SUCCESS:
							 | 
						||
| 
								 | 
							
										failed.emit()
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# Save the downloaded zip
							 | 
						||
| 
								 | 
							
									var zip_file: FileAccess = FileAccess.open(TEMP_FILE_NAME, FileAccess.WRITE)
							 | 
						||
| 
								 | 
							
									zip_file.store_buffer(body)
							 | 
						||
| 
								 | 
							
									zip_file.close()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									OS.move_to_trash(ProjectSettings.globalize_path("res://addons/phantom_camera"))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var zip_reader: ZIPReader = ZIPReader.new()
							 | 
						||
| 
								 | 
							
									zip_reader.open(TEMP_FILE_NAME)
							 | 
						||
| 
								 | 
							
									var files: PackedStringArray = zip_reader.get_files()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var base_path = files[1]
							 | 
						||
| 
								 | 
							
									# Remove archive folder
							 | 
						||
| 
								 | 
							
									files.remove_at(0)
							 | 
						||
| 
								 | 
							
									# Remove assets folder
							 | 
						||
| 
								 | 
							
									files.remove_at(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for path in files:
							 | 
						||
| 
								 | 
							
										var new_file_path: String = path.replace(base_path, "")
							 | 
						||
| 
								 | 
							
										if path.ends_with("/"):
							 | 
						||
| 
								 | 
							
											DirAccess.make_dir_recursive_absolute("res://addons/%s" % new_file_path)
							 | 
						||
| 
								 | 
							
										else:
							 | 
						||
| 
								 | 
							
											var file: FileAccess = FileAccess.open("res://addons/%s" % new_file_path, FileAccess.WRITE)
							 | 
						||
| 
								 | 
							
											file.store_buffer(zip_reader.read_file(path))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									zip_reader.close()
							 | 
						||
| 
								 | 
							
									DirAccess.remove_absolute(TEMP_FILE_NAME)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									updated.emit(next_version_release.tag_name.substr(1))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_notes_button_pressed() -> void:
							 | 
						||
| 
								 | 
							
									OS.shell_open(next_version_release.html_url)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Public Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func show_updater_warning(next_version_number: Array, current_version_number: Array) -> void:
							 | 
						||
| 
								 | 
							
									var current_version_number_0: int = current_version_number[0] as int
							 | 
						||
| 
								 | 
							
									var current_version_number_1: int = current_version_number[1] as int
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var next_version_number_0: int = next_version_number[0] as int # Major release number in the new release
							 | 
						||
| 
								 | 
							
									var next_version_number_1: int = next_version_number[1] as int # Minor release number in the new release
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if next_version_number_0 > current_version_number_0 or \
							 | 
						||
| 
								 | 
							
									next_version_number_1 > current_version_number_1:
							 | 
						||
| 
								 | 
							
										_breaking_label.show()
							 | 
						||
| 
								 | 
							
										_breaking_margin_container.show()
							 | 
						||
| 
								 | 
							
										_breaking_options_button.show()
							 | 
						||
| 
								 | 
							
										_download_button.hide()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										_download_dialogue = get_parent()
							 | 
						||
| 
								 | 
							
										_download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 |