minecraft-src/net/minecraft/client/gui/screens/multiplayer/ServerLinksScreen.java
2025-07-04 02:00:41 +03:00

107 lines
3.7 KiB
Java

package net.minecraft.client.gui.screens.multiplayer;
import java.util.List;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.ContainerObjectSelectionList;
import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.screens.ConfirmLinkScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component;
import net.minecraft.server.ServerLinks;
import net.minecraft.server.ServerLinks.Entry;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class ServerLinksScreen extends Screen {
private static final int LINK_BUTTON_WIDTH = 310;
private static final int DEFAULT_ITEM_HEIGHT = 25;
private static final Component TITLE = Component.translatable("menu.server_links.title");
private final Screen lastScreen;
@Nullable
private ServerLinksScreen.LinkList list;
final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this);
final ServerLinks links;
public ServerLinksScreen(Screen lastScreen, ServerLinks links) {
super(TITLE);
this.lastScreen = lastScreen;
this.links = links;
}
@Override
protected void init() {
this.layout.addTitleHeader(this.title, this.font);
this.list = this.layout.addToContents(new ServerLinksScreen.LinkList(this.minecraft, this.width, this));
this.layout.addToFooter(Button.builder(CommonComponents.GUI_BACK, button -> this.onClose()).width(200).build());
this.layout.visitWidgets(guiEventListener -> {
AbstractWidget var10000 = this.addRenderableWidget(guiEventListener);
});
this.repositionElements();
}
@Override
protected void repositionElements() {
this.layout.arrangeElements();
if (this.list != null) {
this.list.updateSize(this.width, this.layout);
}
}
@Override
public void onClose() {
this.minecraft.setScreen(this.lastScreen);
}
@Environment(EnvType.CLIENT)
static class LinkList extends ContainerObjectSelectionList<ServerLinksScreen.LinkListEntry> {
public LinkList(Minecraft minecraft, int width, ServerLinksScreen parent) {
super(minecraft, width, parent.layout.getContentHeight(), parent.layout.getHeaderHeight(), 25);
parent.links.entries().forEach(entry -> this.addEntry(new ServerLinksScreen.LinkListEntry(parent, entry)));
}
@Override
public int getRowWidth() {
return 310;
}
@Override
public void updateSize(int width, HeaderAndFooterLayout layout) {
super.updateSize(width, layout);
int i = width / 2 - 155;
this.children().forEach(linkListEntry -> linkListEntry.button.setX(i));
}
}
@Environment(EnvType.CLIENT)
static class LinkListEntry extends ContainerObjectSelectionList.Entry<ServerLinksScreen.LinkListEntry> {
final AbstractWidget button;
LinkListEntry(Screen screen, Entry entry) {
this.button = Button.builder(entry.displayName(), ConfirmLinkScreen.confirmLink(screen, entry.link(), false)).width(310).build();
}
@Override
public void render(GuiGraphics guiGraphics, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean hovering, float partialTick) {
this.button.setY(top);
this.button.render(guiGraphics, mouseX, mouseY, partialTick);
}
@Override
public List<? extends GuiEventListener> children() {
return List.of(this.button);
}
@Override
public List<? extends NarratableEntry> narratables() {
return List.of(this.button);
}
}
}