diff --git a/src/raygui.h b/src/raygui.h index 9742b7b..10df554 100644 --- a/src/raygui.h +++ b/src/raygui.h @@ -1625,6 +1625,7 @@ static int GuiMeasureTextBox(const char *text, int length, Rectangle rec, int *p int i = 0, k = 0; int glyphWidth = 0; + for (i = 0; i < length; i++, k++) { glyphWidth = 0; @@ -1637,7 +1638,7 @@ static int GuiMeasureTextBox(const char *text, int length, Rectangle rec, int *p if (letter != '\n') { glyphWidth = (font.chars[index].advanceX == 0)? - (int)(font.chars[index].rec.width*scaleFactor + spacing): + (int)(font.recs[index].width*scaleFactor + spacing): (int)(font.chars[index].advanceX*scaleFactor + spacing); if ((textOffsetX + glyphWidth + 1) >= rec.width) break; @@ -1721,7 +1722,7 @@ static int GuiMeasureTextBoxRev(const char *text, int length, Rectangle rec, int if (letter != '\n') { glyphWidth = (font.chars[index].advanceX == 0)? - (int)(font.chars[index].rec.width*scaleFactor + spacing): + (int)(font.recs[index].width*scaleFactor + spacing): (int)(font.chars[index].advanceX*scaleFactor + spacing); if ((textOffsetX + glyphWidth + 1) >= rec.width) break; @@ -2663,6 +2664,13 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM GuiControlState state = guiState; bool pressed = false; + + Rectangle cursor = { + bounds.x + GuiGetStyle(TEXTBOX, INNER_PADDING) + GetTextWidth(text) + 2, + bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE), + 1, + GuiGetStyle(DEFAULT, TEXT_SIZE)*2 + }; // Update control //-------------------------------------------------------------------- @@ -2712,9 +2720,15 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM if (keyCount < 0) keyCount = 0; } } + + if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(0))) pressed = true; + + // Check text alignment to position cursor properly + int textAlignment = GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT); + if (textAlignment == GUI_TEXT_ALIGN_CENTER) cursor.x = bounds.x + GetTextWidth(text)/2 + bounds.width/2 + 1; + else if (textAlignment == GUI_TEXT_ALIGN_RIGHT) cursor.x = bounds.x + bounds.width - GuiGetStyle(TEXTBOX, INNER_PADDING); } - - if (!editMode) + else { if (CheckCollisionPointRec(mousePoint, bounds)) { @@ -2722,10 +2736,6 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM if (IsMouseButtonPressed(0)) pressed = true; } } - else - { - if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(0))) pressed = true; - } if (pressed) framesCounter = 0; } @@ -2740,7 +2750,7 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM DrawRectangle(bounds.x + GuiGetStyle(TEXTBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(TEXTBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED)), guiAlpha)); // Draw blinking cursor - if (editMode && ((framesCounter/20)%2 == 0)) DrawRectangle(bounds.x + GuiGetStyle(TEXTBOX, INNER_PADDING) + GetTextWidth(text) + 2 + bounds.width/2*GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE), 1, GuiGetStyle(DEFAULT, TEXT_SIZE)*2, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha)); + if (editMode && ((framesCounter/20)%2 == 0)) DrawRectangleRec(cursor, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha)); } else if (state == GUI_STATE_DISABLED) { @@ -2761,10 +2771,16 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool GuiControlState state = guiState; bool pressed = false; + + Rectangle textAreaBounds = { + bounds.x + GuiGetStyle(TEXTBOX, INNER_PADDING), + bounds.y + GuiGetStyle(TEXTBOX, INNER_PADDING), + bounds.width - 2*GuiGetStyle(TEXTBOX, INNER_PADDING), + bounds.height - 2*GuiGetStyle(TEXTBOX, INNER_PADDING) + }; bool textHasChange = false; int currentLine = 0; - //const char *numChars = NULL; // Update control //-------------------------------------------------------------------- @@ -2775,14 +2791,11 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool if (editMode) { state = GUI_STATE_PRESSED; - framesCounter++; int keyCount = strlen(text); - int maxWidth = (bounds.width - (GuiGetStyle(TEXTBOX, INNER_PADDING)*2)); - int maxHeight = (bounds.height - (GuiGetStyle(TEXTBOX, INNER_PADDING)*2)); - - //numChars = TextFormat("%i/%i", keyCount, textSize - 1); + int maxWidth = textAreaBounds.width; + int maxHeight = textAreaBounds.height; // Only allow keys in range [32..125] if (keyCount < (textSize - 1)) @@ -2796,8 +2809,7 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool text[keyCount] = '\n'; keyCount++; } - else if (((key >= 32) && (key <= 125)) || - ((key >= 128) && (key < 255))) + else if (((key >= 32) && (key <= 125)) || ((key >= 128) && (key < 255))) { text[keyCount] = (char)key; keyCount++; @@ -2806,8 +2818,7 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool } else if (GetTextWidth(strrchr(text, '\n')) < (maxWidth - GuiGetStyle(DEFAULT, TEXT_SIZE))) { - if (((key >= 32) && (key <= 125)) || - ((key >= 128) && (key < 255))) + if (((key >= 32) && (key <= 125)) || ((key >= 128) && (key < 255))) { text[keyCount] = (char)key; keyCount++; @@ -2831,6 +2842,7 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool { if ((framesCounter > TEXTEDIT_CURSOR_BLINK_FRAMES) && (framesCounter%2) == 0) keyCount--; text[keyCount] = '\0'; + if (keyCount < 0) keyCount = 0; textHasChange = true; } @@ -2897,10 +2909,11 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool { if (text[i] == '\n') currentLine++; } + + // Exit edit mode + if (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(0)) pressed = true; } - - // Changing edit mode - if (!editMode) + else { if (CheckCollisionPointRec(mousePoint, bounds)) { @@ -2908,12 +2921,8 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool if (IsMouseButtonPressed(0)) pressed = true; } } - else - { - if (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(0)) pressed = true; - } - if (pressed) framesCounter = 0; + if (pressed) framesCounter = 0; // Reset blinking cursor } //-------------------------------------------------------------------- @@ -2948,7 +2957,7 @@ RAYGUIDEF bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool DrawRectangle(bounds.x + GuiGetStyle(TEXTBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(TEXTBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(TEXTBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED)), guiAlpha)); } - GuiDrawText(text, GetTextBounds(TEXTBOX, bounds), GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))), guiAlpha)); + DrawTextRec(guiFont, text, textAreaBounds, GuiGetStyle(DEFAULT, TEXT_SIZE), GuiGetStyle(DEFAULT, TEXT_SPACING), true, Fade(GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3))), guiAlpha)); //-------------------------------------------------------------------- return pressed; @@ -3318,7 +3327,11 @@ RAYGUIDEF int GuiListViewEx(Rectangle bounds, const char **text, int count, int if (CheckCollisionPointRec(mousePoint, itemBounds)) { itemFocused = startIndex + i; - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) itemSelected = startIndex + i; + if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) + { + if (itemSelected == (startIndex + i)) itemSelected = -1; + else itemSelected = startIndex + i; + } break; } @@ -4058,7 +4071,9 @@ RAYGUIDEF void GuiLoadStyleDefault(void) GuiSetStyle(TEXTBOX, MULTILINE_PADDING, 5); GuiSetStyle(TEXTBOX, COLOR_SELECTED_FG, 0xf0fffeff); GuiSetStyle(TEXTBOX, COLOR_SELECTED_BG, 0x839affe0); + GuiSetStyle(VALUEBOX, INNER_PADDING, 2); GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER); + GuiSetStyle(SPINNER, INNER_PADDING, 2); GuiSetStyle(SPINNER, SELECT_BUTTON_WIDTH, 20); GuiSetStyle(SPINNER, SELECT_BUTTON_PADDING, 2); GuiSetStyle(SPINNER, SELECT_BUTTON_BORDER_WIDTH, 1);