|
@@ -1145,6 +1145,133 @@ RAYGUIDEF bool GuiCheckBoxEx(Rectangle bounds, bool checked, const char *text)
|
|
return checked;
|
|
return checked;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// Combo Box control, returns selected item index
|
|
|
|
+RAYGUIDEF int GuiComboBox2(Rectangle bounds, char *text, int active)
|
|
|
|
+{
|
|
|
|
+ #define MAX_COMBOBOX_SLOTS 5
|
|
|
|
+
|
|
|
|
+ GuiControlState state = guiState;
|
|
|
|
+
|
|
|
|
+ bounds.width -= (GuiGetStyle(COMBOBOX, SELECTOR_WIDTH) + GuiGetStyle(COMBOBOX, SELECTOR_PADDING));
|
|
|
|
+
|
|
|
|
+ Rectangle selector = { bounds.x + bounds.width + GuiGetStyle(COMBOBOX, SELECTOR_PADDING),
|
|
|
|
+ bounds.y, GuiGetStyle(COMBOBOX, SELECTOR_WIDTH), bounds.height };
|
|
|
|
+
|
|
|
|
+ // Get substrings from text
|
|
|
|
+ //--------------------------------------------------------------------
|
|
|
|
+ char *ptrs[MAX_COMBOBOX_SLOTS] = { NULL }; // Pointers to substrings
|
|
|
|
+ int lens[MAX_COMBOBOX_SLOTS] = { 0 }; // Substrings lengths
|
|
|
|
+ int elementsCount = 0; // Substrings elementsCount
|
|
|
|
+
|
|
|
|
+ int len = strlen(text);
|
|
|
|
+ ptrs[0] = text;
|
|
|
|
+ int charsCount = 0;
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < len; i++)
|
|
|
|
+ {
|
|
|
|
+ charsCount++;
|
|
|
|
+
|
|
|
|
+ if (text[i] == ';')
|
|
|
|
+ {
|
|
|
|
+ lens[elementsCount] = charsCount - 1;
|
|
|
|
+ charsCount = 0;
|
|
|
|
+ elementsCount++;
|
|
|
|
+
|
|
|
|
+ ptrs[elementsCount] = &text[i + 1];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ lens[elementsCount] = charsCount;
|
|
|
|
+ elementsCount++;
|
|
|
|
+ //--------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+ if (active < 0) active = 0;
|
|
|
|
+ else if (active > elementsCount - 1) active = elementsCount - 1;
|
|
|
|
+
|
|
|
|
+ int textWidth = GuiTextWidth(SubText(ptrs[active], 0, lens[active]));
|
|
|
|
+ int textHeight = GuiGetStyle(DEFAULT, TEXT_SIZE);
|
|
|
|
+
|
|
|
|
+ if (bounds.width < textWidth) bounds.width = textWidth;
|
|
|
|
+ if (bounds.height < textHeight) bounds.height = textHeight;
|
|
|
|
+
|
|
|
|
+ // Update control
|
|
|
|
+ //--------------------------------------------------------------------
|
|
|
|
+ if ((state != GUI_STATE_DISABLED) && !guiLocked)
|
|
|
|
+ {
|
|
|
|
+ Vector2 mousePoint = GetMousePosition();
|
|
|
|
+
|
|
|
|
+ if (CheckCollisionPointRec(mousePoint, bounds) ||
|
|
|
|
+ CheckCollisionPointRec(mousePoint, selector))
|
|
|
|
+ {
|
|
|
|
+ if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
|
|
|
|
+ {
|
|
|
|
+ active += 1;
|
|
|
|
+ if (active >= elementsCount) active = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = GUI_STATE_PRESSED;
|
|
|
|
+ else state = GUI_STATE_FOCUSED;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //--------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+ // Draw control
|
|
|
|
+ //--------------------------------------------------------------------
|
|
|
|
+ switch (state)
|
|
|
|
+ {
|
|
|
|
+ case GUI_STATE_NORMAL:
|
|
|
|
+ {
|
|
|
|
+ // Draw combo box main
|
|
|
|
+ DrawRectangleLinesEx(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_NORMAL)), guiAlpha));
|
|
|
|
+ DrawRectangle(bounds.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_NORMAL)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ // Draw selector
|
|
|
|
+ DrawRectangleLinesEx(selector, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_NORMAL)), guiAlpha));
|
|
|
|
+ DrawRectangle(selector.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_NORMAL)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ GuiDrawText(SubText(ptrs[active], 0, lens[active]), bounds.x + bounds.width/2 - textWidth/2, bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_NORMAL)), guiAlpha));
|
|
|
|
+ GuiDrawText(FormatText("%i/%i", active + 1, elementsCount), selector.x + selector.width/2 - GuiTextWidth(FormatText("%i/%i", active + 1, elementsCount))/2, selector.y + selector.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_NORMAL)), guiAlpha));
|
|
|
|
+ } break;
|
|
|
|
+ case GUI_STATE_FOCUSED:
|
|
|
|
+ {
|
|
|
|
+ DrawRectangleLinesEx(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_FOCUSED)), guiAlpha));
|
|
|
|
+ DrawRectangle(bounds.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_FOCUSED)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ DrawRectangleLinesEx(selector, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_FOCUSED)), guiAlpha));
|
|
|
|
+ DrawRectangle(selector.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_FOCUSED)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ GuiDrawText(SubText(ptrs[active], 0, lens[active]), bounds.x + bounds.width/2 - textWidth/2, bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_FOCUSED)), guiAlpha));
|
|
|
|
+ GuiDrawText(FormatText("%i/%i", active + 1, elementsCount), selector.x + selector.width/2 - GuiTextWidth(FormatText("%i/%i", active + 1, elementsCount))/2, selector.y + selector.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_FOCUSED)), guiAlpha));
|
|
|
|
+ } break;
|
|
|
|
+ case GUI_STATE_PRESSED:
|
|
|
|
+ {
|
|
|
|
+ DrawRectangleLinesEx(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_PRESSED)), guiAlpha));
|
|
|
|
+ DrawRectangle(bounds.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_PRESSED)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ DrawRectangleLinesEx(selector, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_PRESSED)), guiAlpha));
|
|
|
|
+ DrawRectangle(selector.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_PRESSED)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ GuiDrawText(SubText(ptrs[active], 0, lens[active]), bounds.x + bounds.width/2 - textWidth/2, bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_PRESSED)), guiAlpha));
|
|
|
|
+ GuiDrawText(FormatText("%i/%i", active + 1, elementsCount), selector.x + selector.width/2 - GuiTextWidth(FormatText("%i/%i", active + 1, elementsCount))/2, selector.y + selector.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_PRESSED)), guiAlpha));
|
|
|
|
+ } break;
|
|
|
|
+ case GUI_STATE_DISABLED:
|
|
|
|
+ {
|
|
|
|
+ DrawRectangleLinesEx(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_DISABLED)), guiAlpha));
|
|
|
|
+ DrawRectangle(bounds.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), bounds.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_DISABLED)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ DrawRectangleLinesEx(selector, GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BORDER_COLOR_DISABLED)), guiAlpha));
|
|
|
|
+ DrawRectangle(selector.x + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.y + GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.width - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), selector.height - 2*GuiGetStyle(COMBOBOX, BORDER_WIDTH), Fade(GetColor(GuiGetStyle(COMBOBOX, BASE_COLOR_DISABLED)), guiAlpha));
|
|
|
|
+
|
|
|
|
+ GuiDrawText(SubText(ptrs[active], 0, lens[active]), bounds.x + bounds.width/2 - textWidth/2, bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_DISABLED)), guiAlpha));
|
|
|
|
+ GuiDrawText(FormatText("%i/%i", active + 1, elementsCount), selector.x + selector.width/2 - GuiTextWidth(FormatText("%i/%i", active + 1, elementsCount))/2, selector.y + selector.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2 + VALIGN_OFFSET(bounds.height), Fade(GetColor(GuiGetStyle(COMBOBOX, TEXT_COLOR_DISABLED)), guiAlpha));
|
|
|
|
+ } break;
|
|
|
|
+ default: break;
|
|
|
|
+ }
|
|
|
|
+ //--------------------------------------------------------------------
|
|
|
|
+
|
|
|
|
+ return active;
|
|
|
|
+}
|
|
|
|
+
|
|
// Combo Box control, returns selected item index
|
|
// Combo Box control, returns selected item index
|
|
RAYGUIDEF int GuiComboBox(Rectangle bounds, const char **text, int count, int active)
|
|
RAYGUIDEF int GuiComboBox(Rectangle bounds, const char **text, int count, int active)
|
|
{
|
|
{
|