Skip to content

Commit 5bda0bd

Browse files
committed
Work on screens
1 parent 6ec1dc1 commit 5bda0bd

File tree

8 files changed

+260
-25
lines changed

8 files changed

+260
-25
lines changed

gradle/libs.versions.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
[versions]
2-
32
kotlin-jvm = "2.2.0"
43
loom = "1.11-SNAPSHOT"
54
publishing = "0.8.4"
@@ -8,7 +7,6 @@ ksp = "2.2.0-2.0.2"
87
fletchingtable = "0.1.0-alpha.13"
98

109
[plugins]
11-
1210
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-jvm" }
1311
loom = { id = "dev.architectury.loom", version.ref = "loom" }
1412
publishing = { id = "me.modmuss50.mod-publish-plugin", version.ref = "publishing" }

src/main/java/btw/lowercase/optiboxes/TestScreen.java

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/main/java/btw/lowercase/optiboxes/command/OptiboxesCommand.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package btw.lowercase.optiboxes.command;
22

33
import btw.lowercase.optiboxes.OptiBoxesClient;
4-
import btw.lowercase.optiboxes.TestScreen;
4+
import btw.lowercase.optiboxes.screens.DimensionsListScreen;
55
import btw.lowercase.optiboxes.skybox.OptiFineSkyLayer;
66
import btw.lowercase.optiboxes.skybox.OptiFineSkybox;
77
import btw.lowercase.optiboxes.skybox.SkyboxManager;
@@ -52,8 +52,8 @@ public OptiboxesCommand() {
5252
return Command.SINGLE_SUCCESS;
5353
}));
5454

55-
then(ClientCommandManager.literal("test").executes((context) -> {
56-
minecraft.schedule(() -> minecraft.setScreen(new TestScreen(minecraft.screen)));
55+
then(ClientCommandManager.literal("manage").executes((context) -> {
56+
minecraft.schedule(() -> minecraft.setScreen(new DimensionsListScreen(minecraft.screen)));
5757
return Command.SINGLE_SUCCESS;
5858
}));
5959
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package btw.lowercase.optiboxes.screens;
2+
3+
import net.minecraft.client.Minecraft;
4+
import net.minecraft.client.gui.GuiGraphics;
5+
import net.minecraft.client.gui.components.AbstractSelectionList;
6+
import net.minecraft.client.gui.components.Button;
7+
import net.minecraft.client.gui.components.ObjectSelectionList;
8+
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
9+
import net.minecraft.network.chat.Component;
10+
import net.minecraft.resources.ResourceKey;
11+
import net.minecraft.world.level.Level;
12+
import org.jetbrains.annotations.NotNull;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
import java.util.function.Consumer;
16+
17+
public class DimensionListWidget extends ObjectSelectionList<DimensionListWidget.Entry> {
18+
public DimensionListWidget(Minecraft minecraft, int width, HeaderAndFooterLayout layout, Consumer<@Nullable ResourceKey<Level>> onPress) {
19+
super(minecraft, width, layout.getContentHeight(), layout.getHeaderHeight(), 20);
20+
this.addEntry(new Entry(Level.OVERWORLD, onPress));
21+
this.addEntry(new Entry(Level.NETHER, onPress));
22+
this.addEntry(new Entry(Level.END, onPress));
23+
this.centerListVertically = false;
24+
}
25+
26+
@Override
27+
protected void renderSelection(GuiGraphics guiGraphics, AbstractSelectionList.Entry<?> entry, int i) {
28+
}
29+
30+
public static class Entry extends ObjectSelectionList.Entry<Entry> {
31+
private final ResourceKey<Level> levelResourceKey;
32+
private final Button selectButton;
33+
34+
public Entry(ResourceKey<Level> resourceKey, Consumer<@Nullable ResourceKey<Level>> onPress) {
35+
this.levelResourceKey = resourceKey;
36+
this.selectButton = Button.builder(Component.literal(this.levelResourceKey.location().toString()), (button) -> onPress.accept(this.levelResourceKey)).size(250, 18).build();
37+
}
38+
39+
@Override
40+
public void renderContent(GuiGraphics guiGraphics, int mouseX, int mouseY, boolean selected, float tickDelta) {
41+
int buttonX = this.getContentX() + ((this.getContentWidth() / 2) - (this.selectButton.getWidth() / 2));
42+
int buttonY = this.getContentY() + ((this.getContentHeight() / 2) - (this.selectButton.getHeight() / 2));
43+
this.selectButton.setPosition(buttonX, buttonY);
44+
this.selectButton.render(guiGraphics, mouseX, mouseY, tickDelta);
45+
}
46+
47+
@Override
48+
public boolean mouseClicked(double d, double e, int i, boolean bl) {
49+
return this.selectButton.mouseClicked(d, e, i, bl);
50+
}
51+
52+
@Override
53+
public boolean keyPressed(int i, int j, int k) {
54+
return this.selectButton.keyPressed(i, j, k);
55+
}
56+
57+
@Override
58+
public @NotNull Component getNarration() {
59+
return Component.translatable(this.levelResourceKey.location().toLanguageKey());
60+
}
61+
}
62+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package btw.lowercase.optiboxes.screens;
2+
3+
import net.minecraft.client.gui.components.Button;
4+
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
5+
import net.minecraft.client.gui.screens.Screen;
6+
import net.minecraft.network.chat.CommonComponents;
7+
import net.minecraft.network.chat.Component;
8+
import net.minecraft.resources.ResourceKey;
9+
import net.minecraft.world.level.Level;
10+
import org.jetbrains.annotations.Nullable;
11+
12+
public class DimensionsListScreen extends Screen {
13+
private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this);
14+
private final Screen lastScreen;
15+
private DimensionListWidget list;
16+
17+
public DimensionsListScreen(Screen lastScreen) {
18+
super(Component.literal("Dimensions"));
19+
this.lastScreen = lastScreen;
20+
}
21+
22+
@Override
23+
protected void init() {
24+
this.addHeader();
25+
this.addContents();
26+
this.addFooter();
27+
this.layout.visitWidgets(this::addRenderableWidget);
28+
this.repositionElements();
29+
}
30+
31+
private void addHeader() {
32+
this.layout.addTitleHeader(this.title, this.font);
33+
}
34+
35+
private void addContents() {
36+
this.list = this.layout.addToContents(new DimensionListWidget(this.minecraft, this.width, this.layout, this::onSelected));
37+
}
38+
39+
private void addFooter() {
40+
this.layout.addToFooter(Button.builder(CommonComponents.GUI_DONE, (button) -> this.onClose()).build());
41+
}
42+
43+
@SuppressWarnings("DataFlowIssue")
44+
private void onSelected(@Nullable ResourceKey<Level> resourceKey) {
45+
if (resourceKey != null) {
46+
this.minecraft.setScreen(new SkyLayerListScreen(this, resourceKey));
47+
}
48+
}
49+
50+
@Override
51+
protected void repositionElements() {
52+
this.layout.arrangeElements();
53+
if (this.list != null) {
54+
this.list.updateSize(this.width, this.layout);
55+
}
56+
}
57+
58+
@Override
59+
@SuppressWarnings("DataFlowIssue")
60+
public void onClose() {
61+
minecraft.setScreen(this.lastScreen);
62+
}
63+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package btw.lowercase.optiboxes.screens;
2+
3+
import btw.lowercase.optiboxes.skybox.SkyboxManager;
4+
import net.minecraft.client.gui.components.Button;
5+
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
6+
import net.minecraft.client.gui.layouts.LayoutSettings;
7+
import net.minecraft.client.gui.screens.Screen;
8+
import net.minecraft.network.chat.CommonComponents;
9+
import net.minecraft.network.chat.Component;
10+
import net.minecraft.resources.ResourceKey;
11+
import net.minecraft.world.level.Level;
12+
13+
public class SkyLayerListScreen extends Screen {
14+
private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this);
15+
private Screen lastScreen;
16+
private final ResourceKey<Level> resourceKey;
17+
private SkyLayerListWidget list;
18+
19+
public SkyLayerListScreen(Screen lastScreen, ResourceKey<Level> resourceKey) {
20+
super(Component.literal("Sky Layers"));
21+
this.lastScreen = lastScreen;
22+
this.resourceKey = resourceKey;
23+
}
24+
25+
@Override
26+
protected void init() {
27+
this.addHeader();
28+
this.addContents();
29+
this.addFooter();
30+
this.layout.visitWidgets(this::addRenderableWidget);
31+
this.repositionElements();
32+
}
33+
34+
private void addHeader() {
35+
this.layout.addTitleHeader(this.title, this.font);
36+
}
37+
38+
private void addContents() {
39+
this.list = this.layout.addToContents(new SkyLayerListWidget(this.minecraft, this.width, this.layout, SkyboxManager.INSTANCE.getSkiesFor(this.resourceKey)));
40+
}
41+
42+
@SuppressWarnings("DataFlowIssue")
43+
private void addFooter() {
44+
this.layout.addToFooter(Button.builder(CommonComponents.GUI_BACK, (button) -> this.minecraft.setScreen(this.lastScreen)).build(), LayoutSettings::alignHorizontallyLeft);
45+
this.layout.addToFooter(Button.builder(CommonComponents.GUI_DONE, (button) -> this.minecraft.setScreen(null)).build(), LayoutSettings::alignHorizontallyRight);
46+
}
47+
48+
@Override
49+
protected void repositionElements() {
50+
this.layout.arrangeElements();
51+
if (this.list != null) {
52+
this.list.updateSize(this.width, this.layout);
53+
}
54+
}
55+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package btw.lowercase.optiboxes.screens;
2+
3+
import btw.lowercase.optiboxes.skybox.OptiFineSkyLayer;
4+
import btw.lowercase.optiboxes.skybox.OptiFineSkybox;
5+
import net.minecraft.client.Minecraft;
6+
import net.minecraft.client.gui.Font;
7+
import net.minecraft.client.gui.GuiGraphics;
8+
import net.minecraft.client.gui.components.ObjectSelectionList;
9+
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
10+
import net.minecraft.network.chat.Component;
11+
import net.minecraft.util.ARGB;
12+
import org.jetbrains.annotations.NotNull;
13+
14+
import java.util.List;
15+
16+
public class SkyLayerListWidget extends ObjectSelectionList<SkyLayerListWidget.SkyboxEntry> {
17+
public SkyLayerListWidget(Minecraft minecraft, int width, HeaderAndFooterLayout layout, List<OptiFineSkybox> skyboxes) {
18+
super(minecraft, width, layout.getContentHeight(), layout.getHeaderHeight(), 20);
19+
this.centerListVertically = false;
20+
int i = 0;
21+
for (OptiFineSkybox skybox : skyboxes) {
22+
this.addEntry(new SkyboxEntry(skybox, i));
23+
i++;
24+
}
25+
}
26+
27+
public static class SkyboxEntry extends ObjectSelectionList.Entry<SkyboxEntry> {
28+
private final OptiFineSkybox skybox;
29+
private final int ordinal;
30+
31+
public SkyboxEntry(OptiFineSkybox skybox, int ordinal) {
32+
this.skybox = skybox;
33+
this.ordinal = ordinal;
34+
}
35+
36+
@Override
37+
public void renderContent(GuiGraphics guiGraphics, int mouseX, int mouseY, boolean selected, float tickDelta) {
38+
Font font = Minecraft.getInstance().font;
39+
String title = "Layer #" + ordinal;
40+
int titleX = this.getContentX() + (this.getContentWidth() / 2);
41+
int titleY = this.getContentY() + ((this.getContentHeight() / 2) - (font.lineHeight / 2));
42+
guiGraphics.drawCenteredString(font, title, titleX, titleY, ARGB.white(1.0F));
43+
}
44+
45+
@Override
46+
public @NotNull Component getNarration() {
47+
return Component.literal(Integer.toString(this.ordinal));
48+
}
49+
}
50+
51+
public static class LayerEntry extends ObjectSelectionList.Entry<LayerEntry> {
52+
private final OptiFineSkyLayer skyLayer;
53+
54+
public LayerEntry(OptiFineSkyLayer skyLayer) {
55+
this.skyLayer = skyLayer;
56+
}
57+
58+
@Override
59+
public void renderContent(GuiGraphics guiGraphics, int mouseX, int mouseY, boolean selected, float tickDelta) {
60+
Font font = Minecraft.getInstance().font;
61+
String title = this.skyLayer.source().toString();
62+
int titleX = this.getContentX() + (this.getContentWidth() / 2);
63+
int titleY = this.getContentY() + ((this.getContentHeight() / 2) - (font.lineHeight / 2));
64+
guiGraphics.drawCenteredString(font, title, titleX, titleY, ARGB.white(1.0F));
65+
}
66+
67+
@Override
68+
public @NotNull Component getNarration() {
69+
return Component.literal(this.skyLayer.source().toString());
70+
}
71+
}
72+
}

src/main/java/btw/lowercase/optiboxes/skybox/SkyboxManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,12 @@ public boolean isEnabled(Level level) {
4848
return OptiBoxesClient.getConfig().enabled.isEnabled() && !activeSkyboxes.isEmpty() && level != null;
4949
}
5050

51+
public List<OptiFineSkybox> getSkiesFor(ResourceKey<Level> resourceKey) {
52+
return getActiveSkyboxes().stream().filter(skybox -> resourceKey.equals(skybox.getWorldResourceKey())).toList();
53+
}
54+
5155
public boolean containsEnabled(ResourceKey<Level> resourceKey) {
52-
return !getActiveSkyboxes().stream().filter(skybox -> resourceKey.location().equals(skybox.getWorldResourceKey().location())).toList().isEmpty();
56+
return !getSkiesFor(resourceKey).isEmpty();
5357
}
5458

5559
public List<OptiFineSkybox> getActiveSkyboxes() {

0 commit comments

Comments
 (0)