package net.mostlyoriginal.game.system.ui;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.systems.EntityProcessingSystem;
import com.artemis.utils.EntityBuilder;
import net.mostlyoriginal.api.component.basic.Bounds;
import net.mostlyoriginal.api.component.basic.Pos;
import net.mostlyoriginal.api.component.graphics.Anim;
import net.mostlyoriginal.api.component.graphics.Color;
import net.mostlyoriginal.api.component.graphics.Invisible;
import net.mostlyoriginal.api.component.graphics.Renderable;
import net.mostlyoriginal.api.utils.GdxUtil;
import net.mostlyoriginal.game.component.ui.Button;
import net.mostlyoriginal.game.component.ui.Clickable;
import net.mostlyoriginal.game.component.ui.Label;
import net.mostlyoriginal.game.manager.AssetSystem;
/**
* @author Daan van Yperen
*/
@Wire
public class ButtonSystem extends EntityProcessingSystem {
public static final float COOLDOWN_AFTER_BUTTON_CLICK = 0.15f;
protected ComponentMapper<Clickable> mClickable;
protected ComponentMapper<Label> mLabel;
protected ComponentMapper<Button> mButton;
protected ComponentMapper<Anim> mAnim;
protected ComponentMapper<Color> mColor;
protected ComponentMapper<Invisible> mInvisible;
public Label hintlabel;
public float globalButtonCooldown = 0;
private AssetSystem assetSystem;
public ButtonSystem() {
super(Aspect.getAspectForAll(Button.class, Clickable.class, Bounds.class).one(Anim.class, Label.class));
}
@Override
protected void initialize() {
super.initialize();
hintlabel = new Label("hintlabel");
new EntityBuilder(world).with(new Renderable(), new Pos(10, 6), hintlabel, GdxUtil.asColor("004290")).build();
}
@Override
protected void process(Entity e) {
updateAnim(e);
}
@Override
protected void begin() {
super.begin();
hintlabel.text = null;
globalButtonCooldown -= world.delta;
}
private void updateAnim(Entity e) {
String id = getNewAnimId(e);
if (id != null) {
final Button button = mButton.get(e);
boolean automaticDisable = button.hideIfDisabled && !button.listener.enabled();
if (automaticDisable) {
id = null;
}
// quick hack to hide icons when button is hidden. @todo cleanup.
if ( button.transientIcon != null ) {
if (button.transientIcon.isActive()) {
Entity bute = button.transientIcon.get();
if ((id != null) && mInvisible.has(bute)) {
bute.edit().remove(Invisible.class);
}
if ((id == null) && !mInvisible.has(bute)) {
bute.edit().add(new Invisible());
}
}
}
if (mAnim.has(e)) {
mAnim.get(e).id = id;
} else if (mColor.has(e)) {
// @todo fix this hack! XD
mColor.get(e).set(GdxUtil.asColor(id));
}
}
}
private String getNewAnimId(Entity e) {
final Clickable clickable = mClickable.get(e);
final Button button = mButton.get(e);
if ( button.autoclick ) {
button.autoclickCooldown -= world.delta;
}
// disable the button temporarily after use to avoid trouble.
if (button.cooldown >= 0) {
button.cooldown -= world.delta;
return button.animClicked;
}
// gray out disabled items. @todo separate.
boolean active = button.listener.enabled() && !button.manualDisable;
if (mColor.has(e)) {
Color color = mColor.get(e);
color.r = button.color.r * (active ? 1f : 0.5f);
color.g = button.color.g * (active ? 1f : 0.5f);
color.b = button.color.b * (active ? 1f : 0.5f);
color.a = button.color.a;
if ( button.transientIcon != null && button.transientIcon.isActive() )
{
final Entity iconEntity = button.transientIcon.get();
if ( mColor.has(iconEntity )) {
mColor.get(iconEntity).set(color);
}
}
if (!active) {
return button.animDefault;
}
}
switch (clickable.state) {
case HOVER:
if (button.autoclick && button.autoclickCooldown <= 0) {
return click(button);
}
hintlabel.text = button.hint;
return button.animHover;
case CLICKED:
if ( !button.autoclick ) return click(button);
default:
return button.animDefault;
}
}
private String click(Button button) {
button.cooldown = COOLDOWN_AFTER_BUTTON_CLICK;
triggerButton(button);
return button.animClicked;
}
private void triggerButton(Button button) {
if (button.listener.enabled() && globalButtonCooldown <= 0 && !button.manualDisable ) {
if ( !button.autoclick) assetSystem.playSfx("snd-click");
// prevent spamming by accident.
if ( !button.autoclick ) globalButtonCooldown = 0.1f;
button.listener.run();
}
}
}