192 lines
8.8 KiB
Java
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) {
|
|
}
|
|
}
|