165 lines
6.8 KiB
Java
165 lines
6.8 KiB
Java
package com.mojang.realmsclient.gui.screens.configuration;
|
|
|
|
import com.mojang.realmsclient.dto.RealmsRegion;
|
|
import com.mojang.realmsclient.dto.RegionSelectionPreference;
|
|
import com.mojang.realmsclient.dto.ServiceQuality;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.function.BiConsumer;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
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.ObjectSelectionList;
|
|
import net.minecraft.client.gui.components.StringWidget;
|
|
import net.minecraft.client.gui.layouts.HeaderAndFooterLayout;
|
|
import net.minecraft.client.gui.layouts.LinearLayout;
|
|
import net.minecraft.client.gui.screens.Screen;
|
|
import net.minecraft.client.renderer.RenderPipelines;
|
|
import net.minecraft.network.chat.CommonComponents;
|
|
import net.minecraft.network.chat.Component;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class RealmsPreferredRegionSelectionScreen extends Screen {
|
|
private static final Component REGION_SELECTION_LABEL = Component.translatable("mco.configure.world.region_preference.title");
|
|
private static final int SPACING = 8;
|
|
private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this);
|
|
private final Screen parent;
|
|
private final BiConsumer<RegionSelectionPreference, RealmsRegion> applySettings;
|
|
final Map<RealmsRegion, ServiceQuality> regionServiceQuality;
|
|
@Nullable
|
|
private RealmsPreferredRegionSelectionScreen.RegionSelectionList list;
|
|
RealmsSettingsTab.RegionSelection selection;
|
|
@Nullable
|
|
private Button doneButton;
|
|
|
|
public RealmsPreferredRegionSelectionScreen(
|
|
Screen parent,
|
|
BiConsumer<RegionSelectionPreference, RealmsRegion> applySettings,
|
|
Map<RealmsRegion, ServiceQuality> regionServiceQuality,
|
|
RealmsSettingsTab.RegionSelection selection
|
|
) {
|
|
super(REGION_SELECTION_LABEL);
|
|
this.parent = parent;
|
|
this.applySettings = applySettings;
|
|
this.regionServiceQuality = regionServiceQuality;
|
|
this.selection = selection;
|
|
}
|
|
|
|
@Override
|
|
public void onClose() {
|
|
this.minecraft.setScreen(this.parent);
|
|
}
|
|
|
|
@Override
|
|
protected void init() {
|
|
LinearLayout linearLayout = this.layout.addToHeader(LinearLayout.vertical().spacing(8));
|
|
linearLayout.defaultCellSetting().alignHorizontallyCenter();
|
|
linearLayout.addChild(new StringWidget(this.getTitle(), this.font));
|
|
this.list = this.layout.addToContents(new RealmsPreferredRegionSelectionScreen.RegionSelectionList());
|
|
LinearLayout linearLayout2 = this.layout.addToFooter(LinearLayout.horizontal().spacing(8));
|
|
this.doneButton = linearLayout2.addChild(Button.builder(CommonComponents.GUI_DONE, button -> {
|
|
this.applySettings.accept(this.selection.preference(), this.selection.region());
|
|
this.onClose();
|
|
}).build());
|
|
linearLayout2.addChild(Button.builder(CommonComponents.GUI_CANCEL, button -> this.onClose()).build());
|
|
this.list
|
|
.setSelected(
|
|
(RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry)this.list
|
|
.children()
|
|
.stream()
|
|
.filter(entry -> Objects.equals(entry.regionSelection, this.selection))
|
|
.findFirst()
|
|
.orElse(null)
|
|
);
|
|
this.layout.visitWidgets(guiEventListener -> {
|
|
AbstractWidget var10000 = this.addRenderableWidget(guiEventListener);
|
|
});
|
|
this.repositionElements();
|
|
}
|
|
|
|
@Override
|
|
protected void repositionElements() {
|
|
this.layout.arrangeElements();
|
|
this.list.updateSize(this.width, this.layout);
|
|
}
|
|
|
|
void updateButtonValidity() {
|
|
this.doneButton.active = this.list.getSelected() != null;
|
|
}
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
class RegionSelectionList extends ObjectSelectionList<RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry> {
|
|
RegionSelectionList() {
|
|
super(
|
|
RealmsPreferredRegionSelectionScreen.this.minecraft,
|
|
RealmsPreferredRegionSelectionScreen.this.width,
|
|
RealmsPreferredRegionSelectionScreen.this.height - 77,
|
|
40,
|
|
16
|
|
);
|
|
this.addEntry(new RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry(RegionSelectionPreference.AUTOMATIC_PLAYER, null));
|
|
this.addEntry(new RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry(RegionSelectionPreference.AUTOMATIC_OWNER, null));
|
|
RealmsPreferredRegionSelectionScreen.this.regionServiceQuality
|
|
.keySet()
|
|
.stream()
|
|
.map(realmsRegion -> new RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry(RegionSelectionPreference.MANUAL, realmsRegion))
|
|
.forEach(entry -> this.addEntry(entry));
|
|
}
|
|
|
|
public void setSelected(@Nullable RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry selected) {
|
|
super.setSelected(selected);
|
|
if (selected != null) {
|
|
RealmsPreferredRegionSelectionScreen.this.selection = selected.regionSelection;
|
|
}
|
|
|
|
RealmsPreferredRegionSelectionScreen.this.updateButtonValidity();
|
|
}
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
class Entry extends ObjectSelectionList.Entry<RealmsPreferredRegionSelectionScreen.RegionSelectionList.Entry> {
|
|
final RealmsSettingsTab.RegionSelection regionSelection;
|
|
private final Component name;
|
|
|
|
public Entry(final RegionSelectionPreference regionSelectionPreference, @Nullable final RealmsRegion preferredRegion) {
|
|
this(new RealmsSettingsTab.RegionSelection(regionSelectionPreference, preferredRegion));
|
|
}
|
|
|
|
public Entry(final RealmsSettingsTab.RegionSelection regionSelection) {
|
|
this.regionSelection = regionSelection;
|
|
if (regionSelection.preference() == RegionSelectionPreference.MANUAL) {
|
|
if (regionSelection.region() != null) {
|
|
this.name = Component.translatable(regionSelection.region().translationKey);
|
|
} else {
|
|
this.name = Component.empty();
|
|
}
|
|
} else {
|
|
this.name = Component.translatable(regionSelection.preference().translationKey);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Component getNarration() {
|
|
return Component.translatable("narrator.select", this.name);
|
|
}
|
|
|
|
@Override
|
|
public void render(GuiGraphics guiGraphics, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean hovering, float partialTick) {
|
|
guiGraphics.drawString(RealmsPreferredRegionSelectionScreen.this.font, this.name, left + 5, top + 2, -1);
|
|
if (this.regionSelection.region() != null && RealmsPreferredRegionSelectionScreen.this.regionServiceQuality.containsKey(this.regionSelection.region())) {
|
|
ServiceQuality serviceQuality = (ServiceQuality)RealmsPreferredRegionSelectionScreen.this.regionServiceQuality
|
|
.getOrDefault(this.regionSelection.region(), ServiceQuality.UNKNOWN);
|
|
guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, serviceQuality.getIcon(), left + width - 18, top + 2, 10, 8);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
|
RegionSelectionList.this.setSelected(this);
|
|
return super.mouseClicked(mouseX, mouseY, button);
|
|
}
|
|
}
|
|
}
|
|
}
|