|
@@ -3343,122 +3343,32 @@ int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollInd
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
-// Color Panel control
|
|
|
|
|
|
+// Color Panel control - Color (RGBA) variant.
|
|
int GuiColorPanel(Rectangle bounds, const char *text, Color *color)
|
|
int GuiColorPanel(Rectangle bounds, const char *text, Color *color)
|
|
{
|
|
{
|
|
int result = 0;
|
|
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 vcolor = { (float)color->r/255.0f, (float)color->g/255.0f, (float)color->b/255.0f };
|
|
Vector3 hsv = ConvertRGBtoHSV(vcolor);
|
|
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
|
|
|
|
-
|
|
|
|
- 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)
|
|
|
|
- {
|
|
|
|
- Vector2 mousePoint = GetMousePosition();
|
|
|
|
-
|
|
|
|
- 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);
|
|
|
|
|
|
+ GuiColorPanelHSV(bounds, text, &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;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- //--------------------------------------------------------------------
|
|
|
|
-
|
|
|
|
- // Draw control
|
|
|
|
- //--------------------------------------------------------------------
|
|
|
|
- if (state != STATE_DISABLED)
|
|
|
|
|
|
+ // 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)
|
|
{
|
|
{
|
|
- 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));
|
|
|
|
|
|
+ Vector3 rgb = ConvertHSVtoRGB(hsv);
|
|
|
|
|
|
- // 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));
|
|
|
|
|
|
+ // 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 };
|
|
}
|
|
}
|
|
-
|
|
|
|
- GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK);
|
|
|
|
- //--------------------------------------------------------------------
|
|
|
|
-
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3697,8 +3607,7 @@ int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
|
return result;
|
|
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 GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
|
{
|
|
{
|
|
int result = 0;
|
|
int result = 0;
|
|
@@ -3719,15 +3628,47 @@ int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
|
|
|
|
|
// Update control
|
|
// Update control
|
|
//--------------------------------------------------------------------
|
|
//--------------------------------------------------------------------
|
|
- if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
|
+ if ((state != STATE_DISABLED) && !guiLocked)
|
|
{
|
|
{
|
|
Vector2 mousePoint = GetMousePosition();
|
|
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))
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
{
|
|
{
|
|
state = STATE_PRESSED;
|
|
state = STATE_PRESSED;
|
|
|
|
+ guiSliderDragging = true;
|
|
|
|
+ guiSliderActive = bounds;
|
|
pickerSelector = mousePoint;
|
|
pickerSelector = mousePoint;
|
|
|
|
|
|
// Calculate color from picker
|
|
// Calculate color from picker
|
|
@@ -3766,6 +3707,7 @@ int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv)
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
// Message Box control
|
|
// Message Box control
|
|
int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons)
|
|
int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons)
|
|
{
|
|
{
|