From 85ba97338c1d939397f1c786e01e0cfd734cd16c Mon Sep 17 00:00:00 2001 From: Discreater Date: Sat, 1 May 2021 01:16:04 +0800 Subject: [PATCH] feat: new texture --- .../jecalculation/data/label/ILabel.java | 37 +----- .../data/label/labels/LFluidStack.java | 3 +- .../data/label/labels/LItemStack.java | 3 +- .../data/label/labels/LOreDict.java | 3 +- .../data/label/labels/LPlaceholder.java | 3 +- .../towdium/jecalculation/gui/IWPicker.java | 2 +- .../me/towdium/jecalculation/gui/IWidget.java | 6 + .../me/towdium/jecalculation/gui/JecaGui.java | 35 ++---- .../towdium/jecalculation/gui/Resource.java | 13 +++ .../gui/drawables/WContainer.java | 9 +- .../jecalculation/gui/drawables/WLabel.java | 105 +++++++++++++----- .../jecalculation/gui/drawables/WPage.java | 25 +++-- .../jecalculation/gui/drawables/WPanel.java | 28 ++++- .../gui/drawables/WTextField.java | 1 + .../jecalculation/gui/drawables/WTooltip.java | 19 ++-- .../jecalculation/gui/guis/GuiCalculator.java | 47 +++++--- .../jecalculation/textures/gui/resources.png | Bin 12433 -> 15402 bytes 17 files changed, 209 insertions(+), 130 deletions(-) diff --git a/src/main/java/me/towdium/jecalculation/data/label/ILabel.java b/src/main/java/me/towdium/jecalculation/data/label/ILabel.java index 7140303..ed5556d 100644 --- a/src/main/java/me/towdium/jecalculation/data/label/ILabel.java +++ b/src/main/java/me/towdium/jecalculation/data/label/ILabel.java @@ -42,12 +42,8 @@ public interface ILabel { ILabel increaseAmount(); - ILabel increaseAmountLarge(); - ILabel decreaseAmount(); - ILabel decreaseAmountLarge(); - ILabel invertAmount(); int getAmount(); @@ -73,7 +69,7 @@ public interface ILabel { String getDisplayName(); - List getToolTip(List existing, boolean detailed); + void getToolTip(List existing, boolean detailed); ILabel copy(); @@ -244,21 +240,11 @@ public interface ILabel { return this; } - @Override - public ILabel increaseAmountLarge() { - return this; - } - @Override public ILabel decreaseAmount() { return this; } - @Override - public ILabel decreaseAmountLarge() { - return this; - } - @Override public ILabel invertAmount() { return this; @@ -285,8 +271,7 @@ public interface ILabel { } @Override - public List getToolTip(List existing, boolean detailed) { - return new ArrayList<>(); + public void getToolTip(List existing, boolean detailed) { } @Override @@ -348,12 +333,6 @@ public interface ILabel { return this; } - @Override - public ILabel increaseAmountLarge() { - setAmount(getAmount() + 10 * getMultiplier()); - return this; - } - @Override public ILabel decreaseAmount() { if (getAmount() <= getMultiplier()) return ILabel.EMPTY; @@ -363,15 +342,6 @@ public interface ILabel { } } - @Override - public ILabel decreaseAmountLarge() { - if (getAmount() <= 10 * getMultiplier()) return ILabel.EMPTY; - else { - setAmount(getAmount() - 10 * getMultiplier()); - return this; - } - } - @Override public ILabel invertAmount() { setAmount(-getAmount()); @@ -380,10 +350,9 @@ public interface ILabel { @Override @SideOnly(Side.CLIENT) - public List getToolTip(List existing, boolean detailed) { + public void getToolTip(List existing, boolean detailed) { if (detailed) existing.add(FORMAT_GREY + Utilities.I18n.format("label.common.tooltip.amount", getAmountString())); - return existing; } @Override diff --git a/src/main/java/me/towdium/jecalculation/data/label/labels/LFluidStack.java b/src/main/java/me/towdium/jecalculation/data/label/labels/LFluidStack.java index a9d5ca7..051dfc5 100644 --- a/src/main/java/me/towdium/jecalculation/data/label/labels/LFluidStack.java +++ b/src/main/java/me/towdium/jecalculation/data/label/labels/LFluidStack.java @@ -102,11 +102,10 @@ public class LFluidStack extends ILabel.Impl { @Override @SideOnly(Side.CLIENT) - public List getToolTip(List existing, boolean detailed) { + public void getToolTip(List existing, boolean detailed) { if (detailed) existing.add(FORMAT_GREY + Utilities.I18n.format("label.common.tooltip.amount", Integer.toString(getAmount())) + "mB"); existing.add(FORMAT_BLUE + FORMAT_ITALIC + Utilities.getModName(fluid)); - return existing; } diff --git a/src/main/java/me/towdium/jecalculation/data/label/labels/LItemStack.java b/src/main/java/me/towdium/jecalculation/data/label/labels/LItemStack.java index 9ed6ccd..b700b36 100644 --- a/src/main/java/me/towdium/jecalculation/data/label/labels/LItemStack.java +++ b/src/main/java/me/towdium/jecalculation/data/label/labels/LItemStack.java @@ -83,10 +83,9 @@ public class LItemStack extends ILabel.Impl { @Override @SideOnly(Side.CLIENT) - public List getToolTip(List existing, boolean detailed) { + public void getToolTip(List existing, boolean detailed) { super.getToolTip(existing, detailed); existing.add(FORMAT_BLUE + FORMAT_ITALIC + Utilities.getModName(item)); - return existing; } @Override diff --git a/src/main/java/me/towdium/jecalculation/data/label/labels/LOreDict.java b/src/main/java/me/towdium/jecalculation/data/label/labels/LOreDict.java index 85b4055..9bd78da 100644 --- a/src/main/java/me/towdium/jecalculation/data/label/labels/LOreDict.java +++ b/src/main/java/me/towdium/jecalculation/data/label/labels/LOreDict.java @@ -163,10 +163,9 @@ public class LOreDict extends ILabel.Impl { @Override @SideOnly(Side.CLIENT) - public List getToolTip(List existing, boolean detailed) { + public void getToolTip(List existing, boolean detailed) { super.getToolTip(existing, detailed); existing.add(FORMAT_BLUE + FORMAT_ITALIC + JustEnoughCalculation.Reference.MODNAME); - return existing; } @Override diff --git a/src/main/java/me/towdium/jecalculation/data/label/labels/LPlaceholder.java b/src/main/java/me/towdium/jecalculation/data/label/labels/LPlaceholder.java index fba735d..49e0646 100644 --- a/src/main/java/me/towdium/jecalculation/data/label/labels/LPlaceholder.java +++ b/src/main/java/me/towdium/jecalculation/data/label/labels/LPlaceholder.java @@ -100,9 +100,8 @@ public class LPlaceholder extends ILabel.Impl { @Override @SideOnly(Side.CLIENT) - public List getToolTip(List existing, boolean detailed) { + public void getToolTip(List existing, boolean detailed) { super.getToolTip(existing, detailed); existing.add(FORMAT_BLUE + FORMAT_ITALIC + JustEnoughCalculation.Reference.MODNAME); - return existing; } } diff --git a/src/main/java/me/towdium/jecalculation/gui/IWPicker.java b/src/main/java/me/towdium/jecalculation/gui/IWPicker.java index edf1952..66f1aeb 100644 --- a/src/main/java/me/towdium/jecalculation/gui/IWPicker.java +++ b/src/main/java/me/towdium/jecalculation/gui/IWPicker.java @@ -22,7 +22,7 @@ public interface IWPicker extends IWidget { protected Consumer callback; @Override - public IWPicker setCallback(Consumer callback) { + public Impl setCallback(Consumer callback) { this.callback = callback; return this; } diff --git a/src/main/java/me/towdium/jecalculation/gui/IWidget.java b/src/main/java/me/towdium/jecalculation/gui/IWidget.java index e3ac380..79518b3 100644 --- a/src/main/java/me/towdium/jecalculation/gui/IWidget.java +++ b/src/main/java/me/towdium/jecalculation/gui/IWidget.java @@ -1,8 +1,14 @@ package me.towdium.jecalculation.gui; +import java.util.List; + public interface IWidget { void onDraw(JecaGui gui, int xMouse, int yMouse); + default boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { + return false; + } + default boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { return false; } diff --git a/src/main/java/me/towdium/jecalculation/gui/JecaGui.java b/src/main/java/me/towdium/jecalculation/gui/JecaGui.java index eff7676..b17260b 100644 --- a/src/main/java/me/towdium/jecalculation/gui/JecaGui.java +++ b/src/main/java/me/towdium/jecalculation/gui/JecaGui.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import me.towdium.jecalculation.JustEnoughCalculation; import me.towdium.jecalculation.data.label.ILabel; +import me.towdium.jecalculation.gui.drawables.WContainer; import me.towdium.jecalculation.nei.NEIPlugin; import me.towdium.jecalculation.polyfill.mc.client.renderer.GlStateManager; import me.towdium.jecalculation.utils.IllegalPositionException; @@ -46,15 +47,14 @@ public class JecaGui extends GuiContainer { public static final int COLOR_TEXT_WHITE = 0xFFFFFF; public static final boolean ALWAYS_TOOLTIP = false; public ILabel hand = ILabel.EMPTY; - public IWidget root; + public WContainer root; protected JecaGui parent; - protected List>> tooltipBuffer = new ArrayList<>(); - public JecaGui(@Nullable JecaGui parent, IWidget root) { + public JecaGui(@Nullable JecaGui parent, WContainer root) { this(parent, false, root); } - public JecaGui(@Nullable JecaGui parent, boolean acceptsTransfer, IWidget root) { + public JecaGui(@Nullable JecaGui parent, boolean acceptsTransfer, WContainer root) { super(acceptsTransfer ? new ContainerTransfer() : new ContainerNonTransfer()); this.parent = parent; this.root = root; @@ -66,11 +66,11 @@ public class JecaGui extends GuiContainer { return xMouse > xPos && yMouse > yPos && xMouse <= xPos + xSize && yMouse <= yPos + ySize; } - public static void displayGui(IWidget root) { + public static void displayGui(WContainer root) { displayGui(true, false, root); } - public static void displayGui(boolean updateParent, boolean acceptsTransfer, IWidget root) { + public static void displayGui(boolean updateParent, boolean acceptsTransfer, WContainer root) { // isCallingFromMinecraftThread if (Minecraft.getMinecraft().func_152345_ab()) displayGuiUnsafe(updateParent, acceptsTransfer, root); @@ -88,7 +88,7 @@ public class JecaGui extends GuiContainer { return ret; } - private static void displayGuiUnsafe(boolean updateParent, boolean acceptsTransfer, IWidget root) { + private static void displayGuiUnsafe(boolean updateParent, boolean acceptsTransfer, WContainer root) { Minecraft mc = Minecraft.getMinecraft(); JecaGui parent; if (mc.currentScreen == null) @@ -137,7 +137,9 @@ public class JecaGui extends GuiContainer { GlStateManager.translate(0, 0, 80); hand.drawLabel(this, mouseX, mouseY, true); GlStateManager.popMatrix(); - drawBufferedTooltip(); + List tooltip = new ArrayList<>(); + root.onTooltip(this, mouseX - guiLeft, mouseY - guiTop, tooltip); + drawHoveringText(tooltip, mouseX, mouseY); GlStateManager.enableLighting(); GlStateManager.enableDepth(); } @@ -363,23 +365,6 @@ public class JecaGui extends GuiContainer { drawText(xPos, yPos + yOffset, xSize, f, text); } - public void drawTooltip(int xPos, int yPos, String... text) { - drawTooltip(xPos, yPos, Arrays.asList(text)); - } - - public void drawTooltip(int xPos, int yPos, List text) { - tooltipBuffer.add(new Triple<>(xPos + guiLeft, yPos + guiTop, text)); - } - - protected void drawBufferedTooltip() { - tooltipBuffer.forEach(i -> { - drawHoveringText(i.three, i.one, i.two); - GlStateManager.disableLighting(); - GlStateManager.disableDepth(); - }); - tooltipBuffer.clear(); - } - public void drawItemStack(int xPos, int yPos, ItemStack is, boolean centred) { if (is.getItem() == null) { return; diff --git a/src/main/java/me/towdium/jecalculation/gui/Resource.java b/src/main/java/me/towdium/jecalculation/gui/Resource.java index 69be70d..8ec7a34 100644 --- a/src/main/java/me/towdium/jecalculation/gui/Resource.java +++ b/src/main/java/me/towdium/jecalculation/gui/Resource.java @@ -31,12 +31,25 @@ public class Resource { public static final Resource BTN_DEL_F = new Resource(70, 0, 14, 14); public static final Resource BTN_YES_N = new Resource(84, 14, 14, 14); public static final Resource BTN_YES_F = new Resource(84, 0, 14, 14); + public static final Resource BTN_YES_D = new Resource(228, 14, 14, 14); public static final Resource BTN_NO_N = new Resource(98, 14, 14, 14); public static final Resource BTN_NO_F = new Resource(98, 0, 14, 14); public static final Resource BTN_NO_D = new Resource(228, 0, 14, 14); public static final Resource BTN_DISAMB_N = new Resource(112, 14, 14, 14); public static final Resource BTN_DISAMB_F = new Resource(112, 0, 14, 14); public static final Resource BTN_DISAMB_D = new Resource(242, 0, 14, 14); + public static final Resource BTN_IN_N = new Resource(126, 14, 14, 14); + public static final Resource BTN_IN_F = new Resource(126, 0, 14, 14); + public static final Resource BTN_IN_D = new Resource(200, 0, 14, 14); + public static final Resource BTN_OUT_N = new Resource(140, 14, 14, 14); + public static final Resource BTN_OUT_F = new Resource(140, 0, 14, 14); + public static final Resource BTN_OUT_D = new Resource(214, 0, 14, 14); + public static final Resource BTN_CAT_N = new Resource(154, 14, 14, 14); + public static final Resource BTN_CAT_F = new Resource(154, 0, 14, 14); + public static final Resource BTN_CAT_D = new Resource(200, 14, 14, 14); + public static final Resource BTN_LIST_N = new Resource(168, 14, 14, 14); + public static final Resource BTN_LIST_F = new Resource(168, 0, 14, 14); + public static final Resource BTN_LIST_D = new Resource(214, 14, 14, 14); public static final Resource WGT_BUTTON_N = new Resource(40, 232, 20, 20); public static final Resource WGT_BUTTON_F = new Resource(60, 232, 20, 20); public static final Resource WGT_BUTTON_D = new Resource(80, 232, 20, 20); diff --git a/src/main/java/me/towdium/jecalculation/gui/drawables/WContainer.java b/src/main/java/me/towdium/jecalculation/gui/drawables/WContainer.java index a6f72bf..f8431bb 100644 --- a/src/main/java/me/towdium/jecalculation/gui/drawables/WContainer.java +++ b/src/main/java/me/towdium/jecalculation/gui/drawables/WContainer.java @@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.gui.IWidget; +import me.towdium.jecalculation.utils.Utilities; import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; @@ -16,7 +17,6 @@ import java.util.List; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class WContainer implements IWidget { - boolean modified = false; protected List widgets = new ArrayList<>(); public void add(IWidget w) { @@ -63,4 +63,11 @@ public class WContainer implements IWidget { for (IWidget w : widgets) if (w.onScroll(gui, xMouse, yMouse, diff)) return true; return false; } + + @Override + public boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { + Utilities.ReversedIterator i = new Utilities.ReversedIterator<>(widgets); + while (i.hasNext()) if (i.next().onTooltip(gui, xMouse, yMouse, tooltip)) return true; + return false; + } } diff --git a/src/main/java/me/towdium/jecalculation/gui/drawables/WLabel.java b/src/main/java/me/towdium/jecalculation/gui/drawables/WLabel.java index bc98eb8..66bcbbe 100644 --- a/src/main/java/me/towdium/jecalculation/gui/drawables/WLabel.java +++ b/src/main/java/me/towdium/jecalculation/gui/drawables/WLabel.java @@ -2,16 +2,16 @@ package me.towdium.jecalculation.gui.drawables; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import me.towdium.jecalculation.data.label.ILabel; import me.towdium.jecalculation.gui.IWidget; import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.gui.Resource; -import me.towdium.jecalculation.data.label.ILabel; import me.towdium.jecalculation.utils.IllegalPositionException; import me.towdium.jecalculation.utils.Utilities; +import org.lwjgl.input.Keyboard; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.List; import java.util.stream.IntStream; /** @@ -49,8 +49,8 @@ public class WLabel implements IWidget { public void setLabel(ILabel label) { this.label = label; -// if (mode == enumMode.EDITOR || mode == enumMode.SELECTOR) -// notifyLsnr(); + // if (mode == enumMode.EDITOR || mode == enumMode.SELECTOR) + // notifyLsnr(); } @Override @@ -58,16 +58,11 @@ public class WLabel implements IWidget { gui.drawResourceContinuous(Resource.WGT_SLOT, xPos, yPos, xSize, ySize, 3, 3, 3, 3); label.drawLabel(gui, xPos + xSize / 2, yPos + ySize / 2, true); if (mode == enumMode.RESULT || mode == enumMode.EDITOR) - gui.drawText(xPos + xSize / 2.0f + 7.5f, yPos + ySize / 2 + 7 - - (int) (font.size * gui.getFontRenderer().FONT_HEIGHT), font, label.getAmountString()); + gui.drawText(xPos + xSize / 2.0f + 7.5f, + yPos + ySize / 2 + 7 - (int) (font.size * gui.getFontRenderer().FONT_HEIGHT), font, + label.getAmountString()); if (mouseIn(xMouse, yMouse)) { gui.drawRectangle(xPos + 1, yPos + 1, xSize - 2, ySize - 2, 0x80FFFFFF); - if (label != ILabel.EMPTY) { - ArrayList buf = new ArrayList<>(); - buf.add(label.getDisplayName()); - gui.drawTooltip(xMouse, yMouse, - label.getToolTip(buf, mode == enumMode.EDITOR || mode == enumMode.RESULT)); - } } if (mode == enumMode.EDITOR || mode == enumMode.SELECTOR) { timer.setState(gui.hand != ILabel.EMPTY); @@ -76,16 +71,26 @@ public class WLabel implements IWidget { } } + @Override + public boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { + if (mouseIn(xMouse, yMouse)) { + if (label != ILabel.EMPTY) { + tooltip.add(label.getDisplayName()); + label.getToolTip(tooltip, mode == enumMode.EDITOR || mode == enumMode.RESULT); + } + } + return false; + } + @Override public boolean onScroll(JecaGui gui, int xMouse, int yMouse, int diff) { if (mouseIn(xMouse, yMouse) && mode == enumMode.EDITOR && label != ILabel.EMPTY) { - IntStream.range(0, Math.abs(diff)).forEach(i -> { - if (JecaGui.isShiftDown()) label = diff > 0 ? label.increaseAmountLarge() : label.decreaseAmountLarge(); - else label = diff > 0 ? label.increaseAmount() : label.decreaseAmount(); - }); + IntStream.range(0, Math.abs(diff)) + .forEach(i -> label = diff > 0 ? label.increaseAmount() : label.decreaseAmount()); notifyLsnr(); return true; - } else return false; + } else + return false; } @@ -101,18 +106,18 @@ public class WLabel implements IWidget { return true; } else if (label != label.EMPTY) { if (button == 0) { - if (JecaGui.isShiftDown()) - label = label.increaseAmountLarge(); - else + if (JecaGui.isShiftDown()) gui.root.add(new WAmount()); + else { label = label.increaseAmount(); - notifyLsnr(); + notifyLsnr(); + } return true; } else if (button == 1) { - if (JecaGui.isShiftDown()) - label = label.decreaseAmountLarge(); - else + if (JecaGui.isShiftDown()) gui.root.add(new WAmount()); + else { label = label.decreaseAmount(); - notifyLsnr(); + notifyLsnr(); + } return true; } } else @@ -149,7 +154,8 @@ public class WLabel implements IWidget { } void notifyLsnr() { - if (lsnrUpdate != null) lsnrUpdate.run(); + if (lsnrUpdate != null) + lsnrUpdate.run(); } @@ -171,4 +177,49 @@ public class WLabel implements IWidget { */ SELECTOR } + + class WAmount extends WContainer { + public WAmount() { + WLabel w = WLabel.this; + int xAlign = w.xPos + w.xSize; + WLabel wl = new WLabel(w.xPos, w.yPos, w.xSize, w.ySize, enumMode.SELECTOR); + wl.setLabel(w.getLabel()); + WTextField wtf = new WTextField(xAlign + 10, w.yPos + w.ySize / 2 - WTextField.HEIGHT / 2, 50); + WButton wby = new WButtonIcon(xAlign + 60, w.yPos, 20, 20, Resource.BTN_YES_N, Resource.BTN_YES_F, + Resource.BTN_YES_D).setListenerLeft(() -> { + w.setLabel(wl.getLabel().setAmount( + wtf.getText().isEmpty() ? 0 : Integer.parseInt(wtf.getText()))); + JecaGui.getCurrent().root.remove(this); + }); + WButton wbn = new WButtonIcon(xAlign + 79, w.yPos, 20, 20, Resource.BTN_NO_N, Resource.BTN_NO_F) + .setListenerLeft(() -> { + w.setLabel(ILabel.EMPTY); + JecaGui.getCurrent().root.remove(this); + }); + wtf.setText(Integer.toString(w.getLabel().getAmount())); + wtf.setLsnrText(i -> { + try { + Integer.parseInt(wtf.getText()); + wtf.setColor(JecaGui.COLOR_TEXT_WHITE); + wby.setDisabled(false); + } catch (NumberFormatException e) { + boolean acceptable = wtf.getText().isEmpty(); + wtf.setColor(acceptable ? JecaGui.COLOR_TEXT_WHITE : JecaGui.COLOR_TEXT_RED); + wby.setDisabled(!acceptable); + } + }); + add(new WPanel(w.xPos - 5, w.yPos - 5, w.xSize + 110, w.ySize + 10)); + add(new WText(xAlign + 3, w.yPos + 5, JecaGui.Font.DEFAULT_NO_SHADOW, "x")); + addAll(wl, wtf, wby, wbn); + } + + @Override + public boolean onKey(JecaGui gui, char ch, int code) { + if (super.onKey(gui, ch, code)) return true; + if (code == Keyboard.KEY_ESCAPE) { + gui.root.remove(this); + return true; + } else return false; + } + } } diff --git a/src/main/java/me/towdium/jecalculation/gui/drawables/WPage.java b/src/main/java/me/towdium/jecalculation/gui/drawables/WPage.java index 965067f..18b63a6 100644 --- a/src/main/java/me/towdium/jecalculation/gui/drawables/WPage.java +++ b/src/main/java/me/towdium/jecalculation/gui/drawables/WPage.java @@ -2,13 +2,15 @@ package me.towdium.jecalculation.gui.drawables; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import me.towdium.jecalculation.data.label.ILabel; +import me.towdium.jecalculation.data.label.ILabel.RegistryEditor.Record; import me.towdium.jecalculation.gui.IWidget; import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.gui.Resource; -import me.towdium.jecalculation.data.label.ILabel; import me.towdium.jecalculation.utils.Utilities; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; /** * Author: towdium @@ -17,15 +19,13 @@ import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class WPage implements IWidget { - - protected int index; protected ILabel.RegistryEditor.Record record; protected Utilities.Timer timer = new Utilities.Timer(); protected boolean focused; protected Runnable listener; - public WPage(int index, ILabel.RegistryEditor.Record record, boolean focused) { + public WPage(int index, Record record, boolean focused) { this.index = index; this.record = record; this.focused = focused; @@ -33,22 +33,29 @@ public class WPage implements IWidget { @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - Resource resource = focused ? (index == 0 ? Resource.WGT_PAGER_F0 : Resource.WGT_PAGER_FN) - : Resource.WGT_PAGER_N; + Resource resource = focused ? + (index == 0 ? Resource.WGT_PAGER_F0 : Resource.WGT_PAGER_FN) : + Resource.WGT_PAGER_N; gui.drawResourceContinuous(resource, index * 24, -21, 24, 25, 4, 4, 4, 4); record.representation.drawLabel(gui, index * 24 + 4, -17, false); timer.setState(JecaGui.mouseIn(index * 24, -21, 24, 21, xMouse, yMouse)); - if (timer.getTime() > 1000) - gui.drawTooltip(xMouse, yMouse, Utilities.I18n.format("gui." + record.localizeKey)); } @Override public boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { boolean ret = JecaGui.mouseIn(index * 24, -21, 24, 21, xMouse, yMouse) && listener != null && !focused; - if (ret) listener.run(); + if (ret) + listener.run(); return ret; } + @Override + public boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { + if (timer.getTime() > 1000 && !focused) + tooltip.add(Utilities.I18n.format("gui." + record.localizeKey)); + return false; + } + public WPage setListener(Runnable r) { listener = r; return this; diff --git a/src/main/java/me/towdium/jecalculation/gui/drawables/WPanel.java b/src/main/java/me/towdium/jecalculation/gui/drawables/WPanel.java index 81d5e31..c9fa992 100644 --- a/src/main/java/me/towdium/jecalculation/gui/drawables/WPanel.java +++ b/src/main/java/me/towdium/jecalculation/gui/drawables/WPanel.java @@ -7,6 +7,7 @@ import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.gui.Resource; import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; /** * Author: towdium @@ -16,8 +17,33 @@ import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class WPanel implements IWidget { + int xPos, yPos, xSize, ySize; + + public WPanel(int xPos, int yPos, int xSize, int ySize) { + this.xPos = xPos; + this.yPos = yPos; + this.xSize = xSize; + this.ySize = ySize; + } + + public WPanel() { + this(0, 0, 176, 166); + } + + @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - gui.drawResourceContinuous(Resource.WGT_PANEL, 0, 0, gui.getXSize(), gui.getYSize(), 5, 5, 5, 5); + gui.drawResourceContinuous(Resource.WGT_PANEL, xPos, yPos, xSize, ySize, 5, 5, 5, 5); + } + + @Override + public boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { + return mouseIn(xMouse, yMouse); + } + + public boolean mouseIn(int x, int y) { + int xx = x - xPos; + int yy = y - yPos; + return xx >= 0 && xx < xSize && yy >= 0 && yy < ySize; } } diff --git a/src/main/java/me/towdium/jecalculation/gui/drawables/WTextField.java b/src/main/java/me/towdium/jecalculation/gui/drawables/WTextField.java index 6d59da5..4c6e87e 100644 --- a/src/main/java/me/towdium/jecalculation/gui/drawables/WTextField.java +++ b/src/main/java/me/towdium/jecalculation/gui/drawables/WTextField.java @@ -20,6 +20,7 @@ public class WTextField implements IWidget { public Consumer lsnrText; protected int xPos, yPos, xSize; GuiTextField textField; + public static final int HEIGHT = 20; public WTextField(int xPos, int yPos, int xSize) { this.xPos = xPos; diff --git a/src/main/java/me/towdium/jecalculation/gui/drawables/WTooltip.java b/src/main/java/me/towdium/jecalculation/gui/drawables/WTooltip.java index 40fec9e..fc58875 100644 --- a/src/main/java/me/towdium/jecalculation/gui/drawables/WTooltip.java +++ b/src/main/java/me/towdium/jecalculation/gui/drawables/WTooltip.java @@ -28,15 +28,18 @@ public abstract class WTooltip implements IWidget { @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - if (name != null) { - timer.setState(mouseIn(xMouse, yMouse)); - if (timer.getTime() > 500) { - String str = getSuffix().stream().map(s -> Utilities.I18n.search(String.join(".", "gui", name, s))) - .filter(p -> p.two).findFirst().map(p -> p.one) - .orElse(JecaGui.ALWAYS_TOOLTIP ? String.join(".", "gui", name, getSuffix().get(0)) : null); - if (str != null) gui.drawTooltip(xMouse, yMouse, str); - } + if (name != null) timer.setState(mouseIn(xMouse, yMouse)); + } + + @Override + public boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { + if (timer.getTime() > 500) { + String str = getSuffix().stream().map(s -> Utilities.I18n.search(String.join(".", "gui", name, s))) + .filter(p -> p.two).findFirst().map(p -> p.one) + .orElse(JecaGui.ALWAYS_TOOLTIP ? String.join(".", "gui", name, getSuffix().get(0)) : null); + if (str != null) tooltip.add(str); } + return false; } protected List getSuffix() { diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/GuiCalculator.java b/src/main/java/me/towdium/jecalculation/gui/guis/GuiCalculator.java index 38e3d14..122a48f 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiCalculator.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiCalculator.java @@ -20,8 +20,21 @@ import java.util.List; public class GuiCalculator extends WContainer { WLabelGroup wRecent = new WLabelGroup(7, 31, 8, 1, WLabel.enumMode.PICKER); WLabel wLabel = new WLabel(31, 7, 20, 20, WLabel.enumMode.SELECTOR); + WButton btnSteps = new WButtonIcon(64, 62, 20, 20, Resource.BTN_LIST_N, Resource.BTN_LIST_F, + Resource.BTN_LIST_D, "calculator.step").setListenerLeft(() -> setMode(enumMode.STEPS)); + WButton btnCatalyst = new WButtonIcon(45, 62, 20, 20, Resource.BTN_CAT_N, Resource.BTN_CAT_F, + Resource.BTN_CAT_D, "calculator.catalyst").setListenerLeft(() -> setMode(enumMode.CATALYST)); + WButton btnOutput = new WButtonIcon(26, 62, 20, 20, Resource.BTN_OUT_N, Resource.BTN_OUT_F, + Resource.BTN_OUT_D, "calculator.output").setListenerLeft(() -> setMode(enumMode.OUTPUT)); + WButton btnInput = new WButtonIcon(7, 62, 20, 20, Resource.BTN_IN_N, Resource.BTN_IN_F, + Resource.BTN_IN_D, "calculator.input").setListenerLeft(() -> setMode(enumMode.INPUT)); public GuiCalculator() { + wLabel.setLsnrUpdate(() -> { + Controller.setRecent(wLabel.label); + refreshRecent(); + }); + wRecent.setLsnrUpdate(l -> JecaGui.getCurrent().hand = wRecent.getLabelAt(l)); add(new WPanel()); add(new WTextField(61, 7, 64)); add(new WButtonIcon(7, 7, 20, 20, Resource.BTN_LABEL_N, Resource.BTN_LABEL_F, "calculator.label") @@ -33,25 +46,27 @@ public class GuiCalculator extends WContainer { .setListenerLeft(() -> JecaGui.displayGui(true, true, new GuiRecipe()))); add(new WButtonIcon(149, 7, 20, 20, Resource.BTN_SEARCH_N, Resource.BTN_SEARCH_F, "calculator.search") .setListenerLeft(() -> JecaGui.displayGui(new GuiSearch()))); - add(new WLabelGroup(7, 87, 9, 4, WLabel.enumMode.RESULT)); - add(wRecent); - add(wLabel); - add(new WLine(52)); + add(new WLine(55)); add(new WIcon(151, 31, 18, 18, Resource.ICN_RECENT_N, Resource.ICN_RECENT_F, "calculator.history")); - add(new WSwitcher(7, 56, 162, 5)); - refresh(); - List recent = Controller.getRecent(); - if (recent.size() > 0) wLabel.setLabel(Controller.getRecent().get(0)); - wLabel.setLsnrUpdate(() -> { - Controller.setRecent(wLabel.label); - refresh(); - }); - wRecent.setLsnrUpdate(l -> JecaGui.getCurrent().hand = wRecent.getLabelAt(l)); + add(new WLabelScroll(7, 87, 8, 4, WLabel.enumMode.RESULT, true)); + addAll(wRecent, wLabel, btnInput, btnOutput, btnCatalyst, btnSteps); + refreshRecent(); + setMode(enumMode.INPUT); } - void refresh() { + void setMode(enumMode mode) { + btnInput.setDisabled(mode == enumMode.INPUT); + btnOutput.setDisabled(mode == enumMode.OUTPUT); + btnCatalyst.setDisabled(mode == enumMode.CATALYST); + btnSteps.setDisabled(mode == enumMode.STEPS); + } + + void refreshRecent() { List recent = Controller.getRecent(); - if (recent.size() > 1) - wRecent.setLabel(recent.subList(1, recent.size()), 0); + if (recent.size() > 1) wRecent.setLabel(recent.subList(1, recent.size()), 0); + } + + enum enumMode { + INPUT, OUTPUT, CATALYST, STEPS } } diff --git a/src/main/resources/assets/jecalculation/textures/gui/resources.png b/src/main/resources/assets/jecalculation/textures/gui/resources.png index c8551fd91aea599866a615c80011f4c2c90c366b..8dc55ecb112bdd636f8bbce1e7a458f3c02eed76 100644 GIT binary patch literal 15402 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 Fe*h5c$`C51fuvkA2`x!hjcGHNtfwCSo#9)YMot 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