# mahi-gui
**Repository Path**: studvc/mahi-gui
## Basic Information
- **Project Name**: mahi-gui
- **Description**: Dirt Simple C++ GUI Toolkit using GLFW, ImGui, and NanoVG
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-01-30
- **Last Updated**: 2021-09-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 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](https://www.glfw.org/)| Cross-platform windows, OpenGL contexts, and user input. |
|[glad](https://github.com/Dav1dde/glad)| OpenGL function loader. |
|[Dear ImGui](https://github.com/ocornut/imgui)| Immediate mode GUI toolkit for rapid prototyping. |
|[ImPlot](https://github.com/epezent/implot)| ImGui 2D plotting extension. |
|[NanoVG](https://github.com/memononen/nanovg)| Anti-aliased vector graphics with OpenGL. |
|[NanoSVG](https://github.com/memononen/nanosvg)| SVG loader and parser. |
|[Clipper](http://www.angusj.com/delphi/clipper.php)| Polygon clipping and offsetting. |
|[NFD](https://github.com/btzy/nativefiledialog-extended)| Native file open/save dialogs. |
|[mahi-util](https://github.com/mahilab/mahi-util)| Clocks, timers, coroutines, events, formatting, and more. |
### Integration
The library is small and intended to be used with CMake's [`FetchContent`](https://cmake.org/cmake/help/v3.11/module/FetchContent.html):
```cmake
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`](https://cmake.org/cmake/help/v3.11/module/FetchContent.html). You should also be able to install or use the library as a git-submodule + CMake subdirectory if you prefer.
### Example Usage
```cpp
// my_app.cpp
#include
#include
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](https://github.com/mahilab/mahi-gui/blob/master/examples/imgui_demo.cpp) which shows all of the functionality of the **ImGui** library. It calls the `ImGui::ShowDemoWindow()` function from [imgui_demo.cpp](https://github.com/mahilab/mahi-gui/blob/master/3rdparty/imgui/imgui_demo.cpp), which itself is the absolute best place for **ImGui** examples. For a real-world example, see [Syntacts' GUI](https://github.com/mahilab/Syntacts/tree/master/gui/src), 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:
```shell
> 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:
```shell
> cd mahi-gui
> mkdir build && cd build
> cmake .. -DCMAKE_BUILD_TYPE="Release"
> cmake --build .
```
If your Apple Clang compiler is too [old](https://en.wikipedia.org/wiki/Xcode#Version_comparison_table), you can use `LLVM Clang` to build `mahi-gui`. For example, using Clang 9.0.0 downloaded from [here](http://releases.llvm.org/download.html):
```shell
> 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 .
```