Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/java/brachy/modularui/api/value/IValue.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ public interface IValue<T> extends ISyncOrValue {
*/
void setValue(@UnknownNullability T value);

default T getOrDefault(T defaultValue) {
T t = getValue();
return t != null ? t : defaultValue;
}

Class<T> getValueType();

@Override
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/brachy/modularui/drawable/GuiDraw.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package brachy.modularui.drawable;

import brachy.modularui.utils.MUIRenderTypes;
import brachy.modularui.api.drawable.IRichTextBuilder;
import brachy.modularui.drawable.text.TextRenderer;
import brachy.modularui.screen.event.RichTooltipEvent;
import brachy.modularui.screen.viewport.GuiContext;
import brachy.modularui.screen.viewport.ModularGuiContext;
import brachy.modularui.utils.Alignment;
import brachy.modularui.utils.Color;
import brachy.modularui.utils.FormattingUtil;
import brachy.modularui.utils.MUIRenderTypes;
import brachy.modularui.utils.RectangleF;
import brachy.modularui.utils.math.NumberFormat;
import brachy.modularui.widget.sizer.Area;

import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -665,7 +665,7 @@ public static void drawStandardSlotAmountText(GuiContext context, int amount, St
public static void drawAmountText(ModularGuiContext context, int amount, String format,
int x, int y, int width, int height, Alignment alignment, float z) {
if (amount <= 1) return;
String amountText = FormattingUtil.formatNumberReadable(amount, false);
String amountText = NumberFormat.AMOUNT_TEXT.format(amount);
if (format != null) {
amountText = format + amountText;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ public List<ClientTooltipComponent> getTooltip(int mouseX, int mouseY) {
IWidget hovered = screen.getContext().getTopHovered();
if (hovered instanceof ITooltip<?> tooltip && tooltip.getTooltip() != null) {
RichTooltip richTooltip = tooltip.getTooltip();
if (richTooltip.autoUpdate()) richTooltip.markDirty();
richTooltip.isEmpty(); // causes the tooltip to rebuild if necessary
IRichTextBuilder<?> richTextBuilder = richTooltip.getRichText();
if (richTextBuilder instanceof RichText richText) {
Expand Down
57 changes: 0 additions & 57 deletions src/main/java/brachy/modularui/utils/FormattingUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Arrays;
Expand Down Expand Up @@ -342,62 +341,6 @@ public static String formatNumbers(Object number) {
return NUMBER_FORMAT.format(number);
}

public static String formatNumberReadable(long number) {
return formatNumberReadable(number, false);
}

public static String formatNumberReadable(long number, boolean milli) {
return formatNumberReadable(number, milli, DECIMAL_FORMAT_1F, null);
}

public static String formatNumberReadable2F(double number, boolean milli) {
return formatNumberReadable(number, milli, DECIMAL_FORMAT_2F, null);
}

/**
* Format number in engineering notation with SI prefixes [m, k, M, G, T, P, E, Z]
*
* @param number Number to format
* @param milli Whether the passed number is already in millis (e.g., mB)
* @param fmt Formatter to use for compacted number
* @param unit Optional unit to append
* @return Compacted number with SI prefix
*/
public static String formatNumberReadable(double number, boolean milli, NumberFormat fmt, @Nullable String unit) {
StringBuilder sb = new StringBuilder();
if (number < 0) {
number = -number;
sb.append('-');
}

if (milli && number >= 1e3) {
milli = false;
number /= 1e3;
}

int exp = 0;
if (number >= 1e3) {
exp = (int) Math.log10(number) / 3;
if (exp > 7) exp = 7;
if (exp > 0) number /= Math.pow(1e3, exp);
}

sb.append(fmt.format(number));
if (exp > 0) sb.append("kMGTPEZ".charAt(exp - 1));
else if (milli && number != 0) sb.append('m');

if (unit != null) sb.append(unit);
return sb.toString();
}

public static String formatNumberOrSic(BigInteger number, BigInteger threshold) {
return number.compareTo(threshold) > 0 ? DECIMAL_FORMAT_SIC_2F.format(number) : formatNumbers(number);
}

public static String formatBuckets(long mB) {
return formatNumberReadable(mB, true, DECIMAL_FORMAT_2F, "B");
}

@NotNull
public static String formatNumber2Places(float number) {
return DECIMAL_FORMAT_2F.format(number);
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/brachy/modularui/utils/math/NumberFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class NumberFormat {

public static final Params AMOUNT_TEXT = DEFAULT.copyToBuilder()
.roundingMode(RoundingMode.DOWN)
.maxLength(3)
.build();

public static Params params(DecimalFormat format, int maxLength, boolean considerOnlyDecimalsForLength,
Expand All @@ -56,8 +57,8 @@ public Params(DecimalFormat format, int maxLength, boolean considerOnlyDecimalsF
this.considerMinusForLength = considerMinusForLength;
this.considerSuffixForLength = considerSuffixForLength;
this.spaceAfterNumber = spaceAfterNumber;
if (!this.considerOnlyDecimalsForLength && this.maxLength < 4) {
throw new IllegalArgumentException("Max length must be at least 4 characters");
if (!this.considerOnlyDecimalsForLength && this.maxLength < 1) {
throw new IllegalArgumentException("Max length must be at least 1 character");
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/brachy/modularui/utils/math/SIPrefix.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public enum SIPrefix {
Ronna('R', 27),
Yotta('Y', 24),
Zetta('Z', 21),
Exa('X', 18), // this should actually be E, but this clashes with euler's number e = 2.71...
Exa('X', 18), // this should actually be E, but this clashes with Euler's number e = 2.71...
Peta('P', 15),
Tera('T', 12),
Giga('G', 9),
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/brachy/modularui/widget/WidgetTree.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import brachy.modularui.api.widget.IWidget;
import brachy.modularui.screen.ModularPanel;
import brachy.modularui.screen.viewport.ModularGuiContext;
import brachy.modularui.utils.FormattingUtil;
import brachy.modularui.utils.TreeUtil;
import brachy.modularui.utils.math.NumberFormat;
import brachy.modularui.value.sync.ModularSyncManager;
import brachy.modularui.value.sync.PanelSyncManager;
import brachy.modularui.widget.sizer.ResizeNode;
Expand Down Expand Up @@ -302,8 +302,8 @@ public static void resizeInternal(ResizeNode parent, boolean onOpen) {
if (WidgetTree.logResizeTime) {
time = Util.getNanos() - time;
ModularUI.LOGGER.info("Resized widget tree in {} ns and {} ns for full resize.",
FormattingUtil.formatNumbers(time),
FormattingUtil.formatNumbers(time));
NumberFormat.formatNanos(time),
NumberFormat.formatNanos(time));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import brachy.modularui.screen.viewport.ModularGuiContext;
import brachy.modularui.theme.WidgetThemeEntry;
import brachy.modularui.utils.Alignment;
import brachy.modularui.utils.FormattingUtil;
import brachy.modularui.utils.math.MathUtils;
import brachy.modularui.utils.math.NumberFormat;
import brachy.modularui.utils.math.SIPrefix;
import brachy.modularui.widget.Widget;
import brachy.modularui.widget.sizer.Box;
Expand All @@ -19,7 +19,6 @@

import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public abstract class AbstractFluidDisplayWidget<W extends AbstractFluidDisplayWidget<W>> extends Widget<W> implements IngredientProvider<FluidStack> {

Expand Down Expand Up @@ -63,20 +62,17 @@ public void draw(ModularGuiContext context, WidgetThemeEntry<?> widgetTheme) {
public void drawOverlay(ModularGuiContext context, WidgetThemeEntry<?> widgetTheme) {
super.drawOverlay(context, widgetTheme);
FluidStack fluid = getFluidStack();
if (fluid != null && displayAmountText()) {
String s = FormattingUtil.formatNumberReadable2F(getBaseUnitAmount(fluid.getAmount()), false) +
getBaseUnit();
if (!fluid.isEmpty() && displayAmountText()) {
String s = NumberFormat.format(getBaseUnitAmount(fluid.getAmount()), NumberFormat.AMOUNT_TEXT) + getBaseUnit();
// mc doesn't consider the 1px border in item slots for amount text, but it looks weird when it touches the
// left border, so
// we only apply padding there
// left border, so we only apply padding there
GuiDraw.drawScaledAlignedTextInBox(context, s, this.contentPadding.left(), 0,
getArea().width - this.contentPadding.left(), getArea().height, Alignment.BottomRight);
}
}

protected abstract boolean displayAmountText();

@Nullable
protected abstract FluidStack getFluidStack();

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ protected boolean displayAmountText() {

@Override
protected @Nullable FluidStack getFluidStack() {
return this.value != null ? this.value.getValue() : null;
return this.value != null ? this.value.getOrDefault(FluidStack.EMPTY) : FluidStack.EMPTY;
}

public FluidDisplayWidget value(IValue<FluidStack> value) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/brachy/modularui/widgets/slot/FluidSlot.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ protected boolean displayAmountText() {

@Override
public void drawOverlay(ModularGuiContext context, WidgetThemeEntry<?> widgetTheme) {
super.drawOverlay(context, widgetTheme);
if (isHovering()) {
RenderSystem.colorMask(true, true, true, false);
GuiDraw.drawRect(context.getGraphics(), 1, 1, getArea().w() - 2, getArea().h() - 2, getSlotHoverColor());
Expand Down Expand Up @@ -212,9 +213,8 @@ public int getCapacity() {
return this.alwaysShowFull ? 0 : getFluidTank().getCapacity();
}

@Nullable
public FluidStack getFluidStack() {
return this.syncHandler == null ? null : this.syncHandler.getValue();
return this.syncHandler == null ? FluidStack.EMPTY : this.syncHandler.getOrDefault(FluidStack.EMPTY);
}

public IFluidTank getFluidTank() {
Expand Down