extends Panel signal browser_closed() const API_BASE_URL = "http://localhost:8080" @onready var close_btn = $MarginContainer/VBoxContainer/Header/CloseButton @onready var refresh_btn = $MarginContainer/VBoxContainer/Header/RefreshButton @onready var status_label = $MarginContainer/VBoxContainer/StatusLabel @onready var decks_container = $MarginContainer/VBoxContainer/ScrollContainer/DecksContainer var http_request: HTTPRequest func _ready() -> void: close_btn.pressed.connect(_on_close_pressed) refresh_btn.pressed.connect(_on_refresh_pressed) hide() func open_browser() -> void: show() _load_online_decks() func _load_online_decks() -> void: status_label.text = "Loading decks from API..." _clear_deck_list() if http_request: http_request.queue_free() http_request = HTTPRequest.new() add_child(http_request) http_request.request_completed.connect(_on_decks_loaded) var error = http_request.request(API_BASE_URL + "/decks") if error != OK: status_label.text = "Error: Failed to connect to API server" print("HTTP request error: ", error) func _on_decks_loaded(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void: if result != HTTPRequest.RESULT_SUCCESS: status_label.text = "Error: Failed to load decks" return if response_code != 200: status_label.text = "Error: API returned code " + str(response_code) return var json_string = body.get_string_from_utf8() var json = JSON.new() var parse_error = json.parse(json_string) if parse_error != OK: status_label.text = "Error: Failed to parse response" return var decks_list = json.data if decks_list.is_empty(): status_label.text = "No decks available on server" return status_label.text = "Found %d deck(s) online" % decks_list.size() _display_decks(decks_list) func _display_decks(decks_list: Array) -> void: _clear_deck_list() for deck_data in decks_list: var deck_info = deck_data.get("deck", {}) var metadata = deck_info.get("metadata", {}) var author_info = deck_info.get("author", {}) var deck_item = PanelContainer.new() var margin = MarginContainer.new() margin.add_theme_constant_override("margin_left", 15) margin.add_theme_constant_override("margin_top", 15) margin.add_theme_constant_override("margin_right", 15) margin.add_theme_constant_override("margin_bottom", 15) deck_item.add_child(margin) var vbox = VBoxContainer.new() margin.add_child(vbox) var name_label = Label.new() name_label.text = deck_info.get("name", "Unknown Deck") name_label.add_theme_font_size_override("font_size", 20) vbox.add_child(name_label) var desc_label = Label.new() desc_label.text = deck_info.get("description", "") desc_label.add_theme_color_override("font_color", Color(0.7, 0.7, 0.7)) vbox.add_child(desc_label) var cards_count = deck_info.get("cards", []).size() var rating = metadata.get("rating", 0.0) var downloads = metadata.get("download_count", 0) var author_name = author_info.get("name", "N/A") var meta_label = Label.new() meta_label.text = "%d cards • ⭐ %.1f • %d downloads 🧑 %s" % [cards_count, rating, downloads, author_name] meta_label.add_theme_color_override("font_color", Color(0.6, 0.6, 0.6)) meta_label.add_theme_font_size_override("font_size", 14) vbox.add_child(meta_label) var download_btn = Button.new() download_btn.text = "Download Deck" download_btn.custom_minimum_size = Vector2(150, 40) download_btn.pressed.connect(_on_download_deck.bind(deck_info.get("id", ""))) vbox.add_child(download_btn) decks_container.add_child(deck_item) func _on_download_deck(deck_id: String) -> void: if deck_id == "": return status_label.text = "Downloading deck..." print("Downloading deck: " + deck_id) DataManager.download_deck_from_api(API_BASE_URL + "/decks/" + deck_id) await get_tree().create_timer(1.0).timeout status_label.text = "Deck downloaded! Check your deck list." func _clear_deck_list() -> void: for child in decks_container.get_children(): child.queue_free() func _on_refresh_pressed() -> void: _load_online_decks() func _on_close_pressed() -> void: browser_closed.emit() hide()