mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 05:33:00 +00:00 
			
		
		
		
	reformat
This commit is contained in:
		| @@ -3,8 +3,12 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| import com.mojang.blaze3d.systems.RenderSystem; | ||||
| import dan200.computercraft.client.FrameInfo; | ||||
| import dan200.computercraft.core.terminal.Terminal; | ||||
| @@ -13,8 +17,6 @@ import dan200.computercraft.shared.util.Colour; | ||||
| import dan200.computercraft.shared.util.Palette; | ||||
| import org.lwjgl.opengl.GL11; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
| import net.minecraft.client.MinecraftClient; | ||||
| import net.minecraft.client.render.RenderLayer; | ||||
| import net.minecraft.client.render.RenderPhase; | ||||
| @@ -26,39 +28,138 @@ import net.minecraft.client.util.math.AffineTransformation; | ||||
| import net.minecraft.util.Identifier; | ||||
| import net.minecraft.util.math.Matrix4f; | ||||
|  | ||||
| public final class FixedWidthFontRenderer | ||||
| { | ||||
|     private static final Matrix4f IDENTITY = AffineTransformation.identity().getMatrix(); | ||||
|  | ||||
|     private static final Identifier FONT = new Identifier( "computercraft", "textures/gui/term_font.png" ); | ||||
|  | ||||
| public final class FixedWidthFontRenderer { | ||||
|     public static final int FONT_HEIGHT = 9; | ||||
|     public static final int FONT_WIDTH = 6; | ||||
|     public static final float WIDTH = 256.0f; | ||||
|  | ||||
|     public static final float BACKGROUND_START = (WIDTH - 6.0f) / WIDTH; | ||||
|     public static final float BACKGROUND_END = (WIDTH - 4.0f) / WIDTH; | ||||
|  | ||||
|     public static final RenderLayer TYPE = Type.MAIN; | ||||
|     private static final Matrix4f IDENTITY = AffineTransformation.identity() | ||||
|                                                                  .getMatrix(); | ||||
|     private static final Identifier FONT = new Identifier("computercraft", "textures/gui/term_font.png"); | ||||
|  | ||||
|     private FixedWidthFontRenderer() | ||||
|     { | ||||
|     private FixedWidthFontRenderer() { | ||||
|     } | ||||
|  | ||||
|     public static float toGreyscale( double[] rgb ) | ||||
|     { | ||||
|     public static void drawString(float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, | ||||
|                                   @Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize) { | ||||
|         bindFont(); | ||||
|  | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() | ||||
|                                                                    .getBufferBuilders() | ||||
|                                                                    .getEntityVertexConsumers(); | ||||
|         drawString(IDENTITY, | ||||
|                    ((VertexConsumerProvider) renderer).getBuffer(TYPE), | ||||
|                    x, | ||||
|                    y, | ||||
|                    text, | ||||
|                    textColour, | ||||
|                    backgroundColour, | ||||
|                    palette, | ||||
|                    greyscale, | ||||
|                    leftMarginSize, | ||||
|                    rightMarginSize); | ||||
|         renderer.draw(); | ||||
|     } | ||||
|  | ||||
|     private static void bindFont() { | ||||
|         MinecraftClient.getInstance() | ||||
|                        .getTextureManager() | ||||
|                        .bindTexture(FONT); | ||||
|         RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP); | ||||
|     } | ||||
|  | ||||
|     public static void drawString(@Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, @Nonnull TextBuffer text, | ||||
|                                   @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, | ||||
|                                   float leftMarginSize, float rightMarginSize) { | ||||
|         if (backgroundColour != null) { | ||||
|             drawBackground(transform, renderer, x, y, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT); | ||||
|         } | ||||
|  | ||||
|         for (int i = 0; i < text.length(); i++) { | ||||
|             double[] colour = palette.getColour(getColour(textColour.charAt(i), Colour.BLACK)); | ||||
|             float r, g, b; | ||||
|             if (greyscale) { | ||||
|                 r = g = b = toGreyscale(colour); | ||||
|             } else { | ||||
|                 r = (float) colour[0]; | ||||
|                 g = (float) colour[1]; | ||||
|                 b = (float) colour[2]; | ||||
|             } | ||||
|  | ||||
|             // Draw char | ||||
|             int index = text.charAt(i); | ||||
|             if (index > 255) { | ||||
|                 index = '?'; | ||||
|             } | ||||
|             drawChar(transform, renderer, x + i * FONT_WIDTH, y, index, r, g, b); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     private static void drawBackground(@Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, | ||||
|                                        @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, float leftMarginSize, | ||||
|                                        float rightMarginSize, float height) { | ||||
|         if (leftMarginSize > 0) { | ||||
|             drawQuad(transform, renderer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt(0)); | ||||
|         } | ||||
|  | ||||
|         if (rightMarginSize > 0) { | ||||
|             drawQuad(transform, | ||||
|                      renderer, | ||||
|                      x + backgroundColour.length() * FONT_WIDTH, | ||||
|                      y, | ||||
|                      rightMarginSize, | ||||
|                      height, | ||||
|                      palette, | ||||
|                      greyscale, | ||||
|                      backgroundColour.charAt(backgroundColour.length() - 1)); | ||||
|         } | ||||
|  | ||||
|         // Batch together runs of identical background cells. | ||||
|         int blockStart = 0; | ||||
|         char blockColour = '\0'; | ||||
|         for (int i = 0; i < backgroundColour.length(); i++) { | ||||
|             char colourIndex = backgroundColour.charAt(i); | ||||
|             if (colourIndex == blockColour) { | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             if (blockColour != '\0') { | ||||
|                 drawQuad(transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour); | ||||
|             } | ||||
|  | ||||
|             blockColour = colourIndex; | ||||
|             blockStart = i; | ||||
|         } | ||||
|  | ||||
|         if (blockColour != '\0') { | ||||
|             drawQuad(transform, | ||||
|                      renderer, | ||||
|                      x + blockStart * FONT_WIDTH, | ||||
|                      y, | ||||
|                      FONT_WIDTH * (backgroundColour.length() - blockStart), | ||||
|                      height, | ||||
|                      palette, | ||||
|                      greyscale, | ||||
|                      blockColour); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static int getColour(char c, Colour def) { | ||||
|         return 15 - Terminal.getColour(c, def); | ||||
|     } | ||||
|  | ||||
|     public static float toGreyscale(double[] rgb) { | ||||
|         return (float) ((rgb[0] + rgb[1] + rgb[2]) / 3); | ||||
|     } | ||||
|  | ||||
|     public static int getColour( char c, Colour def ) | ||||
|     { | ||||
|         return 15 - Terminal.getColour( c, def ); | ||||
|     } | ||||
|  | ||||
|     private static void drawChar( Matrix4f transform, VertexConsumer buffer, float x, float y, int index, float r, float g, float b ) | ||||
|     { | ||||
|     private static void drawChar(Matrix4f transform, VertexConsumer buffer, float x, float y, int index, float r, float g, float b) { | ||||
|         // Short circuit to avoid the common case - the texture should be blank here after all. | ||||
|         if( index == '\0' || index == ' ' ) return; | ||||
|         if (index == '\0' || index == ' ') { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         int column = index % 16; | ||||
|         int row = index / 16; | ||||
| @@ -66,284 +167,217 @@ public final class FixedWidthFontRenderer | ||||
|         int xStart = 1 + column * (FONT_WIDTH + 2); | ||||
|         int yStart = 1 + row * (FONT_HEIGHT + 2); | ||||
|  | ||||
|         buffer.vertex( transform, x, y, 0f ).color( r, g, b, 1.0f ).texture( xStart / WIDTH, yStart / WIDTH ).next(); | ||||
|         buffer.vertex( transform, x, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).texture( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).next(); | ||||
|         buffer.vertex( transform, x + FONT_WIDTH, y, 0f ).color( r, g, b, 1.0f ).texture( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ).next(); | ||||
|         buffer.vertex( transform, x + FONT_WIDTH, y, 0f ).color( r, g, b, 1.0f ).texture( (xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH ).next(); | ||||
|         buffer.vertex( transform, x, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).texture( xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).next(); | ||||
|         buffer.vertex( transform, x + FONT_WIDTH, y + FONT_HEIGHT, 0f ).color( r, g, b, 1.0f ).texture( (xStart + FONT_WIDTH) / WIDTH, (yStart + FONT_HEIGHT) / WIDTH ).next(); | ||||
|         buffer.vertex(transform, x, y, 0f) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(xStart / WIDTH, yStart / WIDTH) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x, y + FONT_HEIGHT, 0f) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x + FONT_WIDTH, y, 0f) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture((xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x + FONT_WIDTH, y, 0f) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture((xStart + FONT_WIDTH) / WIDTH, yStart / WIDTH) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x, y + FONT_HEIGHT, 0f) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(xStart / WIDTH, (yStart + FONT_HEIGHT) / WIDTH) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x + FONT_WIDTH, y + FONT_HEIGHT, 0f) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture((xStart + FONT_WIDTH) / WIDTH, (yStart + FONT_HEIGHT) / WIDTH) | ||||
|               .next(); | ||||
|     } | ||||
|  | ||||
|     private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, float r, float g, float b ) | ||||
|     { | ||||
|         buffer.vertex( transform, x, y, 0 ).color( r, g, b, 1.0f ).texture( BACKGROUND_START, BACKGROUND_START ).next(); | ||||
|         buffer.vertex( transform, x, y + height, 0 ).color( r, g, b, 1.0f ).texture( BACKGROUND_START, BACKGROUND_END ).next(); | ||||
|         buffer.vertex( transform, x + width, y, 0 ).color( r, g, b, 1.0f ).texture( BACKGROUND_END, BACKGROUND_START ).next(); | ||||
|         buffer.vertex( transform, x + width, y, 0 ).color( r, g, b, 1.0f ).texture( BACKGROUND_END, BACKGROUND_START ).next(); | ||||
|         buffer.vertex( transform, x, y + height, 0 ).color( r, g, b, 1.0f ).texture( BACKGROUND_START, BACKGROUND_END ).next(); | ||||
|         buffer.vertex( transform, x + width, y + height, 0 ).color( r, g, b, 1.0f ).texture( BACKGROUND_END, BACKGROUND_END ).next(); | ||||
|     } | ||||
|  | ||||
|     private static void drawQuad( Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, Palette palette, boolean greyscale, char colourIndex ) | ||||
|     { | ||||
|         double[] colour = palette.getColour( getColour( colourIndex, Colour.BLACK ) ); | ||||
|     private static void drawQuad(Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, Palette palette, | ||||
|                                  boolean greyscale, char colourIndex) { | ||||
|         double[] colour = palette.getColour(getColour(colourIndex, Colour.BLACK)); | ||||
|         float r, g, b; | ||||
|         if( greyscale ) | ||||
|         { | ||||
|             r = g = b = toGreyscale( colour ); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|         if (greyscale) { | ||||
|             r = g = b = toGreyscale(colour); | ||||
|         } else { | ||||
|             r = (float) colour[0]; | ||||
|             g = (float) colour[1]; | ||||
|             b = (float) colour[2]; | ||||
|         } | ||||
|  | ||||
|         drawQuad( transform, buffer, x, y, width, height, r, g, b ); | ||||
|         drawQuad(transform, buffer, x, y, width, height, r, g, b); | ||||
|     } | ||||
|  | ||||
|     private static void drawBackground( | ||||
|         @Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, | ||||
|         @Nonnull TextBuffer backgroundColour, @Nonnull Palette palette, boolean greyscale, | ||||
|         float leftMarginSize, float rightMarginSize, float height | ||||
|     ) | ||||
|     { | ||||
|         if( leftMarginSize > 0 ) | ||||
|         { | ||||
|             drawQuad( transform, renderer, x - leftMarginSize, y, leftMarginSize, height, palette, greyscale, backgroundColour.charAt( 0 ) ); | ||||
|         } | ||||
|  | ||||
|         if( rightMarginSize > 0 ) | ||||
|         { | ||||
|             drawQuad( transform, renderer, x + backgroundColour.length() * FONT_WIDTH, y, rightMarginSize, height, palette, greyscale, backgroundColour.charAt( backgroundColour.length() - 1 ) ); | ||||
|         } | ||||
|  | ||||
|         // Batch together runs of identical background cells. | ||||
|         int blockStart = 0; | ||||
|         char blockColour = '\0'; | ||||
|         for( int i = 0; i < backgroundColour.length(); i++ ) | ||||
|         { | ||||
|             char colourIndex = backgroundColour.charAt( i ); | ||||
|             if( colourIndex == blockColour ) continue; | ||||
|  | ||||
|             if( blockColour != '\0' ) | ||||
|             { | ||||
|                 drawQuad( transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (i - blockStart), height, palette, greyscale, blockColour ); | ||||
|             } | ||||
|  | ||||
|             blockColour = colourIndex; | ||||
|             blockStart = i; | ||||
|         } | ||||
|  | ||||
|         if( blockColour != '\0' ) | ||||
|         { | ||||
|             drawQuad( transform, renderer, x + blockStart * FONT_WIDTH, y, FONT_WIDTH * (backgroundColour.length() - blockStart), height, palette, greyscale, blockColour ); | ||||
|         } | ||||
|     private static void drawQuad(Matrix4f transform, VertexConsumer buffer, float x, float y, float width, float height, float r, float g, float b) { | ||||
|         buffer.vertex(transform, x, y, 0) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(BACKGROUND_START, BACKGROUND_START) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x, y + height, 0) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(BACKGROUND_START, BACKGROUND_END) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x + width, y, 0) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(BACKGROUND_END, BACKGROUND_START) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x + width, y, 0) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(BACKGROUND_END, BACKGROUND_START) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x, y + height, 0) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(BACKGROUND_START, BACKGROUND_END) | ||||
|               .next(); | ||||
|         buffer.vertex(transform, x + width, y + height, 0) | ||||
|               .color(r, g, b, 1.0f) | ||||
|               .texture(BACKGROUND_END, BACKGROUND_END) | ||||
|               .next(); | ||||
|     } | ||||
|  | ||||
|     public static void drawString( | ||||
|         @Nonnull Matrix4f transform, @Nonnull VertexConsumer renderer, float x, float y, | ||||
|         @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, | ||||
|         @Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize | ||||
|     ) | ||||
|     { | ||||
|         if( backgroundColour != null ) | ||||
|         { | ||||
|             drawBackground( transform, renderer, x, y, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize, FONT_HEIGHT ); | ||||
|         } | ||||
|  | ||||
|         for( int i = 0; i < text.length(); i++ ) | ||||
|         { | ||||
|             double[] colour = palette.getColour( getColour( textColour.charAt( i ), Colour.BLACK ) ); | ||||
|             float r, g, b; | ||||
|             if( greyscale ) | ||||
|             { | ||||
|                 r = g = b = toGreyscale( colour ); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 r = (float) colour[0]; | ||||
|                 g = (float) colour[1]; | ||||
|                 b = (float) colour[2]; | ||||
|             } | ||||
|  | ||||
|             // Draw char | ||||
|             int index = text.charAt( i ); | ||||
|             if( index > 255 ) index = '?'; | ||||
|             drawChar( transform, renderer, x + i * FONT_WIDTH, y, index, r, g, b ); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public static void drawString( | ||||
|         float x, float y, @Nonnull TextBuffer text, @Nonnull TextBuffer textColour, @Nullable TextBuffer backgroundColour, | ||||
|         @Nonnull Palette palette, boolean greyscale, float leftMarginSize, float rightMarginSize | ||||
|     ) | ||||
|     { | ||||
|         bindFont(); | ||||
|  | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); | ||||
|         drawString( IDENTITY, ((VertexConsumerProvider) renderer).getBuffer( TYPE ), x, y, text, textColour, backgroundColour, palette, greyscale, leftMarginSize, rightMarginSize ); | ||||
|         renderer.draw(); | ||||
|     } | ||||
|  | ||||
|     public static void drawTerminalWithoutCursor( | ||||
|         @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, | ||||
|         @Nonnull Terminal terminal, boolean greyscale, | ||||
|         float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize | ||||
|     ) | ||||
|     { | ||||
|     public static void drawTerminalWithoutCursor(@Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, | ||||
|                                                  @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize, | ||||
|                                                  float leftMarginSize, float rightMarginSize) { | ||||
|         Palette palette = terminal.getPalette(); | ||||
|         int height = terminal.getHeight(); | ||||
|  | ||||
|         // Top and bottom margins | ||||
|         drawBackground( | ||||
|             transform, buffer, x, y - topMarginSize, | ||||
|             terminal.getBackgroundColourLine( 0 ), palette, greyscale, | ||||
|             leftMarginSize, rightMarginSize, topMarginSize | ||||
|         ); | ||||
|         drawBackground(transform, | ||||
|                        buffer, | ||||
|                        x, | ||||
|                        y - topMarginSize, | ||||
|                        terminal.getBackgroundColourLine(0), | ||||
|                        palette, | ||||
|                        greyscale, | ||||
|                        leftMarginSize, | ||||
|                        rightMarginSize, | ||||
|                        topMarginSize); | ||||
|  | ||||
|         drawBackground( | ||||
|             transform, buffer, x, y + height * FONT_HEIGHT, | ||||
|             terminal.getBackgroundColourLine( height - 1 ), palette, greyscale, | ||||
|             leftMarginSize, rightMarginSize, bottomMarginSize | ||||
|         ); | ||||
|         drawBackground(transform, | ||||
|                        buffer, | ||||
|                        x, | ||||
|                        y + height * FONT_HEIGHT, | ||||
|                        terminal.getBackgroundColourLine(height - 1), | ||||
|                        palette, | ||||
|                        greyscale, | ||||
|                        leftMarginSize, | ||||
|                        rightMarginSize, | ||||
|                        bottomMarginSize); | ||||
|  | ||||
|         // The main text | ||||
|         for( int i = 0; i < height; i++ ) | ||||
|         { | ||||
|             drawString( | ||||
|                 transform, buffer, x, y + FixedWidthFontRenderer.FONT_HEIGHT * i, | ||||
|                 terminal.getLine( i ), terminal.getTextColourLine( i ), terminal.getBackgroundColourLine( i ), | ||||
|                 palette, greyscale, leftMarginSize, rightMarginSize | ||||
|             ); | ||||
|         for (int i = 0; i < height; i++) { | ||||
|             drawString(transform, | ||||
|                        buffer, | ||||
|                        x, | ||||
|                        y + FixedWidthFontRenderer.FONT_HEIGHT * i, | ||||
|                        terminal.getLine(i), | ||||
|                        terminal.getTextColourLine(i), | ||||
|                        terminal.getBackgroundColourLine(i), | ||||
|                        palette, | ||||
|                        greyscale, | ||||
|                        leftMarginSize, | ||||
|                        rightMarginSize); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void drawCursor( | ||||
|         @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, | ||||
|         @Nonnull Terminal terminal, boolean greyscale | ||||
|     ) | ||||
|     { | ||||
|     public static void drawCursor(@Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @Nonnull Terminal terminal, | ||||
|                                   boolean greyscale) { | ||||
|         Palette palette = terminal.getPalette(); | ||||
|         int width = terminal.getWidth(); | ||||
|         int height = terminal.getHeight(); | ||||
|  | ||||
|         int cursorX = terminal.getCursorX(); | ||||
|         int cursorY = terminal.getCursorY(); | ||||
|         if( terminal.getCursorBlink() && cursorX >= 0 && cursorX < width && cursorY >= 0 && cursorY < height && FrameInfo.getGlobalCursorBlink() ) | ||||
|         { | ||||
|             double[] colour = palette.getColour( 15 - terminal.getTextColour() ); | ||||
|         if (terminal.getCursorBlink() && cursorX >= 0 && cursorX < width && cursorY >= 0 && cursorY < height && FrameInfo.getGlobalCursorBlink()) { | ||||
|             double[] colour = palette.getColour(15 - terminal.getTextColour()); | ||||
|             float r, g, b; | ||||
|             if( greyscale ) | ||||
|             { | ||||
|                 r = g = b = toGreyscale( colour ); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|             if (greyscale) { | ||||
|                 r = g = b = toGreyscale(colour); | ||||
|             } else { | ||||
|                 r = (float) colour[0]; | ||||
|                 g = (float) colour[1]; | ||||
|                 b = (float) colour[2]; | ||||
|             } | ||||
|  | ||||
|             drawChar( transform, buffer, x + cursorX * FONT_WIDTH, y + cursorY * FONT_HEIGHT, '_', r, g, b ); | ||||
|             drawChar(transform, buffer, x + cursorX * FONT_WIDTH, y + cursorY * FONT_HEIGHT, '_', r, g, b); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void drawTerminal( | ||||
|         @Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, | ||||
|         @Nonnull Terminal terminal, boolean greyscale, | ||||
|         float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize | ||||
|     ) | ||||
|     { | ||||
|         drawTerminalWithoutCursor( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); | ||||
|         drawCursor( transform, buffer, x, y, terminal, greyscale ); | ||||
|     public static void drawTerminal(@Nonnull Matrix4f transform, @Nonnull VertexConsumer buffer, float x, float y, @Nonnull Terminal terminal, | ||||
|                                     boolean greyscale, float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize) { | ||||
|         drawTerminalWithoutCursor(transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize); | ||||
|         drawCursor(transform, buffer, x, y, terminal, greyscale); | ||||
|     } | ||||
|  | ||||
|     public static void drawTerminal( | ||||
|         @Nonnull Matrix4f transform, float x, float y, @Nonnull Terminal terminal, boolean greyscale, | ||||
|         float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize | ||||
|     ) | ||||
|     { | ||||
|     public static void drawTerminal(@Nonnull Matrix4f transform, float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, | ||||
|                                     float bottomMarginSize, float leftMarginSize, float rightMarginSize) { | ||||
|         bindFont(); | ||||
|  | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); | ||||
|         VertexConsumer buffer = renderer.getBuffer( TYPE ); | ||||
|         drawTerminal( transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); | ||||
|         renderer.draw( TYPE ); | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() | ||||
|                                                                    .getBufferBuilders() | ||||
|                                                                    .getEntityVertexConsumers(); | ||||
|         VertexConsumer buffer = renderer.getBuffer(TYPE); | ||||
|         drawTerminal(transform, buffer, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize); | ||||
|         renderer.draw(TYPE); | ||||
|     } | ||||
|  | ||||
|     public static void drawTerminal( | ||||
|         float x, float y, @Nonnull Terminal terminal, boolean greyscale, | ||||
|         float topMarginSize, float bottomMarginSize, float leftMarginSize, float rightMarginSize | ||||
|     ) | ||||
|     { | ||||
|         drawTerminal( IDENTITY, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize ); | ||||
|     public static void drawTerminal(float x, float y, @Nonnull Terminal terminal, boolean greyscale, float topMarginSize, float bottomMarginSize, | ||||
|                                     float leftMarginSize, float rightMarginSize) { | ||||
|         drawTerminal(IDENTITY, x, y, terminal, greyscale, topMarginSize, bottomMarginSize, leftMarginSize, rightMarginSize); | ||||
|     } | ||||
|  | ||||
|     public static void drawEmptyTerminal( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, float height ) | ||||
|     { | ||||
|         Colour colour = Colour.BLACK; | ||||
|         drawQuad( transform, renderer.getBuffer( TYPE ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() ); | ||||
|     public static void drawEmptyTerminal(float x, float y, float width, float height) { | ||||
|         drawEmptyTerminal(IDENTITY, x, y, width, height); | ||||
|     } | ||||
|  | ||||
|     public static void drawEmptyTerminal( @Nonnull Matrix4f transform, float x, float y, float width, float height ) | ||||
|     { | ||||
|     public static void drawEmptyTerminal(@Nonnull Matrix4f transform, float x, float y, float width, float height) { | ||||
|         bindFont(); | ||||
|  | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); | ||||
|         drawEmptyTerminal( transform, renderer, x, y, width, height ); | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() | ||||
|                                                                    .getBufferBuilders() | ||||
|                                                                    .getEntityVertexConsumers(); | ||||
|         drawEmptyTerminal(transform, renderer, x, y, width, height); | ||||
|         renderer.draw(); | ||||
|     } | ||||
|  | ||||
|     public static void drawEmptyTerminal( float x, float y, float width, float height ) | ||||
|     { | ||||
|         drawEmptyTerminal( IDENTITY, x, y, width, height ); | ||||
|     } | ||||
|  | ||||
|     public static void drawBlocker( @Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, float height ) | ||||
|     { | ||||
|     public static void drawEmptyTerminal(@Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, | ||||
|                                          float height) { | ||||
|         Colour colour = Colour.BLACK; | ||||
|         drawQuad( transform, renderer.getBuffer( Type.BLOCKER ), x, y, width, height, colour.getR(), colour.getG(), colour.getB() ); | ||||
|         drawQuad(transform, renderer.getBuffer(TYPE), x, y, width, height, colour.getR(), colour.getG(), colour.getB()); | ||||
|     } | ||||
|  | ||||
|     private static void bindFont() | ||||
|     { | ||||
|         MinecraftClient.getInstance().getTextureManager().bindTexture( FONT ); | ||||
|         RenderSystem.texParameter( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP ); | ||||
|     public static void drawBlocker(@Nonnull Matrix4f transform, @Nonnull VertexConsumerProvider renderer, float x, float y, float width, float height) { | ||||
|         Colour colour = Colour.BLACK; | ||||
|         drawQuad(transform, renderer.getBuffer(Type.BLOCKER), x, y, width, height, colour.getR(), colour.getG(), colour.getB()); | ||||
|     } | ||||
|  | ||||
|     private static final class Type extends RenderPhase | ||||
|     { | ||||
|     private static final class Type extends RenderPhase { | ||||
|         private static final int GL_MODE = GL11.GL_TRIANGLES; | ||||
|  | ||||
|         private static final VertexFormat FORMAT = VertexFormats.POSITION_COLOR_TEXTURE; | ||||
|  | ||||
|         static final RenderLayer MAIN = RenderLayer.of( | ||||
|             "terminal_font", FORMAT, GL_MODE, 1024, | ||||
|             false, false, // useDelegate, needsSorting | ||||
|             RenderLayer.MultiPhaseParameters.builder() | ||||
|                 .texture( new RenderPhase.Texture( FONT, false, false ) ) // blur, minimap | ||||
|                 .alpha( ONE_TENTH_ALPHA ) | ||||
|                 .lightmap( DISABLE_LIGHTMAP ) | ||||
|                 .writeMaskState( COLOR_MASK ) | ||||
|                 .build( false ) | ||||
|         ); | ||||
|         static final RenderLayer MAIN = RenderLayer.of("terminal_font", FORMAT, GL_MODE, 1024, false, false, // useDelegate, needsSorting | ||||
|                                                        RenderLayer.MultiPhaseParameters.builder() | ||||
|                                                                                        .texture(new RenderPhase.Texture(FONT, | ||||
|                                                                                                                         false, | ||||
|                                                                                                                         false)) // blur, minimap | ||||
|                                                                                        .alpha(ONE_TENTH_ALPHA) | ||||
|                                                                                        .lightmap(DISABLE_LIGHTMAP) | ||||
|                                                                                        .writeMaskState(COLOR_MASK) | ||||
|                                                                                        .build(false)); | ||||
|  | ||||
|         static final RenderLayer BLOCKER = RenderLayer.of( | ||||
|             "terminal_blocker", FORMAT, GL_MODE, 256, | ||||
|             false, false, // useDelegate, needsSorting | ||||
|             RenderLayer.MultiPhaseParameters.builder() | ||||
|                 .texture( new RenderPhase.Texture( FONT, false, false ) ) // blur, minimap | ||||
|                 .alpha( ONE_TENTH_ALPHA ) | ||||
|                 .writeMaskState( DEPTH_MASK ) | ||||
|                 .lightmap( DISABLE_LIGHTMAP ) | ||||
|                 .build( false ) | ||||
|         ); | ||||
|         static final RenderLayer BLOCKER = RenderLayer.of("terminal_blocker", FORMAT, GL_MODE, 256, false, false, // useDelegate, needsSorting | ||||
|                                                           RenderLayer.MultiPhaseParameters.builder() | ||||
|                                                                                           .texture(new RenderPhase.Texture(FONT, | ||||
|                                                                                                                            false, | ||||
|                                                                                                                            false)) // blur, minimap | ||||
|                                                                                           .alpha(ONE_TENTH_ALPHA) | ||||
|                                                                                           .writeMaskState(DEPTH_MASK) | ||||
|                                                                                           .lightmap(DISABLE_LIGHTMAP) | ||||
|                                                                                           .build(false)); | ||||
|  | ||||
|         private Type( String name, Runnable setup, Runnable destroy ) | ||||
|         { | ||||
|             super( name, setup, destroy ); | ||||
|         private Type(String name, Runnable setup, Runnable destroy) { | ||||
|             super(name, setup, destroy); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,8 +3,14 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER; | ||||
| import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import com.mojang.blaze3d.systems.RenderSystem; | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.client.gui.widgets.WidgetTerminal; | ||||
| @@ -16,19 +22,14 @@ 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 org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import net.minecraft.client.gui.screen.ingame.HandledScreen; | ||||
| import net.minecraft.client.util.math.MatrixStack; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.text.Text; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER; | ||||
| import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN; | ||||
|  | ||||
| public final class GuiComputer<T extends ContainerComputerBase> extends HandledScreen<T> | ||||
| { | ||||
| public final class GuiComputer<T extends ContainerComputerBase> extends HandledScreen<T> { | ||||
|     private final ComputerFamily family; | ||||
|     private final ClientComputer computer; | ||||
|     private final int termWidth; | ||||
| @@ -37,123 +38,97 @@ public final class GuiComputer<T extends ContainerComputerBase> extends HandledS | ||||
|     private WidgetTerminal terminal; | ||||
|     private WidgetWrapper terminalWrapper; | ||||
|  | ||||
|     private GuiComputer( | ||||
|         T container, PlayerInventory player, Text title, int termWidth, int termHeight | ||||
|     ) | ||||
|     { | ||||
|         super( container, player, title ); | ||||
|         family = container.getFamily(); | ||||
|         computer = (ClientComputer) container.getComputer(); | ||||
|     private GuiComputer(T container, PlayerInventory player, Text title, int termWidth, int termHeight) { | ||||
|         super(container, player, title); | ||||
|         this.family = container.getFamily(); | ||||
|         this.computer = (ClientComputer) container.getComputer(); | ||||
|         this.termWidth = termWidth; | ||||
|         this.termHeight = termHeight; | ||||
|         terminal = null; | ||||
|         this.terminal = null; | ||||
|     } | ||||
|  | ||||
|     public static GuiComputer<ContainerComputer> create( ContainerComputer container, PlayerInventory inventory, Text component ) | ||||
|     { | ||||
|         return new GuiComputer<>( | ||||
|             container, inventory, component, | ||||
|             ComputerCraft.terminalWidth_computer, ComputerCraft.terminalHeight_computer | ||||
|         ); | ||||
|     public static GuiComputer<ContainerComputer> create(ContainerComputer container, PlayerInventory inventory, Text component) { | ||||
|         return new GuiComputer<>(container, inventory, component, ComputerCraft.terminalWidth_computer, ComputerCraft.terminalHeight_computer); | ||||
|     } | ||||
|  | ||||
|     public static GuiComputer<ContainerPocketComputer> createPocket( ContainerPocketComputer container, PlayerInventory inventory, Text component ) | ||||
|     { | ||||
|         return new GuiComputer<>( | ||||
|             container, inventory, component, | ||||
|             ComputerCraft.terminalWidth_pocketComputer, ComputerCraft.terminalHeight_pocketComputer | ||||
|         ); | ||||
|     public static GuiComputer<ContainerPocketComputer> createPocket(ContainerPocketComputer container, PlayerInventory inventory, Text component) { | ||||
|         return new GuiComputer<>(container, inventory, component, ComputerCraft.terminalWidth_pocketComputer, ComputerCraft.terminalHeight_pocketComputer); | ||||
|     } | ||||
|  | ||||
|     public static GuiComputer<ContainerViewComputer> createView( ContainerViewComputer container, PlayerInventory inventory, Text component ) | ||||
|     { | ||||
|         return new GuiComputer<>( | ||||
|             container, inventory, component, | ||||
|             container.getWidth(), container.getHeight() | ||||
|         ); | ||||
|     public static GuiComputer<ContainerViewComputer> createView(ContainerViewComputer container, PlayerInventory inventory, Text component) { | ||||
|         return new GuiComputer<>(container, inventory, component, container.getWidth(), container.getHeight()); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     protected void init() | ||||
|     { | ||||
|         client.keyboard.setRepeatEvents( true ); | ||||
|     protected void init() { | ||||
|         this.client.keyboard.setRepeatEvents(true); | ||||
|  | ||||
|         int termPxWidth = termWidth * FixedWidthFontRenderer.FONT_WIDTH; | ||||
|         int termPxHeight = termHeight * FixedWidthFontRenderer.FONT_HEIGHT; | ||||
|         int termPxWidth = this.termWidth * FixedWidthFontRenderer.FONT_WIDTH; | ||||
|         int termPxHeight = this.termHeight * FixedWidthFontRenderer.FONT_HEIGHT; | ||||
|  | ||||
|         backgroundWidth = termPxWidth + MARGIN * 2 + BORDER * 2; | ||||
|         backgroundHeight = termPxHeight + MARGIN * 2 + BORDER * 2; | ||||
|         this.backgroundWidth = termPxWidth + MARGIN * 2 + BORDER * 2; | ||||
|         this.backgroundHeight = termPxHeight + MARGIN * 2 + BORDER * 2; | ||||
|  | ||||
|         super.init(); | ||||
|  | ||||
|         terminal = new WidgetTerminal( client, () -> computer, termWidth, termHeight, MARGIN, MARGIN, MARGIN, MARGIN ); | ||||
|         terminalWrapper = new WidgetWrapper( terminal, MARGIN + BORDER + x, MARGIN + BORDER + y, termPxWidth, termPxHeight ); | ||||
|         this.terminal = new WidgetTerminal(this.client, () -> this.computer, this.termWidth, this.termHeight, MARGIN, MARGIN, MARGIN, MARGIN); | ||||
|         this.terminalWrapper = new WidgetWrapper(this.terminal, MARGIN + BORDER + this.x, MARGIN + BORDER + this.y, termPxWidth, termPxHeight); | ||||
|  | ||||
|         children.add( terminalWrapper ); | ||||
|         setFocused( terminalWrapper ); | ||||
|         this.children.add(this.terminalWrapper); | ||||
|         this.setFocused(this.terminalWrapper); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void removed() | ||||
|     { | ||||
|         super.removed(); | ||||
|         children.remove( terminal ); | ||||
|         terminal = null; | ||||
|         client.keyboard.setRepeatEvents( false ); | ||||
|     public void render(@Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks) { | ||||
|         super.render(stack, mouseX, mouseY, partialTicks); | ||||
|         this.drawMouseoverTooltip(stack, mouseX, mouseY); | ||||
|     } | ||||
|  | ||||
|     @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() == terminalWrapper ) | ||||
|         { | ||||
|             return getFocused().keyPressed( key, scancode, modifiers ); | ||||
|         } | ||||
|  | ||||
|         return super.keyPressed( key, scancode, modifiers ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void drawBackground( @Nonnull MatrixStack stack, float partialTicks, int mouseX, int mouseY ) | ||||
|     { | ||||
|         // Draw terminal | ||||
|         terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() ); | ||||
|  | ||||
|         // Draw a border around the terminal | ||||
|         RenderSystem.color4f( 1, 1, 1, 1 ); | ||||
|         client.getTextureManager().bindTexture( ComputerBorderRenderer.getTexture( family ) ); | ||||
|         ComputerBorderRenderer.render( | ||||
|             terminalWrapper.getX() - MARGIN, terminalWrapper.getY() - MARGIN, getZOffset(), | ||||
|             terminalWrapper.getWidth() + MARGIN * 2, terminalWrapper.getHeight() + MARGIN * 2 | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) | ||||
|     { | ||||
|         super.render( stack, mouseX, mouseY, partialTicks ); | ||||
|         drawMouseoverTooltip( stack, 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 ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawForeground( @Nonnull MatrixStack transform, int mouseX, int mouseY ) | ||||
|     { | ||||
|     protected void drawForeground(@Nonnull MatrixStack transform, int mouseX, int mouseY) { | ||||
|         // Skip rendering labels. | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void drawBackground(@Nonnull MatrixStack stack, float partialTicks, int mouseX, int mouseY) { | ||||
|         // Draw terminal | ||||
|         this.terminal.draw(this.terminalWrapper.getX(), this.terminalWrapper.getY()); | ||||
|  | ||||
|         // Draw a border around the terminal | ||||
|         RenderSystem.color4f(1, 1, 1, 1); | ||||
|         this.client.getTextureManager() | ||||
|                    .bindTexture(ComputerBorderRenderer.getTexture(this.family)); | ||||
|         ComputerBorderRenderer.render(this.terminalWrapper.getX() - MARGIN, this.terminalWrapper.getY() - MARGIN, | ||||
|                                       this.getZOffset(), this.terminalWrapper.getWidth() + MARGIN * 2, this.terminalWrapper.getHeight() + MARGIN * 2); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseDragged(double x, double y, int button, double deltaX, double deltaY) { | ||||
|         return (this.getFocused() != null && this.getFocused().mouseDragged(x, y, button, deltaX, deltaY)) || super.mouseDragged(x, y, button, deltaX, deltaY); | ||||
|     } | ||||
|  | ||||
|     @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 && this.getFocused() != null && this.getFocused() == this.terminalWrapper) { | ||||
|             return this.getFocused().keyPressed(key, scancode, modifiers); | ||||
|         } | ||||
|  | ||||
|         return super.keyPressed(key, scancode, modifiers); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void removed() { | ||||
|         super.removed(); | ||||
|         this.children.remove(this.terminal); | ||||
|         this.terminal = null; | ||||
|         this.client.keyboard.setRepeatEvents(false); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void tick() { | ||||
|         super.tick(); | ||||
|         this.terminal.update(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,39 +3,39 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import com.mojang.blaze3d.systems.RenderSystem; | ||||
| import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; | ||||
|  | ||||
| import net.minecraft.client.gui.screen.ingame.HandledScreen; | ||||
| import net.minecraft.client.util.math.MatrixStack; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.text.Text; | ||||
| import net.minecraft.util.Identifier; | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| public class GuiDiskDrive extends HandledScreen<ContainerDiskDrive> | ||||
| { | ||||
|     private static final Identifier BACKGROUND = new Identifier( "computercraft", "textures/gui/disk_drive.png" ); | ||||
| public class GuiDiskDrive extends HandledScreen<ContainerDiskDrive> { | ||||
|     private static final Identifier BACKGROUND = new Identifier("computercraft", "textures/gui/disk_drive.png"); | ||||
|  | ||||
|     public GuiDiskDrive( ContainerDiskDrive container, PlayerInventory player, Text title ) | ||||
|     { | ||||
|         super( container, player, title ); | ||||
|     public GuiDiskDrive(ContainerDiskDrive container, PlayerInventory player, Text title) { | ||||
|         super(container, player, title); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) | ||||
|     { | ||||
|         RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); | ||||
|         client.getTextureManager().bindTexture( BACKGROUND ); | ||||
|         drawTexture( transform, x, y, 0, 0, backgroundWidth, backgroundHeight ); | ||||
|     public void render(@Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks) { | ||||
|         this.renderBackground(transform); | ||||
|         super.render(transform, mouseX, mouseY, partialTicks); | ||||
|         this.drawMouseoverTooltip(transform, mouseX, mouseY); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks ) | ||||
|     { | ||||
|         renderBackground( transform ); | ||||
|         super.render( transform, mouseX, mouseY, partialTicks ); | ||||
|         drawMouseoverTooltip( transform, mouseX, mouseY ); | ||||
|     protected void drawBackground(@Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY) { | ||||
|         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||
|         this.client.getTextureManager() | ||||
|                    .bindTexture(BACKGROUND); | ||||
|         this.drawTexture(transform, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,24 +3,25 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import com.mojang.blaze3d.systems.RenderSystem; | ||||
| import dan200.computercraft.shared.peripheral.printer.ContainerPrinter; | ||||
|  | ||||
| import net.minecraft.client.gui.screen.ingame.HandledScreen; | ||||
| import net.minecraft.client.util.math.MatrixStack; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.text.Text; | ||||
| import net.minecraft.util.Identifier; | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| public class GuiPrinter extends HandledScreen<ContainerPrinter> | ||||
| { | ||||
|     private static final Identifier BACKGROUND = new Identifier( "computercraft", "textures/gui/printer.png" ); | ||||
| public class GuiPrinter extends HandledScreen<ContainerPrinter> { | ||||
|     private static final Identifier BACKGROUND = new Identifier("computercraft", "textures/gui/printer.png"); | ||||
|  | ||||
|     public GuiPrinter( ContainerPrinter container, PlayerInventory player, Text title ) | ||||
|     { | ||||
|         super( container, player, title ); | ||||
|     public GuiPrinter(ContainerPrinter container, PlayerInventory player, Text title) { | ||||
|         super(container, player, title); | ||||
|     } | ||||
|  | ||||
|     /*@Override | ||||
| @@ -32,20 +33,21 @@ public class GuiPrinter extends HandledScreen<ContainerPrinter> | ||||
|     }*/ | ||||
|  | ||||
|     @Override | ||||
|     protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) | ||||
|     { | ||||
|         RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); | ||||
|         client.getTextureManager().bindTexture( BACKGROUND ); | ||||
|         drawTexture( transform, x, y, 0, 0, backgroundWidth, backgroundHeight ); | ||||
|  | ||||
|         if( getScreenHandler().isPrinting() ) drawTexture( transform, x + 34, y + 21, 176, 0, 25, 45 ); | ||||
|     public void render(@Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks) { | ||||
|         this.renderBackground(stack); | ||||
|         super.render(stack, mouseX, mouseY, partialTicks); | ||||
|         this.drawMouseoverTooltip(stack, mouseX, mouseY); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) | ||||
|     { | ||||
|         renderBackground( stack ); | ||||
|         super.render( stack, mouseX, mouseY, partialTicks ); | ||||
|         drawMouseoverTooltip( stack, mouseX, mouseY ); | ||||
|     protected void drawBackground(@Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY) { | ||||
|         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||
|         this.client.getTextureManager() | ||||
|                    .bindTexture(BACKGROUND); | ||||
|         this.drawTexture(transform, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight); | ||||
|  | ||||
|         if (this.getScreenHandler().isPrinting()) { | ||||
|             this.drawTexture(transform, this.x + 34, this.y + 21, 176, 0, 25, 45); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,12 +3,23 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import static dan200.computercraft.client.render.PrintoutRenderer.X_TEXT_MARGIN; | ||||
| import static dan200.computercraft.client.render.PrintoutRenderer.Y_SIZE; | ||||
| import static dan200.computercraft.client.render.PrintoutRenderer.Y_TEXT_MARGIN; | ||||
| import static dan200.computercraft.client.render.PrintoutRenderer.drawBorder; | ||||
| import static dan200.computercraft.client.render.PrintoutRenderer.drawText; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import com.mojang.blaze3d.systems.RenderSystem; | ||||
| import dan200.computercraft.core.terminal.TextBuffer; | ||||
| import dan200.computercraft.shared.common.ContainerHeldItem; | ||||
| import dan200.computercraft.shared.media.items.ItemPrintout; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import net.minecraft.client.MinecraftClient; | ||||
| import net.minecraft.client.gui.screen.ingame.HandledScreen; | ||||
| import net.minecraft.client.render.VertexConsumerProvider; | ||||
| @@ -16,74 +27,55 @@ import net.minecraft.client.util.math.MatrixStack; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.text.Text; | ||||
| import net.minecraft.util.math.Matrix4f; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import static dan200.computercraft.client.render.PrintoutRenderer.*; | ||||
|  | ||||
| public class GuiPrintout extends HandledScreen<ContainerHeldItem> | ||||
| { | ||||
| public class GuiPrintout extends HandledScreen<ContainerHeldItem> { | ||||
|     private final boolean m_book; | ||||
|     private final int m_pages; | ||||
|     private final TextBuffer[] m_text; | ||||
|     private final TextBuffer[] m_colours; | ||||
|     private int m_page; | ||||
|  | ||||
|     public GuiPrintout( ContainerHeldItem container, PlayerInventory player, Text title ) | ||||
|     { | ||||
|         super( container, player, title ); | ||||
|     public GuiPrintout(ContainerHeldItem container, PlayerInventory player, Text title) { | ||||
|         super(container, player, title); | ||||
|  | ||||
|         backgroundHeight = Y_SIZE; | ||||
|         this.backgroundHeight = Y_SIZE; | ||||
|  | ||||
|         String[] text = ItemPrintout.getText( container.getStack() ); | ||||
|         m_text = new TextBuffer[text.length]; | ||||
|         for( int i = 0; i < m_text.length; i++ ) m_text[i] = new TextBuffer( text[i] ); | ||||
|         String[] text = ItemPrintout.getText(container.getStack()); | ||||
|         this.m_text = new TextBuffer[text.length]; | ||||
|         for (int i = 0; i < this.m_text.length; i++) { | ||||
|             this.m_text[i] = new TextBuffer(text[i]); | ||||
|         } | ||||
|  | ||||
|         String[] colours = ItemPrintout.getColours( container.getStack() ); | ||||
|         m_colours = new TextBuffer[colours.length]; | ||||
|         for( int i = 0; i < m_colours.length; i++ ) m_colours[i] = new TextBuffer( colours[i] ); | ||||
|         String[] colours = ItemPrintout.getColours(container.getStack()); | ||||
|         this.m_colours = new TextBuffer[colours.length]; | ||||
|         for (int i = 0; i < this.m_colours.length; i++) { | ||||
|             this.m_colours[i] = new TextBuffer(colours[i]); | ||||
|         } | ||||
|  | ||||
|         m_page = 0; | ||||
|         m_pages = Math.max( m_text.length / ItemPrintout.LINES_PER_PAGE, 1 ); | ||||
|         m_book = ((ItemPrintout) container.getStack().getItem()).getType() == ItemPrintout.Type.BOOK; | ||||
|         this.m_page = 0; | ||||
|         this.m_pages = Math.max(this.m_text.length / ItemPrintout.LINES_PER_PAGE, 1); | ||||
|         this.m_book = ((ItemPrintout) container.getStack() | ||||
|                                                .getItem()).getType() == ItemPrintout.Type.BOOK; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyPressed( int key, int scancode, int modifiers ) | ||||
|     { | ||||
|         if( super.keyPressed( key, scancode, modifiers ) ) return true; | ||||
|  | ||||
|         if( key == GLFW.GLFW_KEY_RIGHT ) | ||||
|         { | ||||
|             if( m_page < m_pages - 1 ) m_page++; | ||||
|     public boolean mouseScrolled(double x, double y, double delta) { | ||||
|         if (super.mouseScrolled(x, y, delta)) { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         if( key == GLFW.GLFW_KEY_LEFT ) | ||||
|         { | ||||
|             if( m_page > 0 ) m_page--; | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseScrolled( double x, double y, double delta ) | ||||
|     { | ||||
|         if( super.mouseScrolled( x, y, delta ) ) return true; | ||||
|         if( delta < 0 ) | ||||
|         { | ||||
|         if (delta < 0) { | ||||
|             // Scroll up goes to the next page | ||||
|             if( m_page < m_pages - 1 ) m_page++; | ||||
|             if (this.m_page < this.m_pages - 1) { | ||||
|                 this.m_page++; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         if( delta > 0 ) | ||||
|         { | ||||
|         if (delta > 0) { | ||||
|             // Scroll down goes to the previous page | ||||
|             if( m_page > 0 ) m_page--; | ||||
|             if (this.m_page > 0) { | ||||
|                 this.m_page--; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
| @@ -91,33 +83,56 @@ public class GuiPrintout extends HandledScreen<ContainerHeldItem> | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) | ||||
|     { | ||||
|     public void render(@Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks) { | ||||
|         // We must take the background further back in order to not overlap with our printed pages. | ||||
|         this.setZOffset(this.getZOffset() - 1); | ||||
|         this.renderBackground(stack); | ||||
|         this.setZOffset(this.getZOffset() + 1); | ||||
|  | ||||
|         super.render(stack, mouseX, mouseY, partialTicks); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawForeground(@Nonnull MatrixStack transform, int mouseX, int mouseY) { | ||||
|         // Skip rendering labels. | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawBackground(@Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY) { | ||||
|         // Draw the printout | ||||
|         RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f ); | ||||
|         RenderSystem.color4f(1.0f, 1.0f, 1.0f, 1.0f); | ||||
|         RenderSystem.enableDepthTest(); | ||||
|  | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); | ||||
|         Matrix4f matrix = transform.peek().getModel(); | ||||
|         drawBorder( matrix, renderer, x, y, getZOffset(), m_page, m_pages, m_book ); | ||||
|         drawText( matrix, renderer, x + X_TEXT_MARGIN, y + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours ); | ||||
|         VertexConsumerProvider.Immediate renderer = MinecraftClient.getInstance() | ||||
|                                                                    .getBufferBuilders() | ||||
|                                                                    .getEntityVertexConsumers(); | ||||
|         Matrix4f matrix = transform.peek() | ||||
|                                    .getModel(); | ||||
|         drawBorder(matrix, renderer, this.x, this.y, this.getZOffset(), this.m_page, this.m_pages, this.m_book); | ||||
|         drawText(matrix, renderer, this.x + X_TEXT_MARGIN, this.y + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * this.m_page, this.m_text, this.m_colours); | ||||
|         renderer.draw(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) | ||||
|     { | ||||
|         // We must take the background further back in order to not overlap with our printed pages. | ||||
|         setZOffset( getZOffset() - 1 ); | ||||
|         renderBackground( stack ); | ||||
|         setZOffset( getZOffset() + 1 ); | ||||
|     public boolean keyPressed(int key, int scancode, int modifiers) { | ||||
|         if (super.keyPressed(key, scancode, modifiers)) { | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         super.render( stack, mouseX, mouseY, partialTicks ); | ||||
|     } | ||||
|         if (key == GLFW.GLFW_KEY_RIGHT) { | ||||
|             if (this.m_page < this.m_pages - 1) { | ||||
|                 this.m_page++; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawForeground( @Nonnull MatrixStack transform, int mouseX, int mouseY ) | ||||
|     { | ||||
|         // Skip rendering labels. | ||||
|         if (key == GLFW.GLFW_KEY_LEFT) { | ||||
|             if (this.m_page > 0) { | ||||
|                 this.m_page--; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,8 +3,11 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| import com.mojang.blaze3d.systems.RenderSystem; | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.client.gui.widgets.WidgetTerminal; | ||||
| @@ -12,133 +15,112 @@ import dan200.computercraft.client.gui.widgets.WidgetWrapper; | ||||
| import dan200.computercraft.shared.computer.core.ClientComputer; | ||||
| import dan200.computercraft.shared.computer.core.ComputerFamily; | ||||
| import dan200.computercraft.shared.turtle.inventory.ContainerTurtle; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import net.minecraft.client.gui.screen.ingame.HandledScreen; | ||||
| import net.minecraft.client.util.math.MatrixStack; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.text.Text; | ||||
| import net.minecraft.util.Identifier; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| public class GuiTurtle extends HandledScreen<ContainerTurtle> | ||||
| { | ||||
|     private static final Identifier BACKGROUND_NORMAL = new Identifier( "computercraft", "textures/gui/turtle_normal.png" ); | ||||
|     private static final Identifier BACKGROUND_ADVANCED = new Identifier( "computercraft", "textures/gui/turtle_advanced.png" ); | ||||
|  | ||||
|     private ContainerTurtle m_container; | ||||
|  | ||||
| public class GuiTurtle extends HandledScreen<ContainerTurtle> { | ||||
|     private static final Identifier BACKGROUND_NORMAL = new Identifier("computercraft", "textures/gui/turtle_normal.png"); | ||||
|     private static final Identifier BACKGROUND_ADVANCED = new Identifier("computercraft", "textures/gui/turtle_advanced.png"); | ||||
|     private final ComputerFamily m_family; | ||||
|     private final ClientComputer m_computer; | ||||
|  | ||||
|     private ContainerTurtle m_container; | ||||
|     private WidgetTerminal terminal; | ||||
|     private WidgetWrapper terminalWrapper; | ||||
|  | ||||
|     public GuiTurtle( ContainerTurtle container, PlayerInventory player, Text title ) | ||||
|     { | ||||
|         super( container, player, title ); | ||||
|     public GuiTurtle(ContainerTurtle container, PlayerInventory player, Text title) { | ||||
|         super(container, player, title); | ||||
|  | ||||
|         m_container = container; | ||||
|         m_family = container.getFamily(); | ||||
|         m_computer = (ClientComputer) container.getComputer(); | ||||
|         this.m_container = container; | ||||
|         this.m_family = container.getFamily(); | ||||
|         this.m_computer = (ClientComputer) container.getComputer(); | ||||
|  | ||||
|         backgroundWidth = 254; | ||||
|         backgroundHeight = 217; | ||||
|         this.backgroundWidth = 254; | ||||
|         this.backgroundHeight = 217; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void init() | ||||
|     { | ||||
|     protected void init() { | ||||
|         super.init(); | ||||
|         client.keyboard.setRepeatEvents( true ); | ||||
|         this.client.keyboard.setRepeatEvents(true); | ||||
|  | ||||
|         int termPxWidth = ComputerCraft.terminalWidth_turtle * FixedWidthFontRenderer.FONT_WIDTH; | ||||
|         int termPxHeight = ComputerCraft.terminalHeight_turtle * FixedWidthFontRenderer.FONT_HEIGHT; | ||||
|  | ||||
|         terminal = new WidgetTerminal( | ||||
|             client, () -> m_computer, | ||||
|             ComputerCraft.terminalWidth_turtle, | ||||
|             ComputerCraft.terminalHeight_turtle, | ||||
|             2, 2, 2, 2 | ||||
|         ); | ||||
|         terminalWrapper = new WidgetWrapper( terminal, 2 + 8 + x, 2 + 8 + y, termPxWidth, termPxHeight ); | ||||
|         this.terminal = new WidgetTerminal(this.client, () -> this.m_computer, ComputerCraft.terminalWidth_turtle, ComputerCraft.terminalHeight_turtle, 2, 2, 2, 2); | ||||
|         this.terminalWrapper = new WidgetWrapper(this.terminal, 2 + 8 + this.x, 2 + 8 + this.y, termPxWidth, termPxHeight); | ||||
|  | ||||
|         children.add( terminalWrapper ); | ||||
|         setFocused( terminalWrapper ); | ||||
|         this.children.add(this.terminalWrapper); | ||||
|         this.setFocused(this.terminalWrapper); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void removed() | ||||
|     { | ||||
|         super.removed(); | ||||
|         children.remove( terminal ); | ||||
|         terminal = null; | ||||
|         client.keyboard.setRepeatEvents( false ); | ||||
|     public void render(@Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks) { | ||||
|         this.renderBackground(stack); | ||||
|         super.render(stack, mouseX, mouseY, partialTicks); | ||||
|         this.drawMouseoverTooltip(stack, mouseX, mouseY); | ||||
|     } | ||||
|  | ||||
|     @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() == terminalWrapper ) | ||||
|         { | ||||
|             return getFocused().keyPressed( key, scancode, modifiers ); | ||||
|         } | ||||
|  | ||||
|         return super.keyPressed( key, scancode, modifiers ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawBackground( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY ) | ||||
|     { | ||||
|         // Draw term | ||||
|         Identifier texture = m_family == ComputerFamily.ADVANCED ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL; | ||||
|         terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() ); | ||||
|  | ||||
|         // Draw border/inventory | ||||
|         RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); | ||||
|         client.getTextureManager().bindTexture( texture ); | ||||
|         drawTexture( transform, x, y, 0, 0, backgroundWidth, backgroundHeight ); | ||||
|  | ||||
|         // Draw selection slot | ||||
|         int slot = m_container.getSelectedSlot(); | ||||
|         if( slot >= 0 ) | ||||
|         { | ||||
|             int slotX = slot % 4; | ||||
|             int slotY = slot / 4; | ||||
|             drawTexture( transform, | ||||
|                 x + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, | ||||
|                 y + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, | ||||
|                 0, 217, 24, 24 | ||||
|             ); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks ) | ||||
|     { | ||||
|         renderBackground( stack ); | ||||
|         super.render( stack, mouseX, mouseY, partialTicks ); | ||||
|         drawMouseoverTooltip( stack, 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 ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawForeground( @Nonnull MatrixStack transform, int mouseX, int mouseY ) | ||||
|     { | ||||
|     protected void drawForeground(@Nonnull MatrixStack transform, int mouseX, int mouseY) { | ||||
|         // Skip rendering labels. | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void drawBackground(@Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY) { | ||||
|         // Draw term | ||||
|         Identifier texture = this.m_family == ComputerFamily.ADVANCED ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL; | ||||
|         this.terminal.draw(this.terminalWrapper.getX(), this.terminalWrapper.getY()); | ||||
|  | ||||
|         // Draw border/inventory | ||||
|         RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||
|         this.client.getTextureManager() | ||||
|                    .bindTexture(texture); | ||||
|         this.drawTexture(transform, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight); | ||||
|  | ||||
|         // Draw selection slot | ||||
|         int slot = this.m_container.getSelectedSlot(); | ||||
|         if (slot >= 0) { | ||||
|             int slotX = slot % 4; | ||||
|             int slotY = slot / 4; | ||||
|             this.drawTexture(transform, this.x + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, this.y + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, | ||||
|                              0, | ||||
|                              217, | ||||
|                              24, | ||||
|                              24); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseDragged(double x, double y, int button, double deltaX, double deltaY) { | ||||
|         return (this.getFocused() != null && this.getFocused().mouseDragged(x, y, button, deltaX, deltaY)) || super.mouseDragged(x, y, button, deltaX, deltaY); | ||||
|     } | ||||
|  | ||||
|     @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 && this.getFocused() != null && this.getFocused() == this.terminalWrapper) { | ||||
|             return this.getFocused().keyPressed(key, scancode, modifiers); | ||||
|         } | ||||
|  | ||||
|         return super.keyPressed(key, scancode, modifiers); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void removed() { | ||||
|         super.removed(); | ||||
|         this.children.remove(this.terminal); | ||||
|         this.terminal = null; | ||||
|         this.client.keyboard.setRepeatEvents(false); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void tick() { | ||||
|         super.tick(); | ||||
|         this.terminal.update(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,52 +3,47 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui.widgets; | ||||
|  | ||||
| import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; | ||||
| import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_WIDTH; | ||||
|  | ||||
| import java.util.BitSet; | ||||
| import java.util.function.Supplier; | ||||
|  | ||||
| import dan200.computercraft.client.gui.FixedWidthFontRenderer; | ||||
| import dan200.computercraft.core.terminal.Terminal; | ||||
| import dan200.computercraft.shared.computer.core.ClientComputer; | ||||
| import dan200.computercraft.shared.computer.core.IComputer; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
|  | ||||
| import java.util.BitSet; | ||||
| import java.util.function.Supplier; | ||||
| import net.minecraft.SharedConstants; | ||||
| import net.minecraft.client.MinecraftClient; | ||||
| import net.minecraft.client.gui.Element; | ||||
|  | ||||
| import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; | ||||
| import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_WIDTH; | ||||
|  | ||||
| public class WidgetTerminal implements Element | ||||
| { | ||||
| public class WidgetTerminal implements Element { | ||||
|     private static final float TERMINATE_TIME = 0.5f; | ||||
|  | ||||
|     private final MinecraftClient client; | ||||
|  | ||||
|     private boolean focused; | ||||
|  | ||||
|     private final Supplier<ClientComputer> computer; | ||||
|     private final int termWidth; | ||||
|     private final int termHeight; | ||||
|  | ||||
|     private float terminateTimer = -1; | ||||
|     private float rebootTimer = -1; | ||||
|     private float shutdownTimer = -1; | ||||
|  | ||||
|     private int lastMouseButton = -1; | ||||
|     private int lastMouseX = -1; | ||||
|     private int lastMouseY = -1; | ||||
|  | ||||
|     private final int leftMargin; | ||||
|     private final int rightMargin; | ||||
|     private final int topMargin; | ||||
|     private final int bottomMargin; | ||||
|     private final BitSet keysDown = new BitSet(256); | ||||
|     private boolean focused; | ||||
|     private float terminateTimer = -1; | ||||
|     private float rebootTimer = -1; | ||||
|     private float shutdownTimer = -1; | ||||
|     private int lastMouseButton = -1; | ||||
|     private int lastMouseX = -1; | ||||
|     private int lastMouseY = -1; | ||||
|  | ||||
|     private final BitSet keysDown = new BitSet( 256 ); | ||||
|  | ||||
|     public WidgetTerminal( MinecraftClient client, Supplier<ClientComputer> computer, int termWidth, int termHeight, int leftMargin, int rightMargin, int topMargin, int bottomMargin ) | ||||
|     { | ||||
|     public WidgetTerminal(MinecraftClient client, Supplier<ClientComputer> computer, int termWidth, int termHeight, int leftMargin, int rightMargin, | ||||
|                           int topMargin, int bottomMargin) { | ||||
|         this.client = client; | ||||
|         this.computer = computer; | ||||
|         this.termWidth = termWidth; | ||||
| @@ -60,295 +55,287 @@ public class WidgetTerminal implements Element | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean charTyped( char ch, int modifiers ) | ||||
|     { | ||||
|         if( ch >= 32 && ch <= 126 || ch >= 160 && ch <= 255 ) // printable chars in byte range | ||||
|     public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if (computer == null || !computer.isColour() || button < 0 || button > 2) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if (term != null) { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min(Math.max(charX, 0), term.getWidth() - 1); | ||||
|             charY = Math.min(Math.max(charY, 0), term.getHeight() - 1); | ||||
|  | ||||
|             computer.mouseClick(button + 1, charX + 1, charY + 1); | ||||
|  | ||||
|             this.lastMouseButton = button; | ||||
|             this.lastMouseX = charX; | ||||
|             this.lastMouseY = charY; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseReleased(double mouseX, double mouseY, int button) { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if (computer == null || !computer.isColour() || button < 0 || button > 2) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if (term != null) { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min(Math.max(charX, 0), term.getWidth() - 1); | ||||
|             charY = Math.min(Math.max(charY, 0), term.getHeight() - 1); | ||||
|  | ||||
|             if (this.lastMouseButton == button) { | ||||
|                 computer.mouseUp(this.lastMouseButton + 1, charX + 1, charY + 1); | ||||
|                 this.lastMouseButton = -1; | ||||
|             } | ||||
|  | ||||
|             this.lastMouseX = charX; | ||||
|             this.lastMouseY = charY; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseDragged(double mouseX, double mouseY, int button, double v2, double v3) { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if (computer == null || !computer.isColour() || button < 0 || button > 2) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if (term != null) { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min(Math.max(charX, 0), term.getWidth() - 1); | ||||
|             charY = Math.min(Math.max(charY, 0), term.getHeight() - 1); | ||||
|  | ||||
|             if (button == this.lastMouseButton && (charX != this.lastMouseX || charY != this.lastMouseY)) { | ||||
|                 computer.mouseDrag(button + 1, charX + 1, charY + 1); | ||||
|                 this.lastMouseX = charX; | ||||
|                 this.lastMouseY = charY; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseScrolled(double mouseX, double mouseY, double delta) { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if (computer == null || !computer.isColour() || delta == 0) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if (term != null) { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min(Math.max(charX, 0), term.getWidth() - 1); | ||||
|             charY = Math.min(Math.max(charY, 0), term.getHeight() - 1); | ||||
|  | ||||
|             computer.mouseScroll(delta < 0 ? 1 : -1, charX + 1, charY + 1); | ||||
|  | ||||
|             this.lastMouseX = charX; | ||||
|             this.lastMouseY = charY; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyPressed(int key, int scancode, int modifiers) { | ||||
|         if (key == GLFW.GLFW_KEY_ESCAPE) { | ||||
|             return false; | ||||
|         } | ||||
|         if ((modifiers & GLFW.GLFW_MOD_CONTROL) != 0) { | ||||
|             switch (key) { | ||||
|             case GLFW.GLFW_KEY_T: | ||||
|                 if (this.terminateTimer < 0) { | ||||
|                     this.terminateTimer = 0; | ||||
|                 } | ||||
|                 return true; | ||||
|             case GLFW.GLFW_KEY_S: | ||||
|                 if (this.shutdownTimer < 0) { | ||||
|                     this.shutdownTimer = 0; | ||||
|                 } | ||||
|                 return true; | ||||
|             case GLFW.GLFW_KEY_R: | ||||
|                 if (this.rebootTimer < 0) { | ||||
|                     this.rebootTimer = 0; | ||||
|                 } | ||||
|                 return true; | ||||
|  | ||||
|             case GLFW.GLFW_KEY_V: | ||||
|                 // Ctrl+V for paste | ||||
|                 String clipboard = this.client.keyboard.getClipboard(); | ||||
|                 if (clipboard != null) { | ||||
|                     // Clip to the first occurrence of \r or \n | ||||
|                     int newLineIndex1 = clipboard.indexOf("\r"); | ||||
|                     int newLineIndex2 = clipboard.indexOf("\n"); | ||||
|                     if (newLineIndex1 >= 0 && newLineIndex2 >= 0) { | ||||
|                         clipboard = clipboard.substring(0, Math.min(newLineIndex1, newLineIndex2)); | ||||
|                     } else if (newLineIndex1 >= 0) { | ||||
|                         clipboard = clipboard.substring(0, newLineIndex1); | ||||
|                     } else if (newLineIndex2 >= 0) { | ||||
|                         clipboard = clipboard.substring(0, newLineIndex2); | ||||
|                     } | ||||
|  | ||||
|                     // Filter the string | ||||
|                     clipboard = SharedConstants.stripInvalidChars(clipboard); | ||||
|                     if (!clipboard.isEmpty()) { | ||||
|                         // Clip to 512 characters and queue the event | ||||
|                         if (clipboard.length() > 512) { | ||||
|                             clipboard = clipboard.substring(0, 512); | ||||
|                         } | ||||
|                         this.queueEvent("paste", clipboard); | ||||
|                     } | ||||
|  | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (key >= 0 && this.terminateTimer < 0 && this.rebootTimer < 0 && this.shutdownTimer < 0) { | ||||
|             // Queue the "key" event and add to the down set | ||||
|             boolean repeat = this.keysDown.get(key); | ||||
|             this.keysDown.set(key); | ||||
|             IComputer computer = this.computer.get(); | ||||
|             if (computer != null) { | ||||
|                 computer.keyDown(key, repeat); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyReleased(int key, int scancode, int modifiers) { | ||||
|         // Queue the "key_up" event and remove from the down set | ||||
|         if (key >= 0 && this.keysDown.get(key)) { | ||||
|             this.keysDown.set(key, false); | ||||
|             IComputer computer = this.computer.get(); | ||||
|             if (computer != null) { | ||||
|                 computer.keyUp(key); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         switch (key) { | ||||
|         case GLFW.GLFW_KEY_T: | ||||
|             this.terminateTimer = -1; | ||||
|             break; | ||||
|         case GLFW.GLFW_KEY_R: | ||||
|             this.rebootTimer = -1; | ||||
|             break; | ||||
|         case GLFW.GLFW_KEY_S: | ||||
|             this.shutdownTimer = -1; | ||||
|             break; | ||||
|         case GLFW.GLFW_KEY_LEFT_CONTROL: | ||||
|         case GLFW.GLFW_KEY_RIGHT_CONTROL: | ||||
|             this.terminateTimer = this.rebootTimer = this.shutdownTimer = -1; | ||||
|             break; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean charTyped(char ch, int modifiers) { | ||||
|         if (ch >= 32 && ch <= 126 || ch >= 160 && ch <= 255) // printable chars in byte range | ||||
|         { | ||||
|             // Queue the "char" event | ||||
|             queueEvent( "char", Character.toString( ch ) ); | ||||
|             this.queueEvent("char", Character.toString(ch)); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyPressed( int key, int scancode, int modifiers ) | ||||
|     { | ||||
|         if( key == GLFW.GLFW_KEY_ESCAPE ) return false; | ||||
|         if( (modifiers & GLFW.GLFW_MOD_CONTROL) != 0 ) | ||||
|         { | ||||
|             switch( key ) | ||||
|             { | ||||
|                 case GLFW.GLFW_KEY_T: | ||||
|                     if( terminateTimer < 0 ) terminateTimer = 0; | ||||
|                     return true; | ||||
|                 case GLFW.GLFW_KEY_S: | ||||
|                     if( shutdownTimer < 0 ) shutdownTimer = 0; | ||||
|                     return true; | ||||
|                 case GLFW.GLFW_KEY_R: | ||||
|                     if( rebootTimer < 0 ) rebootTimer = 0; | ||||
|                     return true; | ||||
|  | ||||
|                 case GLFW.GLFW_KEY_V: | ||||
|                     // Ctrl+V for paste | ||||
|                     String clipboard = client.keyboard.getClipboard(); | ||||
|                     if( clipboard != null ) | ||||
|                     { | ||||
|                         // Clip to the first occurrence of \r or \n | ||||
|                         int newLineIndex1 = clipboard.indexOf( "\r" ); | ||||
|                         int newLineIndex2 = clipboard.indexOf( "\n" ); | ||||
|                         if( newLineIndex1 >= 0 && newLineIndex2 >= 0 ) | ||||
|                         { | ||||
|                             clipboard = clipboard.substring( 0, Math.min( newLineIndex1, newLineIndex2 ) ); | ||||
|                         } | ||||
|                         else if( newLineIndex1 >= 0 ) | ||||
|                         { | ||||
|                             clipboard = clipboard.substring( 0, newLineIndex1 ); | ||||
|                         } | ||||
|                         else if( newLineIndex2 >= 0 ) | ||||
|                         { | ||||
|                             clipboard = clipboard.substring( 0, newLineIndex2 ); | ||||
|                         } | ||||
|  | ||||
|                         // Filter the string | ||||
|                         clipboard = SharedConstants.stripInvalidChars( clipboard ); | ||||
|                         if( !clipboard.isEmpty() ) | ||||
|                         { | ||||
|                             // Clip to 512 characters and queue the event | ||||
|                             if( clipboard.length() > 512 ) clipboard = clipboard.substring( 0, 512 ); | ||||
|                             queueEvent( "paste", clipboard ); | ||||
|                         } | ||||
|  | ||||
|                         return true; | ||||
|                     } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if( key >= 0 && terminateTimer < 0 && rebootTimer < 0 && shutdownTimer < 0 ) | ||||
|         { | ||||
|             // Queue the "key" event and add to the down set | ||||
|             boolean repeat = keysDown.get( key ); | ||||
|             keysDown.set( key ); | ||||
|             IComputer computer = this.computer.get(); | ||||
|             if( computer != null ) computer.keyDown( key, repeat ); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyReleased( int key, int scancode, int modifiers ) | ||||
|     { | ||||
|         // Queue the "key_up" event and remove from the down set | ||||
|         if( key >= 0 && keysDown.get( key ) ) | ||||
|         { | ||||
|             keysDown.set( key, false ); | ||||
|             IComputer computer = this.computer.get(); | ||||
|             if( computer != null ) computer.keyUp( key ); | ||||
|         } | ||||
|  | ||||
|         switch( key ) | ||||
|         { | ||||
|             case GLFW.GLFW_KEY_T: | ||||
|                 terminateTimer = -1; | ||||
|                 break; | ||||
|             case GLFW.GLFW_KEY_R: | ||||
|                 rebootTimer = -1; | ||||
|                 break; | ||||
|             case GLFW.GLFW_KEY_S: | ||||
|                 shutdownTimer = -1; | ||||
|                 break; | ||||
|             case GLFW.GLFW_KEY_LEFT_CONTROL: | ||||
|             case GLFW.GLFW_KEY_RIGHT_CONTROL: | ||||
|                 terminateTimer = rebootTimer = shutdownTimer = -1; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseClicked( double mouseX, double mouseY, int button ) | ||||
|     { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if( computer == null || !computer.isColour() || button < 0 || button > 2 ) return false; | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if( term != null ) | ||||
|         { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); | ||||
|             charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 ); | ||||
|  | ||||
|             computer.mouseClick( button + 1, charX + 1, charY + 1 ); | ||||
|  | ||||
|             lastMouseButton = button; | ||||
|             lastMouseX = charX; | ||||
|             lastMouseY = charY; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseReleased( double mouseX, double mouseY, int button ) | ||||
|     { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if( computer == null || !computer.isColour() || button < 0 || button > 2 ) return false; | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if( term != null ) | ||||
|         { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); | ||||
|             charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 ); | ||||
|  | ||||
|             if( lastMouseButton == button ) | ||||
|             { | ||||
|                 computer.mouseUp( lastMouseButton + 1, charX + 1, charY + 1 ); | ||||
|                 lastMouseButton = -1; | ||||
|             } | ||||
|  | ||||
|             lastMouseX = charX; | ||||
|             lastMouseY = charY; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseDragged( double mouseX, double mouseY, int button, double v2, double v3 ) | ||||
|     { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if( computer == null || !computer.isColour() || button < 0 || button > 2 ) return false; | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if( term != null ) | ||||
|         { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); | ||||
|             charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 ); | ||||
|  | ||||
|             if( button == lastMouseButton && (charX != lastMouseX || charY != lastMouseY) ) | ||||
|             { | ||||
|                 computer.mouseDrag( button + 1, charX + 1, charY + 1 ); | ||||
|                 lastMouseX = charX; | ||||
|                 lastMouseY = charY; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseScrolled( double mouseX, double mouseY, double delta ) | ||||
|     { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if( computer == null || !computer.isColour() || delta == 0 ) return false; | ||||
|  | ||||
|         Terminal term = computer.getTerminal(); | ||||
|         if( term != null ) | ||||
|         { | ||||
|             int charX = (int) (mouseX / FONT_WIDTH); | ||||
|             int charY = (int) (mouseY / FONT_HEIGHT); | ||||
|             charX = Math.min( Math.max( charX, 0 ), term.getWidth() - 1 ); | ||||
|             charY = Math.min( Math.max( charY, 0 ), term.getHeight() - 1 ); | ||||
|  | ||||
|             computer.mouseScroll( delta < 0 ? 1 : -1, charX + 1, charY + 1 ); | ||||
|  | ||||
|             lastMouseX = charX; | ||||
|             lastMouseY = charY; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public void update() | ||||
|     { | ||||
|         if( terminateTimer >= 0 && terminateTimer < TERMINATE_TIME && (terminateTimer += 0.05f) > TERMINATE_TIME ) | ||||
|         { | ||||
|             queueEvent( "terminate" ); | ||||
|         } | ||||
|  | ||||
|         if( shutdownTimer >= 0 && shutdownTimer < TERMINATE_TIME && (shutdownTimer += 0.05f) > TERMINATE_TIME ) | ||||
|         { | ||||
|             ClientComputer computer = this.computer.get(); | ||||
|             if( computer != null ) computer.shutdown(); | ||||
|         } | ||||
|  | ||||
|         if( rebootTimer >= 0 && rebootTimer < TERMINATE_TIME && (rebootTimer += 0.05f) > TERMINATE_TIME ) | ||||
|         { | ||||
|             ClientComputer computer = this.computer.get(); | ||||
|             if( computer != null ) computer.reboot(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean changeFocus( boolean reversed ) | ||||
|     { | ||||
|         if( focused ) | ||||
|         { | ||||
|     public boolean changeFocus(boolean reversed) { | ||||
|         if (this.focused) { | ||||
|             // When blurring, we should make all keys go up | ||||
|             for( int key = 0; key < keysDown.size(); key++ ) | ||||
|             { | ||||
|                 if( keysDown.get( key ) ) queueEvent( "key_up", key ); | ||||
|             for (int key = 0; key < this.keysDown.size(); key++) { | ||||
|                 if (this.keysDown.get(key)) { | ||||
|                     this.queueEvent("key_up", key); | ||||
|                 } | ||||
|             } | ||||
|             keysDown.clear(); | ||||
|             this.keysDown.clear(); | ||||
|  | ||||
|             // When blurring, we should make the last mouse button go up | ||||
|             if( lastMouseButton > 0 ) | ||||
|             { | ||||
|             if (this.lastMouseButton > 0) { | ||||
|                 IComputer computer = this.computer.get(); | ||||
|                 if( computer != null ) computer.mouseUp( lastMouseButton + 1, lastMouseX + 1, lastMouseY + 1 ); | ||||
|                 lastMouseButton = -1; | ||||
|                 if (computer != null) { | ||||
|                     computer.mouseUp(this.lastMouseButton + 1, this.lastMouseX + 1, this.lastMouseY + 1); | ||||
|                 } | ||||
|                 this.lastMouseButton = -1; | ||||
|             } | ||||
|  | ||||
|             shutdownTimer = terminateTimer = rebootTimer = -1; | ||||
|             this.shutdownTimer = this.terminateTimer = this.rebootTimer = -1; | ||||
|         } | ||||
|         focused = !focused; | ||||
|         this.focused = !this.focused; | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     public void draw( int originX, int originY ) | ||||
|     { | ||||
|         synchronized( computer ) | ||||
|         { | ||||
|     @Override | ||||
|     public boolean isMouseOver(double x, double y) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     private void queueEvent(String event, Object... args) { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if (computer != null) { | ||||
|             computer.queueEvent(event, args); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void update() { | ||||
|         if (this.terminateTimer >= 0 && this.terminateTimer < TERMINATE_TIME && (this.terminateTimer += 0.05f) > TERMINATE_TIME) { | ||||
|             this.queueEvent("terminate"); | ||||
|         } | ||||
|  | ||||
|         if (this.shutdownTimer >= 0 && this.shutdownTimer < TERMINATE_TIME && (this.shutdownTimer += 0.05f) > TERMINATE_TIME) { | ||||
|             ClientComputer computer = this.computer.get(); | ||||
|             if (computer != null) { | ||||
|                 computer.shutdown(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (this.rebootTimer >= 0 && this.rebootTimer < TERMINATE_TIME && (this.rebootTimer += 0.05f) > TERMINATE_TIME) { | ||||
|             ClientComputer computer = this.computer.get(); | ||||
|             if (computer != null) { | ||||
|                 computer.reboot(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void queueEvent(String event) { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if (computer != null) { | ||||
|             computer.queueEvent(event); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void draw(int originX, int originY) { | ||||
|         synchronized (this.computer) { | ||||
|             // Draw the screen contents | ||||
|             ClientComputer computer = this.computer.get(); | ||||
|             Terminal terminal = computer != null ? computer.getTerminal() : null; | ||||
|             if( terminal != null ) | ||||
|             { | ||||
|                 FixedWidthFontRenderer.drawTerminal( originX, originY, terminal, !computer.isColour(), topMargin, bottomMargin, leftMargin, rightMargin ); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 FixedWidthFontRenderer.drawEmptyTerminal( | ||||
|                     originX - leftMargin, originY - rightMargin, | ||||
|                     termWidth * FONT_WIDTH + leftMargin + rightMargin, | ||||
|                     termHeight * FONT_HEIGHT + topMargin + bottomMargin | ||||
|                 ); | ||||
|             if (terminal != null) { | ||||
|                 FixedWidthFontRenderer.drawTerminal(originX, originY, terminal, !computer.isColour(), this.topMargin, this.bottomMargin, this.leftMargin, | ||||
|                                                     this.rightMargin); | ||||
|             } else { | ||||
|                 FixedWidthFontRenderer.drawEmptyTerminal(originX - this.leftMargin, | ||||
|                                                          originY - this.rightMargin, this.termWidth * FONT_WIDTH + this.leftMargin + this.rightMargin, | ||||
|                                                          this.termHeight * FONT_HEIGHT + this.topMargin + this.bottomMargin); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void queueEvent( String event ) | ||||
|     { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if( computer != null ) computer.queueEvent( event ); | ||||
|     } | ||||
|  | ||||
|     private void queueEvent( String event, Object... args ) | ||||
|     { | ||||
|         ClientComputer computer = this.computer.get(); | ||||
|         if( computer != null ) computer.queueEvent( event, args ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isMouseOver( double x, double y ) | ||||
|     { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,20 +3,19 @@ | ||||
|  * Copyright Daniel Ratcliffe, 2011-2020. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
|  | ||||
| package dan200.computercraft.client.gui.widgets; | ||||
|  | ||||
| import net.minecraft.client.gui.Element; | ||||
|  | ||||
| public class WidgetWrapper implements Element | ||||
| { | ||||
| public class WidgetWrapper implements Element { | ||||
|     private final Element listener; | ||||
|     private final int x; | ||||
|     private final int y; | ||||
|     private final int width; | ||||
|     private final int height; | ||||
|  | ||||
|     public WidgetWrapper( Element listener, int x, int y, int width, int height ) | ||||
|     { | ||||
|     public WidgetWrapper(Element listener, int x, int y, int width, int height) { | ||||
|         this.listener = listener; | ||||
|         this.x = x; | ||||
|         this.y = y; | ||||
| @@ -25,81 +24,68 @@ public class WidgetWrapper implements Element | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean changeFocus( boolean b ) | ||||
|     { | ||||
|         return listener.changeFocus( b ); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseClicked( double x, double y, int button ) | ||||
|     { | ||||
|     public boolean mouseClicked(double x, double y, int button) { | ||||
|         double dx = x - this.x, dy = y - this.y; | ||||
|         return dx >= 0 && dx < width && dy >= 0 && dy < height && listener.mouseClicked( dx, dy, button ); | ||||
|         return dx >= 0 && dx < this.width && dy >= 0 && dy < this.height && this.listener.mouseClicked(dx, dy, button); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseReleased( double x, double y, int button ) | ||||
|     { | ||||
|     public boolean mouseReleased(double x, double y, int button) { | ||||
|         double dx = x - this.x, dy = y - this.y; | ||||
|         return dx >= 0 && dx < width && dy >= 0 && dy < height && listener.mouseReleased( dx, dy, button ); | ||||
|         return dx >= 0 && dx < this.width && dy >= 0 && dy < this.height && this.listener.mouseReleased(dx, dy, button); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseDragged( double x, double y, int button, double deltaX, double deltaY ) | ||||
|     { | ||||
|     public boolean mouseDragged(double x, double y, int button, double deltaX, double deltaY) { | ||||
|         double dx = x - this.x, dy = y - this.y; | ||||
|         return dx >= 0 && dx < width && dy >= 0 && dy < height && listener.mouseDragged( dx, dy, button, deltaX, deltaY ); | ||||
|         return dx >= 0 && dx < this.width && dy >= 0 && dy < this.height && this.listener.mouseDragged(dx, dy, button, deltaX, deltaY); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean mouseScrolled( double x, double y, double delta ) | ||||
|     { | ||||
|     public boolean mouseScrolled(double x, double y, double delta) { | ||||
|         double dx = x - this.x, dy = y - this.y; | ||||
|         return dx >= 0 && dx < width && dy >= 0 && dy < height && listener.mouseScrolled( dx, dy, delta ); | ||||
|         return dx >= 0 && dx < this.width && dy >= 0 && dy < this.height && this.listener.mouseScrolled(dx, dy, delta); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyPressed( int key, int scancode, int modifiers ) | ||||
|     { | ||||
|         return listener.keyPressed( key, scancode, modifiers ); | ||||
|     public boolean keyPressed(int key, int scancode, int modifiers) { | ||||
|         return this.listener.keyPressed(key, scancode, modifiers); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean keyReleased( int key, int scancode, int modifiers ) | ||||
|     { | ||||
|         return listener.keyReleased( key, scancode, modifiers ); | ||||
|     public boolean keyReleased(int key, int scancode, int modifiers) { | ||||
|         return this.listener.keyReleased(key, scancode, modifiers); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean charTyped( char character, int modifiers ) | ||||
|     { | ||||
|         return listener.charTyped( character, modifiers ); | ||||
|     } | ||||
|  | ||||
|     public int getX() | ||||
|     { | ||||
|         return x; | ||||
|     } | ||||
|  | ||||
|     public int getY() | ||||
|     { | ||||
|         return y; | ||||
|     } | ||||
|  | ||||
|     public int getWidth() | ||||
|     { | ||||
|         return width; | ||||
|     } | ||||
|  | ||||
|     public int getHeight() | ||||
|     { | ||||
|         return height; | ||||
|     public boolean charTyped(char character, int modifiers) { | ||||
|         return this.listener.charTyped(character, modifiers); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isMouseOver( double x, double y ) | ||||
|     { | ||||
|     public boolean changeFocus(boolean b) { | ||||
|         return this.listener.changeFocus(b); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isMouseOver(double x, double y) { | ||||
|         double dx = x - this.x, dy = y - this.y; | ||||
|         return dx >= 0 && dx < width && dy >= 0 && dy < height; | ||||
|         return dx >= 0 && dx < this.width && dy >= 0 && dy < this.height; | ||||
|     } | ||||
|  | ||||
|     public int getX() { | ||||
|         return this.x; | ||||
|     } | ||||
|  | ||||
|     public int getY() { | ||||
|         return this.y; | ||||
|     } | ||||
|  | ||||
|     public int getWidth() { | ||||
|         return this.width; | ||||
|     } | ||||
|  | ||||
|     public int getHeight() { | ||||
|         return this.height; | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Devan-Kerman
					Devan-Kerman