From 8c82d0fa4113ac0441212b61c105f924a28ce0c8 Mon Sep 17 00:00:00 2001 From: Skiftcha Date: Tue, 24 Nov 2020 08:06:51 +0300 Subject: [PATCH] local scrolling --- .../team/chisel/client/gui/GuiChisel.java | 241 +++++++++++------- .../team/chisel/client/gui/GuiScrollbar.java | 92 +++++++ .../inventory/InventoryChiselSelection.java | 39 ++- .../chisel/inventory/SlotChiselInput.java | 1 + 4 files changed, 267 insertions(+), 106 deletions(-) create mode 100644 src/main/java/team/chisel/client/gui/GuiScrollbar.java diff --git a/src/main/java/team/chisel/client/gui/GuiChisel.java b/src/main/java/team/chisel/client/gui/GuiChisel.java index 550ebe14..017b755d 100644 --- a/src/main/java/team/chisel/client/gui/GuiChisel.java +++ b/src/main/java/team/chisel/client/gui/GuiChisel.java @@ -13,6 +13,7 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import team.chisel.client.gui.widgets.GuiButtonChiselMode; import team.chisel.inventory.ContainerChisel; @@ -28,116 +29,164 @@ import static team.chisel.Chisel.MOD_ID; @SideOnly(Side.CLIENT) public class GuiChisel extends GuiContainer { - public static final ResourceLocation TEXTURE_RESOURCE_LOCATION = new ResourceLocation(MOD_ID, "textures/chisel2GuiScroll.png"); - public static final int TEXTURE_WIDTH = 266; - public static final int TEXTURE_HEIGHT = 250; - public static final int GUI_WIDTH = 266; - public static final int GUI_HEIGHT = 202; - public static final int CHISEL_INPUT_SIZE = 48; - private EntityPlayer player; - private ContainerChisel container; - private IChiselMode currentMode; + public static final ResourceLocation TEXTURE_RESOURCE_LOCATION = new ResourceLocation(MOD_ID, "textures/chisel2GuiScroll.png"); + public static final int TEXTURE_WIDTH = 266; + public static final int TEXTURE_HEIGHT = 250; + public static final int GUI_WIDTH = 266; + public static final int GUI_HEIGHT = 202; + public static final int CHISEL_INPUT_SIZE = 48; + private EntityPlayer player; + private ContainerChisel container; + private IChiselMode currentMode; + private GuiScrollbar scrollBar; + private InventoryChiselSelection menu; - public GuiChisel(InventoryPlayer iinventory, InventoryChiselSelection menu) { - super(new ContainerChisel(iinventory, menu)); - player = iinventory.player; - xSize = GUI_WIDTH; - ySize = GUI_HEIGHT; + public GuiChisel(InventoryPlayer iinventory, InventoryChiselSelection menu) { + super(new ContainerChisel(iinventory, menu)); + scrollBar = new GuiScrollbar(); + this.menu = menu; + player = iinventory.player; + xSize = GUI_WIDTH; + ySize = GUI_HEIGHT; - container = (ContainerChisel) inventorySlots; - } + container = (ContainerChisel) inventorySlots; + scrollBar.setContainerChisel(container); + } - @Override - public void onGuiClosed() { - super.onGuiClosed(); - inventorySlots.onContainerClosed(player); - } + @Override + public void onGuiClosed() { + super.onGuiClosed(); + inventorySlots.onContainerClosed(player); + } - @Override - @SuppressWarnings("unchecked") - public void initGui() { - super.initGui(); - currentMode = General.getChiselMode(container.chisel); + @Override + @SuppressWarnings("unchecked") + public void initGui() { + super.initGui(); + currentMode = General.getChiselMode(container.chisel); - if (showMode()) { - buttonList.add(new GuiButtonChiselMode(0, guiLeft + 12, guiTop + 132, this)); - } - } + if (showMode()) { + buttonList.add(new GuiButtonChiselMode(0, guiLeft + 12, guiTop + 132, this)); + } - @Override - public void updateScreen() { - super.updateScreen(); - final ItemStack held = player.getCurrentEquippedItem(); - if (held == null || !(held.getItem() instanceof IChiselItem)) { - mc.displayGuiScreen(null); - } - } + scrollBar.setLeft(246); + scrollBar.setTop(8); + scrollBar.setScrollHeight(106); + } - private boolean showMode() { - return container.chisel != null - && container.chisel.getItem() instanceof IChiselItem - && ((IChiselItem) container.chisel.getItem()).hasModes(container.chisel); - } + @Override + public void updateScreen() { + super.updateScreen(); + final ItemStack held = player.getCurrentEquippedItem(); + if (held == null || !(held.getItem() instanceof IChiselItem)) { + mc.displayGuiScreen(null); + } + } - @Override - protected void drawGuiContainerForegroundLayer(final int mouseX, final int mouseY) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + private boolean showMode() { + return container.chisel != null + && container.chisel.getItem() instanceof IChiselItem + && ((IChiselItem) container.chisel.getItem()).hasModes(container.chisel); + } - final String titleText = I18n.format(container.inventory.getInventoryName() + ".title"); - fontRendererObj.drawSplitString(titleText, 50 - fontRendererObj.getStringWidth(titleText) / 2, 60, 40, 0x404040); + @Override + protected void drawGuiContainerForegroundLayer(final int mouseX, final int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - if (showMode()) { - final String modeText = I18n.format(container.inventory.getInventoryName() + ".mode"); - fontRendererObj.drawString(modeText, 12 + (GuiButtonChiselMode.BUTTON_WIDTH - fontRendererObj.getStringWidth(modeText)) / 2, 122, 0x404040); - } - } + final String titleText = I18n.format(container.inventory.getInventoryName() + ".title"); + fontRendererObj.drawSplitString(titleText, 50 - fontRendererObj.getStringWidth(titleText) / 2, 60, 40, 0x404040); - @Override - protected void drawGuiContainerBackgroundLayer(final float partialTicks, final int mouseX, final int mouseY) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glDisable(GL11.GL_LIGHTING); + if (showMode()) { + final String modeText = I18n.format(container.inventory.getInventoryName() + ".mode"); + fontRendererObj.drawString(modeText, 12 + (GuiButtonChiselMode.BUTTON_WIDTH - fontRendererObj.getStringWidth(modeText)) / 2, 122, 0x404040); + } - mc.getTextureManager().bindTexture(TEXTURE_RESOURCE_LOCATION); - // drawModalRectWithCustomSizedTexture: x, y, u, v, width, height, textureWidth, textureHeight - func_146110_a(guiLeft, guiTop, 0, 0, xSize, ySize, TEXTURE_WIDTH, TEXTURE_HEIGHT); + scrollBar.draw(this); + } - Slot main = (Slot) container.inventorySlots.get(InventoryChiselSelection.normalSlots); - if (main.getStack() == null) { - func_146110_a(guiLeft + 8, guiTop + 8, 0, GUI_HEIGHT, CHISEL_INPUT_SIZE, CHISEL_INPUT_SIZE, TEXTURE_WIDTH, TEXTURE_HEIGHT); - } - } + @Override + protected void drawGuiContainerBackgroundLayer(final float partialTicks, final int mouseX, final int mouseY) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glDisable(GL11.GL_LIGHTING); - @Override - protected void actionPerformed(final GuiButton button) { - if (button.id == 0) { - if (container.chisel != null && container.chisel.getItem() instanceof IAdvancedChisel) { - final IAdvancedChisel item = (IAdvancedChisel) container.chisel.getItem(); - currentMode = item.getNextMode(container.chisel, currentMode); - } else { - currentMode = ChiselMode.next(currentMode); - } - PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); - } - super.actionPerformed(button); - } + mc.getTextureManager().bindTexture(TEXTURE_RESOURCE_LOCATION); + // drawModalRectWithCustomSizedTexture: x, y, u, v, width, height, textureWidth, textureHeight + func_146110_a(guiLeft, guiTop, 0, 0, xSize, ySize, TEXTURE_WIDTH, TEXTURE_HEIGHT); - @Override - protected void func_146977_a(final Slot slot) { - if (slot instanceof SlotChiselInput) { - GL11.glPushMatrix(); - GL11.glScalef(2, 2, 2); - slot.xDisplayPosition -= 16; - slot.yDisplayPosition -= 16; - super.func_146977_a(slot); - slot.xDisplayPosition += 16; - slot.yDisplayPosition += 16; - GL11.glPopMatrix(); - } else { - super.func_146977_a(slot); - } - } + Slot main = (Slot) container.inventorySlots.get(InventoryChiselSelection.normalSlots); + if (main.getStack() == null) { + func_146110_a(guiLeft + 8, guiTop + 8, 0, GUI_HEIGHT, CHISEL_INPUT_SIZE, CHISEL_INPUT_SIZE, TEXTURE_WIDTH, TEXTURE_HEIGHT); + } + } - public IChiselMode getCurrentMode() { - return currentMode; - } + @Override + protected void actionPerformed(final GuiButton button) { + if (button.id == 0) { + if (container.chisel != null && container.chisel.getItem() instanceof IAdvancedChisel) { + final IAdvancedChisel item = (IAdvancedChisel) container.chisel.getItem(); + currentMode = item.getNextMode(container.chisel, currentMode); + } else { + currentMode = ChiselMode.next(currentMode); + } + PacketHandler.INSTANCE.sendToServer(new MessageChiselMode(currentMode)); + } + super.actionPerformed(button); + } + + @Override + protected void func_146977_a(final Slot slot) { + if (slot instanceof SlotChiselInput) { + GL11.glPushMatrix(); + GL11.glScalef(2, 2, 2); + slot.xDisplayPosition -= 16; + slot.yDisplayPosition -= 16; + super.func_146977_a(slot); + slot.xDisplayPosition += 16; + slot.yDisplayPosition += 16; + GL11.glPopMatrix(); + } else { + super.func_146977_a(slot); + } + } + @Override + protected void mouseClickMove(int x, int y, int c, long d) { + if (scrollBar != null) { + int currentScroll = scrollBar.getCurrentScroll(); + scrollBar.click(x - guiLeft, y - guiTop); + if (currentScroll != scrollBar.getCurrentScroll()) { + menu.updateItems(); + } + } + super.mouseClickMove(x, y, c, d ); + } + + @Override + protected void mouseClicked(int xCoord, int yCoord, int btn) { + if (scrollBar != null) { + int currentScroll = scrollBar.getCurrentScroll(); + scrollBar.click(xCoord - guiLeft, yCoord - guiTop); + if (currentScroll != scrollBar.getCurrentScroll()) { + menu.updateItems(); + } + } + super.mouseClicked(xCoord, yCoord, btn); + } + + @Override + public void handleMouseInput() { + super.handleMouseInput(); + + int i = Mouse.getEventDWheel(); + if (i != 0 && scrollBar != null) { + int currentScroll = scrollBar.getCurrentScroll(); + scrollBar.wheel(i); + if (currentScroll != scrollBar.getCurrentScroll()) { + menu.updateItems(); + } + } + } + + public IChiselMode getCurrentMode() { + return currentMode; + } } diff --git a/src/main/java/team/chisel/client/gui/GuiScrollbar.java b/src/main/java/team/chisel/client/gui/GuiScrollbar.java new file mode 100644 index 00000000..821b5030 --- /dev/null +++ b/src/main/java/team/chisel/client/gui/GuiScrollbar.java @@ -0,0 +1,92 @@ +package team.chisel.client.gui; + +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; +import team.chisel.inventory.ContainerChisel; + +public class GuiScrollbar { + public static final ResourceLocation TEXTURE_RESOURCE_LOCATION = new ResourceLocation("minecraft", "textures/gui/container/creative_inventory/tabs.png"); + + private int displayX = 0; + private int displayY = 0; + private int width = 12; + private int height = 15; + + private int rowSize = 10; + private int rowsOnPage = 6; + + private int scrollHeight = height; + private ContainerChisel container; + + public void draw(GuiChisel g) { + // chisel2GuiScroll scroll button texture coordinates work strange (maybe because of alignment) so taking vanilla one + g.mc.getTextureManager().bindTexture(TEXTURE_RESOURCE_LOCATION); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + if (getMaxScroll() == 0) { + g.drawTexturedModalRect(displayX, displayY, 232 + width, 0, width, height); + } else { + int offset = getCurrentScroll() * (scrollHeight - height) / getMaxScroll(); + g.drawTexturedModalRect(displayX, offset + displayY, 232, 0, width, height); + } + } + + public GuiScrollbar setScrollHeight(int scrollHeight) { + this.scrollHeight = scrollHeight; + return this; + } + + public GuiScrollbar setLeft(int displayX) { + this.displayX = displayX; + return this; + } + + public GuiScrollbar setTop(int displayY) { + this.displayY = displayY; + return this; + } + + private int getMaxScroll() { + int maxScroll = (container.inventory.getMaxScroll() + rowSize - 1) / rowSize - rowsOnPage; + + if (maxScroll <= 0) { + maxScroll = 0; + } + + return maxScroll; + } + + public int getCurrentScroll() { + return container.inventory.getCurrentScroll() / rowSize; + } + + private void setCurrentScroll(int scroll) { + container.inventory.setCurrentScroll(scroll * rowSize); + } + + private int applyRange(int scroll) { + return Math.max(Math.min(scroll, getMaxScroll()), 0); + } + + void click(int x, int y) { + if (getMaxScroll() == 0) { + return; + } + + if (x > displayX && x <= displayX + width) { + if (y > displayY && y <= displayY + scrollHeight) { + int currentScroll = (y - displayY); + currentScroll = Math.round(1.0f * currentScroll / scrollHeight) * getMaxScroll(); + setCurrentScroll(applyRange(currentScroll)); + } + } + } + + void wheel(int delta) { + setCurrentScroll(applyRange(getCurrentScroll() + Math.max(Math.min(-delta, 1), -1))); + } + + public void setContainerChisel(ContainerChisel container) { + this.container = container; + } +} diff --git a/src/main/java/team/chisel/inventory/InventoryChiselSelection.java b/src/main/java/team/chisel/inventory/InventoryChiselSelection.java index a5c9c115..f205eaa3 100644 --- a/src/main/java/team/chisel/inventory/InventoryChiselSelection.java +++ b/src/main/java/team/chisel/inventory/InventoryChiselSelection.java @@ -1,5 +1,6 @@ package team.chisel.inventory; +import java.util.ArrayList; import java.util.List; import com.cricketcraft.chisel.api.IChiselItem; @@ -15,11 +16,12 @@ import net.minecraft.item.ItemTool; public class InventoryChiselSelection implements IInventory { - ItemStack chisel = null; + ItemStack chisel; public final static int normalSlots = 60; - public int activeVariations = 0; ContainerChisel container; ItemStack[] inventory; + private int currentScroll = 0; + private int maxScroll = 0; public InventoryChiselSelection(ItemStack c) { super(); @@ -28,6 +30,18 @@ public class InventoryChiselSelection implements IInventory { chisel = c; } + public void setCurrentScroll(int currentScroll) { + this.currentScroll = currentScroll; + } + + public int getCurrentScroll() { + return currentScroll; + } + + public int getMaxScroll() { + return maxScroll; + } + public void onInventoryUpdate(int slot) { } @@ -95,10 +109,10 @@ public class InventoryChiselSelection implements IInventory { } public void clearItems() { - activeVariations = 0; for (int i = 0; i < normalSlots; i++) { inventory[i] = null; } + maxScroll = 0; } public ItemStack getStackInSpecialSlot() { @@ -124,12 +138,18 @@ public class InventoryChiselSelection implements IInventory { if (!((IChiselItem) chisel.getItem()).canChisel(container.playerInventory.player.worldObj, chisel, General.getVariation(chiseledItem))) return; - List list = container.carving.getItemsForChiseling(chiseledItem); - - activeVariations = 0; - while (activeVariations < normalSlots && activeVariations < list.size()) { - if (Block.blockRegistry.getNameForObject(Block.getBlockFromItem(list.get(activeVariations).getItem())) != null) { - inventory[activeVariations] = list.get(activeVariations); + List list2 = container.carving.getItemsForChiseling(chiseledItem); + // DEBUG! REMOVE: + List list = new ArrayList<>(list2); + list.addAll(list2); + if (list.size() > 61) { + list = list.subList(0, 61); + } + maxScroll = list.size(); + int activeVariations = 0; + while (activeVariations < normalSlots && activeVariations + currentScroll < list.size()) { + if (Block.blockRegistry.getNameForObject(Block.getBlockFromItem(list.get(activeVariations + currentScroll).getItem())) != null) { + inventory[activeVariations] = list.get(activeVariations + currentScroll); activeVariations++; } } @@ -172,5 +192,4 @@ public class InventoryChiselSelection implements IInventory { return !(stack != null && (stack.getItem() instanceof ItemChisel)) && i == normalSlots; } - } diff --git a/src/main/java/team/chisel/inventory/SlotChiselInput.java b/src/main/java/team/chisel/inventory/SlotChiselInput.java index 24aaedc6..72a10897 100644 --- a/src/main/java/team/chisel/inventory/SlotChiselInput.java +++ b/src/main/java/team/chisel/inventory/SlotChiselInput.java @@ -30,6 +30,7 @@ public class SlotChiselInput extends Slot { return; super.onSlotChanged(); + selInventory.setCurrentScroll(0); selInventory.updateItems(); }