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

    • 引用位置: 方法调用
    • 关联成员: Checkbox.builder()
  • CycleButton

    • 引用位置: 方法调用
    • 关联成员: CycleButton.builder()
  • EditBox

    • 引用位置: 构造调用
    • 关联成员: EditBox()
  • MultiLineEditBox

    • 引用位置: 方法调用
    • 关联成员: MultiLineEditBox.builder()
  • CommonLayouts

    • 引用位置: 方法调用
    • 关联成员: CommonLayouts.labeledElement()
  • Screen

    • 引用位置: 参数
  • InputControlHandler

    • 引用位置: 参数/字段/返回值
  • ByteTag

    • 引用位置: 方法调用
    • 关联成员: ByteTag.valueOf()
  • FloatTag

    • 引用位置: 方法调用
    • 关联成员: FloatTag.valueOf()
  • StringTag

    • 引用位置: 方法调用
    • 关联成员: StringTag.escapeWithoutQuotes(), StringTag.valueOf()
  • Action

    • 引用位置: 方法调用/构造调用
    • 关联成员: Action.ValueGetter(), Action.ValueGetter.of(), ValueGetter()
  • InputControl

    • 引用位置: 字段/返回值