Files
fros.cc/src/main/java/cc/fros/features/gui/Widget.java
T
froslanz 30ccc6ea5a add custom font support for all client ui
- new FrosFont renderer: loads ttf/otf from fros/fonts/, rasterizes
  text to cached textures, falls back to the vanilla font when unset
- Font/FontSize settings in ClickGui (fontSize only shows when a font
  is set); missing files retry automatically every 2s
- all gui buttons, panels and hud modules now render through it
- handles section codes and styled components (watermark accent color)
2026-10-22 11:22:47 -04:00

200 lines
6.0 KiB
Java

package cc.fros.features.gui;
import cc.fros.util.render.FrosFont;
import cc.fros.features.Feature;
import cc.fros.features.gui.items.Item;
import cc.fros.features.gui.items.buttons.Button;
import cc.fros.features.modules.client.ClickGuiModule;
import cc.fros.util.ColorUtil;
import cc.fros.util.render.RenderUtil;
import cc.fros.util.render.ScissorUtil;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.sounds.SoundEvents;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class Widget
extends Feature {
protected GuiGraphics context;
private final List<Item> items = new ArrayList<>();
public boolean drag;
private int x;
private int y;
private int x2;
private int y2;
private int width;
private int height;
private boolean open;
private boolean hidden = false;
public Widget(String name, int x, int y, boolean open) {
super(name);
this.x = x;
this.y = y;
this.width = 88;
this.height = 18;
this.open = open;
}
private void drag(int mouseX, int mouseY) {
if (!this.drag) {
return;
}
this.x = this.x2 + mouseX;
this.y = this.y2 + mouseY;
}
public void drawScreen(GuiGraphics context, int mouseX, int mouseY, float partialTicks) {
this.context = context;
this.drag(mouseX, mouseY);
float totalItemHeight = this.open ? this.getTotalItemHeight() - 2.0f : 0.0f;
int color = ClickGuiModule.getInstance().topColor.getValue().getRGB();
context.fill(this.x, this.y - 1, this.x + this.width, this.y + this.height - 6, ClickGuiModule.getInstance().rainbow.getValue() ? ColorUtil.rainbow(ClickGuiModule.getInstance().rainbowHue.getValue()).getRGB() : color);
if (this.open) {
RenderUtil.rect(context, this.x, (float) this.y + 12.5f, this.x + this.width, (float) (this.y + this.height) + totalItemHeight, 0x77000000);
}
drawString(this.getName(), (float) this.x + 3.0f, (float) this.y - 4.0f - (float) FrosGui.getClickGui().getTextOffset(), -1);
ScissorUtil.enable(context, x, 0, x + width, mc.getWindow().getGuiScaledHeight());
if (this.open) {
float y = (float) (this.getY() + this.getHeight()) - 3.0f;
for (Item item : this.getItems()) {
if (item.isHidden()) continue;
item.setLocation((float) this.x + 2.0f, y);
item.setWidth(this.getWidth() - 4);
if (item.isHovering(mouseX, mouseY)) {
ScissorUtil.disable(context);
}
item.drawScreen(context, mouseX, mouseY, partialTicks);
if (item.isHovering(mouseX, mouseY)) {
ScissorUtil.enable(context);
}
y += (float) item.getHeight() + 2f;
}
}
ScissorUtil.disable(context);
}
public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
if (mouseButton == 0 && this.isHovering(mouseX, mouseY)) {
this.x2 = this.x - mouseX;
this.y2 = this.y - mouseY;
FrosGui.getClickGui().getComponents().forEach(component -> {
if (component.drag) {
component.drag = false;
}
});
this.drag = true;
return;
}
if (mouseButton == 1 && this.isHovering(mouseX, mouseY)) {
this.open = !this.open;
mc.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1f));
return;
}
if (!this.open) {
return;
}
this.getItems().forEach(item -> item.mouseClicked(mouseX, mouseY, mouseButton));
}
public void mouseReleased(int mouseX, int mouseY, int releaseButton) {
if (releaseButton == 0) {
this.drag = false;
}
if (!this.open) {
return;
}
this.getItems().forEach(item -> item.mouseReleased(mouseX, mouseY, releaseButton));
}
public void onKeyTyped(String typedChar, int keyCode) {
if (!this.open) {
return;
}
this.getItems().forEach(item -> item.onKeyTyped(typedChar, keyCode));
}
public void onKeyPressed(int key) {
if (!open) return;
this.getItems().forEach(item -> item.onKeyPressed(key));
}
public void addButton(Button button) {
this.items.add(button);
}
public int getX() {
return this.x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return this.y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return this.width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return this.height;
}
public void setHeight(int height) {
this.height = height;
}
public boolean isHidden() {
return this.hidden;
}
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
public boolean isOpen() {
return this.open;
}
public final List<Item> getItems() {
return this.items;
}
public boolean isHovering(int mouseX, int mouseY) {
return mouseX >= this.getX() && mouseX <= this.getX() + this.getWidth() && mouseY >= this.getY() && mouseY <= this.getY() + this.getHeight() - (this.open ? 2 : 0);
}
private float getTotalItemHeight() {
float height = 0.0f;
for (Item item : this.getItems()) {
height += (float) item.getHeight() + 2;
}
return height;
}
protected void drawString(String text, double x, double y, Color color) {
drawString(text, x, y, color.hashCode());
}
protected void drawString(String text, double x, double y, int color) {
FrosFont.draw(context, text, (int) x, (int) y, color);
}
}