Move search field logic to another class so we can reuse it in the crafter manager

This commit is contained in:
raoulvdberge
2018-03-17 20:41:59 +01:00
parent f90b4fcafe
commit 992d868bf7
4 changed files with 140 additions and 94 deletions

View File

@@ -302,7 +302,6 @@ public class CraftingManager implements ICraftingManager {
patterns.addAll(container.getPatterns()); patterns.addAll(container.getPatterns());
// @todo: Crafter first!
if (!containerInventories.containsKey(container.getName())) { if (!containerInventories.containsKey(container.getName())) {
containerInventories.put(container.getName(), new ArrayList<>()); containerInventories.put(container.getName(), new ArrayList<>());
} }

View File

@@ -8,10 +8,10 @@ import com.raoulvdberge.refinedstorage.container.slot.SlotCrafterManager;
import com.raoulvdberge.refinedstorage.gui.control.Scrollbar; import com.raoulvdberge.refinedstorage.gui.control.Scrollbar;
import com.raoulvdberge.refinedstorage.gui.control.SideButtonGridSize; import com.raoulvdberge.refinedstorage.gui.control.SideButtonGridSize;
import com.raoulvdberge.refinedstorage.gui.control.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.gui.control.SideButtonRedstoneMode;
import com.raoulvdberge.refinedstorage.gui.control.TextFieldSearch;
import com.raoulvdberge.refinedstorage.tile.TileCrafterManager; import com.raoulvdberge.refinedstorage.tile.TileCrafterManager;
import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import com.raoulvdberge.refinedstorage.tile.data.TileDataManager;
import com.raoulvdberge.refinedstorage.util.RenderUtils; import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.inventory.Slot; import net.minecraft.inventory.Slot;
@@ -22,7 +22,8 @@ import java.util.Map;
public class GuiCrafterManager extends GuiBase implements IResizableDisplay { public class GuiCrafterManager extends GuiBase implements IResizableDisplay {
private ContainerCrafterManager container; private ContainerCrafterManager container;
private NetworkNodeCrafterManager crafterManager; private NetworkNodeCrafterManager crafterManager;
private GuiTextField searchField;
private TextFieldSearch searchField;
public GuiCrafterManager(NetworkNodeCrafterManager crafterManager) { public GuiCrafterManager(NetworkNodeCrafterManager crafterManager) {
super(null, 193, 0); super(null, 193, 0);
@@ -120,10 +121,7 @@ public class GuiCrafterManager extends GuiBase implements IResizableDisplay {
int sy = y + 6 + 1; int sy = y + 6 + 1;
if (searchField == null) { if (searchField == null) {
searchField = new GuiTextField(0, fontRenderer, sx, sy, 88 - 6, fontRenderer.FONT_HEIGHT); searchField = new TextFieldSearch(0, fontRenderer, sx, sy, 88 - 6);
searchField.setEnableBackgroundDrawing(false);
searchField.setVisible(true);
searchField.setTextColor(16777215);
} else { } else {
searchField.x = sx; searchField.x = sx;
searchField.y = sy; searchField.y = sy;

View File

@@ -0,0 +1,128 @@
package com.raoulvdberge.refinedstorage.gui.control;
import com.raoulvdberge.refinedstorage.RSKeyBindings;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiTextField;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import org.lwjgl.input.Keyboard;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class TextFieldSearch extends GuiTextField {
private static final List<String> SEARCH_HISTORY = new ArrayList<>();
private int searchHistoryIndex = -1;
private List<Runnable> listeners = new LinkedList<>();
public TextFieldSearch(int componentId, FontRenderer fontRenderer, int x, int y, int width) {
super(componentId, fontRenderer, x, y, width, fontRenderer.FONT_HEIGHT);
setEnableBackgroundDrawing(false);
setVisible(true);
setTextColor(16777215);
}
public void addListener(Runnable listener) {
listeners.add(listener);
}
@Override
public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) {
boolean wasFocused = isFocused();
boolean result = super.mouseClicked(mouseX, mouseY, mouseButton);
boolean flag = mouseX >= this.x && mouseX < this.x + this.width && mouseY >= this.y && mouseY < this.y + this.height;
if (flag && mouseButton == 1) {
setText("");
setFocused(true);
listeners.forEach(Runnable::run);
} else if (wasFocused != isFocused()) {
saveHistory();
}
return result;
}
@Override
public boolean textboxKeyTyped(char typedChar, int keyCode) {
boolean canLoseFocus = ObfuscationReflectionHelper.getPrivateValue(GuiTextField.class, this, 10);
boolean result = super.textboxKeyTyped(typedChar, keyCode);
if (isFocused()) {
if (keyCode == Keyboard.KEY_UP) {
updateSearchHistory(-1);
result = true;
} else if (keyCode == Keyboard.KEY_DOWN) {
updateSearchHistory(1);
result = true;
} else if (keyCode == Keyboard.KEY_RETURN) {
saveHistory();
if (canLoseFocus) {
setFocused(false);
}
result = true;
}
}
if (keyCode == RSKeyBindings.FOCUS_SEARCH_BAR.getKeyCode() && canLoseFocus) {
setFocused(!isFocused());
saveHistory();
result = true;
}
return result;
}
private void updateSearchHistory(int delta) {
if (SEARCH_HISTORY.isEmpty()) {
return;
}
if (searchHistoryIndex == -1) {
searchHistoryIndex = SEARCH_HISTORY.size();
}
searchHistoryIndex += delta;
if (searchHistoryIndex < 0) {
searchHistoryIndex = 0;
} else if (searchHistoryIndex > SEARCH_HISTORY.size() - 1) {
searchHistoryIndex = SEARCH_HISTORY.size() - 1;
if (delta == 1) {
setText("");
listeners.forEach(Runnable::run);
return;
}
}
setText(SEARCH_HISTORY.get(searchHistoryIndex));
listeners.forEach(Runnable::run);
}
private void saveHistory() {
if (!SEARCH_HISTORY.isEmpty() && SEARCH_HISTORY.get(SEARCH_HISTORY.size() - 1).equals(getText())) {
return;
}
if (!getText().trim().isEmpty()) {
SEARCH_HISTORY.add(getText());
}
}
}

View File

@@ -44,19 +44,15 @@ import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.client.config.GuiCheckBox; import net.minecraftforge.fml.client.config.GuiCheckBox;
import net.minecraftforge.fml.client.config.GuiUtils; import net.minecraftforge.fml.client.config.GuiUtils;
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLCommonHandler;
import org.lwjgl.input.Keyboard;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
public class GuiGrid extends GuiBase implements IResizableDisplay { public class GuiGrid extends GuiBase implements IResizableDisplay {
private static final List<String> SEARCH_HISTORY = new ArrayList<>();
private IGridView view; private IGridView view;
private GuiTextField searchField; private TextFieldSearch searchField;
private GuiCheckBox oredictPattern; private GuiCheckBox oredictPattern;
private GuiCheckBox processingPattern; private GuiCheckBox processingPattern;
private GuiCheckBox blockingPattern; private GuiCheckBox blockingPattern;
@@ -72,8 +68,6 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
private int slotNumber; private int slotNumber;
private int searchHistoryIndex = -1;
public GuiGrid(ContainerGrid container, IGrid grid) { public GuiGrid(ContainerGrid container, IGrid grid) {
super(container, grid.getType() == GridType.FLUID ? 193 : 227, 0); super(container, grid.getType() == GridType.FLUID ? 193 : 227, 0);
@@ -117,10 +111,12 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
int sy = y + 6 + 1 + getTabHeight(); int sy = y + 6 + 1 + getTabHeight();
if (searchField == null) { if (searchField == null) {
searchField = new GuiTextField(0, fontRenderer, sx, sy, 88 - 6, fontRenderer.FONT_HEIGHT); searchField = new TextFieldSearch(0, fontRenderer, sx, sy, 88 - 6);
searchField.setEnableBackgroundDrawing(false); searchField.addListener(() -> {
searchField.setVisible(true); view.sort();
searchField.setTextColor(16777215);
updateJEI();
});
updateSearchFieldFocus(grid.getSearchBoxMode()); updateSearchFieldFocus(grid.getSearchBoxMode());
} else { } else {
@@ -646,20 +642,7 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
} }
if (searchField != null) { if (searchField != null) {
boolean wasSearchFieldFocused = searchField.isFocused();
searchField.mouseClicked(mouseX, mouseY, clickedButton); searchField.mouseClicked(mouseX, mouseY, clickedButton);
if (clickedButton == 1 && inBounds(79, 5 + getTabHeight(), 90, 12, mouseX - guiLeft, mouseY - guiTop)) {
searchField.setText("");
searchField.setFocused(true);
view.sort();
updateJEI();
} else if (wasSearchFieldFocused != searchField.isFocused()) {
saveHistory();
}
} }
boolean clickedClear = clickedButton == 0 && isOverClear(mouseX - guiLeft, mouseY - guiTop); boolean clickedClear = clickedButton == 0 && isOverClear(mouseX - guiLeft, mouseY - guiTop);
@@ -724,26 +707,9 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
// NO OP // NO OP
} else if (searchField.textboxKeyTyped(character, keyCode)) { } else if (searchField.textboxKeyTyped(character, keyCode)) {
updateJEI(); updateJEI();
view.sort(); view.sort();
keyHandled = true;
} else if (searchField.isFocused() && (keyCode == Keyboard.KEY_UP || keyCode == Keyboard.KEY_DOWN || keyCode == Keyboard.KEY_RETURN)) {
if (keyCode == Keyboard.KEY_UP) {
updateSearchHistory(-1);
} else if (keyCode == Keyboard.KEY_DOWN) {
updateSearchHistory(1);
} else {
saveHistory();
if (grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_NORMAL || grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED) {
searchField.setFocused(false);
}
}
keyHandled = true;
} else if (keyCode == RSKeyBindings.FOCUS_SEARCH_BAR.getKeyCode() && (grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_NORMAL || grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED)) {
searchField.setFocused(!searchField.isFocused());
saveHistory();
keyHandled = true; keyHandled = true;
} else if (keyCode == RSKeyBindings.CLEAR_GRID_CRAFTING_MATRIX.getKeyCode()) { } else if (keyCode == RSKeyBindings.CLEAR_GRID_CRAFTING_MATRIX.getKeyCode()) {
RS.INSTANCE.network.sendToServer(new MessageGridClear()); RS.INSTANCE.network.sendToServer(new MessageGridClear());
@@ -752,50 +718,6 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
} }
} }
private void updateSearchHistory(int delta) {
if (SEARCH_HISTORY.isEmpty()) {
return;
}
if (searchHistoryIndex == -1) {
searchHistoryIndex = SEARCH_HISTORY.size();
}
searchHistoryIndex += delta;
if (searchHistoryIndex < 0) {
searchHistoryIndex = 0;
} else if (searchHistoryIndex > SEARCH_HISTORY.size() - 1) {
searchHistoryIndex = SEARCH_HISTORY.size() - 1;
if (delta == 1) {
searchField.setText("");
view.sort();
updateJEI();
return;
}
}
searchField.setText(SEARCH_HISTORY.get(searchHistoryIndex));
view.sort();
updateJEI();
}
private void saveHistory() {
if (!SEARCH_HISTORY.isEmpty() && SEARCH_HISTORY.get(SEARCH_HISTORY.size() - 1).equals(searchField.getText())) {
return;
}
if (!searchField.getText().trim().isEmpty()) {
SEARCH_HISTORY.add(searchField.getText());
}
}
private void updateJEI() { private void updateJEI() {
if (IntegrationJEI.isLoaded() && (grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED || grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED_AUTOSELECTED)) { if (IntegrationJEI.isLoaded() && (grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED || grid.getSearchBoxMode() == IGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED_AUTOSELECTED)) {
RSJEIPlugin.INSTANCE.getRuntime().getIngredientFilter().setFilterText(searchField.getText()); RSJEIPlugin.INSTANCE.getRuntime().getIngredientFilter().setFilterText(searchField.getText());
@@ -809,7 +731,6 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
} }
} }
// @todo: Move logic to other class so we can reuse search field in crafter manager
public GuiTextField getSearchField() { public GuiTextField getSearchField() {
return searchField; return searchField;
} }