|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
/*******************************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* raygui v4.0 - A simple and easy-to-use immediate-mode gui library
|
|
|
|
|
* raygui v4.1-dev - A simple and easy-to-use immediate-mode gui library
|
|
|
|
|
*
|
|
|
|
|
* DESCRIPTION:
|
|
|
|
|
* raygui is a tools-dev-focused immediate-mode-gui library based on raylib but also
|
|
|
|
@ -26,7 +26,7 @@
|
|
|
|
|
* NOTES:
|
|
|
|
|
* - WARNING: GuiLoadStyle() and GuiLoadStyle{Custom}() functions, allocate memory for
|
|
|
|
|
* font atlas recs and glyphs, freeing that memory is (usually) up to the user,
|
|
|
|
|
* no unload function is explicitly provided... but note that GuiLoadStyleDefaulf() unloads
|
|
|
|
|
* no unload function is explicitly provided... but note that GuiLoadStyleDefault() unloads
|
|
|
|
|
* by default any previously loaded font (texture, recs, glyphs).
|
|
|
|
|
* - Global UI alpha (guiAlpha) is applied inside GuiDrawRectangle() and GuiDrawText() functions
|
|
|
|
|
*
|
|
|
|
@ -141,6 +141,9 @@
|
|
|
|
|
* Draw text bounds rectangles for debug
|
|
|
|
|
*
|
|
|
|
|
* VERSIONS HISTORY:
|
|
|
|
|
* 4.1-dev (2024) Current dev version...
|
|
|
|
|
* ADDED: guiControlExclusiveMode and guiControlExclusiveRec for exclusive modes
|
|
|
|
|
*
|
|
|
|
|
* 4.0 (12-Sep-2023) ADDED: GuiToggleSlider()
|
|
|
|
|
* ADDED: GuiColorPickerHSV() and GuiColorPanelHSV()
|
|
|
|
|
* ADDED: Multiple new icons, mostly compiler related
|
|
|
|
@ -314,9 +317,9 @@
|
|
|
|
|
#define RAYGUI_H
|
|
|
|
|
|
|
|
|
|
#define RAYGUI_VERSION_MAJOR 4
|
|
|
|
|
#define RAYGUI_VERSION_MINOR 0
|
|
|
|
|
#define RAYGUI_VERSION_MINOR 1
|
|
|
|
|
#define RAYGUI_VERSION_PATCH 0
|
|
|
|
|
#define RAYGUI_VERSION "4.0"
|
|
|
|
|
#define RAYGUI_VERSION "4.1-dev"
|
|
|
|
|
|
|
|
|
|
#if !defined(RAYGUI_STANDALONE)
|
|
|
|
|
#include "raylib.h"
|
|
|
|
@ -441,7 +444,6 @@
|
|
|
|
|
} Font;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Style property
|
|
|
|
|
// NOTE: Used when exporting style as code for convenience
|
|
|
|
|
typedef struct GuiStyleProp {
|
|
|
|
@ -546,7 +548,6 @@ typedef enum {
|
|
|
|
|
// TEXT_SIZE, TEXT_SPACING, TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE are global and
|
|
|
|
|
// should be configured by user as needed while defining the UI layout
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Gui extended properties depend on control
|
|
|
|
|
// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default, max 8 properties)
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
@ -562,7 +563,7 @@ typedef enum {
|
|
|
|
|
TEXT_ALIGNMENT_VERTICAL, // Text vertical alignment inside text bounds (after border and padding)
|
|
|
|
|
TEXT_WRAP_MODE // Text wrap-mode inside text bounds
|
|
|
|
|
//TEXT_DECORATION // Text decoration: 0-None, 1-Underline, 2-Line-through, 3-Overline
|
|
|
|
|
//TEXT_DECORATION_THICK // Text decoration line thikness
|
|
|
|
|
//TEXT_DECORATION_THICK // Text decoration line thickness
|
|
|
|
|
} GuiDefaultProperty;
|
|
|
|
|
|
|
|
|
|
// Other possible text properties:
|
|
|
|
@ -698,7 +699,6 @@ RAYGUIAPI char **GuiLoadIcons(const char *fileName, bool loadIconsName); // Load
|
|
|
|
|
RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); // Draw icon using pixel size at specified position
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Controls
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
|
|
|
// Container/separator controls, useful for controls organization
|
|
|
|
@ -710,29 +710,29 @@ RAYGUIAPI int GuiTabBar(Rectangle bounds, const char **text, int count, int *act
|
|
|
|
|
RAYGUIAPI int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view); // Scroll Panel control
|
|
|
|
|
|
|
|
|
|
// Basic controls set
|
|
|
|
|
RAYGUIAPI int GuiLabel(Rectangle bounds, const char *text); // Label control, shows text
|
|
|
|
|
RAYGUIAPI int GuiLabel(Rectangle bounds, const char *text); // Label control
|
|
|
|
|
RAYGUIAPI int GuiButton(Rectangle bounds, const char *text); // Button control, returns true when clicked
|
|
|
|
|
RAYGUIAPI int GuiLabelButton(Rectangle bounds, const char *text); // Label button control, show true when clicked
|
|
|
|
|
RAYGUIAPI int GuiToggle(Rectangle bounds, const char *text, bool *active); // Toggle Button control, returns true when active
|
|
|
|
|
RAYGUIAPI int GuiToggleGroup(Rectangle bounds, const char *text, int *active); // Toggle Group control, returns active toggle index
|
|
|
|
|
RAYGUIAPI int GuiToggleSlider(Rectangle bounds, const char *text, int *active); // Toggle Slider control, returns true when clicked
|
|
|
|
|
RAYGUIAPI int GuiLabelButton(Rectangle bounds, const char *text); // Label button control, returns true when clicked
|
|
|
|
|
RAYGUIAPI int GuiToggle(Rectangle bounds, const char *text, bool *active); // Toggle Button control
|
|
|
|
|
RAYGUIAPI int GuiToggleGroup(Rectangle bounds, const char *text, int *active); // Toggle Group control
|
|
|
|
|
RAYGUIAPI int GuiToggleSlider(Rectangle bounds, const char *text, int *active); // Toggle Slider control
|
|
|
|
|
RAYGUIAPI int GuiCheckBox(Rectangle bounds, const char *text, bool *checked); // Check Box control, returns true when active
|
|
|
|
|
RAYGUIAPI int GuiComboBox(Rectangle bounds, const char *text, int *active); // Combo Box control, returns selected item index
|
|
|
|
|
RAYGUIAPI int GuiComboBox(Rectangle bounds, const char *text, int *active); // Combo Box control
|
|
|
|
|
|
|
|
|
|
RAYGUIAPI int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control, returns selected item
|
|
|
|
|
RAYGUIAPI int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control, returns selected value
|
|
|
|
|
RAYGUIAPI int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control
|
|
|
|
|
RAYGUIAPI int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control
|
|
|
|
|
RAYGUIAPI int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers
|
|
|
|
|
RAYGUIAPI int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text
|
|
|
|
|
|
|
|
|
|
RAYGUIAPI int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider control, returns selected value
|
|
|
|
|
RAYGUIAPI int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control, returns selected value
|
|
|
|
|
RAYGUIAPI int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Progress Bar control, shows current progress value
|
|
|
|
|
RAYGUIAPI int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider control
|
|
|
|
|
RAYGUIAPI int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control
|
|
|
|
|
RAYGUIAPI int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Progress Bar control
|
|
|
|
|
RAYGUIAPI int GuiStatusBar(Rectangle bounds, const char *text); // Status Bar control, shows info text
|
|
|
|
|
RAYGUIAPI int GuiDummyRec(Rectangle bounds, const char *text); // Dummy control for placeholders
|
|
|
|
|
RAYGUIAPI int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell); // Grid control, returns mouse cell position
|
|
|
|
|
RAYGUIAPI int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell); // Grid control
|
|
|
|
|
|
|
|
|
|
// Advance controls set
|
|
|
|
|
RAYGUIAPI int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active); // List View control, returns selected list item index
|
|
|
|
|
RAYGUIAPI int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active); // List View control
|
|
|
|
|
RAYGUIAPI int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus); // List View with extended parameters
|
|
|
|
|
RAYGUIAPI int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons); // Message Box control, displays a message
|
|
|
|
|
RAYGUIAPI int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive); // Text Input Box control, ask for text, supports secret
|
|
|
|
@ -741,10 +741,9 @@ RAYGUIAPI int GuiColorPanel(Rectangle bounds, const char *text, Color *color);
|
|
|
|
|
RAYGUIAPI int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha); // Color Bar Alpha control
|
|
|
|
|
RAYGUIAPI int GuiColorBarHue(Rectangle bounds, const char *text, float *value); // Color Bar Hue control
|
|
|
|
|
RAYGUIAPI int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Picker control that avoids conversion to RGB on each call (multiple color controls)
|
|
|
|
|
RAYGUIAPI int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Panel control that returns HSV color value, used by GuiColorPickerHSV()
|
|
|
|
|
RAYGUIAPI int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Panel control that updates Hue-Saturation-Value color value, used by GuiColorPickerHSV()
|
|
|
|
|
//----------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if !defined(RAYGUI_NO_ICONS)
|
|
|
|
|
|
|
|
|
|
#if !defined(RAYGUI_CUSTOM_ICONS)
|
|
|
|
@ -972,9 +971,9 @@ typedef enum {
|
|
|
|
|
ICON_FOLDER = 217,
|
|
|
|
|
ICON_FILE = 218,
|
|
|
|
|
ICON_SAND_TIMER = 219,
|
|
|
|
|
ICON_220 = 220,
|
|
|
|
|
ICON_221 = 221,
|
|
|
|
|
ICON_222 = 222,
|
|
|
|
|
ICON_WARNING = 220,
|
|
|
|
|
ICON_HELP_BOX = 221,
|
|
|
|
|
ICON_INFO_BOX = 222,
|
|
|
|
|
ICON_223 = 223,
|
|
|
|
|
ICON_224 = 224,
|
|
|
|
|
ICON_225 = 225,
|
|
|
|
@ -1290,9 +1289,9 @@ static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] =
|
|
|
|
|
0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_FOLDER
|
|
|
|
|
0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x00003ffc, // ICON_FILE
|
|
|
|
|
0x1ff00000, 0x20082008, 0x17d02fe8, 0x05400ba0, 0x09200540, 0x23881010, 0x2fe827c8, 0x00001ff0, // ICON_SAND_TIMER
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_220
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_221
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_222
|
|
|
|
|
0x01800000, 0x02400240, 0x05a00420, 0x09900990, 0x11881188, 0x21842004, 0x40024182, 0x00003ffc, // ICON_WARNING
|
|
|
|
|
0x7ffe0000, 0x4ff24002, 0x4c324ff2, 0x4f824c02, 0x41824f82, 0x41824002, 0x40024182, 0x00007ffe, // ICON_HELP_BOX
|
|
|
|
|
0x7ffe0000, 0x41824002, 0x40024182, 0x41824182, 0x41824182, 0x41824182, 0x40024182, 0x00007ffe, // ICON_INFO_BOX
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_223
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_224
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_225
|
|
|
|
@ -1328,7 +1327,7 @@ static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] =
|
|
|
|
|
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_255
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// NOTE: We keep a pointer to the icons array, useful to point to other sets if required
|
|
|
|
|
// NOTE: A pointer to current icons array should be defined
|
|
|
|
|
static unsigned int *guiIconsPtr = guiIcons;
|
|
|
|
|
|
|
|
|
|
#endif // !RAYGUI_NO_ICONS && !RAYGUI_CUSTOM_ICONS
|
|
|
|
@ -1363,8 +1362,8 @@ static unsigned int guiIconScale = 1; // Gui icon default scale (if ic
|
|
|
|
|
static bool guiTooltip = false; // Tooltip enabled/disabled
|
|
|
|
|
static const char *guiTooltipPtr = NULL; // Tooltip string pointer (string provided by user)
|
|
|
|
|
|
|
|
|
|
static bool guiSliderDragging = false; // Gui slider drag state (no inputs processed except dragged slider)
|
|
|
|
|
static Rectangle guiSliderActive = { 0 }; // Gui slider active bounds rectangle, used as an unique identifier
|
|
|
|
|
static bool guiControlExclusiveMode = false; // Gui control exclusive mode (no inputs processed except current control)
|
|
|
|
|
static Rectangle guiControlExclusiveRec = { 0 }; // Gui control exclusive bounds rectangle, used as an unique identifier
|
|
|
|
|
|
|
|
|
|
static int textBoxCursorIndex = 0; // Cursor index, shared by all GuiTextBox*()
|
|
|
|
|
//static int blinkCursorFrameCounter = 0; // Frame counter for cursor blinking
|
|
|
|
@ -1744,6 +1743,9 @@ int GuiTabBar(Rectangle bounds, const char **text, int count, int *active)
|
|
|
|
|
if (toggle) *active = i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Close tab with middle mouse button pressed
|
|
|
|
|
if (CheckCollisionPointRec(GetMousePosition(), tabBounds) && IsMouseButtonPressed(MOUSE_MIDDLE_BUTTON)) result = i;
|
|
|
|
|
|
|
|
|
|
GuiSetStyle(TOGGLE, TEXT_PADDING, textPadding);
|
|
|
|
|
GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, textAlignment);
|
|
|
|
|
|
|
|
|
@ -1775,10 +1777,10 @@ int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector
|
|
|
|
|
{
|
|
|
|
|
#define RAYGUI_MIN_SCROLLBAR_WIDTH 40
|
|
|
|
|
#define RAYGUI_MIN_SCROLLBAR_HEIGHT 40
|
|
|
|
|
#define RAYGUI_MIN_MOUSE_WHEEL_SPEED 20
|
|
|
|
|
|
|
|
|
|
int result = 0;
|
|
|
|
|
GuiState state = guiState;
|
|
|
|
|
float mouseWheelSpeed = 20.0f; // Default movement speed with mouse wheel
|
|
|
|
|
|
|
|
|
|
Rectangle temp = { 0 };
|
|
|
|
|
if (view == NULL) view = &temp;
|
|
|
|
@ -1820,17 +1822,8 @@ int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Make sure scroll bars have a minimum width/height
|
|
|
|
|
// NOTE: If content >>> bounds, size could be very small or even 0
|
|
|
|
|
if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH)
|
|
|
|
|
{
|
|
|
|
|
horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH;
|
|
|
|
|
mouseWheelSpeed = 30.0f; // TODO: Calculate speed increment based on content.height vs bounds.height
|
|
|
|
|
}
|
|
|
|
|
if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT)
|
|
|
|
|
{
|
|
|
|
|
verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT;
|
|
|
|
|
mouseWheelSpeed = 30.0f; // TODO: Calculate speed increment based on content.width vs bounds.width
|
|
|
|
|
}
|
|
|
|
|
if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH) horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH;
|
|
|
|
|
if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT) verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT;
|
|
|
|
|
|
|
|
|
|
// Calculate view area (area without the scrollbars)
|
|
|
|
|
*view = (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)?
|
|
|
|
@ -1873,9 +1866,14 @@ int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector
|
|
|
|
|
#endif
|
|
|
|
|
float wheelMove = GetMouseWheelMove();
|
|
|
|
|
|
|
|
|
|
// Set scrolling speed with mouse wheel based on ratio between bounds and content
|
|
|
|
|
Vector2 mouseWheelSpeed = { content.width / bounds.width, content.height / bounds.height };
|
|
|
|
|
if (mouseWheelSpeed.x < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.x = RAYGUI_MIN_MOUSE_WHEEL_SPEED;
|
|
|
|
|
if (mouseWheelSpeed.y < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.y = RAYGUI_MIN_MOUSE_WHEEL_SPEED;
|
|
|
|
|
|
|
|
|
|
// Horizontal and vertical scrolling with mouse wheel
|
|
|
|
|
if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_LEFT_SHIFT))) scrollPos.x += wheelMove*mouseWheelSpeed;
|
|
|
|
|
else scrollPos.y += wheelMove*mouseWheelSpeed; // Vertical scroll
|
|
|
|
|
if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_LEFT_SHIFT))) scrollPos.x += wheelMove*mouseWheelSpeed.x;
|
|
|
|
|
else scrollPos.y += wheelMove*mouseWheelSpeed.y; // Vertical scroll
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1921,7 +1919,7 @@ int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Draw scrollbar lines depending on current state
|
|
|
|
|
GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), BLANK);
|
|
|
|
|
GuiDrawRectangle(bounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), BLANK);
|
|
|
|
|
|
|
|
|
|
// Set scrollbar slider size back to the way it was before
|
|
|
|
|
GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider);
|
|
|
|
@ -1959,7 +1957,7 @@ int GuiButton(Rectangle bounds, const char *text)
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -1997,7 +1995,7 @@ int GuiLabelButton(Rectangle bounds, const char *text)
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2020,7 +2018,7 @@ int GuiLabelButton(Rectangle bounds, const char *text)
|
|
|
|
|
return pressed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Toggle Button control, returns true when active
|
|
|
|
|
// Toggle Button control
|
|
|
|
|
int GuiToggle(Rectangle bounds, const char *text, bool *active)
|
|
|
|
|
{
|
|
|
|
|
int result = 0;
|
|
|
|
@ -2031,7 +2029,7 @@ int GuiToggle(Rectangle bounds, const char *text, bool *active)
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2068,7 +2066,7 @@ int GuiToggle(Rectangle bounds, const char *text, bool *active)
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Toggle Group control, returns toggled button codepointIndex
|
|
|
|
|
// Toggle Group control
|
|
|
|
|
int GuiToggleGroup(Rectangle bounds, const char *text, int *active)
|
|
|
|
|
{
|
|
|
|
|
#if !defined(RAYGUI_TOGGLEGROUP_MAX_ITEMS)
|
|
|
|
@ -2117,7 +2115,7 @@ int GuiToggleGroup(Rectangle bounds, const char *text, int *active)
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Toggle Slider control extended, returns true when clicked
|
|
|
|
|
// Toggle Slider control extended
|
|
|
|
|
int GuiToggleSlider(Rectangle bounds, const char *text, int *active)
|
|
|
|
|
{
|
|
|
|
|
int result = 0;
|
|
|
|
@ -2211,7 +2209,7 @@ int GuiCheckBox(Rectangle bounds, const char *text, bool *checked)
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2256,7 +2254,7 @@ int GuiCheckBox(Rectangle bounds, const char *text, bool *checked)
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Combo Box control, returns selected item codepointIndex
|
|
|
|
|
// Combo Box control
|
|
|
|
|
int GuiComboBox(Rectangle bounds, const char *text, int *active)
|
|
|
|
|
{
|
|
|
|
|
int result = 0;
|
|
|
|
@ -2279,7 +2277,7 @@ int GuiComboBox(Rectangle bounds, const char *text, int *active)
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && (itemCount > 1) && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && (itemCount > 1) && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2341,7 +2339,7 @@ int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMod
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1) && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1) && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2440,7 +2438,7 @@ int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMod
|
|
|
|
|
|
|
|
|
|
// Text Box control
|
|
|
|
|
// NOTE: Returns true on ENTER pressed (useful for data validation)
|
|
|
|
|
int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
|
|
|
|
|
int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode)
|
|
|
|
|
{
|
|
|
|
|
#if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)
|
|
|
|
|
#define RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN 40 // Frames to wait for autocursor movement
|
|
|
|
@ -2496,7 +2494,7 @@ int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
|
|
|
|
|
if ((state != STATE_DISABLED) && // Control not disabled
|
|
|
|
|
!GuiGetStyle(TEXTBOX, TEXT_READONLY) && // TextBox not on read-only mode
|
|
|
|
|
!guiLocked && // Gui not locked
|
|
|
|
|
!guiSliderDragging && // No gui slider on dragging
|
|
|
|
|
!guiControlExclusiveMode && // No gui slider on dragging
|
|
|
|
|
(wrapMode == TEXT_WRAP_NONE)) // No wrap mode
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePosition = GetMousePosition();
|
|
|
|
@ -2529,7 +2527,7 @@ int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
|
|
|
|
|
|
|
|
|
|
// Add codepoint to text, at current cursor position
|
|
|
|
|
// NOTE: Make sure we do not overflow buffer size
|
|
|
|
|
if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < bufferSize))
|
|
|
|
|
if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < textSize))
|
|
|
|
|
{
|
|
|
|
|
// Move forward data from cursor position
|
|
|
|
|
for (int i = (textLength + codepointSize); i > textBoxCursorIndex; i--) text[i] = text[i - codepointSize];
|
|
|
|
@ -2727,7 +2725,7 @@ int GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode)
|
|
|
|
|
/*
|
|
|
|
|
// Text Box control with multiple lines and word-wrap
|
|
|
|
|
// NOTE: This text-box is readonly, no editing supported by default
|
|
|
|
|
bool GuiTextBoxMulti(Rectangle bounds, char *text, int bufferSize, bool editMode)
|
|
|
|
|
bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode)
|
|
|
|
|
{
|
|
|
|
|
bool pressed = false;
|
|
|
|
|
|
|
|
|
@ -2736,7 +2734,7 @@ bool GuiTextBoxMulti(Rectangle bounds, char *text, int bufferSize, bool editMode
|
|
|
|
|
GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_TOP);
|
|
|
|
|
|
|
|
|
|
// TODO: Implement methods to calculate cursor position properly
|
|
|
|
|
pressed = GuiTextBox(bounds, text, bufferSize, editMode);
|
|
|
|
|
pressed = GuiTextBox(bounds, text, textSize, editMode);
|
|
|
|
|
|
|
|
|
|
GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE);
|
|
|
|
|
GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE);
|
|
|
|
@ -2771,7 +2769,7 @@ int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2846,7 +2844,7 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -2890,7 +2888,13 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
|
|
|
|
//if (*value > maxValue) *value = maxValue;
|
|
|
|
|
//else if (*value < minValue) *value = minValue;
|
|
|
|
|
|
|
|
|
|
if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) result = 1;
|
|
|
|
|
if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)))
|
|
|
|
|
{
|
|
|
|
|
if (*value > maxValue) *value = maxValue;
|
|
|
|
|
else if (*value < minValue) *value = minValue;
|
|
|
|
|
|
|
|
|
|
result = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -2935,50 +2939,36 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
|
|
|
|
int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth)
|
|
|
|
|
{
|
|
|
|
|
int result = 0;
|
|
|
|
|
float oldValue = *value;
|
|
|
|
|
GuiState state = guiState;
|
|
|
|
|
|
|
|
|
|
float temp = (maxValue - minValue)/2.0f;
|
|
|
|
|
if (value == NULL) value = &temp;
|
|
|
|
|
|
|
|
|
|
int sliderValue = (int)(((*value - minValue)/(maxValue - minValue))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH)));
|
|
|
|
|
float oldValue = *value;
|
|
|
|
|
|
|
|
|
|
Rectangle slider = { bounds.x, bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING),
|
|
|
|
|
0, bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) };
|
|
|
|
|
|
|
|
|
|
if (sliderWidth > 0) // Slider
|
|
|
|
|
{
|
|
|
|
|
slider.x += (sliderValue - sliderWidth/2);
|
|
|
|
|
slider.width = (float)sliderWidth;
|
|
|
|
|
}
|
|
|
|
|
else if (sliderWidth == 0) // SliderBar
|
|
|
|
|
{
|
|
|
|
|
slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH);
|
|
|
|
|
slider.width = (float)sliderValue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
|
if (guiSliderDragging) // Keep dragging outside of bounds
|
|
|
|
|
if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
|
|
|
|
|
// Get equivalent value and slider position from mousePosition.x
|
|
|
|
|
*value = ((maxValue - minValue)*(mousePoint.x - (float)(bounds.x + sliderWidth/2)))/(float)(bounds.width - sliderWidth) + minValue;
|
|
|
|
|
*value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
guiSliderDragging = false;
|
|
|
|
|
guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
guiControlExclusiveMode = false;
|
|
|
|
|
guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (CheckCollisionPointRec(mousePoint, bounds))
|
|
|
|
@ -2986,16 +2976,13 @@ int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight,
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
guiSliderDragging = true;
|
|
|
|
|
guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
guiControlExclusiveMode = true;
|
|
|
|
|
guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
|
|
|
|
|
if (!CheckCollisionPointRec(mousePoint, slider))
|
|
|
|
|
{
|
|
|
|
|
// Get equivalent value and slider position from mousePosition.x
|
|
|
|
|
*value = ((maxValue - minValue)*(mousePoint.x - (float)(bounds.x + sliderWidth/2)))/(float)(bounds.width - sliderWidth) + minValue;
|
|
|
|
|
|
|
|
|
|
if (sliderWidth > 0) slider.x = mousePoint.x - slider.width/2; // Slider
|
|
|
|
|
else if (sliderWidth == 0) slider.width = (float)sliderValue; // SliderBar
|
|
|
|
|
*value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else state = STATE_FOCUSED;
|
|
|
|
@ -3009,14 +2996,19 @@ int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight,
|
|
|
|
|
if (oldValue == *value) result = 0;
|
|
|
|
|
else result = 1;
|
|
|
|
|
|
|
|
|
|
// Bar limits check
|
|
|
|
|
// Slider bar limits check
|
|
|
|
|
int sliderValue = (int)(((*value - minValue)/(maxValue - minValue))*(bounds.width - sliderWidth - GuiGetStyle(SLIDER, BORDER_WIDTH)));
|
|
|
|
|
if (sliderWidth > 0) // Slider
|
|
|
|
|
{
|
|
|
|
|
slider.x += sliderValue;
|
|
|
|
|
slider.width = (float)sliderWidth;
|
|
|
|
|
if (slider.x <= (bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH);
|
|
|
|
|
else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) slider.x = bounds.x + bounds.width - slider.width - GuiGetStyle(SLIDER, BORDER_WIDTH);
|
|
|
|
|
}
|
|
|
|
|
else if (sliderWidth == 0) // SliderBar
|
|
|
|
|
{
|
|
|
|
|
slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH);
|
|
|
|
|
slider.width = (float)sliderValue;
|
|
|
|
|
if (slider.width > bounds.width) slider.width = bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH);
|
|
|
|
|
}
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
@ -3171,7 +3163,7 @@ int GuiDummyRec(Rectangle bounds, const char *text)
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -3238,7 +3230,7 @@ int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollInd
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
@ -3353,83 +3345,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 && !guiSliderDragging)
|
|
|
|
|
// 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();
|
|
|
|
|
|
|
|
|
|
if (CheckCollisionPointRec(mousePoint, bounds))
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
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) };
|
|
|
|
|
|
|
|
|
|
color->a };
|
|
|
|
|
}
|
|
|
|
|
else state = STATE_FOCUSED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3451,11 +3392,11 @@ int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
|
if (guiSliderDragging) // Keep dragging outside of bounds
|
|
|
|
|
if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
|
|
|
|
@ -3466,8 +3407,8 @@ int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
guiSliderDragging = false;
|
|
|
|
|
guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
guiControlExclusiveMode = false;
|
|
|
|
|
guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector))
|
|
|
|
@ -3475,8 +3416,8 @@ int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha)
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
guiSliderDragging = true;
|
|
|
|
|
guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
guiControlExclusiveMode = true;
|
|
|
|
|
guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
|
|
|
|
|
*alpha = (mousePoint.x - bounds.x)/bounds.width;
|
|
|
|
|
if (*alpha <= 0.0f) *alpha = 0.0f;
|
|
|
|
@ -3537,11 +3478,11 @@ int GuiColorBarHue(Rectangle bounds, const char *text, float *hue)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
|
if (guiSliderDragging) // Keep dragging outside of bounds
|
|
|
|
|
if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
|
|
|
|
@ -3552,8 +3493,8 @@ int GuiColorBarHue(Rectangle bounds, const char *text, float *hue)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
guiSliderDragging = false;
|
|
|
|
|
guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
guiControlExclusiveMode = false;
|
|
|
|
|
guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector))
|
|
|
|
@ -3561,8 +3502,8 @@ int GuiColorBarHue(Rectangle bounds, const char *text, float *hue)
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
guiSliderDragging = true;
|
|
|
|
|
guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
guiControlExclusiveMode = true;
|
|
|
|
|
guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
|
|
|
|
|
*hue = (mousePoint.y - bounds.y)*360/bounds.height;
|
|
|
|
|
if (*hue <= 0.0f) *hue = 0.0f;
|
|
|
|
@ -3615,6 +3556,7 @@ int GuiColorBarHue(Rectangle bounds, const char *text, float *hue)
|
|
|
|
|
// float GuiColorBarAlpha(Rectangle bounds, float alpha)
|
|
|
|
|
// float GuiColorBarHue(Rectangle bounds, float value)
|
|
|
|
|
// NOTE: bounds define GuiColorPanel() size
|
|
|
|
|
// NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead
|
|
|
|
|
int GuiColorPicker(Rectangle bounds, const char *text, Color *color)
|
|
|
|
|
{
|
|
|
|
|
int result = 0;
|
|
|
|
@ -3627,6 +3569,7 @@ int GuiColorPicker(Rectangle bounds, const char *text, Color *color)
|
|
|
|
|
Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height };
|
|
|
|
|
//Rectangle boundsAlpha = { bounds.x, bounds.y + bounds.height + GuiGetStyle(COLORPICKER, BARS_PADDING), bounds.width, GuiGetStyle(COLORPICKER, BARS_THICK) };
|
|
|
|
|
|
|
|
|
|
// NOTE: this conversion can cause low hue-resolution, if the r, g and b value are very similar, which causes the hue bar to shift around when only the GuiColorPanel is used.
|
|
|
|
|
Vector3 hsv = ConvertRGBtoHSV(RAYGUI_CLITERAL(Vector3){ (*color).r/255.0f, (*color).g/255.0f, (*color).b/255.0f });
|
|
|
|
|
|
|
|
|
|
GuiColorBarHue(boundsHue, NULL, &hsv.x);
|
|
|
|
@ -3668,8 +3611,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;
|
|
|
|
@ -3690,15 +3632,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 (guiControlExclusiveMode) // Allows to keep dragging outside of bounds
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec))
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
guiControlExclusiveMode = false;
|
|
|
|
|
guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (CheckCollisionPointRec(mousePoint, bounds))
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
guiControlExclusiveMode = true;
|
|
|
|
|
guiControlExclusiveRec = bounds;
|
|
|
|
|
pickerSelector = mousePoint;
|
|
|
|
|
|
|
|
|
|
// Calculate color from picker
|
|
|
|
@ -3760,9 +3734,9 @@ int GuiMessageBox(Rectangle bounds, const char *title, const char *message, cons
|
|
|
|
|
int textWidth = GetTextWidth(message) + 2;
|
|
|
|
|
|
|
|
|
|
Rectangle textBounds = { 0 };
|
|
|
|
|
textBounds.x = bounds.x + bounds.width/2 - textWidth/2;
|
|
|
|
|
textBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING;
|
|
|
|
|
textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + RAYGUI_MESSAGEBOX_BUTTON_PADDING;
|
|
|
|
|
textBounds.width = (float)textWidth;
|
|
|
|
|
textBounds.width = bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*2;
|
|
|
|
|
textBounds.height = bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 3*RAYGUI_MESSAGEBOX_BUTTON_PADDING - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT;
|
|
|
|
|
|
|
|
|
|
// Draw control
|
|
|
|
@ -3905,7 +3879,7 @@ int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vect
|
|
|
|
|
|
|
|
|
|
// Update control
|
|
|
|
|
//--------------------------------------------------------------------
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiSliderDragging)
|
|
|
|
|
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
if (CheckCollisionPointRec(mousePoint, bounds))
|
|
|
|
|
{
|
|
|
|
@ -3954,7 +3928,6 @@ void GuiDisableTooltip(void) { guiTooltip = false; }
|
|
|
|
|
// Set tooltip string
|
|
|
|
|
void GuiSetTooltip(const char *tooltip) { guiTooltipPtr = tooltip; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
|
// Styles loading functions
|
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
@ -3967,6 +3940,7 @@ void GuiLoadStyle(const char *fileName)
|
|
|
|
|
#define MAX_LINE_BUFFER_SIZE 256
|
|
|
|
|
|
|
|
|
|
bool tryBinary = false;
|
|
|
|
|
if (!guiStyleLoaded) GuiLoadStyleDefault();
|
|
|
|
|
|
|
|
|
|
// Try reading the files as text file first
|
|
|
|
|
FILE *rgsFile = fopen(fileName, "rt");
|
|
|
|
@ -4773,6 +4747,7 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
|
|
|
|
|
// Get text position depending on alignment and iconId
|
|
|
|
|
//---------------------------------------------------------------------------------
|
|
|
|
|
Vector2 textBoundsPosition = { textBounds.x, textBounds.y };
|
|
|
|
|
float textBoundsWidthOffset = 0.0f;
|
|
|
|
|
|
|
|
|
|
// NOTE: We get text size after icon has been processed
|
|
|
|
|
// WARNING: GetTextWidth() also processes text icon to get width! -> Really needed?
|
|
|
|
@ -4798,6 +4773,8 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
|
|
|
|
|
default: break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (textSizeX > textBounds.width && (lines[i] != NULL) && (lines[i][0] != '\0')) textBoundsPosition.x = textBounds.x;
|
|
|
|
|
|
|
|
|
|
switch (alignmentVertical)
|
|
|
|
|
{
|
|
|
|
|
// Only valid in case of wordWrap = 0;
|
|
|
|
@ -4820,7 +4797,8 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
|
|
|
|
|
{
|
|
|
|
|
// NOTE: We consider icon height, probably different than text size
|
|
|
|
|
GuiDrawIcon(iconId, (int)textBoundsPosition.x, (int)(textBounds.y + textBounds.height/2 - RAYGUI_ICON_SIZE*guiIconScale/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height)), guiIconScale, tint);
|
|
|
|
|
textBoundsPosition.x += (RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING);
|
|
|
|
|
textBoundsPosition.x += (float)(RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING);
|
|
|
|
|
textBoundsWidthOffset = (float)(RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
// Get size in bytes of text,
|
|
|
|
@ -4829,9 +4807,15 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
|
|
|
|
|
for (int c = 0; (lines[i][c] != '\0') && (lines[i][c] != '\n') && (lines[i][c] != '\r'); c++, lineSize++){ }
|
|
|
|
|
float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize;
|
|
|
|
|
|
|
|
|
|
int lastSpaceIndex = 0;
|
|
|
|
|
bool tempWrapCharMode = false;
|
|
|
|
|
|
|
|
|
|
int textOffsetY = 0;
|
|
|
|
|
float textOffsetX = 0.0f;
|
|
|
|
|
float glyphWidth = 0;
|
|
|
|
|
|
|
|
|
|
int ellipsisWidth = GetTextWidth("...");
|
|
|
|
|
bool overflowReached = false;
|
|
|
|
|
for (int c = 0, codepointSize = 0; c < lineSize; c += codepointSize)
|
|
|
|
|
{
|
|
|
|
|
int codepoint = GetCodepointNext(&lines[i][c], &codepointSize);
|
|
|
|
@ -4841,34 +4825,49 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
|
|
|
|
|
// but we need to draw all of the bad bytes using the '?' symbol moving one byte
|
|
|
|
|
if (codepoint == 0x3f) codepointSize = 1; // TODO: Review not recognized codepoints size
|
|
|
|
|
|
|
|
|
|
// Wrap mode text measuring to space to validate if it can be drawn or
|
|
|
|
|
// a new line is required
|
|
|
|
|
if (wrapMode == TEXT_WRAP_CHAR)
|
|
|
|
|
{
|
|
|
|
|
// Get glyph width to check if it goes out of bounds
|
|
|
|
|
if (guiFont.glyphs[index].advanceX == 0) glyphWidth = ((float)guiFont.recs[index].width*scaleFactor);
|
|
|
|
|
else glyphWidth = (float)guiFont.glyphs[index].advanceX*scaleFactor;
|
|
|
|
|
|
|
|
|
|
// Wrap mode text measuring, to validate if
|
|
|
|
|
// it can be drawn or a new line is required
|
|
|
|
|
if (wrapMode == TEXT_WRAP_CHAR)
|
|
|
|
|
{
|
|
|
|
|
// Jump to next line if current character reach end of the box limits
|
|
|
|
|
if ((textOffsetX + glyphWidth) > textBounds.width)
|
|
|
|
|
if ((textOffsetX + glyphWidth) > textBounds.width - textBoundsWidthOffset)
|
|
|
|
|
{
|
|
|
|
|
textOffsetX = 0.0f;
|
|
|
|
|
textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING);
|
|
|
|
|
|
|
|
|
|
if (tempWrapCharMode) // Wrap at char level when too long words
|
|
|
|
|
{
|
|
|
|
|
wrapMode = TEXT_WRAP_WORD;
|
|
|
|
|
tempWrapCharMode = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (wrapMode == TEXT_WRAP_WORD)
|
|
|
|
|
{
|
|
|
|
|
if (codepoint == 32) lastSpaceIndex = c;
|
|
|
|
|
|
|
|
|
|
// Get width to next space in line
|
|
|
|
|
int nextSpaceIndex = 0;
|
|
|
|
|
float nextSpaceWidth = GetNextSpaceWidth(lines[i] + c, &nextSpaceIndex);
|
|
|
|
|
|
|
|
|
|
if ((textOffsetX + nextSpaceWidth) > textBounds.width)
|
|
|
|
|
int nextSpaceIndex2 = 0;
|
|
|
|
|
float nextWordSize = GetNextSpaceWidth(lines[i] + lastSpaceIndex + 1, &nextSpaceIndex2);
|
|
|
|
|
|
|
|
|
|
if (nextWordSize > textBounds.width - textBoundsWidthOffset)
|
|
|
|
|
{
|
|
|
|
|
// Considering the case the next word is longer than bounds
|
|
|
|
|
tempWrapCharMode = true;
|
|
|
|
|
wrapMode = TEXT_WRAP_CHAR;
|
|
|
|
|
}
|
|
|
|
|
else if ((textOffsetX + nextSpaceWidth) > textBounds.width - textBoundsWidthOffset)
|
|
|
|
|
{
|
|
|
|
|
textOffsetX = 0.0f;
|
|
|
|
|
textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: Consider case: (nextSpaceWidth >= textBounds.width)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (codepoint == '\n') break; // WARNING: Lines are already processed manually, no need to keep drawing after this codepoint
|
|
|
|
@ -4881,7 +4880,23 @@ static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, C
|
|
|
|
|
if (wrapMode == TEXT_WRAP_NONE)
|
|
|
|
|
{
|
|
|
|
|
// Draw only required text glyphs fitting the textBounds.width
|
|
|
|
|
if (textOffsetX <= (textBounds.width - glyphWidth))
|
|
|
|
|
if (textSizeX > textBounds.width)
|
|
|
|
|
{
|
|
|
|
|
if (textOffsetX <= (textBounds.width - glyphWidth - textBoundsWidthOffset - ellipsisWidth))
|
|
|
|
|
{
|
|
|
|
|
DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha));
|
|
|
|
|
}
|
|
|
|
|
else if (!overflowReached)
|
|
|
|
|
{
|
|
|
|
|
overflowReached = true;
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < ellipsisWidth; j += ellipsisWidth/3)
|
|
|
|
|
{
|
|
|
|
|
DrawTextCodepoint(guiFont, '.', RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX + j, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha));
|
|
|
|
|
}
|
|
|
|
@ -4937,7 +4952,7 @@ static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor,
|
|
|
|
|
// Draw tooltip using control bounds
|
|
|
|
|
static void GuiTooltip(Rectangle controlRec)
|
|
|
|
|
{
|
|
|
|
|
if (!guiLocked && guiTooltip && (guiTooltipPtr != NULL) && !guiSliderDragging)
|
|
|
|
|
if (!guiLocked && guiTooltip && (guiTooltipPtr != NULL) && !guiControlExclusiveMode)
|
|
|
|
|
{
|
|
|
|
|
Vector2 textSize = MeasureTextEx(GuiGetFont(), guiTooltipPtr, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING));
|
|
|
|
|
|
|
|
|
@ -5003,7 +5018,7 @@ static const char **GuiTextSplit(const char *text, char delimiter, int *count, i
|
|
|
|
|
buffer[i] = '\0'; // Set an end of string at this point
|
|
|
|
|
|
|
|
|
|
counter++;
|
|
|
|
|
if (counter == RAYGUI_TEXTSPLIT_MAX_ITEMS) break;
|
|
|
|
|
if (counter > RAYGUI_TEXTSPLIT_MAX_ITEMS) break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -5163,8 +5178,11 @@ static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue)
|
|
|
|
|
if (value > maxValue) value = maxValue;
|
|
|
|
|
if (value < minValue) value = minValue;
|
|
|
|
|
|
|
|
|
|
const int valueRange = maxValue - minValue;
|
|
|
|
|
int valueRange = maxValue - minValue;
|
|
|
|
|
if (valueRange <= 0) valueRange = 1;
|
|
|
|
|
|
|
|
|
|
int sliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE);
|
|
|
|
|
if (sliderSize < 1) sliderSize = 1; // TODO: Consider a minimum slider size
|
|
|
|
|
|
|
|
|
|
// Calculate rectangles for all of the components
|
|
|
|
|
arrowUpLeft = RAYGUI_CLITERAL(Rectangle){
|
|
|
|
@ -5205,13 +5223,13 @@ static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue)
|
|
|
|
|
{
|
|
|
|
|
Vector2 mousePoint = GetMousePosition();
|
|
|
|
|
|
|
|
|
|
if (guiSliderDragging) // Keep dragging outside of bounds
|
|
|
|
|
if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds
|
|
|
|
|
{
|
|
|
|
|
if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) &&
|
|
|
|
|
!CheckCollisionPointRec(mousePoint, arrowUpLeft) &&
|
|
|
|
|
!CheckCollisionPointRec(mousePoint, arrowDownRight))
|
|
|
|
|
{
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiSliderActive))
|
|
|
|
|
if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec))
|
|
|
|
|
{
|
|
|
|
|
state = STATE_PRESSED;
|
|
|
|
|
|
|
|
|
@ -5221,8 +5239,8 @@ static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
guiSliderDragging = false;
|
|
|
|
|
guiSliderActive = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
guiControlExclusiveMode = false;
|
|
|
|
|
guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (CheckCollisionPointRec(mousePoint, bounds))
|
|
|
|
@ -5236,8 +5254,8 @@ static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue)
|
|
|
|
|
// Handle mouse button down
|
|
|
|
|
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
|
|
|
|
|
{
|
|
|
|
|
guiSliderDragging = true;
|
|
|
|
|
guiSliderActive = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
guiControlExclusiveMode = true;
|
|
|
|
|
guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts
|
|
|
|
|
|
|
|
|
|
// Check arrows click
|
|
|
|
|
if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) value -= valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED);
|
|
|
|
@ -5515,7 +5533,6 @@ static int GetCodepointNext(const char *text, int *codepointSize)
|
|
|
|
|
*codepointSize = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return codepoint;
|
|
|
|
|
}
|
|
|
|
|
#endif // RAYGUI_STANDALONE
|
|
|
|
|