Skip to content

Instantly share code, notes, and snippets.

@tterrag1098
Last active August 29, 2015 14:25
Show Gist options
  • Save tterrag1098/2721f4b4db15fb7f4eb1 to your computer and use it in GitHub Desktop.
Save tterrag1098/2721f4b4db15fb7f4eb1 to your computer and use it in GitHub Desktop.
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 <T>
* The enum type for this button.
*/
public class CycleButton<T extends Enum<T> & 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<String> getTooltipLines();
}
private T[] modes;
@Getter
private T mode;
@SuppressWarnings("unchecked")
public CycleButton(IGuiScreen gui, int id, int x, int y, Class<T> 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<String> tooltip = Lists.newArrayList(mode.getTooltipLines());
setToolTip(tooltip.toArray(new String[tooltip.size()]));
this.icon = mode.getIcon();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment