diff options
| author | Daniel She <shekwancheung0528@gmail.com> | 2019-06-06 20:14:42 +0800 |
|---|---|---|
| committer | Daniel She <shekwancheung0528@gmail.com> | 2019-06-06 20:14:42 +0800 |
| commit | fab214806ccc3ffbfd03e4034af6cee906124b7a (patch) | |
| tree | d5c1a2e108b81d3a57988d4f03ed515c991e75e4 /src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java | |
| parent | d414c887e0c42325cf2e7c778b32e3fb13ee2e69 (diff) | |
| parent | 558504bd65af2138d73825f1ffa8066a5d70e8f5 (diff) | |
| download | RoughlyEnoughItems-fab214806ccc3ffbfd03e4034af6cee906124b7a.tar.gz RoughlyEnoughItems-fab214806ccc3ffbfd03e4034af6cee906124b7a.tar.bz2 RoughlyEnoughItems-fab214806ccc3ffbfd03e4034af6cee906124b7a.zip | |
Merge branch 'fabric-dev' into 1.14
Diffstat (limited to 'src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java | 132 |
1 files changed, 131 insertions, 1 deletions
diff --git a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index 468c3b734..6a4208a93 100644 --- a/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -10,6 +10,7 @@ import com.google.common.collect.Maps; import com.mojang.blaze3d.platform.GlStateManager; import com.zeitheron.hammercore.client.utils.Scissors; import me.shedaniel.cloth.api.ClientUtils; +import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; import me.shedaniel.rei.client.ScreenHelper; import me.shedaniel.rei.gui.renderables.RecipeRenderer; @@ -18,15 +19,20 @@ import net.minecraft.ChatFormat; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.GuiLighting; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexFormats; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; +import net.minecraft.item.ItemStack; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.MathHelper; import java.awt.*; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -46,6 +52,10 @@ public class VillagerRecipeViewingScreen extends Screen { public Rectangle bounds, scrollListBounds; private int selectedCategoryIndex, selectedRecipeIndex; private double scroll; + private float scrollBarAlpha = 0; + private float scrollBarAlphaFuture = 0; + private long scrollBarAlphaFutureTime = -1; + private boolean draggingScrollBar = false; private int tabsPage; public VillagerRecipeViewingScreen(Map<RecipeCategory, List<RecipeDisplay>> map) { @@ -54,7 +64,10 @@ public class VillagerRecipeViewingScreen extends Screen { this.categoryMap = Maps.newLinkedHashMap(); this.selectedCategoryIndex = 0; this.selectedRecipeIndex = 0; + this.scrollBarAlpha = 0; + this.scrollBarAlphaFuture = 0; this.scroll = 0; + this.draggingScrollBar = false; this.tabsPage = 0; this.categories = Lists.newArrayList(); this.buttonWidgets = Lists.newArrayList(); @@ -71,6 +84,7 @@ public class VillagerRecipeViewingScreen extends Screen { @Override protected void init() { super.init(); + this.draggingScrollBar = false; this.children.clear(); this.widgets.clear(); this.buttonWidgets.clear(); @@ -83,6 +97,34 @@ public class VillagerRecipeViewingScreen extends Screen { int guiWidth = MathHelper.clamp(category.getDisplayWidth(display) + 30, 0, largestWidth) + 100; int guiHeight = MathHelper.clamp(category.getDisplayHeight() + 40, 166, largestHeight); this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); + + List<List<ItemStack>> workingStations = RoughlyEnoughItemsCore.getRecipeHelper().getWorkingStations(category.getIdentifier()); + if (!workingStations.isEmpty()) { + int ww = MathHelper.floor((bounds.width - 16) / 18f); + int w = Math.min(ww, workingStations.size()); + int h = MathHelper.ceil(workingStations.size() / ((float)ww)); + int xx = bounds.x + 16; + int yy = bounds.y + bounds.height + 5; + widgets.add(new CategoryBaseWidget(new Rectangle(xx - 6, bounds.y + bounds.height - 5, 11 + w * 18, 15 + h * 18))); + int index = 0; + List list = Collections.singletonList(ChatFormat.YELLOW.toString() + I18n.translate("text.rei.working_station")); + for(List<ItemStack> workingStation : workingStations) { + widgets.add(new SlotWidget(xx, yy, workingStation, true, true, true) { + @Override + protected List<String> getExtraToolTips(ItemStack stack) { + return list; + } + }); + index++; + xx += 18; + if (index >= ww) { + index = 0; + xx = bounds.x + 16; + yy += 18; + } + } + } + this.widgets.add(new CategoryBaseWidget(bounds)); this.scrollListBounds = new Rectangle(bounds.x + 4, bounds.y + 17, 97 + 5, guiHeight - 17 - 7); this.widgets.add(new SlotBaseWidget(scrollListBounds)); @@ -183,9 +225,10 @@ public class VillagerRecipeViewingScreen extends Screen { @Override public int getDefaultColor() { - return 4210752; + return RoughlyEnoughItemsCore.getConfigManager().getConfig().darkTheme ? 0xFFBBBBBB : 4210752; } }); + this.children.addAll(buttonWidgets); this.widgets.addAll(tabs); this.children.addAll(widgets); @@ -194,6 +237,22 @@ public class VillagerRecipeViewingScreen extends Screen { } @Override + public boolean mouseClicked(double mouseX, double mouseY, int int_1) { + double height = buttonWidgets.stream().map(ButtonWidget::getBounds).collect(Collectors.summingDouble(Rectangle::getHeight)); + int actualHeight = scrollListBounds.height - 2; + if (height > actualHeight && scrollBarAlpha > 0 && mouseY >= scrollListBounds.y + 1 && mouseY <= scrollListBounds.getMaxY() - 1) { + double scrollbarPositionMinX = scrollListBounds.getMaxX() - 6; + if (mouseX >= scrollbarPositionMinX & mouseX <= scrollbarPositionMinX + 8) { + this.draggingScrollBar = true; + scrollBarAlpha = 1; + return false; + } + } + this.draggingScrollBar = false; + return super.mouseClicked(mouseX, mouseY, int_1); + } + + @Override public boolean mouseScrolled(double double_1, double double_2, double double_3) { double height = buttonWidgets.stream().map(ButtonWidget::getBounds).collect(Collectors.summingDouble(Rectangle::getHeight)); if (scrollListBounds.contains(double_1, double_2) && height > scrollListBounds.height - 2) { @@ -202,6 +261,9 @@ public class VillagerRecipeViewingScreen extends Screen { else scroll += 16; scroll = MathHelper.clamp(scroll, 0, height - scrollListBounds.height + 2); + if (scrollBarAlphaFuture == 0) + scrollBarAlphaFuture = 1f; + scrollBarAlphaFutureTime = System.currentTimeMillis(); return true; } for(Element listener : children()) @@ -226,6 +288,28 @@ public class VillagerRecipeViewingScreen extends Screen { @Override public void render(int mouseX, int mouseY, float delta) { + if (RoughlyEnoughItemsCore.getConfigManager().getConfig().villagerScreenPermanentScrollBar) { + scrollBarAlphaFutureTime = System.currentTimeMillis(); + scrollBarAlphaFuture = 0; + scrollBarAlpha = 1; + } else if (scrollBarAlphaFutureTime > 0) { + long l = System.currentTimeMillis() - scrollBarAlphaFutureTime; + if (l > 300f) { + if (scrollBarAlphaFutureTime == 0) { + scrollBarAlpha = scrollBarAlphaFuture; + scrollBarAlphaFutureTime = -1; + } else if (l > 2000f && scrollBarAlphaFuture == 1) { + scrollBarAlphaFuture = 0; + scrollBarAlphaFutureTime = System.currentTimeMillis(); + } else + scrollBarAlpha = scrollBarAlphaFuture; + } else { + if (scrollBarAlphaFuture == 0) + scrollBarAlpha = Math.min(scrollBarAlpha, 1 - Math.min(1f, l / 300f)); + else if (scrollBarAlphaFuture == 1) + scrollBarAlpha = Math.max(Math.min(1f, l / 300f), scrollBarAlpha); + } + } this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680); int yOffset = 0; this.widgets.forEach(widget -> { @@ -253,11 +337,57 @@ public class VillagerRecipeViewingScreen extends Screen { recipeRenderers.get(i).render(buttonWidgets.get(i).getBounds().x, buttonWidgets.get(i).getBounds().y, mouseX, mouseY, delta); } } + double height = buttonWidgets.stream().map(ButtonWidget::getBounds).collect(Collectors.summingDouble(Rectangle::getHeight)); + if (height > scrollListBounds.height - 2) { + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBufferBuilder(); + double maxScroll = height - scrollListBounds.height + 2; + int scrollBarHeight = MathHelper.floor((scrollListBounds.height - 2) * (scrollListBounds.height - 2) / maxScroll); + scrollBarHeight = MathHelper.clamp(scrollBarHeight, 32, scrollListBounds.height - 2 - 8); + int minY = (int) (scroll * (scrollListBounds.height - 2 - scrollBarHeight) / maxScroll) + scrollListBounds.y + 1; + if (minY < this.scrollListBounds.y + 1) + minY = this.scrollListBounds.y + 1; + double scrollbarPositionMinX = scrollListBounds.getMaxX() - 6, scrollbarPositionMaxX = scrollListBounds.getMaxX() - 2; + GuiLighting.disable(); + GlStateManager.disableTexture(); + GlStateManager.enableBlend(); + GlStateManager.disableAlphaTest(); + GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + GlStateManager.shadeModel(7425); + buffer.begin(7, VertexFormats.POSITION_COLOR); + float b = RoughlyEnoughItemsCore.getConfigManager().getConfig().darkTheme ? 0.37f : 1f; + buffer.vertex(scrollbarPositionMinX, minY + scrollBarHeight, 1000D).color(b, b, b, scrollBarAlpha).next(); + buffer.vertex(scrollbarPositionMaxX, minY + scrollBarHeight, 1000D).color(b, b, b, scrollBarAlpha).next(); + buffer.vertex(scrollbarPositionMaxX, minY, 1000D).color(b, b, b, scrollBarAlpha).next(); + buffer.vertex(scrollbarPositionMinX, minY, 1000D).color(b, b, b, scrollBarAlpha).next(); + tessellator.draw(); + GlStateManager.shadeModel(7424); + GlStateManager.disableBlend(); + GlStateManager.enableAlphaTest(); + GlStateManager.enableTexture(); + } Scissors.end(); GlStateManager.popMatrix(); ScreenHelper.getLastOverlay().lateRender(mouseX, mouseY, delta); } + @Override + public boolean mouseDragged(double mouseX, double mouseY, int int_1, double double_3, double double_4) { + if (int_1 == 0 && scrollBarAlpha > 0 && draggingScrollBar) { + double height = buttonWidgets.stream().map(ButtonWidget::getBounds).collect(Collectors.summingDouble(Rectangle::getHeight)); + int actualHeight = scrollListBounds.height - 2; + if (height > actualHeight && mouseY >= scrollListBounds.y + 1 && mouseY <= scrollListBounds.getMaxY() - 1) { + int int_3 = MathHelper.clamp((int) ((actualHeight * actualHeight) / height), 32, actualHeight - 8); + double double_6 = Math.max(1.0D, Math.max(1d, height) / (double) (actualHeight - int_3)); + scrollBarAlphaFutureTime = System.currentTimeMillis(); + scrollBarAlphaFuture = 1f; + scroll = MathHelper.clamp(scroll + double_4 * double_6, 0, height - scrollListBounds.height + 2); + return true; + } + } + return super.mouseDragged(mouseX, mouseY, int_1, double_3, double_4); + } + private int getReal(int i) { return (int) (i / ((double) minecraft.window.getScaledWidth() / (double) minecraft.window.getWidth())); } |
