mirror of
https://github.com/TeamMidnightDust/MidnightLib.git
synced 2025-12-15 17:05:09 +01:00
fixed rendering order for (most) screens & widgets
This commit is contained in:
@@ -1,11 +1,14 @@
|
|||||||
package eu.midnightdust.core.mixin;
|
package eu.midnightdust.core.mixin;
|
||||||
|
|
||||||
|
import com.llamalad7.mixinextras.sugar.Local;
|
||||||
|
import com.llamalad7.mixinextras.sugar.SugarBridge;
|
||||||
import eu.midnightdust.core.config.MidnightLibConfig;
|
import eu.midnightdust.core.config.MidnightLibConfig;
|
||||||
import eu.midnightdust.core.screen.MidnightConfigOverviewScreen;
|
import eu.midnightdust.core.screen.MidnightConfigOverviewScreen;
|
||||||
import eu.midnightdust.lib.util.PlatformFunctions;
|
import eu.midnightdust.lib.util.PlatformFunctions;
|
||||||
import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget;
|
import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget;
|
||||||
import net.minecraft.client.gui.screen.Screen;
|
import net.minecraft.client.gui.screen.Screen;
|
||||||
import net.minecraft.client.gui.screen.option.OptionsScreen;
|
import net.minecraft.client.gui.screen.option.OptionsScreen;
|
||||||
|
import net.minecraft.client.gui.widget.GridWidget;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@@ -13,21 +16,40 @@ import org.spongepowered.asm.mixin.Unique;
|
|||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static eu.midnightdust.core.config.MidnightLibConfig.shouldShowButton;
|
||||||
|
|
||||||
@Mixin(OptionsScreen.class)
|
@Mixin(OptionsScreen.class)
|
||||||
public class MixinOptionsScreen extends Screen {
|
public class MixinOptionsScreen extends Screen {
|
||||||
|
|
||||||
|
@Unique private static final Identifier MIDNIGHTLIB_ICON_TEXTURE = Identifier.of("midnightlib","icon/midnightlib.png");
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private static final Identifier MIDNIGHTLIB_ICON_TEXTURE = new Identifier("midnightlib","textures/gui/midnightlib_button.png");
|
TexturedOverlayButtonWidget midnightlib$button = new TexturedOverlayButtonWidget(
|
||||||
|
this.width / 2 + 158,
|
||||||
|
this.height / 6 - 12,
|
||||||
|
20,
|
||||||
|
20,
|
||||||
|
0, 0, 20,
|
||||||
|
MIDNIGHTLIB_ICON_TEXTURE,
|
||||||
|
32, 64,
|
||||||
|
(buttonWidget) ->
|
||||||
|
Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)),
|
||||||
|
Text.translatable("midnightlib.overview.title"));
|
||||||
|
|
||||||
protected MixinOptionsScreen(Text title) {
|
protected MixinOptionsScreen(Text title) {
|
||||||
super(title);
|
super(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(at = @At("HEAD"),method = "init")
|
@Inject(at = @At("HEAD"), method = "init")
|
||||||
private void midnightlib$init(CallbackInfo ci) {
|
private void midnightlib$init(CallbackInfo ci) {
|
||||||
if (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.TRUE) || (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.MODMENU) && !PlatformFunctions.isModLoaded("modmenu")))
|
if (shouldShowButton()){
|
||||||
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20, 0, 0, 20, MIDNIGHTLIB_ICON_TEXTURE, 32, 64, (buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), Text.translatable("midnightlib.overview.title")));
|
midnightlib$button.setPosition(this.width / 2 + 158, this.height / 6 - 12);
|
||||||
|
this.addDrawableChild(midnightlib$button);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package eu.midnightdust.core.screen;
|
|||||||
|
|
||||||
import eu.midnightdust.core.MidnightLib;
|
import eu.midnightdust.core.MidnightLib;
|
||||||
import eu.midnightdust.lib.config.MidnightConfig;
|
import eu.midnightdust.lib.config.MidnightConfig;
|
||||||
|
import eu.midnightdust.lib.config.MidnightConfig.MidnightConfigListWidget;
|
||||||
import net.fabricmc.api.EnvType;
|
import net.fabricmc.api.EnvType;
|
||||||
import net.fabricmc.api.Environment;
|
import net.fabricmc.api.Environment;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@@ -23,24 +24,30 @@ public class MidnightConfigOverviewScreen extends Screen {
|
|||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
private final Screen parent;
|
private final Screen parent;
|
||||||
private MidnightOverviewListWidget list;
|
private MidnightConfigListWidget list;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void init() {
|
protected void init() {
|
||||||
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 28, 200, 20).build());
|
this.addDrawableChild(
|
||||||
|
ButtonWidget.builder(
|
||||||
|
ScreenTexts.DONE,
|
||||||
|
(button) ->
|
||||||
|
Objects.requireNonNull(client).setScreen(parent))
|
||||||
|
.dimensions(this.width / 2 - 100, this.height - 28, 200, 20)
|
||||||
|
.build());
|
||||||
|
|
||||||
this.list = new MidnightOverviewListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
|
|
||||||
if (this.client != null && this.client.world != null) this.list.setRenderBackground(false);
|
|
||||||
this.addSelectableChild(this.list);
|
|
||||||
List<String> sortedMods = new ArrayList<>(MidnightConfig.configClass.keySet());
|
List<String> sortedMods = new ArrayList<>(MidnightConfig.configClass.keySet());
|
||||||
Collections.sort(sortedMods);
|
Collections.sort(sortedMods);
|
||||||
|
list = new MidnightConfigListWidget(this.client, this.width, this.height, this.height - 57, 25);
|
||||||
sortedMods.forEach((modid) -> {
|
sortedMods.forEach((modid) -> {
|
||||||
if (!MidnightLib.hiddenMods.contains(modid)) {
|
if (!MidnightLib.hiddenMods.contains(modid)) {
|
||||||
list.addButton(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) ->
|
list.addButton(List.of(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) ->
|
||||||
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build());
|
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this, modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build()), null, null);
|
||||||
}
|
}});
|
||||||
});
|
if (this.client != null && this.client.world != null) this.list.setRenderBackground(false);
|
||||||
|
this.addSelectableChild(this.list);
|
||||||
super.init();
|
super.init();
|
||||||
|
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
||||||
@@ -48,39 +55,6 @@ public class MidnightConfigOverviewScreen extends Screen {
|
|||||||
this.list.render(context, mouseX, mouseY, delta);
|
this.list.render(context, mouseX, mouseY, delta);
|
||||||
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF);
|
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF);
|
||||||
super.render(context, mouseX, mouseY, delta);
|
super.render(context, mouseX, mouseY, delta);
|
||||||
}
|
|
||||||
@Environment(EnvType.CLIENT)
|
|
||||||
public static class MidnightOverviewListWidget extends ElementListWidget<OverviewButtonEntry> {
|
|
||||||
TextRenderer textRenderer;
|
|
||||||
|
|
||||||
public MidnightOverviewListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l, int m) {
|
|
||||||
super(minecraftClient, i, j, k, l, m);
|
|
||||||
this.centerListVertically = false;
|
|
||||||
textRenderer = minecraftClient.textRenderer;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public int getScrollbarPositionX() {return this.width-7;}
|
|
||||||
|
|
||||||
public void addButton(ClickableWidget button) {
|
|
||||||
this.addEntry(OverviewButtonEntry.create(button));
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public int getRowWidth() { return 400; }
|
|
||||||
}
|
|
||||||
public static class OverviewButtonEntry extends ElementListWidget.Entry<OverviewButtonEntry> {
|
|
||||||
private final ClickableWidget button;
|
|
||||||
private final List<ClickableWidget> buttonList = new ArrayList<>();
|
|
||||||
|
|
||||||
private OverviewButtonEntry(ClickableWidget button) {
|
|
||||||
this.button = button;
|
|
||||||
this.buttonList.add(button);
|
|
||||||
}
|
|
||||||
public static OverviewButtonEntry create(ClickableWidget button) {return new OverviewButtonEntry(button);}
|
|
||||||
public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
|
|
||||||
button.setY(y);
|
|
||||||
button.render(context, mouseX, mouseY, tickDelta);
|
|
||||||
}
|
|
||||||
public List<? extends Element> children() {return buttonList;}
|
|
||||||
public List<? extends Selectable> selectableChildren() {return buttonList;}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -357,9 +357,8 @@ public abstract class MidnightConfig {
|
|||||||
Objects.requireNonNull(client).setScreen(parent);
|
Objects.requireNonNull(client).setScreen(parent);
|
||||||
}).dimensions(this.width / 2 + 4, this.height - 26, 150, 20).build());
|
}).dimensions(this.width / 2 + 4, this.height - 26, 150, 20).build());
|
||||||
|
|
||||||
this.list = new MidnightConfigListWidget(this.client, this.width, this.height, this.height - 57, 24, 25);
|
this.list = new MidnightConfigListWidget(this.client, this.width, 0, this.height - 57, 25);
|
||||||
this.addSelectableChild(this.list); fillList();
|
this.addSelectableChild(this.list); fillList();
|
||||||
if (tabs.size() > 1) list.renderHeaderSeparator = false;
|
|
||||||
}
|
}
|
||||||
public void updateList() {
|
public void updateList() {
|
||||||
this.list.clear(); fillList();
|
this.list.clear(); fillList();
|
||||||
@@ -377,11 +376,17 @@ public abstract class MidnightConfig {
|
|||||||
}
|
}
|
||||||
if (info.modid.equals(modid) && (info.tab == null || info.tab == tabManager.getCurrentTab())) {
|
if (info.modid.equals(modid) && (info.tab == null || info.tab == tabManager.getCurrentTab())) {
|
||||||
Text name = Objects.requireNonNullElseGet(info.name, () -> Text.translatable(translationPrefix + info.fieldName));
|
Text name = Objects.requireNonNullElseGet(info.name, () -> Text.translatable(translationPrefix + info.fieldName));
|
||||||
IconButtonWidget resetButton = IconButtonWidget.builder(Text.translatable("controls.reset"), Identifier.of("midnightlib","icon/reset"), (button -> {
|
IconButtonWidget resetButton = IconButtonWidget.builder(
|
||||||
|
Text.translatable("controls.reset"),
|
||||||
|
Identifier.of("midnightlib","icon/reset.png"),
|
||||||
|
(button -> {
|
||||||
info.value = info.defaultValue; info.listIndex = 0;
|
info.value = info.defaultValue; info.listIndex = 0;
|
||||||
info.tempValue = info.toTemporaryValue();
|
info.tempValue = info.toTemporaryValue();
|
||||||
updateList();
|
updateList();
|
||||||
}) ).build();
|
}))
|
||||||
|
// .iconSize(12, 12)
|
||||||
|
.textureSize(12, 12)
|
||||||
|
.build();
|
||||||
resetButton.setPosition(width - 205 + 150 + 25, 0);
|
resetButton.setPosition(width - 205 + 150 + 25, 0);
|
||||||
|
|
||||||
if (info.function != null) {
|
if (info.function != null) {
|
||||||
@@ -429,7 +434,7 @@ public abstract class MidnightConfig {
|
|||||||
} catch (Exception ignored) {}
|
} catch (Exception ignored) {}
|
||||||
info.actionButton = colorButton;
|
info.actionButton = colorButton;
|
||||||
} else if (e.selectionMode() > -1) {
|
} else if (e.selectionMode() > -1) {
|
||||||
ButtonWidget explorerButton = IconButtonWidget.builder(Text.empty(), Identifier.of("midnightlib", "icon/explorer"),
|
ButtonWidget explorerButton = IconButtonWidget.builder(Text.empty(), Identifier.of("midnightlib", "icon/explorer.png"),
|
||||||
button -> new Thread(() -> {
|
button -> new Thread(() -> {
|
||||||
JFileChooser fileChooser = new JFileChooser(info.tempValue);
|
JFileChooser fileChooser = new JFileChooser(info.tempValue);
|
||||||
fileChooser.setFileSelectionMode(e.selectionMode()); fileChooser.setDialogType(e.fileChooserType());
|
fileChooser.setFileSelectionMode(e.selectionMode()); fileChooser.setDialogType(e.fileChooserType());
|
||||||
@@ -464,17 +469,19 @@ public abstract class MidnightConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
|
|
||||||
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
|
||||||
super.render(context, mouseX, mouseY, delta);
|
this.renderBackground(context);
|
||||||
this.list.render(context, mouseX, mouseY, delta);
|
this.list.render(context, mouseX, mouseY, delta);
|
||||||
if (tabs.size() < 2) context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 10, 0xFFFFFFFF);
|
if (tabs.size() < 2) context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFFFF);
|
||||||
|
super.render(context, mouseX, mouseY, delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Environment(EnvType.CLIENT)
|
@Environment(EnvType.CLIENT)
|
||||||
public static class MidnightConfigListWidget extends ElementListWidget<ButtonEntry> {
|
public static class MidnightConfigListWidget extends ElementListWidget<ButtonEntry> {
|
||||||
public boolean renderHeaderSeparator = true;
|
public MidnightConfigListWidget(MinecraftClient client, int width, int height, int y, int itemHeight)
|
||||||
public MidnightConfigListWidget(MinecraftClient client, int width, int height, int yStart, int y, int itemHeight) { super(client, width, height, yStart, y, itemHeight); }
|
{ super(client, width, height, 30, y, itemHeight); }
|
||||||
@Override public int getScrollbarPositionX() { return this.width -7; }
|
@Override public int getScrollbarPositionX() { return this.width - 7; }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@Override
|
@Override
|
||||||
@@ -485,6 +492,7 @@ public abstract class MidnightConfig {
|
|||||||
RenderSystem.disableBlend(); }
|
RenderSystem.disableBlend(); }
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public void addButton(List<ClickableWidget> buttons, Text text, EntryInfo info) { this.addEntry(new ButtonEntry(buttons, text, info)); }
|
public void addButton(List<ClickableWidget> buttons, Text text, EntryInfo info) { this.addEntry(new ButtonEntry(buttons, text, info)); }
|
||||||
public void clear() { this.clearEntries(); }
|
public void clear() { this.clearEntries(); }
|
||||||
@Override public int getRowWidth() { return 10000; }
|
@Override public int getRowWidth() { return 10000; }
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 136 B After Width: | Height: | Size: 136 B |
Binary file not shown.
|
After Width: | Height: | Size: 293 B |
|
Before Width: | Height: | Size: 114 B After Width: | Height: | Size: 114 B |
Binary file not shown.
|
Before Width: | Height: | Size: 960 B |
@@ -28,7 +28,7 @@ public class MidnightLibExtras {
|
|||||||
KeybindButton editButton = new KeybindButton(screen.width - 185, 0, 150, 20, binding);
|
KeybindButton editButton = new KeybindButton(screen.width - 185, 0, 150, 20, binding);
|
||||||
IconButtonWidget resetButton = IconButtonWidget.builder(
|
IconButtonWidget resetButton = IconButtonWidget.builder(
|
||||||
Text.translatable("controls.reset"),
|
Text.translatable("controls.reset"),
|
||||||
Identifier.of("midnightlib", "icon/reset"),
|
Identifier.of("midnightlib", "icon/reset.png"),
|
||||||
(button -> {
|
(button -> {
|
||||||
binding.setBoundKey(binding.getDefaultKey());
|
binding.setBoundKey(binding.getDefaultKey());
|
||||||
screen.updateList();
|
screen.updateList();
|
||||||
|
|||||||
Reference in New Issue
Block a user