package net.minecraft.client.gui.components; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.narration.NarratedElementType; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.narration.NarrationSupplier; import net.minecraft.client.gui.navigation.FocusNavigationEvent; import net.minecraft.client.gui.navigation.FocusNavigationEvent.ArrowNavigation; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.Nullable; @Environment(EnvType.CLIENT) public abstract class ObjectSelectionList> extends AbstractSelectionList { private static final Component USAGE_NARRATION = Component.translatable("narration.selection.usage"); public ObjectSelectionList(Minecraft minecraft, int i, int j, int k, int l) { super(minecraft, i, j, k, l); } public ObjectSelectionList(Minecraft minecraft, int i, int j, int k, int l, int m) { super(minecraft, i, j, k, l, m); } @Nullable @Override public ComponentPath nextFocusPath(FocusNavigationEvent event) { if (this.getItemCount() == 0) { return null; } else if (this.isFocused() && event instanceof ArrowNavigation arrowNavigation) { E entry = this.nextEntry(arrowNavigation.direction()); if (entry != null) { return ComponentPath.path(this, ComponentPath.leaf(entry)); } else { this.setSelected(null); return null; } } else if (!this.isFocused()) { E entry2 = this.getSelected(); if (entry2 == null) { entry2 = this.nextEntry(event.getVerticalDirectionForInitialFocus()); } return entry2 == null ? null : ComponentPath.path(this, ComponentPath.leaf(entry2)); } else { return null; } } @Override public void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { E entry = this.getHovered(); if (entry != null) { this.narrateListElementPosition(narrationElementOutput.nest(), entry); entry.updateNarration(narrationElementOutput); } else { E entry2 = this.getSelected(); if (entry2 != null) { this.narrateListElementPosition(narrationElementOutput.nest(), entry2); entry2.updateNarration(narrationElementOutput); } } if (this.isFocused()) { narrationElementOutput.add(NarratedElementType.USAGE, USAGE_NARRATION); } } @Environment(EnvType.CLIENT) public abstract static class Entry> extends AbstractSelectionList.Entry implements NarrationSupplier { public abstract Component getNarration(); @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { return true; } @Override public void updateNarration(NarrationElementOutput narrationElementOutput) { narrationElementOutput.add(NarratedElementType.TITLE, this.getNarration()); } } }