LanguageSelectScreen.java

net.minecraft.client.gui.screens.options.LanguageSelectScreen

信息

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

    TODO

字段/常量

  • WARNING_LABEL

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

      TODO

  • FOOTER_HEIGHT

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

      TODO

  • SEARCH_HINT

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

      TODO

  • SEARCH_BOX_HEIGHT

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

      TODO

  • languageManager

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

      TODO

  • languageSelectionList

    • 类型: LanguageSelectScreen.LanguageSelectionList
    • 修饰符: private
    • 源码定位: L34
    • 说明:

      TODO

  • search

    • 类型: EditBox
    • 修饰符: private
    • 源码定位: L35
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.gui.screens.options.LanguageSelectScreen.LanguageSelectionList

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

      TODO

  • net.minecraft.client.gui.screens.options.LanguageSelectScreen.LanguageSelectionList.Entry

    • 类型: class
    • 修饰符: public
    • 源码定位: L152
    • 说明:

      TODO

构造器

public LanguageSelectScreen(Screen lastScreen, Options options, LanguageManager languageManager) @ L37

  • 构造器名:LanguageSelectScreen
  • 源码定位:L37
  • 修饰符:public

参数:

  • lastScreen: Screen
  • options: Options
  • languageManager: LanguageManager

说明:

TODO

方法

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

protected void addTitle() @ L43

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

参数:

说明:

TODO

protected void setInitialFocus() @ L58

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

参数:

说明:

TODO

protected void addContents() @ L67

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

参数:

说明:

TODO

protected void addOptions() @ L72

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

参数:

说明:

TODO

protected void addFooter() @ L76

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

参数:

说明:

TODO

protected void repositionElements() @ L88

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

参数:

说明:

TODO

private void onDone() @ L96

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

参数:

说明:

TODO

protected boolean panoramaShouldSpin() @ L108

  • 方法名:panoramaShouldSpin
  • 源码定位:L108
  • 返回类型:boolean
  • 修饰符:protected

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class LanguageSelectScreen extends OptionsSubScreen {
    private static final Component WARNING_LABEL = Component.translatable("options.languageAccuracyWarning").withColor(-4539718);
    private static final int FOOTER_HEIGHT = 53;
    private static final Component SEARCH_HINT = Component.translatable("gui.language.search").withStyle(EditBox.SEARCH_HINT_STYLE);
    private static final int SEARCH_BOX_HEIGHT = 15;
    private final LanguageManager languageManager;
    private LanguageSelectScreen.@Nullable LanguageSelectionList languageSelectionList;
    private @Nullable EditBox search;
 
    public LanguageSelectScreen(Screen lastScreen, Options options, LanguageManager languageManager) {
        super(lastScreen, options, Component.translatable("options.language.title"));
        this.languageManager = languageManager;
        this.layout.setFooterHeight(53);
    }
 
    @Override
    protected void addTitle() {
        LinearLayout header = this.layout.addToHeader(LinearLayout.vertical().spacing(4));
        header.defaultCellSetting().alignHorizontallyCenter();
        header.addChild(new StringWidget(this.title, this.font));
        this.search = header.addChild(new EditBox(this.font, 0, 0, 200, 15, Component.empty()));
        this.search.setHint(SEARCH_HINT);
        this.search.setResponder(string -> {
            if (this.languageSelectionList != null) {
                this.languageSelectionList.filterEntries(string);
            }
        });
        this.layout.setHeaderHeight((int)(12.0 + 9.0 + 15.0));
    }
 
    @Override
    protected void setInitialFocus() {
        if (this.search != null) {
            this.setInitialFocus(this.search);
        } else {
            super.setInitialFocus();
        }
    }
 
    @Override
    protected void addContents() {
        this.languageSelectionList = this.layout.addToContents(new LanguageSelectScreen.LanguageSelectionList(this.minecraft));
    }
 
    @Override
    protected void addOptions() {
    }
 
    @Override
    protected void addFooter() {
        LinearLayout footer = this.layout.addToFooter(LinearLayout.vertical()).spacing(8);
        footer.defaultCellSetting().alignHorizontallyCenter();
        footer.addChild(new StringWidget(WARNING_LABEL, this.font));
        LinearLayout bottomButtons = footer.addChild(LinearLayout.horizontal().spacing(8));
        bottomButtons.addChild(
            Button.builder(Component.translatable("options.font"), button -> this.minecraft.setScreen(new FontOptionsScreen(this, this.options))).build()
        );
        bottomButtons.addChild(Button.builder(CommonComponents.GUI_DONE, button -> this.onDone()).build());
    }
 
    @Override
    protected void repositionElements() {
        super.repositionElements();
        if (this.languageSelectionList != null) {
            this.languageSelectionList.updateSize(this.width, this.layout);
        }
    }
 
    private void onDone() {
        if (this.languageSelectionList != null
            && this.languageSelectionList.getSelected() instanceof LanguageSelectScreen.LanguageSelectionList.Entry selectedEntry
            && !selectedEntry.code.equals(this.languageManager.getSelected())) {
            this.languageManager.setSelected(selectedEntry.code);
            this.options.languageCode = selectedEntry.code;
            this.minecraft.reloadResourcePacks();
        }
 
        this.minecraft.setScreen(this.lastScreen);
    }
 
    @Override
    protected boolean panoramaShouldSpin() {
        return !(this.lastScreen instanceof AccessibilityOnboardingScreen);
    }
 
    @OnlyIn(Dist.CLIENT)
    private class LanguageSelectionList extends ObjectSelectionList<LanguageSelectScreen.LanguageSelectionList.Entry> {
        public LanguageSelectionList(Minecraft minecraft) {
            Objects.requireNonNull(LanguageSelectScreen.this);
            super(minecraft, LanguageSelectScreen.this.width, LanguageSelectScreen.this.height - 33 - 53, 33, 18);
            String selectedLanguage = LanguageSelectScreen.this.languageManager.getSelected();
            LanguageSelectScreen.this.languageManager.getLanguages().forEach((code, info) -> {
                LanguageSelectScreen.LanguageSelectionList.Entry entry = new LanguageSelectScreen.LanguageSelectionList.Entry(code, info);
                this.addEntry(entry);
                if (selectedLanguage.equals(code)) {
                    this.setSelected(entry);
                }
            });
            if (this.getSelected() != null) {
                this.centerScrollOn(this.getSelected());
            }
        }
 
        private void filterEntries(String filter) {
            SortedMap<String, LanguageInfo> languages = LanguageSelectScreen.this.languageManager.getLanguages();
            List<LanguageSelectScreen.LanguageSelectionList.Entry> filteredEntries = languages.entrySet()
                .stream()
                .filter(
                    entry -> filter.isEmpty()
                        || entry.getValue().name().toLowerCase(Locale.ROOT).contains(filter.toLowerCase(Locale.ROOT))
                        || entry.getValue().region().toLowerCase(Locale.ROOT).contains(filter.toLowerCase(Locale.ROOT))
                )
                .map(entry -> new LanguageSelectScreen.LanguageSelectionList.Entry(entry.getKey(), entry.getValue()))
                .toList();
            this.replaceEntries(filteredEntries);
            this.refreshScrollAmount();
        }
 
        @Override
        public int getRowWidth() {
            return super.getRowWidth() + 50;
        }
 
        @OnlyIn(Dist.CLIENT)
        public class Entry extends ObjectSelectionList.Entry<LanguageSelectScreen.LanguageSelectionList.Entry> {
            private final String code;
            private final Component language;
 
            public Entry(String code, LanguageInfo language) {
                Objects.requireNonNull(LanguageSelectionList.this);
                super();
                this.code = code;
                this.language = language.toComponent();
            }
 
            @Override
            public void extractContent(GuiGraphicsExtractor graphics, int mouseX, int mouseY, boolean hovered, float a) {
                graphics.centeredText(LanguageSelectScreen.this.font, this.language, LanguageSelectionList.this.width / 2, this.getContentYMiddle() - 9 / 2, -1);
            }
 
            @Override
            public boolean keyPressed(KeyEvent event) {
                if (event.isSelection()) {
                    this.select();
                    LanguageSelectScreen.this.onDone();
                    return true;
                } else {
                    return super.keyPressed(event);
                }
            }
 
            @Override
            public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) {
                this.select();
                if (doubleClick) {
                    LanguageSelectScreen.this.onDone();
                }
 
                return super.mouseClicked(event, doubleClick);
            }
 
            private void select() {
                LanguageSelectionList.this.setSelected(this);
            }
 
            @Override
            public Component getNarration() {
                return Component.translatable("narrator.select", this.language);
            }
        }
    }
}

引用的其他类

  • Options

    • 引用位置: 参数
  • Button

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

    • 引用位置: 字段/构造调用
    • 关联成员: EditBox()
  • StringWidget

    • 引用位置: 构造调用
    • 关联成员: StringWidget()
  • LinearLayout

    • 引用位置: 方法调用
    • 关联成员: LinearLayout.horizontal(), LinearLayout.vertical()
  • Screen

    • 引用位置: 参数
  • FontOptionsScreen

    • 引用位置: 构造调用
    • 关联成员: FontOptionsScreen()
  • OptionsSubScreen

    • 引用位置: 继承
  • LanguageManager

    • 引用位置: 参数/字段
  • Component

    • 引用位置: 字段/方法调用
    • 关联成员: Component.empty(), Component.translatable()