Merge pull request #2639 from ranch21/calc

calculator history
This commit is contained in:
HbmMods 2026-01-11 20:23:09 +01:00 committed by GitHub
commit 0e30985963
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 14 deletions

View File

@ -1,23 +1,29 @@
package com.hbm.inventory.gui;
import com.hbm.lib.RefStrings;
import com.hbm.util.Tuple;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiTextField;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.Locale;
import java.util.Stack;
public class GUICalculator extends GuiScreen {
private static final ResourceLocation texture = new ResourceLocation(RefStrings.MODID, "textures/gui/calculator.png");
private int xSize = 220;
private int ySize = 50;
private int borderWidth = 2;
private GuiTextField inputField;
private int selectedHist = -1;
private static final int maxHistory = 6;
private static Deque<Tuple.Pair<String, Double>> history = new ArrayDeque<>();
private String latestResult = "?";
@Override
@ -46,15 +52,31 @@ public class GUICalculator extends GuiScreen {
String input = inputField.getText().replaceAll("[^\\d+\\-*/^!.()\\sA-Za-z]+", "");
if (p_73869_1_ == 13 || p_73869_1_ == 10) { // when pressing enter (CR or LF)
try {
double result = evaluateExpression(input);
String plainStringRepresentation = (new BigDecimal(result, MathContext.DECIMAL64)).toPlainString();
GuiScreen.setClipboardString(plainStringRepresentation);
inputField.setText(plainStringRepresentation);
inputField.setCursorPositionEnd();
inputField.setSelectionPos(0);
} catch (Exception ignored) {}
return;
if (selectedHist != -1) {
input = new ArrayList<>(history).get(selectedHist).key;
inputField.setText(input);
selectedHist = -1;
} else {
try {
double result = evaluateExpression(input);
history.addFirst(new Tuple.Pair<String,Double>(input, result));
if (history.size() > maxHistory) history.removeLast();
String plainStringRepresentation = (new BigDecimal(result, MathContext.DECIMAL64)).toPlainString();
GuiScreen.setClipboardString(plainStringRepresentation);
inputField.setText(plainStringRepresentation);
inputField.setCursorPositionEnd();
inputField.setSelectionPos(0);
} catch (Exception ignored) {}
return;
}
}
if (p_73869_2_ == 200) { // up arrow
selectedHist = Math.max(selectedHist - 1, -1);
} else if (p_73869_2_ == 208) { // down arrow
selectedHist = Math.min(selectedHist + 1, history.size() - 1);
} else {
selectedHist = -1;
}
if (input.isEmpty()) {
@ -72,14 +94,27 @@ public class GUICalculator extends GuiScreen {
super.drawScreen(mouseX, mouseY, partialTicks);
GL11.glColor4f(1F, 1F, 1F, 1F);
mc.getTextureManager().bindTexture(texture);
int x = (width - xSize) / 2;
int y = (height - ySize) / 2;
int histHeight = (fontRendererObj.FONT_HEIGHT + 2) * maxHistory;
int histStart = y + 30 + fontRendererObj.FONT_HEIGHT + 8;
drawTexturedModalRect(x, y, 0, 0, xSize, ySize);
drawRect(x, y, x+xSize, y+ySize+histHeight, 0xFF2d2d2d);
drawRect(x+borderWidth, y+borderWidth, x+xSize-borderWidth, y+ySize-borderWidth+histHeight, 0xFF3d3d3d);
drawRect(x, histStart - 5, x+xSize, histStart - 3, 0xFF2d2d2d);
inputField.drawTextBox();
fontRendererObj.drawString("=" + latestResult, x + 5, y + 30, -1);
int i = 0;
for (Tuple.Pair<String, Double> prevInput : history) {
int hy = y + 50 + (fontRendererObj.FONT_HEIGHT+1)*i;
if (i == selectedHist) {
drawRect(x + 4, hy - 1, x + 4 + xSize - 9, hy + fontRendererObj.FONT_HEIGHT, 0xFF111111);
}
fontRendererObj.drawString(prevInput.key + " = " + prevInput.value, x + 5, hy, -1);
i++;
}
}
/**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 566 B