1
mirror of https://github.com/Shiewk/Widgets.git synced 2026-04-28 11:34:17 +02:00

Add different text styles (#3)

This commit is contained in:
Shy
2025-08-18 10:33:40 +02:00
parent d39473d296
commit 8192f13e51
16 changed files with 141 additions and 68 deletions
@@ -12,6 +12,8 @@ import net.minecraft.util.profiler.MultiValueDebugSampleLogImpl;
import java.util.List;
import java.util.function.LongFunction;
import static net.minecraft.text.Text.literal;
public class BandwidthWidget extends BasicTextWidget {
public enum Unit {
@@ -46,7 +48,7 @@ public class BandwidthWidget extends BasicTextWidget {
super(id, List.of(
new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.bandwidth.dynamicColor"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false),
new EnumWidgetSetting<>("unit", Text.translatable("widgets.widgets.bandwidth.unit"), Unit.class, Unit.KB, unit -> Text.literal(unit.name))
new EnumWidgetSetting<>("unit", Text.translatable("widgets.widgets.bandwidth.unit"), Unit.class, Unit.KB, unit -> literal(unit.name))
));
getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor);
}
@@ -65,7 +67,7 @@ public class BandwidthWidget extends BasicTextWidget {
if (t >= tickRate){
t = 0;
long avgBytesPerSecond = getAvgBytesPerSecond(MinecraftClient.getInstance(), tickRate);
this.renderText = Text.of(unit.sizeFormatter.apply(avgBytesPerSecond));
formatAndSetRenderText(literal(unit.sizeFormatter.apply(avgBytesPerSecond)));
if (this.dynamicColor){
if (avgBytesPerSecond < 100000){
this.textColor = 0xff00ff00;
@@ -14,6 +14,9 @@ import net.minecraft.util.Identifier;
import java.awt.*;
import java.util.List;
import java.util.function.UnaryOperator;
import static net.minecraft.text.Text.*;
public abstract class BasicTextWidget extends ResizableWidget {
@@ -28,12 +31,34 @@ public abstract class BasicTextWidget extends ResizableWidget {
this.key = key;
}
public Text text(){
return Text.translatable("widgets.widgets.basictext.alignment." + key);
public Text displayText(){
return translatable("widgets.widgets.basictext.alignment." + key);
}
}
protected Text renderText = Text.empty();
public enum TextStyle {
PLAIN("plain", UnaryOperator.identity()),
SQUARE_BRACKETS("squareBrackets", t -> surround("[", t, "]")),
PARENTHESES("parentheses", t -> surround("(", t, ")"));
public final String key;
public final UnaryOperator<Text> operator;
TextStyle(String key, UnaryOperator<Text> operator) {
this.key = key;
this.operator = operator;
}
public Text displayText(){
return translatable("widgets.widgets.basictext.style." + key);
}
public static Text surround(String prefix, Text subject, String suffix){
return literal(prefix).append(subject).append(literal(suffix));
}
}
protected Text renderText = empty();
protected boolean shouldRender = true;
private int textX = 0;
private int textY = 0;
@@ -43,13 +68,14 @@ public abstract class BasicTextWidget extends ResizableWidget {
private static ObjectArrayList<WidgetSettingOption> getCustomSettings(List<WidgetSettingOption> otherCustomOptions) {
final ObjectArrayList<WidgetSettingOption> list = new ObjectArrayList<>(otherCustomOptions);
list.add(new RGBAColorWidgetSetting("backgroundcolor", Text.translatable("widgets.widgets.basictext.background"), 0, 0, 0, 80));
list.add(new RGBAColorWidgetSetting("textcolor", Text.translatable("widgets.widgets.basictext.textcolor"), 255, 255, 255, 255));
list.add(new IntSliderWidgetSetting("width", Text.translatable("widgets.widgets.basictext.width"), 10, DEFAULT_WIDTH, 80*3));
list.add(new IntSliderWidgetSetting("height", Text.translatable("widgets.widgets.basictext.height"), 9, DEFAULT_HEIGHT, 80));
list.add(new ToggleWidgetSetting("shadow", Text.translatable("widgets.widgets.basictext.textshadow"), true));
list.add(new EnumWidgetSetting<>("alignment", Text.translatable("widgets.widgets.basictext.alignment"), TextAlignment.class, TextAlignment.CENTER, TextAlignment::text));
list.add(new IntSliderWidgetSetting("padding", Text.translatable("widgets.widgets.basictext.padding"), 0, 5, 20));
list.add(new RGBAColorWidgetSetting("backgroundcolor", translatable("widgets.widgets.basictext.background"), 0, 0, 0, 80));
list.add(new RGBAColorWidgetSetting("textcolor", translatable("widgets.widgets.basictext.textcolor"), 255, 255, 255, 255));
list.add(new IntSliderWidgetSetting("width", translatable("widgets.widgets.basictext.width"), 10, DEFAULT_WIDTH, 80*3));
list.add(new IntSliderWidgetSetting("height", translatable("widgets.widgets.basictext.height"), 9, DEFAULT_HEIGHT, 80));
list.add(new ToggleWidgetSetting("shadow", translatable("widgets.widgets.basictext.textshadow"), true));
list.add(new EnumWidgetSetting<>("alignment", translatable("widgets.widgets.basictext.alignment"), TextAlignment.class, TextAlignment.CENTER, TextAlignment::displayText));
list.add(new IntSliderWidgetSetting("padding", translatable("widgets.widgets.basictext.padding"), 0, 5, 20));
list.add(new EnumWidgetSetting<>("text_style", translatable("widgets.widgets.basictext.textstyle"), TextStyle.class, TextStyle.PLAIN, TextStyle::displayText));
return list;
}
protected BasicTextWidget(Identifier id, List<WidgetSettingOption> otherCustomOptions) {
@@ -65,6 +91,7 @@ public abstract class BasicTextWidget extends ResizableWidget {
protected int backgroundColor = DEFAULT_BACKGROUND_COLOR, textColor = DEFAULT_TEXT_COLOR, width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;
protected TextAlignment textAlignment = TextAlignment.CENTER;
protected TextStyle textStyle = TextStyle.PLAIN;
@Override
public int width() {
@@ -98,6 +125,14 @@ public abstract class BasicTextWidget extends ResizableWidget {
textY = (height-9) / 2;
}
protected void formatAndSetRenderText(Text renderText) {
if (textStyle != TextStyle.PLAIN){
this.renderText = textStyle.operator.apply(renderText);
} else {
this.renderText = renderText;
}
}
public abstract void tickWidget();
@Override
@@ -110,5 +145,6 @@ public abstract class BasicTextWidget extends ResizableWidget {
this.textAlignment = (TextAlignment) ((EnumWidgetSetting<?>) settings.optionById("alignment")).getValue();
this.padding = ((IntSliderWidgetSetting) settings.optionById("padding")).getValue();
this.textShadow = ((ToggleWidgetSetting) settings.optionById("shadow")).getValue();
this.textStyle = (TextStyle) ((EnumWidgetSetting<?>) settings.optionById("text_style")).getValue();
}
}
@@ -12,11 +12,14 @@ import net.minecraft.world.biome.Biome;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class BiomeWidget extends BasicTextWidget {
public BiomeWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("show_label", Text.translatable("widgets.widgets.common.showLabel"), true)
new ToggleWidgetSetting("show_label", translatable("widgets.widgets.common.showLabel"), true)
));
}
@@ -34,19 +37,19 @@ public class BiomeWidget extends BasicTextWidget {
String text = biome.getKeyOrValue().map(
(biomeKey) -> {
if (showLabel){
return Text.translatable("widgets.widgets.biome.label", Text.translatable(biomeKey.getValue().toTranslationKey("biome"))).getString();
return translatable("widgets.widgets.biome.label", translatable(biomeKey.getValue().toTranslationKey("biome"))).getString();
} else {
return Text.translatable(biomeKey.getValue().toTranslationKey("biome")).getString();
return translatable(biomeKey.getValue().toTranslationKey("biome")).getString();
}
},
(b) -> "[unregistered " + b + "]"
);
this.renderText = Text.literal(text);
formatAndSetRenderText(literal(text));
} else {
if (showLabel){
this.renderText = Text.translatable("widgets.widgets.biome.label", "?");
formatAndSetRenderText(translatable("widgets.widgets.biome.label", "?"));
} else {
this.renderText = Text.literal("?");
formatAndSetRenderText(literal("?"));
}
}
}
@@ -54,12 +57,12 @@ public class BiomeWidget extends BasicTextWidget {
@Override
public Text getName() {
return Text.translatable("widgets.widgets.biome");
return translatable("widgets.widgets.biome");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.biome.description");
return translatable("widgets.widgets.biome.description");
}
@Override
@@ -11,6 +11,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.minecraft.text.Text.literal;
public class CPSWidget extends BasicTextWidget {
public static class Click {
@@ -100,13 +102,10 @@ public class CPSWidget extends BasicTextWidget {
middleClicks.removeIf(click -> click.expiresAt <= mtime);
middle = middleClicks.size();
}
switch (appearance){
case UNIFIED -> renderText = Text.literal((left + right + middle) + " CPS");
case SPLIT_PIPE, SPLIT_SLASH -> {
final StringBuilder sb = getClickText(left, middle, right);
renderText = Text.literal(sb + " CPS");
}
}
formatAndSetRenderText(switch (appearance){
case UNIFIED -> literal((left + right + middle) + " CPS");
case SPLIT_PIPE, SPLIT_SLASH -> literal(getClickText(left, middle, right) + " CPS");
});
}
private @NotNull StringBuilder getClickText(int left, int middle, int right) {
@@ -12,6 +12,8 @@ import java.time.Instant;
import java.util.Date;
import java.util.List;
import static net.minecraft.text.Text.literal;
public class ClockWidget extends BasicTextWidget {
public enum TimeOption {
@@ -95,7 +97,7 @@ public class ClockWidget extends BasicTextWidget {
@Override
public void tickWidget() {
renderText = Text.literal(dateFormat.format(Date.from(Instant.now())));
formatAndSetRenderText(literal(dateFormat.format(Date.from(Instant.now()))));
}
@Override
@@ -6,6 +6,8 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
public class FPSWidget extends BasicTextWidget {
public FPSWidget(Identifier id) {
super(id, List.of());
@@ -13,7 +15,7 @@ public class FPSWidget extends BasicTextWidget {
@Override
public void tickWidget() {
this.renderText = Text.literal(MinecraftClient.getInstance().getCurrentFps() + " FPS");
formatAndSetRenderText(literal(MinecraftClient.getInstance().getCurrentFps() + " FPS"));
}
@Override
@@ -7,6 +7,9 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class MemoryUsageWidget extends BasicTextWidget {
private boolean showPercentage = true;
@@ -14,8 +17,8 @@ public class MemoryUsageWidget extends BasicTextWidget {
public MemoryUsageWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("percentage", Text.translatable("widgets.widgets.memory.showPercentage"), true),
new ToggleWidgetSetting("label", Text.translatable("widgets.widgets.common.showLabel"), true)
new ToggleWidgetSetting("percentage", translatable("widgets.widgets.memory.showPercentage"), true),
new ToggleWidgetSetting("label", translatable("widgets.widgets.common.showLabel"), true)
));
}
@@ -31,9 +34,9 @@ public class MemoryUsageWidget extends BasicTextWidget {
mib(memUsed) + "MiB / " + mib(memTotal) + "MiB (" + memUsagePercent + "%)" :
mib(memUsed) + "MiB / " + mib(memTotal) + "MiB";
if (showLabel){
renderText = Text.literal(Text.translatable("widgets.widgets.memory.withLabel", memUsageString).getString());
formatAndSetRenderText(literal(translatable("widgets.widgets.memory.withLabel", memUsageString).getString()));
} else {
renderText = Text.literal(memUsageString);
formatAndSetRenderText(literal(memUsageString));
}
}
@@ -44,12 +47,12 @@ public class MemoryUsageWidget extends BasicTextWidget {
@Override
public Text getName() {
return Text.translatable("widgets.widgets.memory");
return translatable("widgets.widgets.memory");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.memory.description");
return translatable("widgets.widgets.memory.description");
}
@Override
@@ -12,6 +12,8 @@ import net.minecraft.util.profiler.MultiValueDebugSampleLogImpl;
import java.util.List;
import static net.minecraft.text.Text.literal;
public class PingWidget extends BasicTextWidget {
public PingWidget(Identifier id) {
@@ -48,12 +50,12 @@ public class PingWidget extends BasicTextWidget {
valuesRead++;
}
if (valuesRead == 0){
this.renderText = Text.literal("??? ms");
formatAndSetRenderText(literal("??? ms"));
if (this.dynamicColor) this.textColor = 0xff00ff00;
return;
}
long avgPing = ping / valuesRead;
this.renderText = Text.literal(avgPing + " ms");
formatAndSetRenderText(literal(avgPing + " ms"));
if (this.dynamicColor){
if (avgPing < 50){
this.textColor = 0xff00ff00;
@@ -7,6 +7,8 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
public class PlainTextWidget extends BasicTextWidget {
public PlainTextWidget(Identifier id) {
super(id, List.of(
@@ -30,6 +32,6 @@ public class PlainTextWidget extends BasicTextWidget {
@Override
public void onSettingsChanged(WidgetSettings settings) {
super.onSettingsChanged(settings);
renderText = Text.literal(((TextFieldWidgetSettingOption) settings.optionById("text")).getValue());
formatAndSetRenderText(literal(((TextFieldWidgetSettingOption) settings.optionById("text")).getValue()));
}
}
@@ -7,6 +7,9 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class PlayTimeWidget extends BasicTextWidget {
private static final long startTime = System.nanoTime();
@@ -27,18 +30,18 @@ public class PlayTimeWidget extends BasicTextWidget {
public PlayTimeWidget(Identifier id) {
super(id, List.of(
new EnumWidgetSetting<>("labelstyle", Text.translatable("widgets.widgets.playtime.labelStyle"), LabelStyle.class, LabelStyle.NO_LABEL, labelStyle -> Text.translatable("widgets.widgets.playtime.labelStyle."+labelStyle.key))
new EnumWidgetSetting<>("labelstyle", translatable("widgets.widgets.playtime.labelStyle"), LabelStyle.class, LabelStyle.NO_LABEL, labelStyle -> translatable("widgets.widgets.playtime.labelStyle."+labelStyle.key))
));
}
@Override
public void tickWidget() {
long timePlayedMs = getPlayedMs();
switch (labelStyle){
case NO_LABEL -> renderText = Text.literal(msToTimeStr(timePlayedMs));
case PLAYTIME -> renderText = Text.literal(Text.translatable("widgets.widgets.playtime.playtime", msToTimeStr(timePlayedMs)).getString());
case PLAYED -> renderText = Text.literal(Text.translatable("widgets.widgets.playtime.played", msToTimeStr(timePlayedMs)).getString());
}
formatAndSetRenderText(switch (labelStyle){
case NO_LABEL -> literal(msToTimeStr(timePlayedMs));
case PLAYTIME -> literal(translatable("widgets.widgets.playtime.playtime", msToTimeStr(timePlayedMs)).getString());
case PLAYED -> literal(translatable("widgets.widgets.playtime.played", msToTimeStr(timePlayedMs)).getString());
});
}
private static long getPlayedMs() {
@@ -59,12 +62,12 @@ public class PlayTimeWidget extends BasicTextWidget {
@Override
public Text getName() {
return Text.translatable("widgets.widgets.playtime");
return translatable("widgets.widgets.playtime");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.playtime.description");
return translatable("widgets.widgets.playtime.description");
}
@Override
@@ -10,11 +10,14 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class PlayerCountWidget extends BasicTextWidget{
public PlayerCountWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("showlabel", Text.translatable("widgets.widgets.common.showLabel"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false)
new ToggleWidgetSetting("showlabel", translatable("widgets.widgets.common.showLabel"), true),
new ToggleWidgetSetting("hide_in_singleplayer", translatable("widgets.widgets.common.hideInSingleplayer"), false)
));
}
@@ -27,17 +30,17 @@ public class PlayerCountWidget extends BasicTextWidget{
if (!shouldRender) return;
final ClientPlayNetworkHandler networkHandler = MinecraftClient.getInstance().getNetworkHandler();
String online = networkHandler == null ? "?" : String.valueOf(networkHandler.getListedPlayerListEntries().size());
this.renderText = showLabel ? Text.literal(Text.translatable("widgets.widgets.playerCount.online", online).getString()) : Text.literal(online);
formatAndSetRenderText(showLabel ? literal(translatable("widgets.widgets.playerCount.online", online).getString()) : literal(online));
}
@Override
public Text getName() {
return Text.translatable("widgets.widgets.playerCount");
return translatable("widgets.widgets.playerCount");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.playerCount.description");
return translatable("widgets.widgets.playerCount.description");
}
@Override
@@ -10,11 +10,14 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class ServerIPWidget extends BasicTextWidget {
public ServerIPWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("dynamicwidth", Text.translatable("widgets.widgets.serverIP.dynamicWidth"), true),
new ToggleWidgetSetting("hide_in_singleplayer", Text.translatable("widgets.widgets.common.hideInSingleplayer"), false)
new ToggleWidgetSetting("dynamicwidth", translatable("widgets.widgets.serverIP.dynamicWidth"), true),
new ToggleWidgetSetting("hide_in_singleplayer", translatable("widgets.widgets.common.hideInSingleplayer"), false)
));
getSettings().optionById("width").setShowCondition(() -> !this.dynamicWidth);
}
@@ -31,12 +34,12 @@ public class ServerIPWidget extends BasicTextWidget {
if (!shouldRender) return;
final ServerInfo serverEntry = MinecraftClient.getInstance().getCurrentServerEntry();
if (serverEntry != null){
this.renderText = Text.of(serverEntry.address);
formatAndSetRenderText(literal(serverEntry.address));
} else {
this.renderText = Text.translatable("menu.singleplayer");
formatAndSetRenderText(translatable("menu.singleplayer"));
}
t++;
if (t >= 20){
if (dynamicWidth && t >= 20){
t = 0;
this.width = MinecraftClient.getInstance().textRenderer.getWidth(this.renderText) + 20;
}
@@ -49,12 +52,12 @@ public class ServerIPWidget extends BasicTextWidget {
@Override
public Text getName() {
return Text.translatable("widgets.widgets.serverIP");
return translatable("widgets.widgets.serverIP");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.serverIP.description");
return translatable("widgets.widgets.serverIP.description");
}
@Override
@@ -13,6 +13,8 @@ import net.minecraft.util.math.Vec3d;
import java.util.List;
import static net.minecraft.text.Text.literal;
public class SpeedWidget extends BasicTextWidget {
public enum Unit {
@@ -80,7 +82,7 @@ public class SpeedWidget extends BasicTextWidget {
avg += v;
}
avg /= averagingWindow.length;
renderText = Text.of(reduceDigits(avg) + unit.displayName);
formatAndSetRenderText(literal(reduceDigits(avg) + unit.displayName));
}
private String reduceDigits(double v) {
@@ -10,11 +10,14 @@ import net.minecraft.util.Identifier;
import java.util.List;
import static net.minecraft.text.Text.literal;
import static net.minecraft.text.Text.translatable;
public class TPSWidget extends BasicTextWidget {
public TPSWidget(Identifier id) {
super(id, List.of(
new ToggleWidgetSetting("show_label", Text.translatable("widgets.widgets.common.showLabel"), true),
new ToggleWidgetSetting("dynamic_color", Text.translatable("widgets.widgets.tps.dynamicColor"), true)
new ToggleWidgetSetting("show_label", translatable("widgets.widgets.common.showLabel"), true),
new ToggleWidgetSetting("dynamic_color", translatable("widgets.widgets.tps.dynamicColor"), true)
));
getSettings().optionById("textcolor").setShowCondition(() -> !this.dynamicColor);
INSTANCE = this;
@@ -75,17 +78,17 @@ public class TPSWidget extends BasicTextWidget {
private void updateTPS(float tps, float targetTickRate, boolean loadingFinished) {
if (!loadingFinished){
if (showLabel){
this.renderText = Text.literal(Text.translatable("widgets.widgets.tps.tps", "???").getString());
formatAndSetRenderText(literal(translatable("widgets.widgets.tps.tps", "???").getString()));
} else {
this.renderText = Text.literal("???");
formatAndSetRenderText(literal("???"));
}
if (dynamicColor) this.textColor = 0xff00ff00;
} else {
tps = Math.round(tps * 10f) / 10f;
if (showLabel){
this.renderText = Text.literal(Text.translatable("widgets.widgets.tps.tps", tps).getString());
formatAndSetRenderText(literal(translatable("widgets.widgets.tps.tps", tps).getString()));
} else {
this.renderText = Text.literal(String.valueOf(tps));
formatAndSetRenderText(literal(String.valueOf(tps)));
}
if (dynamicColor){
if (tps >= targetTickRate * 0.990){
@@ -106,12 +109,12 @@ public class TPSWidget extends BasicTextWidget {
@Override
public Text getName() {
return Text.translatable("widgets.widgets.tps");
return translatable("widgets.widgets.tps");
}
@Override
public Text getDescription() {
return Text.translatable("widgets.widgets.tps.description");
return translatable("widgets.widgets.tps.description");
}
@Override
@@ -32,6 +32,7 @@
"widgets.widgets.basictext.paddingY": "Textabstand Y",
"widgets.widgets.basictext.textcolor": "Textfarbe",
"widgets.widgets.basictext.textshadow": "Textschatten",
"widgets.widgets.basictext.textstyle": "Textstil",
"widgets.widgets.basictext.width": "Widget Breite",
"widgets.widgets.biome": "Biom",
"widgets.widgets.biome.description": "Zeigt das Biom an, in dem du dich befindest.",
@@ -110,5 +111,8 @@
"widgets.widgets.tps": "TPS",
"widgets.widgets.tps.description": "Zeigt die TPS im Einzelspielermodus an oder schätzt die TPS im Mehrspielermodus",
"widgets.widgets.tps.dynamicColor": "Farbe dynamisch anzeigen",
"widgets.widgets.tps.tps": "%s TPS"
"widgets.widgets.tps.tps": "%s TPS",
"widgets.widgets.basictext.style.parentheses": "Mit runden Klammern",
"widgets.widgets.basictext.style.plain": "Normal",
"widgets.widgets.basictext.style.squareBrackets": "Mit eckigen Klammern"
}
@@ -30,8 +30,12 @@
"widgets.widgets.basictext.padding": "Text padding",
"widgets.widgets.basictext.paddingX": "Text padding X",
"widgets.widgets.basictext.paddingY": "Text padding Y",
"widgets.widgets.basictext.style.parentheses": "With parentheses",
"widgets.widgets.basictext.style.plain": "Normal",
"widgets.widgets.basictext.style.squareBrackets": "With square brackets",
"widgets.widgets.basictext.textcolor": "Text color",
"widgets.widgets.basictext.textshadow": "Text shadow",
"widgets.widgets.basictext.textstyle": "Text style",
"widgets.widgets.basictext.width": "Widget width",
"widgets.widgets.biome": "Biome",
"widgets.widgets.biome.description": "Shows the biome you're currently in.",