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