RealmsSettingsTab.java

com.mojang.realmsclient.gui.screens.configuration.RealmsSettingsTab

信息

  • 全限定名:com.mojang.realmsclient.gui.screens.configuration.RealmsSettingsTab
  • 类型:public class
  • 包:com.mojang.realmsclient.gui.screens.configuration
  • 源码路径:src/main/java/com/mojang/realmsclient/gui/screens/configuration/RealmsSettingsTab.java
  • 起始行号:L31
  • 继承:GridLayoutTab
  • 实现:RealmsConfigurationTab
  • 职责:

    TODO

字段/常量

  • COMPONENT_WIDTH

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L32
    • 说明:

      TODO

  • EXTRA_SPACING

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L33
    • 说明:

      TODO

  • DEFAULT_SPACING

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L34
    • 说明:

      TODO

  • TITLE

    • 类型: Component
    • 修饰符: static final
    • 源码定位: L35
    • 说明:

      TODO

  • NAME_LABEL

    • 类型: Component
    • 修饰符: private static final
    • 源码定位: L36
    • 说明:

      TODO

  • DESCRIPTION_LABEL

    • 类型: Component
    • 修饰符: private static final
    • 源码定位: L37
    • 说明:

      TODO

  • REGION_PREFERENCE_LABEL

    • 类型: Component
    • 修饰符: private static final
    • 源码定位: L38
    • 说明:

      TODO

  • REALM_NAME_VALIDATION_ERROR_TOOLTIP

    • 类型: Tooltip
    • 修饰符: private static final
    • 源码定位: L39
    • 说明:

      TODO

  • configurationScreen

    • 类型: RealmsConfigureWorldScreen
    • 修饰符: private final
    • 源码定位: L40
    • 说明:

      TODO

  • minecraft

    • 类型: Minecraft
    • 修饰符: private final
    • 源码定位: L41
    • 说明:

      TODO

  • serverData

    • 类型: RealmsServer
    • 修饰符: private
    • 源码定位: L42
    • 说明:

      TODO

  • regionServiceQuality

    • 类型: Map<RealmsRegion,ServiceQuality>
    • 修饰符: private final
    • 源码定位: L43
    • 说明:

      TODO

  • closeOpenButton

    • 类型: Button
    • 修饰符: final
    • 源码定位: L44
    • 说明:

      TODO

  • descEdit

    • 类型: EditBox
    • 修饰符: private final
    • 源码定位: L45
    • 说明:

      TODO

  • nameEdit

    • 类型: EditBox
    • 修饰符: private final
    • 源码定位: L46
    • 说明:

      TODO

  • selectedRegionStringWidget

    • 类型: StringWidget
    • 修饰符: private final
    • 源码定位: L47
    • 说明:

      TODO

  • selectedRegionImageWidget

    • 类型: ImageWidget
    • 修饰符: private final
    • 源码定位: L48
    • 说明:

      TODO

  • preferredRegionSelection

    • 类型: RealmsSettingsTab.RegionSelection
    • 修饰符: private
    • 源码定位: L49
    • 说明:

      TODO

内部类/嵌套类型

  • com.mojang.realmsclient.gui.screens.configuration.RealmsSettingsTab.RegionSelection
    • 类型: record
    • 修饰符: public
    • 源码定位: L208
    • 说明:

      TODO

构造器

RealmsSettingsTab(RealmsConfigureWorldScreen configurationScreen, Minecraft minecraft, RealmsServer serverData, Map<RealmsRegion,ServiceQuality> regionServiceQuality) @ L51

  • 构造器名:RealmsSettingsTab
  • 源码定位:L51
  • 修饰符:package-private

参数:

  • configurationScreen: RealmsConfigureWorldScreen
  • minecraft: Minecraft
  • serverData: RealmsServer
  • regionServiceQuality: Map<RealmsRegion,ServiceQuality>

说明:

TODO

方法

下面的方法块按源码顺序生成。

private static MutableComponent getTranslatableFromPreference(RealmsSettingsTab.RegionSelection regionSelection) @ L119

  • 方法名:getTranslatableFromPreference
  • 源码定位:L119
  • 返回类型:MutableComponent
  • 修饰符:private static

参数:

  • regionSelection: RealmsSettingsTab.RegionSelection

说明:

TODO

private static Identifier getServiceQualityIcon(RealmsSettingsTab.RegionSelection regionSelection, Map<RealmsRegion,ServiceQuality> regionServiceQuality) @ L126

  • 方法名:getServiceQualityIcon
  • 源码定位:L126
  • 返回类型:Identifier
  • 修饰符:private static

参数:

  • regionSelection: RealmsSettingsTab.RegionSelection
  • regionServiceQuality: Map<RealmsRegion,ServiceQuality>

说明:

TODO

private boolean isRealmNameValid() @ L135

  • 方法名:isRealmNameValid
  • 源码定位:L135
  • 返回类型:boolean
  • 修饰符:private

参数:

说明:

TODO

private void openPreferenceSelector() @ L141

  • 方法名:openPreferenceSelector
  • 源码定位:L141
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

private void applyRegionPreferenceSelection(RegionSelectionPreference preference, RealmsRegion region) @ L150

  • 方法名:applyRegionPreferenceSelection
  • 源码定位:L150
  • 返回类型:void
  • 修饰符:private

参数:

  • preference: RegionSelectionPreference
  • region: RealmsRegion

说明:

TODO

private void updateRegionPreferenceValues() @ L155

  • 方法名:updateRegionPreferenceValues
  • 源码定位:L155
  • 返回类型:void
  • 修饰符:private

参数:

说明:

TODO

public void onSelected(RealmsServer serverData) @ L161

  • 方法名:onSelected
  • 源码定位:L161
  • 返回类型:void
  • 修饰符:public

参数:

  • serverData: RealmsServer

说明:

TODO

public void updateData(RealmsServer serverData) @ L166

  • 方法名:updateData
  • 源码定位:L166
  • 返回类型:void
  • 修饰符:public

参数:

  • serverData: RealmsServer

说明:

TODO

public void onDeselected(RealmsServer serverData) @ L190

  • 方法名:onDeselected
  • 源码定位:L190
  • 返回类型:void
  • 修饰符:public

参数:

  • serverData: RealmsServer

说明:

TODO

public void save() @ L195

  • 方法名:save
  • 源码定位:L195
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

代码

@OnlyIn(Dist.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 static final Tooltip REALM_NAME_VALIDATION_ERROR_TOOLTIP = Tooltip.create(Component.translatable("mco.configure.world.name.validation.whitespace"));
    private final RealmsConfigureWorldScreen configurationScreen;
    private final Minecraft minecraft;
    private RealmsServer serverData;
    private final Map<RealmsRegion, ServiceQuality> regionServiceQuality;
    final Button closeOpenButton;
    private final EditBox descEdit;
    private final 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 helper = this.layout.rowSpacing(6).createRowHelper(1);
        helper.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);
        this.nameEdit.setResponder(value -> {
            if (!this.isRealmNameValid()) {
                this.nameEdit.setTextColor(-2142128);
                this.nameEdit.setTooltip(REALM_NAME_VALIDATION_ERROR_TOOLTIP);
            } else {
                this.nameEdit.setTooltip(null);
                this.nameEdit.setTextColor(-2039584);
            }
        });
        helper.addChild(this.nameEdit);
        helper.addChild(SpacerElement.height(2));
        helper.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);
        helper.addChild(this.descEdit);
        helper.addChild(SpacerElement.height(2));
        helper.addChild(new StringWidget(REGION_PREFERENCE_LABEL, configurationScreen.getFont()));
        EqualSpacingLayout selectedRegion = new EqualSpacingLayout(0, 0, 212, 9, EqualSpacingLayout.Orientation.HORIZONTAL);
        this.selectedRegionStringWidget = selectedRegion.addChild(new StringWidget(192, 9, Component.empty(), configurationScreen.getFont()));
        this.selectedRegionImageWidget = selectedRegion.addChild(ImageWidget.sprite(10, 8, ServiceQuality.UNKNOWN.getIcon()));
        helper.addChild(selectedRegion);
        helper.addChild(
            Button.builder(Component.translatable("mco.configure.world.buttons.region_preference"), button -> this.openPreferenceSelector())
                .bounds(0, 0, 212, 20)
                .build()
        );
        helper.addChild(SpacerElement.height(2));
        this.closeOpenButton = helper.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"),
                                    popup -> {
                                        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 Identifier getServiceQualityIcon(RealmsSettingsTab.RegionSelection regionSelection, Map<RealmsRegion, ServiceQuality> regionServiceQuality) {
        if (regionSelection.region() != null && regionServiceQuality.containsKey(regionSelection.region())) {
            ServiceQuality serviceQuality = regionServiceQuality.getOrDefault(regionSelection.region(), ServiceQuality.UNKNOWN);
            return serviceQuality.getIcon();
        } else {
            return ServiceQuality.UNKNOWN.getIcon();
        }
    }
 
    private boolean isRealmNameValid() {
        String name = this.nameEdit.getValue();
        String trimmedName = name.trim();
        return !trimmedName.isEmpty() && name.length() == trimmedName.length();
    }
 
    private void openPreferenceSelector() {
        this.minecraft
            .setScreen(
                new RealmsPreferredRegionSelectionScreen(
                    this.configurationScreen, this::applyRegionPreferenceSelection, this.regionServiceQuality, this.preferredRegionSelection
                )
            );
    }
 
    private void applyRegionPreferenceSelection(RegionSelectionPreference preference, RealmsRegion region) {
        this.preferredRegionSelection = new RealmsSettingsTab.RegionSelection(preference, region);
        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 serverData) {
        this.updateData(serverData);
    }
 
    @Override
    public void updateData(RealmsServer serverData) {
        this.serverData = serverData;
        if (serverData.regionSelectionPreference == null) {
            serverData.regionSelectionPreference = RegionSelectionPreferenceDto.DEFAULT;
        }
 
        if (serverData.regionSelectionPreference.regionSelectionPreference == RegionSelectionPreference.MANUAL
            && serverData.regionSelectionPreference.preferredRegion == null) {
            Optional<RealmsRegion> first = this.regionServiceQuality.keySet().stream().findFirst();
            first.ifPresent(region -> serverData.regionSelectionPreference.preferredRegion = region);
        }
 
        String key = serverData.state == RealmsServer.State.OPEN ? "mco.configure.world.buttons.close" : "mco.configure.world.buttons.open";
        this.closeOpenButton.setMessage(Component.translatable(key));
        this.closeOpenButton.active = true;
        this.preferredRegionSelection = new RealmsSettingsTab.RegionSelection(
            serverData.regionSelectionPreference.regionSelectionPreference, serverData.regionSelectionPreference.preferredRegion
        );
        this.nameEdit.setValue(Objects.requireNonNullElse(serverData.getName(), ""));
        this.descEdit.setValue(serverData.getDescription());
        this.updateRegionPreferenceValues();
    }
 
    @Override
    public void onDeselected(RealmsServer serverData) {
        this.save();
    }
 
    public void save() {
        String realmName = this.nameEdit.getValue().trim();
        if (this.serverData.regionSelectionPreference == null
            || !Objects.equals(realmName, 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(realmName, this.descEdit.getValue(), this.preferredRegionSelection.preference(), this.preferredRegionSelection.region());
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public record RegionSelection(RegionSelectionPreference preference, @Nullable RealmsRegion region) {
    }
}

引用的其他类