mirror of
https://github.com/thegatesbrowser/thegates.git
synced 2025-08-18 12:16:33 -04:00
loading status
This commit is contained in:
parent
f9d773e940
commit
ebd3b049e0
10 changed files with 146 additions and 45 deletions
|
@ -1,6 +1,8 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://dr1hykfog1h85"]
|
||||
[gd_scene load_steps=7 format=3 uid="uid://dr1hykfog1h85"]
|
||||
|
||||
[ext_resource type="LabelSettings" uid="uid://bo2334w4lf3ug" path="res://assets/styles/text.tres" id="1_gjtj0"]
|
||||
[ext_resource type="Script" path="res://scripts/ui/world/loading_status.gd" id="1_m3y11"]
|
||||
[ext_resource type="Resource" uid="uid://b1xvdym0qh6td" path="res://resources/gate_events.res" id="2_0ylq1"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ydgjs"]
|
||||
bg_color = Color(0.431373, 0.435294, 0.494118, 1)
|
||||
|
@ -9,6 +11,13 @@ corner_radius_top_right = 3
|
|||
corner_radius_bottom_right = 3
|
||||
corner_radius_bottom_left = 3
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fgqyr"]
|
||||
bg_color = Color(0.933333, 0.235294, 0.243137, 1)
|
||||
corner_radius_top_left = 3
|
||||
corner_radius_top_right = 3
|
||||
corner_radius_bottom_right = 3
|
||||
corner_radius_bottom_left = 3
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_t3wmh"]
|
||||
bg_color = Color(0.32549, 0.14902, 0.8, 1)
|
||||
corner_radius_top_left = 3
|
||||
|
@ -16,22 +25,36 @@ corner_radius_top_right = 3
|
|||
corner_radius_bottom_right = 3
|
||||
corner_radius_bottom_left = 3
|
||||
|
||||
[node name="GateStatus" type="Control"]
|
||||
[node name="LoadingStatus" type="Control" node_paths=PackedStringArray("progress_bar_background", "progress_bar_error", "progress_bar", "label")]
|
||||
custom_minimum_size = Vector2(0, 35)
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_right = 512.0
|
||||
offset_bottom = 35.0
|
||||
script = ExtResource("1_m3y11")
|
||||
gate_events = ExtResource("2_0ylq1")
|
||||
progress_bar_background = NodePath("ProgressBarBackground")
|
||||
progress_bar_error = NodePath("ProgressBarError")
|
||||
progress_bar = NodePath("ProgressBar")
|
||||
label = NodePath("Label")
|
||||
|
||||
[node name="ProgressBarBackground" type="Panel" parent="."]
|
||||
custom_minimum_size = Vector2(0, 6)
|
||||
layout_mode = 1
|
||||
anchors_preset = 10
|
||||
anchor_right = 1.0
|
||||
offset_bottom = 6.0
|
||||
grow_horizontal = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_ydgjs")
|
||||
|
||||
[node name="ProgressBarError" type="Panel" parent="."]
|
||||
visible = false
|
||||
custom_minimum_size = Vector2(0, 6)
|
||||
layout_mode = 1
|
||||
anchors_preset = 10
|
||||
anchor_right = 1.0
|
||||
grow_horizontal = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_fgqyr")
|
||||
|
||||
[node name="ProgressBar" type="Panel" parent="."]
|
||||
custom_minimum_size = Vector2(0, 6)
|
||||
layout_mode = 1
|
|
@ -121,12 +121,10 @@ exit = NodePath("Close")
|
|||
|
||||
[node name="Minimize" parent="VBoxContainer/Top/VBoxContainer/Tabs/WindowButtons" instance=ExtResource("6_gxcmo")]
|
||||
layout_mode = 2
|
||||
disabled = true
|
||||
icon = ExtResource("7_ab04l")
|
||||
|
||||
[node name="Maximize" parent="VBoxContainer/Top/VBoxContainer/Tabs/WindowButtons" instance=ExtResource("6_gxcmo")]
|
||||
layout_mode = 2
|
||||
disabled = true
|
||||
icon = ExtResource("8_yoyw7")
|
||||
|
||||
[node name="Close" parent="VBoxContainer/Top/VBoxContainer/Tabs/WindowButtons" instance=ExtResource("6_gxcmo")]
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
[ext_resource type="FontFile" uid="uid://b3xb1fpllhnf4" path="res://assets/fonts/Inter-Italic.otf" id="21_lpegk"]
|
||||
[ext_resource type="FontFile" uid="uid://tfj3o1e1wytn" path="res://assets/fonts/Inter-BoldItalic.otf" id="22_i5khx"]
|
||||
[ext_resource type="FontFile" uid="uid://c14w1y1r54wgi" path="res://assets/fonts/Inter-Bold.otf" id="23_t1gqo"]
|
||||
[ext_resource type="PackedScene" uid="uid://dr1hykfog1h85" path="res://scenes/components/gate_status.tscn" id="25_3436m"]
|
||||
[ext_resource type="PackedScene" uid="uid://dr1hykfog1h85" path="res://scenes/components/loading_tatus.tscn" id="25_3436m"]
|
||||
[ext_resource type="Script" path="res://scripts/ui/world/release_focus.gd" id="26_u6afs"]
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_be6ex"]
|
||||
|
@ -278,7 +278,7 @@ image = NodePath("Image/TextureRect")
|
|||
image_darken = NodePath("Image/Panel")
|
||||
title = NodePath("Title")
|
||||
description = NodePath("RichTextLabel")
|
||||
gate_status = [NodePath("Space2"), NodePath("GateStatus")]
|
||||
gate_status = [NodePath("Space2"), NodePath("LoadingStatus")]
|
||||
|
||||
[node name="Image" type="Panel" parent="Foreground/GateInfo"]
|
||||
clip_children = 1
|
||||
|
@ -360,7 +360,7 @@ script = ExtResource("26_u6afs")
|
|||
custom_minimum_size = Vector2(0, 16)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="GateStatus" parent="Foreground/GateInfo" instance=ExtResource("25_3436m")]
|
||||
[node name="LoadingStatus" parent="Foreground/GateInfo" instance=ExtResource("25_3436m")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||
|
|
|
@ -1,22 +1,21 @@
|
|||
extends ConfigBase
|
||||
class_name ConfigGate
|
||||
|
||||
const SECTION = "gate"
|
||||
|
||||
var title: String
|
||||
var description: String
|
||||
var image_url: String
|
||||
var resource_pack_url: String
|
||||
var libraries: PackedStringArray
|
||||
|
||||
const section = "gate"
|
||||
const libs_section = "libraries"
|
||||
|
||||
|
||||
func _init(path: String, base_url: String) -> void:
|
||||
super._init(path)
|
||||
title = get_string(section, "title")
|
||||
description = get_string(section, "description")
|
||||
image_url = Url.join(base_url, get_string(section, "image"))
|
||||
resource_pack_url = Url.join(base_url, get_string(section, "resource_pack"))
|
||||
title = get_string(SECTION, "title")
|
||||
description = get_string(SECTION, "description")
|
||||
image_url = Url.join(base_url, get_string(SECTION, "image"))
|
||||
resource_pack_url = Url.join(base_url, get_string(SECTION, "resource_pack"))
|
||||
libraries = get_libraries(base_url)
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
extends Node
|
||||
|
||||
signal progress(url: String, body_size: int, downloaded_bytes: int)
|
||||
|
||||
class DownloadRequest:
|
||||
var save_path: String
|
||||
var http: HTTPRequest
|
||||
|
@ -11,9 +13,7 @@ class DownloadRequest:
|
|||
timer = _timer
|
||||
|
||||
const DOWNLOAD_FOLDER := "user://gates_data"
|
||||
const PROGRESS_DELAY := 0.3
|
||||
|
||||
signal progress(url: String, body_size: int, downloaded_bytes: int)
|
||||
const PROGRESS_DELAY := 0.1
|
||||
|
||||
var download_requests: Array[DownloadRequest]
|
||||
|
||||
|
@ -97,7 +97,6 @@ func create_request(url: String, save_path: String, timeout: float = 0) -> int:
|
|||
if err != OK: return err
|
||||
var code = (await http.request_completed)[1]
|
||||
|
||||
progress.emit(url, http.get_body_size(), http.get_downloaded_bytes())
|
||||
timer.stop()
|
||||
remove_child(timer)
|
||||
remove_child(http)
|
||||
|
|
|
@ -16,7 +16,11 @@ func on_minimize() -> void:
|
|||
|
||||
|
||||
func on_maximize() -> void:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_MAXIMIZED)
|
||||
var mode = DisplayServer.window_get_mode()
|
||||
if mode == DisplayServer.WINDOW_MODE_WINDOWED:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_MAXIMIZED)
|
||||
else:
|
||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
||||
|
||||
|
||||
func on_exit() -> void:
|
||||
|
|
|
@ -1,13 +1,32 @@
|
|||
extends Label
|
||||
extends Control
|
||||
|
||||
enum ProgressStatus {
|
||||
CONNECTING,
|
||||
DOWNLOADING,
|
||||
STARTING,
|
||||
ERROR
|
||||
}
|
||||
|
||||
@export var gate_events: GateEvents
|
||||
@export var progress_bar_background: Control
|
||||
@export var progress_bar_error: Control
|
||||
@export var progress_bar: Control
|
||||
@export var label: Label
|
||||
|
||||
const TWEEN_DURATION_S = 0.2
|
||||
const SPEED_DELAY_MS = 400
|
||||
|
||||
var last_bytes: int
|
||||
var last_ticks: int
|
||||
var last_speed: String
|
||||
var accum_bytes: int
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
gate_events.gate_info_loaded.connect(func(_gate, _is_cached): on_gate_info_loaded())
|
||||
gate_events.gate_entered.connect(on_gate_entered)
|
||||
gate_events.gate_error.connect(on_gate_error)
|
||||
set_text("Connecting...")
|
||||
set_progress("Connecting...", ProgressStatus.CONNECTING)
|
||||
|
||||
|
||||
func on_gate_info_loaded() -> void:
|
||||
|
@ -15,22 +34,94 @@ func on_gate_info_loaded() -> void:
|
|||
|
||||
|
||||
func show_progress(_url: String, body_size: int, downloaded_bytes: int) -> void:
|
||||
var percent = int(downloaded_bytes * 100 / body_size)
|
||||
set_text("Downloading: %d%s" % [percent, "%"])
|
||||
if body_size < 0: return
|
||||
|
||||
var downloaded = bytes_to_string(downloaded_bytes)
|
||||
var body = bytes_to_string(body_size)
|
||||
var speed = get_speed(downloaded_bytes)
|
||||
|
||||
var text = "Downloading resources — %s of %s (%s/sec)" % [downloaded, body, speed]
|
||||
var progress = float(downloaded_bytes) / body_size
|
||||
set_progress(text, ProgressStatus.DOWNLOADING, progress)
|
||||
|
||||
|
||||
func get_speed(bytes: int) -> String:
|
||||
var delta_bytes = bytes - last_bytes
|
||||
var delta_ticks = Time.get_ticks_msec() - last_ticks
|
||||
|
||||
if delta_ticks < SPEED_DELAY_MS and not last_speed.is_empty(): return last_speed
|
||||
|
||||
last_bytes = bytes
|
||||
last_ticks = Time.get_ticks_msec()
|
||||
|
||||
if delta_bytes == 0 or delta_ticks == 0:
|
||||
return bytes_to_string(0)
|
||||
|
||||
var speed = int(delta_bytes / (delta_ticks / 1000.0))
|
||||
last_speed = bytes_to_string(speed)
|
||||
return last_speed
|
||||
|
||||
|
||||
func bytes_to_string(bytes: int) -> String:
|
||||
if bytes < 1024: return str(bytes) + "B"
|
||||
|
||||
var kb = bytes / 1024
|
||||
if kb < 1024: return str(kb) + "KB"
|
||||
|
||||
var mb = kb / 1024.0
|
||||
var text = "%.1fMB" if mb < 10.0 else "%.0fMB"
|
||||
return text % [mb]
|
||||
|
||||
|
||||
func on_gate_entered() -> void:
|
||||
gate_events.download_progress.disconnect(show_progress)
|
||||
set_text("")
|
||||
set_progress("Starting the gate...", ProgressStatus.STARTING)
|
||||
|
||||
|
||||
func on_gate_error(code: GateEvents.GateError) -> void:
|
||||
match code:
|
||||
GateEvents.GateError.NOT_FOUND:
|
||||
set_text("Gate not found")
|
||||
set_progress("Gate not found", ProgressStatus.ERROR)
|
||||
GateEvents.GateError.INVALID_CONFIG:
|
||||
set_text("Invalid gate config")
|
||||
set_progress("Invalid gate config", ProgressStatus.ERROR)
|
||||
GateEvents.GateError.MISSING_PACK, GateEvents.GateError.MISSING_LIBS:
|
||||
set_text("Cannot load gate resources")
|
||||
set_progress("Cannot load gate resources", ProgressStatus.ERROR)
|
||||
_:
|
||||
set_text("Error")
|
||||
set_progress("Unknown error", ProgressStatus.ERROR)
|
||||
|
||||
|
||||
func set_progress(text: String, status: ProgressStatus, progress: float = 0.0) -> void:
|
||||
label.text = text
|
||||
|
||||
match status:
|
||||
ProgressStatus.CONNECTING:
|
||||
progress_bar.show()
|
||||
progress_bar_error.hide()
|
||||
move_progress_bar(0.0)
|
||||
|
||||
ProgressStatus.DOWNLOADING:
|
||||
progress_bar.show()
|
||||
progress_bar_error.hide()
|
||||
move_progress_bar(progress)
|
||||
|
||||
ProgressStatus.STARTING:
|
||||
progress_bar.show()
|
||||
progress_bar_error.hide()
|
||||
move_progress_bar(1.0, true)
|
||||
|
||||
ProgressStatus.ERROR:
|
||||
progress_bar.hide()
|
||||
progress_bar_error.show()
|
||||
|
||||
_:
|
||||
progress_bar.hide()
|
||||
progress_bar_error.hide()
|
||||
|
||||
|
||||
func move_progress_bar(progress: float, custom_delay: bool = false) -> void:
|
||||
var full_size = progress_bar_background.size
|
||||
var current_size = Vector2(lerp(0.0, full_size.x, progress), full_size.y)
|
||||
var tween_duration = TWEEN_DURATION_S if custom_delay else FileDownloader.PROGRESS_DELAY
|
||||
|
||||
var tween = get_tree().create_tween()
|
||||
tween.tween_property(progress_bar, "size", current_size, tween_duration)
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
extends Control
|
||||
|
||||
@export var gate_events: GateEvents
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
gate_events.gate_entered.connect(hide_ui)
|
||||
visible = true
|
||||
|
||||
|
||||
func hide_ui() -> void:
|
||||
visible = false
|
|
@ -1,8 +1,5 @@
|
|||
extends Control
|
||||
|
||||
const SHOWN = Color(1, 1, 1, 1)
|
||||
const HIDDEN = Color(1, 1, 1, 0)
|
||||
|
||||
@export var gate_events: GateEvents
|
||||
@export var history: History
|
||||
@export var root: TextureButton
|
||||
|
@ -11,6 +8,9 @@ const HIDDEN = Color(1, 1, 1, 0)
|
|||
@export var fade_in: float = 1.0
|
||||
@export var fade_out: float = 0.2
|
||||
|
||||
const SHOWN = Color(1, 1, 1, 1)
|
||||
const HIDDEN = Color(1, 1, 1, 0)
|
||||
|
||||
var tween: Tween
|
||||
|
||||
|
||||
|
|
|
@ -143,7 +143,6 @@ void fragment() {
|
|||
|
||||
}
|
||||
"
|
||||
graph_offset = Vector2(-708.833, 8.55267)
|
||||
mode = 1
|
||||
modes/blend = 5
|
||||
flags/light_only = false
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue