42 lines
1.3 KiB
GDScript
42 lines
1.3 KiB
GDScript
extends Node
|
|
|
|
signal changed
|
|
|
|
var _layers : Dictionary = {} #source (objet ou StringName) -> Array[Hint]
|
|
|
|
func show_hints(source : Variant, list : Array) -> void:
|
|
var clean : Array = list.filter(func(h) -> bool: return h != null) #un Hint non assigne est ignore
|
|
if clean.is_empty():
|
|
clear_hints(source)
|
|
return
|
|
if _layers.get(source) == clean: return
|
|
_layers[source] = clean
|
|
changed.emit()
|
|
|
|
func clear_hints(source : Variant) -> void:
|
|
if _layers.erase(source): changed.emit()
|
|
|
|
func get_visible() -> Array[Hint]:
|
|
#aplatit toutes les sources, en gardant l'ordre d'arrivee pour departager les priorites egales
|
|
var entries : Array = [] #[hint, ordre]
|
|
for source in _layers.keys():
|
|
if typeof(source) == TYPE_OBJECT and !is_instance_valid(source):
|
|
_layers.erase(source) #source detruite sans avoir appele clear_hints
|
|
continue
|
|
for h in _layers[source]:
|
|
entries.append([h, entries.size()])
|
|
|
|
entries.sort_custom(func(a : Array, b : Array) -> bool:
|
|
if a[0].priority != b[0].priority: return a[0].priority > b[0].priority
|
|
return a[1] < b[1])
|
|
|
|
#une action = un seul hint (le plus prioritaire)
|
|
var result : Array[Hint] = []
|
|
var used : Dictionary = {}
|
|
for e in entries:
|
|
var h : Hint = e[0]
|
|
if used.has(h.action): continue
|
|
used[h.action] = true
|
|
result.append(h)
|
|
return result
|