diff --git a/src/raygui.h b/src/raygui.h index 59289ed..68c7523 100644 --- a/src/raygui.h +++ b/src/raygui.h @@ -116,6 +116,7 @@ * 3.0 (xx-Sep-2021) Integrated ricons data to avoid external file * REDESIGNED: GuiTextBoxMulti() * REMOVED: GuiImageButton*() +* Multiple minor tweaks and bugs corrected * 2.9 (17-Mar-2021) REMOVED: Tooltip API * 2.8 (03-May-2020) Centralized rectangles drawing to GuiDrawRectangle() * 2.7 (20-Feb-2020) ADDED: Possible tooltips API @@ -238,7 +239,7 @@ float y; } Vector2; - // Vector3 type + // Vector3 type // -- ConvertHSVtoRGB(), ConvertRGBtoHSV() typedef struct Vector3 { float x; float y; @@ -536,7 +537,7 @@ RAYGUIAPI const char *GuiIconText(int iconId, const char *text); // Get text wit #if !defined(RAYGUI_NO_RICONS) // Gui icons functionality -RAYGUIAPI void GuiDrawIcon(int iconId, Vector2 position, int pixelSize, Color color); +RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); RAYGUIAPI unsigned int *GuiGetIcons(void); // Get full icons data pointer RAYGUIAPI unsigned int *GuiGetIconData(int iconId); // Get icon bit data @@ -712,12 +713,12 @@ typedef enum { RICON_CROSS = 113, RICON_ARROW_LEFT = 114, RICON_ARROW_RIGHT = 115, - RICON_ARROW_BOTTOM = 116, - RICON_ARROW_TOP = 117, + RICON_ARROW_DOWN = 116, + RICON_ARROW_UP = 117, RICON_ARROW_LEFT_FILL = 118, RICON_ARROW_RIGHT_FILL = 119, - RICON_ARROW_BOTTOM_FILL = 120, - RICON_ARROW_TOP_FILL = 121, + RICON_ARROW_DOWN_FILL = 120, + RICON_ARROW_UP_FILL = 121, RICON_AUDIO = 122, RICON_FX = 123, RICON_WAVE = 124, @@ -982,12 +983,12 @@ static unsigned int guiIcons[RICON_MAX_ICONS*RICON_DATA_ELEMENTS] = { 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // RICON_CROSS 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // RICON_ARROW_LEFT 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // RICON_ARROW_RIGHT - 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // RICON_ARROW_BOTTOM - 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // RICON_ARROW_TOP + 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // RICON_ARROW_DOWN + 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // RICON_ARROW_UP 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // RICON_ARROW_LEFT_FILL 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // RICON_ARROW_RIGHT_FILL - 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // RICON_ARROW_BOTTOM_FILL - 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // RICON_ARROW_TOP_FILL + 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // RICON_ARROW_DOWN_FILL + 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // RICON_ARROW_UP_FILL 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // RICON_AUDIO 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // RICON_FX 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // RICON_WAVE @@ -1187,7 +1188,7 @@ static bool guiStyleLoaded = false; // Style loaded flag for lazy style init // Input required functions //------------------------------------------------------------------------------- static Vector2 GetMousePosition(void); -static int GetMouseWheelMove(void); +static float GetMouseWheelMove(void); static bool IsMouseButtonDown(int button); static bool IsMouseButtonPressed(int button); static bool IsMouseButtonReleased(int button); @@ -1201,24 +1202,20 @@ static int GetCharPressed(void); // -- GuiTextBox(), GuiTextBoxMulti(), //------------------------------------------------------------------------------- static void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle(), GuiDrawIcon() -static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() -static void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // -- GuiDropdownBox(), GuiScrollBar() - -//static void DrawTextBoxed(Font font, const char *text, Rectangle rec, float fontSize, float spacing, bool wordWrap, Color tint); // -- GuiTextBoxMulti() +static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() //------------------------------------------------------------------------------- // Text required functions //------------------------------------------------------------------------------- +static Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount); // -- GuiLoadStyle() static Font GetFontDefault(void); // -- GuiLoadStyleDefault() static Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle() static void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle() - -static Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // -- GetTextWidth(), GuiTextBoxMulti() -static void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // -- GuiDrawText() - -static Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount); // -- GuiLoadStyle() static char *LoadFileText(const char *fileName); // -- GuiLoadStyle() static const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle() + +static Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // -- GetTextWidth(), GuiTextBoxMulti() +static void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // -- GuiDrawText() //------------------------------------------------------------------------------- // raylib functions already implemented in raygui @@ -1230,11 +1227,10 @@ static bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if static const char *TextFormat(const char *text, ...); // Formatting of text with variables to 'embed' static const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings static int TextToInteger(const char *text); // Get integer value from text +static int GetCodepoint(const char *text, int *bytesProcessed); // Get next codepoint in a UTF-8 encoded text +static const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode codepoint into UTF-8 text (char array size returned as parameter) static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2); // Draw rectangle vertical gradient - -static int GetCodepoint(const char *text, int *bytesProcessed); // Get next codepoint in a UTF-8 encoded text -static const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode codepoint into UTF-8 text (char array size returned as parameter) //------------------------------------------------------------------------------- #endif // RAYGUI_STANDALONE @@ -1932,15 +1928,15 @@ bool GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMo else GuiDrawText(items[i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL)), guiAlpha)); } } - - // TODO: Avoid DrawTriangle(), use icon or 'v' text instead - DrawTriangle(RAYGUI_CLITERAL(Vector2){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2 }, - RAYGUI_CLITERAL(Vector2){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING) + 5, bounds.y + bounds.height/2 - 2 + 5 }, - RAYGUI_CLITERAL(Vector2){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING) + 10, bounds.y + bounds.height/2 - 2 }, - Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); - - //GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 }, - // GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); + + // Draw arrows (using icon if available) +#if defined(RAYGUI_NO_RICONS) + GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); +#else + GuiDrawText("#120#", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 6, 10, 10 }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); // RICON_ARROW_DOWN_FILL +#endif //-------------------------------------------------------------------- *active = itemSelected; @@ -2693,45 +2689,20 @@ int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue) GuiDrawRectangle(scrollbar, 0, BLANK, Fade(GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL)), guiAlpha)); // Draw the scrollbar active area background GuiDrawRectangle(slider, 0, BLANK, Fade(GetColor(GuiGetStyle(SLIDER, BORDER + state*3)), guiAlpha)); // Draw the slider bar - // Draw arrows - const int padding = (spinnerSize - GuiGetStyle(SCROLLBAR, ARROWS_SIZE))/2; - const Vector2 lineCoords[] = - { - // Coordinates for < 0,1,2 - { arrowUpLeft.x + padding, arrowUpLeft.y + spinnerSize/2 }, - { arrowUpLeft.x + spinnerSize - padding, arrowUpLeft.y + padding }, - { arrowUpLeft.x + spinnerSize - padding, arrowUpLeft.y + spinnerSize - padding }, - - // Coordinates for > 3,4,5 - { arrowDownRight.x + padding, arrowDownRight.y + padding }, - { arrowDownRight.x + spinnerSize - padding, arrowDownRight.y + spinnerSize/2 }, - { arrowDownRight.x + padding, arrowDownRight.y + spinnerSize - padding }, - - // Coordinates for ∧ 6,7,8 - { arrowUpLeft.x + spinnerSize/2, arrowUpLeft.y + padding }, - { arrowUpLeft.x + padding, arrowUpLeft.y + spinnerSize - padding }, - { arrowUpLeft.x + spinnerSize - padding, arrowUpLeft.y + spinnerSize - padding }, - - // Coordinates for ∨ 9,10,11 - { arrowDownRight.x + padding, arrowDownRight.y + padding }, - { arrowDownRight.x + spinnerSize/2, arrowDownRight.y + spinnerSize - padding }, - { arrowDownRight.x + spinnerSize - padding, arrowDownRight.y + padding } - }; - - Color lineColor = Fade(GetColor(GuiGetStyle(BUTTON, TEXT + state*3)), guiAlpha); - + // Draw arrows (using icon if available) if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)) { - if (isVertical) - { - DrawTriangle(lineCoords[6], lineCoords[7], lineCoords[8], lineColor); - DrawTriangle(lineCoords[9], lineCoords[10], lineCoords[11], lineColor); - } - else - { - DrawTriangle(lineCoords[2], lineCoords[1], lineCoords[0], lineColor); - DrawTriangle(lineCoords[5], lineCoords[4], lineCoords[3], lineColor); - } +#if defined(RAYGUI_NO_RICONS) + GuiDrawText(isVertical? "^" : "<", RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); + GuiDrawText(isVertical? "v" : ">", RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3))), guiAlpha)); +#else + GuiDrawText(isVertical? "#121#" : "#118#", RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3)), guiAlpha)); // RICON_ARROW_UP_FILL / RICON_ARROW_LEFT_FILL + GuiDrawText(isVertical? "#120#" : "#119#", RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, + GUI_TEXT_ALIGN_CENTER, Fade(GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3)), guiAlpha)); // RICON_ARROW_DOWN_FILL / RICON_ARROW_RIGHT_FILL +#endif } //-------------------------------------------------------------------- @@ -3682,7 +3653,7 @@ char **GuiLoadIcons(const char *fileName, bool loadIconsName) } // Draw selected icon using rectangles pixel-by-pixel -void GuiDrawIcon(int iconId, Vector2 position, int pixelSize, Color color) +void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color) { #define BIT_CHECK(a,b) ((a) & (1<<(b))) @@ -3693,7 +3664,7 @@ void GuiDrawIcon(int iconId, Vector2 position, int pixelSize, Color color) if (BIT_CHECK(guiIcons[iconId*RICON_DATA_ELEMENTS + i], k)) { #if !defined(RAYGUI_STANDALONE) - DrawRectangle(position.x + (k%RICON_SIZE)*pixelSize, position.y + y*pixelSize, pixelSize, pixelSize, color); + DrawRectangle(posX + (k%RICON_SIZE)*pixelSize, posY + y*pixelSize, pixelSize, pixelSize, color); #endif } @@ -3754,13 +3725,15 @@ bool GuiCheckIconPixel(int iconId, int x, int y) // Module specific Functions Definition //---------------------------------------------------------------------------------- // Gui get text width using default font +// NOTE: Icon is not considered here static int GetTextWidth(const char *text) { Vector2 size = { 0 }; - if ((text != NULL) && (text[0] != '\0')) size = MeasureTextEx(guiFont, text, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - - // TODO: Consider text icon width here??? + if ((text != NULL) && (text[0] != '\0')) + { + size = MeasureTextEx(guiFont, text, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); + } return (int)size.x; } @@ -3815,7 +3788,7 @@ static const char *GetTextIcon(const char *text, int *iconId) *iconId = TextToInteger(iconValue); // Move text pointer after icon - // WARNING: If only icon provided, it could point to EOL character! + // WARNING: If only icon provided, it could point to EOL character: '\0' if (*iconId >= 0) text += (pos + 1); } } @@ -3832,7 +3805,7 @@ static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color if ((text != NULL) && (text[0] != '\0')) { int iconId = 0; - text = GetTextIcon(text, &iconId); // Check text for icon and move cursor + text = GetTextIcon(text, &iconId); // Check text for icon and move cursor // Get text position depending on alignment and iconId //--------------------------------------------------------------------------------- @@ -3840,7 +3813,7 @@ static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color Vector2 position = { bounds.x, bounds.y }; - // NOTE: We get text size after icon been processed + // NOTE: We get text size after icon has been processed int textWidth = GetTextWidth(text); int textHeight = GuiGetStyle(DEFAULT, TEXT_SIZE); @@ -3849,7 +3822,7 @@ static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color { textWidth += RICON_SIZE; - // WARNING: If only icon provided, text could be pointing to eof character! + // WARNING: If only icon provided, text could be pointing to EOF character: '\0' if ((text != NULL) && (text[0] != '\0')) textWidth += RICON_TEXT_PADDING; } @@ -3886,7 +3859,7 @@ static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color if (iconId >= 0) { // NOTE: We consider icon height, probably different than text size - GuiDrawIcon(iconId, RAYGUI_CLITERAL(Vector2){ position.x, bounds.y + bounds.height/2 - RICON_SIZE/2 + TEXT_VALIGN_PIXEL_OFFSET(bounds.height) }, 1, tint); + GuiDrawIcon(iconId, (int)position.x, (int)(bounds.y + bounds.height/2 - RICON_SIZE/2 + TEXT_VALIGN_PIXEL_OFFSET(bounds.height)), 1, tint); position.x += (RICON_SIZE + RICON_TEXT_PADDING); } #endif