Package org.terasology.rendering.nui.layers.hud

Source Code of org.terasology.rendering.nui.layers.hud.HUDScreenLayer

/*
* 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.asset.AssetManager;
import org.terasology.asset.AssetType;
import org.terasology.asset.AssetUri;
import org.terasology.asset.Assets;
import org.terasology.math.Rect2f;
import org.terasology.math.Rect2i;
import org.terasology.math.TeraMath;
import org.terasology.math.Vector2i;
import org.terasology.registry.CoreRegistry;
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.UIData;

import java.util.Iterator;
import java.util.Map;

/**
* @author Immortius
*/
public class HUDScreenLayer extends CoreScreenLayer {

    private Map<AssetUri, HUDElement> elementsLookup = Maps.newLinkedHashMap();

    private AssetManager assetManager = CoreRegistry.get(AssetManager.class);
    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 uri, Class<T> type, Rect2f region) {
        AssetUri resolvedUri = Assets.resolveAssetUri(AssetType.UI_ELEMENT, uri);
        if (resolvedUri != null) {
            return addHUDElement(resolvedUri, type, region);
        }
        return null;
    }

    public <T extends ControlWidget> T addHUDElement(AssetUri uri, Class<T> type, Rect2f region) {
        UIData data = assetManager.loadAssetData(uri, UIData.class);
        if (data != null && type.isInstance(data.getRootWidget())) {
            return addHUDElement(uri, type.cast(data.getRootWidget()), region);
        }
        return null;
    }

    public <T extends ControlWidget> T addHUDElement(AssetUri uri, T widget, Rect2f region) {
        InjectionHelper.inject(widget);
        widget.onOpened();
        elementsLookup.put(uri, new HUDElement(widget, region));
        return widget;
    }

    public ControlWidget getHUDElement(String uri) {
        return getHUDElement(new AssetUri(AssetType.UI_ELEMENT, uri));
    }

    public ControlWidget getHUDElement(AssetUri uri) {
        HUDElement element = elementsLookup.get(uri);
        if (element != null) {
            return element.widget;
        }
        return null;
    }

    public <T extends ControlWidget> T getHUDElement(String uri, Class<T> type) {
        return getHUDElement(new AssetUri(AssetType.UI_ELEMENT, uri), type);
    }

    public <T extends ControlWidget> T getHUDElement(AssetUri uri, Class<T> type) {
        ControlWidget widget = getHUDElement(uri);
        if (widget != null && type.isInstance(widget)) {
            return type.cast(widget);
        }
        return null;
    }

    public boolean removeHUDElement(AssetUri uri) {
        HUDElement removed = elementsLookup.remove(uri);
        if (removed != null) {
            removed.widget.onClosed();
            return true;
        }
        return false;
    }

    public boolean removeHUDElement(ControlWidget element) {
        Iterator<Map.Entry<AssetUri, HUDElement>> iterator = elementsLookup.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<AssetUri, 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
    public 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
    protected 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;
        }
    }
}
TOP

Related Classes of org.terasology.rendering.nui.layers.hud.HUDScreenLayer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.