/* * Copyright 2014 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.rendering.nui.layers.hud; import com.google.common.collect.Maps; import org.terasology.assets.ResourceUrn; import org.terasology.assets.management.AssetManager; import org.terasology.math.geom.Rect2f; import org.terasology.math.geom.Rect2i; import org.terasology.math.TeraMath; import org.terasology.math.geom.Vector2i; import org.terasology.registry.In; import org.terasology.registry.InjectionHelper; import org.terasology.rendering.nui.Canvas; import org.terasology.rendering.nui.ControlWidget; import org.terasology.rendering.nui.CoreScreenLayer; import org.terasology.rendering.nui.NUIManager; import org.terasology.rendering.nui.UIWidget; import org.terasology.rendering.nui.asset.UIElement; import java.util.Iterator; import java.util.Map; import java.util.Optional; /** */ public class HUDScreenLayer extends CoreScreenLayer { private Map<ResourceUrn, HUDElement> elementsLookup = Maps.newLinkedHashMap(); @In private AssetManager assetManager; private NUIManager manager; public ControlWidget addHUDElement(String uri) { return addHUDElement(uri, ControlWidget.class, Rect2f.createFromMinAndSize(0, 0, 1, 1)); } public <T extends ControlWidget> T addHUDElement(String urn, Class<T> type, Rect2f region) { Optional<? extends UIElement> data = assetManager.getAsset(urn, UIElement.class); if (data.isPresent() && type.isInstance(data.get().getRootWidget())) { return addHUDElement(data.get().getUrn(), type.cast(data.get().getRootWidget()), region); } return null; } public <T extends ControlWidget> T addHUDElement(ResourceUrn urn, Class<T> type, Rect2f region) { Optional<? extends UIElement> data = assetManager.getAsset(urn, UIElement.class); if (data.isPresent() && type.isInstance(data.get().getRootWidget())) { return addHUDElement(urn, type.cast(data.get().getRootWidget()), region); } return null; } public <T extends ControlWidget> T addHUDElement(ResourceUrn urn, T widget, Rect2f region) { InjectionHelper.inject(widget); widget.onOpened(); elementsLookup.put(urn, new HUDElement(widget, region)); return widget; } public ControlWidget getHUDElement(String urn) { return getHUDElement(new ResourceUrn(urn)); } public ControlWidget getHUDElement(ResourceUrn urn) { HUDElement element = elementsLookup.get(urn); if (element != null) { return element.widget; } return null; } public <T extends ControlWidget> T getHUDElement(String uri, Class<T> type) { return getHUDElement(new ResourceUrn(uri), type); } public <T extends ControlWidget> T getHUDElement(ResourceUrn urn, Class<T> type) { ControlWidget widget = getHUDElement(urn); if (widget != null && type.isInstance(widget)) { return type.cast(widget); } return null; } public boolean removeHUDElement(ResourceUrn uri) { HUDElement removed = elementsLookup.remove(uri); if (removed != null) { removed.widget.onClosed(); return true; } return false; } public boolean removeHUDElement(ControlWidget element) { Iterator<Map.Entry<ResourceUrn, HUDElement>> iterator = elementsLookup.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<ResourceUrn, HUDElement> item = iterator.next(); if (item.getValue().widget.equals(element)) { iterator.remove(); item.getValue().widget.onClosed(); return true; } } return false; } public void clear() { for (HUDElement value : elementsLookup.values()) { value.widget.onClosed(); } elementsLookup.clear(); } @Override public boolean isLowerLayerVisible() { return false; } @Override public boolean isReleasingMouse() { return false; } @Override protected boolean isEscapeToCloseAllowed() { return false; } @Override public NUIManager getManager() { return manager; } @Override public void setManager(NUIManager manager) { this.manager = manager; } @Override public void onDraw(Canvas canvas) { for (HUDElement element : elementsLookup.values()) { int minX = TeraMath.floorToInt(element.region.minX() * canvas.size().x); int minY = TeraMath.floorToInt(element.region.minY() * canvas.size().y); int sizeX = TeraMath.floorToInt(element.region.width() * canvas.size().x); int sizeY = TeraMath.floorToInt(element.region.height() * canvas.size().y); Rect2i region = Rect2i.createFromMinAndSize(minX, minY, sizeX, sizeY); canvas.drawWidget(element.widget, region); } } @Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return sizeHint; } @Override public Iterator<UIWidget> iterator() { return new Iterator<UIWidget>() { private Iterator<HUDElement> elementIterator = elementsLookup.values().iterator(); @Override public boolean hasNext() { return elementIterator.hasNext(); } @Override public UIWidget next() { return elementIterator.next().widget; } @Override public void remove() { throw new UnsupportedOperationException(); } }; } @Override public void onOpened() { } @Override public void initialise() { } @Override public boolean isModal() { return false; } private static final class HUDElement { ControlWidget widget; Rect2f region; private HUDElement(ControlWidget widget, Rect2f region) { this.widget = widget; this.region = region; } } }