2024-10-11 18:40:40 +02:00
|
|
|
extends Panel
|
|
|
|
|
|
|
|
signal start_game(game_path:String)
|
|
|
|
|
2024-11-16 21:40:22 +01:00
|
|
|
const GAME_PROFILE_FOLDER:String = "game_profiles"
|
|
|
|
|
2024-10-11 18:40:40 +02:00
|
|
|
@onready var game_profile_v_box_container: VBoxContainer = %GameProfileVBoxContainer
|
2024-11-16 21:40:22 +01:00
|
|
|
@onready var confirm_delete_game_profile_dialog: Popup = %ConfirmDeleteGameProfileDialog
|
2024-10-11 18:40:40 +02:00
|
|
|
|
|
|
|
const game_profile_item_scene = preload("res://ui/game_profile_item.tscn")
|
|
|
|
|
2024-10-18 12:01:15 +02:00
|
|
|
var game_profile_list:Array[GameProfileResource] = []
|
2024-11-16 21:40:22 +01:00
|
|
|
var selected_game_profile_item:GameProfileItem = null
|
2024-10-11 18:40:40 +02:00
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
func _ready() -> void:
|
|
|
|
connect("visibility_changed", _on_visibility_changed)
|
|
|
|
|
|
|
|
func update_game_profile_list() -> void:
|
|
|
|
game_profile_list = []
|
2024-11-16 21:40:22 +01:00
|
|
|
var game_profiles_folder = DirAccess.open("user://" + GAME_PROFILE_FOLDER)
|
2024-10-11 18:40:40 +02:00
|
|
|
|
|
|
|
if not game_profiles_folder:
|
2024-11-16 21:40:22 +01:00
|
|
|
push_warning("Warning: no " + GAME_PROFILE_FOLDER + " folder found!")
|
2024-10-11 18:40:40 +02:00
|
|
|
return
|
|
|
|
|
|
|
|
for profile_directory in game_profiles_folder.get_directories():
|
2024-10-18 12:01:15 +02:00
|
|
|
var game_profile:GameProfileResource = ResourceLoader.load("user://game_profiles/" + profile_directory + "/game.tres")
|
2024-10-11 18:40:40 +02:00
|
|
|
if not game_profile:
|
|
|
|
push_warning("Warning: could not open game profile " + profile_directory)
|
|
|
|
continue
|
|
|
|
|
|
|
|
game_profile.directory = profile_directory
|
|
|
|
game_profile_list.append(game_profile)
|
|
|
|
|
|
|
|
func update_game_profiles_widget() -> void:
|
|
|
|
for profile_entry in game_profile_v_box_container.get_children():
|
|
|
|
game_profile_v_box_container.remove_child(profile_entry)
|
|
|
|
profile_entry.queue_free()
|
|
|
|
|
2024-10-18 12:01:15 +02:00
|
|
|
for profile:GameProfileResource in game_profile_list:
|
2024-10-11 18:40:40 +02:00
|
|
|
var game_profile_item:GameProfileItem = game_profile_item_scene.instantiate()
|
|
|
|
game_profile_item.game_profile = profile
|
|
|
|
game_profile_v_box_container.add_child(game_profile_item)
|
|
|
|
game_profile_item.start_button.pressed.connect(_on_game_profile_start_pressed.bind(game_profile_item))
|
2024-11-16 21:40:22 +01:00
|
|
|
game_profile_item.delete_button.pressed.connect(_on_game_profile_delete_pressed.bind(game_profile_item))
|
2024-10-11 18:40:40 +02:00
|
|
|
|
|
|
|
func _on_visibility_changed() -> void:
|
|
|
|
update_game_profile_list()
|
|
|
|
update_game_profiles_widget()
|
|
|
|
|
|
|
|
func _on_game_profile_start_pressed(game_profile_item:GameProfileItem):
|
2024-11-16 21:40:22 +01:00
|
|
|
start_game.emit("user://" + GAME_PROFILE_FOLDER + "/" + game_profile_item.game_profile.directory + "/game.tres")
|
|
|
|
|
|
|
|
func _on_game_profile_delete_pressed(game_profile_item:GameProfileItem):
|
|
|
|
var game_profile_label = confirm_delete_game_profile_dialog.find_child("GameProfileNameLabel", true, false) as Label
|
|
|
|
if game_profile_label == null:
|
|
|
|
push_error("Error finding game profile label!")
|
|
|
|
return
|
|
|
|
|
|
|
|
game_profile_label.text = game_profile_item.name_label.text
|
|
|
|
selected_game_profile_item = game_profile_item
|
|
|
|
|
|
|
|
confirm_delete_game_profile_dialog.show()
|
|
|
|
|
|
|
|
func _on_cancel_delete_game_profile() -> void:
|
|
|
|
confirm_delete_game_profile_dialog.hide()
|
|
|
|
|
|
|
|
func delete_game_profile(game_profile_item:GameProfileItem) -> void:
|
|
|
|
var game_profiles_folder = DirAccess.open("user://" + GAME_PROFILE_FOLDER)
|
|
|
|
|
|
|
|
if not game_profiles_folder:
|
|
|
|
push_warning("Warning: no " + GAME_PROFILE_FOLDER + " folder found!")
|
|
|
|
return
|
|
|
|
|
|
|
|
# Cannot delete folders recursively, therefore have to cleanup files first.
|
|
|
|
var game_profile_path:String = "user://" + GAME_PROFILE_FOLDER + "/" + game_profile_item.game_profile.directory
|
|
|
|
for file in DirAccess.get_files_at(game_profile_path):
|
|
|
|
DirAccess.remove_absolute(game_profile_path + "/" + file)
|
|
|
|
|
|
|
|
game_profiles_folder.remove(game_profile_item.game_profile.directory)
|
|
|
|
|
|
|
|
update_game_profile_list()
|
|
|
|
update_game_profiles_widget()
|
|
|
|
|
|
|
|
|
|
|
|
func _on_confirm_delete_game_profile() -> void:
|
|
|
|
if selected_game_profile_item == null:
|
|
|
|
push_error("Error no game profile currently selected!")
|
|
|
|
return
|
|
|
|
|
|
|
|
delete_game_profile(selected_game_profile_item)
|
|
|
|
|
|
|
|
selected_game_profile_item = null
|
|
|
|
|
|
|
|
confirm_delete_game_profile_dialog.hide()
|