OptionsList.java

net.minecraft.client.gui.components.OptionsList

信息

  • 全限定名:net.minecraft.client.gui.components.OptionsList
  • 类型:public class
  • 包:net.minecraft.client.gui.components
  • 源码路径:src/main/java/net/minecraft/client/gui/components/OptionsList.java
  • 起始行号:L19
  • 继承:ContainerObjectSelectionList<OptionsList.AbstractEntry>
  • 职责:

    TODO

字段/常量

  • BIG_BUTTON_WIDTH

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

      TODO

  • DEFAULT_ITEM_HEIGHT

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

      TODO

  • screen

    • 类型: OptionsSubScreen
    • 修饰符: private final
    • 源码定位: L22
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.gui.components.OptionsList.AbstractEntry

    • 类型: class
    • 修饰符: protected abstract static
    • 源码定位: L107
    • 说明:

      TODO

  • net.minecraft.client.gui.components.OptionsList.Entry

    • 类型: class
    • 修饰符: protected static
    • 源码定位: L111
    • 说明:

      TODO

  • net.minecraft.client.gui.components.OptionsList.HeaderEntry

    • 类型: class
    • 修饰符: protected static
    • 源码定位: L188
    • 说明:

      TODO

  • net.minecraft.client.gui.components.OptionsList.OptionInstanceWidget

    • 类型: record
    • 修饰符: public
    • 源码定位: L217
    • 说明:

      TODO

构造器

public OptionsList(Minecraft minecraft, int width, OptionsSubScreen screen) @ L24

  • 构造器名:OptionsList
  • 源码定位:L24
  • 修饰符:public

参数:

  • minecraft: Minecraft
  • width: int
  • screen: OptionsSubScreen

说明:

TODO

方法

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

public void addBig(OptionInstance<?> option) @ L30

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

参数:

  • option: OptionInstance<?>

说明:

TODO

public void addSmall(OptionInstance<?>... options) @ L34

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

参数:

  • options: OptionInstance<?>…

说明:

TODO

public void addSmall(List<AbstractWidget> widgets) @ L41

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

参数:

  • widgets: List

说明:

TODO

public void addSmall(AbstractWidget firstOption, AbstractWidget secondOption) @ L47

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

参数:

  • firstOption: AbstractWidget
  • secondOption: AbstractWidget

说明:

TODO

public void addSmall(AbstractWidget firstOption, OptionInstance<?> firstOptionInstance, AbstractWidget secondOption) @ L51

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

参数:

  • firstOption: AbstractWidget
  • firstOptionInstance: OptionInstance<?>
  • secondOption: AbstractWidget

说明:

TODO

public void addHeader(Component text) @ L55

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

参数:

  • text: Component

说明:

TODO

public int getRowWidth() @ L61

  • 方法名:getRowWidth
  • 源码定位:L61
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public AbstractWidget findOption(OptionInstance<?> option) @ L66

  • 方法名:findOption
  • 源码定位:L66
  • 返回类型:AbstractWidget
  • 修饰符:public

参数:

  • option: OptionInstance<?>

说明:

TODO

public void applyUnsavedChanges() @ L79

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

参数:

说明:

TODO

public void resetOption(OptionInstance<?> option) @ L92

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

参数:

  • option: OptionInstance<?>

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class OptionsList extends ContainerObjectSelectionList<OptionsList.AbstractEntry> {
    private static final int BIG_BUTTON_WIDTH = 310;
    private static final int DEFAULT_ITEM_HEIGHT = 25;
    private final OptionsSubScreen screen;
 
    public OptionsList(Minecraft minecraft, int width, OptionsSubScreen screen) {
        super(minecraft, width, screen.layout.getContentHeight(), screen.layout.getHeaderHeight(), 25);
        this.centerListVertically = false;
        this.screen = screen;
    }
 
    public void addBig(OptionInstance<?> option) {
        this.addEntry(OptionsList.Entry.big(this.minecraft.options, option, this.screen));
    }
 
    public void addSmall(OptionInstance<?>... options) {
        for (int i = 0; i < options.length; i += 2) {
            OptionInstance<?> secondOption = i < options.length - 1 ? options[i + 1] : null;
            this.addEntry(OptionsList.Entry.small(this.minecraft.options, options[i], secondOption, this.screen));
        }
    }
 
    public void addSmall(List<AbstractWidget> widgets) {
        for (int i = 0; i < widgets.size(); i += 2) {
            this.addSmall(widgets.get(i), i < widgets.size() - 1 ? widgets.get(i + 1) : null);
        }
    }
 
    public void addSmall(AbstractWidget firstOption, @Nullable AbstractWidget secondOption) {
        this.addEntry(OptionsList.Entry.small(firstOption, secondOption, this.screen));
    }
 
    public void addSmall(AbstractWidget firstOption, OptionInstance<?> firstOptionInstance, @Nullable AbstractWidget secondOption) {
        this.addEntry(OptionsList.Entry.small(firstOption, firstOptionInstance, secondOption, this.screen));
    }
 
    public void addHeader(Component text) {
        int lineHeight = 9;
        int paddingTop = this.children().isEmpty() ? 0 : lineHeight * 2;
        this.addEntry(new OptionsList.HeaderEntry(this.screen, text, paddingTop), paddingTop + lineHeight + 4);
    }
 
    @Override
    public int getRowWidth() {
        return 310;
    }
 
    public @Nullable AbstractWidget findOption(OptionInstance<?> option) {
        for (OptionsList.AbstractEntry child : this.children()) {
            if (child instanceof OptionsList.Entry entry) {
                AbstractWidget widgetForOption = entry.findOption(option);
                if (widgetForOption != null) {
                    return widgetForOption;
                }
            }
        }
 
        return null;
    }
 
    public void applyUnsavedChanges() {
        for (OptionsList.AbstractEntry child : this.children()) {
            if (child instanceof OptionsList.Entry entry) {
                for (OptionsList.OptionInstanceWidget optionInstanceWidget : entry.children) {
                    if (optionInstanceWidget.optionInstance() != null
                        && optionInstanceWidget.widget() instanceof OptionInstance.OptionInstanceSliderButton<?> optionSlider) {
                        optionSlider.applyUnsavedValue();
                    }
                }
            }
        }
    }
 
    public void resetOption(OptionInstance<?> option) {
        for (OptionsList.AbstractEntry child : this.children()) {
            if (child instanceof OptionsList.Entry entry) {
                for (OptionsList.OptionInstanceWidget optionInstanceWidget : entry.children) {
                    if (optionInstanceWidget.optionInstance() == option
                        && optionInstanceWidget.widget() instanceof ResettableOptionWidget resettableOptionWidget) {
                        resettableOptionWidget.resetValue();
                        return;
                    }
                }
            }
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    protected abstract static class AbstractEntry extends ContainerObjectSelectionList.Entry<OptionsList.AbstractEntry> {
    }
 
    @OnlyIn(Dist.CLIENT)
    protected static class Entry extends OptionsList.AbstractEntry {
        private final List<OptionsList.OptionInstanceWidget> children;
        private final Screen screen;
        private static final int X_OFFSET = 160;
 
        private Entry(List<OptionsList.OptionInstanceWidget> widgets, Screen screen) {
            this.children = widgets;
            this.screen = screen;
        }
 
        public static OptionsList.Entry big(Options options, OptionInstance<?> optionInstance, Screen screen) {
            return new OptionsList.Entry(List.of(new OptionsList.OptionInstanceWidget(optionInstance.createButton(options, 0, 0, 310), optionInstance)), screen);
        }
 
        public static OptionsList.Entry small(AbstractWidget leftWidget, @Nullable AbstractWidget rightWidget, Screen screen) {
            return rightWidget == null
                ? new OptionsList.Entry(List.of(new OptionsList.OptionInstanceWidget(leftWidget)), screen)
                : new OptionsList.Entry(List.of(new OptionsList.OptionInstanceWidget(leftWidget), new OptionsList.OptionInstanceWidget(rightWidget)), screen);
        }
 
        public static OptionsList.Entry small(
            AbstractWidget leftWidget, OptionInstance<?> leftWidgetOptionInstance, @Nullable AbstractWidget rightWidget, Screen screen
        ) {
            return rightWidget == null
                ? new OptionsList.Entry(List.of(new OptionsList.OptionInstanceWidget(leftWidget, leftWidgetOptionInstance)), screen)
                : new OptionsList.Entry(
                    List.of(new OptionsList.OptionInstanceWidget(leftWidget, leftWidgetOptionInstance), new OptionsList.OptionInstanceWidget(rightWidget)),
                    screen
                );
        }
 
        public static OptionsList.Entry small(Options options, OptionInstance<?> optionA, @Nullable OptionInstance<?> optionB, OptionsSubScreen screen) {
            AbstractWidget buttonA = optionA.createButton(options);
            return optionB == null
                ? new OptionsList.Entry(List.of(new OptionsList.OptionInstanceWidget(buttonA, optionA)), screen)
                : new OptionsList.Entry(
                    List.of(
                        new OptionsList.OptionInstanceWidget(buttonA, optionA), new OptionsList.OptionInstanceWidget(optionB.createButton(options), optionB)
                    ),
                    screen
                );
        }
 
        @Override
        public void extractContent(GuiGraphicsExtractor graphics, int mouseX, int mouseY, boolean hovered, float a) {
            int xOffset = 0;
            int x = this.screen.width / 2 - 155;
 
            for (OptionsList.OptionInstanceWidget optionInstanceWidget : this.children) {
                optionInstanceWidget.widget().setPosition(x + xOffset, this.getContentY());
                optionInstanceWidget.widget().extractRenderState(graphics, mouseX, mouseY, a);
                xOffset += 160;
            }
        }
 
        @Override
        public List<? extends GuiEventListener> children() {
            return Lists.transform(this.children, OptionsList.OptionInstanceWidget::widget);
        }
 
        @Override
        public List<? extends NarratableEntry> narratables() {
            return Lists.transform(this.children, OptionsList.OptionInstanceWidget::widget);
        }
 
        public @Nullable AbstractWidget findOption(OptionInstance<?> option) {
            for (OptionsList.OptionInstanceWidget child : this.children) {
                if (child.optionInstance == option) {
                    return child.widget();
                }
            }
 
            return null;
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    protected static class HeaderEntry extends OptionsList.AbstractEntry {
        private final Screen screen;
        private final int paddingTop;
        private final StringWidget widget;
 
        protected HeaderEntry(Screen screen, Component text, int paddingTop) {
            this.screen = screen;
            this.paddingTop = paddingTop;
            this.widget = new StringWidget(text, screen.getFont());
        }
 
        @Override
        public List<? extends NarratableEntry> narratables() {
            return List.of(this.widget);
        }
 
        @Override
        public void extractContent(GuiGraphicsExtractor graphics, int mouseX, int mouseY, boolean hovered, float a) {
            this.widget.setPosition(this.screen.width / 2 - 155, this.getContentY() + this.paddingTop);
            this.widget.extractRenderState(graphics, mouseX, mouseY, a);
        }
 
        @Override
        public List<? extends GuiEventListener> children() {
            return List.of(this.widget);
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public record OptionInstanceWidget(AbstractWidget widget, @Nullable OptionInstance<?> optionInstance) {
        public OptionInstanceWidget(AbstractWidget widget) {
            this(widget, null);
        }
    }
}

引用的其他类