Browse Source

fixed dragging GuiColorPanel outside of bounds (#366)

kolunmi 1 năm trước cách đây
mục cha
commit
45e7f967e6
1 tập tin đã thay đổi với 41 bổ sung2 xóa
  1. 41 2
      src/raygui.h

+ 41 - 2
src/raygui.h

@@ -3379,15 +3379,54 @@ int GuiColorPanel(Rectangle bounds, const char *text, Color *color)
 
     // 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
+
+                    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