/*
* Copyright 2016 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;
import com.google.common.collect.Lists;
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.skin.UISkin;
import org.terasology.rendering.nui.widgets.UILabel;
import java.util.Collection;
import java.util.List;
/**
*/
public abstract class AbstractWidget implements UIWidget {
@LayoutConfig
private String id;
@LayoutConfig
private UISkin skin;
@LayoutConfig
private Binding<String> family = new DefaultBinding<>();
@LayoutConfig
private Binding<Boolean> visible = new DefaultBinding<>(true);
@LayoutConfig
private Binding<UIWidget> tooltip = new DefaultBinding<>();
@LayoutConfig
private float tooltipDelay = 0.5f;
private boolean focused;
@LayoutConfig
private Binding<Boolean> enabled = new DefaultBinding<>(true);
public AbstractWidget() {
id = "";
}
public AbstractWidget(String id) {
this.id = id;
}
@Override
public String getMode() {
if (this.isEnabled()) {
return DEFAULT_MODE;
}
return DISABLED_MODE;
}
@Override
public final String getId() {
return id;
}
protected void setId(String id) {
this.id = id;
}
@Override
public final UISkin getSkin() {
return skin;
}
@Override
public final void setSkin(UISkin skin) {
this.skin = skin;
}
@Override
public final String getFamily() {
return family.get();
}
@Override
public final void setFamily(String family) {
this.family.set(family);
}
@Override
public void bindFamily(Binding<String> binding) {
this.family = binding;
}
@Override
public final <T extends UIWidget> T find(String targetId, Class<T> type) {
if (this.id.equals(targetId)) {
if (type.isInstance(this)) {
return type.cast(this);
}
return null;
}
for (UIWidget contents : this) {
if (contents != null) {
T result = contents.find(targetId, type);
if (result != null) {
return result;
}
}
}
return null;
}
@Override
public final <T extends UIWidget> Collection<T> findAll(Class<T> type) {
List<T> results = Lists.newArrayList();
findAll(type, this, results);
return results;
}
private <T extends UIWidget> void findAll(Class<T> type, UIWidget widget, List<T> results) {
if (type.isInstance(widget)) {
results.add(type.cast(widget));
}
for (UIWidget content : widget) {
findAll(type, content, results);
}
}
@Override
public boolean isVisible() {
return visible.get();
}
public void setVisible(boolean visible) {
this.visible.set(visible);
}
public boolean isEnabled() {
return enabled.get();
}
public void setEnabled(boolean enabled) {
this.enabled.set(enabled);
for (UIWidget child : this) {
if (child instanceof AbstractWidget) {
AbstractWidget widget = (AbstractWidget) child;
widget.setEnabled(this.isEnabled());
}
}
}
public void bindEnabled(Binding<Boolean> binding) {
enabled = binding;
for (UIWidget child : this) {
if (child instanceof AbstractWidget) {
AbstractWidget widget = (AbstractWidget) child;
widget.bindEnabled(binding);
}
}
}
public void bindVisible(Binding<Boolean> bind) {
this.visible = bind;
}
public void clearVisibleBinding() {
this.visible = new DefaultBinding<>(true);
}
@Override
public void onGainFocus() {
focused = true;
}
@Override
public void onLoseFocus() {
focused = false;
}
public final boolean isFocused() {
return focused;
}
@Override
public boolean isSkinAppliedByCanvas() {
return true;
}
@Override
public void update(float delta) {
for (UIWidget item : this) {
item.update(delta);
}
}
@Override
public boolean canBeFocus() {
return true;
}
@Override
public void bindTooltip(Binding<UIWidget> binding) {
tooltip = binding;
}
@Override
public UIWidget getTooltip() {
return tooltip.get();
}
@Override
public void setTooltip(String value) {
if (value != null && !value.isEmpty()) {
setTooltip(new UILabel(value));
} else {
tooltip = new DefaultBinding<>(null);
}
}
@Override
public void setTooltip(UIWidget val) {
tooltip.set(val);
}
@Override
public void bindTooltipString(Binding<String> bind) {
bindTooltip(new TooltipLabelBinding(bind));
}
@Override
public float getTooltipDelay() {
return tooltipDelay;
}
public final void setTooltipDelay(float value) {
this.tooltipDelay = value;
}
private static class TooltipLabelBinding extends ReadOnlyBinding<UIWidget> {
private UILabel tooltipLabel = new UILabel();
TooltipLabelBinding(Binding<String> stringBind) {
tooltipLabel.bindText(stringBind);
}
@Override
public UIWidget get() {
if (tooltipLabel.getText().isEmpty()) {
return null;
}
return tooltipLabel;
}
}
}