formalize tab size in all ui codepaths, per-box; pick 4*columnsize by default in text views

This commit is contained in:
Ryan Fleury
2024-05-24 16:33:30 -07:00
parent 1161c4adbb
commit 50d401e4ce
14 changed files with 114 additions and 75 deletions
+19 -11
View File
@@ -565,7 +565,7 @@ f_hash2style_from_tag_size(F_Tag tag, F32 size)
}
internal F_Run
f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_column, F32 tab_width, F_RunFlags flags, String8 string)
f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, F_RunFlags flags, String8 string)
{
ProfBeginFunction();
@@ -792,7 +792,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_column, F32 t
F32 advance = info->advance;
if(is_tab)
{
advance *= tab_width - mod_f32(base_column, tab_width);
advance = tab_size_px - mod_f32(base_align_px, tab_size_px);
}
// rjf: push piece
@@ -808,6 +808,7 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_column, F32 t
piece->decode_size = piece_substring.size;
piece->offset = v2s16(0, -hash2style_node->ascent - 4);
}
base_align_px += advance;
dim.x += piece->advance;
dim.y = Max(dim.y, dim_2s16(piece->subrect).y);
}
@@ -836,12 +837,12 @@ f_push_run_from_string(Arena *arena, F_Tag tag, F32 size, F32 base_column, F32 t
}
internal String8List
f_wrapped_string_lines_from_font_size_string_max(Arena *arena, F_Tag font, F32 size, F32 base_column, F32 tab_width, String8 string, F32 max)
f_wrapped_string_lines_from_font_size_string_max(Arena *arena, F_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max)
{
String8List list = {0};
{
Temp scratch = scratch_begin(&arena, 1);
F_Run run = f_push_run_from_string(scratch.arena, font, size, base_column, tab_width, 0, string);
F_Run run = f_push_run_from_string(scratch.arena, font, size, base_align_px, tab_size_px, 0, string);
F32 off_px = 0;
U64 off_bytes = 0;
U64 line_start_off_bytes = 0;
@@ -949,12 +950,12 @@ f_wrapped_string_lines_from_font_size_string_max(Arena *arena, F_Tag font, F32 s
}
internal Vec2F32
f_dim_from_tag_size_string(F_Tag tag, F32 size, F32 base_column, F32 tab_width, String8 string)
f_dim_from_tag_size_string(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
Vec2F32 result = {0};
F_Run run = f_push_run_from_string(scratch.arena, tag, size, base_column, tab_width, 0, string);
F_Run run = f_push_run_from_string(scratch.arena, tag, size, base_align_px, tab_size_px, 0, string);
result = run.dim;
scratch_end(scratch);
ProfEnd();
@@ -962,13 +963,13 @@ f_dim_from_tag_size_string(F_Tag tag, F32 size, F32 base_column, F32 tab_width,
}
internal Vec2F32
f_dim_from_tag_size_string_list(F_Tag tag, F32 size, F32 base_column, F32 tab_width, String8List list)
f_dim_from_tag_size_string_list(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list)
{
ProfBeginFunction();
Vec2F32 sum = {0};
for(String8Node *n = list.first; n != 0; n = n->next)
{
Vec2F32 str_dim = f_dim_from_tag_size_string(tag, size, base_column, tab_width, n->string);
Vec2F32 str_dim = f_dim_from_tag_size_string(tag, size, base_align_px, tab_size_px, n->string);
sum.x += str_dim.x;
sum.y = Max(sum.y, str_dim.y);
}
@@ -976,8 +977,15 @@ f_dim_from_tag_size_string_list(F_Tag tag, F32 size, F32 base_column, F32 tab_wi
return sum;
}
internal F32
f_column_size_from_tag_size(F_Tag tag, F32 size)
{
F32 result = f_dim_from_tag_size_string(tag, size, 0, 0, str8_lit("H")).x;
return result;
}
internal U64
f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_column, F32 tab_width, String8 string, F32 p)
f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
@@ -987,7 +995,7 @@ f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_column, F32 tab_
F32 x = 0;
for(U64 char_idx = 0; char_idx <= string.size; char_idx += 1)
{
F32 this_char_distance = fabsf(p - x);
F32 this_char_distance = abs_f32(p - x);
if(this_char_distance < best_distance || best_distance < 0.f)
{
best_offset = char_idx;
@@ -995,7 +1003,7 @@ f_char_pos_from_tag_size_string_p(F_Tag tag, F32 size, F32 base_column, F32 tab_
}
if(char_idx < string.size)
{
x += f_dim_from_tag_size_string(tag, size, base_column, tab_width, str8_substr(string, r1u64(char_idx, char_idx+1))).x;
x += f_dim_from_tag_size_string(tag, size, base_align_px, tab_size_px, str8_substr(string, r1u64(char_idx, char_idx+1))).x;
}
}
result = best_offset;