97 lines
2.0 KiB
Java
97 lines
2.0 KiB
Java
package speiger.src.coreengine.utils.eventbus;
|
|
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
import java.util.function.Consumer;
|
|
|
|
import speiger.src.collections.objects.lists.ObjectArrayList;
|
|
import speiger.src.collections.objects.sets.ObjectLinkedOpenHashSet;
|
|
|
|
public class Listeners
|
|
{
|
|
Set<Consumer<Event>>[] unsortedListeners = new Set[EventPriority.values().length];
|
|
Consumer<Event>[] listeners = new Consumer[0];
|
|
boolean rebuild = true;
|
|
Listeners parent;
|
|
List<Listeners> childs = null;
|
|
|
|
public Listeners()
|
|
{
|
|
for(int i = 0;i<unsortedListeners.length;i++)
|
|
{
|
|
unsortedListeners[i] = new ObjectLinkedOpenHashSet<>();
|
|
}
|
|
}
|
|
|
|
public Listeners(Listeners parent)
|
|
{
|
|
this();
|
|
this.parent = parent;
|
|
this.parent.addChild(this);
|
|
}
|
|
|
|
public void addChild(Listeners listener)
|
|
{
|
|
if(childs == null) childs = new ObjectArrayList<>();
|
|
childs.add(listener);
|
|
}
|
|
|
|
public void addListener(EventPriority priority, Consumer<Event> listener)
|
|
{
|
|
if(unsortedListeners[priority.getPriority()].add(listener))
|
|
{
|
|
markDirty();
|
|
}
|
|
}
|
|
|
|
public void removeListeners(Consumer<Event> listener)
|
|
{
|
|
for(int i = 0,m=unsortedListeners.length;i<m;i++)
|
|
{
|
|
if(unsortedListeners[i].remove(listener))
|
|
{
|
|
markDirty();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void getListeners(EventPriority entry, List<Consumer<Event>> events)
|
|
{
|
|
events.addAll(unsortedListeners[entry.getPriority()]);
|
|
if(parent != null)
|
|
{
|
|
parent.getListeners(entry, events);
|
|
}
|
|
}
|
|
|
|
public Consumer<Event>[] getListeners()
|
|
{
|
|
if(rebuild) rebuildListeners();
|
|
return listeners;
|
|
}
|
|
|
|
private void markDirty()
|
|
{
|
|
if(rebuild) return;
|
|
rebuild = true;
|
|
if(childs != null)
|
|
{
|
|
for(int i = 0,m=childs.size();i<m;i++)
|
|
{
|
|
childs.get(i).markDirty();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void rebuildListeners()
|
|
{
|
|
rebuild = false;
|
|
List<Consumer<Event>> result = new ObjectArrayList<>();
|
|
for(EventPriority entry : EventPriority.getPriorities())
|
|
{
|
|
getListeners(entry, result);
|
|
}
|
|
listeners = result.toArray(new Consumer[result.size()]);
|
|
}
|
|
}
|