diff --git a/common/src/main/java/org/ayamemc/ayame/client/gui/Alignment.java b/common/src/main/java/org/ayamemc/ayame/client/gui/Alignment.java new file mode 100644 index 0000000..05f7ad9 --- /dev/null +++ b/common/src/main/java/org/ayamemc/ayame/client/gui/Alignment.java @@ -0,0 +1,29 @@ +/* + * Custom player model mod. Powered by GeckoLib. + * Copyright (C) 2024 CrystalNeko, HappyRespawnanchor, pertaz(Icon Designer) + * + * This file is part of Ayame. + * + * Ayame is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Ayame is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Ayame. If not, see . + */ + +package org.ayamemc.ayame.client.gui; + +public enum Alignment { + CENTER, + LEFT, + RIGHT, + TOP, + BOTTOM, +} diff --git a/common/src/main/java/org/ayamemc/ayame/client/gui/screen/AyameMainScreen.java b/common/src/main/java/org/ayamemc/ayame/client/gui/screen/AyameMainScreen.java index 54d0b3d..7b7a76b 100644 --- a/common/src/main/java/org/ayamemc/ayame/client/gui/screen/AyameMainScreen.java +++ b/common/src/main/java/org/ayamemc/ayame/client/gui/screen/AyameMainScreen.java @@ -1,23 +1,3 @@ -/* - * Custom player model mod. Powered by GeckoLib. - * Copyright (C) 2024 CrystalNeko, HappyRespawnanchor, pertaz(Icon Designer) - * - * This file is part of Ayame. - * - * Ayame is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Ayame is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Ayame. If not, see . - */ - package org.ayamemc.ayame.client.gui.screen; import com.mojang.blaze3d.systems.RenderSystem; @@ -34,6 +14,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import org.ayamemc.ayame.Ayame; +import org.ayamemc.ayame.client.gui.Alignment; import org.ayamemc.ayame.client.gui.widget.BlurWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,19 +41,17 @@ public AyameMainScreen(@Nullable Screen lastScreen) { this.lastScreen = lastScreen; } - /** - * 初始化屏幕方法,可以由子类覆盖 - */ @Override protected void init() { - BlurWidget blurredBackgroundWidget = new BlurWidget(getCenterX(BACKGROUND_TEXTURE_WIDTH), getCenterY(BACKGROUND_TEXTURE_HEIGHT), BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); + BlurWidget blurredBackgroundWidget = new BlurWidget(getCenteredX(BACKGROUND_TEXTURE_WIDTH), getCenteredY(BACKGROUND_TEXTURE_HEIGHT), BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); this.addRenderableOnly(blurredBackgroundWidget); - final int searchBarWidth = 208; - final int searchBarHeight = 20; + + final int searchBarWidth = 112; + final int searchBarHeight = 23; EditBox searchBarEditBox = new EditBox( this.font, - getComponentCenterX(searchBarWidth), - getComponentTopY(searchBarHeight), + getAlignedX(BACKGROUND_TEXTURE_WIDTH, searchBarWidth, 0, Alignment.CENTER) + 27, + getAlignedY(BACKGROUND_TEXTURE_HEIGHT, searchBarHeight, 0, Alignment.TOP) + 1, searchBarWidth, searchBarHeight, Component.translatable("ayame.widget.searchBarEditBox") @@ -80,17 +59,11 @@ protected void init() { searchBarEditBox.setHint(Component.translatable("ayame.widget.searchBarEditBox").withStyle(ChatFormatting.DARK_GRAY)); searchBarEditBox.setBordered(true); addRenderableWidget(searchBarEditBox); - } - - /** - * 渲染背景纹理 - */ @Override public void renderBackground(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { if (minecraft.level == null) { - //this.renderPanorama(guiGraphics, partialTick); super.renderBackground(guiGraphics, mouseX, mouseY, partialTick); renderBackgroundTexture(guiGraphics, mouseX, mouseY, partialTick); } else { @@ -100,35 +73,31 @@ public void renderBackground(GuiGraphics guiGraphics, int mouseX, int mouseY, fl protected void renderBackgroundTexture(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { RenderSystem.enableBlend(); - guiGraphics.blit(MENU_BACKGROUND_TEXTURE, getCenterX(BACKGROUND_TEXTURE_WIDTH), getCenterY(BACKGROUND_TEXTURE_HEIGHT), 0, 0, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); + guiGraphics.blit(MENU_BACKGROUND_TEXTURE, getCenteredX(BACKGROUND_TEXTURE_WIDTH), getCenteredY(BACKGROUND_TEXTURE_HEIGHT), 0, 0, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); RenderSystem.disableBlend(); } - - /** - * 渲染屏幕内容,包括背景边框 - */ @Override public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) { super.render(guiGraphics, mouseX, mouseY, delta); RenderSystem.enableBlend(); - guiGraphics.blit(MENU_BACKGROUND_OUTLINE_TEXTURE, getCenterX(BACKGROUND_TEXTURE_WIDTH), getCenterY(BACKGROUND_TEXTURE_HEIGHT), 0, 0, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); - guiGraphics.blit(renderTopLayerResourceLocation(), getCenterX(BACKGROUND_TEXTURE_WIDTH), getCenterY(BACKGROUND_TEXTURE_HEIGHT), 0, 0, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); + guiGraphics.blit(MENU_BACKGROUND_OUTLINE_TEXTURE, getCenteredX(BACKGROUND_TEXTURE_WIDTH), getCenteredY(BACKGROUND_TEXTURE_HEIGHT), 0, 0, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); + guiGraphics.blit(renderTopLayerResourceLocation(), getCenteredX(BACKGROUND_TEXTURE_WIDTH), getCenteredY(BACKGROUND_TEXTURE_HEIGHT), 0, 0, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT, BACKGROUND_TEXTURE_WIDTH, BACKGROUND_TEXTURE_HEIGHT); RenderSystem.disableBlend(); WidgetSprites settingSprites = new WidgetSprites( withAyameNamespace("settings"), - withAyameNamespace("settings_disabled"), // 似乎不会被使用 + withAyameNamespace("settings_disabled"), withAyameNamespace("settings_enabled_focused") ); WidgetSprites opendirSprites = new WidgetSprites( withAyameNamespace("opendir"), - withAyameNamespace("opendir"), // 似乎不会被使用 + withAyameNamespace("opendir"), withAyameNamespace("opendir_enabled_focused") ); ImageButton settingsButton = new ImageButton( - getLeftAlignedX(BACKGROUND_TEXTURE_WIDTH, 0), - getBottomAlignedY(BACKGROUND_TEXTURE_HEIGHT, BUTTON_SIZE, 0), + getAlignedX(BACKGROUND_TEXTURE_WIDTH, BUTTON_SIZE, 0, Alignment.LEFT), + getAlignedY(BACKGROUND_TEXTURE_HEIGHT, BUTTON_SIZE, 0, Alignment.BOTTOM), BUTTON_SIZE, BUTTON_SIZE, settingSprites, @@ -139,8 +108,8 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) Component.empty() ); ImageButton opendirButton = new ImageButton( - getLeftAlignedX(BACKGROUND_TEXTURE_WIDTH, 0), - getBottomAlignedY(BACKGROUND_TEXTURE_HEIGHT, BUTTON_SIZE, 90), + getAlignedX(BACKGROUND_TEXTURE_WIDTH, BUTTON_SIZE, 0, Alignment.LEFT), + getAlignedY(BACKGROUND_TEXTURE_HEIGHT, BUTTON_SIZE, 90, Alignment.BOTTOM), BUTTON_SIZE, BUTTON_SIZE, opendirSprites, @@ -154,57 +123,35 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta) addRenderableWidget(settingsButton); addRenderableWidget(opendirButton); -// if (this instanceof SettingsScreen) { -// addRenderableOnly(settingsButton); -// } else { -// addRenderableWidget(settingsButton); -// } Component titleText = Component.translatable(setTranslatableTitle()); - - // 计算居中显示的 X 坐标 int centerX = getCenteredStringX(titleText); - - // 渲染文本 guiGraphics.drawString(this.font, titleText, centerX, font.lineHeight, 0xFFFFFFFF, true); } - - /** - * 实现一个自定义的指定图层 - * - * @return 你要传入的图片路径 - */ protected abstract @NotNull ResourceLocation renderTopLayerResourceLocation(); protected abstract @NotNull String setTranslatableTitle(); - /** - * 获取指定宽度在屏幕中心的X坐标 - */ - protected int getCenterX(int elementWidth) { + protected int getCenteredX(int elementWidth) { return (this.width - elementWidth) / 2; } - /** - * 获取指定高度在屏幕中心的Y坐标 - */ - protected int getCenterY(int elementHeight) { + protected int getCenteredY(int elementHeight) { return (this.height - elementHeight) / 2; } - /** - * 获取元素在屏幕左边对齐的X坐标 - */ - protected int getLeftAlignedX(int containerWidth, int margin) { - return getCenterX(containerWidth) + margin; - } - - /** - * 获取元素在屏幕底部对齐的Y坐标 - */ - protected int getBottomAlignedY(int containerHeight, int elementHeight, int margin) { - return getCenterY(containerHeight) + containerHeight - elementHeight - margin; + protected int getAlignedX(int containerWidth, int elementWidth, int margin, Alignment alignment) { + int baseX = getCenteredX(containerWidth); + switch (alignment) { + case LEFT: + return baseX + margin; + case RIGHT: + return baseX + containerWidth - elementWidth - margin; + case CENTER: + default: + return baseX + (containerWidth - elementWidth) / 2; + } } protected int getCenteredStringX(Component text) { @@ -212,50 +159,22 @@ protected int getCenteredStringX(Component text) { return (this.width - textWidth) / 2; } - /** - * 获取与贴图无关的组件在屏幕中心的 X 坐标 - */ - protected int getComponentCenterX(int componentWidth) { - return (this.width - componentWidth) / 2; - } - - /** - * 获取与贴图无关的组件在屏幕中心的 Y 坐标 - */ - protected int getComponentCenterY(int componentHeight) { - return (this.height - componentHeight) / 2; - } - /** - * 获取组件在屏幕顶部对齐的 Y 坐标 - */ - protected int getComponentTopY(int margin) { - return margin; - } - /** - * 获取组件在屏幕底部对齐的 Y 坐标 - */ - protected int getComponentBottomY(int componentHeight, int margin) { - return this.height - componentHeight - margin; - } - - /** - * 获取组件在屏幕左边对齐的 X 坐标 - */ - protected int getComponentLeftX(int margin) { - return margin; - } - - /** - * 获取组件在屏幕右边对齐的 X 坐标 - */ - protected int getComponentRightX(int componentWidth, int margin) { - return this.width - componentWidth - margin; + protected int getAlignedY(int containerHeight, int elementHeight, int margin, Alignment alignment) { + int baseY = getCenteredY(containerHeight); + switch (alignment) { + case TOP: + return baseY + margin; + case BOTTOM: + return baseY + containerHeight - elementHeight - margin; + case CENTER: + default: + return baseY + (containerHeight - elementHeight) / 2; + } } - @Override public void onClose() { minecraft.setScreen(lastScreen); } -} +} \ No newline at end of file diff --git a/common/src/main/resources/assets/ayame/lang/en_us.json b/common/src/main/resources/assets/ayame/lang/en_us.json index f0db850..bb64796 100644 --- a/common/src/main/resources/assets/ayame/lang/en_us.json +++ b/common/src/main/resources/assets/ayame/lang/en_us.json @@ -8,5 +8,5 @@ "ayame.screen.warningscreen.modelselectscreen.title": "Select Model", "ayame.screen.warningscreen.settingsscreen.title": "Ayame Settings", "ayame.button.opendir.tooltip": "Open Model Folder\n(Place model files here)", - "ayame.widget.searchBarEditBox": "Search Model" + "ayame.widget.searchBarEditBox": "Search..." } \ No newline at end of file diff --git a/common/src/main/resources/assets/ayame/lang/zh_cn.json b/common/src/main/resources/assets/ayame/lang/zh_cn.json index 2ab7d46..5e77a39 100644 --- a/common/src/main/resources/assets/ayame/lang/zh_cn.json +++ b/common/src/main/resources/assets/ayame/lang/zh_cn.json @@ -8,5 +8,5 @@ "ayame.screen.warningscreen.modelselectscreen.title": "选择模型", "ayame.screen.warningscreen.settingsscreen.title": "Ayame 设置", "ayame.button.opendir.tooltip": "打开模型文件夹\n(请将模型文件放在这里)", - "ayame.widget.searchBarEditBox": "搜索模型" + "ayame.widget.searchBarEditBox": "搜索..." } \ No newline at end of file