tab animations
This commit is contained in:
@@ -4,10 +4,11 @@ extends Control
|
||||
signal tab_pressed
|
||||
signal tab_closed
|
||||
|
||||
@onready var gradient_texture: TextureRect = $GradientTexture
|
||||
@onready var button: Button = $Button
|
||||
@onready var close_button: Button = $CloseButton
|
||||
@onready var icon: TextureRect = $Icon
|
||||
@onready var gradient_texture: TextureRect = %GradientTexture
|
||||
@onready var button: Button = %Button
|
||||
@onready var close_button: Button = %CloseButton
|
||||
@onready var icon: TextureRect = %Icon
|
||||
@onready var animation: AnimationPlayer = $AnimationPlayer
|
||||
|
||||
const TAB_GRADIENT: GradientTexture2D = preload("res://Scenes/Styles/TabGradient.tres")
|
||||
const TAB_GRADIENT_DEFAULT: GradientTexture2D = preload("res://Scenes/Styles/TabGradientDefault.tres")
|
||||
@@ -20,6 +21,7 @@ const CLOSE_BUTTON_NORMAL: StyleBoxFlat = preload("res://Scenes/Styles/CloseButt
|
||||
|
||||
var is_active := false
|
||||
var mouse_over_tab := false
|
||||
var loading_tween: Tween
|
||||
|
||||
func _ready():
|
||||
add_to_group("tabs")
|
||||
@@ -44,6 +46,32 @@ func set_icon(new_icon: Texture) -> void:
|
||||
icon.texture = new_icon
|
||||
icon.rotation = 0
|
||||
|
||||
func update_icon_from_url(icon_url: String) -> void:
|
||||
const LOADER_CIRCLE = preload("res://Assets/Icons/loader-circle.svg")
|
||||
|
||||
loading_tween = create_tween()
|
||||
|
||||
set_icon(LOADER_CIRCLE)
|
||||
|
||||
loading_tween.set_loops()
|
||||
|
||||
icon.pivot_offset = Vector2(11.5, 11.5)
|
||||
loading_tween.tween_method(func(angle):
|
||||
if !is_instance_valid(icon):
|
||||
if loading_tween: loading_tween.kill()
|
||||
return
|
||||
icon.rotation = angle
|
||||
, 0.0, TAU, 1.0)
|
||||
|
||||
var icon_resource = await Network.fetch_image(icon_url)
|
||||
|
||||
# Only update if tab still exists
|
||||
if is_instance_valid(self):
|
||||
set_icon(icon_resource)
|
||||
if loading_tween:
|
||||
loading_tween.kill()
|
||||
loading_tween = null
|
||||
|
||||
func _on_button_mouse_entered() -> void:
|
||||
mouse_over_tab = true
|
||||
if is_active: return
|
||||
@@ -55,6 +83,9 @@ func _on_button_mouse_exited() -> void:
|
||||
gradient_texture.texture = TAB_GRADIENT_DEFAULT
|
||||
|
||||
func _exit_tree():
|
||||
if loading_tween:
|
||||
loading_tween.kill()
|
||||
loading_tween = null
|
||||
remove_from_group("tabs")
|
||||
|
||||
func _on_button_pressed() -> void:
|
||||
@@ -70,4 +101,6 @@ func _on_button_pressed() -> void:
|
||||
|
||||
func _on_close_button_pressed() -> void:
|
||||
tab_closed.emit()
|
||||
animation.play("appear", -1, -1.0, true)
|
||||
await animation.animation_finished
|
||||
queue_free()
|
||||
|
||||
@@ -79,8 +79,10 @@ func create_tab() -> void:
|
||||
tabs.append(tab)
|
||||
tab.tab_pressed.connect(_tab_pressed.bind(index))
|
||||
tab.tab_closed.connect(_tab_closed.bind(index))
|
||||
h_box_container.add_child(tab)
|
||||
|
||||
h_box_container.add_child(tab)
|
||||
tab.animation.play("appear")
|
||||
|
||||
set_active_tab(index)
|
||||
|
||||
# WARNING: temporary
|
||||
|
||||
@@ -5,8 +5,6 @@ extends Control
|
||||
@onready var tab_container: TabManager = $VBoxContainer/TabContainer
|
||||
const LOADER_CIRCLE = preload("res://Assets/Icons/loader-circle.svg")
|
||||
|
||||
var loading_tween: Tween
|
||||
|
||||
const P = preload("res://Scenes/Tags/p.tscn")
|
||||
const IMG = preload("res://Scenes/Tags/img.tscn")
|
||||
const SEPARATOR = preload("res://Scenes/Tags/separator.tscn")
|
||||
@@ -122,8 +120,7 @@ line breaks
|
||||
tab.set_title(title)
|
||||
|
||||
var icon = parser.get_icon()
|
||||
set_loading_icon(tab)
|
||||
call_deferred("update_tab_icon", tab, icon)
|
||||
tab.update_icon_from_url(icon)
|
||||
|
||||
var body = parser.find_first("body")
|
||||
var i = 0
|
||||
@@ -165,25 +162,6 @@ line breaks
|
||||
|
||||
i += 1
|
||||
|
||||
func set_loading_icon(tab: Tab) -> void:
|
||||
tab.set_icon(LOADER_CIRCLE)
|
||||
|
||||
loading_tween = create_tween()
|
||||
loading_tween.set_loops()
|
||||
|
||||
var icon = tab.icon
|
||||
icon.pivot_offset = Vector2(11.5, 11.5)
|
||||
loading_tween.tween_method(func(angle): icon.rotation = angle, 0.0, TAU, 1.0)
|
||||
|
||||
func stop_loading_icon() -> void:
|
||||
if loading_tween:
|
||||
loading_tween.kill()
|
||||
loading_tween = null
|
||||
|
||||
func update_tab_icon(tab: Tab, icon: String) -> void:
|
||||
tab.set_icon(await Network.fetch_image(icon))
|
||||
stop_loading_icon()
|
||||
|
||||
func contains_hyperlink(element: HTMLParser.HTMLElement) -> bool:
|
||||
if element.tag_name == "a":
|
||||
return true
|
||||
|
||||
Reference in New Issue
Block a user