/* * 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.ingame.inventory; import com.google.common.primitives.UnsignedBytes; import org.terasology.utilities.Assets; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.logic.common.DisplayNameComponent; import org.terasology.logic.inventory.ItemComponent; import org.terasology.math.geom.Vector2i; import org.terasology.rendering.assets.mesh.Mesh; import org.terasology.rendering.assets.texture.Texture; import org.terasology.rendering.assets.texture.TextureRegion; import org.terasology.rendering.nui.Canvas; import org.terasology.rendering.nui.CoreWidget; import org.terasology.rendering.nui.databinding.Binding; import org.terasology.rendering.nui.databinding.DefaultBinding; import org.terasology.rendering.nui.databinding.ReadOnlyBinding; import org.terasology.rendering.nui.widgets.TooltipLine; import org.terasology.world.block.items.BlockItemComponent; import java.util.List; import java.util.Optional; /** * Applies the logic to get information out of the EntityRef item */ public abstract class ItemCell extends CoreWidget { protected ItemIcon icon = new ItemIcon(); private Binding<Boolean> selected = new DefaultBinding<>(false); public ItemCell() { icon.bindTooltipLines( new ReadOnlyBinding<List<TooltipLine>>() { @Override public List<TooltipLine> get() { GetItemTooltip itemTooltip; DisplayNameComponent displayNameComponent = getTargetItem().getComponent(DisplayNameComponent.class); if (displayNameComponent != null) { itemTooltip = new GetItemTooltip(displayNameComponent.name); } else { itemTooltip = new GetItemTooltip(); } getTargetItem().send(itemTooltip); return itemTooltip.getTooltipLines(); } }); icon.bindIcon(new ReadOnlyBinding<TextureRegion>() { @Override public TextureRegion get() { if (getTargetItem().exists()) { ItemComponent itemComp = getTargetItem().getComponent(ItemComponent.class); if (itemComp != null && itemComp.icon != null) { return itemComp.icon; } BlockItemComponent blockItemComp = getTargetItem().getComponent(BlockItemComponent.class); if (blockItemComp == null || blockItemComp.blockFamily == null) { return Assets.getTextureRegion("engine:items#questionMark").get(); } } return null; } }); icon.bindMesh(new ReadOnlyBinding<Mesh>() { @Override public Mesh get() { BlockItemComponent blockItemComp = getTargetItem().getComponent(BlockItemComponent.class); if (blockItemComp != null && blockItemComp.blockFamily != null) { return blockItemComp.blockFamily.getArchetypeBlock().getMeshGenerator().getStandaloneMesh(); } return null; } }); Optional<Texture> terrainTex = Assets.getTexture("engine:terrain"); if (terrainTex.isPresent()) { icon.setMeshTexture(terrainTex.get()); } else { icon.setMeshTexture(Assets.getTexture("engine:default").get()); } icon.bindQuantity(new ReadOnlyBinding<Integer>() { @Override public Integer get() { ItemComponent itemComp = getTargetItem().getComponent(ItemComponent.class); if (itemComp != null) { return UnsignedBytes.toInt(itemComp.stackCount); } return 1; } }); } @Override public void onDraw(Canvas canvas) { getTargetItem().send(new BeforeInventoryCellRendered(canvas)); canvas.drawWidget(icon); getTargetItem().send(new InventoryCellRendered(canvas)); } @Override public Vector2i getPreferredContentSize(Canvas canvas, Vector2i sizeHint) { return canvas.calculateRestrictedSize(icon, sizeHint); } public abstract EntityRef getTargetItem(); public void bindSelected(Binding<Boolean> binding) { selected = binding; } public boolean isSelected() { return selected.get(); } public void setSelected(boolean val) { selected.set(val); } @Override public float getTooltipDelay() { return 0; } @Override public String getMode() { if (isSelected()) { return ACTIVE_MODE; } return DEFAULT_MODE; } }