From 2b029bd506d524f519caff075320e71d77c60e54 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 19 Jun 2021 14:18:12 +0100 Subject: [PATCH] Refactor some computer screen logic - Move some shared Gui{Computer,Turtle} code into a new class. Using entirely different naming conventions because of course (they are consistent with MojMap, just not the rest of CC:T). - Fix some mouse scaling issues in the terminal. --- .../client/gui/ComputerScreenBase.java | 94 +++++++++++++++++++ .../computercraft/client/gui/GuiComputer.java | 76 ++------------- .../computercraft/client/gui/GuiTurtle.java | 84 +++-------------- .../client/gui/widgets/WidgetTerminal.java | 12 +-- 4 files changed, 118 insertions(+), 148 deletions(-) create mode 100644 src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java diff --git a/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java b/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java new file mode 100644 index 000000000..bdde0e7f0 --- /dev/null +++ b/src/main/java/dan200/computercraft/client/gui/ComputerScreenBase.java @@ -0,0 +1,94 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.client.gui; + +import dan200.computercraft.client.gui.widgets.ComputerSidebar; +import dan200.computercraft.client.gui.widgets.WidgetTerminal; +import dan200.computercraft.shared.computer.core.ClientComputer; +import dan200.computercraft.shared.computer.core.ComputerFamily; +import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.util.text.ITextComponent; +import org.lwjgl.glfw.GLFW; + +public abstract class ComputerScreenBase extends ContainerScreen +{ + protected WidgetTerminal terminal; + protected final ClientComputer computer; + protected final ComputerFamily family; + + protected final int sidebarYOffset; + + public ComputerScreenBase( T container, PlayerInventory player, ITextComponent title, int sidebarYOffset ) + { + super( container, player, title ); + computer = (ClientComputer) container.getComputer(); + family = container.getFamily(); + this.sidebarYOffset = sidebarYOffset; + } + + protected abstract WidgetTerminal createTerminal(); + + @Override + protected final void init() + { + super.init(); + minecraft.keyboardHandler.setSendRepeatsToGui( true ); + + terminal = addButton( createTerminal() ); + ComputerSidebar.addButtons( this, computer, this::addButton, leftPos, topPos + sidebarYOffset ); + setFocused( terminal ); + } + + @Override + public final void removed() + { + super.removed(); + minecraft.keyboardHandler.setSendRepeatsToGui( false ); + } + + @Override + public final void tick() + { + super.tick(); + terminal.update(); + } + + @Override + public final boolean keyPressed( int key, int scancode, int modifiers ) + { + // Forward the tab key to the terminal, rather than moving between controls. + if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminal ) + { + return getFocused().keyPressed( key, scancode, modifiers ); + } + + return super.keyPressed( key, scancode, modifiers ); + } + + + @Override + public final void render( int mouseX, int mouseY, float partialTicks ) + { + renderBackground(); + super.render( mouseX, mouseY, partialTicks ); + renderTooltip( mouseX, mouseY ); + + for( Widget widget : buttons ) + { + if( widget.isHovered() ) widget.renderToolTip( mouseX, mouseY ); + } + } + + @Override + public final boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY ) + { + return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY )) + || super.mouseDragged( x, y, button, deltaX, deltaY ); + } +} diff --git a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java index 57755785a..6d0e63ee9 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiComputer.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiComputer.java @@ -10,36 +10,25 @@ import dan200.computercraft.client.gui.widgets.ComputerSidebar; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.render.ComputerBorderRenderer; -import dan200.computercraft.shared.computer.core.ClientComputer; -import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.inventory.ContainerComputer; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.gui.widget.Widget; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; -import org.lwjgl.glfw.GLFW; import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER; -public final class GuiComputer extends ContainerScreen +public final class GuiComputer extends ComputerScreenBase { - private final ComputerFamily family; - private final ClientComputer computer; private final int termWidth; private final int termHeight; - private WidgetTerminal terminal = null; - private GuiComputer( T container, PlayerInventory player, ITextComponent title, int termWidth, int termHeight ) { - super( container, player, title ); - family = container.getFamily(); - computer = (ClientComputer) container.getComputer(); + super( container, player, title, BORDER ); this.termWidth = termWidth; this.termHeight = termHeight; @@ -71,45 +60,12 @@ public static GuiComputer createView( ContainerViewComput ); } - @Override - protected void init() + protected WidgetTerminal createTerminal() { - super.init(); - - minecraft.keyboardHandler.setSendRepeatsToGui( true ); - - terminal = addButton( new WidgetTerminal( computer, + return new WidgetTerminal( computer, leftPos + ComputerSidebar.WIDTH + BORDER, topPos + BORDER, termWidth, termHeight - ) ); - ComputerSidebar.addButtons( this, computer, this::addButton, leftPos, topPos + BORDER ); - setFocused( terminal ); - } - - @Override - public void removed() - { - super.removed(); - minecraft.keyboardHandler.setSendRepeatsToGui( false ); - } - - @Override - public void tick() - { - super.tick(); - terminal.update(); - } - - @Override - public boolean keyPressed( int key, int scancode, int modifiers ) - { - // Forward the tab key to the terminal, rather than moving between controls. - if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminal ) - { - return getFocused().keyPressed( key, scancode, modifiers ); - } - - return super.keyPressed( key, scancode, modifiers ); + ); } @Override @@ -119,26 +75,6 @@ public void renderBg( float partialTicks, int mouseX, int mouseY ) RenderSystem.color4f( 1, 1, 1, 1 ); minecraft.getTextureManager().bind( ComputerBorderRenderer.getTexture( family ) ); ComputerBorderRenderer.render( terminal.x, terminal.y, getBlitOffset(), terminal.getWidth(), terminal.getHeight() ); - ComputerSidebar.renderBackground( leftPos, topPos + BORDER ); - } - - @Override - public void render( int mouseX, int mouseY, float partialTicks ) - { - renderBackground(); - super.render( mouseX, mouseY, partialTicks ); - renderTooltip( mouseX, mouseY ); - - for( Widget widget : buttons ) - { - if( widget.isHovered() ) widget.renderToolTip( mouseX, mouseY ); - } - } - - @Override - public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY ) - { - return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY )) - || super.mouseDragged( x, y, button, deltaX, deltaY ); + ComputerSidebar.renderBackground( leftPos, topPos + sidebarYOffset ); } } diff --git a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java index ff24c6da0..f4233aa88 100644 --- a/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java +++ b/src/main/java/dan200/computercraft/client/gui/GuiTurtle.java @@ -10,80 +10,40 @@ import dan200.computercraft.client.gui.widgets.ComputerSidebar; import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.render.ComputerBorderRenderer; -import dan200.computercraft.shared.computer.core.ClientComputer; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; -import net.minecraft.client.gui.screen.inventory.ContainerScreen; -import net.minecraft.client.gui.widget.Widget; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; -import org.lwjgl.glfw.GLFW; import static dan200.computercraft.shared.turtle.inventory.ContainerTurtle.*; -public class GuiTurtle extends ContainerScreen +public class GuiTurtle extends ComputerScreenBase { private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/turtle_normal.png" ); private static final ResourceLocation BACKGROUND_ADVANCED = new ResourceLocation( ComputerCraft.MOD_ID, "textures/gui/turtle_advanced.png" ); - private final ContainerTurtle container; + private static final int TEX_WIDTH = 254; + private static final int TEX_HEIGHT = 217; private final ComputerFamily family; - private final ClientComputer computer; - - private WidgetTerminal terminal; public GuiTurtle( ContainerTurtle container, PlayerInventory player, ITextComponent title ) { - super( container, player, title ); - - this.container = container; + super( container, player, title, BORDER ); family = container.getFamily(); - computer = (ClientComputer) container.getComputer(); - imageWidth = 254; - imageHeight = 217; + imageWidth = TEX_WIDTH + ComputerSidebar.WIDTH; + imageHeight = TEX_HEIGHT; } @Override - protected void init() + protected WidgetTerminal createTerminal() { - super.init(); - minecraft.keyboardHandler.setSendRepeatsToGui( true ); - - terminal = addButton( new WidgetTerminal( + return new WidgetTerminal( computer, leftPos + BORDER + ComputerSidebar.WIDTH, topPos + BORDER, ComputerCraft.turtleTermWidth, ComputerCraft.turtleTermHeight - ) ); - ComputerSidebar.addButtons( this, computer, this::addButton, leftPos, topPos + BORDER ); - setFocused( terminal ); - } - - @Override - public void removed() - { - super.removed(); - minecraft.keyboardHandler.setSendRepeatsToGui( false ); - } - - @Override - public void tick() - { - super.tick(); - terminal.update(); - } - - @Override - public boolean keyPressed( int key, int scancode, int modifiers ) - { - // Forward the tab key to the terminal, rather than moving between controls. - if( key == GLFW.GLFW_KEY_TAB && getFocused() != null && getFocused() == terminal ) - { - return getFocused().keyPressed( key, scancode, modifiers ); - } - - return super.keyPressed( key, scancode, modifiers ); + ); } @Override @@ -93,12 +53,12 @@ protected void renderBg( float partialTicks, int mouseX, int mouseY ) RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); minecraft.getTextureManager().bind( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL ); - blit( leftPos + ComputerSidebar.WIDTH, topPos, 0, 0, imageWidth, imageHeight ); + blit( leftPos + ComputerSidebar.WIDTH, topPos, 0, 0, TEX_WIDTH, TEX_HEIGHT ); minecraft.getTextureManager().bind( advanced ? ComputerBorderRenderer.BACKGROUND_ADVANCED : ComputerBorderRenderer.BACKGROUND_NORMAL ); - ComputerSidebar.renderBackground( leftPos, topPos + BORDER ); + ComputerSidebar.renderBackground( leftPos, topPos + sidebarYOffset ); - int slot = container.getSelectedSlot(); + int slot = getMenu().getSelectedSlot(); if( slot >= 0 ) { RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); @@ -110,24 +70,4 @@ protected void renderBg( float partialTicks, int mouseX, int mouseY ) ); } } - - @Override - public void render( int mouseX, int mouseY, float partialTicks ) - { - renderBackground(); - super.render( mouseX, mouseY, partialTicks ); - renderTooltip( mouseX, mouseY ); - - for( Widget widget : buttons ) - { - if( widget.isHovered() ) widget.renderToolTip( mouseX, mouseY ); - } - } - - @Override - public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY ) - { - return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY )) - || super.mouseDragged( x, y, button, deltaX, deltaY ); - } } diff --git a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java index dde9ea0ba..87e69dfe6 100644 --- a/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java +++ b/src/main/java/dan200/computercraft/client/gui/widgets/WidgetTerminal.java @@ -169,8 +169,8 @@ public boolean mouseClicked( double mouseX, double mouseY, int button ) Terminal term = computer.getTerminal(); if( term != null ) { - int charX = (int) ((mouseX - x) / FONT_WIDTH); - int charY = (int) ((mouseY - x) / FONT_HEIGHT); + int charX = (int) ((mouseX - innerX) / FONT_WIDTH); + int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 ); @@ -193,8 +193,8 @@ public boolean mouseReleased( double mouseX, double mouseY, int button ) Terminal term = computer.getTerminal(); if( term != null ) { - int charX = (int) ((mouseX - x) / FONT_WIDTH); - int charY = (int) ((mouseY - x) / FONT_HEIGHT); + int charX = (int) ((mouseX - innerX) / FONT_WIDTH); + int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 ); @@ -220,8 +220,8 @@ public boolean mouseDragged( double mouseX, double mouseY, int button, double v2 Terminal term = computer.getTerminal(); if( term != null ) { - int charX = (int) ((mouseX - x) / FONT_WIDTH); - int charY = (int) ((mouseY - x) / FONT_HEIGHT); + int charX = (int) ((mouseX - innerX) / FONT_WIDTH); + int charY = (int) ((mouseY - innerY) / FONT_HEIGHT); charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 );