This library provides an lightweight, all-in-one package for making GUIs and 2D visualizations in C++. It bundles and wraps the following libraries into a neat interface, so you don't have to:
Library | Description |
---|---|
GLFW | Cross-platform windows, OpenGL contexts, and user input. |
glad | OpenGL function loader. |
Dear ImGui | Immediate mode GUI toolkit for rapid prototyping. |
ImPlot | ImGui 2D plotting extension. |
NanoVG | Anti-aliased vector graphics with OpenGL. |
NanoSVG | SVG loader and parser. |
Clipper | Polygon clipping and offsetting. |
NFD | Native file open/save dialogs. |
mahi-util | Clocks, timers, coroutines, events, formatting, and more. |
The library is small and intended to be used with CMake's FetchContent
:
include(FetchContent)
FetchContent_Declare(mahi-gui GIT_REPOSITORY https://github.com/mahilab/mahi-gui.git)
FetchContent_MakeAvailable(mahi-gui)
add_executable(my_app "my_app.cpp")
target_link_libraries(my_app mahi::gui)
That's it! If you want to stay on a particular commit of mahi-gui, use the GIT_TAG
option with FetchContent
. You should also be able to install or use the library as a git-submodule + CMake subdirectory if you prefer.
// my_app.cpp
#include <Mahi/Gui.hpp>
#include <Mahi/Util.hpp>
using namespace mahi::gui;
using namespace mahi::util;
// Inherit from Application
class MyApp : public Application {
public:
// 640x480 px window
MyApp() : Application(640,480,"My App") { }
// Override update (called once per frame)
void update() override {
// App logic and/or ImGui code goes here
ImGui::Begin("Example");
if (ImGui::Button("Press Me!"))
print("Hello, World!");
ImGui::End();
}
};
int main() {
MyApp app;
app.run();
return 0;
}
Run and consult the examples for other features. Pay particular attention to ex_imgui_demo.cpp which shows all of the functionality of the ImGui library. It calls the ImGui::ShowDemoWindow()
function from imgui_demo.cpp, which itself is the absolute best place for ImGui examples. For a real-world example, see Syntacts' GUI, which is built entirely using mahi gui.
- C++17 compiler (MSVC or Clang)
On Windows, we recommend using to MSVC 2019:
> cd mahi-gui
> mkdir build
> cd build
> cmake .. -G "Visual Studio 16 2019" -A x64
> cmake --build . --config Release
If you're on a relatively new version of macOS, you should be able to use the defeault Apple Clang compiler:
> cd mahi-gui
> mkdir build && cd build
> cmake .. -DCMAKE_BUILD_TYPE="Release"
> cmake --build .
If your Apple Clang compiler is too old, you can use LLVM Clang
to build mahi-gui
. For example, using Clang 9.0.0 downloaded from here:
> cd mahi-gui
> mkdir build && cd build
> cmake .. -DCMAKE_C_COMPILER="/path/to/clang/bin/clang" -DCMAKE_CXX_COMPILER="/path/to/clang/bin/clang++" -DCMAKE_BUILD_TYPE="Release"
> cmake --build .