package openmods.gui; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import openmods.api.IValueProvider; import openmods.api.IValueReceiver; import openmods.container.ContainerBase; import openmods.gui.component.BaseComposite; import openmods.gui.component.GuiComponentCheckbox; import openmods.gui.component.GuiComponentLabel; import openmods.gui.component.GuiComponentSideSelector; import openmods.gui.component.GuiComponentSideSelector.ISideSelectedListener; import openmods.gui.component.GuiComponentTab; import openmods.gui.component.GuiComponentTabWrapper; import openmods.gui.listener.IValueChangedListener; import openmods.gui.logic.ValueCopyAction; import openmods.gui.misc.IConfigurableGuiSlots; import openmods.sync.ISyncMapProvider; import openmods.utils.bitmap.IWriteableBitMap; public abstract class GuiConfigurableSlots<T extends TileEntity & ISyncMapProvider & IConfigurableGuiSlots<E>, C extends ContainerBase<T>, E extends Enum<E>> extends SyncedGuiContainer<C> { public GuiConfigurableSlots(C container, int width, int height, String name) { super(container, width, height, name); } protected abstract Iterable<E> getSlots(); protected abstract void addCustomizations(BaseComposite root); protected abstract GuiComponentTab createTab(E slot); protected GuiComponentSideSelector createSideSelector(E slot, Block block, int meta, T te) { return new GuiComponentSideSelector(15, 15, 40.0, block, meta, te, true); } protected GuiComponentCheckbox createCheckbox(E slot) { return new GuiComponentCheckbox(10, 82, false, 0xFFFFFF); } protected abstract GuiComponentLabel createLabel(E slot); @Override protected final BaseComposite createRoot() { T te = getContainer().getOwner(); final int meta = te.getBlockMetadata(); final Block block = te.getBlockType(); BaseComposite main = super.createRoot(); addCustomizations(main); GuiComponentTabWrapper tabs = new GuiComponentTabWrapper(0, 0, main); for (E slot : getSlots()) { GuiComponentTab tabTool = createTab(slot); tabs.addComponent(tabTool); GuiComponentSideSelector sideSelector = createSideSelector(slot, block, meta, te); GuiComponentCheckbox checkbox = createCheckbox(slot); setupCheckBox(checkbox, te.createAutoFlagProvider(slot), te.createAutoSlotReceiver(slot)); setupSelector(sideSelector, te.createAllowedDirectionsProvider(slot), te.createAllowedDirectionsReceiver(slot)); tabTool.addComponent(sideSelector); tabTool.addComponent(checkbox); tabTool.addComponent(createLabel(slot)); } return tabs; } private void setupSelector(GuiComponentSideSelector selector, IValueProvider<Set<ForgeDirection>> source, final IWriteableBitMap<ForgeDirection> updater) { selector.setListener(new ISideSelectedListener() { @Override public void onSideToggled(ForgeDirection side, boolean currentState) { updater.set(side, currentState); } }); addSyncUpdateListener(ValueCopyAction.create(source, selector)); } private void setupCheckBox(final GuiComponentCheckbox checkbox, IValueProvider<Boolean> source, final IValueReceiver<Boolean> updater) { checkbox.setListener(new IValueChangedListener<Boolean>() { @Override public void valueChanged(Boolean value) { updater.setValue(value); } }); addSyncUpdateListener(ValueCopyAction.create(source, checkbox)); } }