Top Related Projects
Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
A single-header ANSI C immediate mode cross-platform GUI library
A single-header ANSI C gui library
Simple and portable (but not inflexible) GUI library in C that uses the native GUI technologies of each platform it supports.
A tiny immediate-mode UI library
Quick Overview
raygui is a simple and easy-to-use immediate-mode GUI library for raylib. It provides a set of functions to create GUI controls like buttons, sliders, and text boxes, allowing developers to quickly build user interfaces for their raylib-based applications. The library is designed to be lightweight and compatible with raylib's philosophy of simplicity.
Pros
- Easy integration with raylib projects
- Lightweight and minimal dependencies
- Customizable appearance through styles
- Cross-platform compatibility
Cons
- Limited advanced GUI features compared to more comprehensive libraries
- Immediate-mode GUI can be less efficient for complex layouts
- Documentation could be more extensive
Code Examples
- Creating a button:
if (GuiButton((Rectangle){ 100, 100, 120, 40 }, "Click me!")) {
// Button clicked action
}
- Creating a slider:
static float value = 50.0f;
GuiSlider((Rectangle){ 100, 200, 120, 20 }, "Slider", TextFormat("%2.1f", value), &value, 0, 100);
- Creating a checkbox:
static bool checked = false;
GuiCheckBox((Rectangle){ 100, 300, 20, 20 }, "Check me", &checked);
Getting Started
-
Include raygui in your project:
#define RAYGUI_IMPLEMENTATION #include "raygui.h"
-
Initialize raylib and create a window:
InitWindow(800, 450, "raygui example");
-
Use raygui functions in your main loop:
while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); // Your raygui controls here EndDrawing(); }
-
Close the window when done:
CloseWindow();
Competitor Comparisons
Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
Pros of ImGui
- More feature-rich and mature, with extensive documentation and examples
- Highly customizable and flexible, supporting various rendering backends
- Large and active community, resulting in frequent updates and third-party extensions
Cons of ImGui
- Steeper learning curve due to its extensive feature set
- Requires more setup and integration work compared to raygui's simplicity
- Higher memory footprint and potential performance overhead for complex UIs
Code Comparison
ImGui:
ImGui::Begin("My Window");
ImGui::Text("Hello, world!");
if (ImGui::Button("Click me!"))
doSomething();
ImGui::End();
raygui:
GuiWindowBox((Rectangle){ 10, 10, 200, 100 }, "My Window");
GuiLabel((Rectangle){ 20, 40, 180, 20 }, "Hello, world!");
if (GuiButton((Rectangle){ 20, 70, 180, 20 }, "Click me!"))
doSomething();
Key Differences
- ImGui uses a more immediate-mode approach, while raygui is closer to retained-mode GUI
- raygui is designed specifically for Raylib integration, while ImGui is more versatile
- ImGui offers more advanced features like docking and multi-viewport support
- raygui has a simpler API and is easier to get started with for beginners
A single-header ANSI C immediate mode cross-platform GUI library
Pros of Nuklear
- More extensive widget set and customization options
- Better cross-platform support, including game consoles
- Smaller memory footprint and faster performance
Cons of Nuklear
- Steeper learning curve due to more complex API
- Less beginner-friendly documentation
- Requires more manual setup and configuration
Code Comparison
Nuklear:
struct nk_context ctx;
nk_init_default(&ctx, 0);
if (nk_begin(&ctx, "Demo", nk_rect(50, 50, 200, 200), NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
{
nk_layout_row_dynamic(&ctx, 30, 1);
if (nk_button_label(&ctx, "Button")) {
// Button pressed
}
}
nk_end(&ctx);
raygui:
if (GuiButton((Rectangle){ 50, 50, 200, 30 }, "Button"))
{
// Button pressed
}
The code comparison shows that Nuklear requires more setup and configuration, while raygui offers a simpler, more straightforward API for basic UI elements. Nuklear provides more control over window properties and layout, but at the cost of increased complexity.
A single-header ANSI C gui library
Pros of Nuklear
- More comprehensive feature set, including advanced widgets and layout options
- Highly customizable and flexible, allowing for deeper integration with existing codebases
- Better cross-platform support, including mobile devices
Cons of Nuklear
- Steeper learning curve due to its more complex API
- Larger codebase and potentially higher memory footprint
- Less beginner-friendly documentation compared to raygui
Code Comparison
Nuklear example:
struct nk_context ctx;
nk_init_default(&ctx, 0);
if (nk_begin(&ctx, "Demo", nk_rect(50, 50, 200, 200),
NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE|
NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE))
{
nk_layout_row_dynamic(&ctx, 30, 1);
if (nk_button_label(&ctx, "Button")) {
// Button pressed
}
}
nk_end(&ctx);
raygui example:
if (GuiButton((Rectangle){ 50, 50, 100, 30 }, "Button")) {
// Button pressed
}
The code comparison shows that Nuklear requires more setup and has a more verbose API, while raygui offers a simpler, more straightforward approach for basic UI elements. Nuklear's example demonstrates its flexibility with window creation and styling options, which are not as readily available in raygui's simpler API.
Simple and portable (but not inflexible) GUI library in C that uses the native GUI technologies of each platform it supports.
Pros of libui
- Cross-platform native UI toolkit for C
- Supports multiple programming languages through bindings
- Provides a more comprehensive set of UI controls and layouts
Cons of libui
- Less active development and maintenance
- Steeper learning curve for beginners
- Larger codebase and more complex architecture
Code Comparison
libui:
uiInit(NULL);
uiWindow *window = uiNewWindow("Hello", 300, 200, 0);
uiButton *button = uiNewButton("Click Me");
uiWindowSetChild(window, uiControl(button));
uiControlShow(uiControl(window));
uiMain();
raygui:
InitWindow(300, 200, "Hello");
while (!WindowShouldClose()) {
BeginDrawing();
if (GuiButton((Rectangle){100, 80, 100, 40}, "Click Me")) {
// Handle click
}
EndDrawing();
}
Summary
While libui offers a more comprehensive native UI toolkit with cross-platform support and language bindings, raygui provides a simpler, more lightweight solution that integrates seamlessly with raylib. libui may be better suited for complex applications requiring native look and feel, while raygui excels in rapid prototyping and game development scenarios.
A tiny immediate-mode UI library
Pros of microui
- Extremely lightweight and minimalistic (single-file implementation)
- Easy to integrate into existing projects due to its simplicity
- No external dependencies, making it highly portable
Cons of microui
- Limited set of UI elements compared to raygui's more comprehensive offering
- Less actively maintained, with fewer recent updates
- Lacks some advanced features and customization options present in raygui
Code Comparison
microui:
mu_begin(ctx);
if (mu_button(ctx, "Hello")) {
printf("Hello\n");
}
mu_end(ctx);
raygui:
GuiSetStyle(DEFAULT, TEXT_SIZE, 20);
if (GuiButton((Rectangle){ 50, 50, 100, 30 }, "Hello")) {
printf("Hello\n");
}
Summary
microui is a minimalist immediate mode GUI library, ideal for simple projects or those requiring a lightweight solution. raygui offers a more feature-rich and actively maintained alternative, suitable for more complex applications with diverse UI needs. While microui excels in simplicity and ease of integration, raygui provides a broader range of UI elements and customization options.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
raygui is a simple and easy-to-use immediate-mode-gui library.
raygui
was originally inspired by Unity IMGUI (immediate mode GUI API).
raygui
was designed as an auxiliary module for raylib to create simple GUI interfaces using raylib graphic style (simple colors, plain rectangular shapes, wide borders...) but it can be adapted to other engines/frameworks.
raygui
is intended for tools development; it has already been used to develop multiple published tools.
WARNING: Latest raygui
from master branch is always aligned with latest raylib
from master branch. Make sure to use the appropiate versions.
WARNING: Latest raygui 4.0
is an API-BREAKING redesign from previous versions (3.x), now all functions are more consistent and coherent, you can read the details about this breaking change in issue 283
NOTE: raygui is a single-file header-only library (despite its internal dependency on raylib), so, functions definition AND implementation reside in the same file raygui.h
, when including raygui.h
in a module, RAYGUI_IMPLEMENTATION
must be previously defined to include the implementation part of raygui.h
BUT only in one compilation unit, other modules could also include raygui.h
but RAYGUI_IMPLEMENTATION
must not be defined again.
features
- Immediate-mode gui, no retained data
- +25 controls provided (basic and advanced)
- Powerful styling system for colors, font and metrics
- Standalone usage mode supported (for other graphic libs)
- Icons support, embedding a complete 1-bit icons pack
- Multiple tools provided for raygui development
code sample
#include "raylib.h"
#define RAYGUI_IMPLEMENTATION
#include "raygui.h"
int main()
{
InitWindow(400, 200, "raygui - controls test suite");
SetTargetFPS(60);
bool showMessageBox = false;
while (!WindowShouldClose())
{
// Draw
//----------------------------------------------------------------------------------
BeginDrawing();
ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
if (GuiButton((Rectangle){ 24, 24, 120, 30 }, "#191#Show Message")) showMessageBox = true;
if (showMessageBox)
{
int result = GuiMessageBox((Rectangle){ 85, 70, 250, 100 },
"#191#Message Box", "Hi! This is a message!", "Nice;Cool");
if (result >= 0) showMessageBox = false;
}
EndDrawing();
}
CloseWindow();
return 0;
}
raygui controls
basic controls
Label | Button | LabelButton | Toggle | ToggleGroup | ToggleSlider
CheckBox | ComboBox | DropdownBox | TextBox | ValueBox | Spinner
Slider | SliderBar | ProgressBar | StatusBar | DummyRec | Grid
container/separator controls
WindowBox | GroupBox | Line | Panel | ScrollPanel | TabBar
advanced controls
ListView | ColorPicker | MessageBox | TextInputBox
raygui styles
raygui
comes with a default style automatically loaded at runtime:
Some additional styles are also provided for convenience, just check styles directory for details:
Custom styles can also be created very easily using rGuiStyler tool.
Styles can be loaded at runtime using raygui GuiLoadStyle()
function. Simple and easy-to-use.
raygui icons
raygui
supports custom icons, by default, a predefined set of icons is provided inside raygui
as an array of binary data; it contains 256 possible icons defined as 16x16 pixels each; each pixel is codified using 1-bit. The total size of the array is 2048 bytes
.
To use any of those icons just prefix the #iconId# number to any text written within raygui
controls:
if (GuiButton(rec, "#05#Open Image")) { /* ACTION */ }
It's also possible to use the provided GuiIconText()
function to prefix it automatically, using a clearer identifier (defined in raygui.h
).
if (GuiButton(rec, GuiIconText(RICON_FILE_OPEN, "Open Image"))) { /* ACTION */ }
Provided set of icons can be reviewed and customized using rGuiIcons tool.
raygui support tools
-
rGuiStyler - A simple and easy-to-use raygui styles editor.
-
rGuiIcons - A simple and easy-to-use raygui icons editor.
-
rGuiLayout - A simple and easy-to-use raygui layouts editor.
building
raygui
is intended to be used as a portable single-file header-only library, to be directly integrated into any C/C++ codebase but some users could require a shared/dynamic version of the library, for example, to create bindings:
- Windows (MinGW, GCC)
copy src/raygui.h src/raygui.c
gcc -o src/raygui.dll src/raygui.c -shared -DRAYGUI_IMPLEMENTATION -DBUILD_LIBTYPE_SHARED -static-libgcc -lopengl32 -lgdi32 -lwinmm -Wl,--out-implib,src/librayguidll.a
- Windows (MSVC)
copy src\raygui.h src\raygui.c
cl /O2 /I../raylib/src/ /D_USRDLL /D_WINDLL /DRAYGUI_IMPLEMENTATION /DBUILD_LIBTYPE_SHARED src/raygui.c /LD /Feraygui.dll /link /LIBPATH ../raylib/build/raylib/Release/raylib.lib /subsystem:windows /machine:x64
- Linux (GCC)
mv src/raygui.h src/raygui.c
gcc -o raygui.so src/raygui.c -shared -fpic -DRAYGUI_IMPLEMENTATION -lraylib -lGL -lm -lpthread -ldl -lrt -lX11
mv src/raygui.c src/raygui.h
- Mac (clang, homebrew installed raylib)
cp src/raygui.h src/raygui.c
brew install raylib
gcc -o raygui.dynlib src/raygui.c -shared -fpic -DRAYGUI_IMPLEMENTATION -framework OpenGL -lm -lpthread -ldl $(pkg-config --libs --cflags raylib)
license
raygui is licensed under an unmodified zlib/libpng license, which is an OSI-certified, BSD-like license that allows static linking with closed source software. Check LICENSE for further details.
Top Related Projects
Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
A single-header ANSI C immediate mode cross-platform GUI library
A single-header ANSI C gui library
Simple and portable (but not inflexible) GUI library in C that uses the native GUI technologies of each platform it supports.
A tiny immediate-mode UI library
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot