diff --git a/lib/ugui.c3l/src/ugui_font.c3 b/lib/ugui.c3l/src/ugui_font.c3 index 99c9616..d481dbd 100644 --- a/lib/ugui.c3l/src/ugui_font.c3 +++ b/lib/ugui.c3l/src/ugui_font.c3 @@ -253,7 +253,7 @@ fn TextSize? Ctx.measure_string(&ctx, String text) for (; cp != 0; cp = str_to_codepoint(text[off..], &x)) { off += x; Glyph* gp = font.get_glyph(cp)!; - + // update the text bounds switch { case cp == '\n': @@ -273,7 +273,7 @@ fn TextSize? Ctx.measure_string(&ctx, String text) bounds = containing_rect(bounds, b); origin.x += gp.adv; } - + // update the word width switch { case ascii::is_space((char)cp): @@ -303,6 +303,8 @@ fn TextSize? Ctx.measure_string(&ctx, String text) // layout a string inside a bounding box, following the given alignment (anchor). // returns the position of the cursor, the returned height is the line height and the width is the last // character's advance value +// TODO: implement a "reflow" flag to toggle reflow if a character goes out of bounds +// TODO: also return the total bounds of the laid out string fn Rect? Ctx.layout_string(&ctx, String text, Rect bounds, Anchor anchor, int z_index, Color hue, isz cursor = -1) { Font* font = &ctx.font; @@ -357,7 +359,7 @@ fn Rect? Ctx.layout_string(&ctx, String text, Rect bounds, Anchor anchor, int z_ do { int line_width; Point o = {.x = bounds.x, .y = bounds.y}; - + Codepoint cp; isz off = line_start; for ITER: (usz x; (cp = str_to_codepoint(text[off..], &x)) != 0; off += x) { @@ -388,7 +390,7 @@ fn Rect? Ctx.layout_string(&ctx, String text, Rect bounds, Anchor anchor, int z_ } line_end = off; if (line_end == line_start) unreachable("something went wrong in measuring the line"); - + // with the line width calculate the right origin and layout the line origin.x = bounds.x; short next_line_x = bounds.x; // the x coordinate of the origin if the line_width is zero @@ -421,7 +423,7 @@ fn Rect? Ctx.layout_string(&ctx, String text, Rect bounds, Anchor anchor, int z_ cursor_rect.y += line_height; } } - + Point line_origin = origin; // see the fixme when measuring the height @@ -454,7 +456,7 @@ fn Rect? Ctx.layout_string(&ctx, String text, Rect bounds, Anchor anchor, int z_ origin.x += gp.adv; } - + if (line_start + off < cursor && text[cursor-1] != '\n') { cursor_rect.x = origin.x; cursor_rect.y = origin.y; @@ -464,10 +466,10 @@ fn Rect? Ctx.layout_string(&ctx, String text, Rect bounds, Anchor anchor, int z_ // done with the line line_start = line_end; - origin.y += line_height + line_gap; + origin.y += line_height + line_gap; } while(line_end < text.len); - + ctx.reset_scissor(z_index)!; - + return cursor_rect; } diff --git a/lib/ugui.c3l/src/widgets/ugui_text.c3 b/lib/ugui.c3l/src/widgets/ugui_text.c3 index d42a7d4..083b2d9 100644 --- a/lib/ugui.c3l/src/widgets/ugui_text.c3 +++ b/lib/ugui.c3l/src/widgets/ugui_text.c3 @@ -8,6 +8,10 @@ struct ElemText { TextEdit* te; } +/* Layout some text without bounds. + * There is a limitation where the current frame bounds are based on the last frame, this is usually + * not a problem but it is in the situation where the text changes almost all frames. + */ macro Ctx.text(&ctx, String text, ...) => ctx.text_id(@compute_id($vasplat), text); fn void? Ctx.text_id(&ctx, Id id, String text) diff --git a/src/main.c3 b/src/main.c3 index 09b62e4..9d89bc5 100644 --- a/src/main.c3 +++ b/src/main.c3 @@ -52,8 +52,8 @@ const char[*] FS_PATH = "resources/shaders/compiled/ugui.frag.spv"; const char[*] STYLESHEET_PATH = "resources/style.css"; -const bool LIMIT_FPS = false; -const bool VSYNC = false; +const bool LIMIT_FPS = true; +const bool VSYNC = true; fn int main(String[] args) {