Skip to content

Commit 8cbd97b

Browse files
committed
a working color picker !?
1 parent 5aa392c commit 8cbd97b

File tree

6 files changed

+109
-30
lines changed

6 files changed

+109
-30
lines changed

src/main/java/io/github/axolotlclient/config/screen/ButtonWidgetList.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,16 @@ public void render(int mouseX, int mouseY, float delta){
141141
}
142142
}
143143

144-
protected void renderTooltips(int x, int y, int mouseX, int mouseY){
144+
protected void renderTooltips(int mouseX, int mouseY){
145+
Util.applyScissor(new Rectangle(0, yStart, this.width, yEnd-yStart));
145146
int i = this.getEntryCount();
146147

147148
for(int j = 0; j < i; ++j) {
148149
Pair pair = entries.get(j);
149150

150-
int k = y + j * this.entryHeight + this.headerHeight;
151-
pair.renderTooltips(x, k, mouseX, mouseY);
151+
pair.renderTooltips(mouseX, mouseY);
152152
}
153+
GL11.glDisable(GL11.GL_SCISSOR_TEST);
153154
}
154155

155156
@Override
@@ -161,7 +162,6 @@ public int getRowWidth() {
161162
protected void renderList(int x, int y, int mouseX, int mouseY) {
162163
Util.applyScissor(new Rectangle(0, yStart, this.width, yEnd-yStart));
163164
super.renderList(x, y, mouseX, mouseY);
164-
renderTooltips(x, y, mouseX, mouseY);
165165
GL11.glDisable(GL11.GL_SCISSOR_TEST);
166166

167167

@@ -229,7 +229,7 @@ public void render(int index, int x, int y, int rowWidth, int rowHeight, int mou
229229

230230
}
231231

232-
public void renderTooltips(int x, int y, int mouseX, int mouseY){
232+
public void renderTooltips(int mouseX, int mouseY){
233233

234234
}
235235

@@ -316,7 +316,7 @@ public void render(int index, int x, int y, int rowWidth, int rowHeight, int mou
316316

317317
}
318318

319-
public void renderTooltips(int x, int y, int mouseX, int mouseY){
319+
public void renderTooltips(int mouseX, int mouseY){
320320
if(AxolotlClient.CONFIG.showCategoryTooltips.get()) {
321321
if (super.left != null && super.left.isMouseOver(client, mouseX, mouseY)) {
322322
renderTooltip(left, mouseX, mouseY);
@@ -331,6 +331,7 @@ public void renderTooltips(int x, int y, int mouseX, int mouseY){
331331
public class OptionEntry extends Pair {
332332

333333
private final Option option;
334+
protected int renderX;
334335

335336
public OptionEntry(ButtonWidget left, Option option, int width) {
336337
super(left, null);
@@ -346,11 +347,12 @@ public void render(int index, int x, int y, int rowWidth, int rowHeight, int mou
346347
left.y = y;
347348
left.render(client, mouseX, mouseY);
348349

350+
renderX = x;
349351
}
350352

351-
public void renderTooltips(int x, int y, int mouseX, int mouseY){
353+
public void renderTooltips(int mouseX, int mouseY){
352354
if(AxolotlClient.CONFIG.showOptionTooltips.get() &&
353-
(mouseX>=x && mouseX<=left.x + left.getWidth() && mouseY>= y && mouseY<= y + 20)){
355+
(mouseX>=renderX && mouseX<=left.x + left.getWidth() && mouseY>= left.y && mouseY<= left.y + 20)){
354356
renderTooltip(option, mouseX, mouseY);
355357
}
356358
}

src/main/java/io/github/axolotlclient/config/screen/OptionsScreenBuilder.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import net.minecraft.client.MinecraftClient;
1414
import net.minecraft.client.gui.screen.Screen;
1515
import net.minecraft.client.gui.widget.ButtonWidget;
16-
import net.minecraft.client.render.DiffuseLighting;
1716
import net.minecraft.client.resource.language.I18n;
1817

1918
import java.util.Arrays;
@@ -59,28 +58,40 @@ public void render(int mouseX, int mouseY, float tickDelta) {
5958
GlStateManager.disableDepthTest();
6059
picker.render(MinecraftClient.getInstance(), mouseX, mouseY);
6160
GlStateManager.enableDepthTest();
61+
} else {
62+
list.renderTooltips(mouseX, mouseY);
6263
}
6364
}
6465

6566
public void openColorPicker(ColorOption option){
6667
picker = new ColorSelectionWidget(option);
6768
}
6869

69-
public void closeColorPicker(){
70+
public void closeColorPicker() {
71+
ConfigManager.save();
7072
picker=null;
7173
}
7274

7375
public boolean isPickerOpen(){
7476
return picker!=null;
7577
}
7678

79+
@Override
80+
protected void mouseDragged(int i, int j, int k, long l) {
81+
if(!isPickerOpen()) {
82+
super.mouseDragged(i, j, k, l);
83+
}
84+
}
85+
7786
@Override
7887
protected void mouseClicked(int mouseX, int mouseY, int button) {
79-
super.mouseClicked(mouseX, mouseY, button);
88+
if(!isPickerOpen()) {
89+
super.mouseClicked(mouseX, mouseY, button);
90+
}
8091

8192

8293

83-
if(picker!=null){
94+
if(isPickerOpen()){
8495
if(!picker.isMouseOver(MinecraftClient.getInstance(), mouseX, mouseY)) {
8596
closeColorPicker();
8697
this.list.mouseClicked(mouseX, mouseY, button);this.list.entries.forEach(pair -> {
@@ -118,6 +129,7 @@ protected void mouseClicked(int mouseX, int mouseY, int button) {
118129
protected void mouseReleased(int mouseX, int mouseY, int button) {
119130
super.mouseReleased(mouseX, mouseY, button);
120131
this.list.mouseReleased(mouseX, mouseY, button);
132+
if(isPickerOpen()) picker.mouseReleased(mouseX, mouseY);
121133
}
122134

123135
@Override
@@ -146,7 +158,9 @@ public void init() {
146158
@Override
147159
public void handleMouse() {
148160
super.handleMouse();
149-
this.list.handleMouse();
161+
if(!isPickerOpen()) {
162+
this.list.handleMouse();
163+
}
150164
}
151165

152166
@Override
@@ -160,6 +174,14 @@ public boolean shouldPauseGame() {
160174
return false;
161175
}
162176

177+
@Override
178+
public void resize(MinecraftClient client, int width, int height) {
179+
if(isPickerOpen()){
180+
picker.init();
181+
}
182+
super.resize(client, width, height);
183+
}
184+
163185
public void renderTooltip(Tooltippable tooltippable, int x, int y){
164186
String[] tooltip = Objects.requireNonNull(tooltippable.getTooltip()).split("<br>");
165187
this.renderTooltip(Arrays.asList(tooltip), x, y);

src/main/java/io/github/axolotlclient/config/screen/widgets/ColorSelectionWidget.java

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,54 @@
22

33
import com.mojang.blaze3d.platform.GlStateManager;
44
import io.github.axolotlclient.config.Color;
5+
import io.github.axolotlclient.config.ConfigManager;
56
import io.github.axolotlclient.config.options.ColorOption;
7+
import io.github.axolotlclient.config.options.IntegerOption;
68
import io.github.axolotlclient.modules.hud.util.DrawUtil;
79
import io.github.axolotlclient.modules.hud.util.Rectangle;
810
import net.minecraft.client.MinecraftClient;
911
import net.minecraft.client.gui.DrawableHelper;
1012
import net.minecraft.client.gui.widget.ButtonWidget;
13+
import net.minecraft.client.resource.language.I18n;
1114
import net.minecraft.client.util.Window;
1215
import net.minecraft.util.Identifier;
16+
import org.jetbrains.annotations.NotNull;
1317
import org.lwjgl.opengl.GL11;
1418

1519
import java.nio.ByteBuffer;
20+
import java.nio.ByteOrder;
1621

1722
public class ColorSelectionWidget extends ButtonWidget {
1823
private final ColorOption option;
1924

2025
protected Rectangle pickerImage;
21-
//private final Rectangle rect;
26+
protected Rectangle currentRect;
27+
28+
protected IntegerOption alpha = new IntegerOption("alpha", 0, 0, 255);
29+
protected OptionSliderWidget alphaSlider;
30+
2231

2332
public ColorSelectionWidget(ColorOption option) {
2433
super(0, 100, 50, "");
2534
this.option=option;
35+
init();
36+
}
37+
38+
public void init(){
2639
Window window= new Window(MinecraftClient.getInstance());
2740
width=window.getWidth()-200;
2841
height=window.getHeight()-100;
2942

3043
pickerImage = new Rectangle(120, 70, width/2, height/2);
31-
32-
//rect = new Rectangle(100, 50, width-200, height-100);
44+
currentRect = new Rectangle(pickerImage.x + pickerImage.width + 20, pickerImage.y + 10, 60, 20);
45+
46+
alpha.set(option.get().getAlpha());
47+
alphaSlider = new OptionSliderWidget(0, pickerImage.x, pickerImage.y + pickerImage.height + 20, pickerImage.width, 20, alpha){
48+
@Override
49+
protected @NotNull String getMessage() {
50+
return alpha.getTranslatedName()+": " + super.getMessage();
51+
}
52+
};
3353
}
3454

3555
@Override
@@ -38,29 +58,52 @@ public void render(MinecraftClient client, int mouseX, int mouseY) {
3858
DrawUtil.fillRect(new Rectangle(100, 50, width, height), Color.DARK_GRAY.withAlpha(127));
3959
DrawUtil.outlineRect(new Rectangle(100, 50, width, height), Color.BLACK);
4060

41-
DrawUtil.outlineRect(pickerImage, Color.DARK_GRAY.withAlpha(127));
61+
drawCenteredString(MinecraftClient.getInstance().textRenderer, I18n.translate("pickColor"), new Window(MinecraftClient.getInstance()).getWidth()/2, 54, -1);
62+
63+
DrawUtil.drawString(MinecraftClient.getInstance().textRenderer, I18n.translate("currentColor") + ":" ,currentRect.x, currentRect.y - 10, -1, true);
64+
65+
DrawUtil.fillRect(currentRect, option.get());
66+
DrawUtil.outlineRect(currentRect, Color.DARK_GRAY.withAlpha(127));
4267

4368
GlStateManager.color3f(1, 1, 1);
4469
MinecraftClient.getInstance().getTextureManager().bindTexture(new Identifier("axolotlclient", "textures/gui/colorwheel.png"));
4570
DrawableHelper.drawTexture(pickerImage.x, pickerImage.y, 0, 0, pickerImage.width, pickerImage.height, pickerImage.width, pickerImage.height);
71+
DrawUtil.outlineRect(pickerImage, Color.DARK_GRAY);
4672

47-
//super.render(client, mouseX, mouseY);
73+
alphaSlider.render(client, mouseX, mouseY);
74+
75+
option.set(new Color(option.get().getRed(), option.get().getGreen(), option.get().getBlue(), alpha.get()));
4876
}
4977

5078
public void onClick(int mouseX, int mouseY){
51-
if(pickerImage.isMouseOver(mouseX, mouseY)) {
52-
ByteBuffer pixels = ByteBuffer.allocateDirect(16);
53-
//IntBuffer pixels = IntBuffer.allocate(4);
54-
//IntBuffer color = buf.asIntBuffer();
5579

56-
MinecraftClient.getInstance().getFramebuffer().bind(true);
57-
GL11.glReadPixels(mouseX, mouseY, 1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixels);
80+
if(pickerImage.isMouseOver(mouseX, mouseY)){
81+
final ByteBuffer pixelBuffer = ByteBuffer.allocateDirect(4);
82+
pixelBuffer.order(ByteOrder.nativeOrder());
83+
84+
// Helped in the complete confusion:
85+
// https://github.com/MrCrayfish/MrCrayfishDeviceMod/blob/2a06b20ad8873855885285f3cee6a682e161e24c/src/main/java/com/mrcrayfish/device/util/GLHelper.java#L71
86+
87+
Window window = new Window(MinecraftClient.getInstance());
88+
int scale = window.getScaleFactor();
89+
GL11.glReadPixels(mouseX * scale,
90+
MinecraftClient.getInstance().height - mouseY * scale - scale,
91+
1, 1, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, pixelBuffer);
5892

59-
String color = (pixels.get(0) & 0xFF) +""+ (pixels.get(1) & 0xFF)+ (pixels.get(2) & 0xFF)+ (pixels.get(3) & 0xFF);
60-
System.out.println(color);
93+
final int r = pixelBuffer.get(0) & 0xff;
94+
final int g = pixelBuffer.get(1) & 0xff;
95+
final int b = pixelBuffer.get(2) & 0xff;
96+
final Color index = new Color(r, g, b, alpha.get());
6197

62-
option.set(new Color(pixels.get(0) & 0xFF, pixels.get(1) & 0xFF, pixels.get(2) & 0xFF, pixels.get(3) & 0xFF));
98+
option.set(index);
99+
} else if (alphaSlider.isMouseOver(MinecraftClient.getInstance(), mouseX, mouseY)) {
100+
option.set(new Color(option.get().getRed(), option.get().getGreen(), option.get().getBlue(), alpha.get()));
63101
}
102+
64103
}
65104

105+
@Override
106+
public void mouseReleased(int mouseX, int mouseY) {
107+
alphaSlider.mouseReleased(mouseX, mouseY);
108+
}
66109
}

src/main/java/io/github/axolotlclient/config/screen/widgets/OptionSliderWidget.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,23 @@ public OptionSliderWidget(int id, int x, int y, IntegerOption option) {
3939
this(id, x, y, option, option.getMin(), option.getMax());
4040
}
4141

42-
public OptionSliderWidget(int id, int x, int y, IntegerOption option, float min, float max) {
43-
super(id, x, y, 150, 20, "");
42+
public OptionSliderWidget(int id, int x, int y, int width, int height, IntegerOption option) {
43+
this(id, x, y, width, height, option, option.getMin(), option.getMax());
44+
}
45+
46+
public OptionSliderWidget(int id, int x, int y, int width, int height, IntegerOption option, float min, float max) {
47+
super(id, x, y, width, height, "");
4448
this.option = option;
4549
this.min = min;
4650
this.max = max;
4751
this.value = (option.get() - min) / (max - min);
4852
this.message = this.getMessage();
4953
}
5054

55+
public OptionSliderWidget(int id, int x, int y, IntegerOption option, float min, float max) {
56+
this(id, x, y, 150, 20, option, min, max);
57+
}
58+
5159
public OptionSliderWidget(int id, int x, int y, DoubleOption option) {
5260
this(id, x, y, option, option.getMin(), option.getMax());
5361
}
@@ -70,7 +78,7 @@ public int getSliderValueAsInt() {
7078
return Integer.parseInt(intformat.format(this.min + (this.max - this.min) * this.value));
7179
}
7280

73-
private @NotNull String getMessage() {
81+
protected @NotNull String getMessage() {
7482
return ""+ (option instanceof IntegerOption? getSliderValueAsInt(): this.getSliderValue());
7583
}
7684

src/main/resources/assets/axolotlclient/lang/en_US.lang

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,5 +185,9 @@ creditsBGM=BGM
185185
contributors=Contributors:
186186
other_people=Other People:
187187

188+
pickColor=Pick Color
189+
currentColor=Current
190+
alpha=Alpha
191+
188192
back=Back
189193
close=Close
-611 KB
Loading

0 commit comments

Comments
 (0)