From 8de6bf1d63bf585b32a8f32065b8173bdb3f3a8f Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 19 Apr 2023 16:38:30 +0200 Subject: [PATCH] REVIEWED: `GuiTextBox()` cursor automovement on key down REMOVED: `GuiTextBoxMulti()` --- .../controls_test_suite/controls_test_suite.c | 3 +- examples/standalone/raygui_custom_backend.h | 16 +- examples/style_selector/style_selector.c | 1 - src/raygui.h | 314 ++++-------------- 4 files changed, 67 insertions(+), 267 deletions(-) diff --git a/examples/controls_test_suite/controls_test_suite.c b/examples/controls_test_suite/controls_test_suite.c index acf7d6b..ed51430 100644 --- a/examples/controls_test_suite/controls_test_suite.c +++ b/examples/controls_test_suite/controls_test_suite.c @@ -12,7 +12,6 @@ * - GuiComboBox() * - GuiListView() * - GuiToggleGroup() -* - GuiTextBoxMulti() * - GuiColorPicker() * - GuiSlider() * - GuiSliderBar() @@ -189,7 +188,7 @@ int main() toggleGroupActive = GuiToggleGroup((Rectangle){ 165, 400, 140, 25 }, "#1#ONE\n#3#TWO\n#8#THREE\n#23#", toggleGroupActive); // Third GUI column - if (GuiTextBoxMulti((Rectangle){ 320, 25, 225, 140 }, multiTextBoxText, 256, multiTextBoxEditMode)) multiTextBoxEditMode = !multiTextBoxEditMode; + //if (GuiTextBoxMulti((Rectangle){ 320, 25, 225, 140 }, multiTextBoxText, 256, multiTextBoxEditMode)) multiTextBoxEditMode = !multiTextBoxEditMode; colorPickerValue = GuiColorPicker((Rectangle){ 320, 185, 196, 192 }, NULL, colorPickerValue); sliderValue = GuiSlider((Rectangle){ 355, 400, 165, 20 }, "TEST", TextFormat("%2.2f", (float)sliderValue), sliderValue, -50, 100); diff --git a/examples/standalone/raygui_custom_backend.h b/examples/standalone/raygui_custom_backend.h index 0a8aae4..e430d15 100644 --- a/examples/standalone/raygui_custom_backend.h +++ b/examples/standalone/raygui_custom_backend.h @@ -94,7 +94,7 @@ static bool IsKeyPressed(int key) return false; } -// USED IN: GuiTextBox(), GuiTextBoxMulti(), GuiValueBox() +// USED IN: GuiTextBox(), GuiValueBox() static int GetKeyPressed(void) { // TODO: Return last key pressed (up->down) in the frame @@ -122,18 +122,6 @@ static void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color) // TODO: Draw triangle on the screen, required for arrows } -// USED IN: GuiImageButtonEx() -static void DrawTextureRec(Texture2D texture, Rectangle sourceRec, Vector2 position, Color tint) -{ - // TODO: Draw texture (piece defined by source rectangle) on screen -} - -// USED IN: GuiTextBoxMulti() -static void DrawTextRec(Font font, const char *text, Rectangle rec, float fontSize, float spacing, bool wordWrap, Color tint) -{ - // TODO: Draw text limited by a rectangle. This advance function wraps the text inside the rectangle -} - //------------------------------------------------------------------------------- // Text required functions //------------------------------------------------------------------------------- @@ -147,7 +135,7 @@ static Font GetFontDefault(void) return font; } -// USED IN: GetTextWidth(), GuiTextBoxMulti() +// USED IN: GetTextWidth() static Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing) { Vector2 size = { 0 }; diff --git a/examples/style_selector/style_selector.c b/examples/style_selector/style_selector.c index f1aeb19..99dd615 100644 --- a/examples/style_selector/style_selector.c +++ b/examples/style_selector/style_selector.c @@ -12,7 +12,6 @@ * - GuiComboBox() * - GuiListView() * - GuiToggleGroup() -* - GuiTextBoxMulti() * - GuiColorPicker() * - GuiSlider() * - GuiSliderBar() diff --git a/src/raygui.h b/src/raygui.h index 679c006..9f6d2f1 100644 --- a/src/raygui.h +++ b/src/raygui.h @@ -40,7 +40,6 @@ * - ComboBox * - DropdownBox * - TextBox -* - TextBoxMulti * - ValueBox --> TextBox * - Spinner --> Button, ValueBox * - Slider @@ -131,10 +130,10 @@ * ADDED: Helper functions to split text in separate lines * ADDED: Multiple new icons, useful for code editing tools * REMOVED: Unneeded icon editing functions +* REMOVED: GuiTextBoxMulti(), very limited and broken * REMOVED: MeasureTextEx() dependency, logic directly implemented * REMOVED: DrawTextEx() dependency, logic directly implemented * REDESIGNED: GuiTextBox() to support cursor movement -* REDESIGNED: GuiTextBoxMulti() to support cursor movement * REDESIGNED: GuiDrawText() to divide drawing by lines * 3.2 (22-May-2022) RENAMED: Some enum values, for unification, avoiding prefixes * REMOVED: GuiScrollBar(), only internal @@ -566,7 +565,6 @@ RAYGUIAPI bool GuiDropdownBox(Rectangle bounds, const char *text, int *active, b RAYGUIAPI bool GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control, returns selected value RAYGUIAPI bool GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers RAYGUIAPI bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text -RAYGUIAPI bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control with multiple lines RAYGUIAPI float GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue); // Slider control, returns selected value RAYGUIAPI float GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue); // Slider Bar control, returns selected value RAYGUIAPI float GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float value, float minValue, float maxValue); // Progress Bar control, shows current progress value @@ -884,7 +882,7 @@ typedef enum { #include // Required for: FILE, fopen(), fclose(), fprintf(), feof(), fscanf(), vsprintf() [GuiLoadStyle(), GuiLoadIcons()] #include // Required for: malloc(), calloc(), free() [GuiLoadStyle(), GuiLoadIcons()] -#include // Required for: strlen() [GuiTextBox(), GuiTextBoxMulti(), GuiValueBox()], memset(), memcpy() +#include // Required for: strlen() [GuiTextBox(), GuiValueBox()], memset(), memcpy() #include // Required for: va_list, va_start(), vfprintf(), va_end() [TextFormat()] #include // Required for: roundf() [GuiColorPicker()] @@ -1212,9 +1210,9 @@ static bool guiTooltip = false; // Tooltip enabled/disabled static const char *guiTooltipPtr = NULL; // Tooltip string pointer (string provided by user) static unsigned int textBoxCursorIndex = 0; // Cursor index, shared by all GuiTextBox*() -//static int blinkCursorFrameCounter = 0; // Frame counter for cursor blinking -static int autoCursorFrameCounter = 0; // Frame counter for automatic cursor movement on key-down -static bool autoCursorMode = false; // Flag to note auto-cursor activation +//static int blinkCursorFrameCounter = 0; // Frame counter for cursor blinking +static int autoCursorCooldownCounter = 0; // Cooldown frame counter for automatic cursor movement on key-down +static int autoCursorDelayCounter = 0; // Delay frame counter for automatic cursor movement //---------------------------------------------------------------------------------- // Style data array for all gui style properties (allocated on data segment by default) @@ -1259,7 +1257,7 @@ static bool IsMouseButtonReleased(int button); static bool IsKeyDown(int key); static bool IsKeyPressed(int key); -static int GetCharPressed(void); // -- GuiTextBox(), GuiTextBoxMulti(), GuiValueBox() +static int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() //------------------------------------------------------------------------------- // Drawing required functions @@ -2117,7 +2115,8 @@ bool GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMo // NOTE: Returns true on ENTER pressed (useful for data validation) bool GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode) { - #define MAX_AUTO_CURSOR_FRAME_RATE 40 // Frames to wait for autocursor movement + #define AUTO_CURSOR_COOLDOWN 40 // Frames to wait for autocursor movement + #define AUTO_CURSOR_DELAY 3 // Frames delay for autocursor movement GuiState state = guiState; bool pressed = false; @@ -2151,15 +2150,11 @@ bool GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode) // Auto-cursor movement logic // NOTE: Cursor moves automatically when key down after some time - if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_UP) || IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_BACKSPACE)) - { - autoCursorFrameCounter++; - if (autoCursorFrameCounter > MAX_AUTO_CURSOR_FRAME_RATE) autoCursorMode = true; - } + if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_UP) || IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_BACKSPACE)) autoCursorCooldownCounter++; else { - autoCursorMode = false; - autoCursorFrameCounter = 0; + autoCursorCooldownCounter = 0; // GLOBAL: Cursor cooldown counter + autoCursorDelayCounter = 0; // GLOBAL: Cursor delay counter } // Blink-cursor frame counter @@ -2190,6 +2185,7 @@ bool GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode) int textLength = (int)strlen(text); // Get current text length int codepoint = GetCharPressed(); // Get Unicode codepoint + if (multiline && IsKeyPressed(KEY_ENTER)) codepoint = (int)'\n'; // Encode codepoint as UTF-8 int codepointSize = 0; @@ -2197,7 +2193,7 @@ bool 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 ((codepoint >= 32) && ((textLength + codepointSize) < bufferSize)) + if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < bufferSize)) { // Move forward data from cursor position for (int i = (textLength + codepointSize); i > textBoxCursorIndex; i--) text[i] = text[i - codepointSize]; @@ -2213,45 +2209,66 @@ bool GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode) } // Delete codepoint from text, at current cursor position - if ((textLength > 0) && (IsKeyPressed(KEY_BACKSPACE) || (autoCursorMode && IsKeyDown(KEY_BACKSPACE)))) + if ((textLength > 0) && (IsKeyPressed(KEY_BACKSPACE) || (IsKeyDown(KEY_BACKSPACE) && (autoCursorCooldownCounter >= AUTO_CURSOR_COOLDOWN)))) { - int prevCodepointSize = 0; - GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); + autoCursorDelayCounter++; - // Move backward text from cursor position - for (int i = (textBoxCursorIndex - prevCodepointSize); i < textLength; i++) text[i] = text[i + prevCodepointSize]; + if (IsKeyPressed(KEY_BACKSPACE) || (autoCursorDelayCounter%AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames + { + int prevCodepointSize = 0; + GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); - textBoxCursorIndex -= codepointSize; - textLength -= codepointSize; - - // Make sure text last character is EOL - text[textLength] = '\0'; + // Move backward text from cursor position + for (int i = (textBoxCursorIndex - prevCodepointSize); i < textLength; i++) text[i] = text[i + prevCodepointSize]; + + textBoxCursorIndex -= codepointSize; + textLength -= codepointSize; + + // Make sure text last character is EOL + text[textLength] = '\0'; + } } // Move cursor position with keys - if (IsKeyPressed(KEY_LEFT) || (autoCursorMode && IsKeyDown(KEY_LEFT))) + //if (IsKeyDown(KEY_LEFT) && autoCursorMode) + if (IsKeyPressed(KEY_LEFT) || (IsKeyDown(KEY_LEFT) && (autoCursorCooldownCounter > AUTO_CURSOR_COOLDOWN))) { - int prevCodepointSize = 0; - GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); + autoCursorDelayCounter++; - if (textBoxCursorIndex >= prevCodepointSize) textBoxCursorIndex -= prevCodepointSize; + if (IsKeyPressed(KEY_LEFT) || (autoCursorDelayCounter%AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames + { + int prevCodepointSize = 0; + GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); + + if (textBoxCursorIndex >= prevCodepointSize) textBoxCursorIndex -= prevCodepointSize; + } } - else if (IsKeyPressed(KEY_RIGHT) || (autoCursorMode && IsKeyDown(KEY_RIGHT))) + else if (IsKeyPressed(KEY_RIGHT) || (IsKeyDown(KEY_RIGHT) && (autoCursorCooldownCounter > AUTO_CURSOR_COOLDOWN))) { - int nextCodepointSize = 0; - GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); + autoCursorDelayCounter++; - if ((textBoxCursorIndex + nextCodepointSize) <= textLength) textBoxCursorIndex += nextCodepointSize; + if (IsKeyPressed(KEY_RIGHT) || (autoCursorDelayCounter%AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames + { + int nextCodepointSize = 0; + GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); + + if ((textBoxCursorIndex + nextCodepointSize) <= textLength) textBoxCursorIndex += nextCodepointSize; + } } - // TODO: Move cursor position with mouse + // TODO: Get cursor rectangle from mouse position + //cursor = GetCursorFromMousePosition(bounds, text, mouse); // Gui style considered internally, including wrapMode - // Recalculate cursor rectangle X position depending on textBoxCursorIndex + // TODO: Get cursor rectangle from buffer index + //cursor = GetCursorFromIndex(bounds, text, index); // Gui style considered internally, including wrapMode + + // Recalculate cursor position.y depending on textBoxCursorIndex cursor.x = bounds.x + GuiGetStyle(TEXTBOX, TEXT_PADDING) + GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex) + GuiGetStyle(DEFAULT, TEXT_SPACING); + //if (multiline) cursor.y = GetTextLines() - - // Finish text editing on ENTER or mouse click outside bounds - if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) + // Finish text editing on ENTER (if not multiline mode) or mouse click outside bounds + if ((!multiline && IsKeyPressed(KEY_ENTER)) || + (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) { pressed = true; // Exiting edit mode textBoxCursorIndex = 0; // GLOBAL: Reset the shared cursor index @@ -2301,7 +2318,10 @@ bool GuiTextBox(Rectangle bounds, char *text, int bufferSize, bool editMode) return pressed; } +/* // Text Box control with multiple lines +// NOTE: It's a regular GuiTextBox() but enabling multiline support, +// unfortunately cursor placement is not working properly so the function is removed bool GuiTextBoxMulti(Rectangle bounds, char *text, int bufferSize, bool editMode) { bool pressed = false; @@ -2309,220 +2329,14 @@ bool GuiTextBoxMulti(Rectangle bounds, char *text, int bufferSize, bool editMode GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT_VERTICAL, 1); GuiSetStyle(TEXTBOX, TEXT_MULTILINE, 1); - pressed = GuiTextBox(bounds, text, bufferSize, editMode); + pressed = GuiTextBox(bounds, text, bufferSize, editMode); // TODO: Implement methods to calculate cursor position properly GuiSetStyle(TEXTBOX, TEXT_MULTILINE, 0); GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT_VERTICAL, 0); return pressed; - /* - GuiState state = guiState; - bool pressed = false; - - Rectangle textBounds = GetTextBounds(TEXTBOX, bounds); - int textWidth = GetTextWidth(text) - GetTextWidth(text + textBoxCursorIndex); - int textIndexOffset = 0; // Text index offset to start drawing in the box - - // Cursor rectangle - // NOTE: Position values [x, y] should be updated - Rectangle cursor = { 0, -1, 2, (float)GuiGetStyle(DEFAULT, TEXT_SIZE) + 4 }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (editMode) - { - state = STATE_PRESSED; - - int textLength = (int)strlen(text); // Get current text length - int codepoint = GetCharPressed(); // Get Unicode codepoint - if (IsKeyPressed(KEY_ENTER)) codepoint = (int)'\n'; - - // Encode codepoint as UTF-8 - int codepointSize = 0; - const char *charEncoded = CodepointToUTF8(codepoint, &codepointSize); - - // Introduce characters - if (((codepoint == 10) || (codepoint >= 32)) && (textLength + codepointSize) < bufferSize) - { - // Move forward data from cursor position - for (int i = (textLength + codepointSize); i > textBoxCursorIndex; i--) text[i] = text[i - codepointSize]; - - // Add new codepoint in current cursor position - for (int i = 0; i < codepointSize; i++) text[textBoxCursorIndex + i] = charEncoded[i]; - - textBoxCursorIndex += codepointSize; - textLength += codepointSize; - - // Make sure text last character is EOL - text[textLength] = '\0'; - } - - // Delete codepoint from text, at current cursor position - if ((textLength > 0) && IsKeyPressed(KEY_BACKSPACE)) - { - int prevCodepointSize = 0; - GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); - - // Move backward text from cursor position - for (int i = (textBoxCursorIndex - prevCodepointSize); i < textLength; i++) text[i] = text[i + prevCodepointSize]; - - textBoxCursorIndex -= codepointSize; - textLength -= codepointSize; - - // Make sure text last character is EOL - text[textLength] = '\0'; - } - - // Move cursor position with keys - if (IsKeyPressed(KEY_LEFT)) - { - int prevCodepointSize = 0; - GetCodepointPrevious(text + textBoxCursorIndex, &prevCodepointSize); - - if (textBoxCursorIndex >= prevCodepointSize) textBoxCursorIndex -= prevCodepointSize; - } - else if (IsKeyPressed(KEY_RIGHT)) - { - int nextCodepointSize = 0; - GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); - - if ((textBoxCursorIndex + nextCodepointSize) <= textLength) textBoxCursorIndex += nextCodepointSize; - } - - // TODO: Move cursor position with mouse - - // TODO: Recalculate cursor position depending on textBoxCursorIndex - char *lastTextBreak = text; - - // Update cursor.y position considering line breaks - cursor.y = textBounds.y - 2; // -lineCount/2; // Move to centered text - for (int i = 0; i < textBoxCursorIndex; i++) - { - if (text[i] == '\n') - { - cursor.y += (GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + GuiGetStyle(TEXTBOX, TEXT_LINES_SPACING)/2); - cursor.x = textBounds.x; - lastTextBreak = &text[i + 1]; - } - } - - cursor.x = textBounds.x + GetTextWidth(lastTextBreak) - GetTextWidth(lastTextBreak + textBoxCursorIndex); - - - - // Exit edit mode - if (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - pressed = true; // Exiting edit mode - textBoxCursorIndex = 0; // GLOBAL: Reset the shared cursor index - } - } - else - { - if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - pressed = true; // Entering edit mode - textBoxCursorIndex = strlen(text); // GLOBAL: Place cursor index to the end of current text - } - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_PRESSED) - { - GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED)), guiAlpha)); - } - else if (state == STATE_DISABLED) - { - GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED)), guiAlpha)); - } - else GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), guiAlpha), BLANK); - - // Draw text inside bounds - GuiDrawText(text, textBounds, GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))), guiAlpha)); - - // Draw text logic - /* - int wrapMode = 1; // 0-No wrap, 1-Char wrap, 2-Word wrap - Vector2 cursorPos = { textBounds.x, textBounds.y }; - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize; // Character rectangle scaling factor - - for (int i = 0, codepointSize = 0; (text != NULL) && (text[i] != '\0'); i += codepointSize) - { - int codepoint = GetCodepointNext(text + i, &codepointSize); - int index = GetGlyphIndex(guiFont, codepoint); - Rectangle glyphRec = guiFont.recs[index]; - GlyphInfo glyphInfo = guiFont.glyphs[index]; // Glyph measures - - if ((codepointSize == 1) && (codepoint == '\n')) - { - cursorPos.y += (guiFont.baseSize*scaleFactor + GuiGetStyle(TEXTBOX, TEXT_LINES_SPACING)); // Line feed - cursorPos.x = textBounds.x; // Carriage return - } - else - { - if (wrapMode == 1) - { - int glyphWidth = 0; - if (glyphInfo.advanceX != 0) glyphWidth += glyphInfo.advanceX; - else glyphWidth += (int)(glyphRec.width + glyphInfo.offsetX); - - // Jump line if the end of the text box area has been reached - if ((cursorPos.x + (glyphWidth*scaleFactor)) > (textBounds.x + textBounds.width)) - { - cursorPos.y += (guiFont.baseSize*scaleFactor + GuiGetStyle(TEXTBOX, TEXT_LINES_SPACING)); // Line feed - cursorPos.x = textBounds.x; // Carriage return - } - } - else if (wrapMode == 2) - { - if ((codepointSize == 1) && (codepoint == ' ')) - { - lastSpacePos = i; - lastSpaceWidth = 0; - lastSpaceCursorPos = cursorPos.x; - } - - // Jump line if last word reaches end of text box area - if ((lastSpaceCursorPos + lastSpaceWidth) > (textAreaBounds.x + textAreaBounds.width)) - { - cursorPos.y += 12; // Line feed - cursorPos.x = textAreaBounds.x; // Carriage return - } - } - - // Draw current character glyph - DrawTextCodepoint(guiFont, codepoint, cursorPos, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), Fade(GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))), guiAlpha)); - - int glyphWidth = 0; - if (glyphInfo.advanceX != 0) glyphWidth += glyphInfo.advanceX; - else glyphWidth += (int)(glyphRec.width + glyphInfo.offsetX); - - cursorPos.x += (glyphWidth*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - //if (i > lastSpacePos) lastSpaceWidth += (atlasRec.width + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - } - - cursor.x = cursorPos.x; - cursor.y = cursorPos.y; - - - // Draw cursor position considering text glyphs - if (editMode) GuiDrawRectangle(cursor, 0, BLANK, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha)); - //-------------------------------------------------------------------- - */ } +*/ // Spinner control, returns selected value bool GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) @@ -4136,7 +3950,7 @@ static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color if ((text != NULL) && (text[0] != '\0')) { // Get text lines ('\n' delimiter) to process lines individually - // NOTE: We can't use GuiTextSplit() because it can be already use before calling + // NOTE: We can't use GuiTextSplit() because it can be already used before calling // GuiDrawText() and static buffer would be overriden :( int lineCount = 0; const char **lines = GetTextLines(text, &lineCount); @@ -4224,7 +4038,7 @@ static void GuiDrawText(const char *text, Rectangle bounds, int alignment, Color { if ((codepoint != ' ') && (codepoint != '\t')) { - // TODO: Draw only required text glyphs fitting the bounds.width, '...' can be appended at the end of the text + // Draw only required text glyphs fitting the bounds.width if (textOffsetX < (bounds.width - guiFont.recs[index].width)) { DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ position.x + textOffsetX, position.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), tint);