text alignments
[fishladder.git] / vg / vg_ui.h
index b8f826c297dc1a07ac51cd216f118707c3eac1a2..eb8c84eaaeaac3703a7f4f187e36338b421c1f53 100644 (file)
@@ -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 ) )