瀏覽代碼

Merge pull request #25 from Demizdor/adding_scrollbar

Added GuiScrollBar()
Ray 6 年之前
父節點
當前提交
4f9a660c33
共有 1 個文件被更改,包括 190 次插入2 次删除
  1. 190 2
      src/raygui.h

+ 190 - 2
src/raygui.h

@@ -36,6 +36,7 @@
 *       - ColorPicker   --> ColorPanel, ColorBarHue
 *       - ColorPicker   --> ColorPanel, ColorBarHue
 *       - MessageBox
 *       - MessageBox
 *       - DummyRec
 *       - DummyRec
+*       - ScrollBar
 *       - Grid
 *       - Grid
 *
 *
 *   It also provides a set of functions for styling the controls based on its properties (size, color).
 *   It also provides a set of functions for styling the controls based on its properties (size, color).
@@ -133,7 +134,7 @@
 
 
 #define TEXTEDIT_CURSOR_BLINK_FRAMES    20      // Text edit controls cursor blink timming
 #define TEXTEDIT_CURSOR_BLINK_FRAMES    20      // Text edit controls cursor blink timming
 
 
-#define NUM_CONTROLS                    12      // Number of standard controls
+#define NUM_CONTROLS                    13      // Number of standard controls
 #define NUM_PROPS_DEFAULT               16      // Number of standard properties
 #define NUM_PROPS_DEFAULT               16      // Number of standard properties
 #define NUM_PROPS_EXTENDED               8      // Number of extended properties
 #define NUM_PROPS_EXTENDED               8      // Number of extended properties
 
 
@@ -200,7 +201,8 @@ typedef enum {
     DROPDOWNBOX,
     DROPDOWNBOX,
     TEXTBOX,        // VALUEBOX, SPINNER
     TEXTBOX,        // VALUEBOX, SPINNER
     LISTVIEW,
     LISTVIEW,
-    COLORPICKER
+    COLORPICKER,
+    SCROLLBAR
 } GuiControlStandard;
 } GuiControlStandard;
 
 
 // Gui default properties for every control
 // Gui default properties for every control
@@ -294,6 +296,17 @@ typedef enum {
     SCROLLBAR_WIDTH,
     SCROLLBAR_WIDTH,
 } GuiListViewProperty;
 } GuiListViewProperty;
 
 
+// Scrollbar
+typedef enum {
+    SCROLLBAR_BORDER = 16,
+    SCROLLBAR_SHOW_SPINNER_BUTTONS,
+    SCROLLBAR_ARROWS_SIZE,
+    SCROLLBAR_PADDING,
+    SCROLLBAR_SLIDER_PADDING,
+    SCROLLBAR_SLIDER_SIZE,
+    SCROLLBAR_SCROLL_SPEED,
+} GuiScrollBarProperty;
+
 //----------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------
 // Global Variables Definition
 // Global Variables Definition
 //----------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------
@@ -345,6 +358,7 @@ RAYGUIDEF float GuiSliderBar(Rectangle bounds, const char *text, float value, fl
 RAYGUIDEF float GuiProgressBar(Rectangle bounds, const char *text, float value, float minValue, float maxValue, bool showValue);  // Progress Bar control, shows current progress value
 RAYGUIDEF float GuiProgressBar(Rectangle bounds, const char *text, float value, float minValue, float maxValue, bool showValue);  // Progress Bar control, shows current progress value
 RAYGUIDEF void GuiStatusBar(Rectangle bounds, const char *text, int offsetX);                           // Status Bar control, shows info text
 RAYGUIDEF void GuiStatusBar(Rectangle bounds, const char *text, int offsetX);                           // Status Bar control, shows info text
 RAYGUIDEF void GuiDummyRec(Rectangle bounds, const char *text);                                         // Dummy control for placeholders
 RAYGUIDEF void GuiDummyRec(Rectangle bounds, const char *text);                                         // Dummy control for placeholders
+RAYGUIDEF int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue);
 
 
 // Advance controls set
 // Advance controls set
 RAYGUIDEF bool GuiListView(Rectangle bounds, const char *text, int *active, int *scrollIndex, bool editMode);   // List View control, returns selected list element index
 RAYGUIDEF bool GuiListView(Rectangle bounds, const char *text, int *active, int *scrollIndex, bool editMode);   // List View control, returns selected list element index
@@ -2181,6 +2195,173 @@ RAYGUIDEF void GuiDummyRec(Rectangle bounds, const char *text)
     //------------------------------------------------------------------
     //------------------------------------------------------------------
 }
 }
 
 
+RAYGUIDEF int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue) 
+{
+    GuiControlState state = guiState;
+    
+    // Is the scrollbar horizontal or vertical?
+    bool isVertical = (bounds.width > bounds.height) ? false : true;
+    // The size (width or height depending on scrollbar type) of the spinner buttons
+    const int spinnerSize = GuiGetStyle(SCROLLBAR, SCROLLBAR_SHOW_SPINNER_BUTTONS) ? (isVertical ? bounds.width - 2 * GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) : bounds.height - 2 * GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER)) : 0;
+    
+    //the spinner buttons [<] [>] [∧] [∨]
+    Rectangle spinnerUpLeft, spinnerDownRight;
+    //actual area of the scrollbar excluding the spinner buttons
+    Rectangle scrollbar;        //  ------------
+    //the slider bar that moves     --[///]-----
+    Rectangle slider;
+    
+    //normalize value
+    if (value > maxValue) value = maxValue;
+    if (value < minValue) value = minValue;
+    
+    const int range = maxValue - minValue;
+    //calculate rectangles for all of the components
+    spinnerUpLeft = (Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), bounds.y + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), spinnerSize, spinnerSize };
+    if(isVertical) 
+    {
+        spinnerDownRight = (Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), bounds.y + bounds.height - spinnerSize - GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), spinnerSize, spinnerSize};
+        scrollbar = (Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_PADDING), spinnerUpLeft.y + spinnerUpLeft.height, bounds.width - 2 * (GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_PADDING)), bounds.height - spinnerUpLeft.height - spinnerDownRight.height - 2*GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER)};
+        slider = (Rectangle){bounds.x + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_PADDING),scrollbar.y + (int)(((float)(value - minValue) / range) * (scrollbar.height - GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_SIZE))),bounds.width - 2 * (GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_PADDING)),GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_SIZE)};
+    } 
+    else 
+    {
+        spinnerDownRight = (Rectangle){ bounds.x + bounds.width - spinnerSize - GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), bounds.y + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), spinnerSize, spinnerSize};
+        scrollbar = (Rectangle){ spinnerUpLeft.x + spinnerUpLeft.width, bounds.y + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_PADDING), bounds.width - spinnerUpLeft.width - spinnerDownRight.width - 2*GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), bounds.height - 2 * (GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_PADDING))};
+        slider = (Rectangle){ scrollbar.x + (int)(((float)(value - minValue) / range) * (scrollbar.width - GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_SIZE))), bounds.y + GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_PADDING), GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_SIZE), bounds.height - 2 * (GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER) + GuiGetStyle(SCROLLBAR, SCROLLBAR_SLIDER_PADDING)) };
+    }
+    
+    // Update control
+    //--------------------------------------------------------------------
+    if ((state != GUI_STATE_DISABLED) && !guiLocked)
+    {
+        Vector2 mousePoint = GetMousePosition();
+        if (CheckCollisionPointRec(mousePoint, bounds))
+        {
+            state = GUI_STATE_FOCUSED;
+            
+            //handle mouse wheel
+            int wheel = GetMouseWheelMove();
+            if(wheel != 0) value += wheel;
+            
+            if(IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) 
+            {
+                if(CheckCollisionPointRec(mousePoint, spinnerUpLeft))
+                    value -= range/GuiGetStyle(SCROLLBAR, SCROLLBAR_SCROLL_SPEED);
+                else if(CheckCollisionPointRec(mousePoint, spinnerDownRight))
+                    value += range/GuiGetStyle(SCROLLBAR, SCROLLBAR_SCROLL_SPEED);
+                state = GUI_STATE_PRESSED;
+            }
+            else if(IsMouseButtonDown(MOUSE_LEFT_BUTTON)) 
+            {
+                if(!isVertical)
+                {
+                    Rectangle scrollArea = { spinnerUpLeft.x + spinnerUpLeft.width, spinnerUpLeft.y, scrollbar.width, bounds.height - 2 * GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER)};
+                    if(CheckCollisionPointRec(mousePoint, scrollArea))
+                        value = ((float)(mousePoint.x - scrollArea.x - slider.width/2) * range) / (scrollArea.width - slider.width) + minValue;
+                } 
+                else 
+                {
+                    Rectangle scrollArea = { spinnerUpLeft.x, spinnerUpLeft.y+spinnerUpLeft.height, bounds.width - 2 * GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER),  scrollbar.height};
+                    if(CheckCollisionPointRec(mousePoint, scrollArea))
+                        value = ((float)(mousePoint.y - scrollArea.y - slider.height/2) * range) / (scrollArea.height - slider.height) + minValue;
+                }
+            }
+        }
+        
+        //normalize value
+        if (value > maxValue) value = maxValue;
+        if (value < minValue) value = minValue;
+    }
+    //--------------------------------------------------------------------
+    
+    
+    // Draw control
+    //--------------------------------------------------------------------
+    DrawRectangleRec(bounds,  Fade(GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED)), guiAlpha));   //Draw the background
+    DrawRectangleRec(scrollbar, Fade(GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL)), guiAlpha));      //Draw the scrollbar active area background
+    
+    Color lineColor, sliderbarColor;
+    switch(state) // Draw border for all states
+    {
+        case GUI_STATE_NORMAL:
+        DrawRectangleLinesEx(bounds, GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_NORMAL)), guiAlpha));
+        lineColor = Fade(GetColor(GuiGetStyle(BUTTON, TEXT_COLOR_NORMAL)), guiAlpha);
+        sliderbarColor = Fade(GetColor(GuiGetStyle(SLIDER, BORDER_COLOR_NORMAL)), guiAlpha);
+        break;
+        
+        case GUI_STATE_FOCUSED:
+        DrawRectangleLinesEx(bounds, GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), guiAlpha));
+        lineColor = Fade(GetColor(GuiGetStyle(BUTTON, TEXT_COLOR_FOCUSED)), guiAlpha);
+        sliderbarColor = Fade(GetColor(GuiGetStyle(SLIDER, BORDER_COLOR_FOCUSED)), guiAlpha);
+        break;
+        
+        case GUI_STATE_PRESSED:
+        DrawRectangleLinesEx(bounds, GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), guiAlpha));
+        lineColor = Fade(GetColor(GuiGetStyle(BUTTON, TEXT_COLOR_PRESSED)), guiAlpha);
+        sliderbarColor = Fade(GetColor(GuiGetStyle(SLIDER, BORDER_COLOR_PRESSED)), guiAlpha);
+        break;
+        
+        case GUI_STATE_DISABLED:
+        DrawRectangleLinesEx(bounds, GuiGetStyle(SCROLLBAR, SCROLLBAR_BORDER), Fade(GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), guiAlpha));
+        lineColor = Fade(GetColor(GuiGetStyle(BUTTON, TEXT_COLOR_DISABLED)), guiAlpha);
+        sliderbarColor = Fade(GetColor(GuiGetStyle(SLIDER, BORDER_COLOR_DISABLED)), guiAlpha);
+        break;
+    }
+    
+    DrawRectangleRec(slider, sliderbarColor); //draw the slider bar
+    
+    const int padding = (spinnerSize - GuiGetStyle(SCROLLBAR, SCROLLBAR_ARROWS_SIZE))/2;
+    const Vector2 lineCoords[] = 
+    {
+        //coordinates for <     0,1,2
+        {spinnerUpLeft.x + padding, spinnerUpLeft.y + spinnerSize / 2}, 
+        {spinnerUpLeft.x + spinnerSize - padding, spinnerUpLeft.y + padding },
+        {spinnerUpLeft.x + spinnerSize - padding, spinnerUpLeft.y + spinnerSize - padding},
+        
+        //coordinates for >     3,4,5
+        {spinnerDownRight.x + padding, spinnerDownRight.y + padding}, 
+        {spinnerDownRight.x + spinnerSize - padding, spinnerDownRight.y + spinnerSize / 2 },
+        {spinnerDownRight.x + padding, spinnerDownRight.y + spinnerSize - padding},
+        
+        //coordinates for ∧     6,7,8
+        {spinnerUpLeft.x + spinnerSize / 2, spinnerUpLeft.y + padding},
+        {spinnerUpLeft.x + padding, spinnerUpLeft.y + spinnerSize - padding},
+        {spinnerUpLeft.x + spinnerSize - padding, spinnerUpLeft.y + spinnerSize - padding},
+        
+        //coordinates for ∨     9,10,11
+        {spinnerDownRight.x + padding, spinnerDownRight.y + padding}, 
+        {spinnerDownRight.x + spinnerSize / 2, spinnerDownRight.y + spinnerSize - padding },
+        {spinnerDownRight.x + spinnerSize - padding, spinnerDownRight.y + padding}
+    };
+    
+    if(GuiGetStyle(SCROLLBAR, SCROLLBAR_SHOW_SPINNER_BUTTONS)) 
+    {
+        if(isVertical)
+        {
+            //draw ∧
+            DrawLineEx(lineCoords[6], lineCoords[7], 3.0f, lineColor); 
+            DrawLineEx(lineCoords[6], lineCoords[8], 3.0f, lineColor);
+            
+            //draw ∨
+            DrawLineEx(lineCoords[9], lineCoords[10], 3.0f, lineColor); 
+            DrawLineEx(lineCoords[11], lineCoords[10], 3.0f, lineColor);
+        } 
+        else 
+        {
+            //draw <
+            DrawLineEx(lineCoords[0], lineCoords[1], 3.0f, lineColor); 
+            DrawLineEx(lineCoords[0], lineCoords[2], 3.0f, lineColor);
+            //draw >
+            DrawLineEx(lineCoords[3], lineCoords[4], 3.0f, lineColor); 
+            DrawLineEx(lineCoords[5], lineCoords[4], 3.0f, lineColor);
+        }
+    }
+    
+    //--------------------------------------------------------------------
+    return value;
+}
+
 // List Element control, returns element state
 // List Element control, returns element state
 static bool GuiListElement(Rectangle bounds, const char *text, bool active, bool editMode)
 static bool GuiListElement(Rectangle bounds, const char *text, bool active, bool editMode)
 {
 {
@@ -3043,6 +3224,13 @@ RAYGUIDEF void GuiLoadStyleDefault(void)
     GuiSetStyle(LISTVIEW, ELEMENTS_HEIGHT, 0x1e);
     GuiSetStyle(LISTVIEW, ELEMENTS_HEIGHT, 0x1e);
     GuiSetStyle(LISTVIEW, ELEMENTS_PADDING, 2);
     GuiSetStyle(LISTVIEW, ELEMENTS_PADDING, 2);
     GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 10);
     GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 10);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_BORDER, 0);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_SHOW_SPINNER_BUTTONS, 0);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_ARROWS_SIZE, 6);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_PADDING, 0);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_SLIDER_PADDING, 0);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_SLIDER_SIZE, 16);
+    GuiSetStyle(SCROLLBAR, SCROLLBAR_SCROLL_SPEED, 10);
 }
 }
 
 
 // Updates controls style with default values
 // Updates controls style with default values