Commonise GuiColorPanelHSV and GuiColorPanel logic and behavior (#370)
* transferred dragging GuiColorPanel outside bounds (#366) to GuiColorPanelHSV * call GuiColorPanelHSV from inside GuiColorPanel, to eliminate code duplication * comply with naming convention inside GuiColorPanel
This commit is contained in:
parent
db90a39ecf
commit
58411f4cce
160
src/raygui.h
160
src/raygui.h
@ -3343,122 +3343,32 @@ int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollInd
|
||||
return result;
|
||||
}
|
||||
|
||||
// Color Panel control
|
||||
// Color Panel control - Color (RGBA) variant.
|
||||
int GuiColorPanel(Rectangle bounds, const char *text, Color *color)
|
||||
{
|
||||
int result = 0;
|
||||
GuiState state = guiState;
|
||||
Vector2 pickerSelector = { 0 };
|
||||
|
||||
const Color colWhite = { 255, 255, 255, 255 };
|
||||
const Color colBlack = { 0, 0, 0, 255 };
|
||||
|
||||
Vector3 vcolor = { (float)color->r/255.0f, (float)color->g/255.0f, (float)color->b/255.0f };
|
||||
Vector3 hsv = ConvertRGBtoHSV(vcolor);
|
||||
Vector3 prevHsv = hsv; // workaround to see if GuiColorPanelHSV modifies the hsv.
|
||||
|
||||
pickerSelector.x = bounds.x + (float)hsv.y*bounds.width; // HSV: Saturation
|
||||
pickerSelector.y = bounds.y + (1.0f - (float)hsv.z)*bounds.height; // HSV: Value
|
||||
GuiColorPanelHSV(bounds, text, &hsv);
|
||||
|
||||
Vector3 maxHue = { hsv.x, 1.0f, 1.0f };
|
||||
Vector3 rgbHue = ConvertHSVtoRGB(maxHue);
|
||||
Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x),
|
||||
(unsigned char)(255.0f*rgbHue.y),
|
||||
(unsigned char)(255.0f*rgbHue.z), 255 };
|
||||
|
||||
// Update control
|
||||
//--------------------------------------------------------------------
|
||||
if ((state != STATE_DISABLED) && !guiLocked)
|
||||
// Check if the hsv was changed, only then change the color.
|
||||
// This is necessary, because the Color->HSV->Color conversion has precision errors.
|
||||
// Thus the assignment from HSV to Color should only be made, if the HSV has a new user-entered value.
|
||||
// Otherwise GuiColorPanel would often modify it's color without user input.
|
||||
// TODO: GuiColorPanelHSV could return 1 if the slider was dragged, to simplify this check.
|
||||
if (hsv.x != prevHsv.x || hsv.y != prevHsv.y || hsv.z != prevHsv.z)
|
||||
{
|
||||
Vector2 mousePoint = GetMousePosition();
|
||||
Vector3 rgb = ConvertHSVtoRGB(hsv);
|
||||
|
||||
if (guiSliderDragging)
|
||||
{
|
||||
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
||||
{
|
||||
if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
|
||||
{
|
||||
pickerSelector = mousePoint;
|
||||
|
||||
if (pickerSelector.x < bounds.x) pickerSelector.x = bounds.x;
|
||||
if (pickerSelector.x > bounds.x + bounds.width) pickerSelector.x = bounds.x + bounds.width;
|
||||
if (pickerSelector.y < bounds.y) pickerSelector.y = bounds.y;
|
||||
if (pickerSelector.y > bounds.y + bounds.height) pickerSelector.y = bounds.y + bounds.height;
|
||||
|
||||
// Calculate color from picker
|
||||
Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y };
|
||||
|
||||
colorPick.x /= (float)bounds.width; // Get normalized value on x
|
||||
colorPick.y /= (float)bounds.height; // Get normalized value on y
|
||||
|
||||
hsv.y = colorPick.x;
|
||||
hsv.z = 1.0f - colorPick.y;
|
||||
|
||||
Vector3 rgb = ConvertHSVtoRGB(hsv);
|
||||
|
||||
// NOTE: Vector3ToColor() only available on raylib 1.8.1
|
||||
*color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x),
|
||||
(unsigned char)(255.0f*rgb.y),
|
||||
(unsigned char)(255.0f*rgb.z),
|
||||
(unsigned char)(255.0f*(float)color->a/255.0f) };
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
guiSliderDragging = false;
|
||||
guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
||||
}
|
||||
}
|
||||
else if (CheckCollisionPointRec(mousePoint, bounds))
|
||||
{
|
||||
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
||||
{
|
||||
state = STATE_PRESSED;
|
||||
guiSliderDragging = true;
|
||||
guiSliderActive = bounds;
|
||||
pickerSelector = mousePoint;
|
||||
|
||||
// Calculate color from picker
|
||||
Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y };
|
||||
|
||||
colorPick.x /= (float)bounds.width; // Get normalized value on x
|
||||
colorPick.y /= (float)bounds.height; // Get normalized value on y
|
||||
|
||||
hsv.y = colorPick.x;
|
||||
hsv.z = 1.0f - colorPick.y;
|
||||
|
||||
Vector3 rgb = ConvertHSVtoRGB(hsv);
|
||||
|
||||
// NOTE: Vector3ToColor() only available on raylib 1.8.1
|
||||
*color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x),
|
||||
(unsigned char)(255.0f*rgb.y),
|
||||
(unsigned char)(255.0f*rgb.z),
|
||||
(unsigned char)(255.0f*(float)color->a/255.0f) };
|
||||
|
||||
}
|
||||
else state = STATE_FOCUSED;
|
||||
}
|
||||
// NOTE: Vector3ToColor() only available on raylib 1.8.1
|
||||
*color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x),
|
||||
(unsigned char)(255.0f*rgb.y),
|
||||
(unsigned char)(255.0f*rgb.z),
|
||||
color->a };
|
||||
}
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
// Draw control
|
||||
//--------------------------------------------------------------------
|
||||
if (state != STATE_DISABLED)
|
||||
{
|
||||
DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha));
|
||||
DrawRectangleGradientEx(bounds, Fade(colBlack, 0), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, 0));
|
||||
|
||||
// Draw color picker: selector
|
||||
Rectangle selector = { pickerSelector.x - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, pickerSelector.y - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE) };
|
||||
GuiDrawRectangle(selector, 0, BLANK, colWhite);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.6f), guiAlpha));
|
||||
}
|
||||
|
||||
GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK);
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -3697,8 +3607,7 @@ int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
||||
return result;
|
||||
}
|
||||
|
||||
// Color Panel control, returns HSV color value in *colorHsv.
|
||||
// Used by GuiColorPickerHSV()
|
||||
// Color Panel control - HSV variant.
|
||||
int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
||||
{
|
||||
int result = 0;
|
||||
@ -3719,15 +3628,47 @@ int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
||||
|
||||
// Update control
|
||||
//--------------------------------------------------------------------
|
||||
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
||||
if ((state != STATE_DISABLED) && !guiLocked)
|
||||
{
|
||||
Vector2 mousePoint = GetMousePosition();
|
||||
|
||||
if (CheckCollisionPointRec(mousePoint, bounds))
|
||||
if (guiSliderDragging)
|
||||
{
|
||||
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
||||
{
|
||||
if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
|
||||
{
|
||||
pickerSelector = mousePoint;
|
||||
|
||||
if (pickerSelector.x < bounds.x) pickerSelector.x = bounds.x;
|
||||
if (pickerSelector.x > bounds.x + bounds.width) pickerSelector.x = bounds.x + bounds.width;
|
||||
if (pickerSelector.y < bounds.y) pickerSelector.y = bounds.y;
|
||||
if (pickerSelector.y > bounds.y + bounds.height) pickerSelector.y = bounds.y + bounds.height;
|
||||
|
||||
// Calculate color from picker
|
||||
Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y };
|
||||
|
||||
colorPick.x /= (float)bounds.width; // Get normalized value on x
|
||||
colorPick.y /= (float)bounds.height; // Get normalized value on y
|
||||
|
||||
colorHsv->y = colorPick.x;
|
||||
colorHsv->z = 1.0f - colorPick.y;
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
guiSliderDragging = false;
|
||||
guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
||||
}
|
||||
}
|
||||
else if (CheckCollisionPointRec(mousePoint, bounds))
|
||||
{
|
||||
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
||||
{
|
||||
state = STATE_PRESSED;
|
||||
guiSliderDragging = true;
|
||||
guiSliderActive = bounds;
|
||||
pickerSelector = mousePoint;
|
||||
|
||||
// Calculate color from picker
|
||||
@ -3766,6 +3707,7 @@ int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
// Message Box control
|
||||
int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user