InputControlHandlers.java
net.minecraft.client.gui.screens.dialog.input.InputControlHandlers
信息
- 全限定名:net.minecraft.client.gui.screens.dialog.input.InputControlHandlers
- 类型:public class
- 包:net.minecraft.client.gui.screens.dialog.input
- 源码路径:src/main/java/net/minecraft/client/gui/screens/dialog/input/InputControlHandlers.java
- 起始行号:L36
- 职责:
TODO
字段/常量
-
LOGGER- 类型:
Logger - 修饰符:
private static final - 源码定位:
L37 - 说明:
TODO
- 类型:
-
HANDLERS- 类型:
Map<MapCodec<?extends InputControl>,InputControlHandler<?>> - 修饰符:
private static final - 源码定位:
L38 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.client.gui.screens.dialog.input.InputControlHandlers.BooleanHandler- 类型:
class - 修饰符:
private static - 源码定位:
L65 - 说明:
TODO
- 类型:
-
net.minecraft.client.gui.screens.dialog.input.InputControlHandlers.NumberRangeHandler- 类型:
class - 修饰符:
private static - 源码定位:
L88 - 说明:
TODO
- 类型:
-
net.minecraft.client.gui.screens.dialog.input.InputControlHandlers.NumberRangeHandler.SliderImpl- 类型:
class - 修饰符:
private static - 源码定位:
L112 - 说明:
TODO
- 类型:
-
net.minecraft.client.gui.screens.dialog.input.InputControlHandlers.SingleOptionHandler- 类型:
class - 修饰符:
private static - 源码定位:
L157 - 说明:
TODO
- 类型:
-
net.minecraft.client.gui.screens.dialog.input.InputControlHandlers.TextInputHandler- 类型:
class - 修饰符:
private static - 源码定位:
L169 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
private static <T extends InputControl> void register(MapCodec<T> type, InputControlHandler<?super T> handler) @ L40
- 方法名:register
- 源码定位:L40
- 返回类型:
void - 修饰符:private static
参数:
- type: MapCodec
- handler: InputControlHandler<?super T>
说明:
TODO
private static <T extends InputControl> InputControlHandler<T> get(T inputControl) @ L44
- 方法名:get
- 源码定位:L44
- 返回类型:
InputControlHandler - 修饰符:private static
参数:
- inputControl: T
说明:
TODO
public static <T extends InputControl> void createHandler(T inputControl, Screen screen, InputControlHandler.Output outputConsumer) @ L48
- 方法名:createHandler
- 源码定位:L48
- 返回类型:
void - 修饰符:public static
参数:
- inputControl: T
- screen: Screen
- outputConsumer: InputControlHandler.Output
说明:
TODO
public static void bootstrap() @ L57
- 方法名:bootstrap
- 源码定位:L57
- 返回类型:void
- 修饰符:public static
参数:
- 无
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class InputControlHandlers {
private static final Logger LOGGER = LogUtils.getLogger();
private static final Map<MapCodec<? extends InputControl>, InputControlHandler<?>> HANDLERS = new HashMap<>();
private static <T extends InputControl> void register(MapCodec<T> type, InputControlHandler<? super T> handler) {
HANDLERS.put(type, handler);
}
private static <T extends InputControl> @Nullable InputControlHandler<T> get(T inputControl) {
return (InputControlHandler<T>)HANDLERS.get(inputControl.mapCodec());
}
public static <T extends InputControl> void createHandler(T inputControl, Screen screen, InputControlHandler.Output outputConsumer) {
InputControlHandler<T> handler = get(inputControl);
if (handler == null) {
LOGGER.warn("Unrecognized input control {}", inputControl);
} else {
handler.addControl(inputControl, screen, outputConsumer);
}
}
public static void bootstrap() {
register(TextInput.MAP_CODEC, new InputControlHandlers.TextInputHandler());
register(SingleOptionInput.MAP_CODEC, new InputControlHandlers.SingleOptionHandler());
register(BooleanInput.MAP_CODEC, new InputControlHandlers.BooleanHandler());
register(NumberRangeInput.MAP_CODEC, new InputControlHandlers.NumberRangeHandler());
}
@OnlyIn(Dist.CLIENT)
private static class BooleanHandler implements InputControlHandler<BooleanInput> {
public void addControl(BooleanInput input, Screen screen, InputControlHandler.Output output) {
Font font = screen.getFont();
final Checkbox control = Checkbox.builder(input.label(), font).selected(input.initial()).build();
output.accept(control, new Action.ValueGetter() {
{
Objects.requireNonNull(BooleanHandler.this);
}
@Override
public String asTemplateSubstitution() {
return control.selected() ? input.onTrue() : input.onFalse();
}
@Override
public Tag asTag() {
return ByteTag.valueOf(control.selected());
}
});
}
}
@OnlyIn(Dist.CLIENT)
private static class NumberRangeHandler implements InputControlHandler<NumberRangeInput> {
public void addControl(NumberRangeInput input, Screen screen, InputControlHandler.Output output) {
float initialValue = input.rangeInfo().initialSliderValue();
final InputControlHandlers.NumberRangeHandler.SliderImpl control = new InputControlHandlers.NumberRangeHandler.SliderImpl(
input, (double)initialValue
);
output.accept(control, new Action.ValueGetter() {
{
Objects.requireNonNull(NumberRangeHandler.this);
}
@Override
public String asTemplateSubstitution() {
return control.stringValueToSend();
}
@Override
public Tag asTag() {
return FloatTag.valueOf(control.floatValueToSend());
}
});
}
@OnlyIn(Dist.CLIENT)
private static class SliderImpl extends AbstractSliderButton {
private final NumberRangeInput input;
private SliderImpl(NumberRangeInput input, double initialSliderValue) {
super(0, 0, input.width(), 20, computeMessage(input, initialSliderValue), initialSliderValue);
this.input = input;
}
@Override
protected void updateMessage() {
this.setMessage(computeMessage(this.input, this.value));
}
@Override
protected void applyValue() {
}
public String stringValueToSend() {
return sliderValueToString(this.input, this.value);
}
public float floatValueToSend() {
return scaledValue(this.input, this.value);
}
private static float scaledValue(NumberRangeInput input, double sliderValue) {
return input.rangeInfo().computeScaledValue((float)sliderValue);
}
private static String sliderValueToString(NumberRangeInput input, double sliderValue) {
return valueToString(scaledValue(input, sliderValue));
}
private static Component computeMessage(NumberRangeInput input, double sliderValue) {
return input.computeLabel(sliderValueToString(input, sliderValue));
}
private static String valueToString(float v) {
int intV = (int)v;
return intV == v ? Integer.toString(intV) : Float.toString(v);
}
}
}
@OnlyIn(Dist.CLIENT)
private static class SingleOptionHandler implements InputControlHandler<SingleOptionInput> {
public void addControl(SingleOptionInput input, Screen screen, InputControlHandler.Output output) {
SingleOptionInput.Entry initial = input.initial().orElse(input.entries().getFirst());
CycleButton.Builder<SingleOptionInput.Entry> controlBuilder = CycleButton.builder(SingleOptionInput.Entry::displayOrDefault, initial)
.withValues(input.entries())
.displayState(!input.labelVisible() ? CycleButton.DisplayState.VALUE : CycleButton.DisplayState.NAME_AND_VALUE);
CycleButton<SingleOptionInput.Entry> control = controlBuilder.create(0, 0, input.width(), 20, input.label());
output.accept(control, Action.ValueGetter.of(() -> control.getValue().id()));
}
}
@OnlyIn(Dist.CLIENT)
private static class TextInputHandler implements InputControlHandler<TextInput> {
public void addControl(TextInput input, Screen screen, InputControlHandler.Output output) {
Font font = screen.getFont();
LayoutElement control;
final Supplier<String> getter;
if (input.multiline().isPresent()) {
TextInput.MultilineOptions multiline = input.multiline().get();
int computedHeight = multiline.height().orElseGet(() -> {
int lineCountToFit = multiline.maxLines().orElse(4);
return Math.min(9 * lineCountToFit + 8, 512);
});
MultiLineEditBox editBox = MultiLineEditBox.builder().build(font, input.width(), computedHeight, CommonComponents.EMPTY);
editBox.setCharacterLimit(input.maxLength());
multiline.maxLines().ifPresent(editBox::setLineLimit);
editBox.setValue(input.initial());
control = editBox;
getter = editBox::getValue;
} else {
EditBox editBox = new EditBox(font, input.width(), 20, input.label());
editBox.setMaxLength(input.maxLength());
editBox.setValue(input.initial());
control = editBox;
getter = editBox::getValue;
}
LayoutElement wrappedControl = (LayoutElement)(input.labelVisible() ? CommonLayouts.labeledElement(font, control, input.label()) : control);
output.accept(wrappedControl, new Action.ValueGetter() {
{
Objects.requireNonNull(TextInputHandler.this);
}
@Override
public String asTemplateSubstitution() {
return StringTag.escapeWithoutQuotes(getter.get());
}
@Override
public Tag asTag() {
return StringTag.valueOf(getter.get());
}
});
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
Checkbox.builder()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
CycleButton.builder()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
EditBox()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
MultiLineEditBox.builder()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
CommonLayouts.labeledElement()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ByteTag.valueOf()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
FloatTag.valueOf()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
StringTag.escapeWithoutQuotes(), StringTag.valueOf()
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
Action.ValueGetter(), Action.ValueGetter.of(), ValueGetter()
- 引用位置:
-
- 引用位置:
字段/返回值
- 引用位置: