From ea1eab868530a8605e665eb424f33cce8b58534c Mon Sep 17 00:00:00 2001 From: Discreater Date: Sat, 1 May 2021 20:49:01 +0800 Subject: [PATCH] chore: clean up --- .../jecalculation/data/label/ILabel.java | 48 +++++---- .../data/label/labels/LFluidStack.java | 6 +- .../data/label/labels/LItemStack.java | 32 +++--- .../data/label/labels/LOreDict.java | 4 +- .../data/label/labels/LPlaceholder.java | 2 +- .../data/structure/CostList.java | 36 +++---- .../jecalculation/data/structure/Recipe.java | 4 +- .../jecalculation/gui/guis/GuiCalculator.java | 63 ++++++----- .../gui/guis/GuiDisambiguation.java | 22 ++-- .../jecalculation/gui/guis/GuiImport.java | 29 ++--- .../jecalculation/gui/guis/GuiLabel.java | 2 +- .../jecalculation/gui/guis/GuiRecipe.java | 101 ++++++++---------- .../jecalculation/gui/guis/GuiSearch.java | 23 ++-- .../gui/guis/pickers/PickerItemStack.java | 18 ++-- .../gui/guis/pickers/PickerPlaceholder.java | 18 ++-- .../gui/guis/pickers/PickerSimple.java | 7 +- .../jecalculation/gui/widgets/IWidget.java | 19 +++- .../jecalculation/gui/widgets/WButton.java | 29 ++--- .../jecalculation/gui/widgets/WContainer.java | 32 +++--- .../jecalculation/gui/widgets/WHelp.java | 37 ++++--- .../jecalculation/gui/widgets/WIcon.java | 3 +- .../jecalculation/gui/widgets/WLabel.java | 65 ++++++----- .../gui/widgets/WLabelGroup.java | 20 ++-- .../gui/widgets/WLabelScroll.java | 22 ++-- .../jecalculation/gui/widgets/WLine.java | 4 +- .../jecalculation/gui/widgets/WPage.java | 26 ++--- .../jecalculation/gui/widgets/WScroll.java | 12 ++- .../jecalculation/gui/widgets/WSearch.java | 4 +- .../jecalculation/gui/widgets/WSwitcher.java | 20 ++-- .../jecalculation/gui/widgets/WTextField.java | 14 +-- .../jecalculation/gui/widgets/WTick.java | 24 +++-- .../jecalculation/utils/Utilities.java | 30 ++++++ 32 files changed, 418 insertions(+), 358 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 ee78ec9..6e32044 100644 --- a/src/main/java/me/towdium/jecalculation/data/label/ILabel.java +++ b/src/main/java/me/towdium/jecalculation/data/label/ILabel.java @@ -83,7 +83,6 @@ public interface ILabel { boolean isPercent(); static void initServer() { - // TODO handle invalid items SERIALIZER.register(LFluidStack.IDENTIFIER, LFluidStack::new); SERIALIZER.register(LItemStack.IDENTIFIER, LItemStack::new); SERIALIZER.register(LOreDict.IDENTIFIER, LOreDict::new); @@ -121,13 +120,13 @@ public interface ILabel { * For registering, see {@link Serializer}. */ class Merger { - private HashMap, MergerFunction> functions = new HashMap<>(); + private Utilities.Relation functions = new Utilities.Relation<>(); private Merger() { } public void register(String a, String b, MergerFunction func) { - functions.put(new Pair<>(a, b), func); + functions.put(a, b, func); } /** @@ -140,22 +139,11 @@ public interface ILabel { * So generally speaking, a and b has no priority in this function */ public Optional merge(ILabel a, ILabel b) { - BiFunction get = (c, d) -> { - MergerFunction mf = functions.get(new Pair<>(c.getIdentifier(), d.getIdentifier())); - if (mf != null) return mf.merge(c, d); - else return null; - }; - return new Wrapper(null) - .or(() -> get.apply(a, b)) - .or(() -> get.apply(b, a)) - .ifPresent(i -> { - if (i != ILabel.EMPTY && (i == a || i == b)) - throw new RuntimeException("Merger should not modify the given label."); - }) - .toOptional(); + MergerFunction mf = functions.get(a.getIdentifier(), b.getIdentifier()); + if (mf == null) return Optional.empty(); + return Optional.ofNullable(mf.merge(a, b)); } - @FunctionalInterface public interface MergerFunction { /** @@ -205,12 +193,12 @@ public interface ILabel { public ILabel deserialize(NBTTagCompound nbt) { String s = nbt.getString(KEY_IDENTIFIER); Function func = idToData.get(s); - if (func != null) + if (func == null) JustEnoughCalculation.logger.warn("Unrecognized identifier \"" + s + "\", abort"); + else try { return func.apply(nbt.getCompoundTag(KEY_CONTENT)); - else { - JustEnoughCalculation.logger.warn("Unrecognized type identifier \"" + s + "\", use empty instead."); - return ILabel.EMPTY; + } catch (SerializationException ignored) { } + return EMPTY; } public NBTTagCompound serialize(ILabel label) { @@ -219,6 +207,13 @@ public interface ILabel { ret.setTag(KEY_CONTENT, label.toNbt()); return ret; } + + public static class SerializationException extends RuntimeException { + public SerializationException(String s) { + super(s); + JustEnoughCalculation.logger.warn(s); + } + } } /** @@ -431,9 +426,18 @@ public interface ILabel { } } + @Override + public int hashCode() { + return (int) (amount ^ (percent ? 1 : 0)); + } + protected static Merger.MergerFunction form(Class a, Class b, BiPredicate p) { return (c, d) -> { - if (c == EMPTY || d == EMPTY) return null; + if (a.isInstance(d) && b.isInstance(c)) { + ILabel tmp = c; + c = d; + d = tmp; + } if (a.isInstance(c) && b.isInstance(d) && p.test(c, d)) { long amountC = c.isPercent() ? c.getAmount() : Math.multiplyExact(c.getAmount(), 100); long amountD = d.isPercent() ? d.getAmount() : Math.multiplyExact(d.getAmount(), 100); 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 140edd1..92ac67d 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 @@ -55,8 +55,10 @@ public class LFluidStack extends ILabel.Impl { public LFluidStack(NBTTagCompound nbt) { super(nbt); - init(FluidRegistry.getFluid(nbt.getString(KEY_FLUID)), - nbt.hasKey(KEY_NBT) ? nbt.getCompoundTag(KEY_NBT) : null); + String id = nbt.getString(KEY_FLUID); + Fluid f = FluidRegistry.getFluid(id); + if (f == null) throw new Serializer.SerializationException("Fluid " + id + " cannot be resolved, ignoring"); + init(f, nbt.hasKey(KEY_NBT) ? nbt.getCompoundTag(KEY_NBT) : null); } private void init(Fluid fluid, @Nullable NBTTagCompound nbt) { 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 4d19f38..8a8da7c 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 @@ -47,9 +47,15 @@ public class LItemStack extends ILabel.Impl { public LItemStack(NBTTagCompound tag) { super(tag); - init(Item.getItemById(tag.getInteger(KEY_ITEM)), tag.getInteger(KEY_META), - tag.hasKey(KEY_NBT) ? tag.getCompoundTag(KEY_NBT) : null, tag.getBoolean(KEY_F_META), - tag.getBoolean(KEY_F_CAP), tag.getBoolean(KEY_F_NBT)); + String id = tag.getString(KEY_ITEM); + Item i = Item.getItemById(tag.getInteger(KEY_ITEM)); + if (i == null) throw new Serializer.SerializationException("Item " + id + " cannot be resolved, ignoring"); + init(i, tag.getInteger(KEY_META), + tag.hasKey(KEY_NBT) ? tag.getCompoundTag(KEY_NBT) : null, + tag.getBoolean(KEY_F_META), + tag.getBoolean(KEY_F_CAP), + tag.getBoolean(KEY_F_NBT) + ); } private LItemStack(LItemStack lis) { @@ -85,20 +91,12 @@ public class LItemStack extends ILabel.Impl { if (a instanceof LItemStack && b instanceof LItemStack) { LItemStack lisA = (LItemStack) a; LItemStack lisB = (LItemStack) b; - if (!lisA.fMeta && lisA.meta != WILDCARD_VALUE && lisA.meta != lisB.meta) - return false; - if (!lisA.fNbt) { - if (lisB.fNbt) - return false; - else if (lisA.nbt == null) { - if (lisB.nbt != null) - return false; - } else if (lisB.nbt == null || !lisA.nbt.equals(lisB.nbt)) - return false; - } - if (!lisA.fCap) { - if (lisB.fCap) - return false; + if (lisA.meta != lisB.meta && !lisA.fMeta && lisA.meta != WILDCARD_VALUE + && !lisB.fMeta && lisB.meta != WILDCARD_VALUE) return false; + if (!lisA.fNbt && !lisB.fNbt) { + if (lisA.nbt == null) { + if (lisB.nbt != null) return false; + } else if (lisB.nbt == null || !lisA.nbt.equals(lisB.nbt)) return false; } return lisA.item == lisB.item; } 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 b62c09c..eacd84d 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 @@ -90,8 +90,6 @@ public class LOreDict extends ILabel.Impl { if (a instanceof LOreDict && b instanceof LItemStack) { LOreDict lod = (LOreDict) a; LItemStack lis = (LItemStack) b; - if (lod.getAmount() > 0) - return false; return OreDictionary.getOres(lod.name).stream() .map(Converter::from) .anyMatch(i -> LItemStack.merge(i, lis)); @@ -200,7 +198,7 @@ public class LOreDict extends ILabel.Impl { @Override public int hashCode() { - return name.hashCode() ^ (int) amount; + return name.hashCode() ^ super.hashCode(); } public String getName() { 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 39c140b..c97e963 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 @@ -80,7 +80,7 @@ public class LPlaceholder extends ILabel.Impl { @Override public int hashCode() { - return name.hashCode() ^ (int) amount; + return name.hashCode() ^ super.hashCode(); } @Nullable diff --git a/src/main/java/me/towdium/jecalculation/data/structure/CostList.java b/src/main/java/me/towdium/jecalculation/data/structure/CostList.java index 1591128..2cd5720 100644 --- a/src/main/java/me/towdium/jecalculation/data/structure/CostList.java +++ b/src/main/java/me/towdium/jecalculation/data/structure/CostList.java @@ -2,6 +2,7 @@ package me.towdium.jecalculation.data.structure; import me.towdium.jecalculation.data.Controller; import me.towdium.jecalculation.data.label.ILabel; +import me.towdium.jecalculation.utils.Utilities; import me.towdium.jecalculation.utils.wrappers.Pair; import net.minecraft.client.Minecraft; import net.minecraft.util.ChatComponentTranslation; @@ -10,9 +11,11 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; -import static me.towdium.jecalculation.data.structure.Recipe.enumIoType.INPUT; -import static me.towdium.jecalculation.data.structure.Recipe.enumIoType.OUTPUT; +import static me.towdium.jecalculation.data.structure.Recipe.IO.INPUT; +import static me.towdium.jecalculation.data.structure.Recipe.IO.OUTPUT; +import static me.towdium.jecalculation.utils.Utilities.stream; // positive => generate; negative => require @ParametersAreNonnullByDefault @@ -135,7 +138,7 @@ public class CostList { else { set.add(result); procedure.add(new Pair<>(result, difference)); - addCatalyst(next.one.getLabel(Recipe.enumIoType.CATALYST)); + addCatalyst(next.one.getLabel(Recipe.IO.CATALYST)); next = find(true); } if (count++ > 1000) { @@ -148,8 +151,7 @@ public class CostList { @Nullable private Pair find(boolean reset) { - if (reset) - index = 0; + index = reset ? 0 : index + 1; List labels = getCurrent().labels; for (; index < labels.size(); index++) { ILabel label = labels.get(index); @@ -162,16 +164,12 @@ public class CostList { } private void addCatalyst(ILabel[] labels) { - LOOP: - for (ILabel i : labels) { - for (ILabel j : catalysts) { - if (j.matches(i)) { - j.setAmount(Math.max(i.getAmount(), j.getAmount())); - continue LOOP; - } - } - catalysts.add(i.copy()); - } + Arrays.stream(labels) + .filter(i -> i != ILabel.EMPTY) + .forEach(i -> catalysts.stream() + .filter(j -> j.matches(i)).findAny() + .map(j -> j.setAmount(Math.max(i.getAmount(), j.getAmount()))) + .orElseGet(Utilities.fake(() -> catalysts.add(i)))); } private CostList getCurrent() { @@ -190,13 +188,7 @@ public class CostList { public List getOutputs(List ignore) { return getCurrent().labels.stream() .map(i -> i.copy().multiply(-1)) - .map(i -> { - for (ILabel j : ignore) { - Optional merged = ILabel.MERGER.merge(i, j); - if (merged.isPresent()) i = merged.get(); - } - return i; - }) + .map(i -> ignore.stream().flatMap(j -> stream(ILabel.MERGER.merge(i, j))).findFirst().orElse(i)) .filter(i -> i != ILabel.EMPTY && i.getAmount() < 0) .map(i -> i.multiply(-1)) .collect(Collectors.toList()); diff --git a/src/main/java/me/towdium/jecalculation/data/structure/Recipe.java b/src/main/java/me/towdium/jecalculation/data/structure/Recipe.java index 5143713..2c66ea0 100644 --- a/src/main/java/me/towdium/jecalculation/data/structure/Recipe.java +++ b/src/main/java/me/towdium/jecalculation/data/structure/Recipe.java @@ -91,7 +91,7 @@ public class Recipe { return p.test(input, r.input) && p.test(catalyst, r.catalyst) && p.test(output, r.output); } - public ILabel[] getLabel(enumIoType type) { + public ILabel[] getLabel(IO type) { switch (type) { case INPUT: return input; @@ -148,7 +148,7 @@ public class Recipe { }).orElse(0L); } - public enum enumIoType { + public enum IO { INPUT, OUTPUT, CATALYST; public int getSize() { 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 b1ee5bb..b007f60 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiCalculator.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiCalculator.java @@ -28,50 +28,47 @@ import java.util.stream.Stream; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class GuiCalculator extends WContainer implements IGui { - enumMode mode = enumMode.INPUT; + Mode mode = Mode.INPUT; CostList.Calculator calculator = null; - WLabelGroup recent = new WLabelGroup(7, 31, 8, 1, WLabel.enumMode.PICKER); - WLabel label = new WLabel(31, 7, 20, 20, WLabel.enumMode.SELECTOR); - WLabelScroll result = new WLabelScroll(7, 87, 8, 4, WLabel.enumMode.RESULT, true); - WButton input = new WButtonIcon(7, 62, 20, 20, Resource.BTN_IN, "calculator.input") - .setLsnrLeft(() -> setMode(enumMode.INPUT)); - WButton output = new WButtonIcon(26, 62, 20, 20, Resource.BTN_OUT, "calculator.output") - .setLsnrLeft(() -> setMode(enumMode.OUTPUT)); - WButton catalyst = new WButtonIcon(45, 62, 20, 20, Resource.BTN_CAT, "calculator.catalyst") - .setLsnrLeft(() -> setMode(enumMode.CATALYST)); + WLabelGroup recent = new WLabelGroup(7, 31, 8, 1, WLabel.Mode.PICKER) + .setListener((i, v) -> JecaGui.getCurrent().hand = i.get(v)); + WLabelScroll result = new WLabelScroll(7, 87, 8, 4, WLabel.Mode.RESULT, true); WButton steps = new WButtonIcon(64, 62, 20, 20, Resource.BTN_LIST, "calculator.step") - .setLsnrLeft(() -> setMode(enumMode.STEPS)); - WTextField amount = new WTextField(60, 7, 65); + .setListener(i -> setMode(Mode.STEPS)); + WButton catalyst = new WButtonIcon(45, 62, 20, 20, Resource.BTN_CAT, "calculator.catalyst") + .setListener(i -> setMode(Mode.CATALYST)); + WButton output = new WButtonIcon(26, 62, 20, 20, Resource.BTN_OUT, "calculator.output") + .setListener(i -> setMode(Mode.OUTPUT)); + WButton input = new WButtonIcon(7, 62, 20, 20, Resource.BTN_IN, "calculator.input") + .setListener(i -> setMode(Mode.INPUT)); + WTextField amount = new WTextField(60, 7, 65).setText(Controller.getAmount()).setListener(i -> { + Controller.setAmount(i.getText()); + refreshCalculator(); + }); + WLabel label = new WLabel(31, 7, 20, 20, WLabel.Mode.SELECTOR).setListener((i, v) -> { + Controller.setRecent(v); + refreshRecent(); + refreshCalculator(); + }); public GuiCalculator() { - amount.setText(Controller.getAmount()); - label.setLsnrUpdate(() -> { - Controller.setRecent(label.label); - refreshRecent(); - refreshCalculator(); - }); - recent.setLsnrUpdate(l -> JecaGui.getCurrent().hand = recent.getLabelAt(l)); - amount.setLsnrText(s -> { - Controller.setAmount(s); - refreshCalculator(); - }); add(new WHelp("calculator")); add(new WPanel()); add(new WButtonIcon(7, 7, 20, 20, Resource.BTN_LABEL, "calculator.label") - .setLsnrLeft(() -> JecaGui.displayGui(new GuiLabel(l -> { + .setListener(i -> JecaGui.displayGui(new GuiLabel(l -> { JecaGui.displayParent(); JecaGui.getCurrent().hand = l; })))); add(new WButtonIcon(130, 7, 20, 20, Resource.BTN_NEW, "calculator.recipe") - .setLsnrLeft(() -> JecaGui.displayGui(true, true, new GuiRecipe()))); + .setListener(i -> JecaGui.displayGui(true, true, new GuiRecipe()))); add(new WButtonIcon(149, 7, 20, 20, Resource.BTN_SEARCH, "calculator.search") - .setLsnrLeft(() -> JecaGui.displayGui(new GuiSearch()))); + .setListener(i -> JecaGui.displayGui(new GuiSearch()))); add(new WText(53, 13, JecaGui.Font.PLAIN, "x")); add(new WLine(55)); add(new WIcon(151, 31, 18, 18, Resource.ICN_RECENT, "calculator.history")); addAll(recent, label, input, output, catalyst, steps, result, amount); refreshRecent(); - setMode(enumMode.INPUT); + setMode(Mode.INPUT); } @Override @@ -79,12 +76,12 @@ public class GuiCalculator extends WContainer implements IGui { refreshCalculator(); } - void setMode(enumMode mode) { + void setMode(Mode mode) { this.mode = mode; - input.setDisabled(mode == enumMode.INPUT); - output.setDisabled(mode == enumMode.OUTPUT); - catalyst.setDisabled(mode == enumMode.CATALYST); - steps.setDisabled(mode == enumMode.STEPS); + input.setDisabled(mode == Mode.INPUT); + output.setDisabled(mode == Mode.OUTPUT); + catalyst.setDisabled(mode == Mode.CATALYST); + steps.setDisabled(mode == Mode.STEPS); refreshResult(); } @@ -141,7 +138,7 @@ public class GuiCalculator extends WContainer implements IGui { } } - enum enumMode { + enum Mode { INPUT, OUTPUT, CATALYST, STEPS } } diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/GuiDisambiguation.java b/src/main/java/me/towdium/jecalculation/gui/guis/GuiDisambiguation.java index e50f982..82780e8 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiDisambiguation.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiDisambiguation.java @@ -11,6 +11,9 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; import java.util.function.Consumer; +import static me.towdium.jecalculation.gui.Resource.ICN_LABEL; +import static me.towdium.jecalculation.gui.Resource.ICN_LIST; + /** * Author: towdium * Date: 17-9-16. @@ -18,26 +21,23 @@ import java.util.function.Consumer; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class GuiDisambiguation extends IPicker.Impl implements IGui { - protected WLabelScroll lsUp; - protected WLabelScroll lsDown; - protected WSwitcher switcher; + protected WLabelScroll lsUp = new WLabelScroll(25, 48, 7, 3, WLabel.Mode.PICKER, true); + protected WLabelScroll lsDown = new WLabelScroll(25, 105, 7, 3, WLabel.Mode.PICKER, true); protected List> record; public GuiDisambiguation(List> record) { this.record = record; - lsUp = new WLabelScroll(25, 48, 7, 3, WLabel.enumMode.PICKER, true); - lsDown = new WLabelScroll(25, 105, 7, 3, WLabel.enumMode.PICKER, true); - switcher = new WSwitcher(7, 7, 162, this.record.size()).setListener(() -> setPage(switcher.getIndex())); - Consumer consumer = i -> callback.accept(i.copy().multiply(-1)); - + WSwitcher switcher = new WSwitcher(7, 7, 162, this.record.size()).setListener(i -> setPage(i.getIndex())); + ListenerValue consumer = (i, v) -> callback.accept(v.copy().multiply(-1)); add(new WPanel()); - add(new WIcon(7, 48, 18, 54, Resource.ICN_LIST, "disambiguation.list")); - add(new WIcon(7, 105, 18, 54, Resource.ICN_LABEL, "disambiguation.label")); - add(new WSearch(25, 24, 90, lsUp.setLsnrUpdate(consumer), lsDown.setLsnrUpdate(consumer))); + add(new WIcon(7, 48, 18, 54, ICN_LIST, "disambiguation.list")); + add(new WIcon(7, 105, 18, 54, ICN_LABEL, "disambiguation.label")); + add(new WSearch(25, 24, 90, lsUp.setListener(consumer), lsDown.setListener(consumer))); addAll(switcher, lsUp, lsDown); setPage(0); } + protected void setPage(int n) { lsUp.setLabels(record.get(n)); lsDown.setLabels(ILabel.CONVERTER.guess(record.get(n))); diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/GuiImport.java b/src/main/java/me/towdium/jecalculation/gui/guis/GuiImport.java index 7e545a1..a91ac34 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiImport.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiImport.java @@ -15,7 +15,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import static me.towdium.jecalculation.utils.Utilities.I18n.contains; - +import static me.towdium.jecalculation.gui.Resource.BTN_YES; +import static me.towdium.jecalculation.gui.Resource.ICN_TEXT; /** * Author: Towdium * Date: 18-12-6 @@ -26,23 +27,23 @@ public class GuiImport extends WContainer implements IGui, ISearchable { List> filtered; WSearch search = new WSearch(25, 25, 90, this); WSwitcher page; - WButton confirm = new WButtonIcon(149, 25, 20, 20, Resource.BTN_YES, "common.confirm").setDisabled(true) - .setLsnrLeft(() -> { - data.stream().filter(i -> i.one).forEach(i -> Controller.inport(i.four, i.three)); - JecaGui.displayParent(); - }); + WButton confirm = new WButtonIcon(149, 25, 20, 20, BTN_YES, "common.confirm").setDisabled(true) + .setListener(i -> { + data.stream().filter(j -> j.one).forEach(j -> Controller.inport(j.four, j.three)); + JecaGui.displayParent(); + }); List> content = new ArrayList<>(); public GuiImport() { add(new WPanel()); - add(new WIcon(7, 25, 20, 20, Resource.ICN_TEXT, "common.search")); + add(new WIcon(7, 25, 20, 20, ICN_TEXT, "common.search")); addAll(search, confirm); IntStream.range(0, 7).forEach(i -> { WTick tick = new WTick(7, 49 + 16 * i, 13, 13, "import.tick").setDisabled(true) - .setListener(j -> { - filtered.get(page.getIndex() * 7 + i).one = j; - confirm.setDisabled(data.stream().noneMatch(k -> k.one)); - }); + .setListener(j -> { + filtered.get(page.getIndex() * 7 + i).one = j.selected(); + confirm.setDisabled(data.stream().noneMatch(k -> k.one)); + }); WText text = new WTextExpand(49 + 16 * i, ""); addAll(tick, text); content.add(new Pair<>(tick, text)); @@ -76,10 +77,10 @@ public class GuiImport extends WContainer implements IGui, ISearchable { public boolean setFilter(String s) { if (s.isEmpty()) filtered = new ArrayList<>(data); else filtered = data.stream() - .filter(i -> contains(i.two, s) || contains(i.three, s)) - .collect(Collectors.toList()); + .filter(i -> contains(i.two, s) || contains(i.three, s)) + .collect(Collectors.toList()); remove(page); - page = new WSwitcher(7, 7, 162, (filtered.size() + 6) / 7).setListener(this::refresh); + page = new WSwitcher(7, 7, 162, (filtered.size() + 6) / 7).setListener(i -> refresh()); add(page); refresh(); return !filtered.isEmpty(); diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/GuiLabel.java b/src/main/java/me/towdium/jecalculation/gui/guis/GuiLabel.java index ab4b52c..b87e398 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiLabel.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiLabel.java @@ -37,7 +37,7 @@ public class GuiLabel extends WContainer implements IGui { Wrapper index = new Wrapper<>(0); ILabel.EDITOR.getRecords().forEach(r -> { int i = index.value; - add(new WPage(i, r, false).setListener(() -> refresh(i))); + add(new WPage(i, r, false).setListener(j -> refresh(i))); index.value += 1; }); addAll(new WHelp("label"), new WPanel()); diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/GuiRecipe.java b/src/main/java/me/towdium/jecalculation/gui/guis/GuiRecipe.java index dfaf83c..644b7ff 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiRecipe.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiRecipe.java @@ -17,6 +17,7 @@ import net.minecraft.item.ItemStack; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; +import static me.towdium.jecalculation.gui.Resource.*; /** * Author: towdium @@ -27,34 +28,33 @@ public class GuiRecipe extends WContainer implements IGui { HashMap> disambiguation = new HashMap<>(); WSwitcher switcherGroup = new WSwitcher(7, 7, 162, Controller.getGroups()); WTextField textField = new WTextField(49, 33, 119); - WButton buttonCopy = new WButtonIcon(83, 33, 20, 20, Resource.BTN_COPY, "recipe.copy").setLsnrLeft(() -> { + WLabelGroup groupCatalyst = new WLabelGroup(28, 87, 7, 1, 20, 20, WLabel.Mode.EDITOR); + WButton buttonDisamb = new WButtonIcon(121, 33, 20, 20, BTN_DISAMB, "recipe.disamb").setListener(i -> { + if (disambiguation != null) JecaGui.displayGui(new GuiDisambiguation(new ArrayList<>(disambiguation.values())) + .setCallback(l -> { + JecaGui.displayParent(); + JecaGui.getCurrent().hand = l; + })); + }); + WLabelGroup groupInput = new WLabelGroup(28, 111, 7, 2, 20, 20, WLabel.Mode.EDITOR).setListener((i, v) -> { + disambiguation.remove(v); + refresh(); + }); + WLabelGroup groupOutput = new WLabelGroup(28, 63, 7, 1, 20, 20, WLabel.Mode.EDITOR).setListener((i, v) -> { + disambiguation.remove(v + 21); + refresh(); + }); + WButton buttonClear = new WButtonIcon(64, 33, 20, 20, BTN_DEL, "recipe.clear").setListener(i -> clear()); + WButton buttonCopy = new WButtonIcon(83, 33, 20, 20, BTN_COPY, "recipe.copy").setListener(i -> { Controller.addRecipe(switcherGroup.getText(), toRecipe()); JecaGui.displayParent(); }); - - WLabelGroup groupCatalyst = new WLabelGroup(28, 87, 7, 1, 20, 20, WLabel.enumMode.EDITOR); - WButton buttonDisamb = new WButtonIcon(121, 33, 20, 20, Resource.BTN_DISAMB, "recipe.disamb").setLsnrLeft(() -> { - if (disambiguation != null) - JecaGui.displayGui(new GuiDisambiguation(new ArrayList<>(disambiguation.values())).setCallback(l -> { - JecaGui.displayParent(); - JecaGui.getCurrent().hand = l; - })); - }); - WLabelGroup groupInput = new WLabelGroup(28, 111, 7, 2, 20, 20, WLabel.enumMode.EDITOR).setLsnrUpdate(i -> { - disambiguation.remove(i); - refresh(); - }); - WLabelGroup groupOutput = new WLabelGroup(28, 63, 7, 1, 20, 20, WLabel.enumMode.EDITOR).setLsnrUpdate(i -> { - disambiguation.remove(i + 21); - refresh(); - }); - WButton buttonClear = new WButtonIcon(64, 33, 20, 20, Resource.BTN_DEL, "recipe.clear").setLsnrLeft(this::clear); - WButton buttonLabel = new WButtonIcon(45, 33, 20, 20, Resource.BTN_LABEL, "recipe.label") - .setLsnrLeft(() -> JecaGui.displayGui(new GuiLabel((l) -> { - JecaGui.displayParent(); - JecaGui.getCurrent().hand = l; - }))); - WButton buttonSave = new WButtonIcon(26, 33, 20, 20, Resource.BTN_SAVE, "recipe.save").setLsnrLeft(() -> { + WButton buttonLabel = new WButtonIcon(45, 33, 20, 20, BTN_LABEL, "recipe.label").setListener(i -> + JecaGui.displayGui(new GuiLabel((l) -> { + JecaGui.displayParent(); + JecaGui.getCurrent().hand = l; + }))); + WButton buttonSave = new WButtonIcon(26, 33, 20, 20, BTN_SAVE, "recipe.save").setListener(i -> { if (dest == null) Controller.addRecipe(switcherGroup.getText(), toRecipe()); else { @@ -67,24 +67,17 @@ public class GuiRecipe extends WContainer implements IGui { } JecaGui.displayParent(); }); - - WButton buttonDel = new WButtonIcon(102, 33, 20, 20, Resource.BTN_NO, "recipe.delete").setLsnrLeft(() -> { + WButton buttonDel = new WButtonIcon(102, 33, 20, 20, BTN_NO, "recipe.delete").setListener(i -> { Controller.removeRecipe(dest.one, dest.two); JecaGui.displayParent(); }); - WButton buttonNew = new WButtonIcon(7, 33, 20, 20, Resource.BTN_NEW, "recipe.new") - .setLsnrLeft(() -> setModeNewGroup(true)); - WButton buttonYes = new WButtonIcon(7, 33, 20, 20, Resource.BTN_YES, "recipe.confirm").setDisabled(true) - .setLsnrLeft(() -> { - switcherGroup.setTemp( - textField - .getText()); - textField.setText(""); - setModeNewGroup(false); - }); - WButton buttonNo = new WButtonIcon(26, 33, 20, 20, Resource.BTN_NO, "recipe.cancel") - .setLsnrLeft(() -> setModeNewGroup(false)); - + WButton buttonYes = new WButtonIcon(7, 33, 20, 20, BTN_YES, "recipe.confirm").setDisabled(true).setListener(i -> { + switcherGroup.setTemp(textField.getText()); + textField.setText(""); + setNewGroup(false); + }); + WButton buttonNo = new WButtonIcon(26, 33, 20, 20, BTN_NO, "recipe.cancel").setListener(i -> setNewGroup(false)); + WButton buttonNew = new WButtonIcon(7, 33, 20, 20, BTN_NEW, "recipe.new").setListener(i -> setNewGroup(true)); public GuiRecipe(String group, int index) { this(); @@ -98,21 +91,20 @@ public class GuiRecipe extends WContainer implements IGui { public GuiRecipe() { addAll(new WHelp("recipe"), new WPanel()); - add(new WIcon(7, 63, 21, 20, Resource.ICN_OUTPUT, "recipe.output")); - add(new WIcon(7, 87, 21, 20, Resource.ICN_CATALYST, "recipe.catalyst")); - add(new WIcon(7, 111, 21, 40, Resource.ICN_INPUT, "recipe.input")); + add(new WIcon(7, 63, 21, 20, ICN_OUTPUT, "recipe.output")); + add(new WIcon(7, 87, 21, 20, ICN_CATALYST, "recipe.catalyst")); + add(new WIcon(7, 111, 21, 40, ICN_INPUT, "recipe.input")); add(new WLine(57)); addAll(groupInput, groupCatalyst, groupOutput, switcherGroup); - if (switcherGroup.getTexts().isEmpty()) - switcherGroup.setTemp(Utilities.I18n.format("common.default")); - setModeNewGroup(false); + if (switcherGroup.getTexts().isEmpty()) switcherGroup.setTemp(Utilities.I18n.format("common.default")); + setNewGroup(false); buttonCopy.setDisabled(true); buttonDel.setDisabled(true); buttonDisamb.setDisabled(true); - textField.setLsnrText(s -> buttonYes.setDisabled(s.isEmpty())); + textField.setListener(i -> buttonYes.setDisabled(i.getText().isEmpty())); } - public void setModeNewGroup(boolean b) { + public void setNewGroup(boolean b) { if (b) { removeAll(buttonNew, buttonLabel, buttonClear, buttonCopy, buttonSave, buttonDisamb, buttonDel); addAll(buttonYes, buttonNo, textField); @@ -188,13 +180,12 @@ public class GuiRecipe extends WContainer implements IGui { } void fromRecipe(Recipe r) { - groupInput.setLabel( - Arrays.stream(r.getLabel(Recipe.enumIoType.INPUT)).map(ILabel::copy).collect(Collectors.toList()), 0); - groupCatalyst.setLabel( - Arrays.stream(r.getLabel(Recipe.enumIoType.CATALYST)).map(ILabel::copy).collect(Collectors.toList()), - 0); - groupOutput.setLabel( - Arrays.stream(r.getLabel(Recipe.enumIoType.OUTPUT)).map(ILabel::copy).collect(Collectors.toList()), 0); + groupInput.setLabel(Arrays.stream(r.getLabel(Recipe.IO.INPUT)) + .map(ILabel::copy).collect(Collectors.toList()), 0); + groupCatalyst.setLabel(Arrays.stream(r.getLabel(Recipe.IO.CATALYST)) + .map(ILabel::copy).collect(Collectors.toList()), 0); + groupOutput.setLabel(Arrays.stream(r.getLabel(Recipe.IO.OUTPUT)) + .map(ILabel::copy).collect(Collectors.toList()), 0); } diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/GuiSearch.java b/src/main/java/me/towdium/jecalculation/gui/guis/GuiSearch.java index 1add347..2e2ec2c 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/GuiSearch.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/GuiSearch.java @@ -14,24 +14,25 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import static me.towdium.jecalculation.gui.Resource.*; +import static me.towdium.jecalculation.gui.widgets.WLabel.Mode.PICKER; public class GuiSearch extends WContainer implements IGui { List> content; WSwitcher group; - WLabelScroll labels; WButton export; + WLabelScroll labels = new WLabelScroll(7, 51, 8, 6, PICKER, true).setListener((i, v) -> content.stream() + .filter(j -> j.one.getRep() == v) + .findFirst() + .ifPresent(j -> JecaGui.displayGui(true, true, new GuiRecipe(j.two, j.three)))); + public GuiSearch() { - labels = new WLabelScroll(7, 51, 8, 6, WLabel.enumMode.PICKER, true); - labels.setLsnrUpdate(i -> content.stream() - .filter(j -> j.one.getRep() == i) - .findFirst() - .ifPresent(j -> JecaGui.displayGui(true, true, new GuiRecipe(j.two, j.three)))); add(new WPanel()); add(new WSearch(25, 25, 90, labels)); - add(new WIcon(7, 25, 20, 20, Resource.ICN_TEXT, "common.search")); - add(new WButtonIcon(131, 25, 20, 20, Resource.BTN_IN, "search.import") - .setLsnrLeft(() -> JecaGui.displayGui(new GuiImport()))); + add(new WIcon(7, 25, 20, 20, ICN_TEXT, "common.search")); + add(new WButtonIcon(131, 25, 20, 20, BTN_IN, "search.import") + .setListener(i -> JecaGui.displayGui(new GuiImport()))); add(labels); } @@ -52,7 +53,7 @@ public class GuiSearch extends WContainer implements IGui { name = Controller.getGroups().get(iGroup - 1); recipes = Controller.getRecipes(name); } - export = new WButtonIcon(149, 25, 20, 20, Resource.BTN_OUT, tooltip).setLsnrLeft(() -> { + export = new WButtonIcon(149, 25, 20, 20, BTN_OUT, tooltip).setListener(i -> { File f = iGroup == 0 ? Controller.export() : Controller.export(name); Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentTranslation( "jecalculation.chat.export", f.getAbsolutePath())); @@ -68,7 +69,7 @@ public class GuiSearch extends WContainer implements IGui { groups.addAll(Controller.getGroups()); int index = group == null ? 0 : group.getIndex(); if (index >= groups.size()) index = groups.size() - 1; - group = new WSwitcher(7, 7, 162, groups).setListener(this::refresh); + group = new WSwitcher(7, 7, 162, groups).setListener(i -> refresh()); group.setIndex(index); addAll(group); refresh(); diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerItemStack.java b/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerItemStack.java index 89913ab..6cfa0bf 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerItemStack.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerItemStack.java @@ -13,6 +13,8 @@ import me.towdium.jecalculation.gui.widgets.WLabel; import javax.annotation.ParametersAreNonnullByDefault; import java.util.function.Consumer; +import static me.towdium.jecalculation.gui.Resource.*; + /** * Author: Towdium * Date: 18-9-18 @@ -20,14 +22,14 @@ import java.util.function.Consumer; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class PickerItemStack extends IPicker.Impl implements IGui { - WLabel label = new WLabel(7, 7, 20, 20, WLabel.enumMode.SELECTOR).setLsnrUpdate(this::update); - WButton bConfirm = new WButtonIcon(149, 7, 20, 20, Resource.BTN_YES).setLsnrLeft(() -> callback.accept(label.getLabel())); - WButton bNbtF = new WButtonIcon(49, 7, 20, 20, Resource.BTN_NBT_F).setLsnrLeft(() -> setFNbt(false)); - WButton bBbtN = new WButtonIcon(49, 7, 20, 20, Resource.BTN_NBT_N).setLsnrLeft(() -> setFNbt(true)); - WButton bCapF = new WButtonIcon(68, 7, 20, 20, Resource.BTN_CAP_F).setLsnrLeft(() -> setFCap(false)); - WButton bCapN = new WButtonIcon(68, 7, 20, 20, Resource.BTN_CAP_N).setLsnrLeft(() -> setFCap(true)); - WButton bMetaF = new WButtonIcon(30, 7, 20, 20, Resource.BTN_META_F).setLsnrLeft(() -> setFMeta(false)); - WButton bMetaN = new WButtonIcon(30, 7, 20, 20, Resource.BTN_META_N).setLsnrLeft(() -> setFMeta(true)); + WLabel label = new WLabel(7, 7, 20, 20, WLabel.Mode.SELECTOR).setListener((i, v) -> update()); + WButton bConfirm = new WButtonIcon(149, 7, 20, 20, BTN_YES).setListener(i -> callback.accept(label.getLabel())); + WButton bBbtN = new WButtonIcon(49, 7, 20, 20, BTN_NBT_N).setListener(i -> setFNbt(true)); + WButton bNbtF = new WButtonIcon(49, 7, 20, 20, BTN_NBT_F).setListener(i -> setFNbt(false)); + WButton bCapN = new WButtonIcon(68, 7, 20, 20, BTN_CAP_N).setListener(i -> setFCap(true)); + WButton bCapF = new WButtonIcon(68, 7, 20, 20, BTN_CAP_F).setListener(i -> setFCap(false)); + WButton bMetaN = new WButtonIcon(30, 7, 20, 20, BTN_META_N).setListener(i -> setFMeta(true)); + WButton bMetaF = new WButtonIcon(30, 7, 20, 20, BTN_META_F).setListener(i -> setFMeta(false)); public PickerItemStack() { addAll(label, bConfirm); diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerPlaceholder.java b/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerPlaceholder.java index 8344085..3765013 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerPlaceholder.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerPlaceholder.java @@ -9,6 +9,10 @@ import me.towdium.jecalculation.gui.guis.IGui; import me.towdium.jecalculation.gui.widgets.*; import javax.annotation.ParametersAreNonnullByDefault; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_TEXT_RED; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_TEXT_WHITE; +import static me.towdium.jecalculation.gui.Resource.BTN_YES; +import static me.towdium.jecalculation.gui.Resource.ICN_TEXT; /** * Author: towdium @@ -18,15 +22,15 @@ import javax.annotation.ParametersAreNonnullByDefault; @SideOnly(Side.CLIENT) public class PickerPlaceholder extends IPicker.Impl implements IGui { public PickerPlaceholder() { - WLabelScroll scroll = new WLabelScroll(7, 69, 8, 5, WLabel.enumMode.PICKER, true) - .setLabels(LPlaceholder.getRecent()).setLsnrUpdate(this::notifyLsnr); - WTextField create = new WTextField(26, 7, 69); - create.setLsnrText(s -> create.setColor(s.equals("") ? JecaGui.COLOR_TEXT_RED : JecaGui.COLOR_TEXT_WHITE)); + WLabelScroll scroll = new WLabelScroll(7, 69, 8, 5, WLabel.Mode.PICKER, true) + .setLabels(LPlaceholder.getRecent()).setListener((i, v) -> notifyLsnr(v)); + WTextField create = new WTextField(26, 7, 69) + .setListener(i -> i.setColor(i.getText().equals("") ? COLOR_TEXT_RED : COLOR_TEXT_WHITE)); add(new WSearch(26, 45, 90, scroll)); - add(new WIcon(7, 45, 20, 20, Resource.ICN_TEXT, "picker_placeholder.text_search")); - add(new WIcon(7, 7, 20, 20, Resource.ICN_TEXT, "picker_placeholder.text_create")); + add(new WIcon(7, 45, 20, 20, ICN_TEXT, "picker_placeholder.text_search")); + add(new WIcon(7, 7, 20, 20, ICN_TEXT, "picker_placeholder.text_create")); add(new WLine(36)); - add(new WButtonIcon(95, 7, 20, 20, Resource.BTN_YES).setLsnrLeft(() -> { + add(new WButtonIcon(95, 7, 20, 20, BTN_YES).setListener(i -> { if (!create.getText().equals("")) callback.accept(new LPlaceholder(create.getText(), 1)); })); addAll(scroll, create); diff --git a/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerSimple.java b/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerSimple.java index 19c28c3..c2503a5 100644 --- a/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerSimple.java +++ b/src/main/java/me/towdium/jecalculation/gui/guis/pickers/PickerSimple.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import static me.towdium.jecalculation.gui.Resource.ICN_TEXT; /** * Author: towdium @@ -30,10 +31,10 @@ public class PickerSimple extends IPicker.Impl implements IGui { * entire key should be "gui.l18nKey.help.tooltip" */ public PickerSimple(List labels, String l18nKey) { - WLabelScroll ls = new WLabelScroll(7, 33, 8, 7, WLabel.enumMode.PICKER, true) - .setLabels(labels).setLsnrUpdate(this::notifyLsnr); + WLabelScroll ls = new WLabelScroll(7, 33, 8, 7, WLabel.Mode.PICKER, true).setLabels(labels) + .setListener((i, v) -> notifyLsnr(v)); add(new WSearch(26, 7, 90, ls)); - add(new WIcon(7, 7, 20, 20, Resource.ICN_TEXT, l18nKey + ".text")); + add(new WIcon(7, 7, 20, 20, ICN_TEXT, l18nKey + ".text")); add(ls); } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/IWidget.java b/src/main/java/me/towdium/jecalculation/gui/widgets/IWidget.java index 80aef6b..aae70e9 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/IWidget.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/IWidget.java @@ -1,12 +1,14 @@ package me.towdium.jecalculation.gui.widgets; +import me.towdium.jecalculation.data.label.ILabel; import me.towdium.jecalculation.gui.JecaGui; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; @ParametersAreNonnullByDefault -public interface IWidget { // TODO unify listener behavior when manually set and pass instance to listener +public interface IWidget { void onDraw(JecaGui gui, int xMouse, int yMouse); default boolean onTooltip(JecaGui gui, int xMouse, int yMouse, List tooltip) { @@ -24,4 +26,19 @@ public interface IWidget { // TODO unify listener behavior when manually set and default boolean onScroll(JecaGui gui, int xMouse, int yMouse, int diff) { return false; } + + @Nullable + default ILabel getLabelUnderMouse(int xMouse, int yMouse) { + return null; + } + + @FunctionalInterface + interface ListenerValue { + void invoke(W widget, V value); + } + + @FunctionalInterface + interface ListenerAction { + void invoke(W widget); + } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WButton.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WButton.java index 9987cda..e7a98ea 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WButton.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WButton.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.gui.Resource; import me.towdium.jecalculation.utils.ClientUtils; -import me.towdium.jecalculation.utils.Utilities; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -13,6 +12,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import static me.towdium.jecalculation.gui.Resource.*; + /** * Author: towdium * Date: 17-8-17. @@ -21,8 +22,7 @@ import java.util.List; @SideOnly(Side.CLIENT) public abstract class WButton extends WTooltip { protected int xPos, yPos, xSize, ySize; - protected Runnable lsnrLeft, lsnrRight; - protected Utilities.Timer timer = new Utilities.Timer(); + protected ListenerAction listener; protected boolean disabled; public WButton(int xPos, int yPos, int xSize, int ySize, @Nullable String name) { @@ -33,26 +33,21 @@ public abstract class WButton extends WTooltip { this.ySize = ySize; } - public WButton setLsnrLeft(Runnable r) { - lsnrLeft = r; - return this; - } - - public WButton setLsnrRight(Runnable r) { - lsnrRight = r; + public WButton setListener(ListenerAction r) { + listener = r; return this; } protected Resource getDisabled() { - return Resource.WGT_BUTTON_D; + return WGT_BUTTON_D; } protected Resource getNormal() { - return Resource.WGT_BUTTON_N; + return WGT_BUTTON_N; } protected Resource getFocused() { - return Resource.WGT_BUTTON_F; + return WGT_BUTTON_F; } @Override @@ -66,14 +61,10 @@ public abstract class WButton extends WTooltip { @Override public boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { if (!disabled && JecaGui.mouseIn(xPos + 1, yPos + 1, xSize - 2, ySize - 2, xMouse, yMouse)) { - if (button == 0 && lsnrLeft != null) { - lsnrLeft.run(); + if (button == 0 && listener != null) { + listener.invoke(this); ClientUtils.playClickSound(1.0F); return true; - } else if (button == 1 && lsnrRight != null) { - lsnrLeft.run(); - ClientUtils.playClickSound(0.8F); - return true; } } return false; diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WContainer.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WContainer.java index 548fd35..8983080 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WContainer.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WContainer.java @@ -2,12 +2,15 @@ package me.towdium.jecalculation.gui.widgets; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import me.towdium.jecalculation.data.label.ILabel; import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.utils.Utilities; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * Author: towdium @@ -47,29 +50,34 @@ public class WContainer implements IContainer { @Override public boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { - Utilities.ReversedIterator i = new Utilities.ReversedIterator<>(widgets); - while (i.hasNext()) if (i.next().onClicked(gui, xMouse, yMouse, button)) return true; - return false; + return new Utilities.ReversedIterator<>(widgets).stream() + .anyMatch(i -> i.onClicked(gui, xMouse, yMouse, button)); } @Override public boolean onKey(JecaGui gui, char ch, int code) { - Utilities.ReversedIterator i = new Utilities.ReversedIterator<>(widgets); - while (i.hasNext()) if (i.next().onKey(gui, ch, code)) return true; - return false; + return new Utilities.ReversedIterator<>(widgets).stream() + .anyMatch(i -> i.onKey(gui, ch, code)); } @Override public boolean onScroll(JecaGui gui, int xMouse, int yMouse, int diff) { - Utilities.ReversedIterator i = new Utilities.ReversedIterator<>(widgets); - while (i.hasNext()) if (i.next().onScroll(gui, xMouse, yMouse, diff)) return true; - return false; + return new Utilities.ReversedIterator<>(widgets).stream() + .anyMatch(i -> i.onScroll(gui, xMouse, yMouse, diff)); } @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; + return new Utilities.ReversedIterator<>(widgets).stream() + .anyMatch(i -> i.onTooltip(gui, xMouse, yMouse, tooltip)); + } + + @Nullable + @Override + public ILabel getLabelUnderMouse(int xMouse, int yMouse) { + return new Utilities.ReversedIterator<>(widgets).stream() + .map(i -> i.getLabelUnderMouse(xMouse, yMouse)) + .filter(Objects::nonNull) + .findFirst().orElse(null); } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WHelp.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WHelp.java index 2c58a0d..db41e7f 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WHelp.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WHelp.java @@ -1,7 +1,6 @@ package me.towdium.jecalculation.gui.widgets; import me.towdium.jecalculation.gui.JecaGui; -import me.towdium.jecalculation.gui.Resource; import me.towdium.jecalculation.utils.Utilities.I18n; import org.lwjgl.input.Keyboard; @@ -9,6 +8,10 @@ import javax.annotation.ParametersAreNonnullByDefault; import java.util.ArrayList; import java.util.List; +import static me.towdium.jecalculation.gui.JecaGui.Font.PLAIN; +import static me.towdium.jecalculation.gui.JecaGui.Font.SHADOW; +import static me.towdium.jecalculation.gui.Resource.*; + /** * Author: Towdium * Date: 18-9-23 @@ -24,8 +27,8 @@ public class WHelp extends WTooltip { @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - gui.drawResourceContinuous(Resource.WGT_PANEL_N, -21, 0, 25, 24, 4); - gui.drawResource(Resource.WGT_HELP_N, -19, 2); + gui.drawResourceContinuous(WGT_PANEL_N, -21, 0, 25, 24, 4); + gui.drawResource(WGT_HELP_N, -19, 2); } @Override @@ -36,7 +39,8 @@ public class WHelp extends WTooltip { @Override public boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { boolean ret = mouseIn(xMouse, yMouse); - if (ret) gui.root.add(new Doc()); + if (ret) + gui.root.add(new Doc()); return ret; } @@ -44,14 +48,15 @@ public class WHelp extends WTooltip { public Doc() { Text tContent = new Text(); WSwitcher sPage = new WSwitcher(7, 146, 162, tContent.amount()); - sPage.setListener(() -> tContent.setPage(sPage.getIndex())); - WText tTitle = new WText(7, 7, JecaGui.Font.SHADOW, I18n.format("gui." + WHelp.this.key + ".title")); + sPage.setListener(i -> tContent.setPage(i.getIndex())); + WText tTitle = new WText(7, 7, SHADOW, I18n.format("gui." + WHelp.this.key + ".title")); addAll(new WPanel(), new Icon(), tTitle, tContent, sPage); } @Override public boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { - if (!super.onClicked(gui, xMouse, yMouse, button)) gui.root.remove(this); + if (!super.onClicked(gui, xMouse, yMouse, button)) + gui.root.remove(this); return true; } @@ -79,12 +84,13 @@ public class WHelp extends WTooltip { count++; } } - if (!tmp.isEmpty()) pages.add(tmp); + if (!tmp.isEmpty()) + pages.add(tmp); } @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - gui.drawSplitText(7, 21, JecaGui.Font.PLAIN, pages.get(page)); + gui.drawSplitText(7, 21, PLAIN, pages.get(page)); } public int amount() { @@ -103,14 +109,15 @@ public class WHelp extends WTooltip { @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - gui.drawResourceContinuous(Resource.WGT_HELP_B, -21, 0, 25, 24, 4); - gui.drawResource(Resource.WGT_HELP_F, -19, 2); + gui.drawResourceContinuous(WGT_HELP_B, -21, 0, 25, 24, 4); + gui.drawResource(WGT_HELP_F, -19, 2); } @Override public boolean onClicked(JecaGui gui, int xMouse, int yMouse, int button) { boolean ret = mouseIn(xMouse, yMouse); - if (ret) gui.root.remove(Doc.this); + if (ret) + gui.root.remove(Doc.this); return ret; } @@ -121,11 +128,13 @@ public class WHelp extends WTooltip { @Override public boolean onKey(JecaGui gui, char ch, int code) { - if (super.onKey(gui, ch, code)) return true; + if (super.onKey(gui, ch, code)) + return true; if (code == Keyboard.KEY_ESCAPE) { gui.root.remove(Doc.this); return true; - } else return false; + } else + return false; } } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WIcon.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WIcon.java index abfcc1d..7e84754 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WIcon.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WIcon.java @@ -7,6 +7,7 @@ import me.towdium.jecalculation.gui.Resource; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_GUI_GREY; /** @@ -41,7 +42,7 @@ public class WIcon extends WTooltip { @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { super.onDraw(gui, xMouse, yMouse); - gui.drawRectangle(xPos, yPos, xSize, ySize, JecaGui.COLOR_GUI_GREY); + gui.drawRectangle(xPos, yPos, xSize, ySize, COLOR_GUI_GREY); Resource r = mouseIn(xMouse, yMouse) ? focused : normal; gui.drawResource(r, (xSize - r.getXSize()) / 2 + xPos, (ySize - r.getYSize()) / 2 + yPos); } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WLabel.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WLabel.java index ddad905..a07da9b 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WLabel.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WLabel.java @@ -11,11 +11,17 @@ import me.towdium.jecalculation.utils.IllegalPositionException; import me.towdium.jecalculation.utils.Utilities; import org.lwjgl.input.Keyboard; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; import java.util.stream.IntStream; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_TEXT_RED; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_TEXT_WHITE; import static me.towdium.jecalculation.gui.JecaGui.Font.HALF; +import static me.towdium.jecalculation.gui.JecaGui.Font.PLAIN; +import static me.towdium.jecalculation.gui.Resource.BTN_NO; +import static me.towdium.jecalculation.gui.Resource.BTN_YES; /** * Author: towdium @@ -26,11 +32,12 @@ import static me.towdium.jecalculation.gui.JecaGui.Font.HALF; public class WLabel implements IWidget { public int xPos, yPos, xSize, ySize; public ILabel label; - public enumMode mode; - public Runnable lsnrUpdate; + public Mode mode; + public ListenerValue listener; protected Utilities.Timer timer = new Utilities.Timer(); - public WLabel(int xPos, int yPos, int xSize, int ySize, enumMode mode) { + + public WLabel(int xPos, int yPos, int xSize, int ySize, Mode mode) { this.xPos = xPos; this.yPos = yPos; this.xSize = xSize; @@ -51,12 +58,12 @@ public class WLabel implements IWidget { public void onDraw(JecaGui gui, int xMouse, int yMouse) { 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) { - String s = label.getAmountString(mode == enumMode.RESULT); + if (mode == Mode.RESULT || mode == Mode.EDITOR) { + String s = label.getAmountString(mode == Mode.RESULT); gui.drawText(xPos + xSize / 2.0f + 8 - HALF.getTextWidth(s), yPos + ySize / 2.0f + 8.5f - HALF.getTextHeight(), HALF, s); } - if (mode == enumMode.EDITOR || mode == enumMode.SELECTOR) { + if (mode == Mode.EDITOR || mode == Mode.SELECTOR) { timer.setState(gui.hand != ILabel.EMPTY); int color = 0xFFFFFF + (int) ((-Math.cos(timer.getTime() * Math.PI / 1500) + 1) * 0x40) * 0x1000000; gui.drawRectangle(xPos + 1, yPos + 1, xSize - 2, ySize - 2, color); @@ -71,16 +78,16 @@ public class WLabel implements IWidget { return false; if (label != ILabel.EMPTY) { tooltip.add(label.getDisplayName()); - label.getToolTip(tooltip, mode == enumMode.EDITOR || mode == enumMode.RESULT); + label.getToolTip(tooltip, mode == Mode.EDITOR || mode == Mode.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 -> label = diff > 0 ? label.increaseAmount() : label.decreaseAmount()); + if (mouseIn(xMouse, yMouse) && mode == Mode.EDITOR && label != ILabel.EMPTY) { + for (int i = 0; i < Math.abs(diff); i++) + label = diff > 0 ? label.increaseAmount() : label.decreaseAmount(); notifyLsnr(); return true; } else @@ -133,8 +140,8 @@ public class WLabel implements IWidget { } } - public WLabel setLsnrUpdate(Runnable lsnr) { - lsnrUpdate = lsnr; + public WLabel setListener(ListenerValue listener) { + this.listener = listener; return this; } @@ -145,12 +152,11 @@ public class WLabel implements IWidget { } void notifyLsnr() { - if (lsnrUpdate != null) - lsnrUpdate.run(); + if (listener != null) listener.invoke(this, label); } - public enum enumMode { + public enum Mode { EDITOR, // Slots in editor gui. Can use to edit amount. Exact amount displayed. RESULT, // Slots to display calculate/getRecipes result. Rounded amount displayed. PICKER, // Slots that can pick items from. No amount displayed. @@ -159,17 +165,18 @@ public class WLabel implements IWidget { class WAmount extends WContainer { - WLabel wl = new WLabel(xPos, yPos, xSize, ySize, enumMode.SELECTOR).setLsnrUpdate(this::update); + WButton bAmount = new WButtonText(xPos + xSize + 60, yPos, 20, 20, "general.to_percent", "#") + .setListener(i -> setPercent(true)); WTextField wtf = new WTextField(xPos + xSize + 10, yPos + ySize / 2 - WTextField.HEIGHT / 2, 50); WButton bPercent = new WButtonText(xPos + xSize + 60, yPos, 20, 20, "general.to_percent", "%") - .setLsnrLeft(() -> setPercent(false)); - WButton bAmount = new WButtonText(xPos + xSize + 60, yPos, 20, 20, "general.to_percent", "#") - .setLsnrLeft(() -> setPercent(true)); - WButton bYes = new WButtonIcon(xPos + xSize + 83, yPos, 20, 20, Resource.BTN_YES).setLsnrLeft(() -> { - setLabel(wl.getLabel().setAmount(wtf.getText().isEmpty() ? 0 : Integer.parseInt(wtf.getText()))); + .setListener(i -> setPercent(false)); + WLabel wl = new WLabel(xPos, yPos, xSize, ySize, Mode.SELECTOR).setListener((i, v) -> update()); + WButton bYes = new WButtonIcon(xPos + xSize + 83, yPos, 20, 20, BTN_YES).setListener(i -> { + setLabel(wl.getLabel().setAmount( + wtf.getText().isEmpty() ? 0 : Integer.parseInt(wtf.getText()))); JecaGui.getCurrent().root.remove(this); }); - WButton bNo = new WButtonIcon(xPos + xSize + 102, yPos, 20, 20, Resource.BTN_NO).setLsnrLeft(() -> { + WButton bNo = new WButtonIcon(xPos + xSize + 102, yPos, 20, 20, BTN_NO).setListener(i -> { setLabel(ILabel.EMPTY); JecaGui.getCurrent().root.remove(this); }); @@ -177,16 +184,16 @@ public class WLabel implements IWidget { public WAmount() { wl.setLabel(label); add(new WPanel(xPos - 5, yPos - 5, xSize + 133, ySize + 10)); - add(new WText(xPos + xSize + 3, yPos + 5, JecaGui.Font.PLAIN, "x")); + add(new WText(xPos + xSize + 3, yPos + 5, PLAIN, "x")); addAll(wl, wtf, bYes, bNo); - wtf.setLsnrText(i -> { + wtf.setListener(i -> { try { Integer.parseInt(wtf.getText()); - wtf.setColor(JecaGui.COLOR_TEXT_WHITE); + wtf.setColor(COLOR_TEXT_WHITE); bYes.setDisabled(false); } catch (NumberFormatException e) { boolean acceptable = wtf.getText().isEmpty(); - wtf.setColor(acceptable ? JecaGui.COLOR_TEXT_WHITE : JecaGui.COLOR_TEXT_RED); + wtf.setColor(acceptable ? COLOR_TEXT_WHITE : COLOR_TEXT_RED); bYes.setDisabled(!acceptable); } }); @@ -222,4 +229,10 @@ public class WLabel implements IWidget { return false; } } + + @Nullable + @Override + public ILabel getLabelUnderMouse(int xMouse, int yMouse) { + return mouseIn(xMouse, yMouse) ? label : null; + } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelGroup.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelGroup.java index a403d59..4fdb7fe 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelGroup.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelGroup.java @@ -21,30 +21,26 @@ import java.util.stream.IntStream; @SideOnly(Side.CLIENT) public class WLabelGroup extends WContainer { ArrayList labels = new ArrayList<>(); - Consumer lsnrUpdate; + ListenerValue listener; - public WLabelGroup(int xPos, int yPos, int column, int row, WLabel.enumMode mode) { + public WLabelGroup(int xPos, int yPos, int column, int row, WLabel.Mode mode) { this(xPos, yPos, column, row, 18, 18, mode); } - public WLabelGroup(int xPos, int yPos, int column, int row, int xSize, int ySize, WLabel.enumMode mode) { + public WLabelGroup(int xPos, int yPos, int column, int row, int xSize, int ySize, WLabel.Mode mode) { IntStream.range(0, row).forEach(r -> IntStream.range(0, column).forEach(c -> { - WLabel l = new WLabel(xPos + c * xSize, yPos + r * ySize, xSize, ySize, mode).setLsnrUpdate(() -> { - if (lsnrUpdate != null) lsnrUpdate.accept(r * column + c); + WLabel l = new WLabel(xPos + c * xSize, yPos + r * ySize, xSize, ySize, mode).setListener((i, v) -> { + if (listener != null) listener.invoke(this, r * column + c); }); labels.add(l); add(l); })); } - public ILabel getLabelAt(int index) { + public ILabel get(int index) { return labels.get(index).getLabel(); } - public Optional getLabelAt(int xMouse, int yMouse) { - return labels.stream().filter(w -> w.mouseIn(xMouse, yMouse)).findFirst().map(WLabel::getLabel); - } - public List getLabels() { return labels.stream().map(WLabel::getLabel).collect(Collectors.toList()); } @@ -57,8 +53,8 @@ public class WLabelGroup extends WContainer { for (WLabel label : this.labels) label.setLabel(start < labels.size() ? labels.get(start++) : ILabel.EMPTY); } - public WLabelGroup setLsnrUpdate(Consumer listener) { - lsnrUpdate = listener; + public WLabelGroup setListener(ListenerValue listener) { + this.listener = listener; return this; } } \ No newline at end of file diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelScroll.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelScroll.java index 2035427..0197a7c 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelScroll.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WLabelScroll.java @@ -25,18 +25,17 @@ public class WLabelScroll extends WContainer implements ISearchable { protected WScroll scroll; protected int xPos, yPos, column, row, current; protected String filter = ""; - protected Consumer lsnrUpdate; + protected ListenerValue listener; - public WLabelScroll(int xPos, int yPos, int column, int row, WLabel.enumMode mode, boolean drawConnection) { + public WLabelScroll(int xPos, int yPos, int column, int row, WLabel.Mode mode, boolean drawConnection) { this.xPos = xPos; this.yPos = yPos; this.column = column; this.row = row; - labelGroup = new WLabelGroup(xPos, yPos, column, row, mode) - .setLsnrUpdate(i -> { - if (lsnrUpdate != null) lsnrUpdate.accept(labels.get(i + current * column)); - }); - scroll = new WScroll(xPos + column * 18 + 4, yPos, row * 18).setLsnrScroll(this::update); + labelGroup = new WLabelGroup(xPos, yPos, column, row, mode).setListener((i, v) -> { + if (listener != null) listener.invoke(this, i.get(v)); + }); + scroll = new WScroll(xPos + column * 18 + 4, yPos, row * 18).setListener(i -> update(i.getCurrent())); add(labelGroup); add(scroll); if (drawConnection) add(new WRectangle(xPos + column * 18, yPos, 4, row * 18, JecaGui.COLOR_GUI_GREY)); @@ -82,16 +81,11 @@ public class WLabelScroll extends WContainer implements ISearchable { } @SuppressWarnings("UnusedReturnValue") - public WLabelScroll setLsnrUpdate(Consumer lsnr) { - lsnrUpdate = lsnr; + public WLabelScroll setListener(ListenerValue listener) { + this.listener = listener; return this; } - public ILabel getLabelAt(int index) { - return labelGroup.getLabelAt(index - current * column); - } - - private int getStepAmount() { int line = (labels.size() + column - 1) / column; return Math.max(line - row + 1, 1); diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WLine.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WLine.java index ecb0106..df3394c 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WLine.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WLine.java @@ -6,7 +6,7 @@ import me.towdium.jecalculation.gui.JecaGui; import me.towdium.jecalculation.gui.Resource; import javax.annotation.ParametersAreNonnullByDefault; - +import static me.towdium.jecalculation.gui.Resource.WGT_LINE; /** * Author: towdium * Date: 17-8-18. @@ -22,6 +22,6 @@ public class WLine implements IWidget { @Override public void onDraw(JecaGui gui, int xMouse, int yMouse) { - gui.drawResource(Resource.WGT_LINE, 6, y - 1); + gui.drawResource(WGT_LINE, 6, y - 1); } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WPage.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WPage.java index 84b4894..94013ce 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WPage.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WPage.java @@ -10,6 +10,7 @@ import me.towdium.jecalculation.utils.Utilities; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; +import static me.towdium.jecalculation.gui.Resource.*; /** * Author: towdium @@ -17,14 +18,14 @@ import java.util.List; */ @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) -public class WPage implements IWidget { +public class WPage extends WTooltip { protected int index; - protected ILabel.RegistryEditor.Record record; - protected Utilities.Timer timer = new Utilities.Timer(); + protected Record record; protected boolean focused; - protected Runnable listener; + protected ListenerAction listener; public WPage(int index, Record record, boolean focused) { + super(record.localizeKey); this.index = index; this.record = record; this.focused = focused; @@ -32,30 +33,25 @@ 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_PANEL_N; + Resource resource = focused ? (index == 0 ? WGT_PAGER_F0 : WGT_PAGER_FN) : WGT_PANEL_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)); + super.onDraw(gui, xMouse, yMouse); } @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.invoke(this); 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 boolean mouseIn(int xMouse, int yMouse) { + return JecaGui.mouseIn(index * 24, -21, 24, 21, xMouse, yMouse); } - public WPage setListener(Runnable r) { + public WPage setListener(ListenerAction r) { listener = r; return this; } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WScroll.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WScroll.java index 51214b0..321dea0 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WScroll.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WScroll.java @@ -19,7 +19,7 @@ import java.util.function.Consumer; @SideOnly(Side.CLIENT) public class WScroll implements IWidget { public int xPos, yPos, ySize, current; - public Consumer lsnrScroll; + public ListenerAction listener; protected boolean drag; public WScroll(int xPos, int yPos, int ySize) { @@ -48,7 +48,11 @@ public class WScroll implements IWidget { current = pos; if (current < 0) current = 0; if (current > ySize - 17) current = ySize - 17; - if (notify && lsnrScroll != null) lsnrScroll.accept(current / (ySize - 17f)); + if (notify && listener != null) listener.invoke(this); + } + + public float getCurrent() { + return current / (ySize - 17f); } public void setCurrent(float ratio) { @@ -59,8 +63,8 @@ public class WScroll implements IWidget { return JecaGui.mouseIn(xPos + 1, yPos + 1, 12, ySize - 2, xMouse, yMouse); } - public WScroll setLsnrScroll(@Nullable Consumer lsnrScroll) { - this.lsnrScroll = lsnrScroll; + public WScroll setListener(@Nullable ListenerAction listener) { + this.listener = listener; return this; } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WSearch.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WSearch.java index ee1d48e..6a3ddf8 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WSearch.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WSearch.java @@ -7,6 +7,8 @@ import me.towdium.jecalculation.data.label.ILabel; import javax.annotation.ParametersAreNonnullByDefault; import java.util.function.Consumer; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_TEXT_RED; +import static me.towdium.jecalculation.gui.JecaGui.COLOR_TEXT_WHITE; /** * Author: towdium @@ -31,6 +33,6 @@ public class WSearch extends WTextField { public void refresh() { boolean b = false; for (ISearchable i : lss) if (i.setFilter(textField.getText())) b = true; - setColor(b ? JecaGui.COLOR_TEXT_WHITE : JecaGui.COLOR_TEXT_RED); + setColor(b ? COLOR_TEXT_WHITE : COLOR_TEXT_RED); } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WSwitcher.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WSwitcher.java index a8b9439..4743b59 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WSwitcher.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WSwitcher.java @@ -12,6 +12,12 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; + +import static me.towdium.jecalculation.gui.JecaGui.COLOR_GUI_GREY; +import static me.towdium.jecalculation.gui.JecaGui.Font.SHADOW; +import static me.towdium.jecalculation.gui.Resource.WGT_ARR_L; +import static me.towdium.jecalculation.gui.Resource.WGT_ARR_R; + /** * Author: towdium * Date: 17-8-19. @@ -21,7 +27,7 @@ import java.util.stream.IntStream; @SideOnly(Side.CLIENT) public class WSwitcher extends WContainer { public static final int SIZE = 13; - public Runnable listener; + public ListenerAction listener; protected int xPos, xSize, yPos; protected WButton left, right; protected WRectangle wRect; @@ -40,16 +46,16 @@ public class WSwitcher extends WContainer { this.xSize = xSize; this.yPos = yPos; this.keys = keys; - left = new WButtonIcon(xPos, yPos, SIZE, SIZE, Resource.WGT_ARR_L).setLsnrLeft(() -> { + left = new WButtonIcon(xPos, yPos, SIZE, SIZE, WGT_ARR_L).setListener(i -> { if (temp == null) move(false); else setTemp(null); }); - right = new WButtonIcon(xPos + xSize - SIZE, yPos, SIZE, SIZE, Resource.WGT_ARR_R).setLsnrLeft(() -> { + right = new WButtonIcon(xPos + xSize - SIZE, yPos, SIZE, SIZE, WGT_ARR_R).setListener(i -> { if (temp == null) move(true); else setTemp(null); }); - wRect = new WRectangle(xPos + SIZE, yPos, xSize - 2 * SIZE, SIZE, JecaGui.COLOR_GUI_GREY); - wText = new WText(xPos + SIZE, yPos + 2, xSize - 2 * SIZE, JecaGui.Font.SHADOW, "", true); + wRect = new WRectangle(xPos + SIZE, yPos, xSize - 2 * SIZE, SIZE, COLOR_GUI_GREY); + wText = new WText(xPos + SIZE, yPos + 2, xSize - 2 * SIZE, SHADOW, "", true); index = new Circulator(keys.size()); refresh(); addAll(left, right, wRect, wText); @@ -68,7 +74,7 @@ public class WSwitcher extends WContainer { refresh(); } - public WSwitcher setListener(Runnable listener) { + public WSwitcher setListener(ListenerAction listener) { this.listener = listener; return this; } @@ -106,6 +112,6 @@ public class WSwitcher extends WContainer { } public void notifyLsnr() { - if (listener != null) listener.run(); + if (listener != null) listener.invoke(this); } } diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WTextField.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WTextField.java index 10c1efd..1e77937 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WTextField.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WTextField.java @@ -16,7 +16,7 @@ import java.util.function.Consumer; @ParametersAreNonnullByDefault @SideOnly(Side.CLIENT) public class WTextField implements IWidget { - public Consumer lsnrText; + public ListenerAction listener; protected int xPos, yPos, xSize; GuiTextField textField; public static final int HEIGHT = 20; @@ -50,14 +50,14 @@ public class WTextField implements IWidget { return textField.getText(); } - public void setText(String s) { + public WTextField setText(String s) { textField.setText(s); - notifyLsnr(); + return this; } @SuppressWarnings("UnusedReturnValue") - public WTextField setLsnrText(Consumer lsnrText) { - this.lsnrText = lsnrText; + public WTextField setListener(ListenerAction listener) { + this.listener = listener; return this; } @@ -67,6 +67,6 @@ public class WTextField implements IWidget { } protected void notifyLsnr() { - if (lsnrText != null) lsnrText.accept(textField.getText()); + if (listener != null) listener.invoke(this); } -} +} \ No newline at end of file diff --git a/src/main/java/me/towdium/jecalculation/gui/widgets/WTick.java b/src/main/java/me/towdium/jecalculation/gui/widgets/WTick.java index 52e02ed..ad00f5c 100644 --- a/src/main/java/me/towdium/jecalculation/gui/widgets/WTick.java +++ b/src/main/java/me/towdium/jecalculation/gui/widgets/WTick.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; +import static me.towdium.jecalculation.gui.Resource.*; + /** * Author: Towdium * Date: 18-12-7 @@ -18,7 +20,8 @@ public class WTick extends WContainer { int xPos, yPos, xSize, ySize; String name; boolean disabled; - Consumer lsnr; + ListenerAction listener; + public WTick(int xPos, int yPos, int xSize, int ySize, @Nullable String name) { this.xPos = xPos; @@ -35,11 +38,10 @@ public class WTick extends WContainer { return this; } - public WTick setListener(Consumer listener) { - lsnr = listener; + public WTick setListener(ListenerAction listener) { + this.listener = listener; return this; } - public boolean selected() { return !(button instanceof Normal); } @@ -56,9 +58,9 @@ public class WTick extends WContainer { private class Normal extends WButton { public Normal(int xPos, int yPos, int xSize, int ySize, @Nullable String name) { super(xPos, yPos, xSize, ySize, name + ".normal"); - lsnrLeft = () -> { + listener = i -> { setSelected(true); - lsnr.accept(true); + WTick.this.listener.invoke(WTick.this); }; disabled = WTick.this.disabled; } @@ -72,26 +74,26 @@ public class WTick extends WContainer { private class Selected extends WButton { public Selected(int xPos, int yPos, int xSize, int ySize, @Nullable String name) { super(xPos, yPos, xSize, ySize, name + ".selected"); - lsnrLeft = () -> { + listener = i -> { setSelected(false); - lsnr.accept(false); + WTick.this.listener.invoke(WTick.this); }; disabled = WTick.this.disabled; } @Override protected Resource getDisabled() { - return Resource.WGT_BUTTON_S_D; + return WGT_BUTTON_S_D; } @Override protected Resource getNormal() { - return Resource.WGT_BUTTON_S_N; + return WGT_BUTTON_S_N; } @Override protected Resource getFocused() { - return Resource.WGT_BUTTON_S_F; + return WGT_BUTTON_S_F; } @Override diff --git a/src/main/java/me/towdium/jecalculation/utils/Utilities.java b/src/main/java/me/towdium/jecalculation/utils/Utilities.java index f458c9b..d5d7100 100644 --- a/src/main/java/me/towdium/jecalculation/utils/Utilities.java +++ b/src/main/java/me/towdium/jecalculation/utils/Utilities.java @@ -32,6 +32,7 @@ import java.util.*; import java.util.function.BiFunction; import java.util.function.BiPredicate; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -56,6 +57,18 @@ public class Utilities { else return form.apply(f / (float) Math.pow(1000, scale), size - 1) + suffix[scale - 1]; } + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + public static Stream stream(Optional o) { + return o.map(Stream::of).orElse(Stream.empty()); + } + + public static Supplier fake(Runnable r) { + return () -> { + r.run(); + return null; + }; + } + // MOD NAME @Nullable @@ -78,6 +91,23 @@ public class Utilities { return NBTHelper.getOrCreateSubCompound(is, JustEnoughCalculation.Reference.MODID); } + public static class Relation { + public HashMap, V> data = new HashMap<>(); + + public void put(K a, K b, V v) { + Pair pair = new Pair<>(a, b); + V tmp = data.get(pair); + data.put(tmp == null ? new Pair<>(b, a) : pair, v); + } + + @Nullable + public V get(K a, K b) { + V ret = data.get(new Pair<>(a, b)); + if (ret == null) data.get(new Pair<>(b, a)); + return ret; + } + } + public static class Timer { long time = System.currentTimeMillis(); boolean running = false;