level selector
[fishladder.git] / vg / vg_ui.h
index 35a3e3b8df9294a8ab30aac94f4d2d41a33bbb72..fe46da0040a8bcd795f9628134d3519d78807b63 100644 (file)
@@ -55,6 +55,26 @@ typedef i16                          ui_px;
 typedef u32                            ui_colour;
 typedef ui_px                          ui_rect[4];
 typedef struct ui_ctx  ui_ctx;
+typedef struct ui_colourset ui_colourset;
+
+struct ui_colourset
+{
+       union
+       {
+               struct
+               {
+                       ui_colour main;
+                       ui_colour hover;
+                       ui_colour active;
+               };
+               struct
+               {
+                       ui_colour background;
+                       ui_colour bar;
+                       ui_colour bar_hover;
+               };
+       };
+};
 
 struct ui_ctx
 {
@@ -96,6 +116,9 @@ struct ui_ctx
        // User input
        ui_px mouse[2];
        int click_state;        // 0: released, 1: on down, 2: pressed, 3: on release
+       
+       ui_colourset *colours_main;
+       ui_colourset *colours_current;
 };
 
 // Shortnames
@@ -105,7 +128,7 @@ struct ui_ctx
 #define gui_hasmouse(...) ui_hasmouse( &ui_global_ctx, __VA_ARGS__)
 #define gui_end() ui_end( &ui_global_ctx )
 #define gui_end_down() ui_end_down( &ui_global_ctx )
-#define gui_end_right() ui_fill_right( &ui_global_ctx )
+#define gui_end_right() ui_end_right( &ui_global_ctx )
 #define gui_fill_y() ui_fill_y( &ui_global_ctx)
 #define gui_fill_x() ui_fill_x( &ui_global_ctx)
 #define gui_align_bottom() ui_align_bottom( &ui_global_ctx )
@@ -127,6 +150,10 @@ struct ui_ctx
 #define gui_window(...) ui_window( &ui_global_ctx, __VA_ARGS__)
 #define gui_want_mouse() ui_want_mouse( &ui_global_ctx )
 
+#define gui_scrollbar(...) ui_scrollbar( &ui_global_ctx, __VA_ARGS__)
+#define gui_override_colours(...) ui_override_colours( &ui_global_ctx, __VA_ARGS__)
+#define gui_reset_colours(...) ui_reset_colours( &ui_global_ctx )
+
 // Globals
 // ===========================================================================================================
 
@@ -141,7 +168,16 @@ GLuint ui_ebo;
 #define UI_BUFFER_SIZE 30000
 #define UI_INDEX_SIZE 20000
 
-ui_ctx ui_global_ctx = { .padding = 8 };
+ui_colourset ui_default_colours = {
+       .main = 0xff00ff00,
+       .hover = 0xffff00ff,
+       .active = 0xffff0000
+};
+ui_ctx ui_global_ctx = { 
+       .padding = 8, 
+       .colours_current = &ui_default_colours, 
+       .colours_main = &ui_default_colours 
+};
 
 
 // Initialization
@@ -678,7 +714,7 @@ static int ui_button( ui_ctx *ctx, u32 id )
                
                if( ui_hasmouse(ctx) )
                {
-                       ui_fill_rect( ctx, ctx->cursor, 0xffcccccc );
+                       ui_fill_rect( ctx, ctx->cursor, ctx->colours_current->hover );
                        
                        if( ctx->click_state == 1 )
                        {
@@ -691,7 +727,7 @@ static int ui_button( ui_ctx *ctx, u32 id )
                                return k_button_hold;
                }
                else
-                       ui_fill_rect( ctx, ctx->cursor, 0xff999999 );
+                       ui_fill_rect( ctx, ctx->cursor, ctx->colours_current->main );
        }
        
        return k_button_released;
@@ -796,8 +832,8 @@ static void ui_scrollbar( ui_ctx *ctx, struct ui_scrollbar *scrollbar, u32 id )
        
        ui_new_node( ctx );
        {
-               ui_fill_rect( ctx, ctx->cursor, 0xff000000 );
-               ui_capture_mouse( ctx, __COUNTER__ );
+               ui_fill_rect( ctx, ctx->cursor, ctx->colours_current->background );
+               ui_capture_mouse( ctx, id );
                
                ctx->cursor[1] += scrollbar->py;
                ctx->cursor[3] = scrollbar->bar_height;
@@ -805,14 +841,14 @@ static void ui_scrollbar( ui_ctx *ctx, struct ui_scrollbar *scrollbar, u32 id )
                ui_new_node( ctx );
                {
                        ui_capture_mouse( ctx, __COUNTER__ );
-                       struct ui_vert *drag_bar = ui_fill_rect( ctx, ctx->cursor, 0xff555555 );
+                       struct ui_vert *drag_bar = ui_fill_rect( ctx, ctx->cursor, ctx->colours_current->bar );
 
                        if( ui_hasmouse( ctx ) || scrollbar->drag )
                        {
-                               drag_bar[0].colour = 0xff777777;
-                               drag_bar[1].colour = 0xff777777;
-                               drag_bar[2].colour = 0xff777777;
-                               drag_bar[3].colour = 0xff777777;
+                               drag_bar[0].colour = ctx->colours_current->bar_hover;
+                               drag_bar[1].colour = ctx->colours_current->bar_hover;
+                               drag_bar[2].colour = ctx->colours_current->bar_hover;
+                               drag_bar[3].colour = ctx->colours_current->bar_hover;
                        
                                // start drag
                                if( ctx->click_state == 1 )
@@ -834,3 +870,14 @@ static ui_px ui_calculate_content_scroll( struct ui_scrollbar *scrollbar, ui_px
        float range = scrollbar->view_height - scrollbar->bar_height;
        return ((float)scrollbar->py / range) * overlap;
 }
+
+static void ui_override_colours( ui_ctx *ctx, ui_colourset *set )
+{
+       ctx->colours_current = set;
+}
+
+static void ui_reset_colours( ui_ctx *ctx )
+{
+       ctx->colours_current = ctx->colours_main;
+       ctx->override_colour = 0xffffffff;
+}