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);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |