Remove duplicated GuiValueBox() and GuiSpinner()
This commit is contained in:
parent
462ba6b373
commit
34483c44e3
172
src/raygui.h
172
src/raygui.h
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raygui v2.6-dev - A simple and easy-to-use immediate-mode-gui library
|
* raygui v2.6-dev - A simple and easy-to-use immediate-mode gui library
|
||||||
*
|
*
|
||||||
* DESCRIPTION:
|
* DESCRIPTION:
|
||||||
*
|
*
|
||||||
@ -68,8 +68,7 @@
|
|||||||
* multiple controls and following raygui styles
|
* multiple controls and following raygui styles
|
||||||
*
|
*
|
||||||
* #define RAYGUI_TEXTBOX_EXTENDED
|
* #define RAYGUI_TEXTBOX_EXTENDED
|
||||||
* Enables the advance GuiTextBox()/GuiValueBox()/GuiSpinner() implementation with
|
* Enables advance GuiTextBox()implementation with text selection and copy/cut/paste support
|
||||||
* text selection support and text copy/cut/paste support
|
|
||||||
*
|
*
|
||||||
* VERSIONS HISTORY:
|
* VERSIONS HISTORY:
|
||||||
* 2.6 (25-Aug-2019) Redesigned GuiListView*(), GuiDropdownBox(), GuiSlider*(), GuiProgressBar(), GuiMessageBox(), GuiTextInputBox()
|
* 2.6 (25-Aug-2019) Redesigned GuiListView*(), GuiDropdownBox(), GuiSlider*(), GuiProgressBar(), GuiMessageBox(), GuiTextInputBox()
|
||||||
@ -1505,128 +1504,12 @@ RAYGUIDEF bool GuiDropdownBox(Rectangle bounds, const char *text, int *active, b
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(RAYGUI_TEXTBOX_EXTENDED)
|
#if defined(RAYGUI_TEXTBOX_EXTENDED)
|
||||||
// Spinner control, returns selected value
|
|
||||||
// NOTE: Requires static variables: timer, valueSpeed - ERROR!
|
|
||||||
RAYGUIDEF bool GuiSpinner(Rectangle bounds, int *value, int minValue, int maxValue, bool editMode)
|
|
||||||
{
|
|
||||||
#define GUI_SPINNER_HOLD_SPEED 0.2f // Min 200ms delay
|
|
||||||
|
|
||||||
static float timer = 0.0f;
|
|
||||||
|
|
||||||
int tempValue = *value;
|
|
||||||
const float time = GetTime(); // Get current time
|
|
||||||
bool pressed = false, active = GuiTextBoxIsActive(bounds);
|
|
||||||
|
|
||||||
Rectangle spinner = { bounds.x + GuiGetStyle(SPINNER, SELECT_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SELECT_BUTTON_PADDING), bounds.y,
|
|
||||||
bounds.width - 2*(GuiGetStyle(SPINNER, SELECT_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SELECT_BUTTON_PADDING)), bounds.height };
|
|
||||||
Rectangle leftButtonBound = { bounds.x, bounds.y, GuiGetStyle(SPINNER, SELECT_BUTTON_WIDTH), bounds.height };
|
|
||||||
Rectangle rightButtonBound = { bounds.x + bounds.width - GuiGetStyle(SPINNER, SELECT_BUTTON_WIDTH), bounds.y, GuiGetStyle(SPINNER, SELECT_BUTTON_WIDTH), bounds.height };
|
|
||||||
|
|
||||||
// Update control
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
Vector2 mouse = GetMousePosition();
|
|
||||||
if (tempValue < minValue) tempValue = minValue;
|
|
||||||
if (tempValue > maxValue) tempValue = maxValue;
|
|
||||||
|
|
||||||
if (editMode)
|
|
||||||
{
|
|
||||||
if (!active)
|
|
||||||
{
|
|
||||||
// This becomes the active textbox when mouse is pressed or held inside bounds
|
|
||||||
if ((IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonDown(MOUSE_LEFT_BUTTON)) &&
|
|
||||||
CheckCollisionPointRec(mouse, bounds))
|
|
||||||
{
|
|
||||||
GuiTextBoxSetActive(bounds);
|
|
||||||
active = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset timer when one of the buttons is clicked (without this, holding the button down will not behave correctly)
|
|
||||||
if ((CheckCollisionPointRec(mouse, leftButtonBound) || CheckCollisionPointRec(mouse, rightButtonBound)) &&
|
|
||||||
IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
|
|
||||||
{
|
|
||||||
timer = time;
|
|
||||||
}
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Draw control
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
if (GuiTextBoxIsActive(bounds)) guiTextBoxActive = spinner; // Set our spinner as the active textbox
|
|
||||||
pressed = GuiValueBox(spinner, &tempValue, minValue, maxValue, editMode);
|
|
||||||
if (GuiTextBoxIsActive(spinner)) guiTextBoxActive = bounds; // Revert change
|
|
||||||
|
|
||||||
// Draw value selector custom buttons
|
|
||||||
// NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values
|
|
||||||
int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH);
|
|
||||||
GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(SPINNER, BORDER_WIDTH));
|
|
||||||
|
|
||||||
int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT);
|
|
||||||
GuiSetStyle(BUTTON, TEXT_ALIGNMENT, GUI_TEXT_ALIGN_CENTER);
|
|
||||||
|
|
||||||
char *icon = "<";
|
|
||||||
#if defined(RAYGUI_SUPPORT_RICONS)
|
|
||||||
icon = (char *)GuiIconText(RICON_ARROW_LEFT_FILL, NULL);
|
|
||||||
#endif
|
|
||||||
if (GuiButton(leftButtonBound, icon) || // NOTE: also decrease value when the button is held down
|
|
||||||
(IsMouseButtonDown(MOUSE_LEFT_BUTTON) &&
|
|
||||||
CheckCollisionPointRec(mouse, leftButtonBound) &&
|
|
||||||
(time - timer) > GUI_SPINNER_HOLD_SPEED))
|
|
||||||
{
|
|
||||||
tempValue--;
|
|
||||||
}
|
|
||||||
|
|
||||||
icon = ">";
|
|
||||||
#if defined(RAYGUI_SUPPORT_RICONS)
|
|
||||||
icon = (char *)GuiIconText(RICON_ARROW_RIGHT_FILL, NULL);
|
|
||||||
#endif
|
|
||||||
if (GuiButton(rightButtonBound, icon) || // NOTE: also increase value when the button is held down
|
|
||||||
(IsMouseButtonDown(MOUSE_LEFT_BUTTON) &&
|
|
||||||
CheckCollisionPointRec(mouse, rightButtonBound) &&
|
|
||||||
(time - timer) > GUI_SPINNER_HOLD_SPEED))
|
|
||||||
{
|
|
||||||
tempValue++;
|
|
||||||
}
|
|
||||||
|
|
||||||
GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign);
|
|
||||||
GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth);
|
|
||||||
//--------------------------------------------------------------------
|
|
||||||
|
|
||||||
if (tempValue < minValue) tempValue = minValue;
|
|
||||||
if (tempValue > maxValue) tempValue = maxValue;
|
|
||||||
|
|
||||||
// Reset timer
|
|
||||||
if (active && (((time - timer) > GUI_SPINNER_HOLD_SPEED) || (timer == 0.0f) || (timer > time))) timer = time;
|
|
||||||
|
|
||||||
*value = tempValue;
|
|
||||||
|
|
||||||
return pressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value Box control, updates input text with numbers
|
|
||||||
RAYGUIDEF bool GuiValueBox(Rectangle bounds, int *value, int minValue, int maxValue, bool editMode)
|
|
||||||
{
|
|
||||||
#define VALUEBOX_MAX_CHARS 32
|
|
||||||
|
|
||||||
char text[VALUEBOX_MAX_CHARS + 1] = { 0 };
|
|
||||||
sprintf(text, "%i", *value);
|
|
||||||
|
|
||||||
bool pressed = GuiTextBox(bounds, text, VALUEBOX_MAX_CHARS, editMode);
|
|
||||||
*value = atoi(text);
|
|
||||||
|
|
||||||
if (*value > maxValue) *value = maxValue;
|
|
||||||
else if (*value < minValue) *value = minValue;
|
|
||||||
|
|
||||||
return pressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GUI_MEASURE_MODE_CURSOR_END = 0xA,
|
GUI_MEASURE_MODE_CURSOR_END = 0xA,
|
||||||
GUI_MEASURE_MODE_CURSOR_POS,
|
GUI_MEASURE_MODE_CURSOR_POS,
|
||||||
GUI_MEASURE_MODE_CURSOR_COORDS,
|
GUI_MEASURE_MODE_CURSOR_COORDS,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Required by GuiTextBox()
|
|
||||||
// Highly synchronized with calculations in DrawTextRecEx()
|
// Highly synchronized with calculations in DrawTextRecEx()
|
||||||
static int GuiMeasureTextBox(const char *text, int length, Rectangle rec, int *pos, int mode)
|
static int GuiMeasureTextBox(const char *text, int length, Rectangle rec, int *pos, int mode)
|
||||||
{
|
{
|
||||||
@ -2113,7 +1996,7 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
if ((state != GUI_STATE_DISABLED) && !guiLocked)
|
if ((state != GUI_STATE_DISABLED) && !guiLocked)
|
||||||
{
|
{
|
||||||
const Vector2 mousePoint = GetMousePosition();
|
Vector2 mousePoint = GetMousePosition();
|
||||||
|
|
||||||
if (editMode)
|
if (editMode)
|
||||||
{
|
{
|
||||||
@ -2121,8 +2004,7 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
// A textbox becomes active when the user clicks it :)
|
// A textbox becomes active when the user clicks it :)
|
||||||
if (!active)
|
if (!active)
|
||||||
{
|
{
|
||||||
if (CheckCollisionPointRec(mousePoint, bounds) &&
|
if (CheckCollisionPointRec(mousePoint, bounds) && (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)))
|
||||||
(IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonPressed(MOUSE_RIGHT_BUTTON)))
|
|
||||||
{
|
{
|
||||||
// Hurray!!! we just became the active textbox
|
// Hurray!!! we just became the active textbox
|
||||||
active = true;
|
active = true;
|
||||||
@ -2132,7 +2014,8 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
else if (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_RIGHT_BUTTON))
|
else if (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_RIGHT_BUTTON))
|
||||||
{
|
{
|
||||||
// When active and the right mouse is clicked outside the textbox we should deactivate it
|
// When active and the right mouse is clicked outside the textbox we should deactivate it
|
||||||
GuiTextBoxSetActive(RAYGUI_CLITERAL(Rectangle){0,0,-1,-1}); // Set a dummy rect as the active textbox bounds
|
// NOTE: We set a dummy rect as the active textbox bounds
|
||||||
|
GuiTextBoxSetActive(RAYGUI_CLITERAL(Rectangle){ 0, 0, -1, -1 });
|
||||||
active = false;
|
active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2189,8 +2072,7 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
// * DEL delete character or selection after cursor
|
// * DEL delete character or selection after cursor
|
||||||
// * BACKSPACE delete character or selection before cursor
|
// * BACKSPACE delete character or selection before cursor
|
||||||
// TODO: Add more shortcuts (insert mode, select word, moveto/select prev/next word ...)
|
// TODO: Add more shortcuts (insert mode, select word, moveto/select prev/next word ...)
|
||||||
if (IsKeyPressed(KEY_RIGHT) ||
|
if (IsKeyPressed(KEY_RIGHT) || (IsKeyDown(KEY_RIGHT) && (framesCounter%GUI_TEXTBOX_CURSOR_SPEED_MODIFIER == 0)))
|
||||||
(IsKeyDown(KEY_RIGHT) && (framesCounter%GUI_TEXTBOX_CURSOR_SPEED_MODIFIER == 0)))
|
|
||||||
{
|
{
|
||||||
if (IsKeyDown(KEY_LEFT_SHIFT))
|
if (IsKeyDown(KEY_LEFT_SHIFT))
|
||||||
{
|
{
|
||||||
@ -2270,8 +2152,7 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
if (IsKeyDown(KEY_LEFT_SHIFT))
|
if (IsKeyDown(KEY_LEFT_SHIFT))
|
||||||
{
|
{
|
||||||
// Select from start of text to cursor
|
// Select from start of text to cursor
|
||||||
if ((guiTextBoxState.select > guiTextBoxState.cursor) ||
|
if ((guiTextBoxState.select > guiTextBoxState.cursor) || ((guiTextBoxState.select == -1) && (guiTextBoxState.cursor != 0)))
|
||||||
((guiTextBoxState.select == -1) && (guiTextBoxState.cursor != 0)))
|
|
||||||
{
|
{
|
||||||
guiTextBoxState.select = guiTextBoxState.cursor;
|
guiTextBoxState.select = guiTextBoxState.cursor;
|
||||||
}
|
}
|
||||||
@ -2301,30 +2182,11 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
guiTextBoxState.index = GuiMeasureTextBoxRev(text, len, textRec, &pos);
|
guiTextBoxState.index = GuiMeasureTextBoxRev(text, len, textRec, &pos);
|
||||||
guiTextBoxState.start = guiTextBoxState.cursor - pos + 1;
|
guiTextBoxState.start = guiTextBoxState.cursor - pos + 1;
|
||||||
}
|
}
|
||||||
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_A))
|
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_A)) GuiTextBoxSelectAll(text); // CTRL + A > Select all
|
||||||
{
|
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)) GuiTextBoxCopy(text); // CTRL + C > Copy selected text to clipboard
|
||||||
// `CTRL + A` Select all
|
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_X)) GuiTextBoxCut(text); // CTRL + X > Cut selected text
|
||||||
GuiTextBoxSelectAll(text);
|
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V)) GuiTextBoxPaste(text, textSize); // CTRL + V > Paste clipboard text
|
||||||
}
|
else if (IsKeyPressed(KEY_ENTER)) pressed = true;
|
||||||
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C))
|
|
||||||
{
|
|
||||||
// `CTRL + C` Copy selected text to clipboard
|
|
||||||
GuiTextBoxCopy(text);
|
|
||||||
}
|
|
||||||
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_X))
|
|
||||||
{
|
|
||||||
// `CTRL + X` Cut selected text
|
|
||||||
GuiTextBoxCut(text);
|
|
||||||
}
|
|
||||||
else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V))
|
|
||||||
{
|
|
||||||
// `CTRL + V` Paste clipboard text
|
|
||||||
GuiTextBoxPaste(text, textSize);
|
|
||||||
}
|
|
||||||
else if (IsKeyPressed(KEY_ENTER))
|
|
||||||
{
|
|
||||||
pressed = true;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int key = GetKeyPressed();
|
int key = GetKeyPressed();
|
||||||
@ -2472,7 +2334,8 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
int select = guiTextBoxState.select;
|
int select = guiTextBoxState.select;
|
||||||
int cursor = guiTextBoxState.cursor;
|
int cursor = guiTextBoxState.cursor;
|
||||||
int start = guiTextBoxState.start;
|
int start = guiTextBoxState.start;
|
||||||
if (guiTextBoxState.select == -1 || guiTextBoxState.select == guiTextBoxState.cursor)
|
|
||||||
|
if ((guiTextBoxState.select == -1) || (guiTextBoxState.select == guiTextBoxState.cursor))
|
||||||
{
|
{
|
||||||
// If no selection then mark all text to be copied to clipboard
|
// If no selection then mark all text to be copied to clipboard
|
||||||
GuiTextBoxSelectAll(text);
|
GuiTextBoxSelectAll(text);
|
||||||
@ -2495,10 +2358,11 @@ RAYGUIDEF bool GuiTextBox(Rectangle bounds, char *text, int textSize, bool editM
|
|||||||
if (state == GUI_STATE_PRESSED)
|
if (state == GUI_STATE_PRESSED)
|
||||||
{
|
{
|
||||||
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_FOCUSED)), guiAlpha));
|
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_FOCUSED)), guiAlpha));
|
||||||
|
|
||||||
|
// Draw blinking cursor
|
||||||
if (editMode && active && ((framesCounter/TEXTEDIT_CURSOR_BLINK_FRAMES)%2 == 0) && selLength == 0)
|
if (editMode && active && ((framesCounter/TEXTEDIT_CURSOR_BLINK_FRAMES)%2 == 0) && selLength == 0)
|
||||||
{
|
{
|
||||||
// Draw the blinking cursor
|
DrawRectangle(cursorPos.x, cursorPos.y, 1, GuiGetStyle(DEFAULT, TEXT_SIZE)*2, Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha));
|
||||||
DrawRectangle(cursorPos.x, cursorPos.y, 1, GuiGetStyle(DEFAULT, TEXT_SIZE), Fade(GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED)), guiAlpha));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (state == GUI_STATE_DISABLED)
|
else if (state == GUI_STATE_DISABLED)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user