/* * Copyright (C) 2022 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.miscgui; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.GuiElementTextField; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ResourceLocation; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; public class GuiNavigation extends GuiScreen { public static ResourceLocation BACKGROUND = new ResourceLocation( "notenoughupdates", "textures/gui/navigation.png" ); public static final int PIN_POSITION_U = 182; public static final int PIN_POSITION_V = 3; public static final int TICK_POSITION_U = 182; public static final int TICK_POSITION_V = 34; public static final int ICON_SIZE = 26; public static final int SEARCH_BAR_X = 14; public static final int SEARCH_BAR_Y = 11; public static final int SEARCH_BAR_WIDTH = 151; public static final int SEARCH_BAR_HEIGHT = 24; public static final int LIST_START_X = 14; public static final int LIST_START_Y = 43; public static final int LIST_OFFSET_Y = 28; public static final int TEXT_OFFSET_X = 28; public static final int LIST_COUNT = 6; List searchResults = new ArrayList<>(); public int xSize = 176; public int ySize = 222; public int guiLeft, guiTop; public GuiElementTextField textField = new GuiElementTextField("", SEARCH_BAR_WIDTH, SEARCH_BAR_HEIGHT, 0); @Override public void initGui() { super.initGui(); NotEnoughUpdates.INSTANCE.config.hidden.hasOpenedWaypointMenu = true; guiLeft = (width - xSize) / 2; guiTop = (height - ySize) / 2; } @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { drawDefaultBackground(); Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND); this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); textField.render(guiLeft + SEARCH_BAR_X, guiTop + SEARCH_BAR_Y); refreshResults(); for (int i = 0; i < LIST_COUNT; i++) { if (i < searchResults.size()) { Minecraft.getMinecraft().getTextureManager().bindTexture(BACKGROUND); String name = searchResults.get(i); JsonObject json = NotEnoughUpdates.INSTANCE.navigation.getWaypoints().get(name); //to prevent an NPE when trying to render a waypoint from AbiphoneContactExtraInformation if (json == null) continue; boolean selected = name.equals(NotEnoughUpdates.INSTANCE.navigation.getInternalname()); int baseX = guiLeft + LIST_START_X; int baseY = guiTop + LIST_START_Y + LIST_OFFSET_Y * i; GlStateManager.color(1F, 1F, 1F); drawTexturedModalRect( baseX, baseY, selected ? TICK_POSITION_U : PIN_POSITION_U, selected ? TICK_POSITION_V : PIN_POSITION_V, ICON_SIZE, ICON_SIZE ); Utils.drawStringF( json.get("displayname").getAsString(), baseX + TEXT_OFFSET_X, baseY + LIST_OFFSET_Y / 2F - Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT / 2F, false, 0x000000 ); } } } private void refreshResults() { String text = textField.getText().toLowerCase(Locale.ROOT); List results = NotEnoughUpdates.INSTANCE.navigation .getWaypoints() .values() .stream() .filter(it -> it.get("internalname").getAsString().toLowerCase(Locale.ROOT).contains(text) || it.get("displayname").getAsString().toLowerCase(Locale.ROOT).contains(text)) .map(it -> it.get("internalname").getAsString()) .sorted(Comparator.comparing(String::length) .thenComparing(String.CASE_INSENSITIVE_ORDER)) .collect(Collectors.toList()); String internalname = NotEnoughUpdates.INSTANCE.navigation.getInternalname(); if (internalname != null) { results.remove(internalname); results.add(0, internalname); } searchResults = results; } @Override protected void keyTyped(char p_keyTyped_1_, int p_keyTyped_2_) throws IOException { super.keyTyped(p_keyTyped_1_, p_keyTyped_2_); textField.keyTyped(p_keyTyped_1_, p_keyTyped_2_); } @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { super.mouseClicked(mouseX, mouseY, mouseButton); if (Utils.isWithinRect( mouseX, mouseY, guiLeft + SEARCH_BAR_X, guiTop + SEARCH_BAR_Y, SEARCH_BAR_WIDTH, SEARCH_BAR_HEIGHT )) { textField.mouseClicked(mouseX, mouseY, mouseButton); } else { textField.setFocus(false); } for (int i = 0; i < LIST_COUNT; i++) { if (i < searchResults.size()) { int baseX = guiLeft + LIST_START_X; int baseY = guiTop + LIST_START_Y + LIST_OFFSET_Y * i; if (Utils.isWithinRect(mouseX, mouseY, baseX, baseY, ICON_SIZE, ICON_SIZE)) { String thing = searchResults.get(i); boolean selected = thing.equals(NotEnoughUpdates.INSTANCE.navigation.getInternalname()); if (selected) { NotEnoughUpdates.INSTANCE.navigation.untrackWaypoint(); } else { NotEnoughUpdates.INSTANCE.navigation.trackWaypoint(thing); } Utils.playPressSound(); } } } } }