From 807c4b631fde4114df78dd282f033a0af4010897 Mon Sep 17 00:00:00 2001 From: vurtun Date: Mon, 11 May 2015 12:45:22 +0200 Subject: [PATCH] small update --- Readme.md | 10 ++++++++-- gui.h | 12 ++++++++++++ screen/config.png | Bin 6918 -> 7817 bytes screen/config2.png | Bin 7817 -> 0 bytes 4 files changed, 20 insertions(+), 2 deletions(-) delete mode 100644 screen/config2.png diff --git a/Readme.md b/Readme.md index 472a013..cd6ed54 100644 --- a/Readme.md +++ b/Readme.md @@ -15,10 +15,17 @@ possible with fast streamlined development speed in mind. - No direct dependencies (not even libc!) - Full memory management control - Renderer and platform independent -- Configurable +- Configurable style and colors - UTF-8 support +## Target Audience +- Graphical tools/editors +- Library testbed UI +- Game engine debugging UI +- Graphical overlays + ## Limitations +- Is NOT a layered Framework it is a component - Does NOT provide os window/input management - Does NOT provide a renderer backend - Does NOT implement a font library @@ -27,7 +34,6 @@ Summary: It is only responsible for the actual user interface ## Gallery ![gui screenshot](/screen/demo.png?raw=true) ![gui screenshot](/screen/config.png?raw=true) -![gui screenshot](/screen/config2.png?raw=true) ## Example ```c diff --git a/gui.h b/gui.h index 6e12696..11d74a4 100644 --- a/gui.h +++ b/gui.h @@ -10,6 +10,7 @@ extern "C" { #endif +/* Constants */ #define GUI_UTF_SIZE 4 #define GUI_INPUT_MAX 16 #define GUI_UTF_INVALID 0xFFFD @@ -18,6 +19,7 @@ extern "C" { #define GUI_HOOK_ATTR(T, name) struct T name #define GUI_HOOK_OUT gui_command_list +/* Types */ #ifdef GUI_USE_FIXED_TYPES #include typedef int32_t gui_int; @@ -49,6 +51,7 @@ typedef unsigned int gui_flag; typedef unsigned long gui_size; #endif +/* Utilities */ enum {gui_false, gui_true}; enum gui_heading {GUI_UP, GUI_RIGHT, GUI_DOWN, GUI_LEFT}; struct gui_color {gui_byte r,g,b,a;}; @@ -57,6 +60,7 @@ struct gui_rect {gui_float x,y,w,h;}; struct gui_key {gui_bool down, clicked;}; struct gui_font; +/* Callbacks */ typedef void* gui_image; typedef gui_char gui_glyph[GUI_UTF_SIZE]; typedef gui_bool(*gui_filter)(gui_long unicode); @@ -71,6 +75,8 @@ typedef void(*gui_draw_triangle)(void*, gui_float, gui_float, gui_float, gui_flo typedef void(*gui_draw_text)(void*, gui_float, gui_float, gui_float, gui_float, const gui_char*, gui_size, const struct gui_font*, struct gui_color, struct gui_color); + +/* Input */ enum gui_keys { GUI_KEY_SHIFT, GUI_KEY_CTRL, @@ -94,6 +100,8 @@ struct gui_input { struct gui_vec2 mouse_clicked_pos; }; + +/* Widgets */ enum gui_text_align { GUI_TEXT_LEFT, GUI_TEXT_CENTERED, @@ -207,6 +215,8 @@ struct gui_canvas { gui_draw_text draw_text; }; + +/* Buffer */ struct gui_memory { void *memory; gui_size size; @@ -329,6 +339,8 @@ struct gui_command_list { gui_size count; }; + +/* Panel */ enum gui_panel_colors { GUI_COLOR_TEXT, GUI_COLOR_PANEL, diff --git a/screen/config.png b/screen/config.png index eef247852c713c5b53ee3ae0fb043990d68157fe..5b6d0e77dd4081a4d01cf3abd05e2212fcc308a9 100644 GIT binary patch literal 7817 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