|
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(); |
|
} |
|
} |