]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/gui/SelectableControlList.java
fix world save load screen render issues
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / gui / SelectableControlList.java
1 package com.irtimaled.bbor.client.gui;
2
3 import com.irtimaled.bbor.client.renderers.RenderHelper;
4 import com.irtimaled.bbor.client.renderers.Renderer;
5 import net.minecraft.client.util.math.MatrixStack;
6
7 public class SelectableControlList extends ControlList {
8     private final int listRight;
9
10     private int selectedElement;
11     private boolean isFocused;
12
13     SelectableControlList(int width, int height, int top, int bottom) {
14         super(width, height, top, bottom);
15         this.listRight = this.listLeft + CONTROLS_WIDTH;
16         this.selectedElement = -1;
17     }
18
19     @Override
20     public void filter(String lowerValue) {
21         super.filter(lowerValue);
22         if (selectedElement >= 0) {
23             if (selectNextVisibleElement(true, selectedElement) ||
24                     selectNextVisibleElement(true, 0)) return;
25             selectedElement = -1;
26         }
27     }
28
29     @Override
30     public boolean keyPressed(int key, int scanCode, int modifiers) {
31         if (key != 264 && key != 265 && key != 257) return false;
32
33         if (key == 257) {
34             if (selectedElement >= 0) {
35                 getSelectedEntry().done();
36                 return true;
37             }
38             return false;
39         }
40
41         boolean moveForward = key == 264;
42         if (selectedElement >= 0) {
43             int newIndex = selectedElement + (moveForward ? 1 : 0);
44             if (selectNextVisibleElement(moveForward, newIndex)) return true;
45         }
46         if (selectNextVisibleElement(moveForward, moveForward ? 0 : entries.size())) return true;
47
48         this.selectedElement = -1;
49         return false;
50     }
51
52     private boolean selectNextVisibleElement(boolean moveForward, int index) {
53         return ListHelper.findNextMatch(entries, index, moveForward, ControlListEntry::isVisible,
54                 entry -> this.selectedElement = entry.index);
55     }
56
57     ControlListEntry getSelectedEntry() {
58         return this.selectedElement >= 0 && this.selectedElement < this.entries.size() ?
59                 this.entries.get(this.selectedElement) :
60                 null;
61     }
62
63     void setSelectedEntry(ControlListEntry entry) {
64         if (entry != null) {
65             this.selectedElement = entry.index;
66         } else {
67             this.selectedElement = -1;
68         }
69     }
70
71     @Override
72     public boolean changeFocus(boolean moveForward) {
73         if (contentHeight == PADDING) return false;
74
75         isFocused = !isFocused;
76         if (getSelectedEntry() == null && this.entries.size() > 0) {
77             setSelectedEntry(this.entries.get(0));
78         }
79         return isFocused;
80     }
81
82     @Override
83     protected void drawEntry(MatrixStack matrixStack, int mouseX, int mouseY, int top, ControlListEntry entry, int height) {
84         if (this.selectedElement == entry.index) {
85             RenderHelper.disableTexture();
86             RenderHelper.resetShader();
87             int color = this.isFocused ? 255 : 128;
88             Renderer.startQuads()
89                     .setAlpha(255)
90                     .setColor(color, color, color)
91                     .addPoint((double) this.listLeft - 2, (double) (top + height) - 2, 0.0D)
92                     .addPoint((double) this.listRight + 2, (double) (top + height) - 2, 0.0D)
93                     .addPoint((double) this.listRight + 2, top - 2, 0.0D)
94                     .addPoint((double) this.listLeft - 2, top - 2, 0.0D)
95                     .setColor(0, 0, 0)
96                     .addPoint(this.listLeft - 1, (double) (top + height) - 3, 0.0D)
97                     .addPoint(this.listRight + 1, (double) (top + height) - 3, 0.0D)
98                     .addPoint(this.listRight + 1, top - 1, 0.0D)
99                     .addPoint(this.listLeft - 1, top - 1, 0.0D)
100                     .render();
101             RenderHelper.enableTexture();
102         }
103         super.drawEntry(matrixStack, mouseX, mouseY, top, entry, height);
104     }
105
106     @Override
107     public void clearFocus() {
108         this.isFocused = false;
109     }
110 }