X-Git-Url: https://harrygodden.com/git/?p=fishladder.git;a=blobdiff_plain;f=vg%2Fvg_ui.h;fp=vg%2Fvg_ui.h;h=eb8c84eaaeaac3703a7f4f187e36338b421c1f53;hp=b8f826c297dc1a07ac51cd216f118707c3eac1a2;hb=bf818249690c5ae1a1e4634714dd2e722fa35632;hpb=bb4cab005a763f086a41686b18fa00a39914226f diff --git a/vg/vg_ui.h b/vg/vg_ui.h index b8f826c..eb8c84e 100644 --- a/vg/vg_ui.h +++ b/vg/vg_ui.h @@ -67,6 +67,14 @@ typedef ui_px ui_rect[4]; typedef struct ui_ctx ui_ctx; typedef struct ui_colourset ui_colourset; +// Relative to cursor p0 +enum ui_text_align +{ + k_text_align_left = 0, + k_text_align_right = 1, + k_text_align_center = 2 +}; + struct ui_colourset { union @@ -555,25 +563,46 @@ static struct ui_vert *ui_fill_rect( ui_ctx *ctx, ui_rect rect, u32 colour ) return ui_fill_rect_uv( ctx, rect, colour, (ui_px[4]){ 4,4, 4,4 } ); } -static void ui_text( ui_ctx *ctx, const char *str, ui_px scale ) +static ui_px ui_text_line_offset( const char *str, ui_px scale, enum ui_text_align align ) +{ + if( align == k_text_align_left ) + return 0; + + int length = 0; + const char *_c = str; + char c; + + while( (c = *(_c ++)) ) + if( c >= 32 && c <= 126 ) + length ++; + else if( c == '\n' ) + break; + + if( align == k_text_align_right ) + return -length * scale*8; + else + return (-length * scale*8) / 2; +} + +static void ui_text( ui_ctx *ctx, ui_px pos[2], const char *str, ui_px scale, enum ui_text_align align ) { ui_rect text_cursor; + u32 current_colour = 0x00ffffff; + + const char *_c = str; + char c; - text_cursor[0] = ctx->cursor[0]; - text_cursor[1] = ctx->cursor[1]; + text_cursor[0] = pos[0] + ui_text_line_offset( str, scale, align ); + text_cursor[1] = pos[1]; text_cursor[2] = 8*scale; text_cursor[3] = 14*scale; - u32 current_colour = 0x00ffffff; - - const char *_c = str; - char c; while( (c = *(_c ++)) ) { if( c == '\n' ) { text_cursor[1] += 14*scale; - text_cursor[0] = ctx->cursor[0]; + text_cursor[0] = ctx->cursor[0] + ui_text_line_offset( _c, scale, align ); continue; } else if( c >= 33 && c <= 126 ) @@ -758,7 +787,7 @@ static int ui_window( ui_ctx *ctx, struct ui_window *window, u32 control_group ) // title.. ctx->cursor[0] += 2; ctx->cursor[1] += 2; - ui_text( ctx, window->title, 2 ); + ui_text( ctx, ctx->cursor, window->title, 2, 0 ); // Close button ctx->cursor[3] = 25; @@ -772,7 +801,7 @@ static int ui_window( ui_ctx *ctx, struct ui_window *window, u32 control_group ) vg_info( "Click clacked\n" ); } ctx->cursor[0] += 2; - ui_text( ctx, "x", 2 ); + ui_text( ctx, ctx->cursor, "x", 2, 0 ); ui_end( ctx ); if( ui_hasmouse( ctx ) )