Skip to content

Dirt Simple C++ GUI Toolkit using GLFW, ImGui, and NanoVG

License

Notifications You must be signed in to change notification settings

deankeinan/mahi-gui

 
 

Repository files navigation

mahi-gui

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.

Integration

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.

Example Usage

// 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.

Requirements

  • C++17 compiler (MSVC or Clang)

Building for Windows

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

Building for macOS

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 .

About

Dirt Simple C++ GUI Toolkit using GLFW, ImGui, and NanoVG

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 99.9%
  • CMake 0.1%