minecraft-src/com/mojang/realmsclient/gui/screens/configuration/RealmsSettingsTab.java
2025-09-18 12:27:44 +00:00

192 lines
8.8 KiB
Java

package com.mojang.realmsclient.gui.screens.configuration;
import com.mojang.realmsclient.dto.RealmsRegion;
import com.mojang.realmsclient.dto.RealmsServer;
import com.mojang.realmsclient.dto.RegionSelectionPreference;
import com.mojang.realmsclient.dto.RegionSelectionPreferenceDto;
import com.mojang.realmsclient.dto.ServiceQuality;
import com.mojang.realmsclient.gui.screens.RealmsPopups;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.ImageWidget;
import net.minecraft.client.gui.components.StringWidget;
import net.minecraft.client.gui.components.tabs.GridLayoutTab;
import net.minecraft.client.gui.layouts.EqualSpacingLayout;
import net.minecraft.client.gui.layouts.GridLayout;
import net.minecraft.client.gui.layouts.SpacerElement;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class RealmsSettingsTab extends GridLayoutTab implements RealmsConfigurationTab {
private static final int COMPONENT_WIDTH = 212;
private static final int EXTRA_SPACING = 2;
private static final int DEFAULT_SPACING = 6;
static final Component TITLE = Component.translatable("mco.configure.world.settings.title");
private static final Component NAME_LABEL = Component.translatable("mco.configure.world.name");
private static final Component DESCRIPTION_LABEL = Component.translatable("mco.configure.world.description");
private static final Component REGION_PREFERENCE_LABEL = Component.translatable("mco.configure.world.region_preference");
private final RealmsConfigureWorldScreen configurationScreen;
private final Minecraft minecraft;
private RealmsServer serverData;
private final Map<RealmsRegion, ServiceQuality> regionServiceQuality;
final Button closeOpenButton;
private EditBox descEdit;
private EditBox nameEdit;
private final StringWidget selectedRegionStringWidget;
private final ImageWidget selectedRegionImageWidget;
private RealmsSettingsTab.RegionSelection preferredRegionSelection;
RealmsSettingsTab(
RealmsConfigureWorldScreen configurationScreen, Minecraft minecraft, RealmsServer serverData, Map<RealmsRegion, ServiceQuality> regionServiceQuality
) {
super(TITLE);
this.configurationScreen = configurationScreen;
this.minecraft = minecraft;
this.serverData = serverData;
this.regionServiceQuality = regionServiceQuality;
GridLayout.RowHelper rowHelper = this.layout.rowSpacing(6).createRowHelper(1);
rowHelper.addChild(new StringWidget(NAME_LABEL, configurationScreen.getFont()));
this.nameEdit = new EditBox(minecraft.font, 0, 0, 212, 20, Component.translatable("mco.configure.world.name"));
this.nameEdit.setMaxLength(32);
rowHelper.addChild(this.nameEdit);
rowHelper.addChild(SpacerElement.height(2));
rowHelper.addChild(new StringWidget(DESCRIPTION_LABEL, configurationScreen.getFont()));
this.descEdit = new EditBox(minecraft.font, 0, 0, 212, 20, Component.translatable("mco.configure.world.description"));
this.descEdit.setMaxLength(32);
rowHelper.addChild(this.descEdit);
rowHelper.addChild(SpacerElement.height(2));
rowHelper.addChild(new StringWidget(REGION_PREFERENCE_LABEL, configurationScreen.getFont()));
EqualSpacingLayout equalSpacingLayout = new EqualSpacingLayout(0, 0, 212, 9, EqualSpacingLayout.Orientation.HORIZONTAL);
this.selectedRegionStringWidget = equalSpacingLayout.addChild(new StringWidget(192, 9, Component.empty(), configurationScreen.getFont()).alignLeft());
this.selectedRegionImageWidget = equalSpacingLayout.addChild(ImageWidget.sprite(10, 8, ServiceQuality.UNKNOWN.getIcon()));
rowHelper.addChild(equalSpacingLayout);
rowHelper.addChild(
Button.builder(Component.translatable("mco.configure.world.buttons.region_preference"), button -> this.openPreferenceSelector())
.bounds(0, 0, 212, 20)
.build()
);
rowHelper.addChild(SpacerElement.height(2));
this.closeOpenButton = rowHelper.addChild(
Button.builder(
Component.empty(),
button -> {
if (serverData.state == RealmsServer.State.OPEN) {
minecraft.setScreen(
RealmsPopups.customPopupScreen(
configurationScreen,
Component.translatable("mco.configure.world.close.question.title"),
Component.translatable("mco.configure.world.close.question.line1"),
popupScreen -> {
this.save();
configurationScreen.closeTheWorld();
}
)
);
} else {
this.save();
configurationScreen.openTheWorld(false);
}
}
)
.bounds(0, 0, 212, 20)
.build()
);
this.closeOpenButton.active = false;
this.updateData(serverData);
}
private static MutableComponent getTranslatableFromPreference(RealmsSettingsTab.RegionSelection regionSelection) {
return (regionSelection.preference().equals(RegionSelectionPreference.MANUAL) && regionSelection.region() != null
? Component.translatable(regionSelection.region().translationKey)
: Component.translatable(regionSelection.preference().translationKey))
.withStyle(ChatFormatting.GRAY);
}
private static ResourceLocation getServiceQualityIcon(RealmsSettingsTab.RegionSelection regionSelection, Map<RealmsRegion, ServiceQuality> qualities) {
if (regionSelection.region() != null && qualities.containsKey(regionSelection.region())) {
ServiceQuality serviceQuality = (ServiceQuality)qualities.getOrDefault(regionSelection.region(), ServiceQuality.UNKNOWN);
return serviceQuality.getIcon();
} else {
return ServiceQuality.UNKNOWN.getIcon();
}
}
private void openPreferenceSelector() {
this.minecraft
.setScreen(
new RealmsPreferredRegionSelectionScreen(
this.configurationScreen, this::applyRegionPreferenceSelection, this.regionServiceQuality, this.preferredRegionSelection
)
);
}
private void applyRegionPreferenceSelection(RegionSelectionPreference regionSelectionPreference, RealmsRegion preferredRegion) {
this.preferredRegionSelection = new RealmsSettingsTab.RegionSelection(regionSelectionPreference, preferredRegion);
this.updateRegionPreferenceValues();
}
private void updateRegionPreferenceValues() {
this.selectedRegionStringWidget.setMessage(getTranslatableFromPreference(this.preferredRegionSelection));
this.selectedRegionImageWidget.updateResource(getServiceQualityIcon(this.preferredRegionSelection, this.regionServiceQuality));
this.selectedRegionImageWidget.visible = this.preferredRegionSelection.preference == RegionSelectionPreference.MANUAL;
}
@Override
public void onSelected(RealmsServer server) {
this.updateData(server);
}
@Override
public void updateData(RealmsServer server) {
this.serverData = server;
if (server.regionSelectionPreference == null) {
server.regionSelectionPreference = RegionSelectionPreferenceDto.DEFAULT;
}
if (server.regionSelectionPreference.regionSelectionPreference == RegionSelectionPreference.MANUAL
&& server.regionSelectionPreference.preferredRegion == null) {
Optional<RealmsRegion> optional = this.regionServiceQuality.keySet().stream().findFirst();
optional.ifPresent(realmsRegion -> server.regionSelectionPreference.preferredRegion = realmsRegion);
}
String string = server.state == RealmsServer.State.OPEN ? "mco.configure.world.buttons.close" : "mco.configure.world.buttons.open";
this.closeOpenButton.setMessage(Component.translatable(string));
this.closeOpenButton.active = true;
this.preferredRegionSelection = new RealmsSettingsTab.RegionSelection(
server.regionSelectionPreference.regionSelectionPreference, server.regionSelectionPreference.preferredRegion
);
this.nameEdit.setValue((String)Objects.requireNonNullElse(server.getName(), ""));
this.descEdit.setValue(server.getDescription());
this.updateRegionPreferenceValues();
}
@Override
public void onDeselected(RealmsServer server) {
this.save();
}
public void save() {
if (this.serverData.regionSelectionPreference == null
|| !Objects.equals(this.nameEdit.getValue(), this.serverData.name)
|| !Objects.equals(this.descEdit.getValue(), this.serverData.motd)
|| this.preferredRegionSelection.preference() != this.serverData.regionSelectionPreference.regionSelectionPreference
|| this.preferredRegionSelection.region() != this.serverData.regionSelectionPreference.preferredRegion) {
this.configurationScreen
.saveSettings(this.nameEdit.getValue(), this.descEdit.getValue(), this.preferredRegionSelection.preference(), this.preferredRegionSelection.region());
}
}
@Environment(EnvType.CLIENT)
public record RegionSelection(RegionSelectionPreference preference, @Nullable RealmsRegion region) {
}
}