2015-09-09 20:33:32 +03:00
|
|
|
# Zahnrad
|
2015-07-25 23:16:35 +03:00
|
|
|
[![Coverity Status](https://scan.coverity.com/projects/5863/badge.svg)](https://scan.coverity.com/projects/5863)
|
2015-07-25 22:32:37 +03:00
|
|
|
|
2015-11-19 23:02:36 +03:00
|
|
|
This is a minimal state immediate mode graphical user interface toolkit
|
2015-11-26 22:18:08 +03:00
|
|
|
written in ANSI C and licensed under zlib. It was designed as a simple embeddable user interface for
|
2015-09-17 18:31:43 +03:00
|
|
|
application and does not have any direct dependencies. It does not have
|
|
|
|
a default renderbackend, os window and input handling but instead provides a very modular
|
|
|
|
library approach by providing a simple input state storage for input and draw
|
|
|
|
commands describing primitive shapes as output. So instead of providing a
|
|
|
|
layered library that tries to abstract over a number of platform and
|
2015-11-19 23:02:36 +03:00
|
|
|
render backends it only focuses on the actual UI.
|
2015-03-11 16:00:59 +03:00
|
|
|
|
2015-03-14 19:05:30 +03:00
|
|
|
## Features
|
2015-04-16 17:20:00 +03:00
|
|
|
- Immediate mode graphical user interface toolkit
|
2015-03-14 19:05:30 +03:00
|
|
|
- Written in C89 (ANSI C)
|
2015-09-15 19:13:43 +03:00
|
|
|
- Small codebase (~8kLOC)
|
2015-05-17 15:39:02 +03:00
|
|
|
- Focus on portability, efficiency, simplicity and minimal internal state
|
|
|
|
- No global or hidden state
|
2015-09-15 19:13:43 +03:00
|
|
|
- No direct dependencies
|
2015-05-11 13:45:22 +03:00
|
|
|
- Configurable style and colors
|
2015-04-30 17:12:21 +03:00
|
|
|
- UTF-8 support
|
2015-03-24 15:08:42 +03:00
|
|
|
|
2015-11-19 23:02:36 +03:00
|
|
|
## Optional
|
2015-11-26 22:18:08 +03:00
|
|
|
- Vertex buffer output
|
|
|
|
- Font handling
|
2015-11-19 23:02:36 +03:00
|
|
|
|
|
|
|
## Building
|
2015-09-18 00:09:49 +03:00
|
|
|
The library is self-contained within four different files that only have to be
|
|
|
|
copied and compiled into your application. Files zahnrad.c and zahnrad.h make up
|
2015-09-17 18:31:43 +03:00
|
|
|
the core of the library, while stb_rect_pack.h and stb_truetype.h are
|
|
|
|
for a optional font handling implementation and can be removed if not needed.
|
2015-09-18 00:09:49 +03:00
|
|
|
- zahnrad.c
|
|
|
|
- zahnrad.h
|
2015-11-19 23:02:36 +03:00
|
|
|
- stb_rect_pack.h (optional)
|
|
|
|
- stb_truetype.h (optional)
|
2015-09-17 18:35:45 +03:00
|
|
|
|
2015-09-18 00:09:49 +03:00
|
|
|
There are no dependencies or a particular building process required. You just have
|
|
|
|
to compile the .c file and #include zahnrad.h into your project. To actually
|
2015-09-17 18:31:43 +03:00
|
|
|
run you have to provide the input state, configuration style and memory
|
|
|
|
for draw commands to the library. After the GUI was executed all draw commands
|
|
|
|
have to be either executed or optionally converted into a vertex buffer to
|
|
|
|
draw the GUI.
|
|
|
|
|
2015-05-09 16:22:23 +03:00
|
|
|
## Gallery
|
2015-11-20 15:47:46 +03:00
|
|
|
![screenshot](https://cloud.githubusercontent.com/assets/8057201/11300153/08473cca-8f8d-11e5-821b-b97228007b4d.png)
|
2015-11-19 23:02:36 +03:00
|
|
|
![demo](https://cloud.githubusercontent.com/assets/8057201/11282359/3325e3c6-8eff-11e5-86cb-cf02b0596087.png)
|
2015-09-19 18:59:10 +03:00
|
|
|
![node](https://cloud.githubusercontent.com/assets/8057201/9976995/e81ac04a-5ef7-11e5-872b-acd54fbeee03.gif)
|
2015-05-09 16:22:23 +03:00
|
|
|
|
2015-04-25 17:44:43 +03:00
|
|
|
## Example
|
|
|
|
```c
|
2015-08-05 13:48:01 +03:00
|
|
|
enum {EASY, HARD};
|
2015-12-01 12:50:12 +03:00
|
|
|
int option = EASY;
|
|
|
|
float value = 0.6f;
|
2015-06-28 11:09:53 +03:00
|
|
|
|
2015-11-19 23:02:36 +03:00
|
|
|
struct zr_context context;
|
2015-11-22 22:19:32 +03:00
|
|
|
zr_begin(&context, &window, "Show");
|
2015-11-19 23:02:36 +03:00
|
|
|
{
|
|
|
|
zr_layout_row_static(&context, 30, 80, 1);
|
|
|
|
if (zr_button_text(&context, "button", ZR_BUTTON_DEFAULT)) {
|
|
|
|
/* event handling */
|
2015-04-25 17:44:43 +03:00
|
|
|
}
|
2015-11-19 23:02:36 +03:00
|
|
|
zr_layout_row_dynamic(&context, 30, 2);
|
|
|
|
if (zr_option(&context, "easy", option == EASY)) option = EASY;
|
|
|
|
if (zr_option(&context, "hard", option == HARD)) option = HARD;
|
|
|
|
zr_label(&context, "Volume:", ZR_TEXT_LEFT);
|
|
|
|
zr_slider_float(&context, 0, &value, 1.0f, 0.1f);
|
|
|
|
zr_layout_row_end(&context);
|
2015-04-25 17:44:43 +03:00
|
|
|
}
|
2015-11-19 23:02:36 +03:00
|
|
|
zr_end(&context, &window);
|
2015-04-25 17:44:43 +03:00
|
|
|
```
|
2015-09-30 11:23:45 +03:00
|
|
|
![example](https://cloud.githubusercontent.com/assets/8057201/10187981/584ecd68-675c-11e5-897c-822ef534a876.png)
|
2015-04-25 17:44:43 +03:00
|
|
|
|
2015-11-26 22:18:08 +03:00
|
|
|
## Documentation
|
|
|
|
For code related documentation and information on how to link each single part to a whole I
|
|
|
|
would recommend reading the documentation inside the `zahnrad.h` header file wich has
|
|
|
|
information and descriptions about each part, struct, members and functions. In addition
|
|
|
|
I would especially recommend reading the examples and the demo.
|
|
|
|
|
|
|
|
If you want to dive into the example code I would recommand starting with `example/demo/demo.c`,
|
|
|
|
even if you don't know or want to use nanovg. It contains the usage code for every simple to use
|
|
|
|
core part of the library while providing a good looking UI. It also introduces a small set
|
|
|
|
of widgets while providing a simple example of how to do layouting.
|
|
|
|
|
|
|
|
As soon as you have a basic grip of how to use the library I would recommend looking at
|
|
|
|
`demo/demo.c`. It only contains the actual UI part of the GUI but offers example ussage
|
|
|
|
code for all widgets in the library. So it functions more as a reference to look how
|
|
|
|
a widget is supposed to be used.
|
|
|
|
|
|
|
|
On how to do the platform and render backend depended part I would recommend looking at
|
|
|
|
some example platform implementations for Win32 (`demo/win32/win32.c`) for windows and
|
|
|
|
X11 (`demo/x11.xlib.c`) for linux. Both provide the absolute minimum needed platform
|
|
|
|
dependend code without using any libraries. Finally for the most complex plaform demos
|
|
|
|
it is definitely worth it to read the OpenGL examples with `demo/sdl/sdl.c` for
|
|
|
|
zahnrad integration with SDL2, OpenGL and GLEW and `demo/glfw/glfw.c` for integration
|
|
|
|
with GLFW, OpenGL and GLEW. They also include usage code for the optional zahnrad font handling
|
|
|
|
and vertex buffer output.
|
|
|
|
|
|
|
|
The final two examples `example/filex/filex.c` and `example/nodedit/nodedit.c` both provide
|
|
|
|
actual example application use cases for this library. Filex is a simple file browser for Linux
|
|
|
|
and shows how to do window tiling. The node editor on the other hand is probably the more
|
|
|
|
interesting of the two since it shows how far you can bend this library to your
|
|
|
|
specific problem on hand.
|
|
|
|
|