mirror of
https://github.com/mr0xb/godot-flashcards.git
synced 2026-08-27 20:44:56 -04:00
133 lines
4.1 KiB
GDScript
133 lines
4.1 KiB
GDScript
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()
|