initial commit

This commit is contained in:
mr0xb 2025-12-27 00:20:33 -05:00
commit 94847a50a2
42 changed files with 2063 additions and 0 deletions

View file

@ -0,0 +1,133 @@
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()