All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.mini2Dx.ui.layout.PixelLayoutDependencyTree Maven / Gradle / Ivy

package org.mini2Dx.ui.layout;

import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.ObjectMap;
import org.mini2Dx.ui.element.UiElement;
import org.mini2Dx.ui.layout.HorizontalAlignment;

public class PixelLayoutDependencyTree {
	private final Array queuedElements = new Array();
	private final ObjectMap dependsOn = new ObjectMap();
	private final ObjectMap operations = new ObjectMap();

	public void queue(final UiElement element, final UiElement dependsOnElement, final Runnable operation) {
		queuedElements.add(element);
		operations.put(element.getId(), operation);

		this.dependsOn.put(element.getId(), dependsOnElement);
	}

	public void update(float delta) {
		for(int i = queuedElements.size - 1; i >= 0; i--) {
			if(!process(queuedElements.get(i))) {
				return;
			}
		}
	}

	private boolean hasDependency(final UiElement element) {
		if(!dependsOn.containsKey(element.getId())) {
			return false;
		}
		final UiElement dependency = dependsOn.get(element.getId());
		if(dependsOn.containsKey(dependency.getId())) {
			return true;
		}
		return !dependency.isInitialised();
	}

	/**
	 * Process operations for a {@link UiElement}
	 * @param element
	 * @return True if processing can continue
	 */
	private boolean process(final UiElement element) {
		if(!element.isInitialised()) {
			return true;
		}
		if(hasDependency(element)) {
			return true;
		}
		dependsOn.remove(element.getId());
		queuedElements.removeValue(element, false);

		if(!operations.containsKey(element.getId())) {
			return true;
		}

		final Runnable runnable = operations.remove(element.getId());
		runnable.run();
		return !element.isFlexLayout();
	}

	public boolean isEmpty() {
		return queuedElements.size == 0;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy