TelemetryEventWidget.java

net.minecraft.client.gui.screens.telemetry.TelemetryEventWidget

信息

  • 全限定名:net.minecraft.client.gui.screens.telemetry.TelemetryEventWidget
  • 类型:public class
  • 包:net.minecraft.client.gui.screens.telemetry
  • 源码路径:src/main/java/net/minecraft/client/gui/screens/telemetry/TelemetryEventWidget.java
  • 起始行号:L28
  • 继承:AbstractTextAreaWidget
  • 职责:

    TODO

字段/常量

  • HEADER_HORIZONTAL_PADDING

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L29
    • 说明:

      TODO

  • TELEMETRY_REQUIRED_TRANSLATION_KEY

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L30
    • 说明:

      TODO

  • TELEMETRY_OPTIONAL_TRANSLATION_KEY

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L31
    • 说明:

      TODO

  • TELEMETRY_OPTIONAL_DISABLED_TRANSLATION_KEY

    • 类型: String
    • 修饰符: private static final
    • 源码定位: L32
    • 说明:

      TODO

  • PROPERTY_TITLE

    • 类型: Component
    • 修饰符: private static final
    • 源码定位: L33
    • 说明:

      TODO

  • font

    • 类型: Font
    • 修饰符: private final
    • 源码定位: L34
    • 说明:

      TODO

  • content

    • 类型: TelemetryEventWidget.Content
    • 修饰符: private
    • 源码定位: L35
    • 说明:

      TODO

  • onScrolledListener

    • 类型: DoubleConsumer
    • 修饰符: private
    • 源码定位: L36
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.gui.screens.telemetry.TelemetryEventWidget.Content

    • 类型: record
    • 修饰符: private
    • 源码定位: L129
    • 说明:

      TODO

  • net.minecraft.client.gui.screens.telemetry.TelemetryEventWidget.ContentBuilder

    • 类型: class
    • 修饰符: private static
    • 源码定位: L133
    • 说明:

      TODO

构造器

public TelemetryEventWidget(int x, int y, int width, int height, Font font) @ L38

  • 构造器名:TelemetryEventWidget
  • 源码定位:L38
  • 修饰符:public

参数:

  • x: int
  • y: int
  • width: int
  • height: int
  • font: Font

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void onOptInChanged(boolean optIn) @ L44

  • 方法名:onOptInChanged
  • 源码定位:L44
  • 返回类型:void
  • 修饰符:public

参数:

  • optIn: boolean

说明:

TODO

public void updateLayout() @ L49

  • 方法名:updateLayout
  • 源码定位:L49
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

private TelemetryEventWidget.Content buildContent(boolean hasOptedIn) @ L54

  • 方法名:buildContent
  • 源码定位:L54
  • 返回类型:TelemetryEventWidget.Content
  • 修饰符:private

参数:

  • hasOptedIn: boolean

说明:

TODO

public void setOnScrolledListener(DoubleConsumer listener) @ L71

  • 方法名:setOnScrolledListener
  • 源码定位:L71
  • 返回类型:void
  • 修饰符:public

参数:

  • listener: DoubleConsumer

说明:

TODO

public void setScrollAmount(double scrollAmount) @ L75

  • 方法名:setScrollAmount
  • 源码定位:L75
  • 返回类型:void
  • 修饰符:public

参数:

  • scrollAmount: double

说明:

TODO

protected int getInnerHeight() @ L83

  • 方法名:getInnerHeight
  • 源码定位:L83
  • 返回类型:int
  • 修饰符:protected

参数:

说明:

TODO

protected void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) @ L88

  • 方法名:extractContents
  • 源码定位:L88
  • 返回类型:void
  • 修饰符:protected

参数:

  • graphics: GuiGraphicsExtractor
  • mouseX: int
  • mouseY: int
  • a: float

说明:

TODO

protected void updateWidgetNarration(NarrationElementOutput output) @ L98

  • 方法名:updateWidgetNarration
  • 源码定位:L98
  • 返回类型:void
  • 修饰符:protected

参数:

  • output: NarrationElementOutput

说明:

TODO

private Component grayOutIfDisabled(Component component, boolean isDisabled) @ L103

  • 方法名:grayOutIfDisabled
  • 源码定位:L103
  • 返回类型:Component
  • 修饰符:private

参数:

  • component: Component
  • isDisabled: boolean

说明:

TODO

private void addEventType(TelemetryEventWidget.ContentBuilder builder, TelemetryEventType eventType, boolean isDisabled) @ L107

  • 方法名:addEventType
  • 源码定位:L107
  • 返回类型:void
  • 修饰符:private

参数:

  • builder: TelemetryEventWidget.ContentBuilder
  • eventType: TelemetryEventType
  • isDisabled: boolean

说明:

TODO

private void addEventTypeProperties(TelemetryEventType eventType, TelemetryEventWidget.ContentBuilder content, boolean isDisabled) @ L118

  • 方法名:addEventTypeProperties
  • 源码定位:L118
  • 返回类型:void
  • 修饰符:private

参数:

  • eventType: TelemetryEventType
  • content: TelemetryEventWidget.ContentBuilder
  • isDisabled: boolean

说明:

TODO

private int containerWidth() @ L124

  • 方法名:containerWidth
  • 源码定位:L124
  • 返回类型:int
  • 修饰符:private

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class TelemetryEventWidget extends AbstractTextAreaWidget {
    private static final int HEADER_HORIZONTAL_PADDING = 32;
    private static final String TELEMETRY_REQUIRED_TRANSLATION_KEY = "telemetry.event.required";
    private static final String TELEMETRY_OPTIONAL_TRANSLATION_KEY = "telemetry.event.optional";
    private static final String TELEMETRY_OPTIONAL_DISABLED_TRANSLATION_KEY = "telemetry.event.optional.disabled";
    private static final Component PROPERTY_TITLE = Component.translatable("telemetry_info.property_title").withStyle(ChatFormatting.UNDERLINE);
    private final Font font;
    private TelemetryEventWidget.Content content;
    private @Nullable DoubleConsumer onScrolledListener;
 
    public TelemetryEventWidget(int x, int y, int width, int height, Font font) {
        super(x, y, width, height, Component.empty(), AbstractScrollArea.defaultSettings(9));
        this.font = font;
        this.content = this.buildContent(Minecraft.getInstance().telemetryOptInExtra());
    }
 
    public void onOptInChanged(boolean optIn) {
        this.content = this.buildContent(optIn);
        this.refreshScrollAmount();
    }
 
    public void updateLayout() {
        this.content = this.buildContent(Minecraft.getInstance().telemetryOptInExtra());
        this.refreshScrollAmount();
    }
 
    private TelemetryEventWidget.Content buildContent(boolean hasOptedIn) {
        TelemetryEventWidget.ContentBuilder content = new TelemetryEventWidget.ContentBuilder(this.containerWidth());
        List<TelemetryEventType> eventTypes = new ArrayList<>(TelemetryEventType.values());
        eventTypes.sort(Comparator.comparing(TelemetryEventType::isOptIn));
 
        for (int i = 0; i < eventTypes.size(); i++) {
            TelemetryEventType eventType = eventTypes.get(i);
            boolean isDisabled = eventType.isOptIn() && !hasOptedIn;
            this.addEventType(content, eventType, isDisabled);
            if (i < eventTypes.size() - 1) {
                content.addSpacer(9);
            }
        }
 
        return content.build();
    }
 
    public void setOnScrolledListener(@Nullable DoubleConsumer listener) {
        this.onScrolledListener = listener;
    }
 
    @Override
    public void setScrollAmount(double scrollAmount) {
        super.setScrollAmount(scrollAmount);
        if (this.onScrolledListener != null) {
            this.onScrolledListener.accept(this.scrollAmount());
        }
    }
 
    @Override
    protected int getInnerHeight() {
        return this.content.container().getHeight();
    }
 
    @Override
    protected void extractContents(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) {
        int top = this.getInnerTop();
        int left = this.getInnerLeft();
        graphics.pose().pushMatrix();
        graphics.pose().translate(left, top);
        this.content.container().visitWidgets(widget -> widget.extractRenderState(graphics, mouseX, mouseY, a));
        graphics.pose().popMatrix();
    }
 
    @Override
    protected void updateWidgetNarration(NarrationElementOutput output) {
        output.add(NarratedElementType.TITLE, this.content.narration());
    }
 
    private Component grayOutIfDisabled(Component component, boolean isDisabled) {
        return (Component)(isDisabled ? component.copy().withStyle(ChatFormatting.GRAY) : component);
    }
 
    private void addEventType(TelemetryEventWidget.ContentBuilder builder, TelemetryEventType eventType, boolean isDisabled) {
        String titleTranslationPattern = eventType.isOptIn()
            ? (isDisabled ? "telemetry.event.optional.disabled" : "telemetry.event.optional")
            : "telemetry.event.required";
        builder.addHeader(this.font, this.grayOutIfDisabled(Component.translatable(titleTranslationPattern, eventType.title()), isDisabled));
        builder.addHeader(this.font, eventType.description().withStyle(ChatFormatting.GRAY));
        builder.addSpacer(9 / 2);
        builder.addLine(this.font, this.grayOutIfDisabled(PROPERTY_TITLE, isDisabled), 2);
        this.addEventTypeProperties(eventType, builder, isDisabled);
    }
 
    private void addEventTypeProperties(TelemetryEventType eventType, TelemetryEventWidget.ContentBuilder content, boolean isDisabled) {
        for (TelemetryProperty<?> property : eventType.properties()) {
            content.addLine(this.font, this.grayOutIfDisabled(property.title(), isDisabled));
        }
    }
 
    private int containerWidth() {
        return this.width - this.totalInnerPadding();
    }
 
    @OnlyIn(Dist.CLIENT)
    private record Content(Layout container, Component narration) {
    }
 
    @OnlyIn(Dist.CLIENT)
    private static class ContentBuilder {
        private final int width;
        private final LinearLayout layout;
        private final MutableComponent narration = Component.empty();
 
        public ContentBuilder(int width) {
            this.width = width;
            this.layout = LinearLayout.vertical();
            this.layout.defaultCellSetting().alignHorizontallyLeft();
            this.layout.addChild(SpacerElement.width(width));
        }
 
        public void addLine(Font font, Component line) {
            this.addLine(font, line, 0);
        }
 
        public void addLine(Font font, Component line, int paddingBottom) {
            this.layout.addChild(new MultiLineTextWidget(line, font).setMaxWidth(this.width), s -> s.paddingBottom(paddingBottom));
            this.narration.append(line).append("\n");
        }
 
        public void addHeader(Font font, Component line) {
            this.layout
                .addChild(
                    new MultiLineTextWidget(line, font).setMaxWidth(this.width - 64).setCentered(true), s -> s.alignHorizontallyCenter().paddingHorizontal(32)
                );
            this.narration.append(line).append("\n");
        }
 
        public void addSpacer(int height) {
            this.layout.addChild(SpacerElement.height(height));
        }
 
        public TelemetryEventWidget.Content build() {
            this.layout.arrangeElements();
            return new TelemetryEventWidget.Content(this.layout, this.narration);
        }
    }
}

引用的其他类