diff --git a/src/main/java/betterquesting/api/questing/ISearchable.java b/src/main/java/betterquesting/api/questing/ISearchable.java new file mode 100644 index 000000000..77114a715 --- /dev/null +++ b/src/main/java/betterquesting/api/questing/ISearchable.java @@ -0,0 +1,10 @@ +package betterquesting.api.questing; + +import java.util.List; + +public interface ISearchable { + + default List getTextForSearch() { + return null; + } +} diff --git a/src/main/java/betterquesting/api/questing/rewards/IReward.java b/src/main/java/betterquesting/api/questing/rewards/IReward.java index 7ede37132..e6e024c38 100644 --- a/src/main/java/betterquesting/api/questing/rewards/IReward.java +++ b/src/main/java/betterquesting/api/questing/rewards/IReward.java @@ -1,6 +1,7 @@ package betterquesting.api.questing.rewards; import betterquesting.api.questing.IQuest; +import betterquesting.api.questing.ISearchable; import betterquesting.api2.client.gui.misc.IGuiRect; import betterquesting.api2.client.gui.panels.IGuiPanel; import betterquesting.api2.storage.DBEntry; @@ -14,7 +15,7 @@ import javax.annotation.Nullable; -public interface IReward extends INBTSaveLoad { +public interface IReward extends INBTSaveLoad, ISearchable { String getUnlocalisedName(); ResourceLocation getFactoryID(); diff --git a/src/main/java/betterquesting/api/questing/tasks/ITask.java b/src/main/java/betterquesting/api/questing/tasks/ITask.java index ce0d32f89..3a6193684 100644 --- a/src/main/java/betterquesting/api/questing/tasks/ITask.java +++ b/src/main/java/betterquesting/api/questing/tasks/ITask.java @@ -1,6 +1,7 @@ package betterquesting.api.questing.tasks; import betterquesting.api.questing.IQuest; +import betterquesting.api.questing.ISearchable; import betterquesting.api2.client.gui.misc.IGuiRect; import betterquesting.api2.client.gui.panels.IGuiPanel; import betterquesting.api2.storage.DBEntry; @@ -17,7 +18,7 @@ import java.util.List; import java.util.UUID; -public interface ITask extends INBTSaveLoad, INBTProgress { +public interface ITask extends INBTSaveLoad, INBTProgress, ISearchable { String getUnlocalisedName(); ResourceLocation getFactoryID(); @@ -48,8 +49,4 @@ default boolean ignored(UUID uuid) { default boolean displaysCenteredAlone() { return false; } - - default List getTextForSearch() { - return null; - } } diff --git a/src/main/java/betterquesting/api2/client/gui/controls/PanelTextField.java b/src/main/java/betterquesting/api2/client/gui/controls/PanelTextField.java index 2d221e6d6..d6920d14a 100644 --- a/src/main/java/betterquesting/api2/client/gui/controls/PanelTextField.java +++ b/src/main/java/betterquesting/api2/client/gui/controls/PanelTextField.java @@ -33,6 +33,7 @@ public class PanelTextField implements IGuiPanel { private boolean isFocused = false; private boolean isActive = true; private boolean canWrap = false; + private boolean clearOnRightClick = false; private int maxLength = 32; private String text; @@ -108,6 +109,11 @@ public PanelTextField enableWrapping(boolean state) { return this; } + public PanelTextField enableClearingOnRightClick(boolean state) { + this.clearOnRightClick = state; + return this; + } + public void lockFocus(boolean state) { this.lockFocus = state; @@ -636,7 +642,7 @@ public void drawPanel(int mx, int my, float partialTick) { GlStateManager.translate(-getScrollX(), -getScrollY(), 0); if (text.length() <= 0) { - if (!isFocused) { + if (lockFocus || !isFocused) { mc.fontRenderer.drawString(watermark, bounds.getX() + 4, bounds.getY() + 4, colWatermark.getRGB(), false); } } else { @@ -665,6 +671,13 @@ public boolean onMouseClick(int mx, int my, int button) { updateScrollBounds(); // Just in case } + if (clearOnRightClick && button == 1) { + setText(""); + if (callback != null) { + callback.setValue(filter.parseValue(this.text)); + } + } + if (canWrap) { setCursorPosition(RenderUtils.getCursorPos(text, mx - (transform.getX() + 4) + getScrollX(), my - (transform.getY() + 4) + getScrollY(), transform.getWidth() - 8, Minecraft.getMinecraft().fontRenderer)); } else { diff --git a/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasQuestSearch.java b/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasQuestSearch.java index b9fba120d..6d0caa9c9 100644 --- a/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasQuestSearch.java +++ b/src/main/java/betterquesting/api2/client/gui/panels/lists/CanvasQuestSearch.java @@ -5,7 +5,7 @@ import betterquesting.api.questing.IQuest; import betterquesting.api.questing.IQuestLine; import betterquesting.api.questing.IQuestLineEntry; -import betterquesting.api.questing.tasks.ITask; +import betterquesting.api.questing.ISearchable; import betterquesting.api2.cache.QuestCache; import betterquesting.api2.client.gui.controls.PanelButtonCustom; import betterquesting.api2.client.gui.controls.PanelButtonQuest; @@ -22,12 +22,10 @@ import net.minecraft.entity.player.EntityPlayer; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayDeque; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; public class CanvasQuestSearch extends CanvasSearch { private List questList; @@ -85,15 +83,15 @@ protected void queryMatches(QuestSearchEntry entry, String query, ArrayDeque task : entry.getQuest().getValue().getTasks().getEntries()) { - if (task.getValue().getTextForSearch() == null) continue; - for (String text : task.getValue().getTextForSearch()) { - if (StringUtils.containsIgnoreCase(text, query)) { - results.add(entry); - } - } - } + // search tasks and rewards + Stream.concat(value.getTasks().getEntries().stream(), value.getRewards().getEntries().stream()) + .map(DBEntry::getValue) + .map(ISearchable::getTextForSearch) + .filter(Objects::nonNull) + .flatMap(List::stream) + .filter(text -> StringUtils.containsIgnoreCase(text, query)) + .findAny() + .ifPresent(text -> results.add(entry)); } } diff --git a/src/main/java/betterquesting/client/gui2/GuiQuestLines.java b/src/main/java/betterquesting/client/gui2/GuiQuestLines.java index 7f638c1fa..5cb86691f 100644 --- a/src/main/java/betterquesting/client/gui2/GuiQuestLines.java +++ b/src/main/java/betterquesting/client/gui2/GuiQuestLines.java @@ -614,7 +614,7 @@ private void openQuestLine(DBEntry q) { selectedLine = q.getValue(); selectedLineId = q.getID(); for (int i = 0; i < btnListRef.size(); i++) { - btnListRef.get(i).setActive((visChapters.get(i).getSecond() & 4) == 0 && q.getID() != selectedLineId); + btnListRef.get(i).setActive((visChapters.get(i).getSecond() & 4) == 0 && btnListRef.get(i).getStoredValue().getID() != selectedLineId); } cvQuest.setQuestLine(q.getValue()); diff --git a/src/main/java/betterquesting/client/gui2/GuiQuestSearch.java b/src/main/java/betterquesting/client/gui2/GuiQuestSearch.java index 0aee3efc9..4aa8e9ac5 100644 --- a/src/main/java/betterquesting/client/gui2/GuiQuestSearch.java +++ b/src/main/java/betterquesting/client/gui2/GuiQuestSearch.java @@ -22,6 +22,7 @@ public class GuiQuestSearch extends GuiScreenCanvas { + private static String priorSearchText = null; private PanelTextField searchBox; public GuiQuestSearch(GuiScreen parent) { @@ -59,12 +60,19 @@ private void createSearchBox(CanvasEmpty cvInner) { searchBox = new PanelTextField<>(new GuiTransform(GuiAlign.TOP_EDGE, new GuiPadding(0, 16, 8, -32), 0), "", FieldFilterString.INSTANCE); searchBox.setWatermark("Search..."); searchBox.lockFocus(true); + searchBox.enableClearingOnRightClick(true); cvInner.addPanel(searchBox); CanvasQuestSearch canvasQuestSearch = createSearchCanvas(); cvInner.addPanel(canvasQuestSearch); - searchBox.setCallback(canvasQuestSearch::setSearchFilter); + searchBox.setCallback(text -> { + GuiQuestSearch.priorSearchText = text; + canvasQuestSearch.setSearchFilter(text); + }); + if (priorSearchText != null) { + searchBox.writeText(priorSearchText); + } PanelVScrollBar scDb = new PanelVScrollBar(new GuiTransform(GuiAlign.RIGHT_EDGE, new GuiPadding(-8, 32, 0, 24), 0)); cvInner.addPanel(scDb); @@ -76,7 +84,7 @@ private CanvasQuestSearch createSearchCanvas() { CanvasQuestSearch canvasQuestSearch = new CanvasQuestSearch(new GuiTransform(GuiAlign.FULL_BOX, new GuiPadding(0, 32, 8, 24), 0), mc.player); canvasQuestSearch.setQuestOpenCallback(questSearchEntry -> { acceptCallback(questSearchEntry); - GuiHome.bookmark = new GuiQuest(parent, questSearchEntry.getQuest().getID()); + GuiHome.bookmark = new GuiQuest(this, questSearchEntry.getQuest().getID()); mc.displayGuiScreen(GuiHome.bookmark); }); canvasQuestSearch.setQuestHighlightCallback(questSearchEntry -> { diff --git a/src/main/java/betterquesting/questing/rewards/RewardChoice.java b/src/main/java/betterquesting/questing/rewards/RewardChoice.java index ab5c0f567..e52269296 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardChoice.java +++ b/src/main/java/betterquesting/questing/rewards/RewardChoice.java @@ -138,4 +138,17 @@ public IGuiPanel getRewardGui(IGuiRect rect, DBEntry quest) { public GuiScreen getRewardEditor(GuiScreen screen, DBEntry quest) { return null; } + + @Override + public List getTextForSearch() { + List texts = new ArrayList<>(); + for (BigItemStack bigStack : choices) { + ItemStack stack = bigStack.getBaseStack(); + texts.add(stack.getDisplayName()); + if (bigStack.hasOreDict()) { + texts.add(bigStack.getOreDict()); + } + } + return texts; + } } diff --git a/src/main/java/betterquesting/questing/rewards/RewardCommand.java b/src/main/java/betterquesting/questing/rewards/RewardCommand.java index 10a471c99..27e5a22ad 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardCommand.java +++ b/src/main/java/betterquesting/questing/rewards/RewardCommand.java @@ -26,6 +26,8 @@ import javax.annotation.Nonnull; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.UUID; public class RewardCommand implements IReward { @@ -122,6 +124,11 @@ public GuiScreen getRewardEditor(GuiScreen screen, DBEntry quest) { return null; } + @Override + public List getTextForSearch() { + return Collections.singletonList(command); + } + public static class RewardCommandSender extends CommandBlockBaseLogic { private final Entity entity; diff --git a/src/main/java/betterquesting/questing/rewards/RewardItem.java b/src/main/java/betterquesting/questing/rewards/RewardItem.java index 6425d5205..72841f268 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardItem.java +++ b/src/main/java/betterquesting/questing/rewards/RewardItem.java @@ -98,4 +98,17 @@ public IGuiPanel getRewardGui(IGuiRect rect, DBEntry quest) { public GuiScreen getRewardEditor(GuiScreen screen, DBEntry quest) { return null; } + + @Override + public List getTextForSearch() { + List texts = new ArrayList<>(); + for (BigItemStack bigStack : items) { + ItemStack stack = bigStack.getBaseStack(); + texts.add(stack.getDisplayName()); + if (bigStack.hasOreDict()) { + texts.add(bigStack.getOreDict()); + } + } + return texts; + } } diff --git a/src/main/java/betterquesting/questing/rewards/RewardRecipe.java b/src/main/java/betterquesting/questing/rewards/RewardRecipe.java index f0330c456..d17ba2fda 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardRecipe.java +++ b/src/main/java/betterquesting/questing/rewards/RewardRecipe.java @@ -15,6 +15,9 @@ import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; public class RewardRecipe implements IReward { public String recipeNames = "minecraft:crafting_table\nminecraft:chest"; @@ -74,4 +77,11 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt, boolean reduce) { public void readFromNBT(NBTTagCompound nbt) { recipeNames = nbt.getString("recipes"); } + + @Override + public List getTextForSearch() { + List texts = new ArrayList<>(); + Collections.addAll(texts, recipeNames.split("\n")); + return texts; + } } diff --git a/src/main/java/betterquesting/questing/rewards/RewardScoreboard.java b/src/main/java/betterquesting/questing/rewards/RewardScoreboard.java index cba6e1c14..6edb84fa2 100644 --- a/src/main/java/betterquesting/questing/rewards/RewardScoreboard.java +++ b/src/main/java/betterquesting/questing/rewards/RewardScoreboard.java @@ -18,6 +18,9 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.logging.log4j.Level; +import java.util.ArrayList; +import java.util.List; + public class RewardScoreboard implements IReward { private static final String DEFAULT_TYPE = "dummy"; @@ -106,4 +109,12 @@ public IGuiPanel getRewardGui(IGuiRect rect, DBEntry quest) { public GuiScreen getRewardEditor(GuiScreen screen, DBEntry quest) { return null; } + + @Override + public List getTextForSearch() { + List texts = new ArrayList<>(); + texts.add(score); + texts.add(String.valueOf(value)); + return texts; + } }