mirror of
https://github.com/mr0xb/godot-flashcards.git
synced 2026-08-27 20:44:56 -04:00
initial commit
This commit is contained in:
commit
94847a50a2
42 changed files with 2063 additions and 0 deletions
133
scenes/ui/deck_manager/online_deck_browser.gd
Normal file
133
scenes/ui/deck_manager/online_deck_browser.gd
Normal 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()
|
||||
Loading…
Reference in a new issue