mirror of
https://github.com/raysan5/raygui.git
synced 2025-12-25 10:22:33 -05:00
Compare commits
10 Commits
d4ebcdc2be
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b94b80c92 | |||
| 867ca4bf8d | |||
| 367e169ad3 | |||
| 1a74db2ab3 | |||
| 715baf250d | |||
| 3aea427fc8 | |||
| 773d1ec52b | |||
| ff4dbd0712 | |||
| aed63cedd1 | |||
| 4436a897f9 |
@ -6,10 +6,10 @@ PRODUCTVERSION 4,0,0,0
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
//BLOCK "080904E4" // English UK
|
||||
BLOCK "040904E4" // English US
|
||||
//BLOCK "080904E4" // English UK
|
||||
BLOCK "040904E4" // English US
|
||||
BEGIN
|
||||
//VALUE "CompanyName", "raylib technologies"
|
||||
//VALUE "CompanyName", "raylib technologies"
|
||||
VALUE "FileDescription", "raygui application (www.raylib.com)"
|
||||
VALUE "FileVersion", "4.0.0"
|
||||
VALUE "InternalName", "raygui app"
|
||||
@ -21,7 +21,7 @@ BEGIN
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
//VALUE "Translation", 0x809, 1252 // English UK
|
||||
VALUE "Translation", 0x409, 1252 // English US
|
||||
//VALUE "Translation", 0x809, 1252 // English UK
|
||||
VALUE "Translation", 0x409, 1252 // English US
|
||||
END
|
||||
END
|
||||
|
||||
146
src/raygui.h
146
src/raygui.h
@ -77,7 +77,7 @@
|
||||
*
|
||||
* static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)];
|
||||
*
|
||||
* guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB
|
||||
* guiStyle size is by default: 16*(16 + 8) = 384 int = 384*4 bytes = 1536 bytes = 1.5 KB
|
||||
*
|
||||
* Note that the first set of BASE properties (by default guiStyle[0..15]) belong to the generic style
|
||||
* used for all controls, when any of those base values is set, it is automatically populated to all
|
||||
@ -141,7 +141,7 @@
|
||||
* Draw text bounds rectangles for debug
|
||||
*
|
||||
* VERSIONS HISTORY:
|
||||
* 5.0-dev (2025) Current dev version...
|
||||
* 5.0 (xx-Nov-2025) ADDED: Support up to 32 controls (v500)
|
||||
* ADDED: guiControlExclusiveMode and guiControlExclusiveRec for exclusive modes
|
||||
* ADDED: GuiValueBoxFloat()
|
||||
* ADDED: GuiDropdonwBox() properties: DROPDOWN_ARROW_HIDDEN, DROPDOWN_ROLL_UP
|
||||
@ -271,7 +271,7 @@
|
||||
* 0.8 (27-Aug-2015) Initial release. Implemented by Kevin Gato, Daniel Nicolás and Ramon Santamaria
|
||||
*
|
||||
* DEPENDENCIES:
|
||||
* raylib 5.0 - Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing
|
||||
* raylib 5.6-dev - Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing
|
||||
*
|
||||
* STANDALONE MODE:
|
||||
* By default raygui depends on raylib mostly for the inputs and the drawing functionality but that dependency can be disabled
|
||||
@ -1010,28 +1010,28 @@ typedef enum {
|
||||
ICON_SLICING = 231,
|
||||
ICON_MANUAL_CONTROL = 232,
|
||||
ICON_COLLISION = 233,
|
||||
ICON_234 = 234,
|
||||
ICON_235 = 235,
|
||||
ICON_236 = 236,
|
||||
ICON_237 = 237,
|
||||
ICON_238 = 238,
|
||||
ICON_239 = 239,
|
||||
ICON_240 = 240,
|
||||
ICON_241 = 241,
|
||||
ICON_242 = 242,
|
||||
ICON_243 = 243,
|
||||
ICON_244 = 244,
|
||||
ICON_245 = 245,
|
||||
ICON_246 = 246,
|
||||
ICON_247 = 247,
|
||||
ICON_248 = 248,
|
||||
ICON_249 = 249,
|
||||
ICON_CIRCLE_ADD = 234,
|
||||
ICON_CIRCLE_ADD_FILL = 235,
|
||||
ICON_CIRCLE_WARNING = 236,
|
||||
ICON_CIRCLE_WARNING_FILL = 237,
|
||||
ICON_BOX_MORE = 238,
|
||||
ICON_BOX_MORE_FILL = 239,
|
||||
ICON_BOX_MINUS = 240,
|
||||
ICON_BOX_MINUS_FILL = 241,
|
||||
ICON_UNION = 242,
|
||||
ICON_INTERSECTION = 243,
|
||||
ICON_DIFFERENCE = 244,
|
||||
ICON_SPHERE = 245,
|
||||
ICON_CYLINDER = 246,
|
||||
ICON_CONE = 247,
|
||||
ICON_ELLIPSOID = 248,
|
||||
ICON_CAPSULE = 249,
|
||||
ICON_250 = 250,
|
||||
ICON_251 = 251,
|
||||
ICON_252 = 252,
|
||||
ICON_253 = 253,
|
||||
ICON_254 = 254,
|
||||
ICON_255 = 255,
|
||||
ICON_255 = 255
|
||||
} GuiIconName;
|
||||
#endif
|
||||
|
||||
@ -1078,7 +1078,7 @@ typedef enum {
|
||||
|
||||
// Check if two rectangles are equal, used to validate a slider bounds as an id
|
||||
#ifndef CHECK_BOUNDS_ID
|
||||
#define CHECK_BOUNDS_ID(src, dst) ((src.x == dst.x) && (src.y == dst.y) && (src.width == dst.width) && (src.height == dst.height))
|
||||
#define CHECK_BOUNDS_ID(src, dst) (((int)src.x == (int)dst.x) && ((int)src.y == (int)dst.y) && ((int)src.width == (int)dst.width) && ((int)src.height == (int)dst.height))
|
||||
#endif
|
||||
|
||||
#if !defined(RAYGUI_NO_ICONS) && !defined(RAYGUI_CUSTOM_ICONS)
|
||||
@ -1091,7 +1091,7 @@ typedef enum {
|
||||
// Icons data is defined by bit array (every bit represents one pixel)
|
||||
// Those arrays are stored as unsigned int data arrays, so,
|
||||
// every array element defines 32 pixels (bits) of information
|
||||
// One icon is defined by 8 int, (8 int * 32 bit = 256 bit = 16*16 pixels)
|
||||
// One icon is defined by 8 int, (8 int*32 bit = 256 bit = 16*16 pixels)
|
||||
// NOTE: Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels)
|
||||
#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32)
|
||||
|
||||
@ -1341,22 +1341,22 @@ static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] =
|
||||
0x7fe00000, 0x402e4020, 0x43ce5e0a, 0x40504078, 0x438e4078, 0x402e5e0a, 0x7fe04020, 0x00000000, // ICON_SLICING
|
||||
0x00000000, 0x40027ffe, 0x47c24002, 0x55425d42, 0x55725542, 0x50125552, 0x10105016, 0x00001ff0, // ICON_MANUAL_CONTROL
|
||||
0x7ffe0000, 0x43c24002, 0x48124422, 0x500a500a, 0x500a500a, 0x44224812, 0x400243c2, 0x00007ffe, // ICON_COLLISION
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_234
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_235
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_236
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_237
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_238
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_239
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_240
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_241
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_242
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_243
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_244
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_245
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_246
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_247
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_248
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_249
|
||||
0x03c00000, 0x10080c30, 0x21842184, 0x4ff24182, 0x41824ff2, 0x21842184, 0x0c301008, 0x000003c0, // ICON_CIRCLE_ADD
|
||||
0x03c00000, 0x1ff80ff0, 0x3e7c3e7c, 0x700e7e7e, 0x7e7e700e, 0x3e7c3e7c, 0x0ff01ff8, 0x000003c0, // ICON_CIRCLE_ADD_FILL
|
||||
0x03c00000, 0x10080c30, 0x21842184, 0x41824182, 0x40024182, 0x21842184, 0x0c301008, 0x000003c0, // ICON_CIRCLE_WARNING
|
||||
0x03c00000, 0x1ff80ff0, 0x3e7c3e7c, 0x7e7e7e7e, 0x7ffe7e7e, 0x3e7c3e7c, 0x0ff01ff8, 0x000003c0, // ICON_CIRCLE_WARNING_FILL
|
||||
0x00000000, 0x10041ffc, 0x10841004, 0x13e41084, 0x10841084, 0x10041004, 0x00001ffc, 0x00000000, // ICON_BOX_MORE
|
||||
0x00000000, 0x1ffc1ffc, 0x1f7c1ffc, 0x1c1c1f7c, 0x1f7c1f7c, 0x1ffc1ffc, 0x00001ffc, 0x00000000, // ICON_BOX_MORE_FILL
|
||||
0x00000000, 0x1ffc1ffc, 0x1ffc1ffc, 0x1c1c1ffc, 0x1ffc1ffc, 0x1ffc1ffc, 0x00001ffc, 0x00000000, // ICON_BOX_MINUS
|
||||
0x00000000, 0x10041ffc, 0x10041004, 0x13e41004, 0x10041004, 0x10041004, 0x00001ffc, 0x00000000, // ICON_BOX_MINUS_FILL
|
||||
0x07fe0000, 0x055606aa, 0x7ff606aa, 0x55766eba, 0x55766eaa, 0x55606ffe, 0x55606aa0, 0x00007fe0, // ICON_UNION
|
||||
0x07fe0000, 0x04020402, 0x7fe20402, 0x456246a2, 0x456246a2, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_INTERSECTION
|
||||
0x07fe0000, 0x055606aa, 0x7ff606aa, 0x4436442a, 0x4436442a, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_DIFFERENCE
|
||||
0x03c00000, 0x10080c30, 0x20042004, 0x60064002, 0x47e2581a, 0x20042004, 0x0c301008, 0x000003c0, // ICON_SPHERE
|
||||
0x03e00000, 0x08080410, 0x0c180808, 0x08080be8, 0x08080808, 0x08080808, 0x04100808, 0x000003e0, // ICON_CYLINDER
|
||||
0x00800000, 0x01400140, 0x02200220, 0x04100410, 0x08080808, 0x1c1c13e4, 0x08081004, 0x000007f0, // ICON_CONE
|
||||
0x00000000, 0x07e00000, 0x20841918, 0x40824082, 0x40824082, 0x19182084, 0x000007e0, 0x00000000, // ICON_ELLIPSOID
|
||||
0x00000000, 0x00000000, 0x20041ff8, 0x40024002, 0x40024002, 0x1ff82004, 0x00000000, 0x00000000, // ICON_CAPSULE
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_250
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_251
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_252
|
||||
@ -1743,7 +1743,7 @@ int GuiPanel(Rectangle bounds, const char *text)
|
||||
// NOTE: Using GuiToggle() for the TABS
|
||||
int GuiTabBar(Rectangle bounds, const char **text, int count, int *active)
|
||||
{
|
||||
#define RAYGUI_TABBAR_ITEM_WIDTH 160
|
||||
#define RAYGUI_TABBAR_ITEM_WIDTH 148
|
||||
|
||||
int result = -1;
|
||||
//GuiState state = guiState;
|
||||
@ -1776,12 +1776,12 @@ int GuiTabBar(Rectangle bounds, const char **text, int count, int *active)
|
||||
if (i == (*active))
|
||||
{
|
||||
toggle = true;
|
||||
GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle);
|
||||
GuiToggle(tabBounds, text[i], &toggle);
|
||||
}
|
||||
else
|
||||
{
|
||||
toggle = false;
|
||||
GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle);
|
||||
GuiToggle(tabBounds, text[i], &toggle);
|
||||
if (toggle) *active = i;
|
||||
}
|
||||
|
||||
@ -2506,7 +2506,7 @@ int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode)
|
||||
int result = 0;
|
||||
GuiState state = guiState;
|
||||
|
||||
bool multiline = false; // TODO: Consider multiline text input
|
||||
bool multiline = false; // TODO: Consider multiline text input
|
||||
int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE);
|
||||
|
||||
Rectangle textBounds = GetTextBounds(TEXTBOX, bounds);
|
||||
@ -2514,7 +2514,7 @@ int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode)
|
||||
int thisCursorIndex = textBoxCursorIndex;
|
||||
if (thisCursorIndex > textLength) thisCursorIndex = textLength;
|
||||
int textWidth = GuiGetTextWidth(text) - GuiGetTextWidth(text + thisCursorIndex);
|
||||
int textIndexOffset = 0; // Text index offset to start drawing in the box
|
||||
int textIndexOffset = 0; // Text index offset to start drawing in the box
|
||||
|
||||
// Cursor rectangle
|
||||
// NOTE: Position X value should be updated
|
||||
@ -2692,8 +2692,8 @@ int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode)
|
||||
{
|
||||
int offset = textBoxCursorIndex;
|
||||
int accCodepointSize = 0;
|
||||
int prevCodepointSize;
|
||||
int prevCodepoint;
|
||||
int prevCodepointSize = 0;
|
||||
int prevCodepoint = 0;
|
||||
|
||||
// Check whitespace to delete (ASCII only)
|
||||
while (offset > 0)
|
||||
@ -2744,8 +2744,8 @@ int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode)
|
||||
{
|
||||
int offset = textBoxCursorIndex;
|
||||
//int accCodepointSize = 0;
|
||||
int prevCodepointSize;
|
||||
int prevCodepoint;
|
||||
int prevCodepointSize = 0;
|
||||
int prevCodepoint = 0;
|
||||
|
||||
// Check whitespace to skip (ASCII only)
|
||||
while (offset > 0)
|
||||
@ -3033,7 +3033,7 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
||||
int result = 0;
|
||||
GuiState state = guiState;
|
||||
|
||||
char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0";
|
||||
char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = { 0 };
|
||||
snprintf(textValue, RAYGUI_VALUEBOX_MAX_CHARS + 1, "%i", *value);
|
||||
|
||||
Rectangle textBounds = { 0 };
|
||||
@ -3051,7 +3051,6 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
||||
if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode)
|
||||
{
|
||||
Vector2 mousePoint = GetMousePosition();
|
||||
|
||||
bool valueHasChanged = false;
|
||||
|
||||
if (editMode)
|
||||
@ -3070,7 +3069,7 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
||||
keyCount--;
|
||||
valueHasChanged = true;
|
||||
}
|
||||
else if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS -1)
|
||||
else if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS)
|
||||
{
|
||||
if (keyCount == 0)
|
||||
{
|
||||
@ -3087,30 +3086,26 @@ int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, in
|
||||
}
|
||||
}
|
||||
|
||||
// Only allow keys in range [48..57]
|
||||
if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS)
|
||||
// Add new digit to text value
|
||||
if ((keyCount >= 0) && (keyCount < RAYGUI_VALUEBOX_MAX_CHARS) && (GuiGetTextWidth(textValue) < bounds.width))
|
||||
{
|
||||
if (GuiGetTextWidth(textValue) < bounds.width)
|
||||
int key = GetCharPressed();
|
||||
|
||||
// Only allow keys in range [48..57]
|
||||
if ((key >= 48) && (key <= 57))
|
||||
{
|
||||
int key = GetCharPressed();
|
||||
if ((key >= 48) && (key <= 57))
|
||||
{
|
||||
textValue[keyCount] = (char)key;
|
||||
keyCount++;
|
||||
valueHasChanged = true;
|
||||
}
|
||||
textValue[keyCount] = (char)key;
|
||||
keyCount++;
|
||||
valueHasChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete text
|
||||
if (keyCount > 0)
|
||||
if ((keyCount > 0) && IsKeyPressed(KEY_BACKSPACE))
|
||||
{
|
||||
if (IsKeyPressed(KEY_BACKSPACE))
|
||||
{
|
||||
keyCount--;
|
||||
textValue[keyCount] = '\0';
|
||||
valueHasChanged = true;
|
||||
}
|
||||
keyCount--;
|
||||
textValue[keyCount] = '\0';
|
||||
valueHasChanged = true;
|
||||
}
|
||||
|
||||
if (valueHasChanged) *value = TextToInteger(textValue);
|
||||
@ -4236,7 +4231,7 @@ int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, co
|
||||
// Grid control
|
||||
// NOTE: Returns grid mouse-hover selected cell
|
||||
// About drawing lines at subpixel spacing, simple put, not easy solution:
|
||||
// https://stackoverflow.com/questions/4435450/2d-opengl-drawing-lines-that-dont-exactly-fit-pixel-raster
|
||||
// REF: https://stackoverflow.com/questions/4435450/2d-opengl-drawing-lines-that-dont-exactly-fit-pixel-raster
|
||||
int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell)
|
||||
{
|
||||
// Grid lines alpha amount
|
||||
@ -5081,28 +5076,21 @@ static const char **GetTextLines(const char *text, int *count)
|
||||
static const char *lines[RAYGUI_MAX_TEXT_LINES] = { 0 };
|
||||
for (int i = 0; i < RAYGUI_MAX_TEXT_LINES; i++) lines[i] = NULL; // Init NULL pointers to substrings
|
||||
|
||||
int textSize = (int)strlen(text);
|
||||
int textLength = (int)strlen(text);
|
||||
|
||||
lines[0] = text;
|
||||
int len = 0;
|
||||
*count = 1;
|
||||
//int lineSize = 0; // Stores current line size, not returned
|
||||
|
||||
for (int i = 0, k = 0; (i < textSize) && (*count < RAYGUI_MAX_TEXT_LINES); i++)
|
||||
for (int i = 0, k = 0; (i < textLength) && (*count < RAYGUI_MAX_TEXT_LINES); i++)
|
||||
{
|
||||
if (text[i] == '\n')
|
||||
{
|
||||
//lineSize = len;
|
||||
k++;
|
||||
lines[k] = &text[i + 1]; // WARNING: next value is valid?
|
||||
len = 0;
|
||||
lines[k] = &text[i + 1]; // WARNING: next value is valid?
|
||||
*count += 1;
|
||||
}
|
||||
else len++;
|
||||
}
|
||||
|
||||
//lines[*count - 1].size = len;
|
||||
|
||||
return lines;
|
||||
}
|
||||
|
||||
@ -5878,7 +5866,7 @@ static int TextToInteger(const char *text)
|
||||
text++;
|
||||
}
|
||||
|
||||
for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); ++i) value = value*10 + (int)(text[i] - '0');
|
||||
for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); i++) value = value*10 + (int)(text[i] - '0');
|
||||
|
||||
return value*sign;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user