package tc.oc.commons.bukkit.tablist; import com.google.common.collect.Iterables; import java.util.HashSet; import java.util.Set; import java.util.UUID; /** * Adds dirty tracking of {@link TabView}s. */ public abstract class DynamicTabEntry extends SimpleTabEntry { final Set<TabView> cleanViews = new HashSet<>(); final Set<TabView> dirtyViews = new HashSet<>(); public DynamicTabEntry(UUID uuid) { super(uuid); } public DynamicTabEntry() { } /** * Mark all {@link TabView}s containing this entry dirty */ public void invalidate() { if(cleanViews.isEmpty()) return; for(TabView view : cleanViews) { view.invalidateContent(this); } dirtyViews.addAll(cleanViews); cleanViews.clear(); } @Override public boolean isDirty(TabView view) { return dirtyViews.contains(view); } @Override public void markClean(TabView view) { cleanViews.add(view); dirtyViews.remove(view); } @Override public void addToView(TabView view) { dirtyViews.add(view); } @Override public void removeFromView(TabView view) { cleanViews.remove(view); dirtyViews.remove(view); } public boolean hasViews() { return !(dirtyViews.isEmpty() && cleanViews.isEmpty()); } public Iterable<TabView> getViews() { return Iterables.concat(cleanViews, dirtyViews); } /** * Re-adds this entry to all {@link TabView}s that contain it, * which has the effect of updating its skin. */ public void refresh() { for(TabView view : getViews()) view.refreshEntry(this); } /** * Updates the metadata of the fake entity for this entry for all * {@link TabView}s, which has the effect of updating the state * of the hat layer on the skin. */ public void updateFakeEntity() { for(TabView view : getViews()) view.updateFakeEntity(this); } }