diff --git a/src/main/java/com/enderio/core/client/gui/button/CycleButton.java b/src/main/java/com/enderio/core/client/gui/button/CycleButton.java new file mode 100644 index 0000000..f2ad514 --- /dev/null +++ b/src/main/java/com/enderio/core/client/gui/button/CycleButton.java @@ -0,0 +1,94 @@ +package com.enderio.core.client.gui.button; + +import java.util.List; + +import lombok.Getter; +import net.minecraft.client.Minecraft; + +import com.enderio.core.api.client.gui.IGuiScreen; +import com.enderio.core.api.client.render.IWidgetIcon; +import com.enderio.core.client.gui.button.CycleButton.ICycleEnum; +import com.google.common.base.Throwables; +import com.google.common.collect.Lists; + +import cpw.mods.fml.relauncher.ReflectionHelper; + +/** + * A button which automatically parses enum constants and cycles between them + * when clicked. + * + * @param + * The enum type for this button. + */ +public class CycleButton & ICycleEnum> extends IconButton { + + public interface ICycleEnum { + + /** + * @return The icon to display when the button has selected this mode. + */ + IWidgetIcon getIcon(); + + /** + * @return Localized tooltip lines. + */ + List getTooltipLines(); + } + + private T[] modes; + + @Getter + private T mode; + + @SuppressWarnings("unchecked") + public CycleButton(IGuiScreen gui, int id, int x, int y, Class enumClass) { + super(gui, id, x, y, null); + try { + modes = (T[]) ReflectionHelper.findMethod(enumClass, null, new String[] { "values" }).invoke(null); + } catch (Exception e) { + Throwables.propagate(e); + } + setMode(modes[0]); + } + + @Override + public boolean mousePressed(Minecraft par1Minecraft, int par2, int par3) { + boolean result = super.mousePressed(par1Minecraft, par2, par3); + if (result) { + nextMode(); + } + return result; + } + + @Override + public boolean mousePressedButton(Minecraft mc, int x, int y, int button) { + boolean result = button == 1 && super.checkMousePress(mc, x, y); + if (result) { + prevMode(); + } + return result; + } + + private void nextMode() { + setMode(modes[(mode.ordinal() + 1) % modes.length]); + } + + private void prevMode() { + int ord = mode.ordinal() - 1; + if (ord < 0) { + ord = modes.length - 1; + } + setMode(modes[ord]); + } + + public void setMode(T newMode) { + if (mode == newMode) { + return; + } + mode = newMode; + List tooltip = Lists.newArrayList(mode.getTooltipLines()); + setToolTip(tooltip.toArray(new String[tooltip.size()])); + + this.icon = mode.getIcon(); + } +}