SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/gui/components/window/color/ColorPickerWindowComponent....

154 lines
6.6 KiB
Java

package speiger.src.coreengine.rendering.gui.components.window.color;
import java.awt.Color;
import java.util.function.IntConsumer;
import speiger.src.coreengine.math.MathUtils;
import speiger.src.coreengine.math.misc.ColorUtils;
import speiger.src.coreengine.math.misc.Facing;
import speiger.src.coreengine.math.vector.floats.Vec2f;
import speiger.src.coreengine.rendering.gui.UITextures;
import speiger.src.coreengine.rendering.gui.components.ButtonComponent;
import speiger.src.coreengine.rendering.gui.components.GradientSliderComponent;
import speiger.src.coreengine.rendering.gui.components.SliderComponent;
import speiger.src.coreengine.rendering.gui.components.TextFieldComponent;
import speiger.src.coreengine.rendering.gui.components.WindowComponent;
import speiger.src.coreengine.rendering.gui.components.icon.IIcon;
import speiger.src.coreengine.rendering.gui.components.icon.TexturedIcon;
import speiger.src.coreengine.rendering.gui.helper.box.GuiBox;
import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox;
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrains;
import speiger.src.coreengine.rendering.gui.helper.constrains.ParentConstrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.RelativeConstrain;
import speiger.src.coreengine.utils.functions.Functions;
import speiger.src.coreengine.utils.helpers.InternalThreadPools;
public class ColorPickerWindowComponent extends WindowComponent
{
IntConsumer listener;
IIcon wheelIcon = new TexturedIcon(UITextures.COLOR_WHEEL);
IGuiBox wheelBox = new GuiBox(15, 10, 70, 70);
IGuiBox selectedBox = new GuiBox(5F, 94F, 50F, 10F);
int[] colors = new int[]{ColorUtils.rgb(0), ColorUtils.rgb(0), ColorUtils.rgb(0), ColorUtils.rgb(0), ColorUtils.rgb(0)};
SliderComponent brightness = new GradientSliderComponent(95, 13, 17, 76, 0, 100, 0, ColorUtils.GRAY, colors[2], colors[3], Facing.NORTH, null).setScrollEffect(-1).setVertical(true);
SliderComponent saturation = new GradientSliderComponent(110, 13, 17, 76, 0, 100, 0, ColorUtils.GRAY, colors[0], colors[1], Facing.NORTH, null).setScrollEffect(-1).setVertical(true);
TextFieldComponent code = new TextFieldComponent(60, 94, 104, 20, ColorUtils.DARK_GRAY).setValidator(Functions.NUMBERS_ONLY).setMaxTextLength(8);
float[] hsv = new float[3];
IGuiBox[] colorBoxes;
ColorPool pool;
public ColorPickerWindowComponent(float x, float y, ColorPool pool, int defaultColor, IntConsumer listener, String name)
{
super(x, y, 125, 140, FIXED_SIZE_POPUP, name);
this.pool = pool;
this.listener = listener;
hsv = ColorUtils.toHue(defaultColor);
colorBoxes = new IGuiBox[Math.min(18, pool.size())];
for(int i = 0,m=colorBoxes.length;i<m;i++)
{
addBox(colorBoxes[i] = new GuiBox(5 + ((i % 9) * 12), 108 + (i >= 9 ? 12 : 0), 10, 10));
}
}
@Override
public void init()
{
super.init();
addBox(wheelBox);
addBox(selectedBox);
addChild(brightness.addChangeListener(minimizedListener).addUserActionListener(T -> setColor(hsv[0], hsv[1], T.cast(SliderComponent.class).getValue() * 0.01F)));
addChild(saturation.addChangeListener(minimizedListener).addUserActionListener(T -> setColor(hsv[0], T.cast(SliderComponent.class).getValue() * 0.01F, hsv[2])));
addChild(code.setScale(0.5F).addChangeListener(minimizedListener).addUserActionListener(T -> onTyped()));
addChild(new ButtonComponent(0F, 0F, 0F, 20F, "Select", ColorUtils.GREEN).setScale(0.4F).addUserActionListener(T -> apply()), new Constrains(null, new ParentConstrain(8F).invert(), new RelativeConstrain(0.5F / 0.4F), null));
addChild(new ButtonComponent(0F, 0F, 0F, 20F, "Cancel", ColorUtils.RED).setScale(0.4F).addUserActionListener(T -> T.getGui().removeComponent(this)), new Constrains(new RelativeConstrain(0.5F), new ParentConstrain(8F).invert(), new RelativeConstrain(0.5F / 0.4F), null));
setColor(hsv[0], hsv[1], hsv[2]);
}
@Override
public boolean isPopup()
{
return true;
}
@Override
protected boolean renderSelf(int mouseX, int mouseY, float particalTicks)
{
super.renderSelf(mouseX, mouseY, particalTicks);
wheelIcon.render(getRenderer().translate(0F, 0F, 0.01F).setBrightness(hsv[1]), wheelBox);
getRenderer().setBrightness(1F);
for(int i = 0,m=colorBoxes.length;i<m;i++)
{
IGuiBox box = colorBoxes[i];
getRenderer().drawQuad(box, pool.getColor(i)).drawFrame(box, ColorUtils.DARK_GRAY);
}
getRenderer().drawQuad(selectedBox, colors[4]).drawFrame(selectedBox, ColorUtils.DARK_GRAY);
float centerX = wheelBox.getCenterX();
float centerY = wheelBox.getCenterY();
Vec2f pos = InternalThreadPools.VEC2F.get().set(centerX, centerY).add(0F, -(hsv[2] * 33F)).rotate((float)Math.toRadians(-hsv[0] * 360F), centerX, centerY);
getRenderer().drawQuad(pos.getX() - 1F, pos.getY() - 1F, pos.getX() + 1F, pos.getY() + 1, 0.1F, ColorUtils.BLACK);
InternalThreadPools.VEC2F.accept(pos);
getRenderer().translate(0F, 0F, -0.01F);
return true;
}
private void onTyped()
{
try
{
int color = Integer.decode(code.getText());
float[] hsv = Color.RGBtoHSB((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, new float[3]);
setColor(hsv[0], hsv[1], hsv[2]);
}
catch(Exception e){}
}
public void apply()
{
pool.addColor(colors[4]);
listener.accept(colors[4]);
getGui().removeComponent(this);
}
@Override
public boolean onClick(int button, int mouseX, int mouseY)
{
return wheelBox.isColiding(mouseX, mouseY) ? onChanged(mouseX, mouseY) : super.onClick(button, mouseX, mouseY);
}
@Override
public boolean onDrag(int mouseX, int mouseY)
{
return super.onDrag(mouseX, mouseY) || (wheelBox.isColiding(mouseX, mouseY) ? onChanged(mouseX, mouseY) : false);
}
private boolean onChanged(int mouseX, int mouseY)
{
Vec2f pos = InternalThreadPools.VEC2F.get().set(mouseX, mouseY);
float radius = (float)pos.distanceTo(wheelBox.getCenterX(), wheelBox.getCenterY());
if(radius > 38)
{
InternalThreadPools.VEC2F.accept(pos);
return false;
}
float hue = (pos.directionAngle(wheelBox.getCenterX(), wheelBox.getCenterY()) + 180F) % 360F;
setColor(hue / 360F, hsv[1], radius / 33F);
InternalThreadPools.VEC2F.accept(pos);
return true;
}
protected void setColor(float hue, float saturation, float brightness)
{
hsv[0] = MathUtils.clamp(0F, 1F, hue);
hsv[1] = MathUtils.clamp(0F, 1F, saturation);
hsv[2] = MathUtils.clamp(0F, 1F, brightness);
colors[0] = ColorUtils.toRGB(hsv[0], 0F, 1F);
colors[1] = ColorUtils.toRGB(hsv[0], 1F, 1F);
colors[2] = ColorUtils.toRGB(hsv[0], 1F, 0F);
colors[3] = ColorUtils.toRGB(hsv[0], 1F, 1F);
colors[4] = ColorUtils.toRGB(hsv[0], hsv[1], hsv[2]);
code.setText(ColorUtils.getHTMLCode(colors[4], false));
this.brightness.setValue((int)(hsv[2] * 100F));
this.saturation.setValue((int)(hsv[1] * 100F));
}
}