StreamOverlay/UI/Controls/user_list.gd

74 lines
2.2 KiB
GDScript3
Raw Normal View History

extends PanelContainer
signal user_selected(chatter: Chatter)
const USER_ENTRY = preload("res://UI/Controls/user_entry.tscn")
var entries_list: Array[UserEntry] = []
var filtering_live: bool = false:
set(value):
filtering_live = value
if value:
filter_list()
else:
reset_filter()
var _filter_name: String = ""
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
%Filter.text_changed.connect(_update_filter_name)
%FilterLive.pressed.connect(func(): filtering_live = !filtering_live)
%Refresh.pressed.connect(func():
clear_list()
populate_list()
Globals.refresh_live_streamer()
filter_list()
)
Globals.live_streamers_updated.connect(filter_list)
func _update_filter_name(txt: String) -> void:
_filter_name = txt.to_lower()
filter_list()
func clear_list() -> void:
for node in %UserList.get_children():
node.queue_free()
func update_list() -> void:
for chatter: Chatter in Globals.context.chatters.all():
if entries_list.any(func(x: UserEntry): return x.chatter.id == chatter.id):
continue
var inst := USER_ENTRY.instantiate()
inst.chatter = chatter
entries_list.append(inst)
inst.tree_exiting.connect(entries_list.erase.bind(inst))
inst.user_selected.connect(user_selected.emit)
%UserList.add_child(inst)
entries_list.sort_custom(func(x: UserEntry, y: UserEntry): return x.chatter.id < y.chatter.id)
var i = 0
for entry: UserEntry in entries_list:
%UserList.move_child(entry,i)
i += 1
func populate_list() -> void:
for chatter: Chatter in Globals.context.chatters.all():
var inst := USER_ENTRY.instantiate()
inst.chatter = chatter
entries_list.append(inst)
inst.tree_exiting.connect(entries_list.erase.bind(inst))
inst.user_selected.connect(user_selected.emit)
%UserList.add_child(inst)
func reset_filter() -> void:
for entry: UserEntry in %UserList.get_children():
entry.visible = true
func filter_list() -> void:
reset_filter()
for entry: UserEntry in %UserList.get_children():
if filtering_live:
entry.visible = entry.chatter.twitch_id in Globals.live_streamers.keys()
if _filter_name != "" and entry.visible:
entry.visible = entry.chatter.user.display_name.to_lower().contains(_filter_name)