Added theme type variations for UserEntry. Added custom minimum size for User button, ensure that Text Overrun behavior is set to use ellipses when to much text is set for the button. Added Tooltip texts for Shoutout, Promote, Refresh Twitch Data, Raid and Delete from database. Added connection of ButtonMenu being pressed to toggle menu options. Added support function to update all tooltips to include the Streamer's Display name.
112 lines
3.3 KiB
GDScript
112 lines
3.3 KiB
GDScript
extends PanelContainer
|
|
class_name UserEntry
|
|
|
|
var chatter: Chatter
|
|
|
|
var tw_hidden: Tween
|
|
var is_expanded: bool = false
|
|
|
|
var is_profile_picture_loaded: bool = false
|
|
|
|
signal user_selected(chatter: Chatter)
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
update()
|
|
toggle_buttons(false)
|
|
Globals.live_streamers_updated.connect(func(): %LiveStatus.visible = chatter.twitch_id in Globals.live_streamers.keys())
|
|
await get_tree().process_frame
|
|
check_update_profile_picture()
|
|
%ScreenNotifer.rect = get_rect()
|
|
%ScreenNotifer.screen_entered.connect(check_update_profile_picture)
|
|
%User.pressed.connect(user_selected.emit.bind(chatter))
|
|
%Shoutout.pressed.connect(func(): Globals.twitcher.shoutout(chatter.user))
|
|
%Promote.pressed.connect(func(): Globals.twitcher.send_message(chatter.promo_msg))
|
|
%ButtonMenu.pressed.connect(func(): toggle_buttons(!is_expanded))
|
|
_update_tooltips()
|
|
|
|
func _update_tooltips() -> void:
|
|
for node: Control in [%Shoutout, %Promote, %Refresh, %Raid, %Delete]:
|
|
node.tooltip_text = node.tooltip_text % chatter.user.display_name
|
|
|
|
func update() -> void:
|
|
if not chatter:
|
|
push_error("No user for button!")
|
|
return
|
|
if not chatter.user:
|
|
chatter.user = await Globals.twitcher.get_user_by_id(chatter.twitch_id)
|
|
%User.text = chatter.user.display_name
|
|
%Shoutout.disabled = !chatter.is_streamer
|
|
%Promote.disabled = chatter.promo_msg == ""
|
|
%LiveStatus.visible = chatter.twitch_id in Globals.live_streamers.keys()
|
|
%Raid.disabled = not chatter.twitch_id in Globals.live_streamers.keys()
|
|
|
|
func update_profile_picture() -> void:
|
|
if not chatter.user.profile_image_url: return
|
|
%LoadingSimple.show()
|
|
%AvatarImg.texture = await Globals.twitcher.media.load_profile_image(chatter.user)
|
|
%LoadingSimple.hide()
|
|
|
|
func reload_twitch_user() -> void:
|
|
var t_user: TwitchUser = await Globals.twitcher.get_user_by_id(chatter.twitch_id)
|
|
if not t_user:
|
|
return
|
|
chatter.user = t_user
|
|
chatter.save()
|
|
update()
|
|
update_profile_picture()
|
|
|
|
func check_update_profile_picture() -> void:
|
|
if is_profile_picture_loaded: return
|
|
if not chatter: return
|
|
await get_tree().process_frame
|
|
if not %ScreenNotifer.is_on_screen(): return
|
|
is_profile_picture_loaded = true
|
|
await update_profile_picture()
|
|
if not %AvatarImg.texture: is_profile_picture_loaded = false
|
|
|
|
func toggle_buttons(vis: bool) -> void:
|
|
const ANIM_SPEED = 0.2
|
|
const MIN_SIZE = Vector2(32,32)
|
|
if tw_hidden:
|
|
tw_hidden.kill()
|
|
tw_hidden = create_tween()
|
|
tw_hidden.set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CUBIC)
|
|
|
|
var min_size: Vector2 = MIN_SIZE if vis else Vector2.ZERO
|
|
var cover_btn_alpha: float = float(!vis)
|
|
var btns_alpha: float = float(vis)
|
|
for btn: Button in %Menu.get_children():
|
|
tw_hidden.parallel().tween_property(
|
|
btn,
|
|
^"custom_minimum_size",
|
|
min_size,
|
|
ANIM_SPEED
|
|
)
|
|
tw_hidden.parallel().tween_property(
|
|
btn,
|
|
^"modulate:a",
|
|
btns_alpha,
|
|
ANIM_SPEED
|
|
)
|
|
|
|
%ButtonMenu.show()
|
|
tw_hidden.tween_property(%ButtonMenu, ^"modulate:a", cover_btn_alpha, ANIM_SPEED)
|
|
if vis:
|
|
tw_hidden.tween_property(%ButtonMenu, ^"visible", false, ANIM_SPEED)
|
|
is_expanded = true
|
|
set_process(true)
|
|
|
|
func _process(_delta: float) -> void:
|
|
if !is_expanded:
|
|
set_process(false)
|
|
return
|
|
|
|
var m_pos: Vector2 = get_global_mouse_position()
|
|
var is_inside: bool = %Toggle.get_global_rect().has_point(m_pos)
|
|
if is_inside:
|
|
return
|
|
|
|
toggle_buttons(false)
|
|
is_expanded = false
|
|
set_process(false)
|