minecraft-src/net/minecraft/client/gui/ComponentPath.java
2025-07-04 01:41:11 +03:00

97 lines
3.2 KiB
Java

package net.minecraft.client.gui;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.components.events.ContainerEventHandler;
import net.minecraft.client.gui.components.events.GuiEventListener;
import org.jetbrains.annotations.Nullable;
/**
* Represents a path of components in a user interface hierarchy.
* <p>
* It provides methods to create and manipulate component paths.
*/
@Environment(EnvType.CLIENT)
public interface ComponentPath {
/**
* Creates a leaf component path with the specified {@code GuiEventListener} component.
* <p>
* @return a new leaf component path.
*
* @param component the component associated with the leaf path
*/
static ComponentPath leaf(GuiEventListener component) {
return new ComponentPath.Leaf(component);
}
/**
* Creates a component path with the specified {@code ContainerEventHandler} component and an optional child path.
* <p>
* @return a new component path, or {@code null} if the child path is null
*
* @param component the component associated with the path
* @param childPath the child path associated with the component
*/
@Nullable
static ComponentPath path(ContainerEventHandler component, @Nullable ComponentPath childPath) {
return childPath == null ? null : new ComponentPath.Path(component, childPath);
}
/**
* Creates a new {@code ComponentPath} leaf node with the specified {@code GuiEventListener} component and an array of {@code ContainerEventHandler} ancestors.
* <p>
* @return a new component path
*
* @param leafComponent the new 'Leaf' component associated with the path
* @param ancestorComponents the array of ancestor components associated with the path, ordered in reverse ascending order towards root.
*/
static ComponentPath path(GuiEventListener leafComponent, ContainerEventHandler... ancestorComponents) {
ComponentPath componentPath = leaf(leafComponent);
for (ContainerEventHandler containerEventHandler : ancestorComponents) {
componentPath = path(containerEventHandler, componentPath);
}
return componentPath;
}
/**
* {@return the {@code GuiEventListener} component associated with this component path}
*/
GuiEventListener component();
/**
* Applies focus to or removes focus from the component associated with this component path.
*
* @param focused {@code true} to apply focus, {@code false} to remove focus.
*/
void applyFocus(boolean focused);
/**
* The {@code Leaf} class represents a leaf component path in the hierarchy.
*/
@Environment(EnvType.CLIENT)
public record Leaf(GuiEventListener component) implements ComponentPath {
@Override
public void applyFocus(boolean focused) {
this.component.setFocused(focused);
}
}
/**
* The {@code Path} class represents a non-leaf component path in the hierarchy.
*/
@Environment(EnvType.CLIENT)
public record Path(ContainerEventHandler component, ComponentPath childPath) implements ComponentPath {
@Override
public void applyFocus(boolean focused) {
if (!focused) {
this.component.setFocused(null);
} else {
this.component.setFocused(this.childPath.component());
}
this.childPath.applyFocus(focused);
}
}
}