minecraft-src/net/minecraft/client/gui/components/ObjectSelectionList.java
2025-07-04 03:15:13 +03:00

85 lines
2.9 KiB
Java

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<E extends ObjectSelectionList.Entry<E>> extends AbstractSelectionList<E> {
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<E extends ObjectSelectionList.Entry<E>> extends AbstractSelectionList.Entry<E> 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());
}
}
}