From 6ae0ef27c8d1fe36a3c1abef950b914d0be173ff Mon Sep 17 00:00:00 2001 From: Reproog Date: Tue, 11 Jun 2024 17:28:28 +0200 Subject: [PATCH] Update Doppelspaltapp --- .gitignore | 4 + raylib-src/old-raygui-src/raygui.c | 5540 --------------------------- raylib-src/old-raygui-src/raygui.h | 5540 --------------------------- raylib-src/old-raygui-src/raygui.so | Bin 1320304 -> 0 bytes src/main.c | 55 +- 5 files changed, 53 insertions(+), 11086 deletions(-) delete mode 100644 raylib-src/old-raygui-src/raygui.c delete mode 100644 raylib-src/old-raygui-src/raygui.h delete mode 100755 raylib-src/old-raygui-src/raygui.so diff --git a/.gitignore b/.gitignore index 3e69fc1..a587f25 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,8 @@ nob.old Doppelspaltapp-Linux-x86-64 main Makefile +*.exe +*.zip +include/ +lib/ diff --git a/raylib-src/old-raygui-src/raygui.c b/raylib-src/old-raygui-src/raygui.c deleted file mode 100644 index 631ee15..0000000 --- a/raylib-src/old-raygui-src/raygui.c +++ /dev/null @@ -1,5540 +0,0 @@ -/******************************************************************************************* -* -* raygui v4.1-dev - A simple and easy-to-use immediate-mode gui library -* -* DESCRIPTION: -* raygui is a tools-dev-focused immediate-mode-gui library based on raylib but also -* available as a standalone library, as long as input and drawing functions are provided. -* -* FEATURES: -* - Immediate-mode gui, minimal retained data -* - +25 controls provided (basic and advanced) -* - Styling system for colors, font and metrics -* - Icons supported, embedded as a 1-bit icons pack -* - Standalone mode option (custom input/graphics backend) -* - Multiple support tools provided for raygui development -* -* POSSIBLE IMPROVEMENTS: -* - Better standalone mode API for easy plug of custom backends -* - Externalize required inputs, allow user easier customization -* -* LIMITATIONS: -* - No editable multi-line word-wraped text box supported -* - No auto-layout mechanism, up to the user to define controls position and size -* - Standalone mode requires library modification and some user work to plug another backend -* -* NOTES: -* - WARNING: GuiLoadStyle() and GuiLoadStyle{Custom}() functions, allocate memory for -* font atlas recs and glyphs, freeing that memory is (usually) up to the user, -* no unload function is explicitly provided... but note that GuiLoadStyleDefault() unloads -* by default any previously loaded font (texture, recs, glyphs). -* - Global UI alpha (guiAlpha) is applied inside GuiDrawRectangle() and GuiDrawText() functions -* -* CONTROLS PROVIDED: -* # Container/separators Controls -* - WindowBox --> StatusBar, Panel -* - GroupBox --> Line -* - Line -* - Panel --> StatusBar -* - ScrollPanel --> StatusBar -* - TabBar --> Button -* -* # Basic Controls -* - Label -* - LabelButton --> Label -* - Button -* - Toggle -* - ToggleGroup --> Toggle -* - ToggleSlider -* - CheckBox -* - ComboBox -* - DropdownBox -* - TextBox -* - ValueBox --> TextBox -* - Spinner --> Button, ValueBox -* - Slider -* - SliderBar --> Slider -* - ProgressBar -* - StatusBar -* - DummyRec -* - Grid -* -* # Advance Controls -* - ListView -* - ColorPicker --> ColorPanel, ColorBarHue -* - MessageBox --> Window, Label, Button -* - TextInputBox --> Window, Label, TextBox, Button -* -* It also provides a set of functions for styling the controls based on its properties (size, color). -* -* -* RAYGUI STYLE (guiStyle): -* raygui uses a global data array for all gui style properties (allocated on data segment by default), -* when a new style is loaded, it is loaded over the global style... but a default gui style could always be -* recovered with GuiLoadStyleDefault() function, that overwrites the current style to the default one -* -* The global style array size is fixed and depends on the number of controls and properties: -* -* static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)]; -* -* guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB -* -* Note that the first set of BASE properties (by default guiStyle[0..15]) belong to the generic style -* used for all controls, when any of those base values is set, it is automatically populated to all -* controls, so, specific control values overwriting generic style should be set after base values. -* -* After the first BASE set we have the EXTENDED properties (by default guiStyle[16..23]), those -* properties are actually common to all controls and can not be overwritten individually (like BASE ones) -* Some of those properties are: TEXT_SIZE, TEXT_SPACING, LINE_COLOR, BACKGROUND_COLOR -* -* Custom control properties can be defined using the EXTENDED properties for each independent control. -* -* TOOL: rGuiStyler is a visual tool to customize raygui style: github.com/raysan5/rguistyler -* -* -* RAYGUI ICONS (guiIcons): -* raygui could use a global array containing icons data (allocated on data segment by default), -* a custom icons set could be loaded over this array using GuiLoadIcons(), but loaded icons set -* must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS will be loaded -* -* Every icon is codified in binary form, using 1 bit per pixel, so, every 16x16 icon -* requires 8 integers (16*16/32) to be stored in memory. -* -* When the icon is draw, actually one quad per pixel is drawn if the bit for that pixel is set. -* -* The global icons array size is fixed and depends on the number of icons and size: -* -* static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS]; -* -* guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB -* -* TOOL: rGuiIcons is a visual tool to customize/create raygui icons: github.com/raysan5/rguiicons -* -* RAYGUI LAYOUT: -* raygui currently does not provide an auto-layout mechanism like other libraries, -* layouts must be defined manually on controls drawing, providing the right bounds Rectangle for it. -* -* TOOL: rGuiLayout is a visual tool to create raygui layouts: github.com/raysan5/rguilayout -* -* CONFIGURATION: -* #define RAYGUI_IMPLEMENTATION -* Generates the implementation of the library into the included file. -* If not defined, the library is in header only mode and can be included in other headers -* or source files without problems. But only ONE file should hold the implementation. -* -* #define RAYGUI_STANDALONE -* Avoid raylib.h header inclusion in this file. Data types defined on raylib are defined -* internally in the library and input management and drawing functions must be provided by -* the user (check library implementation for further details). -* -* #define RAYGUI_NO_ICONS -* Avoid including embedded ricons data (256 icons, 16x16 pixels, 1-bit per pixel, 2KB) -* -* #define RAYGUI_CUSTOM_ICONS -* Includes custom ricons.h header defining a set of custom icons, -* this file can be generated using rGuiIcons tool -* -* #define RAYGUI_DEBUG_RECS_BOUNDS -* Draw control bounds rectangles for debug -* -* #define RAYGUI_DEBUG_TEXT_BOUNDS -* Draw text bounds rectangles for debug -* -* VERSIONS HISTORY: -* 4.1-dev (2024) Current dev version... -* ADDED: guiControlExclusiveMode and guiControlExclusiveRec for exclusive modes -* -* 4.0 (12-Sep-2023) ADDED: GuiToggleSlider() -* ADDED: GuiColorPickerHSV() and GuiColorPanelHSV() -* ADDED: Multiple new icons, mostly compiler related -* ADDED: New DEFAULT properties: TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE -* ADDED: New enum values: GuiTextAlignment, GuiTextAlignmentVertical, GuiTextWrapMode -* ADDED: Support loading styles with custom font charset from external file -* REDESIGNED: GuiTextBox(), support mouse cursor positioning -* REDESIGNED: GuiDrawText(), support multiline and word-wrap modes (read only) -* REDESIGNED: GuiProgressBar() to be more visual, progress affects border color -* REDESIGNED: Global alpha consideration moved to GuiDrawRectangle() and GuiDrawText() -* REDESIGNED: GuiScrollPanel(), get parameters by reference and return result value -* REDESIGNED: GuiToggleGroup(), get parameters by reference and return result value -* REDESIGNED: GuiComboBox(), get parameters by reference and return result value -* REDESIGNED: GuiCheckBox(), get parameters by reference and return result value -* REDESIGNED: GuiSlider(), get parameters by reference and return result value -* REDESIGNED: GuiSliderBar(), get parameters by reference and return result value -* REDESIGNED: GuiProgressBar(), get parameters by reference and return result value -* REDESIGNED: GuiListView(), get parameters by reference and return result value -* REDESIGNED: GuiColorPicker(), get parameters by reference and return result value -* REDESIGNED: GuiColorPanel(), get parameters by reference and return result value -* REDESIGNED: GuiColorBarAlpha(), get parameters by reference and return result value -* REDESIGNED: GuiColorBarHue(), get parameters by reference and return result value -* REDESIGNED: GuiGrid(), get parameters by reference and return result value -* REDESIGNED: GuiGrid(), added extra parameter -* REDESIGNED: GuiListViewEx(), change parameters order -* REDESIGNED: All controls return result as int value -* REVIEWED: GuiScrollPanel() to avoid smallish scroll-bars -* REVIEWED: All examples and specially controls_test_suite -* RENAMED: gui_file_dialog module to gui_window_file_dialog -* UPDATED: All styles to include ISO-8859-15 charset (as much as possible) -* -* 3.6 (10-May-2023) ADDED: New icon: SAND_TIMER -* ADDED: GuiLoadStyleFromMemory() (binary only) -* REVIEWED: GuiScrollBar() horizontal movement key -* REVIEWED: GuiTextBox() crash on cursor movement -* REVIEWED: GuiTextBox(), additional inputs support -* REVIEWED: GuiLabelButton(), avoid text cut -* REVIEWED: GuiTextInputBox(), password input -* REVIEWED: Local GetCodepointNext(), aligned with raylib -* REDESIGNED: GuiSlider*()/GuiScrollBar() to support out-of-bounds -* -* 3.5 (20-Apr-2023) ADDED: GuiTabBar(), based on GuiToggle() -* 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 -* REVIEWED: GuiScrollBar(), improve mouse-click behaviour -* REVIEWED: Library header info, more info, better organized -* REDESIGNED: GuiTextBox() 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 -* REDESIGNED: GuiPanel() to support text parameter -* REDESIGNED: GuiScrollPanel() to support text parameter -* REDESIGNED: GuiColorPicker() to support text parameter -* REDESIGNED: GuiColorPanel() to support text parameter -* REDESIGNED: GuiColorBarAlpha() to support text parameter -* REDESIGNED: GuiColorBarHue() to support text parameter -* REDESIGNED: GuiTextInputBox() to support password -* -* 3.1 (12-Jan-2022) REVIEWED: Default style for consistency (aligned with rGuiLayout v2.5 tool) -* REVIEWED: GuiLoadStyle() to support compressed font atlas image data and unload previous textures -* REVIEWED: External icons usage logic -* REVIEWED: GuiLine() for centered alignment when including text -* RENAMED: Multiple controls properties definitions to prepend RAYGUI_ -* RENAMED: RICON_ references to RAYGUI_ICON_ for library consistency -* Projects updated and multiple tweaks -* -* 3.0 (04-Nov-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 -* 2.6 (09-Sep-2019) ADDED: GuiTextInputBox() -* REDESIGNED: GuiListView*(), GuiDropdownBox(), GuiSlider*(), GuiProgressBar(), GuiMessageBox() -* REVIEWED: GuiTextBox(), GuiSpinner(), GuiValueBox(), GuiLoadStyle() -* Replaced property INNER_PADDING by TEXT_PADDING, renamed some properties -* ADDED: 8 new custom styles ready to use -* Multiple minor tweaks and bugs corrected -* -* 2.5 (28-May-2019) Implemented extended GuiTextBox(), GuiValueBox(), GuiSpinner() -* 2.3 (29-Apr-2019) ADDED: rIcons auxiliar library and support for it, multiple controls reviewed -* Refactor all controls drawing mechanism to use control state -* 2.2 (05-Feb-2019) ADDED: GuiScrollBar(), GuiScrollPanel(), reviewed GuiListView(), removed Gui*Ex() controls -* 2.1 (26-Dec-2018) REDESIGNED: GuiCheckBox(), GuiComboBox(), GuiDropdownBox(), GuiToggleGroup() > Use combined text string -* REDESIGNED: Style system (breaking change) -* 2.0 (08-Nov-2018) ADDED: Support controls guiLock and custom fonts -* REVIEWED: GuiComboBox(), GuiListView()... -* 1.9 (09-Oct-2018) REVIEWED: GuiGrid(), GuiTextBox(), GuiTextBoxMulti(), GuiValueBox()... -a 1.8 (01-May-2018) Lot of rework and redesign to align with rGuiStyler and rGuiLayout -* 1.5 (21-Jun-2017) Working in an improved styles system -* 1.4 (15-Jun-2017) Rewritten all GUI functions (removed useless ones) -* 1.3 (12-Jun-2017) Complete redesign of style system -* 1.1 (01-Jun-2017) Complete review of the library -* 1.0 (07-Jun-2016) Converted to header-only by Ramon Santamaria. -* 0.9 (07-Mar-2016) Reviewed and tested by Albert Martos, Ian Eito, Sergio Martinez and Ramon Santamaria. -* 0.8 (27-Aug-2015) Initial release. Implemented by Kevin Gato, Daniel Nicolás and Ramon Santamaria. -* -* DEPENDENCIES: -* raylib 5.0 - Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing -* -* STANDALONE MODE: -* By default raygui depends on raylib mostly for the inputs and the drawing functionality but that dependency can be disabled -* with the config flag RAYGUI_STANDALONE. In that case is up to the user to provide another backend to cover library needs. -* -* The following functions should be redefined for a custom backend: -* -* - Vector2 GetMousePosition(void); -* - float GetMouseWheelMove(void); -* - bool IsMouseButtonDown(int button); -* - bool IsMouseButtonPressed(int button); -* - bool IsMouseButtonReleased(int button); -* - bool IsKeyDown(int key); -* - bool IsKeyPressed(int key); -* - int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() -* -* - void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle() -* - void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() -* -* - Font GetFontDefault(void); // -- GuiLoadStyleDefault() -* - Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle() -* - Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image -* - void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization) -* - char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data -* - void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data -* - const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs -* - int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list -* - void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list -* - unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle() -* -* CONTRIBUTORS: -* Ramon Santamaria: Supervision, review, redesign, update and maintenance -* Vlad Adrian: Complete rewrite of GuiTextBox() to support extended features (2019) -* Sergio Martinez: Review, testing (2015) and redesign of multiple controls (2018) -* Adria Arranz: Testing and implementation of additional controls (2018) -* Jordi Jorba: Testing and implementation of additional controls (2018) -* Albert Martos: Review and testing of the library (2015) -* Ian Eito: Review and testing of the library (2015) -* Kevin Gato: Initial implementation of basic components (2014) -* Daniel Nicolas: Initial implementation of basic components (2014) -* -* -* LICENSE: zlib/libpng -* -* Copyright (c) 2014-2024 Ramon Santamaria (@raysan5) -* -* This software is provided "as-is", without any express or implied warranty. In no event -* will the authors be held liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, including commercial -* applications, and to alter it and redistribute it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not claim that you -* wrote the original software. If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not be misrepresented -* as being the original software. -* -* 3. This notice may not be removed or altered from any source distribution. -* -**********************************************************************************************/ - -#ifndef RAYGUI_H -#define RAYGUI_H - -#define RAYGUI_VERSION_MAJOR 4 -#define RAYGUI_VERSION_MINOR 1 -#define RAYGUI_VERSION_PATCH 0 -#define RAYGUI_VERSION "4.1-dev" - -#if !defined(RAYGUI_STANDALONE) - #include -#endif - -// Function specifiers in case library is build/used as a shared library (Windows) -// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll -#if defined(_WIN32) - #if defined(BUILD_LIBTYPE_SHARED) - #define RAYGUIAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) - #elif defined(USE_LIBTYPE_SHARED) - #define RAYGUIAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) - #endif -#endif - -// Function specifiers definition -#ifndef RAYGUIAPI - #define RAYGUIAPI // Functions defined as 'extern' by default (implicit specifiers) -#endif - -//---------------------------------------------------------------------------------- -// Defines and Macros -//---------------------------------------------------------------------------------- -// Allow custom memory allocators -#ifndef RAYGUI_MALLOC - #define RAYGUI_MALLOC(sz) malloc(sz) -#endif -#ifndef RAYGUI_CALLOC - #define RAYGUI_CALLOC(n,sz) calloc(n,sz) -#endif -#ifndef RAYGUI_FREE - #define RAYGUI_FREE(p) free(p) -#endif - -// Simple log system to avoid printf() calls if required -// NOTE: Avoiding those calls, also avoids const strings memory usage -#define RAYGUI_SUPPORT_LOG_INFO -#if defined(RAYGUI_SUPPORT_LOG_INFO) - #define RAYGUI_LOG(...) printf(__VA_ARGS__) -#else - #define RAYGUI_LOG(...) -#endif - -//---------------------------------------------------------------------------------- -// Types and Structures Definition -// NOTE: Some types are required for RAYGUI_STANDALONE usage -//---------------------------------------------------------------------------------- -#if defined(RAYGUI_STANDALONE) - #ifndef __cplusplus - // Boolean type - #ifndef true - typedef enum { false, true } bool; - #endif - #endif - - // Vector2 type - typedef struct Vector2 { - float x; - float y; - } Vector2; - - // Vector3 type // -- ConvertHSVtoRGB(), ConvertRGBtoHSV() - typedef struct Vector3 { - float x; - float y; - float z; - } Vector3; - - // Color type, RGBA (32bit) - typedef struct Color { - unsigned char r; - unsigned char g; - unsigned char b; - unsigned char a; - } Color; - - // Rectangle type - typedef struct Rectangle { - float x; - float y; - float width; - float height; - } Rectangle; - - // TODO: Texture2D type is very coupled to raylib, required by Font type - // It should be redesigned to be provided by user - typedef struct Texture2D { - unsigned int id; // OpenGL texture id - int width; // Texture base width - int height; // Texture base height - int mipmaps; // Mipmap levels, 1 by default - int format; // Data format (PixelFormat type) - } Texture2D; - - // Image, pixel data stored in CPU memory (RAM) - typedef struct Image { - void *data; // Image raw data - int width; // Image base width - int height; // Image base height - int mipmaps; // Mipmap levels, 1 by default - int format; // Data format (PixelFormat type) - } Image; - - // GlyphInfo, font characters glyphs info - typedef struct GlyphInfo { - int value; // Character value (Unicode) - int offsetX; // Character offset X when drawing - int offsetY; // Character offset Y when drawing - int advanceX; // Character advance position X - Image image; // Character image data - } GlyphInfo; - - // TODO: Font type is very coupled to raylib, mostly required by GuiLoadStyle() - // It should be redesigned to be provided by user - typedef struct Font { - int baseSize; // Base size (default chars height) - int glyphCount; // Number of glyph characters - int glyphPadding; // Padding around the glyph characters - Texture2D texture; // Texture atlas containing the glyphs - Rectangle *recs; // Rectangles in texture for the glyphs - GlyphInfo *glyphs; // Glyphs info data - } Font; -#endif - -// Style property -// NOTE: Used when exporting style as code for convenience -typedef struct GuiStyleProp { - unsigned short controlId; // Control identifier - unsigned short propertyId; // Property identifier - int propertyValue; // Property value -} GuiStyleProp; - -/* -// Controls text style -NOT USED- -// NOTE: Text style is defined by control -typedef struct GuiTextStyle { - unsigned int size; - int charSpacing; - int lineSpacing; - int alignmentH; - int alignmentV; - int padding; -} GuiTextStyle; -*/ - -// Gui control state -typedef enum { - STATE_NORMAL = 0, - STATE_FOCUSED, - STATE_PRESSED, - STATE_DISABLED -} GuiState; - -// Gui control text alignment -typedef enum { - TEXT_ALIGN_LEFT = 0, - TEXT_ALIGN_CENTER, - TEXT_ALIGN_RIGHT -} GuiTextAlignment; - -// Gui control text alignment vertical -// NOTE: Text vertical position inside the text bounds -typedef enum { - TEXT_ALIGN_TOP = 0, - TEXT_ALIGN_MIDDLE, - TEXT_ALIGN_BOTTOM -} GuiTextAlignmentVertical; - -// Gui control text wrap mode -// NOTE: Useful for multiline text -typedef enum { - TEXT_WRAP_NONE = 0, - TEXT_WRAP_CHAR, - TEXT_WRAP_WORD -} GuiTextWrapMode; - -// Gui controls -typedef enum { - // Default -> populates to all controls when set - DEFAULT = 0, - - // Basic controls - LABEL, // Used also for: LABELBUTTON - BUTTON, - TOGGLE, // Used also for: TOGGLEGROUP - SLIDER, // Used also for: SLIDERBAR, TOGGLESLIDER - PROGRESSBAR, - CHECKBOX, - COMBOBOX, - DROPDOWNBOX, - TEXTBOX, // Used also for: TEXTBOXMULTI - VALUEBOX, - SPINNER, // Uses: BUTTON, VALUEBOX - LISTVIEW, - COLORPICKER, - SCROLLBAR, - STATUSBAR -} GuiControl; - -// Gui base properties for every control -// NOTE: RAYGUI_MAX_PROPS_BASE properties (by default 16 properties) -typedef enum { - BORDER_COLOR_NORMAL = 0, // Control border color in STATE_NORMAL - BASE_COLOR_NORMAL, // Control base color in STATE_NORMAL - TEXT_COLOR_NORMAL, // Control text color in STATE_NORMAL - BORDER_COLOR_FOCUSED, // Control border color in STATE_FOCUSED - BASE_COLOR_FOCUSED, // Control base color in STATE_FOCUSED - TEXT_COLOR_FOCUSED, // Control text color in STATE_FOCUSED - BORDER_COLOR_PRESSED, // Control border color in STATE_PRESSED - BASE_COLOR_PRESSED, // Control base color in STATE_PRESSED - TEXT_COLOR_PRESSED, // Control text color in STATE_PRESSED - BORDER_COLOR_DISABLED, // Control border color in STATE_DISABLED - BASE_COLOR_DISABLED, // Control base color in STATE_DISABLED - TEXT_COLOR_DISABLED, // Control text color in STATE_DISABLED - BORDER_WIDTH, // Control border size, 0 for no border - //TEXT_SIZE, // Control text size (glyphs max height) -> GLOBAL for all controls - //TEXT_SPACING, // Control text spacing between glyphs -> GLOBAL for all controls - //TEXT_LINE_SPACING // Control text spacing between lines -> GLOBAL for all controls - TEXT_PADDING, // Control text padding, not considering border - TEXT_ALIGNMENT, // Control text horizontal alignment inside control text bound (after border and padding) - //TEXT_WRAP_MODE // Control text wrap-mode inside text bounds -> GLOBAL for all controls -} GuiControlProperty; - -// TODO: Which text styling properties should be global or per-control? -// At this moment TEXT_PADDING and TEXT_ALIGNMENT is configured and saved per control while -// TEXT_SIZE, TEXT_SPACING, TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE are global and -// should be configured by user as needed while defining the UI layout - -// Gui extended properties depend on control -// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default, max 8 properties) -//---------------------------------------------------------------------------------- -// DEFAULT extended properties -// NOTE: Those properties are common to all controls or global -// WARNING: We only have 8 slots for those properties by default!!! -> New global control: TEXT? -typedef enum { - TEXT_SIZE = 16, // Text size (glyphs max height) - TEXT_SPACING, // Text spacing between glyphs - LINE_COLOR, // Line control color - BACKGROUND_COLOR, // Background color - TEXT_LINE_SPACING, // Text spacing between lines - TEXT_ALIGNMENT_VERTICAL, // Text vertical alignment inside text bounds (after border and padding) - TEXT_WRAP_MODE // Text wrap-mode inside text bounds - //TEXT_DECORATION // Text decoration: 0-None, 1-Underline, 2-Line-through, 3-Overline - //TEXT_DECORATION_THICK // Text decoration line thickness -} GuiDefaultProperty; - -// Other possible text properties: -// TEXT_WEIGHT // Normal, Italic, Bold -> Requires specific font change -// TEXT_INDENT // Text indentation -> Now using TEXT_PADDING... - -// Label -//typedef enum { } GuiLabelProperty; - -// Button/Spinner -//typedef enum { } GuiButtonProperty; - -// Toggle/ToggleGroup -typedef enum { - GROUP_PADDING = 16, // ToggleGroup separation between toggles -} GuiToggleProperty; - -// Slider/SliderBar -typedef enum { - SLIDER_WIDTH = 16, // Slider size of internal bar - SLIDER_PADDING // Slider/SliderBar internal bar padding -} GuiSliderProperty; - -// ProgressBar -typedef enum { - PROGRESS_PADDING = 16, // ProgressBar internal padding -} GuiProgressBarProperty; - -// ScrollBar -typedef enum { - ARROWS_SIZE = 16, // ScrollBar arrows size - ARROWS_VISIBLE, // ScrollBar arrows visible - SCROLL_SLIDER_PADDING, // ScrollBar slider internal padding - SCROLL_SLIDER_SIZE, // ScrollBar slider size - SCROLL_PADDING, // ScrollBar scroll padding from arrows - SCROLL_SPEED, // ScrollBar scrolling speed -} GuiScrollBarProperty; - -// CheckBox -typedef enum { - CHECK_PADDING = 16 // CheckBox internal check padding -} GuiCheckBoxProperty; - -// ComboBox -typedef enum { - COMBO_BUTTON_WIDTH = 16, // ComboBox right button width - COMBO_BUTTON_SPACING // ComboBox button separation -} GuiComboBoxProperty; - -// DropdownBox -typedef enum { - ARROW_PADDING = 16, // DropdownBox arrow separation from border and items - DROPDOWN_ITEMS_SPACING // DropdownBox items separation -} GuiDropdownBoxProperty; - -// TextBox/TextBoxMulti/ValueBox/Spinner -typedef enum { - TEXT_READONLY = 16, // TextBox in read-only mode: 0-text editable, 1-text no-editable -} GuiTextBoxProperty; - -// Spinner -typedef enum { - SPIN_BUTTON_WIDTH = 16, // Spinner left/right buttons width - SPIN_BUTTON_SPACING, // Spinner buttons separation -} GuiSpinnerProperty; - -// ListView -typedef enum { - LIST_ITEMS_HEIGHT = 16, // ListView items height - LIST_ITEMS_SPACING, // ListView items separation - SCROLLBAR_WIDTH, // ListView scrollbar size (usually width) - SCROLLBAR_SIDE, // ListView scrollbar side (0-SCROLLBAR_LEFT_SIDE, 1-SCROLLBAR_RIGHT_SIDE) -} GuiListViewProperty; - -// ColorPicker -typedef enum { - COLOR_SELECTOR_SIZE = 16, - HUEBAR_WIDTH, // ColorPicker right hue bar width - HUEBAR_PADDING, // ColorPicker right hue bar separation from panel - HUEBAR_SELECTOR_HEIGHT, // ColorPicker right hue bar selector height - HUEBAR_SELECTOR_OVERFLOW // ColorPicker right hue bar selector overflow -} GuiColorPickerProperty; - -#define SCROLLBAR_LEFT_SIDE 0 -#define SCROLLBAR_RIGHT_SIDE 1 - -//---------------------------------------------------------------------------------- -// Global Variables Definition -//---------------------------------------------------------------------------------- -// ... - -//---------------------------------------------------------------------------------- -// Module Functions Declaration -//---------------------------------------------------------------------------------- - -#if defined(__cplusplus) -extern "C" { // Prevents name mangling of functions -#endif - -// Global gui state control functions -RAYGUIAPI void GuiEnable(void); // Enable gui controls (global state) -RAYGUIAPI void GuiDisable(void); // Disable gui controls (global state) -RAYGUIAPI void GuiLock(void); // Lock gui controls (global state) -RAYGUIAPI void GuiUnlock(void); // Unlock gui controls (global state) -RAYGUIAPI bool GuiIsLocked(void); // Check if gui is locked (global state) -RAYGUIAPI void GuiSetAlpha(float alpha); // Set gui controls alpha (global state), alpha goes from 0.0f to 1.0f -RAYGUIAPI void GuiSetState(int state); // Set gui state (global state) -RAYGUIAPI int GuiGetState(void); // Get gui state (global state) - -// Font set/get functions -RAYGUIAPI void GuiSetFont(Font font); // Set gui custom font (global state) -RAYGUIAPI Font GuiGetFont(void); // Get gui custom font (global state) - -// Style set/get functions -RAYGUIAPI void GuiSetStyle(int control, int property, int value); // Set one style property -RAYGUIAPI int GuiGetStyle(int control, int property); // Get one style property - -// Styles loading functions -RAYGUIAPI void GuiLoadStyle(const char *fileName); // Load style file over global style variable (.rgs) -RAYGUIAPI void GuiLoadStyleDefault(void); // Load style default over global style - -// Tooltips management functions -RAYGUIAPI void GuiEnableTooltip(void); // Enable gui tooltips (global state) -RAYGUIAPI void GuiDisableTooltip(void); // Disable gui tooltips (global state) -RAYGUIAPI void GuiSetTooltip(const char *tooltip); // Set tooltip string - -// Icons functionality -RAYGUIAPI const char *GuiIconText(int iconId, const char *text); // Get text with icon id prepended (if supported) -#if !defined(RAYGUI_NO_ICONS) -RAYGUIAPI void GuiSetIconScale(int scale); // Set default icon drawing size -RAYGUIAPI unsigned int *GuiGetIcons(void); // Get raygui icons data pointer -RAYGUIAPI char **GuiLoadIcons(const char *fileName, bool loadIconsName); // Load raygui icons file (.rgi) into internal icons data -RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); // Draw icon using pixel size at specified position -#endif - -// Controls -//---------------------------------------------------------------------------------------------------------- -// Container/separator controls, useful for controls organization -RAYGUIAPI int GuiWindowBox(Rectangle bounds, const char *title); // Window Box control, shows a window that can be closed -RAYGUIAPI int GuiGroupBox(Rectangle bounds, const char *text); // Group Box control with text name -RAYGUIAPI int GuiLine(Rectangle bounds, const char *text); // Line separator control, could contain text -RAYGUIAPI int GuiPanel(Rectangle bounds, const char *text); // Panel control, useful to group controls -RAYGUIAPI int GuiTabBar(Rectangle bounds, const char **text, int count, int *active); // Tab Bar control, returns TAB to be closed or -1 -RAYGUIAPI int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view); // Scroll Panel control - -// Basic controls set -RAYGUIAPI int GuiLabel(Rectangle bounds, const char *text); // Label control -RAYGUIAPI int GuiButton(Rectangle bounds, const char *text); // Button control, returns true when clicked -RAYGUIAPI int GuiLabelButton(Rectangle bounds, const char *text); // Label button control, returns true when clicked -RAYGUIAPI int GuiToggle(Rectangle bounds, const char *text, bool *active); // Toggle Button control -RAYGUIAPI int GuiToggleGroup(Rectangle bounds, const char *text, int *active); // Toggle Group control -RAYGUIAPI int GuiToggleSlider(Rectangle bounds, const char *text, int *active); // Toggle Slider control -RAYGUIAPI int GuiCheckBox(Rectangle bounds, const char *text, bool *checked); // Check Box control, returns true when active -RAYGUIAPI int GuiComboBox(Rectangle bounds, const char *text, int *active); // Combo Box control - -RAYGUIAPI int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control -RAYGUIAPI int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control -RAYGUIAPI int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers -RAYGUIAPI int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text - -RAYGUIAPI int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider control -RAYGUIAPI int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control -RAYGUIAPI int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Progress Bar control -RAYGUIAPI int GuiStatusBar(Rectangle bounds, const char *text); // Status Bar control, shows info text -RAYGUIAPI int GuiDummyRec(Rectangle bounds, const char *text); // Dummy control for placeholders -RAYGUIAPI int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell); // Grid control - -// Advance controls set -RAYGUIAPI int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active); // List View control -RAYGUIAPI int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus); // List View with extended parameters -RAYGUIAPI int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons); // Message Box control, displays a message -RAYGUIAPI int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive); // Text Input Box control, ask for text, supports secret -RAYGUIAPI int GuiColorPicker(Rectangle bounds, const char *text, Color *color); // Color Picker control (multiple color controls) -RAYGUIAPI int GuiColorPanel(Rectangle bounds, const char *text, Color *color); // Color Panel control -RAYGUIAPI int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha); // Color Bar Alpha control -RAYGUIAPI int GuiColorBarHue(Rectangle bounds, const char *text, float *value); // Color Bar Hue control -RAYGUIAPI int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Picker control that avoids conversion to RGB on each call (multiple color controls) -RAYGUIAPI int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Panel control that updates Hue-Saturation-Value color value, used by GuiColorPickerHSV() -//---------------------------------------------------------------------------------------------------------- - -#if !defined(RAYGUI_NO_ICONS) - -#if !defined(RAYGUI_CUSTOM_ICONS) -//---------------------------------------------------------------------------------- -// Icons enumeration -//---------------------------------------------------------------------------------- -typedef enum { - ICON_NONE = 0, - ICON_FOLDER_FILE_OPEN = 1, - ICON_FILE_SAVE_CLASSIC = 2, - ICON_FOLDER_OPEN = 3, - ICON_FOLDER_SAVE = 4, - ICON_FILE_OPEN = 5, - ICON_FILE_SAVE = 6, - ICON_FILE_EXPORT = 7, - ICON_FILE_ADD = 8, - ICON_FILE_DELETE = 9, - ICON_FILETYPE_TEXT = 10, - ICON_FILETYPE_AUDIO = 11, - ICON_FILETYPE_IMAGE = 12, - ICON_FILETYPE_PLAY = 13, - ICON_FILETYPE_VIDEO = 14, - ICON_FILETYPE_INFO = 15, - ICON_FILE_COPY = 16, - ICON_FILE_CUT = 17, - ICON_FILE_PASTE = 18, - ICON_CURSOR_HAND = 19, - ICON_CURSOR_POINTER = 20, - ICON_CURSOR_CLASSIC = 21, - ICON_PENCIL = 22, - ICON_PENCIL_BIG = 23, - ICON_BRUSH_CLASSIC = 24, - ICON_BRUSH_PAINTER = 25, - ICON_WATER_DROP = 26, - ICON_COLOR_PICKER = 27, - ICON_RUBBER = 28, - ICON_COLOR_BUCKET = 29, - ICON_TEXT_T = 30, - ICON_TEXT_A = 31, - ICON_SCALE = 32, - ICON_RESIZE = 33, - ICON_FILTER_POINT = 34, - ICON_FILTER_BILINEAR = 35, - ICON_CROP = 36, - ICON_CROP_ALPHA = 37, - ICON_SQUARE_TOGGLE = 38, - ICON_SYMMETRY = 39, - ICON_SYMMETRY_HORIZONTAL = 40, - ICON_SYMMETRY_VERTICAL = 41, - ICON_LENS = 42, - ICON_LENS_BIG = 43, - ICON_EYE_ON = 44, - ICON_EYE_OFF = 45, - ICON_FILTER_TOP = 46, - ICON_FILTER = 47, - ICON_TARGET_POINT = 48, - ICON_TARGET_SMALL = 49, - ICON_TARGET_BIG = 50, - ICON_TARGET_MOVE = 51, - ICON_CURSOR_MOVE = 52, - ICON_CURSOR_SCALE = 53, - ICON_CURSOR_SCALE_RIGHT = 54, - ICON_CURSOR_SCALE_LEFT = 55, - ICON_UNDO = 56, - ICON_REDO = 57, - ICON_REREDO = 58, - ICON_MUTATE = 59, - ICON_ROTATE = 60, - ICON_REPEAT = 61, - ICON_SHUFFLE = 62, - ICON_EMPTYBOX = 63, - ICON_TARGET = 64, - ICON_TARGET_SMALL_FILL = 65, - ICON_TARGET_BIG_FILL = 66, - ICON_TARGET_MOVE_FILL = 67, - ICON_CURSOR_MOVE_FILL = 68, - ICON_CURSOR_SCALE_FILL = 69, - ICON_CURSOR_SCALE_RIGHT_FILL = 70, - ICON_CURSOR_SCALE_LEFT_FILL = 71, - ICON_UNDO_FILL = 72, - ICON_REDO_FILL = 73, - ICON_REREDO_FILL = 74, - ICON_MUTATE_FILL = 75, - ICON_ROTATE_FILL = 76, - ICON_REPEAT_FILL = 77, - ICON_SHUFFLE_FILL = 78, - ICON_EMPTYBOX_SMALL = 79, - ICON_BOX = 80, - ICON_BOX_TOP = 81, - ICON_BOX_TOP_RIGHT = 82, - ICON_BOX_RIGHT = 83, - ICON_BOX_BOTTOM_RIGHT = 84, - ICON_BOX_BOTTOM = 85, - ICON_BOX_BOTTOM_LEFT = 86, - ICON_BOX_LEFT = 87, - ICON_BOX_TOP_LEFT = 88, - ICON_BOX_CENTER = 89, - ICON_BOX_CIRCLE_MASK = 90, - ICON_POT = 91, - ICON_ALPHA_MULTIPLY = 92, - ICON_ALPHA_CLEAR = 93, - ICON_DITHERING = 94, - ICON_MIPMAPS = 95, - ICON_BOX_GRID = 96, - ICON_GRID = 97, - ICON_BOX_CORNERS_SMALL = 98, - ICON_BOX_CORNERS_BIG = 99, - ICON_FOUR_BOXES = 100, - ICON_GRID_FILL = 101, - ICON_BOX_MULTISIZE = 102, - ICON_ZOOM_SMALL = 103, - ICON_ZOOM_MEDIUM = 104, - ICON_ZOOM_BIG = 105, - ICON_ZOOM_ALL = 106, - ICON_ZOOM_CENTER = 107, - ICON_BOX_DOTS_SMALL = 108, - ICON_BOX_DOTS_BIG = 109, - ICON_BOX_CONCENTRIC = 110, - ICON_BOX_GRID_BIG = 111, - ICON_OK_TICK = 112, - ICON_CROSS = 113, - ICON_ARROW_LEFT = 114, - ICON_ARROW_RIGHT = 115, - ICON_ARROW_DOWN = 116, - ICON_ARROW_UP = 117, - ICON_ARROW_LEFT_FILL = 118, - ICON_ARROW_RIGHT_FILL = 119, - ICON_ARROW_DOWN_FILL = 120, - ICON_ARROW_UP_FILL = 121, - ICON_AUDIO = 122, - ICON_FX = 123, - ICON_WAVE = 124, - ICON_WAVE_SINUS = 125, - ICON_WAVE_SQUARE = 126, - ICON_WAVE_TRIANGULAR = 127, - ICON_CROSS_SMALL = 128, - ICON_PLAYER_PREVIOUS = 129, - ICON_PLAYER_PLAY_BACK = 130, - ICON_PLAYER_PLAY = 131, - ICON_PLAYER_PAUSE = 132, - ICON_PLAYER_STOP = 133, - ICON_PLAYER_NEXT = 134, - ICON_PLAYER_RECORD = 135, - ICON_MAGNET = 136, - ICON_LOCK_CLOSE = 137, - ICON_LOCK_OPEN = 138, - ICON_CLOCK = 139, - ICON_TOOLS = 140, - ICON_GEAR = 141, - ICON_GEAR_BIG = 142, - ICON_BIN = 143, - ICON_HAND_POINTER = 144, - ICON_LASER = 145, - ICON_COIN = 146, - ICON_EXPLOSION = 147, - ICON_1UP = 148, - ICON_PLAYER = 149, - ICON_PLAYER_JUMP = 150, - ICON_KEY = 151, - ICON_DEMON = 152, - ICON_TEXT_POPUP = 153, - ICON_GEAR_EX = 154, - ICON_CRACK = 155, - ICON_CRACK_POINTS = 156, - ICON_STAR = 157, - ICON_DOOR = 158, - ICON_EXIT = 159, - ICON_MODE_2D = 160, - ICON_MODE_3D = 161, - ICON_CUBE = 162, - ICON_CUBE_FACE_TOP = 163, - ICON_CUBE_FACE_LEFT = 164, - ICON_CUBE_FACE_FRONT = 165, - ICON_CUBE_FACE_BOTTOM = 166, - ICON_CUBE_FACE_RIGHT = 167, - ICON_CUBE_FACE_BACK = 168, - ICON_CAMERA = 169, - ICON_SPECIAL = 170, - ICON_LINK_NET = 171, - ICON_LINK_BOXES = 172, - ICON_LINK_MULTI = 173, - ICON_LINK = 174, - ICON_LINK_BROKE = 175, - ICON_TEXT_NOTES = 176, - ICON_NOTEBOOK = 177, - ICON_SUITCASE = 178, - ICON_SUITCASE_ZIP = 179, - ICON_MAILBOX = 180, - ICON_MONITOR = 181, - ICON_PRINTER = 182, - ICON_PHOTO_CAMERA = 183, - ICON_PHOTO_CAMERA_FLASH = 184, - ICON_HOUSE = 185, - ICON_HEART = 186, - ICON_CORNER = 187, - ICON_VERTICAL_BARS = 188, - ICON_VERTICAL_BARS_FILL = 189, - ICON_LIFE_BARS = 190, - ICON_INFO = 191, - ICON_CROSSLINE = 192, - ICON_HELP = 193, - ICON_FILETYPE_ALPHA = 194, - ICON_FILETYPE_HOME = 195, - ICON_LAYERS_VISIBLE = 196, - ICON_LAYERS = 197, - ICON_WINDOW = 198, - ICON_HIDPI = 199, - ICON_FILETYPE_BINARY = 200, - ICON_HEX = 201, - ICON_SHIELD = 202, - ICON_FILE_NEW = 203, - ICON_FOLDER_ADD = 204, - ICON_ALARM = 205, - ICON_CPU = 206, - ICON_ROM = 207, - ICON_STEP_OVER = 208, - ICON_STEP_INTO = 209, - ICON_STEP_OUT = 210, - ICON_RESTART = 211, - ICON_BREAKPOINT_ON = 212, - ICON_BREAKPOINT_OFF = 213, - ICON_BURGER_MENU = 214, - ICON_CASE_SENSITIVE = 215, - ICON_REG_EXP = 216, - ICON_FOLDER = 217, - ICON_FILE = 218, - ICON_SAND_TIMER = 219, - ICON_WARNING = 220, - ICON_HELP_BOX = 221, - ICON_INFO_BOX = 222, - ICON_223 = 223, - ICON_224 = 224, - ICON_225 = 225, - ICON_226 = 226, - ICON_227 = 227, - ICON_228 = 228, - ICON_229 = 229, - ICON_230 = 230, - ICON_231 = 231, - ICON_232 = 232, - ICON_233 = 233, - ICON_234 = 234, - ICON_235 = 235, - ICON_236 = 236, - ICON_237 = 237, - ICON_238 = 238, - ICON_239 = 239, - ICON_240 = 240, - ICON_241 = 241, - ICON_242 = 242, - ICON_243 = 243, - ICON_244 = 244, - ICON_245 = 245, - ICON_246 = 246, - ICON_247 = 247, - ICON_248 = 248, - ICON_249 = 249, - ICON_250 = 250, - ICON_251 = 251, - ICON_252 = 252, - ICON_253 = 253, - ICON_254 = 254, - ICON_255 = 255, -} GuiIconName; -#endif - -#endif - -#if defined(__cplusplus) -} // Prevents name mangling of functions -#endif - -#endif // RAYGUI_H - -/*********************************************************************************** -* -* RAYGUI IMPLEMENTATION -* -************************************************************************************/ - -#if defined(RAYGUI_IMPLEMENTATION) - -#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(), GuiValueBox()], memset(), memcpy() -#include // Required for: va_list, va_start(), vfprintf(), va_end() [TextFormat()] -#include // Required for: roundf() [GuiColorPicker()] - -#ifdef __cplusplus - #define RAYGUI_CLITERAL(name) name -#else - #define RAYGUI_CLITERAL(name) (name) -#endif - -// Check if two rectangles are equal, used to validate a slider bounds as an id -#ifndef CHECK_BOUNDS_ID - #define CHECK_BOUNDS_ID(src, dst) ((src.x == dst.x) && (src.y == dst.y) && (src.width == dst.width) && (src.height == dst.height)) -#endif - -#if !defined(RAYGUI_NO_ICONS) && !defined(RAYGUI_CUSTOM_ICONS) - -// Embedded icons, no external file provided -#define RAYGUI_ICON_SIZE 16 // Size of icons in pixels (squared) -#define RAYGUI_ICON_MAX_ICONS 256 // Maximum number of icons -#define RAYGUI_ICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id - -// Icons data is defined by bit array (every bit represents one pixel) -// Those arrays are stored as unsigned int data arrays, so, -// every array element defines 32 pixels (bits) of information -// One icon is defined by 8 int, (8 int * 32 bit = 256 bit = 16*16 pixels) -// NOTE: Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels) -#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32) - -//---------------------------------------------------------------------------------- -// Icons data for all gui possible icons (allocated on data segment by default) -// -// NOTE 1: Every icon is codified in binary form, using 1 bit per pixel, so, -// every 16x16 icon requires 8 integers (16*16/32) to be stored -// -// NOTE 2: A different icon set could be loaded over this array using GuiLoadIcons(), -// but loaded icons set must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS -// -// guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB -//---------------------------------------------------------------------------------- -static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_NONE - 0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // ICON_FOLDER_FILE_OPEN - 0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // ICON_FILE_SAVE_CLASSIC - 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // ICON_FOLDER_OPEN - 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // ICON_FOLDER_SAVE - 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // ICON_FILE_OPEN - 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // ICON_FILE_SAVE - 0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // ICON_FILE_EXPORT - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // ICON_FILE_ADD - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // ICON_FILE_DELETE - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_FILETYPE_TEXT - 0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // ICON_FILETYPE_AUDIO - 0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // ICON_FILETYPE_IMAGE - 0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // ICON_FILETYPE_PLAY - 0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // ICON_FILETYPE_VIDEO - 0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // ICON_FILETYPE_INFO - 0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // ICON_FILE_COPY - 0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // ICON_FILE_CUT - 0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // ICON_FILE_PASTE - 0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_CURSOR_HAND - 0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // ICON_CURSOR_POINTER - 0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // ICON_CURSOR_CLASSIC - 0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // ICON_PENCIL - 0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // ICON_PENCIL_BIG - 0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // ICON_BRUSH_CLASSIC - 0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // ICON_BRUSH_PAINTER - 0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // ICON_WATER_DROP - 0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // ICON_COLOR_PICKER - 0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // ICON_RUBBER - 0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // ICON_COLOR_BUCKET - 0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // ICON_TEXT_T - 0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // ICON_TEXT_A - 0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // ICON_SCALE - 0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // ICON_RESIZE - 0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_POINT - 0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_BILINEAR - 0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // ICON_CROP - 0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // ICON_CROP_ALPHA - 0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // ICON_SQUARE_TOGGLE - 0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // ICON_SYMMETRY - 0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // ICON_SYMMETRY_HORIZONTAL - 0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // ICON_SYMMETRY_VERTICAL - 0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // ICON_LENS - 0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // ICON_LENS_BIG - 0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // ICON_EYE_ON - 0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // ICON_EYE_OFF - 0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // ICON_FILTER_TOP - 0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // ICON_FILTER - 0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_POINT - 0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL - 0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG - 0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // ICON_TARGET_MOVE - 0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // ICON_CURSOR_MOVE - 0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // ICON_CURSOR_SCALE - 0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // ICON_CURSOR_SCALE_RIGHT - 0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // ICON_CURSOR_SCALE_LEFT - 0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO - 0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO - 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // ICON_REREDO - 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // ICON_MUTATE - 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // ICON_ROTATE - 0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // ICON_REPEAT - 0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // ICON_SHUFFLE - 0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // ICON_EMPTYBOX - 0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // ICON_TARGET - 0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL_FILL - 0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG_FILL - 0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // ICON_TARGET_MOVE_FILL - 0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // ICON_CURSOR_MOVE_FILL - 0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // ICON_CURSOR_SCALE_FILL - 0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // ICON_CURSOR_SCALE_RIGHT_FILL - 0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // ICON_CURSOR_SCALE_LEFT_FILL - 0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO_FILL - 0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO_FILL - 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // ICON_REREDO_FILL - 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // ICON_MUTATE_FILL - 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // ICON_ROTATE_FILL - 0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // ICON_REPEAT_FILL - 0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // ICON_SHUFFLE_FILL - 0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // ICON_EMPTYBOX_SMALL - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX - 0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP - 0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_RIGHT - 0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_RIGHT - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // ICON_BOX_BOTTOM_RIGHT - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // ICON_BOX_BOTTOM - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // ICON_BOX_BOTTOM_LEFT - 0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_LEFT - 0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_LEFT - 0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_CENTER - 0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // ICON_BOX_CIRCLE_MASK - 0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // ICON_POT - 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // ICON_ALPHA_MULTIPLY - 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // ICON_ALPHA_CLEAR - 0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // ICON_DITHERING - 0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // ICON_MIPMAPS - 0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // ICON_BOX_GRID - 0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // ICON_GRID - 0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // ICON_BOX_CORNERS_SMALL - 0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // ICON_BOX_CORNERS_BIG - 0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // ICON_FOUR_BOXES - 0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // ICON_GRID_FILL - 0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // ICON_BOX_MULTISIZE - 0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_SMALL - 0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_MEDIUM - 0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // ICON_ZOOM_BIG - 0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // ICON_ZOOM_ALL - 0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // ICON_ZOOM_CENTER - 0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // ICON_BOX_DOTS_SMALL - 0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // ICON_BOX_DOTS_BIG - 0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // ICON_BOX_CONCENTRIC - 0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // ICON_BOX_GRID_BIG - 0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // ICON_OK_TICK - 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // ICON_CROSS - 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // ICON_ARROW_LEFT - 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // ICON_ARROW_RIGHT - 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // ICON_ARROW_DOWN - 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP - 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // ICON_ARROW_LEFT_FILL - 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // ICON_ARROW_RIGHT_FILL - 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // ICON_ARROW_DOWN_FILL - 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP_FILL - 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // ICON_AUDIO - 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // ICON_FX - 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // ICON_WAVE - 0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // ICON_WAVE_SINUS - 0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // ICON_WAVE_SQUARE - 0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // ICON_WAVE_TRIANGULAR - 0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // ICON_CROSS_SMALL - 0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // ICON_PLAYER_PREVIOUS - 0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // ICON_PLAYER_PLAY_BACK - 0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // ICON_PLAYER_PLAY - 0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // ICON_PLAYER_PAUSE - 0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // ICON_PLAYER_STOP - 0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // ICON_PLAYER_NEXT - 0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // ICON_PLAYER_RECORD - 0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // ICON_MAGNET - 0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_CLOSE - 0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_OPEN - 0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // ICON_CLOCK - 0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // ICON_TOOLS - 0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // ICON_GEAR - 0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // ICON_GEAR_BIG - 0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // ICON_BIN - 0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // ICON_HAND_POINTER - 0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // ICON_LASER - 0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // ICON_COIN - 0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // ICON_EXPLOSION - 0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // ICON_1UP - 0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // ICON_PLAYER - 0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // ICON_PLAYER_JUMP - 0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // ICON_KEY - 0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // ICON_DEMON - 0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // ICON_TEXT_POPUP - 0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // ICON_GEAR_EX - 0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK - 0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK_POINTS - 0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // ICON_STAR - 0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // ICON_DOOR - 0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // ICON_EXIT - 0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // ICON_MODE_2D - 0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // ICON_MODE_3D - 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE - 0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_TOP - 0x7fe00000, 0x50386030, 0x47c2483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // ICON_CUBE_FACE_LEFT - 0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // ICON_CUBE_FACE_FRONT - 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3bf27be2, 0x0bfe1bfa, 0x000007fe, // ICON_CUBE_FACE_BOTTOM - 0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // ICON_CUBE_FACE_RIGHT - 0x7fe00000, 0x6fe85ff0, 0x781e77e4, 0x7be27be2, 0x7be27be2, 0x24127be2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_BACK - 0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // ICON_CAMERA - 0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // ICON_SPECIAL - 0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // ICON_LINK_NET - 0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // ICON_LINK_BOXES - 0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // ICON_LINK_MULTI - 0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // ICON_LINK - 0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // ICON_LINK_BROKE - 0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_TEXT_NOTES - 0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // ICON_NOTEBOOK - 0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // ICON_SUITCASE - 0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // ICON_SUITCASE_ZIP - 0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // ICON_MAILBOX - 0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // ICON_MONITOR - 0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // ICON_PRINTER - 0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA - 0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA_FLASH - 0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // ICON_HOUSE - 0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // ICON_HEART - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // ICON_CORNER - 0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // ICON_VERTICAL_BARS - 0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // ICON_VERTICAL_BARS_FILL - 0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // ICON_LIFE_BARS - 0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // ICON_INFO - 0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // ICON_CROSSLINE - 0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // ICON_HELP - 0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // ICON_FILETYPE_ALPHA - 0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // ICON_FILETYPE_HOME - 0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS_VISIBLE - 0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS - 0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_WINDOW - 0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // ICON_HIDPI - 0x3ff00000, 0x201c2010, 0x2a842e84, 0x2e842a84, 0x2ba42004, 0x2aa42aa4, 0x20042ba4, 0x00003ffc, // ICON_FILETYPE_BINARY - 0x00000000, 0x00000000, 0x00120012, 0x4a5e4bd2, 0x485233d2, 0x00004bd2, 0x00000000, 0x00000000, // ICON_HEX - 0x01800000, 0x381c0660, 0x23c42004, 0x23c42044, 0x13c82204, 0x08101008, 0x02400420, 0x00000180, // ICON_SHIELD - 0x007e0000, 0x20023fc2, 0x40227fe2, 0x400a403a, 0x400a400a, 0x400a400a, 0x4008400e, 0x00007ff8, // ICON_FILE_NEW - 0x00000000, 0x0042007e, 0x40027fc2, 0x44024002, 0x5f024402, 0x44024402, 0x7ffe4002, 0x00000000, // ICON_FOLDER_ADD - 0x44220000, 0x12482244, 0xf3cf0000, 0x14280420, 0x48122424, 0x08100810, 0x1ff81008, 0x03c00420, // ICON_ALARM - 0x0aa00000, 0x1ff80aa0, 0x1068700e, 0x1008706e, 0x1008700e, 0x1008700e, 0x0aa01ff8, 0x00000aa0, // ICON_CPU - 0x07e00000, 0x04201db8, 0x04a01c38, 0x04a01d38, 0x04a01d38, 0x04a01d38, 0x04201d38, 0x000007e0, // ICON_ROM - 0x00000000, 0x03c00000, 0x3c382ff0, 0x3c04380c, 0x01800000, 0x03c003c0, 0x00000180, 0x00000000, // ICON_STEP_OVER - 0x01800000, 0x01800180, 0x01800180, 0x03c007e0, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_INTO - 0x01800000, 0x07e003c0, 0x01800180, 0x01800180, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_OUT - 0x00000000, 0x0ff003c0, 0x181c1c34, 0x303c301c, 0x30003000, 0x1c301800, 0x03c00ff0, 0x00000000, // ICON_RESTART - 0x00000000, 0x00000000, 0x07e003c0, 0x0ff00ff0, 0x0ff00ff0, 0x03c007e0, 0x00000000, 0x00000000, // ICON_BREAKPOINT_ON - 0x00000000, 0x00000000, 0x042003c0, 0x08100810, 0x08100810, 0x03c00420, 0x00000000, 0x00000000, // ICON_BREAKPOINT_OFF - 0x00000000, 0x00000000, 0x1ff81ff8, 0x1ff80000, 0x00001ff8, 0x1ff81ff8, 0x00000000, 0x00000000, // ICON_BURGER_MENU - 0x00000000, 0x00000000, 0x00880070, 0x0c880088, 0x1e8810f8, 0x3e881288, 0x00000000, 0x00000000, // ICON_CASE_SENSITIVE - 0x00000000, 0x02000000, 0x07000a80, 0x07001fc0, 0x02000a80, 0x00300030, 0x00000000, 0x00000000, // ICON_REG_EXP - 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_FOLDER - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x00003ffc, // ICON_FILE - 0x1ff00000, 0x20082008, 0x17d02fe8, 0x05400ba0, 0x09200540, 0x23881010, 0x2fe827c8, 0x00001ff0, // ICON_SAND_TIMER - 0x01800000, 0x02400240, 0x05a00420, 0x09900990, 0x11881188, 0x21842004, 0x40024182, 0x00003ffc, // ICON_WARNING - 0x7ffe0000, 0x4ff24002, 0x4c324ff2, 0x4f824c02, 0x41824f82, 0x41824002, 0x40024182, 0x00007ffe, // ICON_HELP_BOX - 0x7ffe0000, 0x41824002, 0x40024182, 0x41824182, 0x41824182, 0x41824182, 0x40024182, 0x00007ffe, // ICON_INFO_BOX - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_223 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_224 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_225 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_226 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_227 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_228 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_229 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_230 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_231 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_232 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_233 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_234 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_235 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_236 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_237 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_238 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_239 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_240 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_241 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_242 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_243 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_244 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_245 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_246 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_247 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_248 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_249 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_250 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_251 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_252 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_253 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_254 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_255 -}; - -// NOTE: A pointer to current icons array should be defined -static unsigned int *guiIconsPtr = guiIcons; - -#endif // !RAYGUI_NO_ICONS && !RAYGUI_CUSTOM_ICONS - -#ifndef RAYGUI_ICON_SIZE - #define RAYGUI_ICON_SIZE 0 -#endif - -// WARNING: Those values define the total size of the style data array, -// if changed, previous saved styles could become incompatible -#define RAYGUI_MAX_CONTROLS 16 // Maximum number of controls -#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of base properties -#define RAYGUI_MAX_PROPS_EXTENDED 8 // Maximum number of extended properties - -//---------------------------------------------------------------------------------- -// Types and Structures Definition -//---------------------------------------------------------------------------------- -// Gui control property style color element -typedef enum { BORDER = 0, BASE, TEXT, OTHER } GuiPropertyElement; - -//---------------------------------------------------------------------------------- -// Global Variables Definition -//---------------------------------------------------------------------------------- -static GuiState guiState = STATE_NORMAL; // Gui global state, if !STATE_NORMAL, forces defined state - -static Font guiFont = { 0 }; // Gui current font (WARNING: highly coupled to raylib) -static bool guiLocked = false; // Gui lock state (no inputs processed) -static float guiAlpha = 1.0f; // Gui controls transparency - -static unsigned int guiIconScale = 1; // Gui icon default scale (if icons enabled) - -static bool guiTooltip = false; // Tooltip enabled/disabled -static const char *guiTooltipPtr = NULL; // Tooltip string pointer (string provided by user) - -static bool guiControlExclusiveMode = false; // Gui control exclusive mode (no inputs processed except current control) -static Rectangle guiControlExclusiveRec = { 0 }; // Gui control exclusive bounds rectangle, used as an unique identifier - -static int textBoxCursorIndex = 0; // Cursor index, shared by all GuiTextBox*() -//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) -// -// NOTE 1: First set of BASE properties are generic to all controls but could be individually -// overwritten per control, first set of EXTENDED properties are generic to all controls and -// can not be overwritten individually but custom EXTENDED properties can be used by control -// -// NOTE 2: A new style set could be loaded over this array using GuiLoadStyle(), -// but default gui style could always be recovered with GuiLoadStyleDefault() -// -// guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB -//---------------------------------------------------------------------------------- -static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)] = { 0 }; - -static bool guiStyleLoaded = false; // Style loaded flag for lazy style initialization - -//---------------------------------------------------------------------------------- -// Standalone Mode Functions Declaration -// -// NOTE: raygui depend on some raylib input and drawing functions -// To use raygui as standalone library, below functions must be defined by the user -//---------------------------------------------------------------------------------- -#if defined(RAYGUI_STANDALONE) - -#define KEY_RIGHT 262 -#define KEY_LEFT 263 -#define KEY_DOWN 264 -#define KEY_UP 265 -#define KEY_BACKSPACE 259 -#define KEY_ENTER 257 - -#define MOUSE_LEFT_BUTTON 0 - -// Input required functions -//------------------------------------------------------------------------------- -static Vector2 GetMousePosition(void); -static float GetMouseWheelMove(void); -static bool IsMouseButtonDown(int button); -static bool IsMouseButtonPressed(int button); -static bool IsMouseButtonReleased(int button); - -static bool IsKeyDown(int key); -static bool IsKeyPressed(int key); -static int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() -//------------------------------------------------------------------------------- - -// Drawing required functions -//------------------------------------------------------------------------------- -static void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle() -static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() -//------------------------------------------------------------------------------- - -// Text required functions -//------------------------------------------------------------------------------- -static Font GetFontDefault(void); // -- GuiLoadStyleDefault() -static Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle(), load font - -static Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image -static void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization) - -static char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data -static void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data - -static const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs - -static int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list -static void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list - -static unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle() -//------------------------------------------------------------------------------- - -// raylib functions already implemented in raygui -//------------------------------------------------------------------------------- -static Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value -static int ColorToInt(Color color); // Returns hexadecimal value for a Color -static bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle -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 GetCodepointNext(const char *text, int *codepointSize); // 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 -//------------------------------------------------------------------------------- - -#endif // RAYGUI_STANDALONE - -//---------------------------------------------------------------------------------- -// Module specific Functions Declaration -//---------------------------------------------------------------------------------- -static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize); // Load style from memory (binary only) - -static int GetTextWidth(const char *text); // Gui get text width using gui font and style -static Rectangle GetTextBounds(int control, Rectangle bounds); // Get text bounds considering control bounds -static const char *GetTextIcon(const char *text, int *iconId); // Get text icon if provided and move text cursor - -static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint); // Gui draw text using default font -static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color); // Gui draw rectangle using default raygui style - -static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow); // Split controls text into multiple strings -static Vector3 ConvertHSVtoRGB(Vector3 hsv); // Convert color data from HSV to RGB -static Vector3 ConvertRGBtoHSV(Vector3 rgb); // Convert color data from RGB to HSV - -static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue); // Scroll bar control, used by GuiScrollPanel() -static void GuiTooltip(Rectangle controlRec); // Draw tooltip using control rec position - -static Color GuiFade(Color color, float alpha); // Fade color by an alpha factor - -//---------------------------------------------------------------------------------- -// Gui Setup Functions Definition -//---------------------------------------------------------------------------------- -// Enable gui global state -// NOTE: We check for STATE_DISABLED to avoid messing custom global state setups -void GuiEnable(void) { if (guiState == STATE_DISABLED) guiState = STATE_NORMAL; } - -// Disable gui global state -// NOTE: We check for STATE_NORMAL to avoid messing custom global state setups -void GuiDisable(void) { if (guiState == STATE_NORMAL) guiState = STATE_DISABLED; } - -// Lock gui global state -void GuiLock(void) { guiLocked = true; } - -// Unlock gui global state -void GuiUnlock(void) { guiLocked = false; } - -// Check if gui is locked (global state) -bool GuiIsLocked(void) { return guiLocked; } - -// Set gui controls alpha global state -void GuiSetAlpha(float alpha) -{ - if (alpha < 0.0f) alpha = 0.0f; - else if (alpha > 1.0f) alpha = 1.0f; - - guiAlpha = alpha; -} - -// Set gui state (global state) -void GuiSetState(int state) { guiState = (GuiState)state; } - -// Get gui state (global state) -int GuiGetState(void) { return guiState; } - -// Set custom gui font -// NOTE: Font loading/unloading is external to raygui -void GuiSetFont(Font font) -{ - if (font.texture.id > 0) - { - // NOTE: If we try to setup a font but default style has not been - // lazily loaded before, it will be overwritten, so we need to force - // default style loading first - if (!guiStyleLoaded) GuiLoadStyleDefault(); - - guiFont = font; - } -} - -// Get custom gui font -Font GuiGetFont(void) -{ - return guiFont; -} - -// Set control style property value -void GuiSetStyle(int control, int property, int value) -{ - if (!guiStyleLoaded) GuiLoadStyleDefault(); - guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value; - - // Default properties are propagated to all controls - if ((control == 0) && (property < RAYGUI_MAX_PROPS_BASE)) - { - for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) guiStyle[i*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value; - } -} - -// Get control style property value -int GuiGetStyle(int control, int property) -{ - if (!guiStyleLoaded) GuiLoadStyleDefault(); - return guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property]; -} - -//---------------------------------------------------------------------------------- -// Gui Controls Functions Definition -//---------------------------------------------------------------------------------- - -// Window Box control -int GuiWindowBox(Rectangle bounds, const char *title) -{ - // Window title bar height (including borders) - // NOTE: This define is also used by GuiMessageBox() and GuiTextInputBox() - #if !defined(RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT) - #define RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT 24 - #endif - - int result = 0; - //GuiState state = guiState; - - int statusBarHeight = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT; - - Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)statusBarHeight }; - if (bounds.height < statusBarHeight*2.0f) bounds.height = statusBarHeight*2.0f; - - Rectangle windowPanel = { bounds.x, bounds.y + (float)statusBarHeight - 1, bounds.width, bounds.height - (float)statusBarHeight + 1 }; - Rectangle closeButtonRec = { statusBar.x + statusBar.width - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - 20, - statusBar.y + statusBarHeight/2.0f - 18.0f/2.0f, 18, 18 }; - - // Update control - //-------------------------------------------------------------------- - // NOTE: Logic is directly managed by button - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiStatusBar(statusBar, title); // Draw window header as status bar - GuiPanel(windowPanel, NULL); // Draw window base - - // Draw window close button - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 1); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); -#if defined(RAYGUI_NO_ICONS) - result = GuiButton(closeButtonRec, "x"); -#else - result = GuiButton(closeButtonRec, GuiIconText(ICON_CROSS_SMALL, NULL)); -#endif - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); - //-------------------------------------------------------------------- - - return result; // Window close button clicked: result = 1 -} - -// Group Box control with text name -int GuiGroupBox(Rectangle bounds, const char *text) -{ - #if !defined(RAYGUI_GROUPBOX_LINE_THICK) - #define RAYGUI_GROUPBOX_LINE_THICK 1 - #endif - - int result = 0; - GuiState state = guiState; - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, RAYGUI_GROUPBOX_LINE_THICK }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR))); - - GuiLine(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y - GuiGetStyle(DEFAULT, TEXT_SIZE)/2, bounds.width, (float)GuiGetStyle(DEFAULT, TEXT_SIZE) }, text); - //-------------------------------------------------------------------- - - return result; -} - -// Line control -int GuiLine(Rectangle bounds, const char *text) -{ - #if !defined(RAYGUI_LINE_ORIGIN_SIZE) - #define RAYGUI_LINE_MARGIN_TEXT 12 - #endif - #if !defined(RAYGUI_LINE_TEXT_PADDING) - #define RAYGUI_LINE_TEXT_PADDING 4 - #endif - - int result = 0; - GuiState state = guiState; - - Color color = GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)); - - // Draw control - //-------------------------------------------------------------------- - if (text == NULL) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, bounds.width, 1 }, 0, BLANK, color); - else - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = bounds.height; - textBounds.x = bounds.x + RAYGUI_LINE_MARGIN_TEXT; - textBounds.y = bounds.y; - - // Draw line with embedded text label: "--- text --------------" - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color); - GuiDrawText(text, textBounds, TEXT_ALIGN_LEFT, color); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + 12 + textBounds.width + 4, bounds.y + bounds.height/2, bounds.width - textBounds.width - RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color); - } - //-------------------------------------------------------------------- - - return result; -} - -// Panel control -int GuiPanel(Rectangle bounds, const char *text) -{ - #if !defined(RAYGUI_PANEL_BORDER_WIDTH) - #define RAYGUI_PANEL_BORDER_WIDTH 1 - #endif - - int result = 0; - GuiState state = guiState; - - // Text will be drawn as a header bar (if provided) - Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }; - if ((text != NULL) && (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f)) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f; - - if (text != NULL) - { - // Move panel bounds after the header bar - bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; - bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; - } - - // Draw control - //-------------------------------------------------------------------- - if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar - - GuiDrawRectangle(bounds, RAYGUI_PANEL_BORDER_WIDTH, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED: LINE_COLOR)), - GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BASE_COLOR_DISABLED : BACKGROUND_COLOR))); - //-------------------------------------------------------------------- - - return result; -} - -// Tab Bar control -// NOTE: Using GuiToggle() for the TABS -int GuiTabBar(Rectangle bounds, const char **text, int count, int *active) -{ - #define RAYGUI_TABBAR_ITEM_WIDTH 160 - - int result = -1; - //GuiState state = guiState; - - Rectangle tabBounds = { bounds.x, bounds.y, RAYGUI_TABBAR_ITEM_WIDTH, bounds.height }; - - if (*active < 0) *active = 0; - else if (*active > count - 1) *active = count - 1; - - int offsetX = 0; // Required in case tabs go out of screen - offsetX = (*active + 2)*RAYGUI_TABBAR_ITEM_WIDTH - GetScreenWidth(); - if (offsetX < 0) offsetX = 0; - - bool toggle = false; // Required for individual toggles - - // Draw control - //-------------------------------------------------------------------- - for (int i = 0; i < count; i++) - { - tabBounds.x = bounds.x + (RAYGUI_TABBAR_ITEM_WIDTH + 4)*i - offsetX; - - if (tabBounds.x < GetScreenWidth()) - { - // Draw tabs as toggle controls - int textAlignment = GuiGetStyle(TOGGLE, TEXT_ALIGNMENT); - int textPadding = GuiGetStyle(TOGGLE, TEXT_PADDING); - GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(TOGGLE, TEXT_PADDING, 8); - - if (i == (*active)) - { - toggle = true; - GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle); - } - else - { - toggle = false; - GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle); - if (toggle) *active = i; - } - - // Close tab with middle mouse button pressed - if (CheckCollisionPointRec(GetMousePosition(), tabBounds) && IsMouseButtonPressed(MOUSE_MIDDLE_BUTTON)) result = i; - - GuiSetStyle(TOGGLE, TEXT_PADDING, textPadding); - GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, textAlignment); - - // Draw tab close button - // NOTE: Only draw close button for current tab: if (CheckCollisionPointRec(mousePosition, tabBounds)) - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 1); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); -#if defined(RAYGUI_NO_ICONS) - if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, "x")) result = i; -#else - if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, GuiIconText(ICON_CROSS_SMALL, NULL))) result = i; -#endif - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); - } - } - - // Draw tab-bar bottom line - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, 1 }, 0, BLANK, GetColor(GuiGetStyle(TOGGLE, BORDER_COLOR_NORMAL))); - //-------------------------------------------------------------------- - - return result; // Return as result the current TAB closing requested -} - -// Scroll Panel control -int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view) -{ - #define RAYGUI_MIN_SCROLLBAR_WIDTH 40 - #define RAYGUI_MIN_SCROLLBAR_HEIGHT 40 - #define RAYGUI_MIN_MOUSE_WHEEL_SPEED 20 - - int result = 0; - GuiState state = guiState; - - Rectangle temp = { 0 }; - if (view == NULL) view = &temp; - - Vector2 scrollPos = { 0.0f, 0.0f }; - if (scroll != NULL) scrollPos = *scroll; - - // Text will be drawn as a header bar (if provided) - Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }; - if (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f; - - if (text != NULL) - { - // Move panel bounds after the header bar - bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; - bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + 1; - } - - bool hasHorizontalScrollBar = (content.width > bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false; - bool hasVerticalScrollBar = (content.height > bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false; - - // Recheck to account for the other scrollbar being visible - if (!hasHorizontalScrollBar) hasHorizontalScrollBar = (hasVerticalScrollBar && (content.width > (bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false; - if (!hasVerticalScrollBar) hasVerticalScrollBar = (hasHorizontalScrollBar && (content.height > (bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false; - - int horizontalScrollBarWidth = hasHorizontalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; - int verticalScrollBarWidth = hasVerticalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; - Rectangle horizontalScrollBar = { - (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + verticalScrollBarWidth : (float)bounds.x) + GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)bounds.y + bounds.height - horizontalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)bounds.width - verticalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)horizontalScrollBarWidth - }; - Rectangle verticalScrollBar = { - (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)bounds.x + bounds.width - verticalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH)), - (float)bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)verticalScrollBarWidth, - (float)bounds.height - horizontalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - }; - - // Make sure scroll bars have a minimum width/height - if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH) horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH; - if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT) verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT; - - // Calculate view area (area without the scrollbars) - *view = (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? - RAYGUI_CLITERAL(Rectangle){ bounds.x + verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth } : - RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth }; - - // Clip view area to the actual content size - if (view->width > content.width) view->width = content.width; - if (view->height > content.height) view->height = content.height; - - float horizontalMin = hasHorizontalScrollBar? ((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH); - float horizontalMax = hasHorizontalScrollBar? content.width - bounds.width + (float)verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH) - (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)verticalScrollBarWidth : 0) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); - float verticalMin = hasVerticalScrollBar? 0.0f : -1.0f; - float verticalMax = hasVerticalScrollBar? content.height - bounds.height + (float)horizontalScrollBarWidth + (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - -#if defined(SUPPORT_SCROLLBAR_KEY_INPUT) - if (hasHorizontalScrollBar) - { - if (IsKeyDown(KEY_RIGHT)) scrollPos.x -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - if (IsKeyDown(KEY_LEFT)) scrollPos.x += GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - } - - if (hasVerticalScrollBar) - { - if (IsKeyDown(KEY_DOWN)) scrollPos.y -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - if (IsKeyDown(KEY_UP)) scrollPos.y += GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - } -#endif - float wheelMove = GetMouseWheelMove(); - - // Set scrolling speed with mouse wheel based on ratio between bounds and content - Vector2 mouseWheelSpeed = { content.width / bounds.width, content.height / bounds.height }; - if (mouseWheelSpeed.x < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.x = RAYGUI_MIN_MOUSE_WHEEL_SPEED; - if (mouseWheelSpeed.y < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.y = RAYGUI_MIN_MOUSE_WHEEL_SPEED; - - // Horizontal and vertical scrolling with mouse wheel - if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_LEFT_SHIFT))) scrollPos.x += wheelMove*mouseWheelSpeed.x; - else scrollPos.y += wheelMove*mouseWheelSpeed.y; // Vertical scroll - } - } - - // Normalize scroll values - if (scrollPos.x > -horizontalMin) scrollPos.x = -horizontalMin; - if (scrollPos.x < -horizontalMax) scrollPos.x = -horizontalMax; - if (scrollPos.y > -verticalMin) scrollPos.y = -verticalMin; - if (scrollPos.y < -verticalMax) scrollPos.y = -verticalMax; - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar - - GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background - - // Save size of the scrollbar slider - const int slider = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); - - // Draw horizontal scrollbar if visible - if (hasHorizontalScrollBar) - { - // Change scrollbar slider size to show the diff in size between the content width and the widget width - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth)/(int)content.width)*((int)bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth))); - scrollPos.x = (float)-GuiScrollBar(horizontalScrollBar, (int)-scrollPos.x, (int)horizontalMin, (int)horizontalMax); - } - else scrollPos.x = 0.0f; - - // Draw vertical scrollbar if visible - if (hasVerticalScrollBar) - { - // Change scrollbar slider size to show the diff in size between the content height and the widget height - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth)/(int)content.height)*((int)bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth))); - scrollPos.y = (float)-GuiScrollBar(verticalScrollBar, (int)-scrollPos.y, (int)verticalMin, (int)verticalMax); - } - else scrollPos.y = 0.0f; - - // Draw detail corner rectangle if both scroll bars are visible - if (hasHorizontalScrollBar && hasVerticalScrollBar) - { - Rectangle corner = { (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) + 2) : (horizontalScrollBar.x + horizontalScrollBar.width + 2), verticalScrollBar.y + verticalScrollBar.height + 2, (float)horizontalScrollBarWidth - 4, (float)verticalScrollBarWidth - 4 }; - GuiDrawRectangle(corner, 0, BLANK, GetColor(GuiGetStyle(LISTVIEW, TEXT + (state*3)))); - } - - // Draw scrollbar lines depending on current state - GuiDrawRectangle(bounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), BLANK); - - // Set scrollbar slider size back to the way it was before - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider); - //-------------------------------------------------------------------- - - if (scroll != NULL) *scroll = scrollPos; - - return result; -} - -// Label control -int GuiLabel(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Update control - //-------------------------------------------------------------------- - //... - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Button control, returns true when clicked -int GuiButton(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(BUTTON, BORDER_WIDTH), GetColor(GuiGetStyle(BUTTON, BORDER + (state*3))), GetColor(GuiGetStyle(BUTTON, BASE + (state*3)))); - GuiDrawText(text, GetTextBounds(BUTTON, bounds), GuiGetStyle(BUTTON, TEXT_ALIGNMENT), GetColor(GuiGetStyle(BUTTON, TEXT + (state*3)))); - - if (state == STATE_FOCUSED) GuiTooltip(bounds); - //------------------------------------------------------------------ - - return result; // Button pressed: result = 1 -} - -// Label button control -int GuiLabelButton(Rectangle bounds, const char *text) -{ - GuiState state = guiState; - bool pressed = false; - - // NOTE: We force bounds.width to be all text - float textWidth = (float)GetTextWidth(text); - if ((bounds.width - 2*GuiGetStyle(LABEL, BORDER_WIDTH) - 2*GuiGetStyle(LABEL, TEXT_PADDING)) < textWidth) bounds.width = textWidth + 2*GuiGetStyle(LABEL, BORDER_WIDTH) + 2*GuiGetStyle(LABEL, TEXT_PADDING) + 2; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check checkbox state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return pressed; -} - -// Toggle Button control -int GuiToggle(Rectangle bounds, const char *text, bool *active) -{ - int result = 0; - GuiState state = guiState; - - bool temp = false; - if (active == NULL) active = &temp; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check toggle button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - state = STATE_NORMAL; - *active = !(*active); - } - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_NORMAL) - { - GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, ((*active)? BORDER_COLOR_PRESSED : (BORDER + state*3)))), GetColor(GuiGetStyle(TOGGLE, ((*active)? BASE_COLOR_PRESSED : (BASE + state*3))))); - GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, ((*active)? TEXT_COLOR_PRESSED : (TEXT + state*3))))); - } - else - { - GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + state*3)), GetColor(GuiGetStyle(TOGGLE, BASE + state*3))); - GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, TEXT + state*3))); - } - - if (state == STATE_FOCUSED) GuiTooltip(bounds); - //-------------------------------------------------------------------- - - return result; -} - -// Toggle Group control -int GuiToggleGroup(Rectangle bounds, const char *text, int *active) -{ - #if !defined(RAYGUI_TOGGLEGROUP_MAX_ITEMS) - #define RAYGUI_TOGGLEGROUP_MAX_ITEMS 32 - #endif - - int result = 0; - float initBoundsX = bounds.x; - - int temp = 0; - if (active == NULL) active = &temp; - - bool toggle = false; // Required for individual toggles - - // Get substrings items from text (items pointers) - int rows[RAYGUI_TOGGLEGROUP_MAX_ITEMS] = { 0 }; - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, rows); - - int prevRow = rows[0]; - - for (int i = 0; i < itemCount; i++) - { - if (prevRow != rows[i]) - { - bounds.x = initBoundsX; - bounds.y += (bounds.height + GuiGetStyle(TOGGLE, GROUP_PADDING)); - prevRow = rows[i]; - } - - if (i == (*active)) - { - toggle = true; - GuiToggle(bounds, items[i], &toggle); - } - else - { - toggle = false; - GuiToggle(bounds, items[i], &toggle); - if (toggle) *active = i; - } - - bounds.x += (bounds.width + GuiGetStyle(TOGGLE, GROUP_PADDING)); - } - - return result; -} - -// Toggle Slider control extended -int GuiToggleSlider(Rectangle bounds, const char *text, int *active) -{ - int result = 0; - GuiState state = guiState; - - int temp = 0; - if (active == NULL) active = &temp; - - //bool toggle = false; // Required for individual toggles - - // Get substrings items from text (items pointers) - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, NULL); - - Rectangle slider = { - 0, // Calculated later depending on the active toggle - bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING), - (bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - (itemCount + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING))/itemCount, - bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - (*active)++; - result = 1; - } - else state = STATE_FOCUSED; - } - - if ((*active) && (state != STATE_FOCUSED)) state = STATE_PRESSED; - } - - if (*active >= itemCount) *active = 0; - slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH) + (*active + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING) + (*active)*slider.width; - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + (state*3))), - GetColor(GuiGetStyle(TOGGLE, BASE_COLOR_NORMAL))); - - // Draw internal slider - if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); - else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_FOCUSED))); - else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); - - // Draw text in slider - if (text != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(text); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = slider.x + slider.width/2 - textBounds.width/2; - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(items[*active], textBounds, GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TOGGLE, TEXT + (state*3))), guiAlpha)); - } - //-------------------------------------------------------------------- - - return result; -} - -// Check Box control, returns 1 when state changed -int GuiCheckBox(Rectangle bounds, const char *text, bool *checked) -{ - int result = 0; - GuiState state = guiState; - - bool temp = false; - if (checked == NULL) checked = &temp; - - Rectangle textBounds = { 0 }; - - if (text != NULL) - { - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(CHECKBOX, TEXT_PADDING); - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - Rectangle totalBounds = { - (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT)? textBounds.x : bounds.x, - bounds.y, - bounds.width + textBounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING), - bounds.height, - }; - - // Check checkbox state - if (CheckCollisionPointRec(mousePoint, totalBounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - *checked = !(*checked); - result = 1; - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(CHECKBOX, BORDER_WIDTH), GetColor(GuiGetStyle(CHECKBOX, BORDER + (state*3))), BLANK); - - if (*checked) - { - Rectangle check = { bounds.x + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING), - bounds.y + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING), - bounds.width - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)), - bounds.height - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)) }; - GuiDrawRectangle(check, 0, BLANK, GetColor(GuiGetStyle(CHECKBOX, TEXT + state*3))); - } - - GuiDrawText(text, textBounds, (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Combo Box control -int GuiComboBox(Rectangle bounds, const char *text, int *active) -{ - int result = 0; - GuiState state = guiState; - - int temp = 0; - if (active == NULL) active = &temp; - - bounds.width -= (GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH) + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING)); - - Rectangle selector = { (float)bounds.x + bounds.width + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING), - (float)bounds.y, (float)GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH), (float)bounds.height }; - - // Get substrings items from text (items pointers, lengths and count) - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, NULL); - - if (*active < 0) *active = 0; - else if (*active > (itemCount - 1)) *active = itemCount - 1; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && (itemCount > 1) && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - if (CheckCollisionPointRec(mousePoint, bounds) || - CheckCollisionPointRec(mousePoint, selector)) - { - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - *active += 1; - if (*active >= itemCount) *active = 0; // Cyclic combobox - } - - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - // Draw combo box main - GuiDrawRectangle(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), GetColor(GuiGetStyle(COMBOBOX, BORDER + (state*3))), GetColor(GuiGetStyle(COMBOBOX, BASE + (state*3)))); - GuiDrawText(items[*active], GetTextBounds(COMBOBOX, bounds), GuiGetStyle(COMBOBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(COMBOBOX, TEXT + (state*3)))); - - // Draw selector using a custom button - // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 1); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - GuiButton(selector, TextFormat("%i/%i", *active + 1, itemCount)); - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - //-------------------------------------------------------------------- - - return result; -} - -// Dropdown Box control -// NOTE: Returns mouse click -int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode) -{ - int result = 0; - GuiState state = guiState; - - int itemSelected = *active; - int itemFocused = -1; - - // Get substrings items from text (items pointers, lengths and count) - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, NULL); - - Rectangle boundsOpen = bounds; - boundsOpen.height = (itemCount + 1)*(bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); - - Rectangle itemBounds = bounds; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1) && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - if (editMode) - { - state = STATE_PRESSED; - - // Check if mouse has been pressed or released outside limits - if (!CheckCollisionPointRec(mousePoint, boundsOpen)) - { - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1; - } - - // Check if already selected item has been pressed again - if (CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; - - // Check focused and selected item - for (int i = 0; i < itemCount; i++) - { - // Update item rectangle y position for next item - itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); - - if (CheckCollisionPointRec(mousePoint, itemBounds)) - { - itemFocused = i; - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - itemSelected = i; - result = 1; // Item selected - } - break; - } - } - - itemBounds = bounds; - } - else - { - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - result = 1; - state = STATE_PRESSED; - } - else state = STATE_FOCUSED; - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (editMode) GuiPanel(boundsOpen, NULL); - - GuiDrawRectangle(bounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER + state*3)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE + state*3))); - GuiDrawText(items[itemSelected], GetTextBounds(DROPDOWNBOX, bounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + state*3))); - - if (editMode) - { - // Draw visible items - for (int i = 0; i < itemCount; i++) - { - // Update item rectangle y position for next item - itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); - - if (i == itemSelected) - { - GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_PRESSED))); - GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_PRESSED))); - } - else if (i == itemFocused) - { - GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_FOCUSED))); - GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_FOCUSED))); - } - else GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL))); - } - } - - // Draw arrows (using icon if available) -#if defined(RAYGUI_NO_ICONS) - GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); -#else - GuiDrawText("#120#", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 6, 10, 10 }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); // ICON_ARROW_DOWN_FILL -#endif - //-------------------------------------------------------------------- - - *active = itemSelected; - - // TODO: Use result to return more internal states: mouse-press out-of-bounds, mouse-press over selected-item... - return result; // Mouse click: result = 1 -} - -// Text Box control -// NOTE: Returns true on ENTER pressed (useful for data validation) -int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode) -{ - #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN) - #define RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN 40 // Frames to wait for autocursor movement - #endif - #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) - #define RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY 1 // Frames delay for autocursor movement - #endif - - int result = 0; - GuiState state = guiState; - - bool multiline = false; // TODO: Consider multiline text input - int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); - - 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 X value should be updated - Rectangle cursor = { - textBounds.x + textWidth + GuiGetStyle(DEFAULT, TEXT_SPACING), - textBounds.y + textBounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE), - 2, - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)*2 - }; - - if (cursor.height >= bounds.height) cursor.height = bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2; - if (cursor.y < (bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH))) cursor.y = bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH); - - // Mouse cursor rectangle - // NOTE: Initialized outside of screen - Rectangle mouseCursor = cursor; - mouseCursor.x = -1; - mouseCursor.width = 1; - - // 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) || IsKeyDown(KEY_DELETE)) autoCursorCooldownCounter++; - else - { - autoCursorCooldownCounter = 0; // GLOBAL: Cursor cooldown counter - autoCursorDelayCounter = 0; // GLOBAL: Cursor delay counter - } - - // Blink-cursor frame counter - //if (!autoCursorMode) blinkCursorFrameCounter++; - //else blinkCursorFrameCounter = 0; - - // Update control - //-------------------------------------------------------------------- - // WARNING: Text editing is only supported under certain conditions: - if ((state != STATE_DISABLED) && // Control not disabled - !GuiGetStyle(TEXTBOX, TEXT_READONLY) && // TextBox not on read-only mode - !guiLocked && // Gui not locked - !guiControlExclusiveMode && // No gui slider on dragging - (wrapMode == TEXT_WRAP_NONE)) // No wrap mode - { - Vector2 mousePosition = GetMousePosition(); - - if (editMode) - { - state = STATE_PRESSED; - - // If text does not fit in the textbox and current cursor position is out of bounds, - // we add an index offset to text for drawing only what requires depending on cursor - while (textWidth >= textBounds.width) - { - int nextCodepointSize = 0; - GetCodepointNext(text + textIndexOffset, &nextCodepointSize); - - textIndexOffset += nextCodepointSize; - - textWidth = GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex); - } - - int textLength = (int)strlen(text); // Get current text length - int codepoint = GetCharPressed(); // Get Unicode codepoint - if (multiline && IsKeyPressed(KEY_ENTER)) codepoint = (int)'\n'; - - if (textBoxCursorIndex > textLength) textBoxCursorIndex = textLength; - - // Encode codepoint as UTF-8 - int codepointSize = 0; - const char *charEncoded = CodepointToUTF8(codepoint, &codepointSize); - - // Add codepoint to text, at current cursor position - // NOTE: Make sure we do not overflow buffer size - if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < textSize)) - { - // 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'; - } - - // Move cursor to start - if ((textLength > 0) && IsKeyPressed(KEY_HOME)) textBoxCursorIndex = 0; - - // Move cursor to end - if ((textLength > textBoxCursorIndex) && IsKeyPressed(KEY_END)) textBoxCursorIndex = textLength; - - // Delete codepoint from text, after current cursor position - if ((textLength > textBoxCursorIndex) && (IsKeyPressed(KEY_DELETE) || (IsKeyDown(KEY_DELETE) && (autoCursorCooldownCounter >= RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_DELETE) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames - { - int nextCodepointSize = 0; - GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); - - // Move backward text from cursor position - for (int i = textBoxCursorIndex; i < textLength; i++) text[i] = text[i + nextCodepointSize]; - - textLength -= codepointSize; - - // Make sure text last character is EOL - text[textLength] = '\0'; - } - } - - // Delete codepoint from text, before current cursor position - if ((textLength > 0) && (IsKeyPressed(KEY_BACKSPACE) || (IsKeyDown(KEY_BACKSPACE) && (autoCursorCooldownCounter >= RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_BACKSPACE) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames - { - 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]; - - // Prevent cursor index from decrementing past 0 - if (textBoxCursorIndex > 0) - { - textBoxCursorIndex -= codepointSize; - textLength -= codepointSize; - } - - // Make sure text last character is EOL - text[textLength] = '\0'; - } - } - - // Move cursor position with keys - if (IsKeyPressed(KEY_LEFT) || (IsKeyDown(KEY_LEFT) && (autoCursorCooldownCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_LEFT) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_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) || (IsKeyDown(KEY_RIGHT) && (autoCursorCooldownCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_RIGHT) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames - { - int nextCodepointSize = 0; - GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); - - if ((textBoxCursorIndex + nextCodepointSize) <= textLength) textBoxCursorIndex += nextCodepointSize; - } - } - - // Move cursor position with mouse - if (CheckCollisionPointRec(mousePosition, textBounds)) // Mouse hover text - { - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize; - int codepointIndex = 0; - float glyphWidth = 0.0f; - float widthToMouseX = 0; - int mouseCursorIndex = 0; - - for (int i = textIndexOffset; i < textLength; i++) - { - codepoint = GetCodepointNext(&text[i], &codepointSize); - codepointIndex = GetGlyphIndex(guiFont, codepoint); - - if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor); - else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor); - - if (mousePosition.x <= (textBounds.x + (widthToMouseX + glyphWidth/2))) - { - mouseCursor.x = textBounds.x + widthToMouseX; - mouseCursorIndex = i; - break; - } - - widthToMouseX += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - - // Check if mouse cursor is at the last position - int textEndWidth = GetTextWidth(text + textIndexOffset); - if (GetMousePosition().x >= (textBounds.x + textEndWidth - glyphWidth/2)) - { - mouseCursor.x = textBounds.x + textEndWidth; - mouseCursorIndex = (int)strlen(text); - } - - // Place cursor at required index on mouse click - if ((mouseCursor.x >= 0) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - cursor.x = mouseCursor.x; - textBoxCursorIndex = mouseCursorIndex; - } - } - else mouseCursor.x = -1; - - // 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 ((!multiline && IsKeyPressed(KEY_ENTER)) || - (!CheckCollisionPointRec(mousePosition, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) - { - textBoxCursorIndex = 0; // GLOBAL: Reset the shared cursor index - result = 1; - } - } - else - { - if (CheckCollisionPointRec(mousePosition, bounds)) - { - state = STATE_FOCUSED; - - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - textBoxCursorIndex = (int)strlen(text); // GLOBAL: Place cursor index to the end of current text - result = 1; - } - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_PRESSED) - { - GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED))); - } - else if (state == STATE_DISABLED) - { - GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED))); - } - else GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), BLANK); - - // Draw text considering index offset if required - // NOTE: Text index offset depends on cursor position - GuiDrawText(text + textIndexOffset, textBounds, GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3)))); - - // Draw cursor - if (editMode && !GuiGetStyle(TEXTBOX, TEXT_READONLY)) - { - //if (autoCursorMode || ((blinkCursorFrameCounter/40)%2 == 0)) - GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))); - - // Draw mouse position cursor (if required) - if (mouseCursor.x >= 0) GuiDrawRectangle(mouseCursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))); - } - else if (state == STATE_FOCUSED) GuiTooltip(bounds); - //-------------------------------------------------------------------- - - return result; // Mouse button pressed: result = 1 -} - -/* -// Text Box control with multiple lines and word-wrap -// NOTE: This text-box is readonly, no editing supported by default -bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode) -{ - bool pressed = false; - - GuiSetStyle(TEXTBOX, TEXT_READONLY, 1); - GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_WORD); // WARNING: If wrap mode enabled, text editing is not supported - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_TOP); - - // TODO: Implement methods to calculate cursor position properly - pressed = GuiTextBox(bounds, text, textSize, editMode); - - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); - GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE); - GuiSetStyle(TEXTBOX, TEXT_READONLY, 0); - - return pressed; -} -*/ - -// Spinner control, returns selected value -int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) -{ - int result = 1; - GuiState state = guiState; - - int tempValue = *value; - - Rectangle spinner = { bounds.x + GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING), bounds.y, - bounds.width - 2*(GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING)), bounds.height }; - Rectangle leftButtonBound = { (float)bounds.x, (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height }; - Rectangle rightButtonBound = { (float)bounds.x + bounds.width - GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height }; - - Rectangle textBounds = { 0 }; - if (text != NULL) - { - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(SPINNER, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - if (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SPINNER, TEXT_PADDING); - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check spinner state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - } - } - -#if defined(RAYGUI_NO_ICONS) - if (GuiButton(leftButtonBound, "<")) tempValue--; - if (GuiButton(rightButtonBound, ">")) tempValue++; -#else - if (GuiButton(leftButtonBound, GuiIconText(ICON_ARROW_LEFT_FILL, NULL))) tempValue--; - if (GuiButton(rightButtonBound, GuiIconText(ICON_ARROW_RIGHT_FILL, NULL))) tempValue++; -#endif - - if (!editMode) - { - if (tempValue < minValue) tempValue = minValue; - if (tempValue > maxValue) tempValue = maxValue; - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - result = GuiValueBox(spinner, NULL, &tempValue, minValue, maxValue, editMode); - - // Draw value selector custom buttons - // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(SPINNER, BORDER_WIDTH)); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - - // Draw text label if provided - GuiDrawText(text, textBounds, (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - *value = tempValue; - return result; -} - -// Value Box control, updates input text with numbers -// NOTE: Requires static variables: frameCounter -int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) -{ - #if !defined(RAYGUI_VALUEBOX_MAX_CHARS) - #define RAYGUI_VALUEBOX_MAX_CHARS 32 - #endif - - int result = 0; - GuiState state = guiState; - - char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0"; - sprintf(textValue, "%i", *value); - - Rectangle textBounds = { 0 }; - if (text != NULL) - { - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING); - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - bool valueHasChanged = false; - - if (editMode) - { - state = STATE_PRESSED; - - int keyCount = (int)strlen(textValue); - - // Only allow keys in range [48..57] - if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS) - { - if (GetTextWidth(textValue) < bounds.width) - { - int key = GetCharPressed(); - if ((key >= 48) && (key <= 57)) - { - textValue[keyCount] = (char)key; - keyCount++; - valueHasChanged = true; - } - } - } - - // Delete text - if (keyCount > 0) - { - if (IsKeyPressed(KEY_BACKSPACE)) - { - keyCount--; - textValue[keyCount] = '\0'; - valueHasChanged = true; - } - } - - if (valueHasChanged) *value = TextToInteger(textValue); - - // NOTE: We are not clamp values until user input finishes - //if (*value > maxValue) *value = maxValue; - //else if (*value < minValue) *value = minValue; - - if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) - { - if (*value > maxValue) *value = maxValue; - else if (*value < minValue) *value = minValue; - - result = 1; - } - } - else - { - if (*value > maxValue) *value = maxValue; - else if (*value < minValue) *value = minValue; - - if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - Color baseColor = BLANK; - if (state == STATE_PRESSED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED)); - else if (state == STATE_DISABLED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED)); - - GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), GetColor(GuiGetStyle(VALUEBOX, BORDER + (state*3))), baseColor); - GuiDrawText(textValue, GetTextBounds(VALUEBOX, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(VALUEBOX, TEXT + (state*3)))); - - // Draw cursor - if (editMode) - { - // NOTE: ValueBox internal text is always centered - Rectangle cursor = { bounds.x + GetTextWidth(textValue)/2 + bounds.width/2 + 1, bounds.y + 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), 4, bounds.height - 4*GuiGetStyle(VALUEBOX, BORDER_WIDTH) }; - GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED))); - } - - // Draw text label if provided - GuiDrawText(text, textBounds, (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Slider control with pro parameters -// NOTE: Other GuiSlider*() controls use this one -int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth) -{ - int result = 0; - GuiState state = guiState; - - float temp = (maxValue - minValue)/2.0f; - if (value == NULL) value = &temp; - float oldValue = *value; - - Rectangle slider = { bounds.x, bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING), - 0, bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - // Get equivalent value and slider position from mousePosition.x - *value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue; - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - if (!CheckCollisionPointRec(mousePoint, slider)) - { - // Get equivalent value and slider position from mousePosition.x - *value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue; - } - } - else state = STATE_FOCUSED; - } - - if (*value > maxValue) *value = maxValue; - else if (*value < minValue) *value = minValue; - } - - // Control value change check - if (oldValue == *value) result = 0; - else result = 1; - - // Slider bar limits check - int sliderValue = (int)(((*value - minValue)/(maxValue - minValue))*(bounds.width - sliderWidth - GuiGetStyle(SLIDER, BORDER_WIDTH))); - if (sliderWidth > 0) // Slider - { - slider.x += sliderValue; - slider.width = (float)sliderWidth; - if (slider.x <= (bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH); - else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) slider.x = bounds.x + bounds.width - slider.width - GuiGetStyle(SLIDER, BORDER_WIDTH); - } - else if (sliderWidth == 0) // SliderBar - { - slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH); - slider.width = (float)sliderValue; - if (slider.width > bounds.width) slider.width = bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH); - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED))); - - // Draw slider internal bar (depends on state) - if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); - else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED))); - else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_PRESSED))); - - // Draw left/right text if provided - if (textLeft != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textLeft); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SLIDER, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(SLIDER, TEXT + (state*3)))); - } - - if (textRight != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textRight); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(SLIDER, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(SLIDER, TEXT + (state*3)))); - } - //-------------------------------------------------------------------- - - return result; -} - -// Slider control extended, returns selected value and has text -int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) -{ - return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH)); -} - -// Slider Bar control extended, returns selected value -int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) -{ - return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, 0); -} - -// Progress Bar control extended, shows current progress value -int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) -{ - int result = 0; - GuiState state = guiState; - - float temp = (maxValue - minValue)/2.0f; - if (value == NULL) value = &temp; - - // Progress bar - Rectangle progress = { bounds.x + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), - bounds.y + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) + GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING), 0, - bounds.height - 2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) - 2*GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING) }; - - // Update control - //-------------------------------------------------------------------- - if (*value > maxValue) *value = maxValue; - - // WARNING: Working with floats could lead to rounding issues - if ((state != STATE_DISABLED)) progress.width = (float)(*value/(maxValue - minValue))*bounds.width - ((*value >= maxValue)? (float)(2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)) : 0.0f); - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_DISABLED) - { - GuiDrawRectangle(bounds, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(PROGRESSBAR, BORDER + (state*3))), BLANK); - } - else - { - if (*value > minValue) - { - // Draw progress bar with colored border, more visual - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - } - else GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - - if (*value >= maxValue) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + progress.width + 1, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - else - { - // Draw borders not yet reached by value - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + 1, bounds.y, bounds.width - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + 1, bounds.y + bounds.height - 1, bounds.width - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - } - - // Draw slider internal progress bar (depends on state) - GuiDrawRectangle(progress, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BASE_COLOR_PRESSED))); - } - - // Draw left/right text if provided - if (textLeft != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textLeft); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x - textBounds.width - GuiGetStyle(PROGRESSBAR, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3)))); - } - - if (textRight != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textRight); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(PROGRESSBAR, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3)))); - } - //-------------------------------------------------------------------- - - return result; -} - -// Status Bar control -int GuiStatusBar(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(STATUSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(STATUSBAR, BORDER + (state*3))), GetColor(GuiGetStyle(STATUSBAR, BASE + (state*3)))); - GuiDrawText(text, GetTextBounds(STATUSBAR, bounds), GuiGetStyle(STATUSBAR, TEXT_ALIGNMENT), GetColor(GuiGetStyle(STATUSBAR, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Dummy rectangle control, intended for placeholding -int GuiDummyRec(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED))); - GuiDrawText(text, GetTextBounds(DEFAULT, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(BUTTON, (state != STATE_DISABLED)? TEXT_COLOR_NORMAL : TEXT_COLOR_DISABLED))); - //------------------------------------------------------------------ - - return result; -} - -// List View control -int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active) -{ - int result = 0; - int itemCount = 0; - const char **items = NULL; - - if (text != NULL) items = GuiTextSplit(text, ';', &itemCount, NULL); - - result = GuiListViewEx(bounds, items, itemCount, scrollIndex, active, NULL); - - return result; -} - -// List View control with extended parameters -int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus) -{ - int result = 0; - GuiState state = guiState; - - int itemFocused = (focus == NULL)? -1 : *focus; - int itemSelected = (active == NULL)? -1 : *active; - - // Check if we need a scroll bar - bool useScrollBar = false; - if ((GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING))*count > bounds.height) useScrollBar = true; - - // Define base item rectangle [0] - Rectangle itemBounds = { 0 }; - itemBounds.x = bounds.x + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING); - itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); - itemBounds.width = bounds.width - 2*GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) - GuiGetStyle(DEFAULT, BORDER_WIDTH); - itemBounds.height = (float)GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT); - if (useScrollBar) itemBounds.width -= GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH); - - // Get items on the list - int visibleItems = (int)bounds.height/(GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); - if (visibleItems > count) visibleItems = count; - - int startIndex = (scrollIndex == NULL)? 0 : *scrollIndex; - if ((startIndex < 0) || (startIndex > (count - visibleItems))) startIndex = 0; - int endIndex = startIndex + visibleItems; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check mouse inside list view - if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - - // Check focused and selected item - for (int i = 0; i < visibleItems; i++) - { - if (CheckCollisionPointRec(mousePoint, itemBounds)) - { - itemFocused = startIndex + i; - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - if (itemSelected == (startIndex + i)) itemSelected = -1; - else itemSelected = startIndex + i; - } - break; - } - - // Update item rectangle y position for next item - itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); - } - - if (useScrollBar) - { - int wheelMove = (int)GetMouseWheelMove(); - startIndex -= wheelMove; - - if (startIndex < 0) startIndex = 0; - else if (startIndex > (count - visibleItems)) startIndex = count - visibleItems; - - endIndex = startIndex + visibleItems; - if (endIndex > count) endIndex = count; - } - } - else itemFocused = -1; - - // Reset item rectangle y to [0] - itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background - - // Draw visible items - for (int i = 0; ((i < visibleItems) && (text != NULL)); i++) - { - if (state == STATE_DISABLED) - { - if ((startIndex + i) == itemSelected) GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED))); - - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED))); - } - else - { - if (((startIndex + i) == itemSelected) && (active != NULL)) - { - // Draw item selected - GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED))); - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED))); - } - else if (((startIndex + i) == itemFocused)) // && (focus != NULL)) // NOTE: We want items focused, despite not returned! - { - // Draw item focused - GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED))); - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED))); - } - else - { - // Draw item normal - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL))); - } - } - - // Update item rectangle y position for next item - itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); - } - - if (useScrollBar) - { - Rectangle scrollBarBounds = { - bounds.x + bounds.width - GuiGetStyle(LISTVIEW, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), - bounds.y + GuiGetStyle(LISTVIEW, BORDER_WIDTH), (float)GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), - bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - }; - - // Calculate percentage of visible items and apply same percentage to scrollbar - float percentVisible = (float)(endIndex - startIndex)/count; - float sliderSize = bounds.height*percentVisible; - - int prevSliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); // Save default slider size - int prevScrollSpeed = GuiGetStyle(SCROLLBAR, SCROLL_SPEED); // Save default scroll speed - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)sliderSize); // Change slider size - GuiSetStyle(SCROLLBAR, SCROLL_SPEED, count - visibleItems); // Change scroll speed - - startIndex = GuiScrollBar(scrollBarBounds, startIndex, 0, count - visibleItems); - - GuiSetStyle(SCROLLBAR, SCROLL_SPEED, prevScrollSpeed); // Reset scroll speed to default - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, prevSliderSize); // Reset slider size to default - } - //-------------------------------------------------------------------- - - if (active != NULL) *active = itemSelected; - if (focus != NULL) *focus = itemFocused; - if (scrollIndex != NULL) *scrollIndex = startIndex; - - return result; -} - -// Color Panel control - Color (RGBA) variant. -int GuiColorPanel(Rectangle bounds, const char *text, Color *color) -{ - int result = 0; - - Vector3 vcolor = { (float)color->r/255.0f, (float)color->g/255.0f, (float)color->b/255.0f }; - Vector3 hsv = ConvertRGBtoHSV(vcolor); - Vector3 prevHsv = hsv; // workaround to see if GuiColorPanelHSV modifies the hsv. - - GuiColorPanelHSV(bounds, text, &hsv); - - // Check if the hsv was changed, only then change the color. - // This is necessary, because the Color->HSV->Color conversion has precision errors. - // Thus the assignment from HSV to Color should only be made, if the HSV has a new user-entered value. - // Otherwise GuiColorPanel would often modify it's color without user input. - // TODO: GuiColorPanelHSV could return 1 if the slider was dragged, to simplify this check. - if (hsv.x != prevHsv.x || hsv.y != prevHsv.y || hsv.z != prevHsv.z) - { - Vector3 rgb = ConvertHSVtoRGB(hsv); - - // NOTE: Vector3ToColor() only available on raylib 1.8.1 - *color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x), - (unsigned char)(255.0f*rgb.y), - (unsigned char)(255.0f*rgb.z), - color->a }; - } - return result; -} - -// Color Bar Alpha control -// NOTE: Returns alpha value normalized [0..1] -int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha) -{ - #if !defined(RAYGUI_COLORBARALPHA_CHECKED_SIZE) - #define RAYGUI_COLORBARALPHA_CHECKED_SIZE 10 - #endif - - int result = 0; - GuiState state = guiState; - Rectangle selector = { (float)bounds.x + (*alpha)*bounds.width - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.y - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT), (float)bounds.height + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2 }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - - *alpha = (mousePoint.x - bounds.x)/bounds.width; - if (*alpha <= 0.0f) *alpha = 0.0f; - if (*alpha >= 1.0f) *alpha = 1.0f; - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - *alpha = (mousePoint.x - bounds.x)/bounds.width; - if (*alpha <= 0.0f) *alpha = 0.0f; - if (*alpha >= 1.0f) *alpha = 1.0f; - //selector.x = bounds.x + (int)(((alpha - 0)/(100 - 0))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH))) - selector.width/2; - } - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - - // Draw alpha bar: checked background - if (state != STATE_DISABLED) - { - int checksX = (int)bounds.width/RAYGUI_COLORBARALPHA_CHECKED_SIZE; - int checksY = (int)bounds.height/RAYGUI_COLORBARALPHA_CHECKED_SIZE; - - for (int x = 0; x < checksX; x++) - { - for (int y = 0; y < checksY; y++) - { - Rectangle check = { bounds.x + x*RAYGUI_COLORBARALPHA_CHECKED_SIZE, bounds.y + y*RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE }; - GuiDrawRectangle(check, 0, BLANK, ((x + y)%2)? Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.4f) : Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.4f)); - } - } - - DrawRectangleGradientEx(bounds, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha)); - } - else DrawRectangleGradientEx(bounds, Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha)); - - GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); - - // Draw alpha bar: selector - GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3))); - //-------------------------------------------------------------------- - - return result; -} - -// Color Bar Hue control -// Returns hue value normalized [0..1] -// NOTE: Other similar bars (for reference): -// Color GuiColorBarSat() [WHITE->color] -// Color GuiColorBarValue() [BLACK->color], HSV/HSL -// float GuiColorBarLuminance() [BLACK->WHITE] -int GuiColorBarHue(Rectangle bounds, const char *text, float *hue) -{ - int result = 0; - GuiState state = guiState; - Rectangle selector = { (float)bounds.x - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)bounds.y + (*hue)/360.0f*bounds.height - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2, (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT) }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - - *hue = (mousePoint.y - bounds.y)*360/bounds.height; - if (*hue <= 0.0f) *hue = 0.0f; - if (*hue >= 359.0f) *hue = 359.0f; - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - *hue = (mousePoint.y - bounds.y)*360/bounds.height; - if (*hue <= 0.0f) *hue = 0.0f; - if (*hue >= 359.0f) *hue = 359.0f; - - } - else state = STATE_FOCUSED; - - /*if (IsKeyDown(KEY_UP)) - { - hue -= 2.0f; - if (hue <= 0.0f) hue = 0.0f; - } - else if (IsKeyDown(KEY_DOWN)) - { - hue += 2.0f; - if (hue >= 360.0f) hue = 360.0f; - }*/ - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state != STATE_DISABLED) - { - // Draw hue bar:color bars - // TODO: Use directly DrawRectangleGradientEx(bounds, color1, color2, color2, color1); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + bounds.height/6), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 2*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 3*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 4*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 5*(bounds.height/6)), (int)bounds.width, (int)(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha)); - } - else DrawRectangleGradientV((int)bounds.x, (int)bounds.y, (int)bounds.width, (int)bounds.height, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha)); - - GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); - - // Draw hue bar: selector - GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3))); - //-------------------------------------------------------------------- - - return result; -} - -// Color Picker control -// NOTE: It's divided in multiple controls: -// Color GuiColorPanel(Rectangle bounds, Color color) -// float GuiColorBarAlpha(Rectangle bounds, float alpha) -// float GuiColorBarHue(Rectangle bounds, float value) -// NOTE: bounds define GuiColorPanel() size -// NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead -int GuiColorPicker(Rectangle bounds, const char *text, Color *color) -{ - int result = 0; - - Color temp = { 200, 0, 0, 255 }; - if (color == NULL) color = &temp; - - GuiColorPanel(bounds, NULL, color); - - Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height }; - //Rectangle boundsAlpha = { bounds.x, bounds.y + bounds.height + GuiGetStyle(COLORPICKER, BARS_PADDING), bounds.width, GuiGetStyle(COLORPICKER, BARS_THICK) }; - - // NOTE: this conversion can cause low hue-resolution, if the r, g and b value are very similar, which causes the hue bar to shift around when only the GuiColorPanel is used. - Vector3 hsv = ConvertRGBtoHSV(RAYGUI_CLITERAL(Vector3){ (*color).r/255.0f, (*color).g/255.0f, (*color).b/255.0f }); - - GuiColorBarHue(boundsHue, NULL, &hsv.x); - - //color.a = (unsigned char)(GuiColorBarAlpha(boundsAlpha, (float)color.a/255.0f)*255.0f); - Vector3 rgb = ConvertHSVtoRGB(hsv); - - *color = RAYGUI_CLITERAL(Color){ (unsigned char)roundf(rgb.x*255.0f), (unsigned char)roundf(rgb.y*255.0f), (unsigned char)roundf(rgb.z*255.0f), (*color).a }; - - return result; -} - -// Color Picker control that avoids conversion to RGB and back to HSV on each call, thus avoiding jittering. -// The user can call ConvertHSVtoRGB() to convert *colorHsv value to RGB. -// NOTE: It's divided in multiple controls: -// int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) -// int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha) -// float GuiColorBarHue(Rectangle bounds, float value) -// NOTE: bounds define GuiColorPanelHSV() size -int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) -{ - int result = 0; - - Vector3 tempHsv = { 0 }; - - if (colorHsv == NULL) - { - const Vector3 tempColor = { 200.0f/255.0f, 0.0f, 0.0f }; - tempHsv = ConvertRGBtoHSV(tempColor); - colorHsv = &tempHsv; - } - - GuiColorPanelHSV(bounds, NULL, colorHsv); - - const Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height }; - - GuiColorBarHue(boundsHue, NULL, &colorHsv->x); - - return result; -} - -// Color Panel control - HSV variant -int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) -{ - int result = 0; - GuiState state = guiState; - Vector2 pickerSelector = { 0 }; - - const Color colWhite = { 255, 255, 255, 255 }; - const Color colBlack = { 0, 0, 0, 255 }; - - pickerSelector.x = bounds.x + (float)colorHsv->y*bounds.width; // HSV: Saturation - pickerSelector.y = bounds.y + (1.0f - (float)colorHsv->z)*bounds.height; // HSV: Value - - Vector3 maxHue = { colorHsv->x, 1.0f, 1.0f }; - Vector3 rgbHue = ConvertHSVtoRGB(maxHue); - Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x), - (unsigned char)(255.0f*rgbHue.y), - (unsigned char)(255.0f*rgbHue.z), 255 }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - pickerSelector = mousePoint; - - if (pickerSelector.x < bounds.x) pickerSelector.x = bounds.x; - if (pickerSelector.x > bounds.x + bounds.width) pickerSelector.x = bounds.x + bounds.width; - if (pickerSelector.y < bounds.y) pickerSelector.y = bounds.y; - if (pickerSelector.y > bounds.y + bounds.height) pickerSelector.y = bounds.y + bounds.height; - - // Calculate color from picker - Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y }; - - colorPick.x /= (float)bounds.width; // Get normalized value on x - colorPick.y /= (float)bounds.height; // Get normalized value on y - - colorHsv->y = colorPick.x; - colorHsv->z = 1.0f - colorPick.y; - - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; - pickerSelector = mousePoint; - - // Calculate color from picker - Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y }; - - colorPick.x /= (float)bounds.width; // Get normalized value on x - colorPick.y /= (float)bounds.height; // Get normalized value on y - - colorHsv->y = colorPick.x; - colorHsv->z = 1.0f - colorPick.y; - } - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state != STATE_DISABLED) - { - DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha)); - DrawRectangleGradientEx(bounds, Fade(colBlack, 0), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, 0)); - - // Draw color picker: selector - Rectangle selector = { pickerSelector.x - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, pickerSelector.y - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE) }; - GuiDrawRectangle(selector, 0, BLANK, colWhite); - } - else - { - DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.6f), guiAlpha)); - } - - GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); - //-------------------------------------------------------------------- - - return result; -} - -// Message Box control -int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons) -{ - #if !defined(RAYGUI_MESSAGEBOX_BUTTON_HEIGHT) - #define RAYGUI_MESSAGEBOX_BUTTON_HEIGHT 24 - #endif - #if !defined(RAYGUI_MESSAGEBOX_BUTTON_PADDING) - #define RAYGUI_MESSAGEBOX_BUTTON_PADDING 12 - #endif - - int result = -1; // Returns clicked button from buttons list, 0 refers to closed window button - - int buttonCount = 0; - const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL); - Rectangle buttonBounds = { 0 }; - buttonBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING; - buttonBounds.y = bounds.y + bounds.height - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT - RAYGUI_MESSAGEBOX_BUTTON_PADDING; - buttonBounds.width = (bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; - buttonBounds.height = RAYGUI_MESSAGEBOX_BUTTON_HEIGHT; - - int textWidth = GetTextWidth(message) + 2; - - Rectangle textBounds = { 0 }; - textBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING; - textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + RAYGUI_MESSAGEBOX_BUTTON_PADDING; - textBounds.width = bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*2; - textBounds.height = bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 3*RAYGUI_MESSAGEBOX_BUTTON_PADDING - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT; - - // Draw control - //-------------------------------------------------------------------- - if (GuiWindowBox(bounds, title)) result = 0; - - int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiLabel(textBounds, message); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); - - prevTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - for (int i = 0; i < buttonCount; i++) - { - if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1; - buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING); - } - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevTextAlignment); - //-------------------------------------------------------------------- - - return result; -} - -// Text Input Box control, ask for text -int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive) -{ - #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT) - #define RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT 24 - #endif - #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_PADDING) - #define RAYGUI_TEXTINPUTBOX_BUTTON_PADDING 12 - #endif - #if !defined(RAYGUI_TEXTINPUTBOX_HEIGHT) - #define RAYGUI_TEXTINPUTBOX_HEIGHT 26 - #endif - - // Used to enable text edit mode - // WARNING: No more than one GuiTextInputBox() should be open at the same time - static bool textEditMode = false; - - int result = -1; - - int buttonCount = 0; - const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL); - Rectangle buttonBounds = { 0 }; - buttonBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - buttonBounds.y = bounds.y + bounds.height - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - buttonBounds.width = (bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; - buttonBounds.height = RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT; - - int messageInputHeight = (int)bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - 2*RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - - Rectangle textBounds = { 0 }; - if (message != NULL) - { - int textSize = GetTextWidth(message) + 2; - - textBounds.x = bounds.x + bounds.width/2 - textSize/2; - textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + messageInputHeight/4 - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - textBounds.width = (float)textSize; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - } - - Rectangle textBoxBounds = { 0 }; - textBoxBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - textBoxBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - RAYGUI_TEXTINPUTBOX_HEIGHT/2; - if (message == NULL) textBoxBounds.y = bounds.y + 24 + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - else textBoxBounds.y += (messageInputHeight/2 + messageInputHeight/4); - textBoxBounds.width = bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*2; - textBoxBounds.height = RAYGUI_TEXTINPUTBOX_HEIGHT; - - // Draw control - //-------------------------------------------------------------------- - if (GuiWindowBox(bounds, title)) result = 0; - - // Draw message if available - if (message != NULL) - { - int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiLabel(textBounds, message); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); - } - - if (secretViewActive != NULL) - { - static char stars[] = "****************"; - if (GuiTextBox(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x, textBoxBounds.y, textBoxBounds.width - 4 - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.height }, - ((*secretViewActive == 1) || textEditMode)? text : stars, textMaxSize, textEditMode)) textEditMode = !textEditMode; - - GuiToggle(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x + textBoxBounds.width - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.y, RAYGUI_TEXTINPUTBOX_HEIGHT, RAYGUI_TEXTINPUTBOX_HEIGHT }, (*secretViewActive == 1)? "#44#" : "#45#", secretViewActive); - } - else - { - if (GuiTextBox(textBoxBounds, text, textMaxSize, textEditMode)) textEditMode = !textEditMode; - } - - int prevBtnTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - for (int i = 0; i < buttonCount; i++) - { - if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1; - buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING); - } - - if (result >= 0) textEditMode = false; - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevBtnTextAlignment); - //-------------------------------------------------------------------- - - return result; // Result is the pressed button index -} - -// Grid control -// NOTE: Returns grid mouse-hover selected cell -// About drawing lines at subpixel spacing, simple put, not easy solution: -// https://stackoverflow.com/questions/4435450/2d-opengl-drawing-lines-that-dont-exactly-fit-pixel-raster -int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell) -{ - // Grid lines alpha amount - #if !defined(RAYGUI_GRID_ALPHA) - #define RAYGUI_GRID_ALPHA 0.15f - #endif - - int result = 0; - GuiState state = guiState; - - Vector2 mousePoint = GetMousePosition(); - Vector2 currentMouseCell = { -1, -1 }; - - float spaceWidth = spacing/(float)subdivs; - int linesV = (int)(bounds.width/spaceWidth) + 1; - int linesH = (int)(bounds.height/spaceWidth) + 1; - - int color = GuiGetStyle(DEFAULT, LINE_COLOR); - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - if (CheckCollisionPointRec(mousePoint, bounds)) - { - // NOTE: Cell values must be the upper left of the cell the mouse is in - currentMouseCell.x = floorf((mousePoint.x - bounds.x)/spacing); - currentMouseCell.y = floorf((mousePoint.y - bounds.y)/spacing); - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_DISABLED) color = GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED); - - if (subdivs > 0) - { - // Draw vertical grid lines - for (int i = 0; i < linesV; i++) - { - Rectangle lineV = { bounds.x + spacing*i/subdivs, bounds.y, 1, bounds.height }; - GuiDrawRectangle(lineV, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA)); - } - - // Draw horizontal grid lines - for (int i = 0; i < linesH; i++) - { - Rectangle lineH = { bounds.x, bounds.y + spacing*i/subdivs, bounds.width, 1 }; - GuiDrawRectangle(lineH, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA)); - } - } - - if (mouseCell != NULL) *mouseCell = currentMouseCell; - return result; -} - -//---------------------------------------------------------------------------------- -// Tooltip management functions -// NOTE: Tooltips requires some global variables: tooltipPtr -//---------------------------------------------------------------------------------- -// Enable gui tooltips (global state) -void GuiEnableTooltip(void) { guiTooltip = true; } - -// Disable gui tooltips (global state) -void GuiDisableTooltip(void) { guiTooltip = false; } - -// Set tooltip string -void GuiSetTooltip(const char *tooltip) { guiTooltipPtr = tooltip; } - -//---------------------------------------------------------------------------------- -// Styles loading functions -//---------------------------------------------------------------------------------- - -// Load raygui style file (.rgs) -// NOTE: By default a binary file is expected, that file could contain a custom font, -// in that case, custom font image atlas is GRAY+ALPHA and pixel data can be compressed (DEFLATE) -void GuiLoadStyle(const char *fileName) -{ - #define MAX_LINE_BUFFER_SIZE 256 - - bool tryBinary = false; - if (!guiStyleLoaded) GuiLoadStyleDefault(); - - // Try reading the files as text file first - FILE *rgsFile = fopen(fileName, "rt"); - - if (rgsFile != NULL) - { - char buffer[MAX_LINE_BUFFER_SIZE] = { 0 }; - fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile); - - if (buffer[0] == '#') - { - int controlId = 0; - int propertyId = 0; - unsigned int propertyValue = 0; - - while (!feof(rgsFile)) - { - switch (buffer[0]) - { - case 'p': - { - // Style property: p - - sscanf(buffer, "p %d %d 0x%x", &controlId, &propertyId, &propertyValue); - GuiSetStyle(controlId, propertyId, (int)propertyValue); - - } break; - case 'f': - { - // Style font: f - - int fontSize = 0; - char charmapFileName[256] = { 0 }; - char fontFileName[256] = { 0 }; - sscanf(buffer, "f %d %s %[^\r\n]s", &fontSize, charmapFileName, fontFileName); - - Font font = { 0 }; - int *codepoints = NULL; - int codepointCount = 0; - - if (charmapFileName[0] != '0') - { - // Load text data from file - // NOTE: Expected an UTF-8 array of codepoints, no separation - char *textData = LoadFileText(TextFormat("%s/%s", GetDirectoryPath(fileName), charmapFileName)); - codepoints = LoadCodepoints(textData, &codepointCount); - UnloadFileText(textData); - } - - if (fontFileName[0] != '\0') - { - // In case a font is already loaded and it is not default internal font, unload it - if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture); - - if (codepointCount > 0) font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, codepoints, codepointCount); - else font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, NULL, 0); // Default to 95 standard codepoints - } - - // If font texture not properly loaded, revert to default font and size/spacing - if (font.texture.id == 0) - { - font = GetFontDefault(); - GuiSetStyle(DEFAULT, TEXT_SIZE, 10); - GuiSetStyle(DEFAULT, TEXT_SPACING, 1); - } - - UnloadCodepoints(codepoints); - - if ((font.texture.id > 0) && (font.glyphCount > 0)) GuiSetFont(font); - - } break; - default: break; - } - - fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile); - } - } - else tryBinary = true; - - fclose(rgsFile); - } - - if (tryBinary) - { - rgsFile = fopen(fileName, "rb"); - - if (rgsFile != NULL) - { - fseek(rgsFile, 0, SEEK_END); - int fileDataSize = ftell(rgsFile); - fseek(rgsFile, 0, SEEK_SET); - - if (fileDataSize > 0) - { - unsigned char *fileData = (unsigned char *)RAYGUI_MALLOC(fileDataSize*sizeof(unsigned char)); - fread(fileData, sizeof(unsigned char), fileDataSize, rgsFile); - - GuiLoadStyleFromMemory(fileData, fileDataSize); - - RAYGUI_FREE(fileData); - } - - fclose(rgsFile); - } - } -} - -// Load style default over global style -void GuiLoadStyleDefault(void) -{ - // We set this variable first to avoid cyclic function calls - // when calling GuiSetStyle() and GuiGetStyle() - guiStyleLoaded = true; - - // Initialize default LIGHT style property values - // WARNING: Default value are applied to all controls on set but - // they can be overwritten later on for every custom control - GuiSetStyle(DEFAULT, BORDER_COLOR_NORMAL, 0x838383ff); - GuiSetStyle(DEFAULT, BASE_COLOR_NORMAL, 0xc9c9c9ff); - GuiSetStyle(DEFAULT, TEXT_COLOR_NORMAL, 0x686868ff); - GuiSetStyle(DEFAULT, BORDER_COLOR_FOCUSED, 0x5bb2d9ff); - GuiSetStyle(DEFAULT, BASE_COLOR_FOCUSED, 0xc9effeff); - GuiSetStyle(DEFAULT, TEXT_COLOR_FOCUSED, 0x6c9bbcff); - GuiSetStyle(DEFAULT, BORDER_COLOR_PRESSED, 0x0492c7ff); - GuiSetStyle(DEFAULT, BASE_COLOR_PRESSED, 0x97e8ffff); - GuiSetStyle(DEFAULT, TEXT_COLOR_PRESSED, 0x368bafff); - GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, 0xb5c1c2ff); - GuiSetStyle(DEFAULT, BASE_COLOR_DISABLED, 0xe6e9e9ff); - GuiSetStyle(DEFAULT, TEXT_COLOR_DISABLED, 0xaeb7b8ff); - GuiSetStyle(DEFAULT, BORDER_WIDTH, 1); - GuiSetStyle(DEFAULT, TEXT_PADDING, 0); - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - // Initialize default extended property values - // NOTE: By default, extended property values are initialized to 0 - GuiSetStyle(DEFAULT, TEXT_SIZE, 10); // DEFAULT, shared by all controls - GuiSetStyle(DEFAULT, TEXT_SPACING, 1); // DEFAULT, shared by all controls - GuiSetStyle(DEFAULT, LINE_COLOR, 0x90abb5ff); // DEFAULT specific property - GuiSetStyle(DEFAULT, BACKGROUND_COLOR, 0xf5f5f5ff); // DEFAULT specific property - GuiSetStyle(DEFAULT, TEXT_LINE_SPACING, 15); // DEFAULT, 15 pixels between lines - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); // DEFAULT, text aligned vertically to middle of text-bounds - - // Initialize control-specific property values - // NOTE: Those properties are in default list but require specific values by control type - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 2); - GuiSetStyle(SLIDER, TEXT_PADDING, 4); - GuiSetStyle(PROGRESSBAR, TEXT_PADDING, 4); - GuiSetStyle(CHECKBOX, TEXT_PADDING, 4); - GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_RIGHT); - GuiSetStyle(DROPDOWNBOX, TEXT_PADDING, 0); - GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiSetStyle(TEXTBOX, TEXT_PADDING, 4); - GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(VALUEBOX, TEXT_PADDING, 0); - GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(SPINNER, TEXT_PADDING, 0); - GuiSetStyle(SPINNER, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(STATUSBAR, TEXT_PADDING, 8); - GuiSetStyle(STATUSBAR, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - - // Initialize extended property values - // NOTE: By default, extended property values are initialized to 0 - GuiSetStyle(TOGGLE, GROUP_PADDING, 2); - GuiSetStyle(SLIDER, SLIDER_WIDTH, 16); - GuiSetStyle(SLIDER, SLIDER_PADDING, 1); - GuiSetStyle(PROGRESSBAR, PROGRESS_PADDING, 1); - GuiSetStyle(CHECKBOX, CHECK_PADDING, 1); - GuiSetStyle(COMBOBOX, COMBO_BUTTON_WIDTH, 32); - GuiSetStyle(COMBOBOX, COMBO_BUTTON_SPACING, 2); - GuiSetStyle(DROPDOWNBOX, ARROW_PADDING, 16); - GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 2); - GuiSetStyle(SPINNER, SPIN_BUTTON_WIDTH, 24); - GuiSetStyle(SPINNER, SPIN_BUTTON_SPACING, 2); - GuiSetStyle(SCROLLBAR, BORDER_WIDTH, 0); - GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, 0); - GuiSetStyle(SCROLLBAR, ARROWS_SIZE, 6); - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, 0); - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, 16); - GuiSetStyle(SCROLLBAR, SCROLL_PADDING, 0); - GuiSetStyle(SCROLLBAR, SCROLL_SPEED, 12); - GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, 28); - GuiSetStyle(LISTVIEW, LIST_ITEMS_SPACING, 2); - GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 12); - GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, SCROLLBAR_RIGHT_SIDE); - GuiSetStyle(COLORPICKER, COLOR_SELECTOR_SIZE, 8); - GuiSetStyle(COLORPICKER, HUEBAR_WIDTH, 16); - GuiSetStyle(COLORPICKER, HUEBAR_PADDING, 8); - GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT, 8); - GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW, 2); - - if (guiFont.texture.id != GetFontDefault().texture.id) - { - // Unload previous font texture - UnloadTexture(guiFont.texture); - RL_FREE(guiFont.recs); - RL_FREE(guiFont.glyphs); - guiFont.recs = NULL; - guiFont.glyphs = NULL; - - // Setup default raylib font - guiFont = GetFontDefault(); - - // NOTE: Default raylib font character 95 is a white square - Rectangle whiteChar = guiFont.recs[95]; - - // NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding on MSAA filtering - SetShapesTexture(guiFont.texture, RAYGUI_CLITERAL(Rectangle){ whiteChar.x + 1, whiteChar.y + 1, whiteChar.width - 2, whiteChar.height - 2 }); - } -} - -// Get text with icon id prepended -// NOTE: Useful to add icons by name id (enum) instead of -// a number that can change between ricon versions -const char *GuiIconText(int iconId, const char *text) -{ -#if defined(RAYGUI_NO_ICONS) - return NULL; -#else - static char buffer[1024] = { 0 }; - static char iconBuffer[16] = { 0 }; - - if (text != NULL) - { - memset(buffer, 0, 1024); - sprintf(buffer, "#%03i#", iconId); - - for (int i = 5; i < 1024; i++) - { - buffer[i] = text[i - 5]; - if (text[i - 5] == '\0') break; - } - - return buffer; - } - else - { - sprintf(iconBuffer, "#%03i#", iconId); - - return iconBuffer; - } -#endif -} - -#if !defined(RAYGUI_NO_ICONS) -// Get full icons data pointer -unsigned int *GuiGetIcons(void) { return guiIconsPtr; } - -// Load raygui icons file (.rgi) -// NOTE: In case nameIds are required, they can be requested with loadIconsName, -// they are returned as a guiIconsName[iconCount][RAYGUI_ICON_MAX_NAME_LENGTH], -// WARNING: guiIconsName[]][] memory should be manually freed! -char **GuiLoadIcons(const char *fileName, bool loadIconsName) -{ - // Style File Structure (.rgi) - // ------------------------------------------------------ - // Offset | Size | Type | Description - // ------------------------------------------------------ - // 0 | 4 | char | Signature: "rGI " - // 4 | 2 | short | Version: 100 - // 6 | 2 | short | reserved - - // 8 | 2 | short | Num icons (N) - // 10 | 2 | short | Icons size (Options: 16, 32, 64) (S) - - // Icons name id (32 bytes per name id) - // foreach (icon) - // { - // 12+32*i | 32 | char | Icon NameId - // } - - // Icons data: One bit per pixel, stored as unsigned int array (depends on icon size) - // S*S pixels/32bit per unsigned int = K unsigned int per icon - // foreach (icon) - // { - // ... | K | unsigned int | Icon Data - // } - - FILE *rgiFile = fopen(fileName, "rb"); - - char **guiIconsName = NULL; - - if (rgiFile != NULL) - { - char signature[5] = { 0 }; - short version = 0; - short reserved = 0; - short iconCount = 0; - short iconSize = 0; - - fread(signature, 1, 4, rgiFile); - fread(&version, sizeof(short), 1, rgiFile); - fread(&reserved, sizeof(short), 1, rgiFile); - fread(&iconCount, sizeof(short), 1, rgiFile); - fread(&iconSize, sizeof(short), 1, rgiFile); - - if ((signature[0] == 'r') && - (signature[1] == 'G') && - (signature[2] == 'I') && - (signature[3] == ' ')) - { - if (loadIconsName) - { - guiIconsName = (char **)RAYGUI_MALLOC(iconCount*sizeof(char **)); - for (int i = 0; i < iconCount; i++) - { - guiIconsName[i] = (char *)RAYGUI_MALLOC(RAYGUI_ICON_MAX_NAME_LENGTH); - fread(guiIconsName[i], 1, RAYGUI_ICON_MAX_NAME_LENGTH, rgiFile); - } - } - else fseek(rgiFile, iconCount*RAYGUI_ICON_MAX_NAME_LENGTH, SEEK_CUR); - - // Read icons data directly over internal icons array - fread(guiIconsPtr, sizeof(unsigned int), iconCount*(iconSize*iconSize/32), rgiFile); - } - - fclose(rgiFile); - } - - return guiIconsName; -} - -// Draw selected icon using rectangles pixel-by-pixel -void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color) -{ - #define BIT_CHECK(a,b) ((a) & (1u<<(b))) - - for (int i = 0, y = 0; i < RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32; i++) - { - for (int k = 0; k < 32; k++) - { - if (BIT_CHECK(guiIconsPtr[iconId*RAYGUI_ICON_DATA_ELEMENTS + i], k)) - { - #if !defined(RAYGUI_STANDALONE) - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ (float)posX + (k%RAYGUI_ICON_SIZE)*pixelSize, (float)posY + y*pixelSize, (float)pixelSize, (float)pixelSize }, 0, BLANK, color); - #endif - } - - if ((k == 15) || (k == 31)) y++; - } - } -} - -// Set icon drawing size -void GuiSetIconScale(int scale) -{ - if (scale >= 1) guiIconScale = scale; -} - -#endif // !RAYGUI_NO_ICONS - -//---------------------------------------------------------------------------------- -// Module specific Functions Definition -//---------------------------------------------------------------------------------- - -// Load style from memory -// WARNING: Binary files only -static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize) -{ - unsigned char *fileDataPtr = (unsigned char *)fileData; - - char signature[5] = { 0 }; - short version = 0; - short reserved = 0; - int propertyCount = 0; - - memcpy(signature, fileDataPtr, 4); - memcpy(&version, fileDataPtr + 4, sizeof(short)); - memcpy(&reserved, fileDataPtr + 4 + 2, sizeof(short)); - memcpy(&propertyCount, fileDataPtr + 4 + 2 + 2, sizeof(int)); - fileDataPtr += 12; - - if ((signature[0] == 'r') && - (signature[1] == 'G') && - (signature[2] == 'S') && - (signature[3] == ' ')) - { - short controlId = 0; - short propertyId = 0; - unsigned int propertyValue = 0; - - for (int i = 0; i < propertyCount; i++) - { - memcpy(&controlId, fileDataPtr, sizeof(short)); - memcpy(&propertyId, fileDataPtr + 2, sizeof(short)); - memcpy(&propertyValue, fileDataPtr + 2 + 2, sizeof(unsigned int)); - fileDataPtr += 8; - - if (controlId == 0) // DEFAULT control - { - // If a DEFAULT property is loaded, it is propagated to all controls - // NOTE: All DEFAULT properties should be defined first in the file - GuiSetStyle(0, (int)propertyId, propertyValue); - - if (propertyId < RAYGUI_MAX_PROPS_BASE) for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) GuiSetStyle(i, (int)propertyId, propertyValue); - } - else GuiSetStyle((int)controlId, (int)propertyId, propertyValue); - } - - // Font loading is highly dependant on raylib API to load font data and image - -#if !defined(RAYGUI_STANDALONE) - // Load custom font if available - int fontDataSize = 0; - memcpy(&fontDataSize, fileDataPtr, sizeof(int)); - fileDataPtr += 4; - - if (fontDataSize > 0) - { - Font font = { 0 }; - int fontType = 0; // 0-Normal, 1-SDF - - memcpy(&font.baseSize, fileDataPtr, sizeof(int)); - memcpy(&font.glyphCount, fileDataPtr + 4, sizeof(int)); - memcpy(&fontType, fileDataPtr + 4 + 4, sizeof(int)); - fileDataPtr += 12; - - // Load font white rectangle - Rectangle fontWhiteRec = { 0 }; - memcpy(&fontWhiteRec, fileDataPtr, sizeof(Rectangle)); - fileDataPtr += 16; - - // Load font image parameters - int fontImageUncompSize = 0; - int fontImageCompSize = 0; - memcpy(&fontImageUncompSize, fileDataPtr, sizeof(int)); - memcpy(&fontImageCompSize, fileDataPtr + 4, sizeof(int)); - fileDataPtr += 8; - - Image imFont = { 0 }; - imFont.mipmaps = 1; - memcpy(&imFont.width, fileDataPtr, sizeof(int)); - memcpy(&imFont.height, fileDataPtr + 4, sizeof(int)); - memcpy(&imFont.format, fileDataPtr + 4 + 4, sizeof(int)); - fileDataPtr += 12; - - if ((fontImageCompSize > 0) && (fontImageCompSize != fontImageUncompSize)) - { - // Compressed font atlas image data (DEFLATE), it requires DecompressData() - int dataUncompSize = 0; - unsigned char *compData = (unsigned char *)RAYGUI_MALLOC(fontImageCompSize); - memcpy(compData, fileDataPtr, fontImageCompSize); - fileDataPtr += fontImageCompSize; - - imFont.data = DecompressData(compData, fontImageCompSize, &dataUncompSize); - - // Security check, dataUncompSize must match the provided fontImageUncompSize - if (dataUncompSize != fontImageUncompSize) RAYGUI_LOG("WARNING: Uncompressed font atlas image data could be corrupted"); - - RAYGUI_FREE(compData); - } - else - { - // Font atlas image data is not compressed - imFont.data = (unsigned char *)RAYGUI_MALLOC(fontImageUncompSize); - memcpy(imFont.data, fileDataPtr, fontImageUncompSize); - fileDataPtr += fontImageUncompSize; - } - - if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture); - font.texture = LoadTextureFromImage(imFont); - - RAYGUI_FREE(imFont.data); - - // Validate font atlas texture was loaded correctly - if (font.texture.id != 0) - { - // Load font recs data - int recsDataSize = font.glyphCount*sizeof(Rectangle); - int recsDataCompressedSize = 0; - - // WARNING: Version 400 adds the compression size parameter - if (version >= 400) - { - // RGS files version 400 support compressed recs data - memcpy(&recsDataCompressedSize, fileDataPtr, sizeof(int)); - fileDataPtr += sizeof(int); - } - - if ((recsDataCompressedSize > 0) && (recsDataCompressedSize != recsDataSize)) - { - // Recs data is compressed, uncompress it - unsigned char *recsDataCompressed = (unsigned char *)RAYGUI_MALLOC(recsDataCompressedSize); - - memcpy(recsDataCompressed, fileDataPtr, recsDataCompressedSize); - fileDataPtr += recsDataCompressedSize; - - int recsDataUncompSize = 0; - font.recs = (Rectangle *)DecompressData(recsDataCompressed, recsDataCompressedSize, &recsDataUncompSize); - - // Security check, data uncompressed size must match the expected original data size - if (recsDataUncompSize != recsDataSize) RAYGUI_LOG("WARNING: Uncompressed font recs data could be corrupted"); - - RAYGUI_FREE(recsDataCompressed); - } - else - { - // Recs data is uncompressed - font.recs = (Rectangle *)RAYGUI_CALLOC(font.glyphCount, sizeof(Rectangle)); - for (int i = 0; i < font.glyphCount; i++) - { - memcpy(&font.recs[i], fileDataPtr, sizeof(Rectangle)); - fileDataPtr += sizeof(Rectangle); - } - } - - // Load font glyphs info data - int glyphsDataSize = font.glyphCount*16; // 16 bytes data per glyph - int glyphsDataCompressedSize = 0; - - // WARNING: Version 400 adds the compression size parameter - if (version >= 400) - { - // RGS files version 400 support compressed glyphs data - memcpy(&glyphsDataCompressedSize, fileDataPtr, sizeof(int)); - fileDataPtr += sizeof(int); - } - - // Allocate required glyphs space to fill with data - font.glyphs = (GlyphInfo *)RAYGUI_CALLOC(font.glyphCount, sizeof(GlyphInfo)); - - if ((glyphsDataCompressedSize > 0) && (glyphsDataCompressedSize != glyphsDataSize)) - { - // Glyphs data is compressed, uncompress it - unsigned char *glypsDataCompressed = (unsigned char *)RAYGUI_MALLOC(glyphsDataCompressedSize); - - memcpy(glypsDataCompressed, fileDataPtr, glyphsDataCompressedSize); - fileDataPtr += glyphsDataCompressedSize; - - int glyphsDataUncompSize = 0; - unsigned char *glyphsDataUncomp = DecompressData(glypsDataCompressed, glyphsDataCompressedSize, &glyphsDataUncompSize); - - // Security check, data uncompressed size must match the expected original data size - if (glyphsDataUncompSize != glyphsDataSize) RAYGUI_LOG("WARNING: Uncompressed font glyphs data could be corrupted"); - - unsigned char *glyphsDataUncompPtr = glyphsDataUncomp; - - for (int i = 0; i < font.glyphCount; i++) - { - memcpy(&font.glyphs[i].value, glyphsDataUncompPtr, sizeof(int)); - memcpy(&font.glyphs[i].offsetX, glyphsDataUncompPtr + 4, sizeof(int)); - memcpy(&font.glyphs[i].offsetY, glyphsDataUncompPtr + 8, sizeof(int)); - memcpy(&font.glyphs[i].advanceX, glyphsDataUncompPtr + 12, sizeof(int)); - glyphsDataUncompPtr += 16; - } - - RAYGUI_FREE(glypsDataCompressed); - RAYGUI_FREE(glyphsDataUncomp); - } - else - { - // Glyphs data is uncompressed - for (int i = 0; i < font.glyphCount; i++) - { - memcpy(&font.glyphs[i].value, fileDataPtr, sizeof(int)); - memcpy(&font.glyphs[i].offsetX, fileDataPtr + 4, sizeof(int)); - memcpy(&font.glyphs[i].offsetY, fileDataPtr + 8, sizeof(int)); - memcpy(&font.glyphs[i].advanceX, fileDataPtr + 12, sizeof(int)); - fileDataPtr += 16; - } - } - } - else font = GetFontDefault(); // Fallback in case of errors loading font atlas texture - - GuiSetFont(font); - - // Set font texture source rectangle to be used as white texture to draw shapes - // NOTE: It makes possible to draw shapes and text (full UI) in a single draw call - if ((fontWhiteRec.x > 0) && - (fontWhiteRec.y > 0) && - (fontWhiteRec.width > 0) && - (fontWhiteRec.height > 0)) SetShapesTexture(font.texture, fontWhiteRec); - } -#endif - } -} - -// Gui get text width considering icon -static int GetTextWidth(const char *text) -{ - #if !defined(ICON_TEXT_PADDING) - #define ICON_TEXT_PADDING 4 - #endif - - Vector2 textSize = { 0 }; - int textIconOffset = 0; - - if ((text != NULL) && (text[0] != '\0')) - { - if (text[0] == '#') - { - for (int i = 1; (i < 5) && (text[i] != '\0'); i++) - { - if (text[i] == '#') - { - textIconOffset = i; - break; - } - } - } - - text += textIconOffset; - - // Make sure guiFont is set, GuiGetStyle() initializes it lazynessly - float fontSize = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - - // Custom MeasureText() implementation - if ((guiFont.texture.id > 0) && (text != NULL)) - { - // Get size in bytes of text, considering end of line and line break - int size = 0; - for (int i = 0; i < MAX_LINE_BUFFER_SIZE; i++) - { - if ((text[i] != '\0') && (text[i] != '\n')) size++; - else break; - } - - float scaleFactor = fontSize/(float)guiFont.baseSize; - textSize.y = (float)guiFont.baseSize*scaleFactor; - float glyphWidth = 0.0f; - - for (int i = 0, codepointSize = 0; i < size; i += codepointSize) - { - int codepoint = GetCodepointNext(&text[i], &codepointSize); - int codepointIndex = GetGlyphIndex(guiFont, codepoint); - - if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor); - else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor); - - textSize.x += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - } - - if (textIconOffset > 0) textSize.x += (RAYGUI_ICON_SIZE - ICON_TEXT_PADDING); - } - - return (int)textSize.x; -} - -// Get text bounds considering control bounds -static Rectangle GetTextBounds(int control, Rectangle bounds) -{ - Rectangle textBounds = bounds; - - textBounds.x = bounds.x + GuiGetStyle(control, BORDER_WIDTH); - textBounds.y = bounds.y + GuiGetStyle(control, BORDER_WIDTH) + GuiGetStyle(control, TEXT_PADDING); - textBounds.width = bounds.width - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); - textBounds.height = bounds.height - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); // NOTE: Text is processed line per line! - - // Depending on control, TEXT_PADDING and TEXT_ALIGNMENT properties could affect the text-bounds - switch (control) - { - case COMBOBOX: - case DROPDOWNBOX: - case LISTVIEW: - // TODO: Special cases (no label): COMBOBOX, DROPDOWNBOX, LISTVIEW - case SLIDER: - case CHECKBOX: - case VALUEBOX: - case SPINNER: - // TODO: More special cases (label on side): SLIDER, CHECKBOX, VALUEBOX, SPINNER - default: - { - // TODO: WARNING: TEXT_ALIGNMENT is already considered in GuiDrawText() - if (GuiGetStyle(control, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT) textBounds.x -= GuiGetStyle(control, TEXT_PADDING); - else textBounds.x += GuiGetStyle(control, TEXT_PADDING); - } - break; - } - - return textBounds; -} - -// Get text icon if provided and move text cursor -// NOTE: We support up to 999 values for iconId -static const char *GetTextIcon(const char *text, int *iconId) -{ -#if !defined(RAYGUI_NO_ICONS) - *iconId = -1; - if (text[0] == '#') // Maybe we have an icon! - { - char iconValue[4] = { 0 }; // Maximum length for icon value: 3 digits + '\0' - - int pos = 1; - while ((pos < 4) && (text[pos] >= '0') && (text[pos] <= '9')) - { - iconValue[pos - 1] = text[pos]; - pos++; - } - - if (text[pos] == '#') - { - *iconId = TextToInteger(iconValue); - - // Move text pointer after icon - // WARNING: If only icon provided, it could point to EOL character: '\0' - if (*iconId >= 0) text += (pos + 1); - } - } -#endif - - return text; -} - -// Get text divided into lines (by line-breaks '\n') -const char **GetTextLines(const char *text, int *count) -{ - #define RAYGUI_MAX_TEXT_LINES 128 - - static const char *lines[RAYGUI_MAX_TEXT_LINES] = { 0 }; - for (int i = 0; i < RAYGUI_MAX_TEXT_LINES; i++) lines[i] = NULL; // Init NULL pointers to substrings - - int textSize = (int)strlen(text); - - lines[0] = text; - int len = 0; - *count = 1; - //int lineSize = 0; // Stores current line size, not returned - - for (int i = 0, k = 0; (i < textSize) && (*count < RAYGUI_MAX_TEXT_LINES); i++) - { - if (text[i] == '\n') - { - //lineSize = len; - k++; - lines[k] = &text[i + 1]; // WARNING: next value is valid? - len = 0; - *count += 1; - } - else len++; - } - - //lines[*count - 1].size = len; - - return lines; -} - -// Get text width to next space for provided string -static float GetNextSpaceWidth(const char *text, int *nextSpaceIndex) -{ - float width = 0; - int codepointByteCount = 0; - int codepoint = 0; - int index = 0; - float glyphWidth = 0; - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize; - - for (int i = 0; text[i] != '\0'; i++) - { - if (text[i] != ' ') - { - codepoint = GetCodepoint(&text[i], &codepointByteCount); - index = GetGlyphIndex(guiFont, codepoint); - glyphWidth = (guiFont.glyphs[index].advanceX == 0)? guiFont.recs[index].width*scaleFactor : guiFont.glyphs[index].advanceX*scaleFactor; - width += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - else - { - *nextSpaceIndex = i; - break; - } - } - - return width; -} - -// Gui draw text using default font -static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint) -{ - #define TEXT_VALIGN_PIXEL_OFFSET(h) ((int)h%2) // Vertical alignment for pixel perfect - - #if !defined(ICON_TEXT_PADDING) - #define ICON_TEXT_PADDING 4 - #endif - - if ((text == NULL) || (text[0] == '\0')) return; // Security check - - // PROCEDURE: - // - Text is processed line per line - // - For every line, horizontal alignment is defined - // - For all text, vertical alignment is defined (multiline text only) - // - For every line, wordwrap mode is checked (useful for GuitextBox(), read-only) - - // Get text lines (using '\n' as delimiter) to be processed individually - // WARNING: We can't use GuiTextSplit() function because it can be already used - // before the GuiDrawText() call and its buffer is static, it would be overriden :( - int lineCount = 0; - const char **lines = GetTextLines(text, &lineCount); - - // Text style variables - //int alignment = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT); - int alignmentVertical = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL); - int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); // Wrap-mode only available in read-only mode, no for text editing - - // TODO: WARNING: This totalHeight is not valid for vertical alignment in case of word-wrap - float totalHeight = (float)(lineCount*GuiGetStyle(DEFAULT, TEXT_SIZE) + (lineCount - 1)*GuiGetStyle(DEFAULT, TEXT_SIZE)/2); - float posOffsetY = 0.0f; - - for (int i = 0; i < lineCount; i++) - { - int iconId = 0; - lines[i] = GetTextIcon(lines[i], &iconId); // Check text for icon and move cursor - - // Get text position depending on alignment and iconId - //--------------------------------------------------------------------------------- - Vector2 textBoundsPosition = { textBounds.x, textBounds.y }; - float textBoundsWidthOffset = 0.0f; - - // NOTE: We get text size after icon has been processed - // WARNING: GetTextWidth() also processes text icon to get width! -> Really needed? - int textSizeX = GetTextWidth(lines[i]); - - // If text requires an icon, add size to measure - if (iconId >= 0) - { - textSizeX += RAYGUI_ICON_SIZE*guiIconScale; - - // WARNING: If only icon provided, text could be pointing to EOF character: '\0' -#if !defined(RAYGUI_NO_ICONS) - if ((lines[i] != NULL) && (lines[i][0] != '\0')) textSizeX += ICON_TEXT_PADDING; -#endif - } - - // Check guiTextAlign global variables - switch (alignment) - { - case TEXT_ALIGN_LEFT: textBoundsPosition.x = textBounds.x; break; - case TEXT_ALIGN_CENTER: textBoundsPosition.x = textBounds.x + textBounds.width/2 - textSizeX/2; break; - case TEXT_ALIGN_RIGHT: textBoundsPosition.x = textBounds.x + textBounds.width - textSizeX; break; - default: break; - } - - if (textSizeX > textBounds.width && (lines[i] != NULL) && (lines[i][0] != '\0')) textBoundsPosition.x = textBounds.x; - - switch (alignmentVertical) - { - // Only valid in case of wordWrap = 0; - case TEXT_ALIGN_TOP: textBoundsPosition.y = textBounds.y + posOffsetY; break; - case TEXT_ALIGN_MIDDLE: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height/2 - totalHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break; - case TEXT_ALIGN_BOTTOM: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height - totalHeight + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break; - default: break; - } - - // NOTE: Make sure we get pixel-perfect coordinates, - // In case of decimals we got weird text positioning - textBoundsPosition.x = (float)((int)textBoundsPosition.x); - textBoundsPosition.y = (float)((int)textBoundsPosition.y); - //--------------------------------------------------------------------------------- - - // Draw text (with icon if available) - //--------------------------------------------------------------------------------- -#if !defined(RAYGUI_NO_ICONS) - if (iconId >= 0) - { - // NOTE: We consider icon height, probably different than text size - GuiDrawIcon(iconId, (int)textBoundsPosition.x, (int)(textBounds.y + textBounds.height/2 - RAYGUI_ICON_SIZE*guiIconScale/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height)), guiIconScale, tint); - textBoundsPosition.x += (RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING); - textBoundsWidthOffset = (RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING); - } -#endif - // Get size in bytes of text, - // considering end of line and line break - int lineSize = 0; - for (int c = 0; (lines[i][c] != '\0') && (lines[i][c] != '\n') && (lines[i][c] != '\r'); c++, lineSize++){ } - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize; - - int lastSpaceIndex = 0; - bool tempWrapCharMode = false; - - int textOffsetY = 0; - float textOffsetX = 0.0f; - float glyphWidth = 0; - - float ellipsisWidth = GetTextWidth("..."); - bool overflowReached = false; - for (int c = 0, codepointSize = 0; c < lineSize; c += codepointSize) - { - int codepoint = GetCodepointNext(&lines[i][c], &codepointSize); - int index = GetGlyphIndex(guiFont, codepoint); - - // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f) - // but we need to draw all of the bad bytes using the '?' symbol moving one byte - if (codepoint == 0x3f) codepointSize = 1; // TODO: Review not recognized codepoints size - - // Get glyph width to check if it goes out of bounds - if (guiFont.glyphs[index].advanceX == 0) glyphWidth = ((float)guiFont.recs[index].width*scaleFactor); - else glyphWidth = (float)guiFont.glyphs[index].advanceX*scaleFactor; - - // Wrap mode text measuring, to validate if - // it can be drawn or a new line is required - if (wrapMode == TEXT_WRAP_CHAR) - { - // Jump to next line if current character reach end of the box limits - if ((textOffsetX + glyphWidth) > textBounds.width - textBoundsWidthOffset) - { - textOffsetX = 0.0f; - textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); - - if (tempWrapCharMode) // Wrap at char level when too long words - { - wrapMode = TEXT_WRAP_WORD; - tempWrapCharMode = false; - } - } - } - else if (wrapMode == TEXT_WRAP_WORD) - { - if (codepoint == 32) lastSpaceIndex = c; - - // Get width to next space in line - int nextSpaceIndex = 0; - float nextSpaceWidth = GetNextSpaceWidth(lines[i] + c, &nextSpaceIndex); - - int nextSpaceIndex2 = 0; - float nextWordSize = GetNextSpaceWidth(lines[i] + lastSpaceIndex + 1, &nextSpaceIndex2); - - if (nextWordSize > textBounds.width - textBoundsWidthOffset) - { - // Considering the case the next word is longer than bounds - tempWrapCharMode = true; - wrapMode = TEXT_WRAP_CHAR; - } - else if ((textOffsetX + nextSpaceWidth) > textBounds.width - textBoundsWidthOffset) - { - textOffsetX = 0.0f; - textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); - } - } - - if (codepoint == '\n') break; // WARNING: Lines are already processed manually, no need to keep drawing after this codepoint - else - { - // TODO: There are multiple types of spaces in Unicode, - // maybe it's a good idea to add support for more: http://jkorpela.fi/chars/spaces.html - if ((codepoint != ' ') && (codepoint != '\t')) // Do not draw codepoints with no glyph - { - if (wrapMode == TEXT_WRAP_NONE) - { - // Draw only required text glyphs fitting the textBounds.width - if (textSizeX > textBounds.width) - { - if (textOffsetX <= (textBounds.width - glyphWidth - textBoundsWidthOffset - ellipsisWidth)) - { - DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - else if (!overflowReached) - { - overflowReached = true; - - for (int j = 0; j < ellipsisWidth; j += ellipsisWidth/3) - { - DrawTextCodepoint(guiFont, '.', RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX + j, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - } - } - else - { - DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - } - else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) - { - // Draw only glyphs inside the bounds - if ((textBoundsPosition.y + textOffsetY) <= (textBounds.y + textBounds.height - GuiGetStyle(DEFAULT, TEXT_SIZE))) - { - DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - } - } - - if (guiFont.glyphs[index].advanceX == 0) textOffsetX += ((float)guiFont.recs[index].width*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - else textOffsetX += ((float)guiFont.glyphs[index].advanceX*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - } - - if (wrapMode == TEXT_WRAP_NONE) posOffsetY += (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); - else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) posOffsetY += (textOffsetY + (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING)); - //--------------------------------------------------------------------------------- - } - -#if defined(RAYGUI_DEBUG_TEXT_BOUNDS) - GuiDrawRectangle(textBounds, 0, WHITE, Fade(BLUE, 0.4f)); -#endif -} - -// Gui draw rectangle using default raygui plain style with borders -static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color) -{ - if (color.a > 0) - { - // Draw rectangle filled with color - DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, GuiFade(color, guiAlpha)); - } - - if (borderWidth > 0) - { - // Draw rectangle border lines with color - DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha)); - DrawRectangle((int)rec.x, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha)); - DrawRectangle((int)rec.x + (int)rec.width - borderWidth, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha)); - DrawRectangle((int)rec.x, (int)rec.y + (int)rec.height - borderWidth, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha)); - } - -#if defined(RAYGUI_DEBUG_RECS_BOUNDS) - DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, Fade(RED, 0.4f)); -#endif -} - -// Draw tooltip using control bounds -static void GuiTooltip(Rectangle controlRec) -{ - if (!guiLocked && guiTooltip && (guiTooltipPtr != NULL) && !guiControlExclusiveMode) - { - Vector2 textSize = MeasureTextEx(GuiGetFont(), guiTooltipPtr, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - - if ((controlRec.x + textSize.x + 16) > GetScreenWidth()) controlRec.x -= (textSize.x + 16 - controlRec.width); - - GuiPanel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, NULL); - - int textPadding = GuiGetStyle(LABEL, TEXT_PADDING); - int textAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); - GuiSetStyle(LABEL, TEXT_PADDING, 0); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiLabel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, guiTooltipPtr); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, textAlignment); - GuiSetStyle(LABEL, TEXT_PADDING, textPadding); - } -} - -// Split controls text into multiple strings -// Also check for multiple columns (required by GuiToggleGroup()) -static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow) -{ - // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter) - // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated, - // all used memory is static... it has some limitations: - // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS - // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE - // NOTE: Those definitions could be externally provided if required - - // TODO: HACK: GuiTextSplit() - Review how textRows are returned to user - // textRow is an externally provided array of integers that stores row number for every splitted string - - #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS) - #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128 - #endif - #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE) - #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024 - #endif - - static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; // String pointers array (points to buffer data) - static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; // Buffer data (text input copy with '\0' added) - memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE); - - result[0] = buffer; - int counter = 1; - - if (textRow != NULL) textRow[0] = 0; - - // Count how many substrings we have on text and point to every one - for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++) - { - buffer[i] = text[i]; - if (buffer[i] == '\0') break; - else if ((buffer[i] == delimiter) || (buffer[i] == '\n')) - { - result[counter] = buffer + i + 1; - - if (textRow != NULL) - { - if (buffer[i] == '\n') textRow[counter] = textRow[counter - 1] + 1; - else textRow[counter] = textRow[counter - 1]; - } - - buffer[i] = '\0'; // Set an end of string at this point - - counter++; - if (counter > RAYGUI_TEXTSPLIT_MAX_ITEMS) break; - } - } - - *count = counter; - - return result; -} - -// Convert color data from RGB to HSV -// NOTE: Color data should be passed normalized -static Vector3 ConvertRGBtoHSV(Vector3 rgb) -{ - Vector3 hsv = { 0 }; - float min = 0.0f; - float max = 0.0f; - float delta = 0.0f; - - min = (rgb.x < rgb.y)? rgb.x : rgb.y; - min = (min < rgb.z)? min : rgb.z; - - max = (rgb.x > rgb.y)? rgb.x : rgb.y; - max = (max > rgb.z)? max : rgb.z; - - hsv.z = max; // Value - delta = max - min; - - if (delta < 0.00001f) - { - hsv.y = 0.0f; - hsv.x = 0.0f; // Undefined, maybe NAN? - return hsv; - } - - if (max > 0.0f) - { - // NOTE: If max is 0, this divide would cause a crash - hsv.y = (delta/max); // Saturation - } - else - { - // NOTE: If max is 0, then r = g = b = 0, s = 0, h is undefined - hsv.y = 0.0f; - hsv.x = 0.0f; // Undefined, maybe NAN? - return hsv; - } - - // NOTE: Comparing float values could not work properly - if (rgb.x >= max) hsv.x = (rgb.y - rgb.z)/delta; // Between yellow & magenta - else - { - if (rgb.y >= max) hsv.x = 2.0f + (rgb.z - rgb.x)/delta; // Between cyan & yellow - else hsv.x = 4.0f + (rgb.x - rgb.y)/delta; // Between magenta & cyan - } - - hsv.x *= 60.0f; // Convert to degrees - - if (hsv.x < 0.0f) hsv.x += 360.0f; - - return hsv; -} - -// Convert color data from HSV to RGB -// NOTE: Color data should be passed normalized -static Vector3 ConvertHSVtoRGB(Vector3 hsv) -{ - Vector3 rgb = { 0 }; - float hh = 0.0f, p = 0.0f, q = 0.0f, t = 0.0f, ff = 0.0f; - long i = 0; - - // NOTE: Comparing float values could not work properly - if (hsv.y <= 0.0f) - { - rgb.x = hsv.z; - rgb.y = hsv.z; - rgb.z = hsv.z; - return rgb; - } - - hh = hsv.x; - if (hh >= 360.0f) hh = 0.0f; - hh /= 60.0f; - - i = (long)hh; - ff = hh - i; - p = hsv.z*(1.0f - hsv.y); - q = hsv.z*(1.0f - (hsv.y*ff)); - t = hsv.z*(1.0f - (hsv.y*(1.0f - ff))); - - switch (i) - { - case 0: - { - rgb.x = hsv.z; - rgb.y = t; - rgb.z = p; - } break; - case 1: - { - rgb.x = q; - rgb.y = hsv.z; - rgb.z = p; - } break; - case 2: - { - rgb.x = p; - rgb.y = hsv.z; - rgb.z = t; - } break; - case 3: - { - rgb.x = p; - rgb.y = q; - rgb.z = hsv.z; - } break; - case 4: - { - rgb.x = t; - rgb.y = p; - rgb.z = hsv.z; - } break; - case 5: - default: - { - rgb.x = hsv.z; - rgb.y = p; - rgb.z = q; - } break; - } - - return rgb; -} - -// Scroll bar control (used by GuiScrollPanel()) -static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue) -{ - GuiState state = guiState; - - // Is the scrollbar horizontal or vertical? - bool isVertical = (bounds.width > bounds.height)? false : true; - - // The size (width or height depending on scrollbar type) of the spinner buttons - const int spinnerSize = GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)? - (isVertical? (int)bounds.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) : - (int)bounds.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH)) : 0; - - // Arrow buttons [<] [>] [∧] [∨] - Rectangle arrowUpLeft = { 0 }; - Rectangle arrowDownRight = { 0 }; - - // Actual area of the scrollbar excluding the arrow buttons - Rectangle scrollbar = { 0 }; - - // Slider bar that moves --[///]----- - Rectangle slider = { 0 }; - - // Normalize value - if (value > maxValue) value = maxValue; - if (value < minValue) value = minValue; - - int valueRange = maxValue - minValue; - if (valueRange <= 0) valueRange = 1; - - int sliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); - if (sliderSize < 1) sliderSize = 1; // TODO: Consider a minimum slider size - - // Calculate rectangles for all of the components - arrowUpLeft = RAYGUI_CLITERAL(Rectangle){ - (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), - (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), - (float)spinnerSize, (float)spinnerSize }; - - if (isVertical) - { - arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + bounds.height - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize }; - scrollbar = RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), arrowUpLeft.y + arrowUpLeft.height, bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)), bounds.height - arrowUpLeft.height - arrowDownRight.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) }; - - // Make sure the slider won't get outside of the scrollbar - sliderSize = (sliderSize >= scrollbar.height)? ((int)scrollbar.height - 2) : sliderSize; - slider = RAYGUI_CLITERAL(Rectangle){ - bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), - scrollbar.y + (int)(((float)(value - minValue)/valueRange)*(scrollbar.height - sliderSize)), - bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)), - (float)sliderSize }; - } - else // horizontal - { - arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + bounds.width - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize }; - scrollbar = RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x + arrowUpLeft.width, bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), bounds.width - arrowUpLeft.width - arrowDownRight.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH), bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)) }; - - // Make sure the slider won't get outside of the scrollbar - sliderSize = (sliderSize >= scrollbar.width)? ((int)scrollbar.width - 2) : sliderSize; - slider = RAYGUI_CLITERAL(Rectangle){ - scrollbar.x + (int)(((float)(value - minValue)/valueRange)*(scrollbar.width - sliderSize)), - bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), - (float)sliderSize, - bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)) }; - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) && - !CheckCollisionPointRec(mousePoint, arrowUpLeft) && - !CheckCollisionPointRec(mousePoint, arrowDownRight)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - - if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue); - else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue); - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - - // Handle mouse wheel - int wheel = (int)GetMouseWheelMove(); - if (wheel != 0) value += wheel; - - // Handle mouse button down - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - // Check arrows click - if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) value -= valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - else if (CheckCollisionPointRec(mousePoint, arrowDownRight)) value += valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - else if (!CheckCollisionPointRec(mousePoint, slider)) - { - // If click on scrollbar position but not on slider, place slider directly on that position - if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue); - else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue); - } - - state = STATE_PRESSED; - } - - // Keyboard control on mouse hover scrollbar - /* - if (isVertical) - { - if (IsKeyDown(KEY_DOWN)) value += 5; - else if (IsKeyDown(KEY_UP)) value -= 5; - } - else - { - if (IsKeyDown(KEY_RIGHT)) value += 5; - else if (IsKeyDown(KEY_LEFT)) value -= 5; - } - */ - } - - // Normalize value - if (value > maxValue) value = maxValue; - if (value < minValue) value = minValue; - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(SCROLLBAR, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED))); // Draw the background - - GuiDrawRectangle(scrollbar, 0, BLANK, GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL))); // Draw the scrollbar active area background - GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BORDER + state*3))); // Draw the slider bar - - // Draw arrows (using icon if available) - if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)) - { -#if defined(RAYGUI_NO_ICONS) - GuiDrawText(isVertical? "^" : "<", - RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); - GuiDrawText(isVertical? "v" : ">", - RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); -#else - GuiDrawText(isVertical? "#121#" : "#118#", - RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_UP_FILL / ICON_ARROW_LEFT_FILL - GuiDrawText(isVertical? "#120#" : "#119#", - RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_DOWN_FILL / ICON_ARROW_RIGHT_FILL -#endif - } - //-------------------------------------------------------------------- - - return value; -} - -// Color fade-in or fade-out, alpha goes from 0.0f to 1.0f -// WARNING: It multiplies current alpha by alpha scale factor -static Color GuiFade(Color color, float alpha) -{ - if (alpha < 0.0f) alpha = 0.0f; - else if (alpha > 1.0f) alpha = 1.0f; - - Color result = { color.r, color.g, color.b, (unsigned char)(color.a*alpha) }; - - return result; -} - -#if defined(RAYGUI_STANDALONE) -// Returns a Color struct from hexadecimal value -static Color GetColor(int hexValue) -{ - Color color; - - color.r = (unsigned char)(hexValue >> 24) & 0xFF; - color.g = (unsigned char)(hexValue >> 16) & 0xFF; - color.b = (unsigned char)(hexValue >> 8) & 0xFF; - color.a = (unsigned char)hexValue & 0xFF; - - return color; -} - -// Returns hexadecimal value for a Color -static int ColorToInt(Color color) -{ - return (((int)color.r << 24) | ((int)color.g << 16) | ((int)color.b << 8) | (int)color.a); -} - -// Check if point is inside rectangle -static bool CheckCollisionPointRec(Vector2 point, Rectangle rec) -{ - bool collision = false; - - if ((point.x >= rec.x) && (point.x <= (rec.x + rec.width)) && - (point.y >= rec.y) && (point.y <= (rec.y + rec.height))) collision = true; - - return collision; -} - -// Formatting of text with variables to 'embed' -static const char *TextFormat(const char *text, ...) -{ - #if !defined(RAYGUI_TEXTFORMAT_MAX_SIZE) - #define RAYGUI_TEXTFORMAT_MAX_SIZE 256 - #endif - - static char buffer[RAYGUI_TEXTFORMAT_MAX_SIZE]; - - va_list args; - va_start(args, text); - vsprintf(buffer, text, args); - va_end(args); - - return buffer; -} - -// Draw rectangle with vertical gradient fill color -// NOTE: This function is only used by GuiColorPicker() -static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2) -{ - Rectangle bounds = { (float)posX, (float)posY, (float)width, (float)height }; - DrawRectangleGradientEx(bounds, color1, color2, color2, color1); -} - -// Split string into multiple strings -const char **TextSplit(const char *text, char delimiter, int *count) -{ - // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter) - // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated, - // all used memory is static... it has some limitations: - // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS - // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE - - #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS) - #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128 - #endif - #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE) - #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024 - #endif - - static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; - static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; - memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE); - - result[0] = buffer; - int counter = 0; - - if (text != NULL) - { - counter = 1; - - // Count how many substrings we have on text and point to every one - for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++) - { - buffer[i] = text[i]; - if (buffer[i] == '\0') break; - else if (buffer[i] == delimiter) - { - buffer[i] = '\0'; // Set an end of string at this point - result[counter] = buffer + i + 1; - counter++; - - if (counter == RAYGUI_TEXTSPLIT_MAX_ITEMS) break; - } - } - } - - *count = counter; - return result; -} - -// Get integer value from text -// NOTE: This function replaces atoi() [stdlib.h] -static int TextToInteger(const char *text) -{ - int value = 0; - int sign = 1; - - if ((text[0] == '+') || (text[0] == '-')) - { - if (text[0] == '-') sign = -1; - text++; - } - - for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); ++i) value = value*10 + (int)(text[i] - '0'); - - return value*sign; -} - -// Encode codepoint into UTF-8 text (char array size returned as parameter) -static const char *CodepointToUTF8(int codepoint, int *byteSize) -{ - static char utf8[6] = { 0 }; - int size = 0; - - if (codepoint <= 0x7f) - { - utf8[0] = (char)codepoint; - size = 1; - } - else if (codepoint <= 0x7ff) - { - utf8[0] = (char)(((codepoint >> 6) & 0x1f) | 0xc0); - utf8[1] = (char)((codepoint & 0x3f) | 0x80); - size = 2; - } - else if (codepoint <= 0xffff) - { - utf8[0] = (char)(((codepoint >> 12) & 0x0f) | 0xe0); - utf8[1] = (char)(((codepoint >> 6) & 0x3f) | 0x80); - utf8[2] = (char)((codepoint & 0x3f) | 0x80); - size = 3; - } - else if (codepoint <= 0x10ffff) - { - utf8[0] = (char)(((codepoint >> 18) & 0x07) | 0xf0); - utf8[1] = (char)(((codepoint >> 12) & 0x3f) | 0x80); - utf8[2] = (char)(((codepoint >> 6) & 0x3f) | 0x80); - utf8[3] = (char)((codepoint & 0x3f) | 0x80); - size = 4; - } - - *byteSize = size; - - return utf8; -} - -// Get next codepoint in a UTF-8 encoded text, scanning until '\0' is found -// When a invalid UTF-8 byte is encountered we exit as soon as possible and a '?'(0x3f) codepoint is returned -// Total number of bytes processed are returned as a parameter -// NOTE: the standard says U+FFFD should be returned in case of errors -// but that character is not supported by the default font in raylib -static int GetCodepointNext(const char *text, int *codepointSize) -{ - const char *ptr = text; - int codepoint = 0x3f; // Codepoint (defaults to '?') - *codepointSize = 1; - - // Get current codepoint and bytes processed - if (0xf0 == (0xf8 & ptr[0])) - { - // 4 byte UTF-8 codepoint - if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80) || ((ptr[3] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks - codepoint = ((0x07 & ptr[0]) << 18) | ((0x3f & ptr[1]) << 12) | ((0x3f & ptr[2]) << 6) | (0x3f & ptr[3]); - *codepointSize = 4; - } - else if (0xe0 == (0xf0 & ptr[0])) - { - // 3 byte UTF-8 codepoint */ - if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks - codepoint = ((0x0f & ptr[0]) << 12) | ((0x3f & ptr[1]) << 6) | (0x3f & ptr[2]); - *codepointSize = 3; - } - else if (0xc0 == (0xe0 & ptr[0])) - { - // 2 byte UTF-8 codepoint - if ((ptr[1] & 0xC0) ^ 0x80) { return codepoint; } //10xxxxxx checks - codepoint = ((0x1f & ptr[0]) << 6) | (0x3f & ptr[1]); - *codepointSize = 2; - } - else if (0x00 == (0x80 & ptr[0])) - { - // 1 byte UTF-8 codepoint - codepoint = ptr[0]; - *codepointSize = 1; - } - - return codepoint; -} -#endif // RAYGUI_STANDALONE - -#endif // RAYGUI_IMPLEMENTATION diff --git a/raylib-src/old-raygui-src/raygui.h b/raylib-src/old-raygui-src/raygui.h deleted file mode 100644 index 5c0bc60..0000000 --- a/raylib-src/old-raygui-src/raygui.h +++ /dev/null @@ -1,5540 +0,0 @@ -/******************************************************************************************* -* -* raygui v4.1-dev - A simple and easy-to-use immediate-mode gui library -* -* DESCRIPTION: -* raygui is a tools-dev-focused immediate-mode-gui library based on raylib but also -* available as a standalone library, as long as input and drawing functions are provided. -* -* FEATURES: -* - Immediate-mode gui, minimal retained data -* - +25 controls provided (basic and advanced) -* - Styling system for colors, font and metrics -* - Icons supported, embedded as a 1-bit icons pack -* - Standalone mode option (custom input/graphics backend) -* - Multiple support tools provided for raygui development -* -* POSSIBLE IMPROVEMENTS: -* - Better standalone mode API for easy plug of custom backends -* - Externalize required inputs, allow user easier customization -* -* LIMITATIONS: -* - No editable multi-line word-wraped text box supported -* - No auto-layout mechanism, up to the user to define controls position and size -* - Standalone mode requires library modification and some user work to plug another backend -* -* NOTES: -* - WARNING: GuiLoadStyle() and GuiLoadStyle{Custom}() functions, allocate memory for -* font atlas recs and glyphs, freeing that memory is (usually) up to the user, -* no unload function is explicitly provided... but note that GuiLoadStyleDefault() unloads -* by default any previously loaded font (texture, recs, glyphs). -* - Global UI alpha (guiAlpha) is applied inside GuiDrawRectangle() and GuiDrawText() functions -* -* CONTROLS PROVIDED: -* # Container/separators Controls -* - WindowBox --> StatusBar, Panel -* - GroupBox --> Line -* - Line -* - Panel --> StatusBar -* - ScrollPanel --> StatusBar -* - TabBar --> Button -* -* # Basic Controls -* - Label -* - LabelButton --> Label -* - Button -* - Toggle -* - ToggleGroup --> Toggle -* - ToggleSlider -* - CheckBox -* - ComboBox -* - DropdownBox -* - TextBox -* - ValueBox --> TextBox -* - Spinner --> Button, ValueBox -* - Slider -* - SliderBar --> Slider -* - ProgressBar -* - StatusBar -* - DummyRec -* - Grid -* -* # Advance Controls -* - ListView -* - ColorPicker --> ColorPanel, ColorBarHue -* - MessageBox --> Window, Label, Button -* - TextInputBox --> Window, Label, TextBox, Button -* -* It also provides a set of functions for styling the controls based on its properties (size, color). -* -* -* RAYGUI STYLE (guiStyle): -* raygui uses a global data array for all gui style properties (allocated on data segment by default), -* when a new style is loaded, it is loaded over the global style... but a default gui style could always be -* recovered with GuiLoadStyleDefault() function, that overwrites the current style to the default one -* -* The global style array size is fixed and depends on the number of controls and properties: -* -* static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)]; -* -* guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB -* -* Note that the first set of BASE properties (by default guiStyle[0..15]) belong to the generic style -* used for all controls, when any of those base values is set, it is automatically populated to all -* controls, so, specific control values overwriting generic style should be set after base values. -* -* After the first BASE set we have the EXTENDED properties (by default guiStyle[16..23]), those -* properties are actually common to all controls and can not be overwritten individually (like BASE ones) -* Some of those properties are: TEXT_SIZE, TEXT_SPACING, LINE_COLOR, BACKGROUND_COLOR -* -* Custom control properties can be defined using the EXTENDED properties for each independent control. -* -* TOOL: rGuiStyler is a visual tool to customize raygui style: github.com/raysan5/rguistyler -* -* -* RAYGUI ICONS (guiIcons): -* raygui could use a global array containing icons data (allocated on data segment by default), -* a custom icons set could be loaded over this array using GuiLoadIcons(), but loaded icons set -* must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS will be loaded -* -* Every icon is codified in binary form, using 1 bit per pixel, so, every 16x16 icon -* requires 8 integers (16*16/32) to be stored in memory. -* -* When the icon is draw, actually one quad per pixel is drawn if the bit for that pixel is set. -* -* The global icons array size is fixed and depends on the number of icons and size: -* -* static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS]; -* -* guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB -* -* TOOL: rGuiIcons is a visual tool to customize/create raygui icons: github.com/raysan5/rguiicons -* -* RAYGUI LAYOUT: -* raygui currently does not provide an auto-layout mechanism like other libraries, -* layouts must be defined manually on controls drawing, providing the right bounds Rectangle for it. -* -* TOOL: rGuiLayout is a visual tool to create raygui layouts: github.com/raysan5/rguilayout -* -* CONFIGURATION: -* #define RAYGUI_IMPLEMENTATION -* Generates the implementation of the library into the included file. -* If not defined, the library is in header only mode and can be included in other headers -* or source files without problems. But only ONE file should hold the implementation. -* -* #define RAYGUI_STANDALONE -* Avoid raylib.h header inclusion in this file. Data types defined on raylib are defined -* internally in the library and input management and drawing functions must be provided by -* the user (check library implementation for further details). -* -* #define RAYGUI_NO_ICONS -* Avoid including embedded ricons data (256 icons, 16x16 pixels, 1-bit per pixel, 2KB) -* -* #define RAYGUI_CUSTOM_ICONS -* Includes custom ricons.h header defining a set of custom icons, -* this file can be generated using rGuiIcons tool -* -* #define RAYGUI_DEBUG_RECS_BOUNDS -* Draw control bounds rectangles for debug -* -* #define RAYGUI_DEBUG_TEXT_BOUNDS -* Draw text bounds rectangles for debug -* -* VERSIONS HISTORY: -* 4.1-dev (2024) Current dev version... -* ADDED: guiControlExclusiveMode and guiControlExclusiveRec for exclusive modes -* -* 4.0 (12-Sep-2023) ADDED: GuiToggleSlider() -* ADDED: GuiColorPickerHSV() and GuiColorPanelHSV() -* ADDED: Multiple new icons, mostly compiler related -* ADDED: New DEFAULT properties: TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE -* ADDED: New enum values: GuiTextAlignment, GuiTextAlignmentVertical, GuiTextWrapMode -* ADDED: Support loading styles with custom font charset from external file -* REDESIGNED: GuiTextBox(), support mouse cursor positioning -* REDESIGNED: GuiDrawText(), support multiline and word-wrap modes (read only) -* REDESIGNED: GuiProgressBar() to be more visual, progress affects border color -* REDESIGNED: Global alpha consideration moved to GuiDrawRectangle() and GuiDrawText() -* REDESIGNED: GuiScrollPanel(), get parameters by reference and return result value -* REDESIGNED: GuiToggleGroup(), get parameters by reference and return result value -* REDESIGNED: GuiComboBox(), get parameters by reference and return result value -* REDESIGNED: GuiCheckBox(), get parameters by reference and return result value -* REDESIGNED: GuiSlider(), get parameters by reference and return result value -* REDESIGNED: GuiSliderBar(), get parameters by reference and return result value -* REDESIGNED: GuiProgressBar(), get parameters by reference and return result value -* REDESIGNED: GuiListView(), get parameters by reference and return result value -* REDESIGNED: GuiColorPicker(), get parameters by reference and return result value -* REDESIGNED: GuiColorPanel(), get parameters by reference and return result value -* REDESIGNED: GuiColorBarAlpha(), get parameters by reference and return result value -* REDESIGNED: GuiColorBarHue(), get parameters by reference and return result value -* REDESIGNED: GuiGrid(), get parameters by reference and return result value -* REDESIGNED: GuiGrid(), added extra parameter -* REDESIGNED: GuiListViewEx(), change parameters order -* REDESIGNED: All controls return result as int value -* REVIEWED: GuiScrollPanel() to avoid smallish scroll-bars -* REVIEWED: All examples and specially controls_test_suite -* RENAMED: gui_file_dialog module to gui_window_file_dialog -* UPDATED: All styles to include ISO-8859-15 charset (as much as possible) -* -* 3.6 (10-May-2023) ADDED: New icon: SAND_TIMER -* ADDED: GuiLoadStyleFromMemory() (binary only) -* REVIEWED: GuiScrollBar() horizontal movement key -* REVIEWED: GuiTextBox() crash on cursor movement -* REVIEWED: GuiTextBox(), additional inputs support -* REVIEWED: GuiLabelButton(), avoid text cut -* REVIEWED: GuiTextInputBox(), password input -* REVIEWED: Local GetCodepointNext(), aligned with raylib -* REDESIGNED: GuiSlider*()/GuiScrollBar() to support out-of-bounds -* -* 3.5 (20-Apr-2023) ADDED: GuiTabBar(), based on GuiToggle() -* 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 -* REVIEWED: GuiScrollBar(), improve mouse-click behaviour -* REVIEWED: Library header info, more info, better organized -* REDESIGNED: GuiTextBox() 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 -* REDESIGNED: GuiPanel() to support text parameter -* REDESIGNED: GuiScrollPanel() to support text parameter -* REDESIGNED: GuiColorPicker() to support text parameter -* REDESIGNED: GuiColorPanel() to support text parameter -* REDESIGNED: GuiColorBarAlpha() to support text parameter -* REDESIGNED: GuiColorBarHue() to support text parameter -* REDESIGNED: GuiTextInputBox() to support password -* -* 3.1 (12-Jan-2022) REVIEWED: Default style for consistency (aligned with rGuiLayout v2.5 tool) -* REVIEWED: GuiLoadStyle() to support compressed font atlas image data and unload previous textures -* REVIEWED: External icons usage logic -* REVIEWED: GuiLine() for centered alignment when including text -* RENAMED: Multiple controls properties definitions to prepend RAYGUI_ -* RENAMED: RICON_ references to RAYGUI_ICON_ for library consistency -* Projects updated and multiple tweaks -* -* 3.0 (04-Nov-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 -* 2.6 (09-Sep-2019) ADDED: GuiTextInputBox() -* REDESIGNED: GuiListView*(), GuiDropdownBox(), GuiSlider*(), GuiProgressBar(), GuiMessageBox() -* REVIEWED: GuiTextBox(), GuiSpinner(), GuiValueBox(), GuiLoadStyle() -* Replaced property INNER_PADDING by TEXT_PADDING, renamed some properties -* ADDED: 8 new custom styles ready to use -* Multiple minor tweaks and bugs corrected -* -* 2.5 (28-May-2019) Implemented extended GuiTextBox(), GuiValueBox(), GuiSpinner() -* 2.3 (29-Apr-2019) ADDED: rIcons auxiliar library and support for it, multiple controls reviewed -* Refactor all controls drawing mechanism to use control state -* 2.2 (05-Feb-2019) ADDED: GuiScrollBar(), GuiScrollPanel(), reviewed GuiListView(), removed Gui*Ex() controls -* 2.1 (26-Dec-2018) REDESIGNED: GuiCheckBox(), GuiComboBox(), GuiDropdownBox(), GuiToggleGroup() > Use combined text string -* REDESIGNED: Style system (breaking change) -* 2.0 (08-Nov-2018) ADDED: Support controls guiLock and custom fonts -* REVIEWED: GuiComboBox(), GuiListView()... -* 1.9 (09-Oct-2018) REVIEWED: GuiGrid(), GuiTextBox(), GuiTextBoxMulti(), GuiValueBox()... -* 1.8 (01-May-2018) Lot of rework and redesign to align with rGuiStyler and rGuiLayout -* 1.5 (21-Jun-2017) Working in an improved styles system -* 1.4 (15-Jun-2017) Rewritten all GUI functions (removed useless ones) -* 1.3 (12-Jun-2017) Complete redesign of style system -* 1.1 (01-Jun-2017) Complete review of the library -* 1.0 (07-Jun-2016) Converted to header-only by Ramon Santamaria. -* 0.9 (07-Mar-2016) Reviewed and tested by Albert Martos, Ian Eito, Sergio Martinez and Ramon Santamaria. -* 0.8 (27-Aug-2015) Initial release. Implemented by Kevin Gato, Daniel Nicolás and Ramon Santamaria. -* -* DEPENDENCIES: -* raylib 5.0 - Inputs reading (keyboard/mouse), shapes drawing, font loading and text drawing -* -* STANDALONE MODE: -* By default raygui depends on raylib mostly for the inputs and the drawing functionality but that dependency can be disabled -* with the config flag RAYGUI_STANDALONE. In that case is up to the user to provide another backend to cover library needs. -* -* The following functions should be redefined for a custom backend: -* -* - Vector2 GetMousePosition(void); -* - float GetMouseWheelMove(void); -* - bool IsMouseButtonDown(int button); -* - bool IsMouseButtonPressed(int button); -* - bool IsMouseButtonReleased(int button); -* - bool IsKeyDown(int key); -* - bool IsKeyPressed(int key); -* - int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() -* -* - void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle() -* - void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() -* -* - Font GetFontDefault(void); // -- GuiLoadStyleDefault() -* - Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle() -* - Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image -* - void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization) -* - char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data -* - void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data -* - const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs -* - int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list -* - void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list -* - unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle() -* -* CONTRIBUTORS: -* Ramon Santamaria: Supervision, review, redesign, update and maintenance -* Vlad Adrian: Complete rewrite of GuiTextBox() to support extended features (2019) -* Sergio Martinez: Review, testing (2015) and redesign of multiple controls (2018) -* Adria Arranz: Testing and implementation of additional controls (2018) -* Jordi Jorba: Testing and implementation of additional controls (2018) -* Albert Martos: Review and testing of the library (2015) -* Ian Eito: Review and testing of the library (2015) -* Kevin Gato: Initial implementation of basic components (2014) -* Daniel Nicolas: Initial implementation of basic components (2014) -* -* -* LICENSE: zlib/libpng -* -* Copyright (c) 2014-2024 Ramon Santamaria (@raysan5) -* -* This software is provided "as-is", without any express or implied warranty. In no event -* will the authors be held liable for any damages arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, including commercial -* applications, and to alter it and redistribute it freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not claim that you -* wrote the original software. If you use this software in a product, an acknowledgment -* in the product documentation would be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not be misrepresented -* as being the original software. -* -* 3. This notice may not be removed or altered from any source distribution. -* -**********************************************************************************************/ - -#ifndef RAYGUI_H -#define RAYGUI_H - -#define RAYGUI_VERSION_MAJOR 4 -#define RAYGUI_VERSION_MINOR 1 -#define RAYGUI_VERSION_PATCH 0 -#define RAYGUI_VERSION "4.1-dev" - -#if !defined(RAYGUI_STANDALONE) - #include "raylib.h" -#endif - -// Function specifiers in case library is build/used as a shared library (Windows) -// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll -#if defined(_WIN32) - #if defined(BUILD_LIBTYPE_SHARED) - #define RAYGUIAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) - #elif defined(USE_LIBTYPE_SHARED) - #define RAYGUIAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) - #endif -#endif - -// Function specifiers definition -#ifndef RAYGUIAPI - #define RAYGUIAPI // Functions defined as 'extern' by default (implicit specifiers) -#endif - -//---------------------------------------------------------------------------------- -// Defines and Macros -//---------------------------------------------------------------------------------- -// Allow custom memory allocators -#ifndef RAYGUI_MALLOC - #define RAYGUI_MALLOC(sz) malloc(sz) -#endif -#ifndef RAYGUI_CALLOC - #define RAYGUI_CALLOC(n,sz) calloc(n,sz) -#endif -#ifndef RAYGUI_FREE - #define RAYGUI_FREE(p) free(p) -#endif - -// Simple log system to avoid printf() calls if required -// NOTE: Avoiding those calls, also avoids const strings memory usage -#define RAYGUI_SUPPORT_LOG_INFO -#if defined(RAYGUI_SUPPORT_LOG_INFO) - #define RAYGUI_LOG(...) printf(__VA_ARGS__) -#else - #define RAYGUI_LOG(...) -#endif - -//---------------------------------------------------------------------------------- -// Types and Structures Definition -// NOTE: Some types are required for RAYGUI_STANDALONE usage -//---------------------------------------------------------------------------------- -#if defined(RAYGUI_STANDALONE) - #ifndef __cplusplus - // Boolean type - #ifndef true - typedef enum { false, true } bool; - #endif - #endif - - // Vector2 type - typedef struct Vector2 { - float x; - float y; - } Vector2; - - // Vector3 type // -- ConvertHSVtoRGB(), ConvertRGBtoHSV() - typedef struct Vector3 { - float x; - float y; - float z; - } Vector3; - - // Color type, RGBA (32bit) - typedef struct Color { - unsigned char r; - unsigned char g; - unsigned char b; - unsigned char a; - } Color; - - // Rectangle type - typedef struct Rectangle { - float x; - float y; - float width; - float height; - } Rectangle; - - // TODO: Texture2D type is very coupled to raylib, required by Font type - // It should be redesigned to be provided by user - typedef struct Texture2D { - unsigned int id; // OpenGL texture id - int width; // Texture base width - int height; // Texture base height - int mipmaps; // Mipmap levels, 1 by default - int format; // Data format (PixelFormat type) - } Texture2D; - - // Image, pixel data stored in CPU memory (RAM) - typedef struct Image { - void *data; // Image raw data - int width; // Image base width - int height; // Image base height - int mipmaps; // Mipmap levels, 1 by default - int format; // Data format (PixelFormat type) - } Image; - - // GlyphInfo, font characters glyphs info - typedef struct GlyphInfo { - int value; // Character value (Unicode) - int offsetX; // Character offset X when drawing - int offsetY; // Character offset Y when drawing - int advanceX; // Character advance position X - Image image; // Character image data - } GlyphInfo; - - // TODO: Font type is very coupled to raylib, mostly required by GuiLoadStyle() - // It should be redesigned to be provided by user - typedef struct Font { - int baseSize; // Base size (default chars height) - int glyphCount; // Number of glyph characters - int glyphPadding; // Padding around the glyph characters - Texture2D texture; // Texture atlas containing the glyphs - Rectangle *recs; // Rectangles in texture for the glyphs - GlyphInfo *glyphs; // Glyphs info data - } Font; -#endif - -// Style property -// NOTE: Used when exporting style as code for convenience -typedef struct GuiStyleProp { - unsigned short controlId; // Control identifier - unsigned short propertyId; // Property identifier - int propertyValue; // Property value -} GuiStyleProp; - -/* -// Controls text style -NOT USED- -// NOTE: Text style is defined by control -typedef struct GuiTextStyle { - unsigned int size; - int charSpacing; - int lineSpacing; - int alignmentH; - int alignmentV; - int padding; -} GuiTextStyle; -*/ - -// Gui control state -typedef enum { - STATE_NORMAL = 0, - STATE_FOCUSED, - STATE_PRESSED, - STATE_DISABLED -} GuiState; - -// Gui control text alignment -typedef enum { - TEXT_ALIGN_LEFT = 0, - TEXT_ALIGN_CENTER, - TEXT_ALIGN_RIGHT -} GuiTextAlignment; - -// Gui control text alignment vertical -// NOTE: Text vertical position inside the text bounds -typedef enum { - TEXT_ALIGN_TOP = 0, - TEXT_ALIGN_MIDDLE, - TEXT_ALIGN_BOTTOM -} GuiTextAlignmentVertical; - -// Gui control text wrap mode -// NOTE: Useful for multiline text -typedef enum { - TEXT_WRAP_NONE = 0, - TEXT_WRAP_CHAR, - TEXT_WRAP_WORD -} GuiTextWrapMode; - -// Gui controls -typedef enum { - // Default -> populates to all controls when set - DEFAULT = 0, - - // Basic controls - LABEL, // Used also for: LABELBUTTON - BUTTON, - TOGGLE, // Used also for: TOGGLEGROUP - SLIDER, // Used also for: SLIDERBAR, TOGGLESLIDER - PROGRESSBAR, - CHECKBOX, - COMBOBOX, - DROPDOWNBOX, - TEXTBOX, // Used also for: TEXTBOXMULTI - VALUEBOX, - SPINNER, // Uses: BUTTON, VALUEBOX - LISTVIEW, - COLORPICKER, - SCROLLBAR, - STATUSBAR -} GuiControl; - -// Gui base properties for every control -// NOTE: RAYGUI_MAX_PROPS_BASE properties (by default 16 properties) -typedef enum { - BORDER_COLOR_NORMAL = 0, // Control border color in STATE_NORMAL - BASE_COLOR_NORMAL, // Control base color in STATE_NORMAL - TEXT_COLOR_NORMAL, // Control text color in STATE_NORMAL - BORDER_COLOR_FOCUSED, // Control border color in STATE_FOCUSED - BASE_COLOR_FOCUSED, // Control base color in STATE_FOCUSED - TEXT_COLOR_FOCUSED, // Control text color in STATE_FOCUSED - BORDER_COLOR_PRESSED, // Control border color in STATE_PRESSED - BASE_COLOR_PRESSED, // Control base color in STATE_PRESSED - TEXT_COLOR_PRESSED, // Control text color in STATE_PRESSED - BORDER_COLOR_DISABLED, // Control border color in STATE_DISABLED - BASE_COLOR_DISABLED, // Control base color in STATE_DISABLED - TEXT_COLOR_DISABLED, // Control text color in STATE_DISABLED - BORDER_WIDTH, // Control border size, 0 for no border - //TEXT_SIZE, // Control text size (glyphs max height) -> GLOBAL for all controls - //TEXT_SPACING, // Control text spacing between glyphs -> GLOBAL for all controls - //TEXT_LINE_SPACING // Control text spacing between lines -> GLOBAL for all controls - TEXT_PADDING, // Control text padding, not considering border - TEXT_ALIGNMENT, // Control text horizontal alignment inside control text bound (after border and padding) - //TEXT_WRAP_MODE // Control text wrap-mode inside text bounds -> GLOBAL for all controls -} GuiControlProperty; - -// TODO: Which text styling properties should be global or per-control? -// At this moment TEXT_PADDING and TEXT_ALIGNMENT is configured and saved per control while -// TEXT_SIZE, TEXT_SPACING, TEXT_LINE_SPACING, TEXT_ALIGNMENT_VERTICAL, TEXT_WRAP_MODE are global and -// should be configured by user as needed while defining the UI layout - -// Gui extended properties depend on control -// NOTE: RAYGUI_MAX_PROPS_EXTENDED properties (by default, max 8 properties) -//---------------------------------------------------------------------------------- -// DEFAULT extended properties -// NOTE: Those properties are common to all controls or global -// WARNING: We only have 8 slots for those properties by default!!! -> New global control: TEXT? -typedef enum { - TEXT_SIZE = 16, // Text size (glyphs max height) - TEXT_SPACING, // Text spacing between glyphs - LINE_COLOR, // Line control color - BACKGROUND_COLOR, // Background color - TEXT_LINE_SPACING, // Text spacing between lines - TEXT_ALIGNMENT_VERTICAL, // Text vertical alignment inside text bounds (after border and padding) - TEXT_WRAP_MODE // Text wrap-mode inside text bounds - //TEXT_DECORATION // Text decoration: 0-None, 1-Underline, 2-Line-through, 3-Overline - //TEXT_DECORATION_THICK // Text decoration line thickness -} GuiDefaultProperty; - -// Other possible text properties: -// TEXT_WEIGHT // Normal, Italic, Bold -> Requires specific font change -// TEXT_INDENT // Text indentation -> Now using TEXT_PADDING... - -// Label -//typedef enum { } GuiLabelProperty; - -// Button/Spinner -//typedef enum { } GuiButtonProperty; - -// Toggle/ToggleGroup -typedef enum { - GROUP_PADDING = 16, // ToggleGroup separation between toggles -} GuiToggleProperty; - -// Slider/SliderBar -typedef enum { - SLIDER_WIDTH = 16, // Slider size of internal bar - SLIDER_PADDING // Slider/SliderBar internal bar padding -} GuiSliderProperty; - -// ProgressBar -typedef enum { - PROGRESS_PADDING = 16, // ProgressBar internal padding -} GuiProgressBarProperty; - -// ScrollBar -typedef enum { - ARROWS_SIZE = 16, // ScrollBar arrows size - ARROWS_VISIBLE, // ScrollBar arrows visible - SCROLL_SLIDER_PADDING, // ScrollBar slider internal padding - SCROLL_SLIDER_SIZE, // ScrollBar slider size - SCROLL_PADDING, // ScrollBar scroll padding from arrows - SCROLL_SPEED, // ScrollBar scrolling speed -} GuiScrollBarProperty; - -// CheckBox -typedef enum { - CHECK_PADDING = 16 // CheckBox internal check padding -} GuiCheckBoxProperty; - -// ComboBox -typedef enum { - COMBO_BUTTON_WIDTH = 16, // ComboBox right button width - COMBO_BUTTON_SPACING // ComboBox button separation -} GuiComboBoxProperty; - -// DropdownBox -typedef enum { - ARROW_PADDING = 16, // DropdownBox arrow separation from border and items - DROPDOWN_ITEMS_SPACING // DropdownBox items separation -} GuiDropdownBoxProperty; - -// TextBox/TextBoxMulti/ValueBox/Spinner -typedef enum { - TEXT_READONLY = 16, // TextBox in read-only mode: 0-text editable, 1-text no-editable -} GuiTextBoxProperty; - -// Spinner -typedef enum { - SPIN_BUTTON_WIDTH = 16, // Spinner left/right buttons width - SPIN_BUTTON_SPACING, // Spinner buttons separation -} GuiSpinnerProperty; - -// ListView -typedef enum { - LIST_ITEMS_HEIGHT = 16, // ListView items height - LIST_ITEMS_SPACING, // ListView items separation - SCROLLBAR_WIDTH, // ListView scrollbar size (usually width) - SCROLLBAR_SIDE, // ListView scrollbar side (0-SCROLLBAR_LEFT_SIDE, 1-SCROLLBAR_RIGHT_SIDE) -} GuiListViewProperty; - -// ColorPicker -typedef enum { - COLOR_SELECTOR_SIZE = 16, - HUEBAR_WIDTH, // ColorPicker right hue bar width - HUEBAR_PADDING, // ColorPicker right hue bar separation from panel - HUEBAR_SELECTOR_HEIGHT, // ColorPicker right hue bar selector height - HUEBAR_SELECTOR_OVERFLOW // ColorPicker right hue bar selector overflow -} GuiColorPickerProperty; - -#define SCROLLBAR_LEFT_SIDE 0 -#define SCROLLBAR_RIGHT_SIDE 1 - -//---------------------------------------------------------------------------------- -// Global Variables Definition -//---------------------------------------------------------------------------------- -// ... - -//---------------------------------------------------------------------------------- -// Module Functions Declaration -//---------------------------------------------------------------------------------- - -#if defined(__cplusplus) -extern "C" { // Prevents name mangling of functions -#endif - -// Global gui state control functions -RAYGUIAPI void GuiEnable(void); // Enable gui controls (global state) -RAYGUIAPI void GuiDisable(void); // Disable gui controls (global state) -RAYGUIAPI void GuiLock(void); // Lock gui controls (global state) -RAYGUIAPI void GuiUnlock(void); // Unlock gui controls (global state) -RAYGUIAPI bool GuiIsLocked(void); // Check if gui is locked (global state) -RAYGUIAPI void GuiSetAlpha(float alpha); // Set gui controls alpha (global state), alpha goes from 0.0f to 1.0f -RAYGUIAPI void GuiSetState(int state); // Set gui state (global state) -RAYGUIAPI int GuiGetState(void); // Get gui state (global state) - -// Font set/get functions -RAYGUIAPI void GuiSetFont(Font font); // Set gui custom font (global state) -RAYGUIAPI Font GuiGetFont(void); // Get gui custom font (global state) - -// Style set/get functions -RAYGUIAPI void GuiSetStyle(int control, int property, int value); // Set one style property -RAYGUIAPI int GuiGetStyle(int control, int property); // Get one style property - -// Styles loading functions -RAYGUIAPI void GuiLoadStyle(const char *fileName); // Load style file over global style variable (.rgs) -RAYGUIAPI void GuiLoadStyleDefault(void); // Load style default over global style - -// Tooltips management functions -RAYGUIAPI void GuiEnableTooltip(void); // Enable gui tooltips (global state) -RAYGUIAPI void GuiDisableTooltip(void); // Disable gui tooltips (global state) -RAYGUIAPI void GuiSetTooltip(const char *tooltip); // Set tooltip string - -// Icons functionality -RAYGUIAPI const char *GuiIconText(int iconId, const char *text); // Get text with icon id prepended (if supported) -#if !defined(RAYGUI_NO_ICONS) -RAYGUIAPI void GuiSetIconScale(int scale); // Set default icon drawing size -RAYGUIAPI unsigned int *GuiGetIcons(void); // Get raygui icons data pointer -RAYGUIAPI char **GuiLoadIcons(const char *fileName, bool loadIconsName); // Load raygui icons file (.rgi) into internal icons data -RAYGUIAPI void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color); // Draw icon using pixel size at specified position -#endif - -// Controls -//---------------------------------------------------------------------------------------------------------- -// Container/separator controls, useful for controls organization -RAYGUIAPI int GuiWindowBox(Rectangle bounds, const char *title); // Window Box control, shows a window that can be closed -RAYGUIAPI int GuiGroupBox(Rectangle bounds, const char *text); // Group Box control with text name -RAYGUIAPI int GuiLine(Rectangle bounds, const char *text); // Line separator control, could contain text -RAYGUIAPI int GuiPanel(Rectangle bounds, const char *text); // Panel control, useful to group controls -RAYGUIAPI int GuiTabBar(Rectangle bounds, const char **text, int count, int *active); // Tab Bar control, returns TAB to be closed or -1 -RAYGUIAPI int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view); // Scroll Panel control - -// Basic controls set -RAYGUIAPI int GuiLabel(Rectangle bounds, const char *text); // Label control -RAYGUIAPI int GuiButton(Rectangle bounds, const char *text); // Button control, returns true when clicked -RAYGUIAPI int GuiLabelButton(Rectangle bounds, const char *text); // Label button control, returns true when clicked -RAYGUIAPI int GuiToggle(Rectangle bounds, const char *text, bool *active); // Toggle Button control -RAYGUIAPI int GuiToggleGroup(Rectangle bounds, const char *text, int *active); // Toggle Group control -RAYGUIAPI int GuiToggleSlider(Rectangle bounds, const char *text, int *active); // Toggle Slider control -RAYGUIAPI int GuiCheckBox(Rectangle bounds, const char *text, bool *checked); // Check Box control, returns true when active -RAYGUIAPI int GuiComboBox(Rectangle bounds, const char *text, int *active); // Combo Box control - -RAYGUIAPI int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode); // Dropdown Box control -RAYGUIAPI int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Spinner control -RAYGUIAPI int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode); // Value Box control, updates input text with numbers -RAYGUIAPI int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode); // Text Box control, updates input text - -RAYGUIAPI int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider control -RAYGUIAPI int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Slider Bar control -RAYGUIAPI int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue); // Progress Bar control -RAYGUIAPI int GuiStatusBar(Rectangle bounds, const char *text); // Status Bar control, shows info text -RAYGUIAPI int GuiDummyRec(Rectangle bounds, const char *text); // Dummy control for placeholders -RAYGUIAPI int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell); // Grid control - -// Advance controls set -RAYGUIAPI int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active); // List View control -RAYGUIAPI int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus); // List View with extended parameters -RAYGUIAPI int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons); // Message Box control, displays a message -RAYGUIAPI int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive); // Text Input Box control, ask for text, supports secret -RAYGUIAPI int GuiColorPicker(Rectangle bounds, const char *text, Color *color); // Color Picker control (multiple color controls) -RAYGUIAPI int GuiColorPanel(Rectangle bounds, const char *text, Color *color); // Color Panel control -RAYGUIAPI int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha); // Color Bar Alpha control -RAYGUIAPI int GuiColorBarHue(Rectangle bounds, const char *text, float *value); // Color Bar Hue control -RAYGUIAPI int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Picker control that avoids conversion to RGB on each call (multiple color controls) -RAYGUIAPI int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv); // Color Panel control that updates Hue-Saturation-Value color value, used by GuiColorPickerHSV() -//---------------------------------------------------------------------------------------------------------- - -#if !defined(RAYGUI_NO_ICONS) - -#if !defined(RAYGUI_CUSTOM_ICONS) -//---------------------------------------------------------------------------------- -// Icons enumeration -//---------------------------------------------------------------------------------- -typedef enum { - ICON_NONE = 0, - ICON_FOLDER_FILE_OPEN = 1, - ICON_FILE_SAVE_CLASSIC = 2, - ICON_FOLDER_OPEN = 3, - ICON_FOLDER_SAVE = 4, - ICON_FILE_OPEN = 5, - ICON_FILE_SAVE = 6, - ICON_FILE_EXPORT = 7, - ICON_FILE_ADD = 8, - ICON_FILE_DELETE = 9, - ICON_FILETYPE_TEXT = 10, - ICON_FILETYPE_AUDIO = 11, - ICON_FILETYPE_IMAGE = 12, - ICON_FILETYPE_PLAY = 13, - ICON_FILETYPE_VIDEO = 14, - ICON_FILETYPE_INFO = 15, - ICON_FILE_COPY = 16, - ICON_FILE_CUT = 17, - ICON_FILE_PASTE = 18, - ICON_CURSOR_HAND = 19, - ICON_CURSOR_POINTER = 20, - ICON_CURSOR_CLASSIC = 21, - ICON_PENCIL = 22, - ICON_PENCIL_BIG = 23, - ICON_BRUSH_CLASSIC = 24, - ICON_BRUSH_PAINTER = 25, - ICON_WATER_DROP = 26, - ICON_COLOR_PICKER = 27, - ICON_RUBBER = 28, - ICON_COLOR_BUCKET = 29, - ICON_TEXT_T = 30, - ICON_TEXT_A = 31, - ICON_SCALE = 32, - ICON_RESIZE = 33, - ICON_FILTER_POINT = 34, - ICON_FILTER_BILINEAR = 35, - ICON_CROP = 36, - ICON_CROP_ALPHA = 37, - ICON_SQUARE_TOGGLE = 38, - ICON_SYMMETRY = 39, - ICON_SYMMETRY_HORIZONTAL = 40, - ICON_SYMMETRY_VERTICAL = 41, - ICON_LENS = 42, - ICON_LENS_BIG = 43, - ICON_EYE_ON = 44, - ICON_EYE_OFF = 45, - ICON_FILTER_TOP = 46, - ICON_FILTER = 47, - ICON_TARGET_POINT = 48, - ICON_TARGET_SMALL = 49, - ICON_TARGET_BIG = 50, - ICON_TARGET_MOVE = 51, - ICON_CURSOR_MOVE = 52, - ICON_CURSOR_SCALE = 53, - ICON_CURSOR_SCALE_RIGHT = 54, - ICON_CURSOR_SCALE_LEFT = 55, - ICON_UNDO = 56, - ICON_REDO = 57, - ICON_REREDO = 58, - ICON_MUTATE = 59, - ICON_ROTATE = 60, - ICON_REPEAT = 61, - ICON_SHUFFLE = 62, - ICON_EMPTYBOX = 63, - ICON_TARGET = 64, - ICON_TARGET_SMALL_FILL = 65, - ICON_TARGET_BIG_FILL = 66, - ICON_TARGET_MOVE_FILL = 67, - ICON_CURSOR_MOVE_FILL = 68, - ICON_CURSOR_SCALE_FILL = 69, - ICON_CURSOR_SCALE_RIGHT_FILL = 70, - ICON_CURSOR_SCALE_LEFT_FILL = 71, - ICON_UNDO_FILL = 72, - ICON_REDO_FILL = 73, - ICON_REREDO_FILL = 74, - ICON_MUTATE_FILL = 75, - ICON_ROTATE_FILL = 76, - ICON_REPEAT_FILL = 77, - ICON_SHUFFLE_FILL = 78, - ICON_EMPTYBOX_SMALL = 79, - ICON_BOX = 80, - ICON_BOX_TOP = 81, - ICON_BOX_TOP_RIGHT = 82, - ICON_BOX_RIGHT = 83, - ICON_BOX_BOTTOM_RIGHT = 84, - ICON_BOX_BOTTOM = 85, - ICON_BOX_BOTTOM_LEFT = 86, - ICON_BOX_LEFT = 87, - ICON_BOX_TOP_LEFT = 88, - ICON_BOX_CENTER = 89, - ICON_BOX_CIRCLE_MASK = 90, - ICON_POT = 91, - ICON_ALPHA_MULTIPLY = 92, - ICON_ALPHA_CLEAR = 93, - ICON_DITHERING = 94, - ICON_MIPMAPS = 95, - ICON_BOX_GRID = 96, - ICON_GRID = 97, - ICON_BOX_CORNERS_SMALL = 98, - ICON_BOX_CORNERS_BIG = 99, - ICON_FOUR_BOXES = 100, - ICON_GRID_FILL = 101, - ICON_BOX_MULTISIZE = 102, - ICON_ZOOM_SMALL = 103, - ICON_ZOOM_MEDIUM = 104, - ICON_ZOOM_BIG = 105, - ICON_ZOOM_ALL = 106, - ICON_ZOOM_CENTER = 107, - ICON_BOX_DOTS_SMALL = 108, - ICON_BOX_DOTS_BIG = 109, - ICON_BOX_CONCENTRIC = 110, - ICON_BOX_GRID_BIG = 111, - ICON_OK_TICK = 112, - ICON_CROSS = 113, - ICON_ARROW_LEFT = 114, - ICON_ARROW_RIGHT = 115, - ICON_ARROW_DOWN = 116, - ICON_ARROW_UP = 117, - ICON_ARROW_LEFT_FILL = 118, - ICON_ARROW_RIGHT_FILL = 119, - ICON_ARROW_DOWN_FILL = 120, - ICON_ARROW_UP_FILL = 121, - ICON_AUDIO = 122, - ICON_FX = 123, - ICON_WAVE = 124, - ICON_WAVE_SINUS = 125, - ICON_WAVE_SQUARE = 126, - ICON_WAVE_TRIANGULAR = 127, - ICON_CROSS_SMALL = 128, - ICON_PLAYER_PREVIOUS = 129, - ICON_PLAYER_PLAY_BACK = 130, - ICON_PLAYER_PLAY = 131, - ICON_PLAYER_PAUSE = 132, - ICON_PLAYER_STOP = 133, - ICON_PLAYER_NEXT = 134, - ICON_PLAYER_RECORD = 135, - ICON_MAGNET = 136, - ICON_LOCK_CLOSE = 137, - ICON_LOCK_OPEN = 138, - ICON_CLOCK = 139, - ICON_TOOLS = 140, - ICON_GEAR = 141, - ICON_GEAR_BIG = 142, - ICON_BIN = 143, - ICON_HAND_POINTER = 144, - ICON_LASER = 145, - ICON_COIN = 146, - ICON_EXPLOSION = 147, - ICON_1UP = 148, - ICON_PLAYER = 149, - ICON_PLAYER_JUMP = 150, - ICON_KEY = 151, - ICON_DEMON = 152, - ICON_TEXT_POPUP = 153, - ICON_GEAR_EX = 154, - ICON_CRACK = 155, - ICON_CRACK_POINTS = 156, - ICON_STAR = 157, - ICON_DOOR = 158, - ICON_EXIT = 159, - ICON_MODE_2D = 160, - ICON_MODE_3D = 161, - ICON_CUBE = 162, - ICON_CUBE_FACE_TOP = 163, - ICON_CUBE_FACE_LEFT = 164, - ICON_CUBE_FACE_FRONT = 165, - ICON_CUBE_FACE_BOTTOM = 166, - ICON_CUBE_FACE_RIGHT = 167, - ICON_CUBE_FACE_BACK = 168, - ICON_CAMERA = 169, - ICON_SPECIAL = 170, - ICON_LINK_NET = 171, - ICON_LINK_BOXES = 172, - ICON_LINK_MULTI = 173, - ICON_LINK = 174, - ICON_LINK_BROKE = 175, - ICON_TEXT_NOTES = 176, - ICON_NOTEBOOK = 177, - ICON_SUITCASE = 178, - ICON_SUITCASE_ZIP = 179, - ICON_MAILBOX = 180, - ICON_MONITOR = 181, - ICON_PRINTER = 182, - ICON_PHOTO_CAMERA = 183, - ICON_PHOTO_CAMERA_FLASH = 184, - ICON_HOUSE = 185, - ICON_HEART = 186, - ICON_CORNER = 187, - ICON_VERTICAL_BARS = 188, - ICON_VERTICAL_BARS_FILL = 189, - ICON_LIFE_BARS = 190, - ICON_INFO = 191, - ICON_CROSSLINE = 192, - ICON_HELP = 193, - ICON_FILETYPE_ALPHA = 194, - ICON_FILETYPE_HOME = 195, - ICON_LAYERS_VISIBLE = 196, - ICON_LAYERS = 197, - ICON_WINDOW = 198, - ICON_HIDPI = 199, - ICON_FILETYPE_BINARY = 200, - ICON_HEX = 201, - ICON_SHIELD = 202, - ICON_FILE_NEW = 203, - ICON_FOLDER_ADD = 204, - ICON_ALARM = 205, - ICON_CPU = 206, - ICON_ROM = 207, - ICON_STEP_OVER = 208, - ICON_STEP_INTO = 209, - ICON_STEP_OUT = 210, - ICON_RESTART = 211, - ICON_BREAKPOINT_ON = 212, - ICON_BREAKPOINT_OFF = 213, - ICON_BURGER_MENU = 214, - ICON_CASE_SENSITIVE = 215, - ICON_REG_EXP = 216, - ICON_FOLDER = 217, - ICON_FILE = 218, - ICON_SAND_TIMER = 219, - ICON_WARNING = 220, - ICON_HELP_BOX = 221, - ICON_INFO_BOX = 222, - ICON_223 = 223, - ICON_224 = 224, - ICON_225 = 225, - ICON_226 = 226, - ICON_227 = 227, - ICON_228 = 228, - ICON_229 = 229, - ICON_230 = 230, - ICON_231 = 231, - ICON_232 = 232, - ICON_233 = 233, - ICON_234 = 234, - ICON_235 = 235, - ICON_236 = 236, - ICON_237 = 237, - ICON_238 = 238, - ICON_239 = 239, - ICON_240 = 240, - ICON_241 = 241, - ICON_242 = 242, - ICON_243 = 243, - ICON_244 = 244, - ICON_245 = 245, - ICON_246 = 246, - ICON_247 = 247, - ICON_248 = 248, - ICON_249 = 249, - ICON_250 = 250, - ICON_251 = 251, - ICON_252 = 252, - ICON_253 = 253, - ICON_254 = 254, - ICON_255 = 255, -} GuiIconName; -#endif - -#endif - -#if defined(__cplusplus) -} // Prevents name mangling of functions -#endif - -#endif // RAYGUI_H - -/*********************************************************************************** -* -* RAYGUI IMPLEMENTATION -* -************************************************************************************/ - -#if defined(RAYGUI_IMPLEMENTATION) - -#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(), GuiValueBox()], memset(), memcpy() -#include // Required for: va_list, va_start(), vfprintf(), va_end() [TextFormat()] -#include // Required for: roundf() [GuiColorPicker()] - -#ifdef __cplusplus - #define RAYGUI_CLITERAL(name) name -#else - #define RAYGUI_CLITERAL(name) (name) -#endif - -// Check if two rectangles are equal, used to validate a slider bounds as an id -#ifndef CHECK_BOUNDS_ID - #define CHECK_BOUNDS_ID(src, dst) ((src.x == dst.x) && (src.y == dst.y) && (src.width == dst.width) && (src.height == dst.height)) -#endif - -#if !defined(RAYGUI_NO_ICONS) && !defined(RAYGUI_CUSTOM_ICONS) - -// Embedded icons, no external file provided -#define RAYGUI_ICON_SIZE 16 // Size of icons in pixels (squared) -#define RAYGUI_ICON_MAX_ICONS 256 // Maximum number of icons -#define RAYGUI_ICON_MAX_NAME_LENGTH 32 // Maximum length of icon name id - -// Icons data is defined by bit array (every bit represents one pixel) -// Those arrays are stored as unsigned int data arrays, so, -// every array element defines 32 pixels (bits) of information -// One icon is defined by 8 int, (8 int * 32 bit = 256 bit = 16*16 pixels) -// NOTE: Number of elemens depend on RAYGUI_ICON_SIZE (by default 16x16 pixels) -#define RAYGUI_ICON_DATA_ELEMENTS (RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32) - -//---------------------------------------------------------------------------------- -// Icons data for all gui possible icons (allocated on data segment by default) -// -// NOTE 1: Every icon is codified in binary form, using 1 bit per pixel, so, -// every 16x16 icon requires 8 integers (16*16/32) to be stored -// -// NOTE 2: A different icon set could be loaded over this array using GuiLoadIcons(), -// but loaded icons set must be same RAYGUI_ICON_SIZE and no more than RAYGUI_ICON_MAX_ICONS -// -// guiIcons size is by default: 256*(16*16/32) = 2048*4 = 8192 bytes = 8 KB -//---------------------------------------------------------------------------------- -static unsigned int guiIcons[RAYGUI_ICON_MAX_ICONS*RAYGUI_ICON_DATA_ELEMENTS] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_NONE - 0x3ff80000, 0x2f082008, 0x2042207e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x00007ffe, // ICON_FOLDER_FILE_OPEN - 0x3ffe0000, 0x44226422, 0x400247e2, 0x5ffa4002, 0x57ea500a, 0x500a500a, 0x40025ffa, 0x00007ffe, // ICON_FILE_SAVE_CLASSIC - 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024002, 0x44424282, 0x793e4102, 0x00000100, // ICON_FOLDER_OPEN - 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x41024102, 0x44424102, 0x793e4282, 0x00000000, // ICON_FOLDER_SAVE - 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x24442284, 0x21042104, 0x20042104, 0x00003ffc, // ICON_FILE_OPEN - 0x3ff00000, 0x201c2010, 0x20042004, 0x21042004, 0x21042104, 0x22842444, 0x20042104, 0x00003ffc, // ICON_FILE_SAVE - 0x3ff00000, 0x201c2010, 0x00042004, 0x20041004, 0x20844784, 0x00841384, 0x20042784, 0x00003ffc, // ICON_FILE_EXPORT - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x22042204, 0x22042f84, 0x20042204, 0x00003ffc, // ICON_FILE_ADD - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x25042884, 0x25042204, 0x20042884, 0x00003ffc, // ICON_FILE_DELETE - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_FILETYPE_TEXT - 0x3ff00000, 0x201c2010, 0x27042004, 0x244424c4, 0x26442444, 0x20642664, 0x20042004, 0x00003ffc, // ICON_FILETYPE_AUDIO - 0x3ff00000, 0x201c2010, 0x26042604, 0x20042004, 0x35442884, 0x2414222c, 0x20042004, 0x00003ffc, // ICON_FILETYPE_IMAGE - 0x3ff00000, 0x201c2010, 0x20c42004, 0x22442144, 0x22442444, 0x20c42144, 0x20042004, 0x00003ffc, // ICON_FILETYPE_PLAY - 0x3ff00000, 0x3ffc2ff0, 0x3f3c2ff4, 0x3dbc2eb4, 0x3dbc2bb4, 0x3f3c2eb4, 0x3ffc2ff4, 0x00002ff4, // ICON_FILETYPE_VIDEO - 0x3ff00000, 0x201c2010, 0x21842184, 0x21842004, 0x21842184, 0x21842184, 0x20042184, 0x00003ffc, // ICON_FILETYPE_INFO - 0x0ff00000, 0x381c0810, 0x28042804, 0x28042804, 0x28042804, 0x28042804, 0x20102ffc, 0x00003ff0, // ICON_FILE_COPY - 0x00000000, 0x701c0000, 0x079c1e14, 0x55a000f0, 0x079c00f0, 0x701c1e14, 0x00000000, 0x00000000, // ICON_FILE_CUT - 0x01c00000, 0x13e41bec, 0x3f841004, 0x204420c4, 0x20442044, 0x20442044, 0x207c2044, 0x00003fc0, // ICON_FILE_PASTE - 0x00000000, 0x3aa00fe0, 0x2abc2aa0, 0x2aa42aa4, 0x20042aa4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_CURSOR_HAND - 0x00000000, 0x003c000c, 0x030800c8, 0x30100c10, 0x10202020, 0x04400840, 0x01800280, 0x00000000, // ICON_CURSOR_POINTER - 0x00000000, 0x00180000, 0x01f00078, 0x03e007f0, 0x07c003e0, 0x04000e40, 0x00000000, 0x00000000, // ICON_CURSOR_CLASSIC - 0x00000000, 0x04000000, 0x11000a00, 0x04400a80, 0x01100220, 0x00580088, 0x00000038, 0x00000000, // ICON_PENCIL - 0x04000000, 0x15000a00, 0x50402880, 0x14102820, 0x05040a08, 0x015c028c, 0x007c00bc, 0x00000000, // ICON_PENCIL_BIG - 0x01c00000, 0x01400140, 0x01400140, 0x0ff80140, 0x0ff80808, 0x0aa80808, 0x0aa80aa8, 0x00000ff8, // ICON_BRUSH_CLASSIC - 0x1ffc0000, 0x5ffc7ffe, 0x40004000, 0x00807f80, 0x01c001c0, 0x01c001c0, 0x01c001c0, 0x00000080, // ICON_BRUSH_PAINTER - 0x00000000, 0x00800000, 0x01c00080, 0x03e001c0, 0x07f003e0, 0x036006f0, 0x000001c0, 0x00000000, // ICON_WATER_DROP - 0x00000000, 0x3e003800, 0x1f803f80, 0x0c201e40, 0x02080c10, 0x00840104, 0x00380044, 0x00000000, // ICON_COLOR_PICKER - 0x00000000, 0x07800300, 0x1fe00fc0, 0x3f883fd0, 0x0e021f04, 0x02040402, 0x00f00108, 0x00000000, // ICON_RUBBER - 0x00c00000, 0x02800140, 0x08200440, 0x20081010, 0x2ffe3004, 0x03f807fc, 0x00e001f0, 0x00000040, // ICON_COLOR_BUCKET - 0x00000000, 0x21843ffc, 0x01800180, 0x01800180, 0x01800180, 0x01800180, 0x03c00180, 0x00000000, // ICON_TEXT_T - 0x00800000, 0x01400180, 0x06200340, 0x0c100620, 0x1ff80c10, 0x380c1808, 0x70067004, 0x0000f80f, // ICON_TEXT_A - 0x78000000, 0x50004000, 0x00004800, 0x03c003c0, 0x03c003c0, 0x00100000, 0x0002000a, 0x0000000e, // ICON_SCALE - 0x75560000, 0x5e004002, 0x54001002, 0x41001202, 0x408200fe, 0x40820082, 0x40820082, 0x00006afe, // ICON_RESIZE - 0x00000000, 0x3f003f00, 0x3f003f00, 0x3f003f00, 0x00400080, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_POINT - 0x6d800000, 0x00004080, 0x40804080, 0x40800000, 0x00406d80, 0x001c0020, 0x001c001c, 0x00000000, // ICON_FILTER_BILINEAR - 0x40080000, 0x1ffe2008, 0x14081008, 0x11081208, 0x10481088, 0x10081028, 0x10047ff8, 0x00001002, // ICON_CROP - 0x00100000, 0x3ffc0010, 0x2ab03550, 0x22b02550, 0x20b02150, 0x20302050, 0x2000fff0, 0x00002000, // ICON_CROP_ALPHA - 0x40000000, 0x1ff82000, 0x04082808, 0x01082208, 0x00482088, 0x00182028, 0x35542008, 0x00000002, // ICON_SQUARE_TOGGLE - 0x00000000, 0x02800280, 0x06c006c0, 0x0ea00ee0, 0x1e901eb0, 0x3e883e98, 0x7efc7e8c, 0x00000000, // ICON_SYMMETRY - 0x01000000, 0x05600100, 0x1d480d50, 0x7d423d44, 0x3d447d42, 0x0d501d48, 0x01000560, 0x00000100, // ICON_SYMMETRY_HORIZONTAL - 0x01800000, 0x04200240, 0x10080810, 0x00001ff8, 0x00007ffe, 0x0ff01ff8, 0x03c007e0, 0x00000180, // ICON_SYMMETRY_VERTICAL - 0x00000000, 0x010800f0, 0x02040204, 0x02040204, 0x07f00308, 0x1c000e00, 0x30003800, 0x00000000, // ICON_LENS - 0x00000000, 0x061803f0, 0x08240c0c, 0x08040814, 0x0c0c0804, 0x23f01618, 0x18002400, 0x00000000, // ICON_LENS_BIG - 0x00000000, 0x00000000, 0x1c7007c0, 0x638e3398, 0x1c703398, 0x000007c0, 0x00000000, 0x00000000, // ICON_EYE_ON - 0x00000000, 0x10002000, 0x04700fc0, 0x610e3218, 0x1c703098, 0x001007a0, 0x00000008, 0x00000000, // ICON_EYE_OFF - 0x00000000, 0x00007ffc, 0x40047ffc, 0x10102008, 0x04400820, 0x02800280, 0x02800280, 0x00000100, // ICON_FILTER_TOP - 0x00000000, 0x40027ffe, 0x10082004, 0x04200810, 0x02400240, 0x02400240, 0x01400240, 0x000000c0, // ICON_FILTER - 0x00800000, 0x00800080, 0x00000080, 0x3c9e0000, 0x00000000, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_POINT - 0x00800000, 0x00800080, 0x00800080, 0x3f7e01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL - 0x00800000, 0x00800080, 0x03e00080, 0x3e3e0220, 0x03e00220, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG - 0x01000000, 0x04400280, 0x01000100, 0x43842008, 0x43849ab2, 0x01002008, 0x04400100, 0x01000280, // ICON_TARGET_MOVE - 0x01000000, 0x04400280, 0x01000100, 0x41042108, 0x41049ff2, 0x01002108, 0x04400100, 0x01000280, // ICON_CURSOR_MOVE - 0x781e0000, 0x500a4002, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x4002500a, 0x0000781e, // ICON_CURSOR_SCALE - 0x00000000, 0x20003c00, 0x24002800, 0x01000200, 0x00400080, 0x00140024, 0x003c0004, 0x00000000, // ICON_CURSOR_SCALE_RIGHT - 0x00000000, 0x0004003c, 0x00240014, 0x00800040, 0x02000100, 0x28002400, 0x3c002000, 0x00000000, // ICON_CURSOR_SCALE_LEFT - 0x00000000, 0x00100020, 0x10101fc8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO - 0x00000000, 0x08000400, 0x080813f8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO - 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3f902020, 0x00400020, 0x00000000, // ICON_REREDO - 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3fc82010, 0x00200010, 0x00000000, // ICON_MUTATE - 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18101020, 0x00100fc8, 0x00000020, // ICON_ROTATE - 0x00000000, 0x04000200, 0x240429fc, 0x20042204, 0x20442004, 0x3f942024, 0x00400020, 0x00000000, // ICON_REPEAT - 0x00000000, 0x20001000, 0x22104c0e, 0x00801120, 0x11200040, 0x4c0e2210, 0x10002000, 0x00000000, // ICON_SHUFFLE - 0x7ffe0000, 0x50024002, 0x44024802, 0x41024202, 0x40424082, 0x40124022, 0x4002400a, 0x00007ffe, // ICON_EMPTYBOX - 0x00800000, 0x03e00080, 0x08080490, 0x3c9e0808, 0x08080808, 0x03e00490, 0x00800080, 0x00000000, // ICON_TARGET - 0x00800000, 0x00800080, 0x00800080, 0x3ffe01c0, 0x008001c0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_SMALL_FILL - 0x00800000, 0x00800080, 0x03e00080, 0x3ffe03e0, 0x03e003e0, 0x00800080, 0x00800080, 0x00000000, // ICON_TARGET_BIG_FILL - 0x01000000, 0x07c00380, 0x01000100, 0x638c2008, 0x638cfbbe, 0x01002008, 0x07c00100, 0x01000380, // ICON_TARGET_MOVE_FILL - 0x01000000, 0x07c00380, 0x01000100, 0x610c2108, 0x610cfffe, 0x01002108, 0x07c00100, 0x01000380, // ICON_CURSOR_MOVE_FILL - 0x781e0000, 0x6006700e, 0x04204812, 0x00000240, 0x02400000, 0x48120420, 0x700e6006, 0x0000781e, // ICON_CURSOR_SCALE_FILL - 0x00000000, 0x38003c00, 0x24003000, 0x01000200, 0x00400080, 0x000c0024, 0x003c001c, 0x00000000, // ICON_CURSOR_SCALE_RIGHT_FILL - 0x00000000, 0x001c003c, 0x0024000c, 0x00800040, 0x02000100, 0x30002400, 0x3c003800, 0x00000000, // ICON_CURSOR_SCALE_LEFT_FILL - 0x00000000, 0x00300020, 0x10301ff8, 0x10001020, 0x10001000, 0x10001000, 0x00001fc0, 0x00000000, // ICON_UNDO_FILL - 0x00000000, 0x0c000400, 0x0c081ff8, 0x00080408, 0x00080008, 0x00080008, 0x000003f8, 0x00000000, // ICON_REDO_FILL - 0x00000000, 0x3ffc0000, 0x20042004, 0x20002000, 0x20402000, 0x3ff02060, 0x00400060, 0x00000000, // ICON_REREDO_FILL - 0x00000000, 0x3ffc0000, 0x20042004, 0x27fc2004, 0x20202000, 0x3ff82030, 0x00200030, 0x00000000, // ICON_MUTATE_FILL - 0x00000000, 0x0ff00000, 0x10081818, 0x11801008, 0x10001180, 0x18301020, 0x00300ff8, 0x00000020, // ICON_ROTATE_FILL - 0x00000000, 0x06000200, 0x26042ffc, 0x20042204, 0x20442004, 0x3ff42064, 0x00400060, 0x00000000, // ICON_REPEAT_FILL - 0x00000000, 0x30001000, 0x32107c0e, 0x00801120, 0x11200040, 0x7c0e3210, 0x10003000, 0x00000000, // ICON_SHUFFLE_FILL - 0x00000000, 0x30043ffc, 0x24042804, 0x21042204, 0x20442084, 0x20142024, 0x3ffc200c, 0x00000000, // ICON_EMPTYBOX_SMALL - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX - 0x00000000, 0x23c43ffc, 0x23c423c4, 0x200423c4, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP - 0x00000000, 0x3e043ffc, 0x3e043e04, 0x20043e04, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_RIGHT - 0x00000000, 0x20043ffc, 0x20042004, 0x3e043e04, 0x3e043e04, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_RIGHT - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x3e042004, 0x3e043e04, 0x3ffc3e04, 0x00000000, // ICON_BOX_BOTTOM_RIGHT - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x23c42004, 0x23c423c4, 0x3ffc23c4, 0x00000000, // ICON_BOX_BOTTOM - 0x00000000, 0x20043ffc, 0x20042004, 0x20042004, 0x207c2004, 0x207c207c, 0x3ffc207c, 0x00000000, // ICON_BOX_BOTTOM_LEFT - 0x00000000, 0x20043ffc, 0x20042004, 0x207c207c, 0x207c207c, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_LEFT - 0x00000000, 0x207c3ffc, 0x207c207c, 0x2004207c, 0x20042004, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_TOP_LEFT - 0x00000000, 0x20043ffc, 0x20042004, 0x23c423c4, 0x23c423c4, 0x20042004, 0x3ffc2004, 0x00000000, // ICON_BOX_CENTER - 0x7ffe0000, 0x40024002, 0x47e24182, 0x4ff247e2, 0x47e24ff2, 0x418247e2, 0x40024002, 0x00007ffe, // ICON_BOX_CIRCLE_MASK - 0x7fff0000, 0x40014001, 0x40014001, 0x49555ddd, 0x4945495d, 0x400149c5, 0x40014001, 0x00007fff, // ICON_POT - 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x404e40ce, 0x48125432, 0x4006540e, 0x00007ffe, // ICON_ALPHA_MULTIPLY - 0x7ffe0000, 0x53327332, 0x44ce4cce, 0x41324332, 0x5c4e40ce, 0x44124432, 0x40065c0e, 0x00007ffe, // ICON_ALPHA_CLEAR - 0x7ffe0000, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x42fe417e, 0x00007ffe, // ICON_DITHERING - 0x07fe0000, 0x1ffa0002, 0x7fea000a, 0x402a402a, 0x5b2a512a, 0x5128552a, 0x40205128, 0x00007fe0, // ICON_MIPMAPS - 0x00000000, 0x1ff80000, 0x12481248, 0x12481ff8, 0x1ff81248, 0x12481248, 0x00001ff8, 0x00000000, // ICON_BOX_GRID - 0x12480000, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x7ffe1248, 0x12481248, 0x12487ffe, 0x00001248, // ICON_GRID - 0x00000000, 0x1c380000, 0x1c3817e8, 0x08100810, 0x08100810, 0x17e81c38, 0x00001c38, 0x00000000, // ICON_BOX_CORNERS_SMALL - 0x700e0000, 0x700e5ffa, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x5ffa700e, 0x0000700e, // ICON_BOX_CORNERS_BIG - 0x3f7e0000, 0x21422142, 0x21422142, 0x00003f7e, 0x21423f7e, 0x21422142, 0x3f7e2142, 0x00000000, // ICON_FOUR_BOXES - 0x00000000, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x3bb80000, 0x3bb83bb8, 0x00000000, // ICON_GRID_FILL - 0x7ffe0000, 0x7ffe7ffe, 0x77fe7000, 0x77fe77fe, 0x777e7700, 0x777e777e, 0x777e777e, 0x0000777e, // ICON_BOX_MULTISIZE - 0x781e0000, 0x40024002, 0x00004002, 0x01800000, 0x00000180, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_SMALL - 0x781e0000, 0x40024002, 0x00004002, 0x03c003c0, 0x03c003c0, 0x40020000, 0x40024002, 0x0000781e, // ICON_ZOOM_MEDIUM - 0x781e0000, 0x40024002, 0x07e04002, 0x07e007e0, 0x07e007e0, 0x400207e0, 0x40024002, 0x0000781e, // ICON_ZOOM_BIG - 0x781e0000, 0x5ffa4002, 0x1ff85ffa, 0x1ff81ff8, 0x1ff81ff8, 0x5ffa1ff8, 0x40025ffa, 0x0000781e, // ICON_ZOOM_ALL - 0x00000000, 0x2004381c, 0x00002004, 0x00000000, 0x00000000, 0x20040000, 0x381c2004, 0x00000000, // ICON_ZOOM_CENTER - 0x00000000, 0x1db80000, 0x10081008, 0x10080000, 0x00001008, 0x10081008, 0x00001db8, 0x00000000, // ICON_BOX_DOTS_SMALL - 0x35560000, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x00002002, 0x35562002, 0x00000000, // ICON_BOX_DOTS_BIG - 0x7ffe0000, 0x40024002, 0x48124ff2, 0x49924812, 0x48124992, 0x4ff24812, 0x40024002, 0x00007ffe, // ICON_BOX_CONCENTRIC - 0x00000000, 0x10841ffc, 0x10841084, 0x1ffc1084, 0x10841084, 0x10841084, 0x00001ffc, 0x00000000, // ICON_BOX_GRID_BIG - 0x00000000, 0x00000000, 0x10000000, 0x04000800, 0x01040200, 0x00500088, 0x00000020, 0x00000000, // ICON_OK_TICK - 0x00000000, 0x10080000, 0x04200810, 0x01800240, 0x02400180, 0x08100420, 0x00001008, 0x00000000, // ICON_CROSS - 0x00000000, 0x02000000, 0x00800100, 0x00200040, 0x00200010, 0x00800040, 0x02000100, 0x00000000, // ICON_ARROW_LEFT - 0x00000000, 0x00400000, 0x01000080, 0x04000200, 0x04000800, 0x01000200, 0x00400080, 0x00000000, // ICON_ARROW_RIGHT - 0x00000000, 0x00000000, 0x00000000, 0x08081004, 0x02200410, 0x00800140, 0x00000000, 0x00000000, // ICON_ARROW_DOWN - 0x00000000, 0x00000000, 0x01400080, 0x04100220, 0x10040808, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP - 0x00000000, 0x02000000, 0x03800300, 0x03e003c0, 0x03e003f0, 0x038003c0, 0x02000300, 0x00000000, // ICON_ARROW_LEFT_FILL - 0x00000000, 0x00400000, 0x01c000c0, 0x07c003c0, 0x07c00fc0, 0x01c003c0, 0x004000c0, 0x00000000, // ICON_ARROW_RIGHT_FILL - 0x00000000, 0x00000000, 0x00000000, 0x0ff81ffc, 0x03e007f0, 0x008001c0, 0x00000000, 0x00000000, // ICON_ARROW_DOWN_FILL - 0x00000000, 0x00000000, 0x01c00080, 0x07f003e0, 0x1ffc0ff8, 0x00000000, 0x00000000, 0x00000000, // ICON_ARROW_UP_FILL - 0x00000000, 0x18a008c0, 0x32881290, 0x24822686, 0x26862482, 0x12903288, 0x08c018a0, 0x00000000, // ICON_AUDIO - 0x00000000, 0x04800780, 0x004000c0, 0x662000f0, 0x08103c30, 0x130a0e18, 0x0000318e, 0x00000000, // ICON_FX - 0x00000000, 0x00800000, 0x08880888, 0x2aaa0a8a, 0x0a8a2aaa, 0x08880888, 0x00000080, 0x00000000, // ICON_WAVE - 0x00000000, 0x00600000, 0x01080090, 0x02040108, 0x42044204, 0x24022402, 0x00001800, 0x00000000, // ICON_WAVE_SINUS - 0x00000000, 0x07f80000, 0x04080408, 0x04080408, 0x04080408, 0x7c0e0408, 0x00000000, 0x00000000, // ICON_WAVE_SQUARE - 0x00000000, 0x00000000, 0x00a00040, 0x22084110, 0x08021404, 0x00000000, 0x00000000, 0x00000000, // ICON_WAVE_TRIANGULAR - 0x00000000, 0x00000000, 0x04200000, 0x01800240, 0x02400180, 0x00000420, 0x00000000, 0x00000000, // ICON_CROSS_SMALL - 0x00000000, 0x18380000, 0x12281428, 0x10a81128, 0x112810a8, 0x14281228, 0x00001838, 0x00000000, // ICON_PLAYER_PREVIOUS - 0x00000000, 0x18000000, 0x11801600, 0x10181060, 0x10601018, 0x16001180, 0x00001800, 0x00000000, // ICON_PLAYER_PLAY_BACK - 0x00000000, 0x00180000, 0x01880068, 0x18080608, 0x06081808, 0x00680188, 0x00000018, 0x00000000, // ICON_PLAYER_PLAY - 0x00000000, 0x1e780000, 0x12481248, 0x12481248, 0x12481248, 0x12481248, 0x00001e78, 0x00000000, // ICON_PLAYER_PAUSE - 0x00000000, 0x1ff80000, 0x10081008, 0x10081008, 0x10081008, 0x10081008, 0x00001ff8, 0x00000000, // ICON_PLAYER_STOP - 0x00000000, 0x1c180000, 0x14481428, 0x15081488, 0x14881508, 0x14281448, 0x00001c18, 0x00000000, // ICON_PLAYER_NEXT - 0x00000000, 0x03c00000, 0x08100420, 0x10081008, 0x10081008, 0x04200810, 0x000003c0, 0x00000000, // ICON_PLAYER_RECORD - 0x00000000, 0x0c3007e0, 0x13c81818, 0x14281668, 0x14281428, 0x1c381c38, 0x08102244, 0x00000000, // ICON_MAGNET - 0x07c00000, 0x08200820, 0x3ff80820, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_CLOSE - 0x07c00000, 0x08000800, 0x3ff80800, 0x23882008, 0x21082388, 0x20082108, 0x1ff02008, 0x00000000, // ICON_LOCK_OPEN - 0x01c00000, 0x0c180770, 0x3086188c, 0x60832082, 0x60034781, 0x30062002, 0x0c18180c, 0x01c00770, // ICON_CLOCK - 0x0a200000, 0x1b201b20, 0x04200e20, 0x04200420, 0x04700420, 0x0e700e70, 0x0e700e70, 0x04200e70, // ICON_TOOLS - 0x01800000, 0x3bdc318c, 0x0ff01ff8, 0x7c3e1e78, 0x1e787c3e, 0x1ff80ff0, 0x318c3bdc, 0x00000180, // ICON_GEAR - 0x01800000, 0x3ffc318c, 0x1c381ff8, 0x781e1818, 0x1818781e, 0x1ff81c38, 0x318c3ffc, 0x00000180, // ICON_GEAR_BIG - 0x00000000, 0x08080ff8, 0x08081ffc, 0x0aa80aa8, 0x0aa80aa8, 0x0aa80aa8, 0x08080aa8, 0x00000ff8, // ICON_BIN - 0x00000000, 0x00000000, 0x20043ffc, 0x08043f84, 0x04040f84, 0x04040784, 0x000007fc, 0x00000000, // ICON_HAND_POINTER - 0x00000000, 0x24400400, 0x00001480, 0x6efe0e00, 0x00000e00, 0x24401480, 0x00000400, 0x00000000, // ICON_LASER - 0x00000000, 0x03c00000, 0x08300460, 0x11181118, 0x11181118, 0x04600830, 0x000003c0, 0x00000000, // ICON_COIN - 0x00000000, 0x10880080, 0x06c00810, 0x366c07e0, 0x07e00240, 0x00001768, 0x04200240, 0x00000000, // ICON_EXPLOSION - 0x00000000, 0x3d280000, 0x2528252c, 0x3d282528, 0x05280528, 0x05e80528, 0x00000000, 0x00000000, // ICON_1UP - 0x01800000, 0x03c003c0, 0x018003c0, 0x0ff007e0, 0x0bd00bd0, 0x0a500bd0, 0x02400240, 0x02400240, // ICON_PLAYER - 0x01800000, 0x03c003c0, 0x118013c0, 0x03c81ff8, 0x07c003c8, 0x04400440, 0x0c080478, 0x00000000, // ICON_PLAYER_JUMP - 0x3ff80000, 0x30183ff8, 0x30183018, 0x3ff83ff8, 0x03000300, 0x03c003c0, 0x03e00300, 0x000003e0, // ICON_KEY - 0x3ff80000, 0x3ff83ff8, 0x33983ff8, 0x3ff83398, 0x3ff83ff8, 0x00000540, 0x0fe00aa0, 0x00000fe0, // ICON_DEMON - 0x00000000, 0x0ff00000, 0x20041008, 0x25442004, 0x10082004, 0x06000bf0, 0x00000300, 0x00000000, // ICON_TEXT_POPUP - 0x00000000, 0x11440000, 0x07f00be8, 0x1c1c0e38, 0x1c1c0c18, 0x07f00e38, 0x11440be8, 0x00000000, // ICON_GEAR_EX - 0x00000000, 0x20080000, 0x0c601010, 0x07c00fe0, 0x07c007c0, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK - 0x00000000, 0x20080000, 0x0c601010, 0x04400fe0, 0x04405554, 0x0c600fe0, 0x20081010, 0x00000000, // ICON_CRACK_POINTS - 0x00000000, 0x00800080, 0x01c001c0, 0x1ffc3ffe, 0x03e007f0, 0x07f003e0, 0x0c180770, 0x00000808, // ICON_STAR - 0x0ff00000, 0x08180810, 0x08100818, 0x0a100810, 0x08180810, 0x08100818, 0x08100810, 0x00001ff8, // ICON_DOOR - 0x0ff00000, 0x08100810, 0x08100810, 0x10100010, 0x4f902010, 0x10102010, 0x08100010, 0x00000ff0, // ICON_EXIT - 0x00040000, 0x001f000e, 0x0ef40004, 0x12f41284, 0x0ef41214, 0x10040004, 0x7ffc3004, 0x10003000, // ICON_MODE_2D - 0x78040000, 0x501f600e, 0x0ef44004, 0x12f41284, 0x0ef41284, 0x10140004, 0x7ffc300c, 0x10003000, // ICON_MODE_3D - 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE - 0x7fe00000, 0x5ff87ff0, 0x47fe4ffc, 0x44224402, 0x44224422, 0x241275e2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_TOP - 0x7fe00000, 0x50386030, 0x47c2483c, 0x443e443e, 0x443e443e, 0x241e75fe, 0x0c06140e, 0x000007fe, // ICON_CUBE_FACE_LEFT - 0x7fe00000, 0x50286030, 0x47fe4804, 0x47fe47fe, 0x47fe47fe, 0x27fe77fe, 0x0ffe17fe, 0x000007fe, // ICON_CUBE_FACE_FRONT - 0x7fe00000, 0x50286030, 0x47fe4804, 0x44224402, 0x44224422, 0x3bf27be2, 0x0bfe1bfa, 0x000007fe, // ICON_CUBE_FACE_BOTTOM - 0x7fe00000, 0x70286030, 0x7ffe7804, 0x7c227c02, 0x7c227c22, 0x3c127de2, 0x0c061c0a, 0x000007fe, // ICON_CUBE_FACE_RIGHT - 0x7fe00000, 0x6fe85ff0, 0x781e77e4, 0x7be27be2, 0x7be27be2, 0x24127be2, 0x0c06140a, 0x000007fe, // ICON_CUBE_FACE_BACK - 0x00000000, 0x2a0233fe, 0x22022602, 0x22022202, 0x2a022602, 0x00a033fe, 0x02080110, 0x00000000, // ICON_CAMERA - 0x00000000, 0x200c3ffc, 0x000c000c, 0x3ffc000c, 0x30003000, 0x30003000, 0x3ffc3004, 0x00000000, // ICON_SPECIAL - 0x00000000, 0x0022003e, 0x012201e2, 0x0100013e, 0x01000100, 0x79000100, 0x4f004900, 0x00007800, // ICON_LINK_NET - 0x00000000, 0x44007c00, 0x45004600, 0x00627cbe, 0x00620022, 0x45007cbe, 0x44004600, 0x00007c00, // ICON_LINK_BOXES - 0x00000000, 0x0044007c, 0x0010007c, 0x3f100010, 0x3f1021f0, 0x3f100010, 0x3f0021f0, 0x00000000, // ICON_LINK_MULTI - 0x00000000, 0x0044007c, 0x00440044, 0x0010007c, 0x00100010, 0x44107c10, 0x440047f0, 0x00007c00, // ICON_LINK - 0x00000000, 0x0044007c, 0x00440044, 0x0000007c, 0x00000010, 0x44007c10, 0x44004550, 0x00007c00, // ICON_LINK_BROKE - 0x02a00000, 0x22a43ffc, 0x20042004, 0x20042ff4, 0x20042ff4, 0x20042ff4, 0x20042004, 0x00003ffc, // ICON_TEXT_NOTES - 0x3ffc0000, 0x20042004, 0x245e27c4, 0x27c42444, 0x2004201e, 0x201e2004, 0x20042004, 0x00003ffc, // ICON_NOTEBOOK - 0x00000000, 0x07e00000, 0x04200420, 0x24243ffc, 0x24242424, 0x24242424, 0x3ffc2424, 0x00000000, // ICON_SUITCASE - 0x00000000, 0x0fe00000, 0x08200820, 0x40047ffc, 0x7ffc5554, 0x40045554, 0x7ffc4004, 0x00000000, // ICON_SUITCASE_ZIP - 0x00000000, 0x20043ffc, 0x3ffc2004, 0x13c81008, 0x100813c8, 0x10081008, 0x1ff81008, 0x00000000, // ICON_MAILBOX - 0x00000000, 0x40027ffe, 0x5ffa5ffa, 0x5ffa5ffa, 0x40025ffa, 0x03c07ffe, 0x1ff81ff8, 0x00000000, // ICON_MONITOR - 0x0ff00000, 0x6bfe7ffe, 0x7ffe7ffe, 0x68167ffe, 0x08106816, 0x08100810, 0x0ff00810, 0x00000000, // ICON_PRINTER - 0x3ff80000, 0xfffe2008, 0x870a8002, 0x904a888a, 0x904a904a, 0x870a888a, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA - 0x0fc00000, 0xfcfe0cd8, 0x8002fffe, 0x84428382, 0x84428442, 0x80028382, 0xfffe8002, 0x00000000, // ICON_PHOTO_CAMERA_FLASH - 0x00000000, 0x02400180, 0x08100420, 0x20041008, 0x23c42004, 0x22442244, 0x3ffc2244, 0x00000000, // ICON_HOUSE - 0x00000000, 0x1c700000, 0x3ff83ef8, 0x3ff83ff8, 0x0fe01ff0, 0x038007c0, 0x00000100, 0x00000000, // ICON_HEART - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0xe000c000, // ICON_CORNER - 0x00000000, 0x14001c00, 0x15c01400, 0x15401540, 0x155c1540, 0x15541554, 0x1ddc1554, 0x00000000, // ICON_VERTICAL_BARS - 0x00000000, 0x03000300, 0x1b001b00, 0x1b601b60, 0x1b6c1b60, 0x1b6c1b6c, 0x1b6c1b6c, 0x00000000, // ICON_VERTICAL_BARS_FILL - 0x00000000, 0x00000000, 0x403e7ffe, 0x7ffe403e, 0x7ffe0000, 0x43fe43fe, 0x00007ffe, 0x00000000, // ICON_LIFE_BARS - 0x7ffc0000, 0x43844004, 0x43844284, 0x43844004, 0x42844284, 0x42844284, 0x40044384, 0x00007ffc, // ICON_INFO - 0x40008000, 0x10002000, 0x04000800, 0x01000200, 0x00400080, 0x00100020, 0x00040008, 0x00010002, // ICON_CROSSLINE - 0x00000000, 0x1ff01ff0, 0x18301830, 0x1f001830, 0x03001f00, 0x00000300, 0x03000300, 0x00000000, // ICON_HELP - 0x3ff00000, 0x2abc3550, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x2aac3554, 0x00003ffc, // ICON_FILETYPE_ALPHA - 0x3ff00000, 0x201c2010, 0x22442184, 0x28142424, 0x29942814, 0x2ff42994, 0x20042004, 0x00003ffc, // ICON_FILETYPE_HOME - 0x07fe0000, 0x04020402, 0x7fe20402, 0x44224422, 0x44224422, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS_VISIBLE - 0x07fe0000, 0x04020402, 0x7c020402, 0x44024402, 0x44024402, 0x402047fe, 0x40204020, 0x00007fe0, // ICON_LAYERS - 0x00000000, 0x40027ffe, 0x7ffe4002, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_WINDOW - 0x09100000, 0x09f00910, 0x09100910, 0x00000910, 0x24a2779e, 0x27a224a2, 0x709e20a2, 0x00000000, // ICON_HIDPI - 0x3ff00000, 0x201c2010, 0x2a842e84, 0x2e842a84, 0x2ba42004, 0x2aa42aa4, 0x20042ba4, 0x00003ffc, // ICON_FILETYPE_BINARY - 0x00000000, 0x00000000, 0x00120012, 0x4a5e4bd2, 0x485233d2, 0x00004bd2, 0x00000000, 0x00000000, // ICON_HEX - 0x01800000, 0x381c0660, 0x23c42004, 0x23c42044, 0x13c82204, 0x08101008, 0x02400420, 0x00000180, // ICON_SHIELD - 0x007e0000, 0x20023fc2, 0x40227fe2, 0x400a403a, 0x400a400a, 0x400a400a, 0x4008400e, 0x00007ff8, // ICON_FILE_NEW - 0x00000000, 0x0042007e, 0x40027fc2, 0x44024002, 0x5f024402, 0x44024402, 0x7ffe4002, 0x00000000, // ICON_FOLDER_ADD - 0x44220000, 0x12482244, 0xf3cf0000, 0x14280420, 0x48122424, 0x08100810, 0x1ff81008, 0x03c00420, // ICON_ALARM - 0x0aa00000, 0x1ff80aa0, 0x1068700e, 0x1008706e, 0x1008700e, 0x1008700e, 0x0aa01ff8, 0x00000aa0, // ICON_CPU - 0x07e00000, 0x04201db8, 0x04a01c38, 0x04a01d38, 0x04a01d38, 0x04a01d38, 0x04201d38, 0x000007e0, // ICON_ROM - 0x00000000, 0x03c00000, 0x3c382ff0, 0x3c04380c, 0x01800000, 0x03c003c0, 0x00000180, 0x00000000, // ICON_STEP_OVER - 0x01800000, 0x01800180, 0x01800180, 0x03c007e0, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_INTO - 0x01800000, 0x07e003c0, 0x01800180, 0x01800180, 0x00000180, 0x01800000, 0x03c003c0, 0x00000180, // ICON_STEP_OUT - 0x00000000, 0x0ff003c0, 0x181c1c34, 0x303c301c, 0x30003000, 0x1c301800, 0x03c00ff0, 0x00000000, // ICON_RESTART - 0x00000000, 0x00000000, 0x07e003c0, 0x0ff00ff0, 0x0ff00ff0, 0x03c007e0, 0x00000000, 0x00000000, // ICON_BREAKPOINT_ON - 0x00000000, 0x00000000, 0x042003c0, 0x08100810, 0x08100810, 0x03c00420, 0x00000000, 0x00000000, // ICON_BREAKPOINT_OFF - 0x00000000, 0x00000000, 0x1ff81ff8, 0x1ff80000, 0x00001ff8, 0x1ff81ff8, 0x00000000, 0x00000000, // ICON_BURGER_MENU - 0x00000000, 0x00000000, 0x00880070, 0x0c880088, 0x1e8810f8, 0x3e881288, 0x00000000, 0x00000000, // ICON_CASE_SENSITIVE - 0x00000000, 0x02000000, 0x07000a80, 0x07001fc0, 0x02000a80, 0x00300030, 0x00000000, 0x00000000, // ICON_REG_EXP - 0x00000000, 0x0042007e, 0x40027fc2, 0x40024002, 0x40024002, 0x40024002, 0x7ffe4002, 0x00000000, // ICON_FOLDER - 0x3ff00000, 0x201c2010, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x20042004, 0x00003ffc, // ICON_FILE - 0x1ff00000, 0x20082008, 0x17d02fe8, 0x05400ba0, 0x09200540, 0x23881010, 0x2fe827c8, 0x00001ff0, // ICON_SAND_TIMER - 0x01800000, 0x02400240, 0x05a00420, 0x09900990, 0x11881188, 0x21842004, 0x40024182, 0x00003ffc, // ICON_WARNING - 0x7ffe0000, 0x4ff24002, 0x4c324ff2, 0x4f824c02, 0x41824f82, 0x41824002, 0x40024182, 0x00007ffe, // ICON_HELP_BOX - 0x7ffe0000, 0x41824002, 0x40024182, 0x41824182, 0x41824182, 0x41824182, 0x40024182, 0x00007ffe, // ICON_INFO_BOX - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_223 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_224 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_225 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_226 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_227 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_228 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_229 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_230 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_231 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_232 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_233 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_234 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_235 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_236 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_237 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_238 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_239 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_240 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_241 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_242 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_243 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_244 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_245 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_246 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_247 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_248 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_249 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_250 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_251 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_252 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_253 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_254 - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, // ICON_255 -}; - -// NOTE: A pointer to current icons array should be defined -static unsigned int *guiIconsPtr = guiIcons; - -#endif // !RAYGUI_NO_ICONS && !RAYGUI_CUSTOM_ICONS - -#ifndef RAYGUI_ICON_SIZE - #define RAYGUI_ICON_SIZE 0 -#endif - -// WARNING: Those values define the total size of the style data array, -// if changed, previous saved styles could become incompatible -#define RAYGUI_MAX_CONTROLS 16 // Maximum number of controls -#define RAYGUI_MAX_PROPS_BASE 16 // Maximum number of base properties -#define RAYGUI_MAX_PROPS_EXTENDED 8 // Maximum number of extended properties - -//---------------------------------------------------------------------------------- -// Types and Structures Definition -//---------------------------------------------------------------------------------- -// Gui control property style color element -typedef enum { BORDER = 0, BASE, TEXT, OTHER } GuiPropertyElement; - -//---------------------------------------------------------------------------------- -// Global Variables Definition -//---------------------------------------------------------------------------------- -static GuiState guiState = STATE_NORMAL; // Gui global state, if !STATE_NORMAL, forces defined state - -static Font guiFont = { 0 }; // Gui current font (WARNING: highly coupled to raylib) -static bool guiLocked = false; // Gui lock state (no inputs processed) -static float guiAlpha = 1.0f; // Gui controls transparency - -static unsigned int guiIconScale = 1; // Gui icon default scale (if icons enabled) - -static bool guiTooltip = false; // Tooltip enabled/disabled -static const char *guiTooltipPtr = NULL; // Tooltip string pointer (string provided by user) - -static bool guiControlExclusiveMode = false; // Gui control exclusive mode (no inputs processed except current control) -static Rectangle guiControlExclusiveRec = { 0 }; // Gui control exclusive bounds rectangle, used as an unique identifier - -static int textBoxCursorIndex = 0; // Cursor index, shared by all GuiTextBox*() -//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) -// -// NOTE 1: First set of BASE properties are generic to all controls but could be individually -// overwritten per control, first set of EXTENDED properties are generic to all controls and -// can not be overwritten individually but custom EXTENDED properties can be used by control -// -// NOTE 2: A new style set could be loaded over this array using GuiLoadStyle(), -// but default gui style could always be recovered with GuiLoadStyleDefault() -// -// guiStyle size is by default: 16*(16 + 8) = 384*4 = 1536 bytes = 1.5 KB -//---------------------------------------------------------------------------------- -static unsigned int guiStyle[RAYGUI_MAX_CONTROLS*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED)] = { 0 }; - -static bool guiStyleLoaded = false; // Style loaded flag for lazy style initialization - -//---------------------------------------------------------------------------------- -// Standalone Mode Functions Declaration -// -// NOTE: raygui depend on some raylib input and drawing functions -// To use raygui as standalone library, below functions must be defined by the user -//---------------------------------------------------------------------------------- -#if defined(RAYGUI_STANDALONE) - -#define KEY_RIGHT 262 -#define KEY_LEFT 263 -#define KEY_DOWN 264 -#define KEY_UP 265 -#define KEY_BACKSPACE 259 -#define KEY_ENTER 257 - -#define MOUSE_LEFT_BUTTON 0 - -// Input required functions -//------------------------------------------------------------------------------- -static Vector2 GetMousePosition(void); -static float GetMouseWheelMove(void); -static bool IsMouseButtonDown(int button); -static bool IsMouseButtonPressed(int button); -static bool IsMouseButtonReleased(int button); - -static bool IsKeyDown(int key); -static bool IsKeyPressed(int key); -static int GetCharPressed(void); // -- GuiTextBox(), GuiValueBox() -//------------------------------------------------------------------------------- - -// Drawing required functions -//------------------------------------------------------------------------------- -static void DrawRectangle(int x, int y, int width, int height, Color color); // -- GuiDrawRectangle() -static void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // -- GuiColorPicker() -//------------------------------------------------------------------------------- - -// Text required functions -//------------------------------------------------------------------------------- -static Font GetFontDefault(void); // -- GuiLoadStyleDefault() -static Font LoadFontEx(const char *fileName, int fontSize, int *codepoints, int codepointCount); // -- GuiLoadStyle(), load font - -static Texture2D LoadTextureFromImage(Image image); // -- GuiLoadStyle(), required to load texture from embedded font atlas image -static void SetShapesTexture(Texture2D tex, Rectangle rec); // -- GuiLoadStyle(), required to set shapes rec to font white rec (optimization) - -static char *LoadFileText(const char *fileName); // -- GuiLoadStyle(), required to load charset data -static void UnloadFileText(char *text); // -- GuiLoadStyle(), required to unload charset data - -static const char *GetDirectoryPath(const char *filePath); // -- GuiLoadStyle(), required to find charset/font file from text .rgs - -static int *LoadCodepoints(const char *text, int *count); // -- GuiLoadStyle(), required to load required font codepoints list -static void UnloadCodepoints(int *codepoints); // -- GuiLoadStyle(), required to unload codepoints list - -static unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // -- GuiLoadStyle() -//------------------------------------------------------------------------------- - -// raylib functions already implemented in raygui -//------------------------------------------------------------------------------- -static Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value -static int ColorToInt(Color color); // Returns hexadecimal value for a Color -static bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle -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 GetCodepointNext(const char *text, int *codepointSize); // 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 -//------------------------------------------------------------------------------- - -#endif // RAYGUI_STANDALONE - -//---------------------------------------------------------------------------------- -// Module specific Functions Declaration -//---------------------------------------------------------------------------------- -static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize); // Load style from memory (binary only) - -static int GetTextWidth(const char *text); // Gui get text width using gui font and style -static Rectangle GetTextBounds(int control, Rectangle bounds); // Get text bounds considering control bounds -static const char *GetTextIcon(const char *text, int *iconId); // Get text icon if provided and move text cursor - -static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint); // Gui draw text using default font -static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color); // Gui draw rectangle using default raygui style - -static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow); // Split controls text into multiple strings -static Vector3 ConvertHSVtoRGB(Vector3 hsv); // Convert color data from HSV to RGB -static Vector3 ConvertRGBtoHSV(Vector3 rgb); // Convert color data from RGB to HSV - -static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue); // Scroll bar control, used by GuiScrollPanel() -static void GuiTooltip(Rectangle controlRec); // Draw tooltip using control rec position - -static Color GuiFade(Color color, float alpha); // Fade color by an alpha factor - -//---------------------------------------------------------------------------------- -// Gui Setup Functions Definition -//---------------------------------------------------------------------------------- -// Enable gui global state -// NOTE: We check for STATE_DISABLED to avoid messing custom global state setups -void GuiEnable(void) { if (guiState == STATE_DISABLED) guiState = STATE_NORMAL; } - -// Disable gui global state -// NOTE: We check for STATE_NORMAL to avoid messing custom global state setups -void GuiDisable(void) { if (guiState == STATE_NORMAL) guiState = STATE_DISABLED; } - -// Lock gui global state -void GuiLock(void) { guiLocked = true; } - -// Unlock gui global state -void GuiUnlock(void) { guiLocked = false; } - -// Check if gui is locked (global state) -bool GuiIsLocked(void) { return guiLocked; } - -// Set gui controls alpha global state -void GuiSetAlpha(float alpha) -{ - if (alpha < 0.0f) alpha = 0.0f; - else if (alpha > 1.0f) alpha = 1.0f; - - guiAlpha = alpha; -} - -// Set gui state (global state) -void GuiSetState(int state) { guiState = (GuiState)state; } - -// Get gui state (global state) -int GuiGetState(void) { return guiState; } - -// Set custom gui font -// NOTE: Font loading/unloading is external to raygui -void GuiSetFont(Font font) -{ - if (font.texture.id > 0) - { - // NOTE: If we try to setup a font but default style has not been - // lazily loaded before, it will be overwritten, so we need to force - // default style loading first - if (!guiStyleLoaded) GuiLoadStyleDefault(); - - guiFont = font; - } -} - -// Get custom gui font -Font GuiGetFont(void) -{ - return guiFont; -} - -// Set control style property value -void GuiSetStyle(int control, int property, int value) -{ - if (!guiStyleLoaded) GuiLoadStyleDefault(); - guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value; - - // Default properties are propagated to all controls - if ((control == 0) && (property < RAYGUI_MAX_PROPS_BASE)) - { - for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) guiStyle[i*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property] = value; - } -} - -// Get control style property value -int GuiGetStyle(int control, int property) -{ - if (!guiStyleLoaded) GuiLoadStyleDefault(); - return guiStyle[control*(RAYGUI_MAX_PROPS_BASE + RAYGUI_MAX_PROPS_EXTENDED) + property]; -} - -//---------------------------------------------------------------------------------- -// Gui Controls Functions Definition -//---------------------------------------------------------------------------------- - -// Window Box control -int GuiWindowBox(Rectangle bounds, const char *title) -{ - // Window title bar height (including borders) - // NOTE: This define is also used by GuiMessageBox() and GuiTextInputBox() - #if !defined(RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT) - #define RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT 24 - #endif - - int result = 0; - //GuiState state = guiState; - - int statusBarHeight = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT; - - Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)statusBarHeight }; - if (bounds.height < statusBarHeight*2.0f) bounds.height = statusBarHeight*2.0f; - - Rectangle windowPanel = { bounds.x, bounds.y + (float)statusBarHeight - 1, bounds.width, bounds.height - (float)statusBarHeight + 1 }; - Rectangle closeButtonRec = { statusBar.x + statusBar.width - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - 20, - statusBar.y + statusBarHeight/2.0f - 18.0f/2.0f, 18, 18 }; - - // Update control - //-------------------------------------------------------------------- - // NOTE: Logic is directly managed by button - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiStatusBar(statusBar, title); // Draw window header as status bar - GuiPanel(windowPanel, NULL); // Draw window base - - // Draw window close button - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 1); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); -#if defined(RAYGUI_NO_ICONS) - result = GuiButton(closeButtonRec, "x"); -#else - result = GuiButton(closeButtonRec, GuiIconText(ICON_CROSS_SMALL, NULL)); -#endif - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); - //-------------------------------------------------------------------- - - return result; // Window close button clicked: result = 1 -} - -// Group Box control with text name -int GuiGroupBox(Rectangle bounds, const char *text) -{ - #if !defined(RAYGUI_GROUPBOX_LINE_THICK) - #define RAYGUI_GROUPBOX_LINE_THICK 1 - #endif - - int result = 0; - GuiState state = guiState; - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, RAYGUI_GROUPBOX_LINE_THICK }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y, RAYGUI_GROUPBOX_LINE_THICK, bounds.height }, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR))); - - GuiLine(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y - GuiGetStyle(DEFAULT, TEXT_SIZE)/2, bounds.width, (float)GuiGetStyle(DEFAULT, TEXT_SIZE) }, text); - //-------------------------------------------------------------------- - - return result; -} - -// Line control -int GuiLine(Rectangle bounds, const char *text) -{ - #if !defined(RAYGUI_LINE_ORIGIN_SIZE) - #define RAYGUI_LINE_MARGIN_TEXT 12 - #endif - #if !defined(RAYGUI_LINE_TEXT_PADDING) - #define RAYGUI_LINE_TEXT_PADDING 4 - #endif - - int result = 0; - GuiState state = guiState; - - Color color = GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED : LINE_COLOR)); - - // Draw control - //-------------------------------------------------------------------- - if (text == NULL) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, bounds.width, 1 }, 0, BLANK, color); - else - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = bounds.height; - textBounds.x = bounds.x + RAYGUI_LINE_MARGIN_TEXT; - textBounds.y = bounds.y; - - // Draw line with embedded text label: "--- text --------------" - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height/2, RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color); - GuiDrawText(text, textBounds, TEXT_ALIGN_LEFT, color); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + 12 + textBounds.width + 4, bounds.y + bounds.height/2, bounds.width - textBounds.width - RAYGUI_LINE_MARGIN_TEXT - RAYGUI_LINE_TEXT_PADDING, 1 }, 0, BLANK, color); - } - //-------------------------------------------------------------------- - - return result; -} - -// Panel control -int GuiPanel(Rectangle bounds, const char *text) -{ - #if !defined(RAYGUI_PANEL_BORDER_WIDTH) - #define RAYGUI_PANEL_BORDER_WIDTH 1 - #endif - - int result = 0; - GuiState state = guiState; - - // Text will be drawn as a header bar (if provided) - Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }; - if ((text != NULL) && (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f)) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f; - - if (text != NULL) - { - // Move panel bounds after the header bar - bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; - bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; - } - - // Draw control - //-------------------------------------------------------------------- - if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar - - GuiDrawRectangle(bounds, RAYGUI_PANEL_BORDER_WIDTH, GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BORDER_COLOR_DISABLED: LINE_COLOR)), - GetColor(GuiGetStyle(DEFAULT, (state == STATE_DISABLED)? BASE_COLOR_DISABLED : BACKGROUND_COLOR))); - //-------------------------------------------------------------------- - - return result; -} - -// Tab Bar control -// NOTE: Using GuiToggle() for the TABS -int GuiTabBar(Rectangle bounds, const char **text, int count, int *active) -{ - #define RAYGUI_TABBAR_ITEM_WIDTH 160 - - int result = -1; - //GuiState state = guiState; - - Rectangle tabBounds = { bounds.x, bounds.y, RAYGUI_TABBAR_ITEM_WIDTH, bounds.height }; - - if (*active < 0) *active = 0; - else if (*active > count - 1) *active = count - 1; - - int offsetX = 0; // Required in case tabs go out of screen - offsetX = (*active + 2)*RAYGUI_TABBAR_ITEM_WIDTH - GetScreenWidth(); - if (offsetX < 0) offsetX = 0; - - bool toggle = false; // Required for individual toggles - - // Draw control - //-------------------------------------------------------------------- - for (int i = 0; i < count; i++) - { - tabBounds.x = bounds.x + (RAYGUI_TABBAR_ITEM_WIDTH + 4)*i - offsetX; - - if (tabBounds.x < GetScreenWidth()) - { - // Draw tabs as toggle controls - int textAlignment = GuiGetStyle(TOGGLE, TEXT_ALIGNMENT); - int textPadding = GuiGetStyle(TOGGLE, TEXT_PADDING); - GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(TOGGLE, TEXT_PADDING, 8); - - if (i == (*active)) - { - toggle = true; - GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle); - } - else - { - toggle = false; - GuiToggle(tabBounds, GuiIconText(12, text[i]), &toggle); - if (toggle) *active = i; - } - - // Close tab with middle mouse button pressed - if (CheckCollisionPointRec(GetMousePosition(), tabBounds) && IsMouseButtonPressed(MOUSE_MIDDLE_BUTTON)) result = i; - - GuiSetStyle(TOGGLE, TEXT_PADDING, textPadding); - GuiSetStyle(TOGGLE, TEXT_ALIGNMENT, textAlignment); - - // Draw tab close button - // NOTE: Only draw close button for current tab: if (CheckCollisionPointRec(mousePosition, tabBounds)) - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 1); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); -#if defined(RAYGUI_NO_ICONS) - if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, "x")) result = i; -#else - if (GuiButton(RAYGUI_CLITERAL(Rectangle){ tabBounds.x + tabBounds.width - 14 - 5, tabBounds.y + 5, 14, 14 }, GuiIconText(ICON_CROSS_SMALL, NULL))) result = i; -#endif - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlignment); - } - } - - // Draw tab-bar bottom line - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, bounds.width, 1 }, 0, BLANK, GetColor(GuiGetStyle(TOGGLE, BORDER_COLOR_NORMAL))); - //-------------------------------------------------------------------- - - return result; // Return as result the current TAB closing requested -} - -// Scroll Panel control -int GuiScrollPanel(Rectangle bounds, const char *text, Rectangle content, Vector2 *scroll, Rectangle *view) -{ - #define RAYGUI_MIN_SCROLLBAR_WIDTH 40 - #define RAYGUI_MIN_SCROLLBAR_HEIGHT 40 - #define RAYGUI_MIN_MOUSE_WHEEL_SPEED 20 - - int result = 0; - GuiState state = guiState; - - Rectangle temp = { 0 }; - if (view == NULL) view = &temp; - - Vector2 scrollPos = { 0.0f, 0.0f }; - if (scroll != NULL) scrollPos = *scroll; - - // Text will be drawn as a header bar (if provided) - Rectangle statusBar = { bounds.x, bounds.y, bounds.width, (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT }; - if (bounds.height < RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f) bounds.height = RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT*2.0f; - - if (text != NULL) - { - // Move panel bounds after the header bar - bounds.y += (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 1; - bounds.height -= (float)RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + 1; - } - - bool hasHorizontalScrollBar = (content.width > bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false; - bool hasVerticalScrollBar = (content.height > bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH))? true : false; - - // Recheck to account for the other scrollbar being visible - if (!hasHorizontalScrollBar) hasHorizontalScrollBar = (hasVerticalScrollBar && (content.width > (bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false; - if (!hasVerticalScrollBar) hasVerticalScrollBar = (hasHorizontalScrollBar && (content.height > (bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH))))? true : false; - - int horizontalScrollBarWidth = hasHorizontalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; - int verticalScrollBarWidth = hasVerticalScrollBar? GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH) : 0; - Rectangle horizontalScrollBar = { - (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + verticalScrollBarWidth : (float)bounds.x) + GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)bounds.y + bounds.height - horizontalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)bounds.width - verticalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)horizontalScrollBarWidth - }; - Rectangle verticalScrollBar = { - (float)((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)bounds.x + bounds.width - verticalScrollBarWidth - GuiGetStyle(DEFAULT, BORDER_WIDTH)), - (float)bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), - (float)verticalScrollBarWidth, - (float)bounds.height - horizontalScrollBarWidth - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - }; - - // Make sure scroll bars have a minimum width/height - if (horizontalScrollBar.width < RAYGUI_MIN_SCROLLBAR_WIDTH) horizontalScrollBar.width = RAYGUI_MIN_SCROLLBAR_WIDTH; - if (verticalScrollBar.height < RAYGUI_MIN_SCROLLBAR_HEIGHT) verticalScrollBar.height = RAYGUI_MIN_SCROLLBAR_HEIGHT; - - // Calculate view area (area without the scrollbars) - *view = (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? - RAYGUI_CLITERAL(Rectangle){ bounds.x + verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth } : - RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.y + GuiGetStyle(DEFAULT, BORDER_WIDTH), bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth, bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth }; - - // Clip view area to the actual content size - if (view->width > content.width) view->width = content.width; - if (view->height > content.height) view->height = content.height; - - float horizontalMin = hasHorizontalScrollBar? ((GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)-verticalScrollBarWidth : 0) - (float)GuiGetStyle(DEFAULT, BORDER_WIDTH); - float horizontalMax = hasHorizontalScrollBar? content.width - bounds.width + (float)verticalScrollBarWidth + GuiGetStyle(DEFAULT, BORDER_WIDTH) - (((float)GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (float)verticalScrollBarWidth : 0) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); - float verticalMin = hasVerticalScrollBar? 0.0f : -1.0f; - float verticalMax = hasVerticalScrollBar? content.height - bounds.height + (float)horizontalScrollBarWidth + (float)GuiGetStyle(DEFAULT, BORDER_WIDTH) : (float)-GuiGetStyle(DEFAULT, BORDER_WIDTH); - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - -#if defined(SUPPORT_SCROLLBAR_KEY_INPUT) - if (hasHorizontalScrollBar) - { - if (IsKeyDown(KEY_RIGHT)) scrollPos.x -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - if (IsKeyDown(KEY_LEFT)) scrollPos.x += GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - } - - if (hasVerticalScrollBar) - { - if (IsKeyDown(KEY_DOWN)) scrollPos.y -= GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - if (IsKeyDown(KEY_UP)) scrollPos.y += GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - } -#endif - float wheelMove = GetMouseWheelMove(); - - // Set scrolling speed with mouse wheel based on ratio between bounds and content - Vector2 mouseWheelSpeed = { content.width / bounds.width, content.height / bounds.height }; - if (mouseWheelSpeed.x < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.x = RAYGUI_MIN_MOUSE_WHEEL_SPEED; - if (mouseWheelSpeed.y < RAYGUI_MIN_MOUSE_WHEEL_SPEED) mouseWheelSpeed.y = RAYGUI_MIN_MOUSE_WHEEL_SPEED; - - // Horizontal and vertical scrolling with mouse wheel - if (hasHorizontalScrollBar && (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_LEFT_SHIFT))) scrollPos.x += wheelMove*mouseWheelSpeed.x; - else scrollPos.y += wheelMove*mouseWheelSpeed.y; // Vertical scroll - } - } - - // Normalize scroll values - if (scrollPos.x > -horizontalMin) scrollPos.x = -horizontalMin; - if (scrollPos.x < -horizontalMax) scrollPos.x = -horizontalMax; - if (scrollPos.y > -verticalMin) scrollPos.y = -verticalMin; - if (scrollPos.y < -verticalMax) scrollPos.y = -verticalMax; - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (text != NULL) GuiStatusBar(statusBar, text); // Draw panel header as status bar - - GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background - - // Save size of the scrollbar slider - const int slider = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); - - // Draw horizontal scrollbar if visible - if (hasHorizontalScrollBar) - { - // Change scrollbar slider size to show the diff in size between the content width and the widget width - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth)/(int)content.width)*((int)bounds.width - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - verticalScrollBarWidth))); - scrollPos.x = (float)-GuiScrollBar(horizontalScrollBar, (int)-scrollPos.x, (int)horizontalMin, (int)horizontalMax); - } - else scrollPos.x = 0.0f; - - // Draw vertical scrollbar if visible - if (hasVerticalScrollBar) - { - // Change scrollbar slider size to show the diff in size between the content height and the widget height - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)(((bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth)/(int)content.height)*((int)bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - horizontalScrollBarWidth))); - scrollPos.y = (float)-GuiScrollBar(verticalScrollBar, (int)-scrollPos.y, (int)verticalMin, (int)verticalMax); - } - else scrollPos.y = 0.0f; - - // Draw detail corner rectangle if both scroll bars are visible - if (hasHorizontalScrollBar && hasVerticalScrollBar) - { - Rectangle corner = { (GuiGetStyle(LISTVIEW, SCROLLBAR_SIDE) == SCROLLBAR_LEFT_SIDE)? (bounds.x + GuiGetStyle(DEFAULT, BORDER_WIDTH) + 2) : (horizontalScrollBar.x + horizontalScrollBar.width + 2), verticalScrollBar.y + verticalScrollBar.height + 2, (float)horizontalScrollBarWidth - 4, (float)verticalScrollBarWidth - 4 }; - GuiDrawRectangle(corner, 0, BLANK, GetColor(GuiGetStyle(LISTVIEW, TEXT + (state*3)))); - } - - // Draw scrollbar lines depending on current state - GuiDrawRectangle(bounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + (state*3))), BLANK); - - // Set scrollbar slider size back to the way it was before - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, slider); - //-------------------------------------------------------------------- - - if (scroll != NULL) *scroll = scrollPos; - - return result; -} - -// Label control -int GuiLabel(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Update control - //-------------------------------------------------------------------- - //... - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Button control, returns true when clicked -int GuiButton(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(BUTTON, BORDER_WIDTH), GetColor(GuiGetStyle(BUTTON, BORDER + (state*3))), GetColor(GuiGetStyle(BUTTON, BASE + (state*3)))); - GuiDrawText(text, GetTextBounds(BUTTON, bounds), GuiGetStyle(BUTTON, TEXT_ALIGNMENT), GetColor(GuiGetStyle(BUTTON, TEXT + (state*3)))); - - if (state == STATE_FOCUSED) GuiTooltip(bounds); - //------------------------------------------------------------------ - - return result; // Button pressed: result = 1 -} - -// Label button control -int GuiLabelButton(Rectangle bounds, const char *text) -{ - GuiState state = guiState; - bool pressed = false; - - // NOTE: We force bounds.width to be all text - float textWidth = (float)GetTextWidth(text); - if ((bounds.width - 2*GuiGetStyle(LABEL, BORDER_WIDTH) - 2*GuiGetStyle(LABEL, TEXT_PADDING)) < textWidth) bounds.width = textWidth + 2*GuiGetStyle(LABEL, BORDER_WIDTH) + 2*GuiGetStyle(LABEL, TEXT_PADDING) + 2; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check checkbox state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawText(text, GetTextBounds(LABEL, bounds), GuiGetStyle(LABEL, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return pressed; -} - -// Toggle Button control -int GuiToggle(Rectangle bounds, const char *text, bool *active) -{ - int result = 0; - GuiState state = guiState; - - bool temp = false; - if (active == NULL) active = &temp; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check toggle button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - state = STATE_NORMAL; - *active = !(*active); - } - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_NORMAL) - { - GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, ((*active)? BORDER_COLOR_PRESSED : (BORDER + state*3)))), GetColor(GuiGetStyle(TOGGLE, ((*active)? BASE_COLOR_PRESSED : (BASE + state*3))))); - GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, ((*active)? TEXT_COLOR_PRESSED : (TEXT + state*3))))); - } - else - { - GuiDrawRectangle(bounds, GuiGetStyle(TOGGLE, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + state*3)), GetColor(GuiGetStyle(TOGGLE, BASE + state*3))); - GuiDrawText(text, GetTextBounds(TOGGLE, bounds), GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TOGGLE, TEXT + state*3))); - } - - if (state == STATE_FOCUSED) GuiTooltip(bounds); - //-------------------------------------------------------------------- - - return result; -} - -// Toggle Group control -int GuiToggleGroup(Rectangle bounds, const char *text, int *active) -{ - #if !defined(RAYGUI_TOGGLEGROUP_MAX_ITEMS) - #define RAYGUI_TOGGLEGROUP_MAX_ITEMS 32 - #endif - - int result = 0; - float initBoundsX = bounds.x; - - int temp = 0; - if (active == NULL) active = &temp; - - bool toggle = false; // Required for individual toggles - - // Get substrings items from text (items pointers) - int rows[RAYGUI_TOGGLEGROUP_MAX_ITEMS] = { 0 }; - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, rows); - - int prevRow = rows[0]; - - for (int i = 0; i < itemCount; i++) - { - if (prevRow != rows[i]) - { - bounds.x = initBoundsX; - bounds.y += (bounds.height + GuiGetStyle(TOGGLE, GROUP_PADDING)); - prevRow = rows[i]; - } - - if (i == (*active)) - { - toggle = true; - GuiToggle(bounds, items[i], &toggle); - } - else - { - toggle = false; - GuiToggle(bounds, items[i], &toggle); - if (toggle) *active = i; - } - - bounds.x += (bounds.width + GuiGetStyle(TOGGLE, GROUP_PADDING)); - } - - return result; -} - -// Toggle Slider control extended -int GuiToggleSlider(Rectangle bounds, const char *text, int *active) -{ - int result = 0; - GuiState state = guiState; - - int temp = 0; - if (active == NULL) active = &temp; - - //bool toggle = false; // Required for individual toggles - - // Get substrings items from text (items pointers) - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, NULL); - - Rectangle slider = { - 0, // Calculated later depending on the active toggle - bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING), - (bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - (itemCount + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING))/itemCount, - bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - (*active)++; - result = 1; - } - else state = STATE_FOCUSED; - } - - if ((*active) && (state != STATE_FOCUSED)) state = STATE_PRESSED; - } - - if (*active >= itemCount) *active = 0; - slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH) + (*active + 1)*GuiGetStyle(SLIDER, SLIDER_PADDING) + (*active)*slider.width; - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(TOGGLE, BORDER + (state*3))), - GetColor(GuiGetStyle(TOGGLE, BASE_COLOR_NORMAL))); - - // Draw internal slider - if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); - else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_FOCUSED))); - else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); - - // Draw text in slider - if (text != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(text); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = slider.x + slider.width/2 - textBounds.width/2; - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(items[*active], textBounds, GuiGetStyle(TOGGLE, TEXT_ALIGNMENT), Fade(GetColor(GuiGetStyle(TOGGLE, TEXT + (state*3))), guiAlpha)); - } - //-------------------------------------------------------------------- - - return result; -} - -// Check Box control, returns 1 when state changed -int GuiCheckBox(Rectangle bounds, const char *text, bool *checked) -{ - int result = 0; - GuiState state = guiState; - - bool temp = false; - if (checked == NULL) checked = &temp; - - Rectangle textBounds = { 0 }; - - if (text != NULL) - { - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - if (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(CHECKBOX, TEXT_PADDING); - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - Rectangle totalBounds = { - (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT)? textBounds.x : bounds.x, - bounds.y, - bounds.width + textBounds.width + GuiGetStyle(CHECKBOX, TEXT_PADDING), - bounds.height, - }; - - // Check checkbox state - if (CheckCollisionPointRec(mousePoint, totalBounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - *checked = !(*checked); - result = 1; - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(CHECKBOX, BORDER_WIDTH), GetColor(GuiGetStyle(CHECKBOX, BORDER + (state*3))), BLANK); - - if (*checked) - { - Rectangle check = { bounds.x + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING), - bounds.y + GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING), - bounds.width - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)), - bounds.height - 2*(GuiGetStyle(CHECKBOX, BORDER_WIDTH) + GuiGetStyle(CHECKBOX, CHECK_PADDING)) }; - GuiDrawRectangle(check, 0, BLANK, GetColor(GuiGetStyle(CHECKBOX, TEXT + state*3))); - } - - GuiDrawText(text, textBounds, (GuiGetStyle(CHECKBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Combo Box control -int GuiComboBox(Rectangle bounds, const char *text, int *active) -{ - int result = 0; - GuiState state = guiState; - - int temp = 0; - if (active == NULL) active = &temp; - - bounds.width -= (GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH) + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING)); - - Rectangle selector = { (float)bounds.x + bounds.width + GuiGetStyle(COMBOBOX, COMBO_BUTTON_SPACING), - (float)bounds.y, (float)GuiGetStyle(COMBOBOX, COMBO_BUTTON_WIDTH), (float)bounds.height }; - - // Get substrings items from text (items pointers, lengths and count) - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, NULL); - - if (*active < 0) *active = 0; - else if (*active > (itemCount - 1)) *active = itemCount - 1; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && (itemCount > 1) && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - if (CheckCollisionPointRec(mousePoint, bounds) || - CheckCollisionPointRec(mousePoint, selector)) - { - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - *active += 1; - if (*active >= itemCount) *active = 0; // Cyclic combobox - } - - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - // Draw combo box main - GuiDrawRectangle(bounds, GuiGetStyle(COMBOBOX, BORDER_WIDTH), GetColor(GuiGetStyle(COMBOBOX, BORDER + (state*3))), GetColor(GuiGetStyle(COMBOBOX, BASE + (state*3)))); - GuiDrawText(items[*active], GetTextBounds(COMBOBOX, bounds), GuiGetStyle(COMBOBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(COMBOBOX, TEXT + (state*3)))); - - // Draw selector using a custom button - // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 1); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - GuiButton(selector, TextFormat("%i/%i", *active + 1, itemCount)); - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - //-------------------------------------------------------------------- - - return result; -} - -// Dropdown Box control -// NOTE: Returns mouse click -int GuiDropdownBox(Rectangle bounds, const char *text, int *active, bool editMode) -{ - int result = 0; - GuiState state = guiState; - - int itemSelected = *active; - int itemFocused = -1; - - // Get substrings items from text (items pointers, lengths and count) - int itemCount = 0; - const char **items = GuiTextSplit(text, ';', &itemCount, NULL); - - Rectangle boundsOpen = bounds; - boundsOpen.height = (itemCount + 1)*(bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); - - Rectangle itemBounds = bounds; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && (editMode || !guiLocked) && (itemCount > 1) && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - if (editMode) - { - state = STATE_PRESSED; - - // Check if mouse has been pressed or released outside limits - if (!CheckCollisionPointRec(mousePoint, boundsOpen)) - { - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON) || IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) result = 1; - } - - // Check if already selected item has been pressed again - if (CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; - - // Check focused and selected item - for (int i = 0; i < itemCount; i++) - { - // Update item rectangle y position for next item - itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); - - if (CheckCollisionPointRec(mousePoint, itemBounds)) - { - itemFocused = i; - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) - { - itemSelected = i; - result = 1; // Item selected - } - break; - } - } - - itemBounds = bounds; - } - else - { - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - result = 1; - state = STATE_PRESSED; - } - else state = STATE_FOCUSED; - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (editMode) GuiPanel(boundsOpen, NULL); - - GuiDrawRectangle(bounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER + state*3)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE + state*3))); - GuiDrawText(items[itemSelected], GetTextBounds(DROPDOWNBOX, bounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + state*3))); - - if (editMode) - { - // Draw visible items - for (int i = 0; i < itemCount; i++) - { - // Update item rectangle y position for next item - itemBounds.y += (bounds.height + GuiGetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING)); - - if (i == itemSelected) - { - GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_PRESSED))); - GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_PRESSED))); - } - else if (i == itemFocused) - { - GuiDrawRectangle(itemBounds, GuiGetStyle(DROPDOWNBOX, BORDER_WIDTH), GetColor(GuiGetStyle(DROPDOWNBOX, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(DROPDOWNBOX, BASE_COLOR_FOCUSED))); - GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_FOCUSED))); - } - else GuiDrawText(items[i], GetTextBounds(DROPDOWNBOX, itemBounds), GuiGetStyle(DROPDOWNBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(DROPDOWNBOX, TEXT_COLOR_NORMAL))); - } - } - - // Draw arrows (using icon if available) -#if defined(RAYGUI_NO_ICONS) - GuiDrawText("v", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 2, 10, 10 }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); -#else - GuiDrawText("#120#", RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - GuiGetStyle(DROPDOWNBOX, ARROW_PADDING), bounds.y + bounds.height/2 - 6, 10, 10 }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); // ICON_ARROW_DOWN_FILL -#endif - //-------------------------------------------------------------------- - - *active = itemSelected; - - // TODO: Use result to return more internal states: mouse-press out-of-bounds, mouse-press over selected-item... - return result; // Mouse click: result = 1 -} - -// Text Box control -// NOTE: Returns true on ENTER pressed (useful for data validation) -int GuiTextBox(Rectangle bounds, char *text, int textSize, bool editMode) -{ - #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN) - #define RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN 40 // Frames to wait for autocursor movement - #endif - #if !defined(RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) - #define RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY 1 // Frames delay for autocursor movement - #endif - - int result = 0; - GuiState state = guiState; - - bool multiline = false; // TODO: Consider multiline text input - int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); - - 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 X value should be updated - Rectangle cursor = { - textBounds.x + textWidth + GuiGetStyle(DEFAULT, TEXT_SPACING), - textBounds.y + textBounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE), - 2, - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)*2 - }; - - if (cursor.height >= bounds.height) cursor.height = bounds.height - GuiGetStyle(TEXTBOX, BORDER_WIDTH)*2; - if (cursor.y < (bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH))) cursor.y = bounds.y + GuiGetStyle(TEXTBOX, BORDER_WIDTH); - - // Mouse cursor rectangle - // NOTE: Initialized outside of screen - Rectangle mouseCursor = cursor; - mouseCursor.x = -1; - mouseCursor.width = 1; - - // 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) || IsKeyDown(KEY_DELETE)) autoCursorCooldownCounter++; - else - { - autoCursorCooldownCounter = 0; // GLOBAL: Cursor cooldown counter - autoCursorDelayCounter = 0; // GLOBAL: Cursor delay counter - } - - // Blink-cursor frame counter - //if (!autoCursorMode) blinkCursorFrameCounter++; - //else blinkCursorFrameCounter = 0; - - // Update control - //-------------------------------------------------------------------- - // WARNING: Text editing is only supported under certain conditions: - if ((state != STATE_DISABLED) && // Control not disabled - !GuiGetStyle(TEXTBOX, TEXT_READONLY) && // TextBox not on read-only mode - !guiLocked && // Gui not locked - !guiControlExclusiveMode && // No gui slider on dragging - (wrapMode == TEXT_WRAP_NONE)) // No wrap mode - { - Vector2 mousePosition = GetMousePosition(); - - if (editMode) - { - state = STATE_PRESSED; - - // If text does not fit in the textbox and current cursor position is out of bounds, - // we add an index offset to text for drawing only what requires depending on cursor - while (textWidth >= textBounds.width) - { - int nextCodepointSize = 0; - GetCodepointNext(text + textIndexOffset, &nextCodepointSize); - - textIndexOffset += nextCodepointSize; - - textWidth = GetTextWidth(text + textIndexOffset) - GetTextWidth(text + textBoxCursorIndex); - } - - int textLength = (int)strlen(text); // Get current text length - int codepoint = GetCharPressed(); // Get Unicode codepoint - if (multiline && IsKeyPressed(KEY_ENTER)) codepoint = (int)'\n'; - - if (textBoxCursorIndex > textLength) textBoxCursorIndex = textLength; - - // Encode codepoint as UTF-8 - int codepointSize = 0; - const char *charEncoded = CodepointToUTF8(codepoint, &codepointSize); - - // Add codepoint to text, at current cursor position - // NOTE: Make sure we do not overflow buffer size - if (((multiline && (codepoint == (int)'\n')) || (codepoint >= 32)) && ((textLength + codepointSize) < textSize)) - { - // 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'; - } - - // Move cursor to start - if ((textLength > 0) && IsKeyPressed(KEY_HOME)) textBoxCursorIndex = 0; - - // Move cursor to end - if ((textLength > textBoxCursorIndex) && IsKeyPressed(KEY_END)) textBoxCursorIndex = textLength; - - // Delete codepoint from text, after current cursor position - if ((textLength > textBoxCursorIndex) && (IsKeyPressed(KEY_DELETE) || (IsKeyDown(KEY_DELETE) && (autoCursorCooldownCounter >= RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_DELETE) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames - { - int nextCodepointSize = 0; - GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); - - // Move backward text from cursor position - for (int i = textBoxCursorIndex; i < textLength; i++) text[i] = text[i + nextCodepointSize]; - - textLength -= codepointSize; - - // Make sure text last character is EOL - text[textLength] = '\0'; - } - } - - // Delete codepoint from text, before current cursor position - if ((textLength > 0) && (IsKeyPressed(KEY_BACKSPACE) || (IsKeyDown(KEY_BACKSPACE) && (autoCursorCooldownCounter >= RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN)))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_BACKSPACE) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames - { - 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]; - - // Prevent cursor index from decrementing past 0 - if (textBoxCursorIndex > 0) - { - textBoxCursorIndex -= codepointSize; - textLength -= codepointSize; - } - - // Make sure text last character is EOL - text[textLength] = '\0'; - } - } - - // Move cursor position with keys - if (IsKeyPressed(KEY_LEFT) || (IsKeyDown(KEY_LEFT) && (autoCursorCooldownCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_LEFT) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_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) || (IsKeyDown(KEY_RIGHT) && (autoCursorCooldownCounter > RAYGUI_TEXTBOX_AUTO_CURSOR_COOLDOWN))) - { - autoCursorDelayCounter++; - - if (IsKeyPressed(KEY_RIGHT) || (autoCursorDelayCounter%RAYGUI_TEXTBOX_AUTO_CURSOR_DELAY) == 0) // Delay every movement some frames - { - int nextCodepointSize = 0; - GetCodepointNext(text + textBoxCursorIndex, &nextCodepointSize); - - if ((textBoxCursorIndex + nextCodepointSize) <= textLength) textBoxCursorIndex += nextCodepointSize; - } - } - - // Move cursor position with mouse - if (CheckCollisionPointRec(mousePosition, textBounds)) // Mouse hover text - { - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/(float)guiFont.baseSize; - int codepointIndex = 0; - float glyphWidth = 0.0f; - float widthToMouseX = 0; - int mouseCursorIndex = 0; - - for (int i = textIndexOffset; i < textLength; i++) - { - codepoint = GetCodepointNext(&text[i], &codepointSize); - codepointIndex = GetGlyphIndex(guiFont, codepoint); - - if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor); - else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor); - - if (mousePosition.x <= (textBounds.x + (widthToMouseX + glyphWidth/2))) - { - mouseCursor.x = textBounds.x + widthToMouseX; - mouseCursorIndex = i; - break; - } - - widthToMouseX += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - - // Check if mouse cursor is at the last position - int textEndWidth = GetTextWidth(text + textIndexOffset); - if (GetMousePosition().x >= (textBounds.x + textEndWidth - glyphWidth/2)) - { - mouseCursor.x = textBounds.x + textEndWidth; - mouseCursorIndex = (int)strlen(text); - } - - // Place cursor at required index on mouse click - if ((mouseCursor.x >= 0) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - cursor.x = mouseCursor.x; - textBoxCursorIndex = mouseCursorIndex; - } - } - else mouseCursor.x = -1; - - // 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 ((!multiline && IsKeyPressed(KEY_ENTER)) || - (!CheckCollisionPointRec(mousePosition, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) - { - textBoxCursorIndex = 0; // GLOBAL: Reset the shared cursor index - result = 1; - } - } - else - { - if (CheckCollisionPointRec(mousePosition, bounds)) - { - state = STATE_FOCUSED; - - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - textBoxCursorIndex = (int)strlen(text); // GLOBAL: Place cursor index to the end of current text - result = 1; - } - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_PRESSED) - { - GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_PRESSED))); - } - else if (state == STATE_DISABLED) - { - GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), GetColor(GuiGetStyle(TEXTBOX, BASE_COLOR_DISABLED))); - } - else GuiDrawRectangle(bounds, GuiGetStyle(TEXTBOX, BORDER_WIDTH), GetColor(GuiGetStyle(TEXTBOX, BORDER + (state*3))), BLANK); - - // Draw text considering index offset if required - // NOTE: Text index offset depends on cursor position - GuiDrawText(text + textIndexOffset, textBounds, GuiGetStyle(TEXTBOX, TEXT_ALIGNMENT), GetColor(GuiGetStyle(TEXTBOX, TEXT + (state*3)))); - - // Draw cursor - if (editMode && !GuiGetStyle(TEXTBOX, TEXT_READONLY)) - { - //if (autoCursorMode || ((blinkCursorFrameCounter/40)%2 == 0)) - GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))); - - // Draw mouse position cursor (if required) - if (mouseCursor.x >= 0) GuiDrawRectangle(mouseCursor, 0, BLANK, GetColor(GuiGetStyle(TEXTBOX, BORDER_COLOR_PRESSED))); - } - else if (state == STATE_FOCUSED) GuiTooltip(bounds); - //-------------------------------------------------------------------- - - return result; // Mouse button pressed: result = 1 -} - -/* -// Text Box control with multiple lines and word-wrap -// NOTE: This text-box is readonly, no editing supported by default -bool GuiTextBoxMulti(Rectangle bounds, char *text, int textSize, bool editMode) -{ - bool pressed = false; - - GuiSetStyle(TEXTBOX, TEXT_READONLY, 1); - GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_WORD); // WARNING: If wrap mode enabled, text editing is not supported - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_TOP); - - // TODO: Implement methods to calculate cursor position properly - pressed = GuiTextBox(bounds, text, textSize, editMode); - - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); - GuiSetStyle(DEFAULT, TEXT_WRAP_MODE, TEXT_WRAP_NONE); - GuiSetStyle(TEXTBOX, TEXT_READONLY, 0); - - return pressed; -} -*/ - -// Spinner control, returns selected value -int GuiSpinner(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) -{ - int result = 1; - GuiState state = guiState; - - int tempValue = *value; - - Rectangle spinner = { bounds.x + GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING), bounds.y, - bounds.width - 2*(GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH) + GuiGetStyle(SPINNER, SPIN_BUTTON_SPACING)), bounds.height }; - Rectangle leftButtonBound = { (float)bounds.x, (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height }; - Rectangle rightButtonBound = { (float)bounds.x + bounds.width - GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.y, (float)GuiGetStyle(SPINNER, SPIN_BUTTON_WIDTH), (float)bounds.height }; - - Rectangle textBounds = { 0 }; - if (text != NULL) - { - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(SPINNER, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - if (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SPINNER, TEXT_PADDING); - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check spinner state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - } - } - -#if defined(RAYGUI_NO_ICONS) - if (GuiButton(leftButtonBound, "<")) tempValue--; - if (GuiButton(rightButtonBound, ">")) tempValue++; -#else - if (GuiButton(leftButtonBound, GuiIconText(ICON_ARROW_LEFT_FILL, NULL))) tempValue--; - if (GuiButton(rightButtonBound, GuiIconText(ICON_ARROW_RIGHT_FILL, NULL))) tempValue++; -#endif - - if (!editMode) - { - if (tempValue < minValue) tempValue = minValue; - if (tempValue > maxValue) tempValue = maxValue; - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - result = GuiValueBox(spinner, NULL, &tempValue, minValue, maxValue, editMode); - - // Draw value selector custom buttons - // NOTE: BORDER_WIDTH and TEXT_ALIGNMENT forced values - int tempBorderWidth = GuiGetStyle(BUTTON, BORDER_WIDTH); - int tempTextAlign = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, BORDER_WIDTH, GuiGetStyle(SPINNER, BORDER_WIDTH)); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, tempTextAlign); - GuiSetStyle(BUTTON, BORDER_WIDTH, tempBorderWidth); - - // Draw text label if provided - GuiDrawText(text, textBounds, (GuiGetStyle(SPINNER, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - *value = tempValue; - return result; -} - -// Value Box control, updates input text with numbers -// NOTE: Requires static variables: frameCounter -int GuiValueBox(Rectangle bounds, const char *text, int *value, int minValue, int maxValue, bool editMode) -{ - #if !defined(RAYGUI_VALUEBOX_MAX_CHARS) - #define RAYGUI_VALUEBOX_MAX_CHARS 32 - #endif - - int result = 0; - GuiState state = guiState; - - char textValue[RAYGUI_VALUEBOX_MAX_CHARS + 1] = "\0"; - sprintf(textValue, "%i", *value); - - Rectangle textBounds = { 0 }; - if (text != NULL) - { - textBounds.width = (float)GetTextWidth(text) + 2; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(VALUEBOX, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - if (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_LEFT) textBounds.x = bounds.x - textBounds.width - GuiGetStyle(VALUEBOX, TEXT_PADDING); - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - bool valueHasChanged = false; - - if (editMode) - { - state = STATE_PRESSED; - - int keyCount = (int)strlen(textValue); - - // Only allow keys in range [48..57] - if (keyCount < RAYGUI_VALUEBOX_MAX_CHARS) - { - if (GetTextWidth(textValue) < bounds.width) - { - int key = GetCharPressed(); - if ((key >= 48) && (key <= 57)) - { - textValue[keyCount] = (char)key; - keyCount++; - valueHasChanged = true; - } - } - } - - // Delete text - if (keyCount > 0) - { - if (IsKeyPressed(KEY_BACKSPACE)) - { - keyCount--; - textValue[keyCount] = '\0'; - valueHasChanged = true; - } - } - - if (valueHasChanged) *value = TextToInteger(textValue); - - // NOTE: We are not clamp values until user input finishes - //if (*value > maxValue) *value = maxValue; - //else if (*value < minValue) *value = minValue; - - if (IsKeyPressed(KEY_ENTER) || (!CheckCollisionPointRec(mousePoint, bounds) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON))) - { - if (*value > maxValue) *value = maxValue; - else if (*value < minValue) *value = minValue; - - result = 1; - } - } - else - { - if (*value > maxValue) *value = maxValue; - else if (*value < minValue) *value = minValue; - - if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) result = 1; - } - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - Color baseColor = BLANK; - if (state == STATE_PRESSED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_PRESSED)); - else if (state == STATE_DISABLED) baseColor = GetColor(GuiGetStyle(VALUEBOX, BASE_COLOR_DISABLED)); - - GuiDrawRectangle(bounds, GuiGetStyle(VALUEBOX, BORDER_WIDTH), GetColor(GuiGetStyle(VALUEBOX, BORDER + (state*3))), baseColor); - GuiDrawText(textValue, GetTextBounds(VALUEBOX, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(VALUEBOX, TEXT + (state*3)))); - - // Draw cursor - if (editMode) - { - // NOTE: ValueBox internal text is always centered - Rectangle cursor = { bounds.x + GetTextWidth(textValue)/2 + bounds.width/2 + 1, bounds.y + 2*GuiGetStyle(VALUEBOX, BORDER_WIDTH), 4, bounds.height - 4*GuiGetStyle(VALUEBOX, BORDER_WIDTH) }; - GuiDrawRectangle(cursor, 0, BLANK, GetColor(GuiGetStyle(VALUEBOX, BORDER_COLOR_PRESSED))); - } - - // Draw text label if provided - GuiDrawText(text, textBounds, (GuiGetStyle(VALUEBOX, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT)? TEXT_ALIGN_LEFT : TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(LABEL, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Slider control with pro parameters -// NOTE: Other GuiSlider*() controls use this one -int GuiSliderPro(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue, int sliderWidth) -{ - int result = 0; - GuiState state = guiState; - - float temp = (maxValue - minValue)/2.0f; - if (value == NULL) value = &temp; - float oldValue = *value; - - Rectangle slider = { bounds.x, bounds.y + GuiGetStyle(SLIDER, BORDER_WIDTH) + GuiGetStyle(SLIDER, SLIDER_PADDING), - 0, bounds.height - 2*GuiGetStyle(SLIDER, BORDER_WIDTH) - 2*GuiGetStyle(SLIDER, SLIDER_PADDING) }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - // Get equivalent value and slider position from mousePosition.x - *value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue; - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - if (!CheckCollisionPointRec(mousePoint, slider)) - { - // Get equivalent value and slider position from mousePosition.x - *value = (maxValue - minValue)*((mousePoint.x - bounds.x - sliderWidth/2)/(bounds.width-sliderWidth)) + minValue; - } - } - else state = STATE_FOCUSED; - } - - if (*value > maxValue) *value = maxValue; - else if (*value < minValue) *value = minValue; - } - - // Control value change check - if (oldValue == *value) result = 0; - else result = 1; - - // Slider bar limits check - int sliderValue = (int)(((*value - minValue)/(maxValue - minValue))*(bounds.width - sliderWidth - GuiGetStyle(SLIDER, BORDER_WIDTH))); - if (sliderWidth > 0) // Slider - { - slider.x += sliderValue; - slider.width = (float)sliderWidth; - if (slider.x <= (bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH))) slider.x = bounds.x + GuiGetStyle(SLIDER, BORDER_WIDTH); - else if ((slider.x + slider.width) >= (bounds.x + bounds.width)) slider.x = bounds.x + bounds.width - slider.width - GuiGetStyle(SLIDER, BORDER_WIDTH); - } - else if (sliderWidth == 0) // SliderBar - { - slider.x += GuiGetStyle(SLIDER, BORDER_WIDTH); - slider.width = (float)sliderValue; - if (slider.width > bounds.width) slider.width = bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH); - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(SLIDER, BORDER_WIDTH), GetColor(GuiGetStyle(SLIDER, BORDER + (state*3))), GetColor(GuiGetStyle(SLIDER, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED))); - - // Draw slider internal bar (depends on state) - if (state == STATE_NORMAL) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BASE_COLOR_PRESSED))); - else if (state == STATE_FOCUSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_FOCUSED))); - else if (state == STATE_PRESSED) GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, TEXT_COLOR_PRESSED))); - - // Draw left/right text if provided - if (textLeft != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textLeft); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x - textBounds.width - GuiGetStyle(SLIDER, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(SLIDER, TEXT + (state*3)))); - } - - if (textRight != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textRight); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(SLIDER, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(SLIDER, TEXT + (state*3)))); - } - //-------------------------------------------------------------------- - - return result; -} - -// Slider control extended, returns selected value and has text -int GuiSlider(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) -{ - return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, GuiGetStyle(SLIDER, SLIDER_WIDTH)); -} - -// Slider Bar control extended, returns selected value -int GuiSliderBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) -{ - return GuiSliderPro(bounds, textLeft, textRight, value, minValue, maxValue, 0); -} - -// Progress Bar control extended, shows current progress value -int GuiProgressBar(Rectangle bounds, const char *textLeft, const char *textRight, float *value, float minValue, float maxValue) -{ - int result = 0; - GuiState state = guiState; - - float temp = (maxValue - minValue)/2.0f; - if (value == NULL) value = &temp; - - // Progress bar - Rectangle progress = { bounds.x + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), - bounds.y + GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) + GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING), 0, - bounds.height - 2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) - 2*GuiGetStyle(PROGRESSBAR, PROGRESS_PADDING) }; - - // Update control - //-------------------------------------------------------------------- - if (*value > maxValue) *value = maxValue; - - // WARNING: Working with floats could lead to rounding issues - if ((state != STATE_DISABLED)) progress.width = (float)(*value/(maxValue - minValue))*bounds.width - ((*value >= maxValue)? (float)(2*GuiGetStyle(PROGRESSBAR, BORDER_WIDTH)) : 0.0f); - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_DISABLED) - { - GuiDrawRectangle(bounds, GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(PROGRESSBAR, BORDER + (state*3))), BLANK); - } - else - { - if (*value > minValue) - { - // Draw progress bar with colored border, more visual - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y + bounds.height - 1, (int)progress.width + (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - } - else GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - - if (*value >= maxValue) GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + progress.width + 1, bounds.y, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_FOCUSED))); - else - { - // Draw borders not yet reached by value - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + 1, bounds.y, bounds.width - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + (int)progress.width + 1, bounds.y + bounds.height - 1, bounds.width - (int)progress.width - 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH) }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ bounds.x + bounds.width - 1, bounds.y + 1, (float)GuiGetStyle(PROGRESSBAR, BORDER_WIDTH), bounds.height - 2 }, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BORDER_COLOR_NORMAL))); - } - - // Draw slider internal progress bar (depends on state) - GuiDrawRectangle(progress, 0, BLANK, GetColor(GuiGetStyle(PROGRESSBAR, BASE_COLOR_PRESSED))); - } - - // Draw left/right text if provided - if (textLeft != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textLeft); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x - textBounds.width - GuiGetStyle(PROGRESSBAR, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textLeft, textBounds, TEXT_ALIGN_RIGHT, GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3)))); - } - - if (textRight != NULL) - { - Rectangle textBounds = { 0 }; - textBounds.width = (float)GetTextWidth(textRight); - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - textBounds.x = bounds.x + bounds.width + GuiGetStyle(PROGRESSBAR, TEXT_PADDING); - textBounds.y = bounds.y + bounds.height/2 - GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - - GuiDrawText(textRight, textBounds, TEXT_ALIGN_LEFT, GetColor(GuiGetStyle(PROGRESSBAR, TEXT + (state*3)))); - } - //-------------------------------------------------------------------- - - return result; -} - -// Status Bar control -int GuiStatusBar(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(STATUSBAR, BORDER_WIDTH), GetColor(GuiGetStyle(STATUSBAR, BORDER + (state*3))), GetColor(GuiGetStyle(STATUSBAR, BASE + (state*3)))); - GuiDrawText(text, GetTextBounds(STATUSBAR, bounds), GuiGetStyle(STATUSBAR, TEXT_ALIGNMENT), GetColor(GuiGetStyle(STATUSBAR, TEXT + (state*3)))); - //-------------------------------------------------------------------- - - return result; -} - -// Dummy rectangle control, intended for placeholding -int GuiDummyRec(Rectangle bounds, const char *text) -{ - int result = 0; - GuiState state = guiState; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = STATE_PRESSED; - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, 0, BLANK, GetColor(GuiGetStyle(DEFAULT, (state != STATE_DISABLED)? BASE_COLOR_NORMAL : BASE_COLOR_DISABLED))); - GuiDrawText(text, GetTextBounds(DEFAULT, bounds), TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(BUTTON, (state != STATE_DISABLED)? TEXT_COLOR_NORMAL : TEXT_COLOR_DISABLED))); - //------------------------------------------------------------------ - - return result; -} - -// List View control -int GuiListView(Rectangle bounds, const char *text, int *scrollIndex, int *active) -{ - int result = 0; - int itemCount = 0; - const char **items = NULL; - - if (text != NULL) items = GuiTextSplit(text, ';', &itemCount, NULL); - - result = GuiListViewEx(bounds, items, itemCount, scrollIndex, active, NULL); - - return result; -} - -// List View control with extended parameters -int GuiListViewEx(Rectangle bounds, const char **text, int count, int *scrollIndex, int *active, int *focus) -{ - int result = 0; - GuiState state = guiState; - - int itemFocused = (focus == NULL)? -1 : *focus; - int itemSelected = (active == NULL)? -1 : *active; - - // Check if we need a scroll bar - bool useScrollBar = false; - if ((GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING))*count > bounds.height) useScrollBar = true; - - // Define base item rectangle [0] - Rectangle itemBounds = { 0 }; - itemBounds.x = bounds.x + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING); - itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); - itemBounds.width = bounds.width - 2*GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) - GuiGetStyle(DEFAULT, BORDER_WIDTH); - itemBounds.height = (float)GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT); - if (useScrollBar) itemBounds.width -= GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH); - - // Get items on the list - int visibleItems = (int)bounds.height/(GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); - if (visibleItems > count) visibleItems = count; - - int startIndex = (scrollIndex == NULL)? 0 : *scrollIndex; - if ((startIndex < 0) || (startIndex > (count - visibleItems))) startIndex = 0; - int endIndex = startIndex + visibleItems; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - Vector2 mousePoint = GetMousePosition(); - - // Check mouse inside list view - if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - - // Check focused and selected item - for (int i = 0; i < visibleItems; i++) - { - if (CheckCollisionPointRec(mousePoint, itemBounds)) - { - itemFocused = startIndex + i; - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - if (itemSelected == (startIndex + i)) itemSelected = -1; - else itemSelected = startIndex + i; - } - break; - } - - // Update item rectangle y position for next item - itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); - } - - if (useScrollBar) - { - int wheelMove = (int)GetMouseWheelMove(); - startIndex -= wheelMove; - - if (startIndex < 0) startIndex = 0; - else if (startIndex > (count - visibleItems)) startIndex = count - visibleItems; - - endIndex = startIndex + visibleItems; - if (endIndex > count) endIndex = count; - } - } - else itemFocused = -1; - - // Reset item rectangle y to [0] - itemBounds.y = bounds.y + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING) + GuiGetStyle(DEFAULT, BORDER_WIDTH); - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(DEFAULT, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR))); // Draw background - - // Draw visible items - for (int i = 0; ((i < visibleItems) && (text != NULL)); i++) - { - if (state == STATE_DISABLED) - { - if ((startIndex + i) == itemSelected) GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_DISABLED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_DISABLED))); - - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_DISABLED))); - } - else - { - if (((startIndex + i) == itemSelected) && (active != NULL)) - { - // Draw item selected - GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_PRESSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_PRESSED))); - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_PRESSED))); - } - else if (((startIndex + i) == itemFocused)) // && (focus != NULL)) // NOTE: We want items focused, despite not returned! - { - // Draw item focused - GuiDrawRectangle(itemBounds, GuiGetStyle(LISTVIEW, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER_COLOR_FOCUSED)), GetColor(GuiGetStyle(LISTVIEW, BASE_COLOR_FOCUSED))); - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_FOCUSED))); - } - else - { - // Draw item normal - GuiDrawText(text[startIndex + i], GetTextBounds(DEFAULT, itemBounds), GuiGetStyle(LISTVIEW, TEXT_ALIGNMENT), GetColor(GuiGetStyle(LISTVIEW, TEXT_COLOR_NORMAL))); - } - } - - // Update item rectangle y position for next item - itemBounds.y += (GuiGetStyle(LISTVIEW, LIST_ITEMS_HEIGHT) + GuiGetStyle(LISTVIEW, LIST_ITEMS_SPACING)); - } - - if (useScrollBar) - { - Rectangle scrollBarBounds = { - bounds.x + bounds.width - GuiGetStyle(LISTVIEW, BORDER_WIDTH) - GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), - bounds.y + GuiGetStyle(LISTVIEW, BORDER_WIDTH), (float)GuiGetStyle(LISTVIEW, SCROLLBAR_WIDTH), - bounds.height - 2*GuiGetStyle(DEFAULT, BORDER_WIDTH) - }; - - // Calculate percentage of visible items and apply same percentage to scrollbar - float percentVisible = (float)(endIndex - startIndex)/count; - float sliderSize = bounds.height*percentVisible; - - int prevSliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); // Save default slider size - int prevScrollSpeed = GuiGetStyle(SCROLLBAR, SCROLL_SPEED); // Save default scroll speed - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, (int)sliderSize); // Change slider size - GuiSetStyle(SCROLLBAR, SCROLL_SPEED, count - visibleItems); // Change scroll speed - - startIndex = GuiScrollBar(scrollBarBounds, startIndex, 0, count - visibleItems); - - GuiSetStyle(SCROLLBAR, SCROLL_SPEED, prevScrollSpeed); // Reset scroll speed to default - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, prevSliderSize); // Reset slider size to default - } - //-------------------------------------------------------------------- - - if (active != NULL) *active = itemSelected; - if (focus != NULL) *focus = itemFocused; - if (scrollIndex != NULL) *scrollIndex = startIndex; - - return result; -} - -// Color Panel control - Color (RGBA) variant. -int GuiColorPanel(Rectangle bounds, const char *text, Color *color) -{ - int result = 0; - - Vector3 vcolor = { (float)color->r/255.0f, (float)color->g/255.0f, (float)color->b/255.0f }; - Vector3 hsv = ConvertRGBtoHSV(vcolor); - Vector3 prevHsv = hsv; // workaround to see if GuiColorPanelHSV modifies the hsv. - - GuiColorPanelHSV(bounds, text, &hsv); - - // Check if the hsv was changed, only then change the color. - // This is necessary, because the Color->HSV->Color conversion has precision errors. - // Thus the assignment from HSV to Color should only be made, if the HSV has a new user-entered value. - // Otherwise GuiColorPanel would often modify it's color without user input. - // TODO: GuiColorPanelHSV could return 1 if the slider was dragged, to simplify this check. - if (hsv.x != prevHsv.x || hsv.y != prevHsv.y || hsv.z != prevHsv.z) - { - Vector3 rgb = ConvertHSVtoRGB(hsv); - - // NOTE: Vector3ToColor() only available on raylib 1.8.1 - *color = RAYGUI_CLITERAL(Color){ (unsigned char)(255.0f*rgb.x), - (unsigned char)(255.0f*rgb.y), - (unsigned char)(255.0f*rgb.z), - color->a }; - } - return result; -} - -// Color Bar Alpha control -// NOTE: Returns alpha value normalized [0..1] -int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha) -{ - #if !defined(RAYGUI_COLORBARALPHA_CHECKED_SIZE) - #define RAYGUI_COLORBARALPHA_CHECKED_SIZE 10 - #endif - - int result = 0; - GuiState state = guiState; - Rectangle selector = { (float)bounds.x + (*alpha)*bounds.width - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.y - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT), (float)bounds.height + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2 }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - - *alpha = (mousePoint.x - bounds.x)/bounds.width; - if (*alpha <= 0.0f) *alpha = 0.0f; - if (*alpha >= 1.0f) *alpha = 1.0f; - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - *alpha = (mousePoint.x - bounds.x)/bounds.width; - if (*alpha <= 0.0f) *alpha = 0.0f; - if (*alpha >= 1.0f) *alpha = 1.0f; - //selector.x = bounds.x + (int)(((alpha - 0)/(100 - 0))*(bounds.width - 2*GuiGetStyle(SLIDER, BORDER_WIDTH))) - selector.width/2; - } - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - - // Draw alpha bar: checked background - if (state != STATE_DISABLED) - { - int checksX = (int)bounds.width/RAYGUI_COLORBARALPHA_CHECKED_SIZE; - int checksY = (int)bounds.height/RAYGUI_COLORBARALPHA_CHECKED_SIZE; - - for (int x = 0; x < checksX; x++) - { - for (int y = 0; y < checksY; y++) - { - Rectangle check = { bounds.x + x*RAYGUI_COLORBARALPHA_CHECKED_SIZE, bounds.y + y*RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE, RAYGUI_COLORBARALPHA_CHECKED_SIZE }; - GuiDrawRectangle(check, 0, BLANK, ((x + y)%2)? Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.4f) : Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.4f)); - } - } - - DrawRectangleGradientEx(bounds, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, RAYGUI_CLITERAL(Color){ 255, 255, 255, 0 }, Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 0, 255 }, guiAlpha)); - } - else DrawRectangleGradientEx(bounds, Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha)); - - GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); - - // Draw alpha bar: selector - GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3))); - //-------------------------------------------------------------------- - - return result; -} - -// Color Bar Hue control -// Returns hue value normalized [0..1] -// NOTE: Other similar bars (for reference): -// Color GuiColorBarSat() [WHITE->color] -// Color GuiColorBarValue() [BLACK->color], HSV/HSL -// float GuiColorBarLuminance() [BLACK->WHITE] -int GuiColorBarHue(Rectangle bounds, const char *text, float *hue) -{ - int result = 0; - GuiState state = guiState; - Rectangle selector = { (float)bounds.x - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW), (float)bounds.y + (*hue)/360.0f*bounds.height - GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT)/2, (float)bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW)*2, (float)GuiGetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT) }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - - *hue = (mousePoint.y - bounds.y)*360/bounds.height; - if (*hue <= 0.0f) *hue = 0.0f; - if (*hue >= 359.0f) *hue = 359.0f; - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds) || CheckCollisionPointRec(mousePoint, selector)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - *hue = (mousePoint.y - bounds.y)*360/bounds.height; - if (*hue <= 0.0f) *hue = 0.0f; - if (*hue >= 359.0f) *hue = 359.0f; - - } - else state = STATE_FOCUSED; - - /*if (IsKeyDown(KEY_UP)) - { - hue -= 2.0f; - if (hue <= 0.0f) hue = 0.0f; - } - else if (IsKeyDown(KEY_DOWN)) - { - hue += 2.0f; - if (hue >= 360.0f) hue = 360.0f; - }*/ - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state != STATE_DISABLED) - { - // Draw hue bar:color bars - // TODO: Use directly DrawRectangleGradientEx(bounds, color1, color2, color2, color1); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + bounds.height/6), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 2*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 0, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 3*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 255, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 4*(bounds.height/6)), (int)bounds.width, (int)ceilf(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 0, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha)); - DrawRectangleGradientV((int)bounds.x, (int)(bounds.y + 5*(bounds.height/6)), (int)bounds.width, (int)(bounds.height/6), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 255, 255 }, guiAlpha), Fade(RAYGUI_CLITERAL(Color){ 255, 0, 0, 255 }, guiAlpha)); - } - else DrawRectangleGradientV((int)bounds.x, (int)bounds.y, (int)bounds.width, (int)bounds.height, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), guiAlpha)); - - GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); - - // Draw hue bar: selector - GuiDrawRectangle(selector, 0, BLANK, GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3))); - //-------------------------------------------------------------------- - - return result; -} - -// Color Picker control -// NOTE: It's divided in multiple controls: -// Color GuiColorPanel(Rectangle bounds, Color color) -// float GuiColorBarAlpha(Rectangle bounds, float alpha) -// float GuiColorBarHue(Rectangle bounds, float value) -// NOTE: bounds define GuiColorPanel() size -// NOTE: this picker converts RGB to HSV, which can cause the Hue control to jump. If you have this problem, consider using the HSV variant instead -int GuiColorPicker(Rectangle bounds, const char *text, Color *color) -{ - int result = 0; - - Color temp = { 200, 0, 0, 255 }; - if (color == NULL) color = &temp; - - GuiColorPanel(bounds, NULL, color); - - Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height }; - //Rectangle boundsAlpha = { bounds.x, bounds.y + bounds.height + GuiGetStyle(COLORPICKER, BARS_PADDING), bounds.width, GuiGetStyle(COLORPICKER, BARS_THICK) }; - - // NOTE: this conversion can cause low hue-resolution, if the r, g and b value are very similar, which causes the hue bar to shift around when only the GuiColorPanel is used. - Vector3 hsv = ConvertRGBtoHSV(RAYGUI_CLITERAL(Vector3){ (*color).r/255.0f, (*color).g/255.0f, (*color).b/255.0f }); - - GuiColorBarHue(boundsHue, NULL, &hsv.x); - - //color.a = (unsigned char)(GuiColorBarAlpha(boundsAlpha, (float)color.a/255.0f)*255.0f); - Vector3 rgb = ConvertHSVtoRGB(hsv); - - *color = RAYGUI_CLITERAL(Color){ (unsigned char)roundf(rgb.x*255.0f), (unsigned char)roundf(rgb.y*255.0f), (unsigned char)roundf(rgb.z*255.0f), (*color).a }; - - return result; -} - -// Color Picker control that avoids conversion to RGB and back to HSV on each call, thus avoiding jittering. -// The user can call ConvertHSVtoRGB() to convert *colorHsv value to RGB. -// NOTE: It's divided in multiple controls: -// int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) -// int GuiColorBarAlpha(Rectangle bounds, const char *text, float *alpha) -// float GuiColorBarHue(Rectangle bounds, float value) -// NOTE: bounds define GuiColorPanelHSV() size -int GuiColorPickerHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) -{ - int result = 0; - - Vector3 tempHsv = { 0 }; - - if (colorHsv == NULL) - { - const Vector3 tempColor = { 200.0f/255.0f, 0.0f, 0.0f }; - tempHsv = ConvertRGBtoHSV(tempColor); - colorHsv = &tempHsv; - } - - GuiColorPanelHSV(bounds, NULL, colorHsv); - - const Rectangle boundsHue = { (float)bounds.x + bounds.width + GuiGetStyle(COLORPICKER, HUEBAR_PADDING), (float)bounds.y, (float)GuiGetStyle(COLORPICKER, HUEBAR_WIDTH), (float)bounds.height }; - - GuiColorBarHue(boundsHue, NULL, &colorHsv->x); - - return result; -} - -// Color Panel control - HSV variant -int GuiColorPanelHSV(Rectangle bounds, const char *text, Vector3 *colorHsv) -{ - int result = 0; - GuiState state = guiState; - Vector2 pickerSelector = { 0 }; - - const Color colWhite = { 255, 255, 255, 255 }; - const Color colBlack = { 0, 0, 0, 255 }; - - pickerSelector.x = bounds.x + (float)colorHsv->y*bounds.width; // HSV: Saturation - pickerSelector.y = bounds.y + (1.0f - (float)colorHsv->z)*bounds.height; // HSV: Value - - Vector3 maxHue = { colorHsv->x, 1.0f, 1.0f }; - Vector3 rgbHue = ConvertHSVtoRGB(maxHue); - Color maxHueCol = { (unsigned char)(255.0f*rgbHue.x), - (unsigned char)(255.0f*rgbHue.y), - (unsigned char)(255.0f*rgbHue.z), 255 }; - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - pickerSelector = mousePoint; - - if (pickerSelector.x < bounds.x) pickerSelector.x = bounds.x; - if (pickerSelector.x > bounds.x + bounds.width) pickerSelector.x = bounds.x + bounds.width; - if (pickerSelector.y < bounds.y) pickerSelector.y = bounds.y; - if (pickerSelector.y > bounds.y + bounds.height) pickerSelector.y = bounds.y + bounds.height; - - // Calculate color from picker - Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y }; - - colorPick.x /= (float)bounds.width; // Get normalized value on x - colorPick.y /= (float)bounds.height; // Get normalized value on y - - colorHsv->y = colorPick.x; - colorHsv->z = 1.0f - colorPick.y; - - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) - { - state = STATE_PRESSED; - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; - pickerSelector = mousePoint; - - // Calculate color from picker - Vector2 colorPick = { pickerSelector.x - bounds.x, pickerSelector.y - bounds.y }; - - colorPick.x /= (float)bounds.width; // Get normalized value on x - colorPick.y /= (float)bounds.height; // Get normalized value on y - - colorHsv->y = colorPick.x; - colorHsv->z = 1.0f - colorPick.y; - } - else state = STATE_FOCUSED; - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state != STATE_DISABLED) - { - DrawRectangleGradientEx(bounds, Fade(colWhite, guiAlpha), Fade(colWhite, guiAlpha), Fade(maxHueCol, guiAlpha), Fade(maxHueCol, guiAlpha)); - DrawRectangleGradientEx(bounds, Fade(colBlack, 0), Fade(colBlack, guiAlpha), Fade(colBlack, guiAlpha), Fade(colBlack, 0)); - - // Draw color picker: selector - Rectangle selector = { pickerSelector.x - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, pickerSelector.y - GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE)/2, (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE), (float)GuiGetStyle(COLORPICKER, COLOR_SELECTOR_SIZE) }; - GuiDrawRectangle(selector, 0, BLANK, colWhite); - } - else - { - DrawRectangleGradientEx(bounds, Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BASE_COLOR_DISABLED)), 0.1f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(colBlack, 0.6f), guiAlpha), Fade(Fade(GetColor(GuiGetStyle(COLORPICKER, BORDER_COLOR_DISABLED)), 0.6f), guiAlpha)); - } - - GuiDrawRectangle(bounds, GuiGetStyle(COLORPICKER, BORDER_WIDTH), GetColor(GuiGetStyle(COLORPICKER, BORDER + state*3)), BLANK); - //-------------------------------------------------------------------- - - return result; -} - -// Message Box control -int GuiMessageBox(Rectangle bounds, const char *title, const char *message, const char *buttons) -{ - #if !defined(RAYGUI_MESSAGEBOX_BUTTON_HEIGHT) - #define RAYGUI_MESSAGEBOX_BUTTON_HEIGHT 24 - #endif - #if !defined(RAYGUI_MESSAGEBOX_BUTTON_PADDING) - #define RAYGUI_MESSAGEBOX_BUTTON_PADDING 12 - #endif - - int result = -1; // Returns clicked button from buttons list, 0 refers to closed window button - - int buttonCount = 0; - const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL); - Rectangle buttonBounds = { 0 }; - buttonBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING; - buttonBounds.y = bounds.y + bounds.height - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT - RAYGUI_MESSAGEBOX_BUTTON_PADDING; - buttonBounds.width = (bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; - buttonBounds.height = RAYGUI_MESSAGEBOX_BUTTON_HEIGHT; - - int textWidth = GetTextWidth(message) + 2; - - Rectangle textBounds = { 0 }; - textBounds.x = bounds.x + RAYGUI_MESSAGEBOX_BUTTON_PADDING; - textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + RAYGUI_MESSAGEBOX_BUTTON_PADDING; - textBounds.width = bounds.width - RAYGUI_MESSAGEBOX_BUTTON_PADDING*2; - textBounds.height = bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - 3*RAYGUI_MESSAGEBOX_BUTTON_PADDING - RAYGUI_MESSAGEBOX_BUTTON_HEIGHT; - - // Draw control - //-------------------------------------------------------------------- - if (GuiWindowBox(bounds, title)) result = 0; - - int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiLabel(textBounds, message); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); - - prevTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - for (int i = 0; i < buttonCount; i++) - { - if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1; - buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING); - } - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevTextAlignment); - //-------------------------------------------------------------------- - - return result; -} - -// Text Input Box control, ask for text -int GuiTextInputBox(Rectangle bounds, const char *title, const char *message, const char *buttons, char *text, int textMaxSize, bool *secretViewActive) -{ - #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT) - #define RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT 24 - #endif - #if !defined(RAYGUI_TEXTINPUTBOX_BUTTON_PADDING) - #define RAYGUI_TEXTINPUTBOX_BUTTON_PADDING 12 - #endif - #if !defined(RAYGUI_TEXTINPUTBOX_HEIGHT) - #define RAYGUI_TEXTINPUTBOX_HEIGHT 26 - #endif - - // Used to enable text edit mode - // WARNING: No more than one GuiTextInputBox() should be open at the same time - static bool textEditMode = false; - - int result = -1; - - int buttonCount = 0; - const char **buttonsText = GuiTextSplit(buttons, ';', &buttonCount, NULL); - Rectangle buttonBounds = { 0 }; - buttonBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - buttonBounds.y = bounds.y + bounds.height - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - buttonBounds.width = (bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*(buttonCount + 1))/buttonCount; - buttonBounds.height = RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT; - - int messageInputHeight = (int)bounds.height - RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - GuiGetStyle(STATUSBAR, BORDER_WIDTH) - RAYGUI_TEXTINPUTBOX_BUTTON_HEIGHT - 2*RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - - Rectangle textBounds = { 0 }; - if (message != NULL) - { - int textSize = GetTextWidth(message) + 2; - - textBounds.x = bounds.x + bounds.width/2 - textSize/2; - textBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT + messageInputHeight/4 - (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/2; - textBounds.width = (float)textSize; - textBounds.height = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - } - - Rectangle textBoxBounds = { 0 }; - textBoxBounds.x = bounds.x + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - textBoxBounds.y = bounds.y + RAYGUI_WINDOWBOX_STATUSBAR_HEIGHT - RAYGUI_TEXTINPUTBOX_HEIGHT/2; - if (message == NULL) textBoxBounds.y = bounds.y + 24 + RAYGUI_TEXTINPUTBOX_BUTTON_PADDING; - else textBoxBounds.y += (messageInputHeight/2 + messageInputHeight/4); - textBoxBounds.width = bounds.width - RAYGUI_TEXTINPUTBOX_BUTTON_PADDING*2; - textBoxBounds.height = RAYGUI_TEXTINPUTBOX_HEIGHT; - - // Draw control - //-------------------------------------------------------------------- - if (GuiWindowBox(bounds, title)) result = 0; - - // Draw message if available - if (message != NULL) - { - int prevTextAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiLabel(textBounds, message); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, prevTextAlignment); - } - - if (secretViewActive != NULL) - { - static char stars[] = "****************"; - if (GuiTextBox(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x, textBoxBounds.y, textBoxBounds.width - 4 - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.height }, - ((*secretViewActive == 1) || textEditMode)? text : stars, textMaxSize, textEditMode)) textEditMode = !textEditMode; - - GuiToggle(RAYGUI_CLITERAL(Rectangle){ textBoxBounds.x + textBoxBounds.width - RAYGUI_TEXTINPUTBOX_HEIGHT, textBoxBounds.y, RAYGUI_TEXTINPUTBOX_HEIGHT, RAYGUI_TEXTINPUTBOX_HEIGHT }, (*secretViewActive == 1)? "#44#" : "#45#", secretViewActive); - } - else - { - if (GuiTextBox(textBoxBounds, text, textMaxSize, textEditMode)) textEditMode = !textEditMode; - } - - int prevBtnTextAlignment = GuiGetStyle(BUTTON, TEXT_ALIGNMENT); - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - for (int i = 0; i < buttonCount; i++) - { - if (GuiButton(buttonBounds, buttonsText[i])) result = i + 1; - buttonBounds.x += (buttonBounds.width + RAYGUI_MESSAGEBOX_BUTTON_PADDING); - } - - if (result >= 0) textEditMode = false; - - GuiSetStyle(BUTTON, TEXT_ALIGNMENT, prevBtnTextAlignment); - //-------------------------------------------------------------------- - - return result; // Result is the pressed button index -} - -// Grid control -// NOTE: Returns grid mouse-hover selected cell -// About drawing lines at subpixel spacing, simple put, not easy solution: -// https://stackoverflow.com/questions/4435450/2d-opengl-drawing-lines-that-dont-exactly-fit-pixel-raster -int GuiGrid(Rectangle bounds, const char *text, float spacing, int subdivs, Vector2 *mouseCell) -{ - // Grid lines alpha amount - #if !defined(RAYGUI_GRID_ALPHA) - #define RAYGUI_GRID_ALPHA 0.15f - #endif - - int result = 0; - GuiState state = guiState; - - Vector2 mousePoint = GetMousePosition(); - Vector2 currentMouseCell = { -1, -1 }; - - float spaceWidth = spacing/(float)subdivs; - int linesV = (int)(bounds.width/spaceWidth) + 1; - int linesH = (int)(bounds.height/spaceWidth) + 1; - - int color = GuiGetStyle(DEFAULT, LINE_COLOR); - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked && !guiControlExclusiveMode) - { - if (CheckCollisionPointRec(mousePoint, bounds)) - { - // NOTE: Cell values must be the upper left of the cell the mouse is in - currentMouseCell.x = floorf((mousePoint.x - bounds.x)/spacing); - currentMouseCell.y = floorf((mousePoint.y - bounds.y)/spacing); - } - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - if (state == STATE_DISABLED) color = GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED); - - if (subdivs > 0) - { - // Draw vertical grid lines - for (int i = 0; i < linesV; i++) - { - Rectangle lineV = { bounds.x + spacing*i/subdivs, bounds.y, 1, bounds.height }; - GuiDrawRectangle(lineV, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA)); - } - - // Draw horizontal grid lines - for (int i = 0; i < linesH; i++) - { - Rectangle lineH = { bounds.x, bounds.y + spacing*i/subdivs, bounds.width, 1 }; - GuiDrawRectangle(lineH, 0, BLANK, ((i%subdivs) == 0)? GuiFade(GetColor(color), RAYGUI_GRID_ALPHA*4) : GuiFade(GetColor(color), RAYGUI_GRID_ALPHA)); - } - } - - if (mouseCell != NULL) *mouseCell = currentMouseCell; - return result; -} - -//---------------------------------------------------------------------------------- -// Tooltip management functions -// NOTE: Tooltips requires some global variables: tooltipPtr -//---------------------------------------------------------------------------------- -// Enable gui tooltips (global state) -void GuiEnableTooltip(void) { guiTooltip = true; } - -// Disable gui tooltips (global state) -void GuiDisableTooltip(void) { guiTooltip = false; } - -// Set tooltip string -void GuiSetTooltip(const char *tooltip) { guiTooltipPtr = tooltip; } - -//---------------------------------------------------------------------------------- -// Styles loading functions -//---------------------------------------------------------------------------------- - -// Load raygui style file (.rgs) -// NOTE: By default a binary file is expected, that file could contain a custom font, -// in that case, custom font image atlas is GRAY+ALPHA and pixel data can be compressed (DEFLATE) -void GuiLoadStyle(const char *fileName) -{ - #define MAX_LINE_BUFFER_SIZE 256 - - bool tryBinary = false; - if (!guiStyleLoaded) GuiLoadStyleDefault(); - - // Try reading the files as text file first - FILE *rgsFile = fopen(fileName, "rt"); - - if (rgsFile != NULL) - { - char buffer[MAX_LINE_BUFFER_SIZE] = { 0 }; - fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile); - - if (buffer[0] == '#') - { - int controlId = 0; - int propertyId = 0; - unsigned int propertyValue = 0; - - while (!feof(rgsFile)) - { - switch (buffer[0]) - { - case 'p': - { - // Style property: p - - sscanf(buffer, "p %d %d 0x%x", &controlId, &propertyId, &propertyValue); - GuiSetStyle(controlId, propertyId, (int)propertyValue); - - } break; - case 'f': - { - // Style font: f - - int fontSize = 0; - char charmapFileName[256] = { 0 }; - char fontFileName[256] = { 0 }; - sscanf(buffer, "f %d %s %[^\r\n]s", &fontSize, charmapFileName, fontFileName); - - Font font = { 0 }; - int *codepoints = NULL; - int codepointCount = 0; - - if (charmapFileName[0] != '0') - { - // Load text data from file - // NOTE: Expected an UTF-8 array of codepoints, no separation - char *textData = LoadFileText(TextFormat("%s/%s", GetDirectoryPath(fileName), charmapFileName)); - codepoints = LoadCodepoints(textData, &codepointCount); - UnloadFileText(textData); - } - - if (fontFileName[0] != '\0') - { - // In case a font is already loaded and it is not default internal font, unload it - if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture); - - if (codepointCount > 0) font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, codepoints, codepointCount); - else font = LoadFontEx(TextFormat("%s/%s", GetDirectoryPath(fileName), fontFileName), fontSize, NULL, 0); // Default to 95 standard codepoints - } - - // If font texture not properly loaded, revert to default font and size/spacing - if (font.texture.id == 0) - { - font = GetFontDefault(); - GuiSetStyle(DEFAULT, TEXT_SIZE, 10); - GuiSetStyle(DEFAULT, TEXT_SPACING, 1); - } - - UnloadCodepoints(codepoints); - - if ((font.texture.id > 0) && (font.glyphCount > 0)) GuiSetFont(font); - - } break; - default: break; - } - - fgets(buffer, MAX_LINE_BUFFER_SIZE, rgsFile); - } - } - else tryBinary = true; - - fclose(rgsFile); - } - - if (tryBinary) - { - rgsFile = fopen(fileName, "rb"); - - if (rgsFile != NULL) - { - fseek(rgsFile, 0, SEEK_END); - int fileDataSize = ftell(rgsFile); - fseek(rgsFile, 0, SEEK_SET); - - if (fileDataSize > 0) - { - unsigned char *fileData = (unsigned char *)RAYGUI_MALLOC(fileDataSize*sizeof(unsigned char)); - fread(fileData, sizeof(unsigned char), fileDataSize, rgsFile); - - GuiLoadStyleFromMemory(fileData, fileDataSize); - - RAYGUI_FREE(fileData); - } - - fclose(rgsFile); - } - } -} - -// Load style default over global style -void GuiLoadStyleDefault(void) -{ - // We set this variable first to avoid cyclic function calls - // when calling GuiSetStyle() and GuiGetStyle() - guiStyleLoaded = true; - - // Initialize default LIGHT style property values - // WARNING: Default value are applied to all controls on set but - // they can be overwritten later on for every custom control - GuiSetStyle(DEFAULT, BORDER_COLOR_NORMAL, 0x838383ff); - GuiSetStyle(DEFAULT, BASE_COLOR_NORMAL, 0xc9c9c9ff); - GuiSetStyle(DEFAULT, TEXT_COLOR_NORMAL, 0x686868ff); - GuiSetStyle(DEFAULT, BORDER_COLOR_FOCUSED, 0x5bb2d9ff); - GuiSetStyle(DEFAULT, BASE_COLOR_FOCUSED, 0xc9effeff); - GuiSetStyle(DEFAULT, TEXT_COLOR_FOCUSED, 0x6c9bbcff); - GuiSetStyle(DEFAULT, BORDER_COLOR_PRESSED, 0x0492c7ff); - GuiSetStyle(DEFAULT, BASE_COLOR_PRESSED, 0x97e8ffff); - GuiSetStyle(DEFAULT, TEXT_COLOR_PRESSED, 0x368bafff); - GuiSetStyle(DEFAULT, BORDER_COLOR_DISABLED, 0xb5c1c2ff); - GuiSetStyle(DEFAULT, BASE_COLOR_DISABLED, 0xe6e9e9ff); - GuiSetStyle(DEFAULT, TEXT_COLOR_DISABLED, 0xaeb7b8ff); - GuiSetStyle(DEFAULT, BORDER_WIDTH, 1); - GuiSetStyle(DEFAULT, TEXT_PADDING, 0); - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - - // Initialize default extended property values - // NOTE: By default, extended property values are initialized to 0 - GuiSetStyle(DEFAULT, TEXT_SIZE, 10); // DEFAULT, shared by all controls - GuiSetStyle(DEFAULT, TEXT_SPACING, 1); // DEFAULT, shared by all controls - GuiSetStyle(DEFAULT, LINE_COLOR, 0x90abb5ff); // DEFAULT specific property - GuiSetStyle(DEFAULT, BACKGROUND_COLOR, 0xf5f5f5ff); // DEFAULT specific property - GuiSetStyle(DEFAULT, TEXT_LINE_SPACING, 15); // DEFAULT, 15 pixels between lines - GuiSetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL, TEXT_ALIGN_MIDDLE); // DEFAULT, text aligned vertically to middle of text-bounds - - // Initialize control-specific property values - // NOTE: Those properties are in default list but require specific values by control type - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(BUTTON, BORDER_WIDTH, 2); - GuiSetStyle(SLIDER, TEXT_PADDING, 4); - GuiSetStyle(PROGRESSBAR, TEXT_PADDING, 4); - GuiSetStyle(CHECKBOX, TEXT_PADDING, 4); - GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_RIGHT); - GuiSetStyle(DROPDOWNBOX, TEXT_PADDING, 0); - GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiSetStyle(TEXTBOX, TEXT_PADDING, 4); - GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(VALUEBOX, TEXT_PADDING, 0); - GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(SPINNER, TEXT_PADDING, 0); - GuiSetStyle(SPINNER, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - GuiSetStyle(STATUSBAR, TEXT_PADDING, 8); - GuiSetStyle(STATUSBAR, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT); - - // Initialize extended property values - // NOTE: By default, extended property values are initialized to 0 - GuiSetStyle(TOGGLE, GROUP_PADDING, 2); - GuiSetStyle(SLIDER, SLIDER_WIDTH, 16); - GuiSetStyle(SLIDER, SLIDER_PADDING, 1); - GuiSetStyle(PROGRESSBAR, PROGRESS_PADDING, 1); - GuiSetStyle(CHECKBOX, CHECK_PADDING, 1); - GuiSetStyle(COMBOBOX, COMBO_BUTTON_WIDTH, 32); - GuiSetStyle(COMBOBOX, COMBO_BUTTON_SPACING, 2); - GuiSetStyle(DROPDOWNBOX, ARROW_PADDING, 16); - GuiSetStyle(DROPDOWNBOX, DROPDOWN_ITEMS_SPACING, 2); - GuiSetStyle(SPINNER, SPIN_BUTTON_WIDTH, 24); - GuiSetStyle(SPINNER, SPIN_BUTTON_SPACING, 2); - GuiSetStyle(SCROLLBAR, BORDER_WIDTH, 0); - GuiSetStyle(SCROLLBAR, ARROWS_VISIBLE, 0); - GuiSetStyle(SCROLLBAR, ARROWS_SIZE, 6); - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING, 0); - GuiSetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE, 16); - GuiSetStyle(SCROLLBAR, SCROLL_PADDING, 0); - GuiSetStyle(SCROLLBAR, SCROLL_SPEED, 12); - GuiSetStyle(LISTVIEW, LIST_ITEMS_HEIGHT, 28); - GuiSetStyle(LISTVIEW, LIST_ITEMS_SPACING, 2); - GuiSetStyle(LISTVIEW, SCROLLBAR_WIDTH, 12); - GuiSetStyle(LISTVIEW, SCROLLBAR_SIDE, SCROLLBAR_RIGHT_SIDE); - GuiSetStyle(COLORPICKER, COLOR_SELECTOR_SIZE, 8); - GuiSetStyle(COLORPICKER, HUEBAR_WIDTH, 16); - GuiSetStyle(COLORPICKER, HUEBAR_PADDING, 8); - GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_HEIGHT, 8); - GuiSetStyle(COLORPICKER, HUEBAR_SELECTOR_OVERFLOW, 2); - - if (guiFont.texture.id != GetFontDefault().texture.id) - { - // Unload previous font texture - UnloadTexture(guiFont.texture); - RL_FREE(guiFont.recs); - RL_FREE(guiFont.glyphs); - guiFont.recs = NULL; - guiFont.glyphs = NULL; - - // Setup default raylib font - guiFont = GetFontDefault(); - - // NOTE: Default raylib font character 95 is a white square - Rectangle whiteChar = guiFont.recs[95]; - - // NOTE: We set up a 1px padding on char rectangle to avoid pixel bleeding on MSAA filtering - SetShapesTexture(guiFont.texture, RAYGUI_CLITERAL(Rectangle){ whiteChar.x + 1, whiteChar.y + 1, whiteChar.width - 2, whiteChar.height - 2 }); - } -} - -// Get text with icon id prepended -// NOTE: Useful to add icons by name id (enum) instead of -// a number that can change between ricon versions -const char *GuiIconText(int iconId, const char *text) -{ -#if defined(RAYGUI_NO_ICONS) - return NULL; -#else - static char buffer[1024] = { 0 }; - static char iconBuffer[16] = { 0 }; - - if (text != NULL) - { - memset(buffer, 0, 1024); - sprintf(buffer, "#%03i#", iconId); - - for (int i = 5; i < 1024; i++) - { - buffer[i] = text[i - 5]; - if (text[i - 5] == '\0') break; - } - - return buffer; - } - else - { - sprintf(iconBuffer, "#%03i#", iconId); - - return iconBuffer; - } -#endif -} - -#if !defined(RAYGUI_NO_ICONS) -// Get full icons data pointer -unsigned int *GuiGetIcons(void) { return guiIconsPtr; } - -// Load raygui icons file (.rgi) -// NOTE: In case nameIds are required, they can be requested with loadIconsName, -// they are returned as a guiIconsName[iconCount][RAYGUI_ICON_MAX_NAME_LENGTH], -// WARNING: guiIconsName[]][] memory should be manually freed! -char **GuiLoadIcons(const char *fileName, bool loadIconsName) -{ - // Style File Structure (.rgi) - // ------------------------------------------------------ - // Offset | Size | Type | Description - // ------------------------------------------------------ - // 0 | 4 | char | Signature: "rGI " - // 4 | 2 | short | Version: 100 - // 6 | 2 | short | reserved - - // 8 | 2 | short | Num icons (N) - // 10 | 2 | short | Icons size (Options: 16, 32, 64) (S) - - // Icons name id (32 bytes per name id) - // foreach (icon) - // { - // 12+32*i | 32 | char | Icon NameId - // } - - // Icons data: One bit per pixel, stored as unsigned int array (depends on icon size) - // S*S pixels/32bit per unsigned int = K unsigned int per icon - // foreach (icon) - // { - // ... | K | unsigned int | Icon Data - // } - - FILE *rgiFile = fopen(fileName, "rb"); - - char **guiIconsName = NULL; - - if (rgiFile != NULL) - { - char signature[5] = { 0 }; - short version = 0; - short reserved = 0; - short iconCount = 0; - short iconSize = 0; - - fread(signature, 1, 4, rgiFile); - fread(&version, sizeof(short), 1, rgiFile); - fread(&reserved, sizeof(short), 1, rgiFile); - fread(&iconCount, sizeof(short), 1, rgiFile); - fread(&iconSize, sizeof(short), 1, rgiFile); - - if ((signature[0] == 'r') && - (signature[1] == 'G') && - (signature[2] == 'I') && - (signature[3] == ' ')) - { - if (loadIconsName) - { - guiIconsName = (char **)RAYGUI_MALLOC(iconCount*sizeof(char **)); - for (int i = 0; i < iconCount; i++) - { - guiIconsName[i] = (char *)RAYGUI_MALLOC(RAYGUI_ICON_MAX_NAME_LENGTH); - fread(guiIconsName[i], 1, RAYGUI_ICON_MAX_NAME_LENGTH, rgiFile); - } - } - else fseek(rgiFile, iconCount*RAYGUI_ICON_MAX_NAME_LENGTH, SEEK_CUR); - - // Read icons data directly over internal icons array - fread(guiIconsPtr, sizeof(unsigned int), iconCount*(iconSize*iconSize/32), rgiFile); - } - - fclose(rgiFile); - } - - return guiIconsName; -} - -// Draw selected icon using rectangles pixel-by-pixel -void GuiDrawIcon(int iconId, int posX, int posY, int pixelSize, Color color) -{ - #define BIT_CHECK(a,b) ((a) & (1u<<(b))) - - for (int i = 0, y = 0; i < RAYGUI_ICON_SIZE*RAYGUI_ICON_SIZE/32; i++) - { - for (int k = 0; k < 32; k++) - { - if (BIT_CHECK(guiIconsPtr[iconId*RAYGUI_ICON_DATA_ELEMENTS + i], k)) - { - #if !defined(RAYGUI_STANDALONE) - GuiDrawRectangle(RAYGUI_CLITERAL(Rectangle){ (float)posX + (k%RAYGUI_ICON_SIZE)*pixelSize, (float)posY + y*pixelSize, (float)pixelSize, (float)pixelSize }, 0, BLANK, color); - #endif - } - - if ((k == 15) || (k == 31)) y++; - } - } -} - -// Set icon drawing size -void GuiSetIconScale(int scale) -{ - if (scale >= 1) guiIconScale = scale; -} - -#endif // !RAYGUI_NO_ICONS - -//---------------------------------------------------------------------------------- -// Module specific Functions Definition -//---------------------------------------------------------------------------------- - -// Load style from memory -// WARNING: Binary files only -static void GuiLoadStyleFromMemory(const unsigned char *fileData, int dataSize) -{ - unsigned char *fileDataPtr = (unsigned char *)fileData; - - char signature[5] = { 0 }; - short version = 0; - short reserved = 0; - int propertyCount = 0; - - memcpy(signature, fileDataPtr, 4); - memcpy(&version, fileDataPtr + 4, sizeof(short)); - memcpy(&reserved, fileDataPtr + 4 + 2, sizeof(short)); - memcpy(&propertyCount, fileDataPtr + 4 + 2 + 2, sizeof(int)); - fileDataPtr += 12; - - if ((signature[0] == 'r') && - (signature[1] == 'G') && - (signature[2] == 'S') && - (signature[3] == ' ')) - { - short controlId = 0; - short propertyId = 0; - unsigned int propertyValue = 0; - - for (int i = 0; i < propertyCount; i++) - { - memcpy(&controlId, fileDataPtr, sizeof(short)); - memcpy(&propertyId, fileDataPtr + 2, sizeof(short)); - memcpy(&propertyValue, fileDataPtr + 2 + 2, sizeof(unsigned int)); - fileDataPtr += 8; - - if (controlId == 0) // DEFAULT control - { - // If a DEFAULT property is loaded, it is propagated to all controls - // NOTE: All DEFAULT properties should be defined first in the file - GuiSetStyle(0, (int)propertyId, propertyValue); - - if (propertyId < RAYGUI_MAX_PROPS_BASE) for (int i = 1; i < RAYGUI_MAX_CONTROLS; i++) GuiSetStyle(i, (int)propertyId, propertyValue); - } - else GuiSetStyle((int)controlId, (int)propertyId, propertyValue); - } - - // Font loading is highly dependant on raylib API to load font data and image - -#if !defined(RAYGUI_STANDALONE) - // Load custom font if available - int fontDataSize = 0; - memcpy(&fontDataSize, fileDataPtr, sizeof(int)); - fileDataPtr += 4; - - if (fontDataSize > 0) - { - Font font = { 0 }; - int fontType = 0; // 0-Normal, 1-SDF - - memcpy(&font.baseSize, fileDataPtr, sizeof(int)); - memcpy(&font.glyphCount, fileDataPtr + 4, sizeof(int)); - memcpy(&fontType, fileDataPtr + 4 + 4, sizeof(int)); - fileDataPtr += 12; - - // Load font white rectangle - Rectangle fontWhiteRec = { 0 }; - memcpy(&fontWhiteRec, fileDataPtr, sizeof(Rectangle)); - fileDataPtr += 16; - - // Load font image parameters - int fontImageUncompSize = 0; - int fontImageCompSize = 0; - memcpy(&fontImageUncompSize, fileDataPtr, sizeof(int)); - memcpy(&fontImageCompSize, fileDataPtr + 4, sizeof(int)); - fileDataPtr += 8; - - Image imFont = { 0 }; - imFont.mipmaps = 1; - memcpy(&imFont.width, fileDataPtr, sizeof(int)); - memcpy(&imFont.height, fileDataPtr + 4, sizeof(int)); - memcpy(&imFont.format, fileDataPtr + 4 + 4, sizeof(int)); - fileDataPtr += 12; - - if ((fontImageCompSize > 0) && (fontImageCompSize != fontImageUncompSize)) - { - // Compressed font atlas image data (DEFLATE), it requires DecompressData() - int dataUncompSize = 0; - unsigned char *compData = (unsigned char *)RAYGUI_MALLOC(fontImageCompSize); - memcpy(compData, fileDataPtr, fontImageCompSize); - fileDataPtr += fontImageCompSize; - - imFont.data = DecompressData(compData, fontImageCompSize, &dataUncompSize); - - // Security check, dataUncompSize must match the provided fontImageUncompSize - if (dataUncompSize != fontImageUncompSize) RAYGUI_LOG("WARNING: Uncompressed font atlas image data could be corrupted"); - - RAYGUI_FREE(compData); - } - else - { - // Font atlas image data is not compressed - imFont.data = (unsigned char *)RAYGUI_MALLOC(fontImageUncompSize); - memcpy(imFont.data, fileDataPtr, fontImageUncompSize); - fileDataPtr += fontImageUncompSize; - } - - if (font.texture.id != GetFontDefault().texture.id) UnloadTexture(font.texture); - font.texture = LoadTextureFromImage(imFont); - - RAYGUI_FREE(imFont.data); - - // Validate font atlas texture was loaded correctly - if (font.texture.id != 0) - { - // Load font recs data - int recsDataSize = font.glyphCount*sizeof(Rectangle); - int recsDataCompressedSize = 0; - - // WARNING: Version 400 adds the compression size parameter - if (version >= 400) - { - // RGS files version 400 support compressed recs data - memcpy(&recsDataCompressedSize, fileDataPtr, sizeof(int)); - fileDataPtr += sizeof(int); - } - - if ((recsDataCompressedSize > 0) && (recsDataCompressedSize != recsDataSize)) - { - // Recs data is compressed, uncompress it - unsigned char *recsDataCompressed = (unsigned char *)RAYGUI_MALLOC(recsDataCompressedSize); - - memcpy(recsDataCompressed, fileDataPtr, recsDataCompressedSize); - fileDataPtr += recsDataCompressedSize; - - int recsDataUncompSize = 0; - font.recs = (Rectangle *)DecompressData(recsDataCompressed, recsDataCompressedSize, &recsDataUncompSize); - - // Security check, data uncompressed size must match the expected original data size - if (recsDataUncompSize != recsDataSize) RAYGUI_LOG("WARNING: Uncompressed font recs data could be corrupted"); - - RAYGUI_FREE(recsDataCompressed); - } - else - { - // Recs data is uncompressed - font.recs = (Rectangle *)RAYGUI_CALLOC(font.glyphCount, sizeof(Rectangle)); - for (int i = 0; i < font.glyphCount; i++) - { - memcpy(&font.recs[i], fileDataPtr, sizeof(Rectangle)); - fileDataPtr += sizeof(Rectangle); - } - } - - // Load font glyphs info data - int glyphsDataSize = font.glyphCount*16; // 16 bytes data per glyph - int glyphsDataCompressedSize = 0; - - // WARNING: Version 400 adds the compression size parameter - if (version >= 400) - { - // RGS files version 400 support compressed glyphs data - memcpy(&glyphsDataCompressedSize, fileDataPtr, sizeof(int)); - fileDataPtr += sizeof(int); - } - - // Allocate required glyphs space to fill with data - font.glyphs = (GlyphInfo *)RAYGUI_CALLOC(font.glyphCount, sizeof(GlyphInfo)); - - if ((glyphsDataCompressedSize > 0) && (glyphsDataCompressedSize != glyphsDataSize)) - { - // Glyphs data is compressed, uncompress it - unsigned char *glypsDataCompressed = (unsigned char *)RAYGUI_MALLOC(glyphsDataCompressedSize); - - memcpy(glypsDataCompressed, fileDataPtr, glyphsDataCompressedSize); - fileDataPtr += glyphsDataCompressedSize; - - int glyphsDataUncompSize = 0; - unsigned char *glyphsDataUncomp = DecompressData(glypsDataCompressed, glyphsDataCompressedSize, &glyphsDataUncompSize); - - // Security check, data uncompressed size must match the expected original data size - if (glyphsDataUncompSize != glyphsDataSize) RAYGUI_LOG("WARNING: Uncompressed font glyphs data could be corrupted"); - - unsigned char *glyphsDataUncompPtr = glyphsDataUncomp; - - for (int i = 0; i < font.glyphCount; i++) - { - memcpy(&font.glyphs[i].value, glyphsDataUncompPtr, sizeof(int)); - memcpy(&font.glyphs[i].offsetX, glyphsDataUncompPtr + 4, sizeof(int)); - memcpy(&font.glyphs[i].offsetY, glyphsDataUncompPtr + 8, sizeof(int)); - memcpy(&font.glyphs[i].advanceX, glyphsDataUncompPtr + 12, sizeof(int)); - glyphsDataUncompPtr += 16; - } - - RAYGUI_FREE(glypsDataCompressed); - RAYGUI_FREE(glyphsDataUncomp); - } - else - { - // Glyphs data is uncompressed - for (int i = 0; i < font.glyphCount; i++) - { - memcpy(&font.glyphs[i].value, fileDataPtr, sizeof(int)); - memcpy(&font.glyphs[i].offsetX, fileDataPtr + 4, sizeof(int)); - memcpy(&font.glyphs[i].offsetY, fileDataPtr + 8, sizeof(int)); - memcpy(&font.glyphs[i].advanceX, fileDataPtr + 12, sizeof(int)); - fileDataPtr += 16; - } - } - } - else font = GetFontDefault(); // Fallback in case of errors loading font atlas texture - - GuiSetFont(font); - - // Set font texture source rectangle to be used as white texture to draw shapes - // NOTE: It makes possible to draw shapes and text (full UI) in a single draw call - if ((fontWhiteRec.x > 0) && - (fontWhiteRec.y > 0) && - (fontWhiteRec.width > 0) && - (fontWhiteRec.height > 0)) SetShapesTexture(font.texture, fontWhiteRec); - } -#endif - } -} - -// Gui get text width considering icon -static int GetTextWidth(const char *text) -{ - #if !defined(ICON_TEXT_PADDING) - #define ICON_TEXT_PADDING 4 - #endif - - Vector2 textSize = { 0 }; - int textIconOffset = 0; - - if ((text != NULL) && (text[0] != '\0')) - { - if (text[0] == '#') - { - for (int i = 1; (i < 5) && (text[i] != '\0'); i++) - { - if (text[i] == '#') - { - textIconOffset = i; - break; - } - } - } - - text += textIconOffset; - - // Make sure guiFont is set, GuiGetStyle() initializes it lazynessly - float fontSize = (float)GuiGetStyle(DEFAULT, TEXT_SIZE); - - // Custom MeasureText() implementation - if ((guiFont.texture.id > 0) && (text != NULL)) - { - // Get size in bytes of text, considering end of line and line break - int size = 0; - for (int i = 0; i < MAX_LINE_BUFFER_SIZE; i++) - { - if ((text[i] != '\0') && (text[i] != '\n')) size++; - else break; - } - - float scaleFactor = fontSize/(float)guiFont.baseSize; - textSize.y = (float)guiFont.baseSize*scaleFactor; - float glyphWidth = 0.0f; - - for (int i = 0, codepointSize = 0; i < size; i += codepointSize) - { - int codepoint = GetCodepointNext(&text[i], &codepointSize); - int codepointIndex = GetGlyphIndex(guiFont, codepoint); - - if (guiFont.glyphs[codepointIndex].advanceX == 0) glyphWidth = ((float)guiFont.recs[codepointIndex].width*scaleFactor); - else glyphWidth = ((float)guiFont.glyphs[codepointIndex].advanceX*scaleFactor); - - textSize.x += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - } - - if (textIconOffset > 0) textSize.x += (RAYGUI_ICON_SIZE - ICON_TEXT_PADDING); - } - - return (int)textSize.x; -} - -// Get text bounds considering control bounds -static Rectangle GetTextBounds(int control, Rectangle bounds) -{ - Rectangle textBounds = bounds; - - textBounds.x = bounds.x + GuiGetStyle(control, BORDER_WIDTH); - textBounds.y = bounds.y + GuiGetStyle(control, BORDER_WIDTH) + GuiGetStyle(control, TEXT_PADDING); - textBounds.width = bounds.width - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); - textBounds.height = bounds.height - 2*GuiGetStyle(control, BORDER_WIDTH) - 2*GuiGetStyle(control, TEXT_PADDING); // NOTE: Text is processed line per line! - - // Depending on control, TEXT_PADDING and TEXT_ALIGNMENT properties could affect the text-bounds - switch (control) - { - case COMBOBOX: - case DROPDOWNBOX: - case LISTVIEW: - // TODO: Special cases (no label): COMBOBOX, DROPDOWNBOX, LISTVIEW - case SLIDER: - case CHECKBOX: - case VALUEBOX: - case SPINNER: - // TODO: More special cases (label on side): SLIDER, CHECKBOX, VALUEBOX, SPINNER - default: - { - // TODO: WARNING: TEXT_ALIGNMENT is already considered in GuiDrawText() - if (GuiGetStyle(control, TEXT_ALIGNMENT) == TEXT_ALIGN_RIGHT) textBounds.x -= GuiGetStyle(control, TEXT_PADDING); - else textBounds.x += GuiGetStyle(control, TEXT_PADDING); - } - break; - } - - return textBounds; -} - -// Get text icon if provided and move text cursor -// NOTE: We support up to 999 values for iconId -static const char *GetTextIcon(const char *text, int *iconId) -{ -#if !defined(RAYGUI_NO_ICONS) - *iconId = -1; - if (text[0] == '#') // Maybe we have an icon! - { - char iconValue[4] = { 0 }; // Maximum length for icon value: 3 digits + '\0' - - int pos = 1; - while ((pos < 4) && (text[pos] >= '0') && (text[pos] <= '9')) - { - iconValue[pos - 1] = text[pos]; - pos++; - } - - if (text[pos] == '#') - { - *iconId = TextToInteger(iconValue); - - // Move text pointer after icon - // WARNING: If only icon provided, it could point to EOL character: '\0' - if (*iconId >= 0) text += (pos + 1); - } - } -#endif - - return text; -} - -// Get text divided into lines (by line-breaks '\n') -const char **GetTextLines(const char *text, int *count) -{ - #define RAYGUI_MAX_TEXT_LINES 128 - - static const char *lines[RAYGUI_MAX_TEXT_LINES] = { 0 }; - for (int i = 0; i < RAYGUI_MAX_TEXT_LINES; i++) lines[i] = NULL; // Init NULL pointers to substrings - - int textSize = (int)strlen(text); - - lines[0] = text; - int len = 0; - *count = 1; - //int lineSize = 0; // Stores current line size, not returned - - for (int i = 0, k = 0; (i < textSize) && (*count < RAYGUI_MAX_TEXT_LINES); i++) - { - if (text[i] == '\n') - { - //lineSize = len; - k++; - lines[k] = &text[i + 1]; // WARNING: next value is valid? - len = 0; - *count += 1; - } - else len++; - } - - //lines[*count - 1].size = len; - - return lines; -} - -// Get text width to next space for provided string -static float GetNextSpaceWidth(const char *text, int *nextSpaceIndex) -{ - float width = 0; - int codepointByteCount = 0; - int codepoint = 0; - int index = 0; - float glyphWidth = 0; - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize; - - for (int i = 0; text[i] != '\0'; i++) - { - if (text[i] != ' ') - { - codepoint = GetCodepoint(&text[i], &codepointByteCount); - index = GetGlyphIndex(guiFont, codepoint); - glyphWidth = (guiFont.glyphs[index].advanceX == 0)? guiFont.recs[index].width*scaleFactor : guiFont.glyphs[index].advanceX*scaleFactor; - width += (glyphWidth + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - else - { - *nextSpaceIndex = i; - break; - } - } - - return width; -} - -// Gui draw text using default font -static void GuiDrawText(const char *text, Rectangle textBounds, int alignment, Color tint) -{ - #define TEXT_VALIGN_PIXEL_OFFSET(h) ((int)h%2) // Vertical alignment for pixel perfect - - #if !defined(ICON_TEXT_PADDING) - #define ICON_TEXT_PADDING 4 - #endif - - if ((text == NULL) || (text[0] == '\0')) return; // Security check - - // PROCEDURE: - // - Text is processed line per line - // - For every line, horizontal alignment is defined - // - For all text, vertical alignment is defined (multiline text only) - // - For every line, wordwrap mode is checked (useful for GuitextBox(), read-only) - - // Get text lines (using '\n' as delimiter) to be processed individually - // WARNING: We can't use GuiTextSplit() function because it can be already used - // before the GuiDrawText() call and its buffer is static, it would be overriden :( - int lineCount = 0; - const char **lines = GetTextLines(text, &lineCount); - - // Text style variables - //int alignment = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT); - int alignmentVertical = GuiGetStyle(DEFAULT, TEXT_ALIGNMENT_VERTICAL); - int wrapMode = GuiGetStyle(DEFAULT, TEXT_WRAP_MODE); // Wrap-mode only available in read-only mode, no for text editing - - // TODO: WARNING: This totalHeight is not valid for vertical alignment in case of word-wrap - float totalHeight = (float)(lineCount*GuiGetStyle(DEFAULT, TEXT_SIZE) + (lineCount - 1)*GuiGetStyle(DEFAULT, TEXT_SIZE)/2); - float posOffsetY = 0.0f; - - for (int i = 0; i < lineCount; i++) - { - int iconId = 0; - lines[i] = GetTextIcon(lines[i], &iconId); // Check text for icon and move cursor - - // Get text position depending on alignment and iconId - //--------------------------------------------------------------------------------- - Vector2 textBoundsPosition = { textBounds.x, textBounds.y }; - float textBoundsWidthOffset = 0.0f; - - // NOTE: We get text size after icon has been processed - // WARNING: GetTextWidth() also processes text icon to get width! -> Really needed? - int textSizeX = GetTextWidth(lines[i]); - - // If text requires an icon, add size to measure - if (iconId >= 0) - { - textSizeX += RAYGUI_ICON_SIZE*guiIconScale; - - // WARNING: If only icon provided, text could be pointing to EOF character: '\0' -#if !defined(RAYGUI_NO_ICONS) - if ((lines[i] != NULL) && (lines[i][0] != '\0')) textSizeX += ICON_TEXT_PADDING; -#endif - } - - // Check guiTextAlign global variables - switch (alignment) - { - case TEXT_ALIGN_LEFT: textBoundsPosition.x = textBounds.x; break; - case TEXT_ALIGN_CENTER: textBoundsPosition.x = textBounds.x + textBounds.width/2 - textSizeX/2; break; - case TEXT_ALIGN_RIGHT: textBoundsPosition.x = textBounds.x + textBounds.width - textSizeX; break; - default: break; - } - - if (textSizeX > textBounds.width && (lines[i] != NULL) && (lines[i][0] != '\0')) textBoundsPosition.x = textBounds.x; - - switch (alignmentVertical) - { - // Only valid in case of wordWrap = 0; - case TEXT_ALIGN_TOP: textBoundsPosition.y = textBounds.y + posOffsetY; break; - case TEXT_ALIGN_MIDDLE: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height/2 - totalHeight/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break; - case TEXT_ALIGN_BOTTOM: textBoundsPosition.y = textBounds.y + posOffsetY + textBounds.height - totalHeight + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height); break; - default: break; - } - - // NOTE: Make sure we get pixel-perfect coordinates, - // In case of decimals we got weird text positioning - textBoundsPosition.x = (float)((int)textBoundsPosition.x); - textBoundsPosition.y = (float)((int)textBoundsPosition.y); - //--------------------------------------------------------------------------------- - - // Draw text (with icon if available) - //--------------------------------------------------------------------------------- -#if !defined(RAYGUI_NO_ICONS) - if (iconId >= 0) - { - // NOTE: We consider icon height, probably different than text size - GuiDrawIcon(iconId, (int)textBoundsPosition.x, (int)(textBounds.y + textBounds.height/2 - RAYGUI_ICON_SIZE*guiIconScale/2 + TEXT_VALIGN_PIXEL_OFFSET(textBounds.height)), guiIconScale, tint); - textBoundsPosition.x += (RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING); - textBoundsWidthOffset = (RAYGUI_ICON_SIZE*guiIconScale + ICON_TEXT_PADDING); - } -#endif - // Get size in bytes of text, - // considering end of line and line break - int lineSize = 0; - for (int c = 0; (lines[i][c] != '\0') && (lines[i][c] != '\n') && (lines[i][c] != '\r'); c++, lineSize++){ } - float scaleFactor = (float)GuiGetStyle(DEFAULT, TEXT_SIZE)/guiFont.baseSize; - - int lastSpaceIndex = 0; - bool tempWrapCharMode = false; - - int textOffsetY = 0; - float textOffsetX = 0.0f; - float glyphWidth = 0; - - float ellipsisWidth = GetTextWidth("..."); - bool overflowReached = false; - for (int c = 0, codepointSize = 0; c < lineSize; c += codepointSize) - { - int codepoint = GetCodepointNext(&lines[i][c], &codepointSize); - int index = GetGlyphIndex(guiFont, codepoint); - - // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f) - // but we need to draw all of the bad bytes using the '?' symbol moving one byte - if (codepoint == 0x3f) codepointSize = 1; // TODO: Review not recognized codepoints size - - // Get glyph width to check if it goes out of bounds - if (guiFont.glyphs[index].advanceX == 0) glyphWidth = ((float)guiFont.recs[index].width*scaleFactor); - else glyphWidth = (float)guiFont.glyphs[index].advanceX*scaleFactor; - - // Wrap mode text measuring, to validate if - // it can be drawn or a new line is required - if (wrapMode == TEXT_WRAP_CHAR) - { - // Jump to next line if current character reach end of the box limits - if ((textOffsetX + glyphWidth) > textBounds.width - textBoundsWidthOffset) - { - textOffsetX = 0.0f; - textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); - - if (tempWrapCharMode) // Wrap at char level when too long words - { - wrapMode = TEXT_WRAP_WORD; - tempWrapCharMode = false; - } - } - } - else if (wrapMode == TEXT_WRAP_WORD) - { - if (codepoint == 32) lastSpaceIndex = c; - - // Get width to next space in line - int nextSpaceIndex = 0; - float nextSpaceWidth = GetNextSpaceWidth(lines[i] + c, &nextSpaceIndex); - - int nextSpaceIndex2 = 0; - float nextWordSize = GetNextSpaceWidth(lines[i] + lastSpaceIndex + 1, &nextSpaceIndex2); - - if (nextWordSize > textBounds.width - textBoundsWidthOffset) - { - // Considering the case the next word is longer than bounds - tempWrapCharMode = true; - wrapMode = TEXT_WRAP_CHAR; - } - else if ((textOffsetX + nextSpaceWidth) > textBounds.width - textBoundsWidthOffset) - { - textOffsetX = 0.0f; - textOffsetY += GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); - } - } - - if (codepoint == '\n') break; // WARNING: Lines are already processed manually, no need to keep drawing after this codepoint - else - { - // TODO: There are multiple types of spaces in Unicode, - // maybe it's a good idea to add support for more: http://jkorpela.fi/chars/spaces.html - if ((codepoint != ' ') && (codepoint != '\t')) // Do not draw codepoints with no glyph - { - if (wrapMode == TEXT_WRAP_NONE) - { - // Draw only required text glyphs fitting the textBounds.width - if (textSizeX > textBounds.width) - { - if (textOffsetX <= (textBounds.width - glyphWidth - textBoundsWidthOffset - ellipsisWidth)) - { - DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - else if (!overflowReached) - { - overflowReached = true; - - for (int j = 0; j < ellipsisWidth; j += ellipsisWidth/3) - { - DrawTextCodepoint(guiFont, '.', RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX + j, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - } - } - else - { - DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - } - else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) - { - // Draw only glyphs inside the bounds - if ((textBoundsPosition.y + textOffsetY) <= (textBounds.y + textBounds.height - GuiGetStyle(DEFAULT, TEXT_SIZE))) - { - DrawTextCodepoint(guiFont, codepoint, RAYGUI_CLITERAL(Vector2){ textBoundsPosition.x + textOffsetX, textBoundsPosition.y + textOffsetY }, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), GuiFade(tint, guiAlpha)); - } - } - } - - if (guiFont.glyphs[index].advanceX == 0) textOffsetX += ((float)guiFont.recs[index].width*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - else textOffsetX += ((float)guiFont.glyphs[index].advanceX*scaleFactor + (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - } - } - - if (wrapMode == TEXT_WRAP_NONE) posOffsetY += (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING); - else if ((wrapMode == TEXT_WRAP_CHAR) || (wrapMode == TEXT_WRAP_WORD)) posOffsetY += (textOffsetY + (float)GuiGetStyle(DEFAULT, TEXT_LINE_SPACING)); - //--------------------------------------------------------------------------------- - } - -#if defined(RAYGUI_DEBUG_TEXT_BOUNDS) - GuiDrawRectangle(textBounds, 0, WHITE, Fade(BLUE, 0.4f)); -#endif -} - -// Gui draw rectangle using default raygui plain style with borders -static void GuiDrawRectangle(Rectangle rec, int borderWidth, Color borderColor, Color color) -{ - if (color.a > 0) - { - // Draw rectangle filled with color - DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, GuiFade(color, guiAlpha)); - } - - if (borderWidth > 0) - { - // Draw rectangle border lines with color - DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha)); - DrawRectangle((int)rec.x, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha)); - DrawRectangle((int)rec.x + (int)rec.width - borderWidth, (int)rec.y + borderWidth, borderWidth, (int)rec.height - 2*borderWidth, GuiFade(borderColor, guiAlpha)); - DrawRectangle((int)rec.x, (int)rec.y + (int)rec.height - borderWidth, (int)rec.width, borderWidth, GuiFade(borderColor, guiAlpha)); - } - -#if defined(RAYGUI_DEBUG_RECS_BOUNDS) - DrawRectangle((int)rec.x, (int)rec.y, (int)rec.width, (int)rec.height, Fade(RED, 0.4f)); -#endif -} - -// Draw tooltip using control bounds -static void GuiTooltip(Rectangle controlRec) -{ - if (!guiLocked && guiTooltip && (guiTooltipPtr != NULL) && !guiControlExclusiveMode) - { - Vector2 textSize = MeasureTextEx(GuiGetFont(), guiTooltipPtr, (float)GuiGetStyle(DEFAULT, TEXT_SIZE), (float)GuiGetStyle(DEFAULT, TEXT_SPACING)); - - if ((controlRec.x + textSize.x + 16) > GetScreenWidth()) controlRec.x -= (textSize.x + 16 - controlRec.width); - - GuiPanel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, NULL); - - int textPadding = GuiGetStyle(LABEL, TEXT_PADDING); - int textAlignment = GuiGetStyle(LABEL, TEXT_ALIGNMENT); - GuiSetStyle(LABEL, TEXT_PADDING, 0); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); - GuiLabel(RAYGUI_CLITERAL(Rectangle){ controlRec.x, controlRec.y + controlRec.height + 4, textSize.x + 16, GuiGetStyle(DEFAULT, TEXT_SIZE) + 8.f }, guiTooltipPtr); - GuiSetStyle(LABEL, TEXT_ALIGNMENT, textAlignment); - GuiSetStyle(LABEL, TEXT_PADDING, textPadding); - } -} - -// Split controls text into multiple strings -// Also check for multiple columns (required by GuiToggleGroup()) -static const char **GuiTextSplit(const char *text, char delimiter, int *count, int *textRow) -{ - // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter) - // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated, - // all used memory is static... it has some limitations: - // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS - // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE - // NOTE: Those definitions could be externally provided if required - - // TODO: HACK: GuiTextSplit() - Review how textRows are returned to user - // textRow is an externally provided array of integers that stores row number for every splitted string - - #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS) - #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128 - #endif - #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE) - #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024 - #endif - - static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; // String pointers array (points to buffer data) - static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; // Buffer data (text input copy with '\0' added) - memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE); - - result[0] = buffer; - int counter = 1; - - if (textRow != NULL) textRow[0] = 0; - - // Count how many substrings we have on text and point to every one - for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++) - { - buffer[i] = text[i]; - if (buffer[i] == '\0') break; - else if ((buffer[i] == delimiter) || (buffer[i] == '\n')) - { - result[counter] = buffer + i + 1; - - if (textRow != NULL) - { - if (buffer[i] == '\n') textRow[counter] = textRow[counter - 1] + 1; - else textRow[counter] = textRow[counter - 1]; - } - - buffer[i] = '\0'; // Set an end of string at this point - - counter++; - if (counter > RAYGUI_TEXTSPLIT_MAX_ITEMS) break; - } - } - - *count = counter; - - return result; -} - -// Convert color data from RGB to HSV -// NOTE: Color data should be passed normalized -static Vector3 ConvertRGBtoHSV(Vector3 rgb) -{ - Vector3 hsv = { 0 }; - float min = 0.0f; - float max = 0.0f; - float delta = 0.0f; - - min = (rgb.x < rgb.y)? rgb.x : rgb.y; - min = (min < rgb.z)? min : rgb.z; - - max = (rgb.x > rgb.y)? rgb.x : rgb.y; - max = (max > rgb.z)? max : rgb.z; - - hsv.z = max; // Value - delta = max - min; - - if (delta < 0.00001f) - { - hsv.y = 0.0f; - hsv.x = 0.0f; // Undefined, maybe NAN? - return hsv; - } - - if (max > 0.0f) - { - // NOTE: If max is 0, this divide would cause a crash - hsv.y = (delta/max); // Saturation - } - else - { - // NOTE: If max is 0, then r = g = b = 0, s = 0, h is undefined - hsv.y = 0.0f; - hsv.x = 0.0f; // Undefined, maybe NAN? - return hsv; - } - - // NOTE: Comparing float values could not work properly - if (rgb.x >= max) hsv.x = (rgb.y - rgb.z)/delta; // Between yellow & magenta - else - { - if (rgb.y >= max) hsv.x = 2.0f + (rgb.z - rgb.x)/delta; // Between cyan & yellow - else hsv.x = 4.0f + (rgb.x - rgb.y)/delta; // Between magenta & cyan - } - - hsv.x *= 60.0f; // Convert to degrees - - if (hsv.x < 0.0f) hsv.x += 360.0f; - - return hsv; -} - -// Convert color data from HSV to RGB -// NOTE: Color data should be passed normalized -static Vector3 ConvertHSVtoRGB(Vector3 hsv) -{ - Vector3 rgb = { 0 }; - float hh = 0.0f, p = 0.0f, q = 0.0f, t = 0.0f, ff = 0.0f; - long i = 0; - - // NOTE: Comparing float values could not work properly - if (hsv.y <= 0.0f) - { - rgb.x = hsv.z; - rgb.y = hsv.z; - rgb.z = hsv.z; - return rgb; - } - - hh = hsv.x; - if (hh >= 360.0f) hh = 0.0f; - hh /= 60.0f; - - i = (long)hh; - ff = hh - i; - p = hsv.z*(1.0f - hsv.y); - q = hsv.z*(1.0f - (hsv.y*ff)); - t = hsv.z*(1.0f - (hsv.y*(1.0f - ff))); - - switch (i) - { - case 0: - { - rgb.x = hsv.z; - rgb.y = t; - rgb.z = p; - } break; - case 1: - { - rgb.x = q; - rgb.y = hsv.z; - rgb.z = p; - } break; - case 2: - { - rgb.x = p; - rgb.y = hsv.z; - rgb.z = t; - } break; - case 3: - { - rgb.x = p; - rgb.y = q; - rgb.z = hsv.z; - } break; - case 4: - { - rgb.x = t; - rgb.y = p; - rgb.z = hsv.z; - } break; - case 5: - default: - { - rgb.x = hsv.z; - rgb.y = p; - rgb.z = q; - } break; - } - - return rgb; -} - -// Scroll bar control (used by GuiScrollPanel()) -static int GuiScrollBar(Rectangle bounds, int value, int minValue, int maxValue) -{ - GuiState state = guiState; - - // Is the scrollbar horizontal or vertical? - bool isVertical = (bounds.width > bounds.height)? false : true; - - // The size (width or height depending on scrollbar type) of the spinner buttons - const int spinnerSize = GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)? - (isVertical? (int)bounds.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) : - (int)bounds.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH)) : 0; - - // Arrow buttons [<] [>] [∧] [∨] - Rectangle arrowUpLeft = { 0 }; - Rectangle arrowDownRight = { 0 }; - - // Actual area of the scrollbar excluding the arrow buttons - Rectangle scrollbar = { 0 }; - - // Slider bar that moves --[///]----- - Rectangle slider = { 0 }; - - // Normalize value - if (value > maxValue) value = maxValue; - if (value < minValue) value = minValue; - - int valueRange = maxValue - minValue; - if (valueRange <= 0) valueRange = 1; - - int sliderSize = GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_SIZE); - if (sliderSize < 1) sliderSize = 1; // TODO: Consider a minimum slider size - - // Calculate rectangles for all of the components - arrowUpLeft = RAYGUI_CLITERAL(Rectangle){ - (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), - (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), - (float)spinnerSize, (float)spinnerSize }; - - if (isVertical) - { - arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + bounds.height - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize }; - scrollbar = RAYGUI_CLITERAL(Rectangle){ bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), arrowUpLeft.y + arrowUpLeft.height, bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)), bounds.height - arrowUpLeft.height - arrowDownRight.height - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH) }; - - // Make sure the slider won't get outside of the scrollbar - sliderSize = (sliderSize >= scrollbar.height)? ((int)scrollbar.height - 2) : sliderSize; - slider = RAYGUI_CLITERAL(Rectangle){ - bounds.x + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), - scrollbar.y + (int)(((float)(value - minValue)/valueRange)*(scrollbar.height - sliderSize)), - bounds.width - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)), - (float)sliderSize }; - } - else // horizontal - { - arrowDownRight = RAYGUI_CLITERAL(Rectangle){ (float)bounds.x + bounds.width - spinnerSize - GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH), (float)spinnerSize, (float)spinnerSize }; - scrollbar = RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x + arrowUpLeft.width, bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING), bounds.width - arrowUpLeft.width - arrowDownRight.width - 2*GuiGetStyle(SCROLLBAR, BORDER_WIDTH), bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_PADDING)) }; - - // Make sure the slider won't get outside of the scrollbar - sliderSize = (sliderSize >= scrollbar.width)? ((int)scrollbar.width - 2) : sliderSize; - slider = RAYGUI_CLITERAL(Rectangle){ - scrollbar.x + (int)(((float)(value - minValue)/valueRange)*(scrollbar.width - sliderSize)), - bounds.y + GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING), - (float)sliderSize, - bounds.height - 2*(GuiGetStyle(SCROLLBAR, BORDER_WIDTH) + GuiGetStyle(SCROLLBAR, SCROLL_SLIDER_PADDING)) }; - } - - // Update control - //-------------------------------------------------------------------- - if ((state != STATE_DISABLED) && !guiLocked) - { - Vector2 mousePoint = GetMousePosition(); - - if (guiControlExclusiveMode) // Allows to keep dragging outside of bounds - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON) && - !CheckCollisionPointRec(mousePoint, arrowUpLeft) && - !CheckCollisionPointRec(mousePoint, arrowDownRight)) - { - if (CHECK_BOUNDS_ID(bounds, guiControlExclusiveRec)) - { - state = STATE_PRESSED; - - if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue); - else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue); - } - } - else - { - guiControlExclusiveMode = false; - guiControlExclusiveRec = RAYGUI_CLITERAL(Rectangle){ 0, 0, 0, 0 }; - } - } - else if (CheckCollisionPointRec(mousePoint, bounds)) - { - state = STATE_FOCUSED; - - // Handle mouse wheel - int wheel = (int)GetMouseWheelMove(); - if (wheel != 0) value += wheel; - - // Handle mouse button down - if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) - { - guiControlExclusiveMode = true; - guiControlExclusiveRec = bounds; // Store bounds as an identifier when dragging starts - - // Check arrows click - if (CheckCollisionPointRec(mousePoint, arrowUpLeft)) value -= valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - else if (CheckCollisionPointRec(mousePoint, arrowDownRight)) value += valueRange/GuiGetStyle(SCROLLBAR, SCROLL_SPEED); - else if (!CheckCollisionPointRec(mousePoint, slider)) - { - // If click on scrollbar position but not on slider, place slider directly on that position - if (isVertical) value = (int)(((float)(mousePoint.y - scrollbar.y - slider.height/2)*valueRange)/(scrollbar.height - slider.height) + minValue); - else value = (int)(((float)(mousePoint.x - scrollbar.x - slider.width/2)*valueRange)/(scrollbar.width - slider.width) + minValue); - } - - state = STATE_PRESSED; - } - - // Keyboard control on mouse hover scrollbar - /* - if (isVertical) - { - if (IsKeyDown(KEY_DOWN)) value += 5; - else if (IsKeyDown(KEY_UP)) value -= 5; - } - else - { - if (IsKeyDown(KEY_RIGHT)) value += 5; - else if (IsKeyDown(KEY_LEFT)) value -= 5; - } - */ - } - - // Normalize value - if (value > maxValue) value = maxValue; - if (value < minValue) value = minValue; - } - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - GuiDrawRectangle(bounds, GuiGetStyle(SCROLLBAR, BORDER_WIDTH), GetColor(GuiGetStyle(LISTVIEW, BORDER + state*3)), GetColor(GuiGetStyle(DEFAULT, BORDER_COLOR_DISABLED))); // Draw the background - - GuiDrawRectangle(scrollbar, 0, BLANK, GetColor(GuiGetStyle(BUTTON, BASE_COLOR_NORMAL))); // Draw the scrollbar active area background - GuiDrawRectangle(slider, 0, BLANK, GetColor(GuiGetStyle(SLIDER, BORDER + state*3))); // Draw the slider bar - - // Draw arrows (using icon if available) - if (GuiGetStyle(SCROLLBAR, ARROWS_VISIBLE)) - { -#if defined(RAYGUI_NO_ICONS) - GuiDrawText(isVertical? "^" : "<", - RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); - GuiDrawText(isVertical? "v" : ">", - RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(DROPDOWNBOX, TEXT + (state*3)))); -#else - GuiDrawText(isVertical? "#121#" : "#118#", - RAYGUI_CLITERAL(Rectangle){ arrowUpLeft.x, arrowUpLeft.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_UP_FILL / ICON_ARROW_LEFT_FILL - GuiDrawText(isVertical? "#120#" : "#119#", - RAYGUI_CLITERAL(Rectangle){ arrowDownRight.x, arrowDownRight.y, isVertical? bounds.width : bounds.height, isVertical? bounds.width : bounds.height }, - TEXT_ALIGN_CENTER, GetColor(GuiGetStyle(SCROLLBAR, TEXT + state*3))); // ICON_ARROW_DOWN_FILL / ICON_ARROW_RIGHT_FILL -#endif - } - //-------------------------------------------------------------------- - - return value; -} - -// Color fade-in or fade-out, alpha goes from 0.0f to 1.0f -// WARNING: It multiplies current alpha by alpha scale factor -static Color GuiFade(Color color, float alpha) -{ - if (alpha < 0.0f) alpha = 0.0f; - else if (alpha > 1.0f) alpha = 1.0f; - - Color result = { color.r, color.g, color.b, (unsigned char)(color.a*alpha) }; - - return result; -} - -#if defined(RAYGUI_STANDALONE) -// Returns a Color struct from hexadecimal value -static Color GetColor(int hexValue) -{ - Color color; - - color.r = (unsigned char)(hexValue >> 24) & 0xFF; - color.g = (unsigned char)(hexValue >> 16) & 0xFF; - color.b = (unsigned char)(hexValue >> 8) & 0xFF; - color.a = (unsigned char)hexValue & 0xFF; - - return color; -} - -// Returns hexadecimal value for a Color -static int ColorToInt(Color color) -{ - return (((int)color.r << 24) | ((int)color.g << 16) | ((int)color.b << 8) | (int)color.a); -} - -// Check if point is inside rectangle -static bool CheckCollisionPointRec(Vector2 point, Rectangle rec) -{ - bool collision = false; - - if ((point.x >= rec.x) && (point.x <= (rec.x + rec.width)) && - (point.y >= rec.y) && (point.y <= (rec.y + rec.height))) collision = true; - - return collision; -} - -// Formatting of text with variables to 'embed' -static const char *TextFormat(const char *text, ...) -{ - #if !defined(RAYGUI_TEXTFORMAT_MAX_SIZE) - #define RAYGUI_TEXTFORMAT_MAX_SIZE 256 - #endif - - static char buffer[RAYGUI_TEXTFORMAT_MAX_SIZE]; - - va_list args; - va_start(args, text); - vsprintf(buffer, text, args); - va_end(args); - - return buffer; -} - -// Draw rectangle with vertical gradient fill color -// NOTE: This function is only used by GuiColorPicker() -static void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2) -{ - Rectangle bounds = { (float)posX, (float)posY, (float)width, (float)height }; - DrawRectangleGradientEx(bounds, color1, color2, color2, color1); -} - -// Split string into multiple strings -const char **TextSplit(const char *text, char delimiter, int *count) -{ - // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter) - // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated, - // all used memory is static... it has some limitations: - // 1. Maximum number of possible split strings is set by RAYGUI_TEXTSPLIT_MAX_ITEMS - // 2. Maximum size of text to split is RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE - - #if !defined(RAYGUI_TEXTSPLIT_MAX_ITEMS) - #define RAYGUI_TEXTSPLIT_MAX_ITEMS 128 - #endif - #if !defined(RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE) - #define RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE 1024 - #endif - - static const char *result[RAYGUI_TEXTSPLIT_MAX_ITEMS] = { NULL }; - static char buffer[RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE] = { 0 }; - memset(buffer, 0, RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE); - - result[0] = buffer; - int counter = 0; - - if (text != NULL) - { - counter = 1; - - // Count how many substrings we have on text and point to every one - for (int i = 0; i < RAYGUI_TEXTSPLIT_MAX_TEXT_SIZE; i++) - { - buffer[i] = text[i]; - if (buffer[i] == '\0') break; - else if (buffer[i] == delimiter) - { - buffer[i] = '\0'; // Set an end of string at this point - result[counter] = buffer + i + 1; - counter++; - - if (counter == RAYGUI_TEXTSPLIT_MAX_ITEMS) break; - } - } - } - - *count = counter; - return result; -} - -// Get integer value from text -// NOTE: This function replaces atoi() [stdlib.h] -static int TextToInteger(const char *text) -{ - int value = 0; - int sign = 1; - - if ((text[0] == '+') || (text[0] == '-')) - { - if (text[0] == '-') sign = -1; - text++; - } - - for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); ++i) value = value*10 + (int)(text[i] - '0'); - - return value*sign; -} - -// Encode codepoint into UTF-8 text (char array size returned as parameter) -static const char *CodepointToUTF8(int codepoint, int *byteSize) -{ - static char utf8[6] = { 0 }; - int size = 0; - - if (codepoint <= 0x7f) - { - utf8[0] = (char)codepoint; - size = 1; - } - else if (codepoint <= 0x7ff) - { - utf8[0] = (char)(((codepoint >> 6) & 0x1f) | 0xc0); - utf8[1] = (char)((codepoint & 0x3f) | 0x80); - size = 2; - } - else if (codepoint <= 0xffff) - { - utf8[0] = (char)(((codepoint >> 12) & 0x0f) | 0xe0); - utf8[1] = (char)(((codepoint >> 6) & 0x3f) | 0x80); - utf8[2] = (char)((codepoint & 0x3f) | 0x80); - size = 3; - } - else if (codepoint <= 0x10ffff) - { - utf8[0] = (char)(((codepoint >> 18) & 0x07) | 0xf0); - utf8[1] = (char)(((codepoint >> 12) & 0x3f) | 0x80); - utf8[2] = (char)(((codepoint >> 6) & 0x3f) | 0x80); - utf8[3] = (char)((codepoint & 0x3f) | 0x80); - size = 4; - } - - *byteSize = size; - - return utf8; -} - -// Get next codepoint in a UTF-8 encoded text, scanning until '\0' is found -// When a invalid UTF-8 byte is encountered we exit as soon as possible and a '?'(0x3f) codepoint is returned -// Total number of bytes processed are returned as a parameter -// NOTE: the standard says U+FFFD should be returned in case of errors -// but that character is not supported by the default font in raylib -static int GetCodepointNext(const char *text, int *codepointSize) -{ - const char *ptr = text; - int codepoint = 0x3f; // Codepoint (defaults to '?') - *codepointSize = 1; - - // Get current codepoint and bytes processed - if (0xf0 == (0xf8 & ptr[0])) - { - // 4 byte UTF-8 codepoint - if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80) || ((ptr[3] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks - codepoint = ((0x07 & ptr[0]) << 18) | ((0x3f & ptr[1]) << 12) | ((0x3f & ptr[2]) << 6) | (0x3f & ptr[3]); - *codepointSize = 4; - } - else if (0xe0 == (0xf0 & ptr[0])) - { - // 3 byte UTF-8 codepoint */ - if (((ptr[1] & 0xC0) ^ 0x80) || ((ptr[2] & 0xC0) ^ 0x80)) { return codepoint; } //10xxxxxx checks - codepoint = ((0x0f & ptr[0]) << 12) | ((0x3f & ptr[1]) << 6) | (0x3f & ptr[2]); - *codepointSize = 3; - } - else if (0xc0 == (0xe0 & ptr[0])) - { - // 2 byte UTF-8 codepoint - if ((ptr[1] & 0xC0) ^ 0x80) { return codepoint; } //10xxxxxx checks - codepoint = ((0x1f & ptr[0]) << 6) | (0x3f & ptr[1]); - *codepointSize = 2; - } - else if (0x00 == (0x80 & ptr[0])) - { - // 1 byte UTF-8 codepoint - codepoint = ptr[0]; - *codepointSize = 1; - } - - return codepoint; -} -#endif // RAYGUI_STANDALONE - -#endif // RAYGUI_IMPLEMENTATION diff --git a/raylib-src/old-raygui-src/raygui.so b/raylib-src/old-raygui-src/raygui.so deleted file mode 100755 index 7ffcb0770bd8ddf5792ac3b100285c5dbc461f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1320304 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%0A8);{WLLb!$18_@cDp#as4FFSE>6x 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�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%0A9}jnl-oWVam%qyXNP}WI@Bu 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ˋ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 diff --git a/src/main.c b/src/main.c index 7b9286c..e99683e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,8 @@ // DoppelspaltApp.c -#include -#include +#include "raylib.h" +#include "raymath.h" +#include #include typedef struct { @@ -21,6 +22,9 @@ static int active_id = -1; #define SLIDER_THICKNESS 20.0f #define SLIDER_GRIP_SIZE 10.0f + +#define M_PI 3.14159 + // Helper functions for clamping and interpolation static float clampf(float value, float min, float max) { return (value < min) ? min : (value > max) ? max : value; @@ -75,7 +79,6 @@ static void slider(int id, Rectangle bounds, float *value, float min, float max, void DrawKugelwelle(int x, int y, int breite, int hoehe, AppState* state, Color color) { - const int apertur = 90; int s0; double phi = (state->winkel - 90) * PI / 180.0; @@ -329,6 +332,8 @@ int main(void) { //int windowBoxHeight = GetScreenWidth() / 8; int windowBoxHeight = 150; + + // Define ratios based on the provided values float ratioSpacing = 6.0f / windowBoxHeight; // Ratio for slider spacing float ratioHeight = 20.0f / windowBoxHeight; // Ratio for slider height @@ -343,6 +348,39 @@ int main(void) { int sliderBeginY = (int)(ratioBeginY * windowBoxHeight); + Rectangle windowBoxBounds = {0.0f, (float)(GetScreenHeight() - windowBoxHeight), (float)GetScreenWidth(), (float)windowBoxHeight}; + + Rectangle boundsLambda = { (float)sliderBeginY, windowBoxBounds.y, windowBoxBounds.width - (float)displayText - (float)sliderBeginY, (float)(sliderHeight - windowBoxHeight / 3)}; + + Rectangle boundsD = { (float)sliderBeginY, boundsLambda.y + (float)sliderHeight + (float)sliderSpacing, windowBoxBounds.width - (float)displayText - (float)sliderBeginY, (float)(sliderHeight - windowBoxHeight / 3)}; + + Rectangle boundsWinkel = { (float)sliderBeginY, boundsD.y + (float)sliderHeight + (float)sliderSpacing, windowBoxBounds.width - (float)displayText - (float)sliderBeginY, (float)(sliderHeight - windowBoxHeight / 3)}; + + + + + + + + + + + + + + + + + + + + + + + + + /* + // Define bounds for the window box (bottom of the screen) Rectangle windowBoxBounds = {0, GetScreenHeight() - windowBoxHeight, GetScreenWidth(), windowBoxHeight}; @@ -351,7 +389,7 @@ int main(void) { Rectangle boundsD = { sliderBeginY, boundsLambda.y + sliderHeight + sliderSpacing, windowBoxBounds.width - displayText - sliderBeginY, sliderHeight - windowBoxHeight / 3 }; Rectangle boundsWinkel = { sliderBeginY, boundsD.y + sliderHeight + sliderSpacing, windowBoxBounds.width - displayText - sliderBeginY, sliderHeight - windowBoxHeight / 3 }; - +*/ // Werte in AppState aktualisieren state.lambda = (int)valueLambda; @@ -364,6 +402,7 @@ int main(void) { + /* Rectangle whiteRect = { .x = 0, .y = 0, @@ -371,8 +410,12 @@ int main(void) { .width = GetScreenWidth() / 3, }; - - + */ + Rectangle whiteRect; + whiteRect.x = 0; + whiteRect.y = 0; + whiteRect.height = GetScreenHeight(); + whiteRect.width = GetScreenWidth() / 3;