#ifndef gui_h #define gui_h #include "rect.h" struct App; struct Arena; struct GUI; struct Renderer; typedef enum { gui_el_type_btn, gui_el_type_scrollable, gui_el_type_scrollbar } GUI_El_Type; typedef struct GUI_El { GUI_El_Type type; struct GUI_El* next; Rect r; } GUI_El; typedef struct { GUI_El el; char* text; int hover, active; } GUI_Btn; typedef struct { int x, y; short grabbed[2]; short graboff[2]; } GUI_Scroll_State; typedef struct { GUI_El el; GUI_Scroll_State* s; Rect handle; int h; int hover, active; } GUI_Scrollbar; typedef void (*GUI_Scrollable_Draw_Fn)( struct GUI*, struct Renderer*, const Rect*, const GUI_Scroll_State* ); typedef struct { GUI_El el; GUI_Scrollable_Draw_Fn draw; GUI_Scroll_State* ss; int cs[2]; int vp[2]; } GUI_Scrollable; typedef struct GUI { const struct App* app; struct Arena* a; GUI_El* first, * prev; int cursor[2], pad; } GUI; int gui_text_width(const char* text, int len); int gui_text_height(void); void gui_begin(GUI* g, const struct App* app, struct Arena* a); void gui_end(GUI* g, struct Renderer* r); Rect gui_viewport(GUI* g); Rect gui_cut_left(Rect* a, int v); Rect gui_cut_right(Rect* a, int v); Rect gui_cut_down(Rect* a, int v); Rect gui_cut_up(Rect* a, int v); int gui_btn(GUI* g, Rect r, const char* text); void gui_scrollable( GUI* g, Rect r, const int* cs, GUI_Scroll_State* state, GUI_Scrollable_Draw_Fn fn ); void gui_scrollbar( GUI* g, GUI_Scroll_State* state, Rect r, int diff, int horizontal ); #endif