[F] Fix incorrect cell width evaluation in case of invisible symbols
This commit is contained in:
parent
085405baa9
commit
3cc961f958
17
lib/fort.c
17
lib/fort.c
@ -7001,6 +7001,7 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
|
|||||||
return FT_ERROR;
|
return FT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t column_visible_width = 0;
|
||||||
size_t cols = 0;
|
size_t cols = 0;
|
||||||
size_t rows = 0;
|
size_t rows = 0;
|
||||||
int status = get_table_sizes(table, &rows, &cols);
|
int status = get_table_sizes(table, &rows, &cols);
|
||||||
@ -7022,6 +7023,17 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
|
|||||||
for (col = 0; col < cols; ++col) {
|
for (col = 0; col < cols; ++col) {
|
||||||
col_width_arr[col] = 0;
|
col_width_arr[col] = 0;
|
||||||
size_t row = 0;
|
size_t row = 0;
|
||||||
|
if (geom == INTERN_REPR_GEOMETRY) {
|
||||||
|
column_visible_width = 0;
|
||||||
|
for (row = 0; row < rows; ++row) {
|
||||||
|
const f_row_t *row_p = get_row_c(table, row);
|
||||||
|
const f_cell_t *cell = get_cell_c(row_p, col);
|
||||||
|
if (!cell)
|
||||||
|
continue;
|
||||||
|
size_t cell_vis_width = hint_width_cell(cell, &context, VISIBLE_GEOMETRY);
|
||||||
|
column_visible_width = MAX(column_visible_width, cell_vis_width);
|
||||||
|
}
|
||||||
|
}
|
||||||
for (row = 0; row < rows; ++row) {
|
for (row = 0; row < rows; ++row) {
|
||||||
const f_row_t *row_p = get_row_c(table, row);
|
const f_row_t *row_p = get_row_c(table, row);
|
||||||
const f_cell_t *cell = get_cell_c(row_p, col);
|
const f_cell_t *cell = get_cell_c(row_p, col);
|
||||||
@ -7049,6 +7061,11 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (geom == INTERN_REPR_GEOMETRY &&
|
||||||
|
col_width_arr[col] > column_visible_width) {
|
||||||
|
col_width_arr[col] += column_visible_width;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (combined_cells_found) {
|
if (combined_cells_found) {
|
||||||
|
17
src/table.c
17
src/table.c
@ -143,6 +143,7 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
|
|||||||
return FT_ERROR;
|
return FT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t column_visible_width = 0;
|
||||||
size_t cols = 0;
|
size_t cols = 0;
|
||||||
size_t rows = 0;
|
size_t rows = 0;
|
||||||
int status = get_table_sizes(table, &rows, &cols);
|
int status = get_table_sizes(table, &rows, &cols);
|
||||||
@ -164,6 +165,17 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
|
|||||||
for (col = 0; col < cols; ++col) {
|
for (col = 0; col < cols; ++col) {
|
||||||
col_width_arr[col] = 0;
|
col_width_arr[col] = 0;
|
||||||
size_t row = 0;
|
size_t row = 0;
|
||||||
|
if (geom == INTERN_REPR_GEOMETRY) {
|
||||||
|
column_visible_width = 0;
|
||||||
|
for (row = 0; row < rows; ++row) {
|
||||||
|
const f_row_t *row_p = get_row_c(table, row);
|
||||||
|
const f_cell_t *cell = get_cell_c(row_p, col);
|
||||||
|
if (!cell)
|
||||||
|
continue;
|
||||||
|
size_t cell_vis_width = hint_width_cell(cell, &context, VISIBLE_GEOMETRY);
|
||||||
|
column_visible_width = MAX(column_visible_width, cell_vis_width);
|
||||||
|
}
|
||||||
|
}
|
||||||
for (row = 0; row < rows; ++row) {
|
for (row = 0; row < rows; ++row) {
|
||||||
const f_row_t *row_p = get_row_c(table, row);
|
const f_row_t *row_p = get_row_c(table, row);
|
||||||
const f_cell_t *cell = get_cell_c(row_p, col);
|
const f_cell_t *cell = get_cell_c(row_p, col);
|
||||||
@ -191,6 +203,11 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (geom == INTERN_REPR_GEOMETRY &&
|
||||||
|
col_width_arr[col] > column_visible_width) {
|
||||||
|
col_width_arr[col] += column_visible_width;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (combined_cells_found) {
|
if (combined_cells_found) {
|
||||||
|
@ -188,6 +188,114 @@ void test_bug_fixes(void)
|
|||||||
ft_destroy_table(table);
|
ft_destroy_table(table);
|
||||||
}
|
}
|
||||||
#endif /* FT_HAVE_UTF8 */
|
#endif /* FT_HAVE_UTF8 */
|
||||||
|
|
||||||
|
SCENARIO("Issue 37 - https://github.com/seleznevae/libfort/issues/37") {
|
||||||
|
ft_table_t *table = ft_create_table();
|
||||||
|
ft_set_border_style(table, FT_BASIC_STYLE);
|
||||||
|
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||||
|
ft_write_ln(table, "xxx");
|
||||||
|
ft_write_ln(table,
|
||||||
|
"1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n1\n2\n3\n4\n5\n6\n7\n8");
|
||||||
|
ft_set_cell_prop(table, 1, 0, FT_CPROP_CONT_FG_COLOR, FT_COLOR_RED);
|
||||||
|
|
||||||
|
const char *table_str = ft_to_string(table);
|
||||||
|
assert_true(table_str != NULL);
|
||||||
|
const char *table_str_etalon =
|
||||||
|
"+-----+\n"
|
||||||
|
"| xxx |\n"
|
||||||
|
"+-----+\n"
|
||||||
|
"| \033[31m1\033[0m |\n"
|
||||||
|
"| \033[31m2\033[0m |\n"
|
||||||
|
"| \033[31m3\033[0m |\n"
|
||||||
|
"| \033[31m4\033[0m |\n"
|
||||||
|
"| \033[31m5\033[0m |\n"
|
||||||
|
"| \033[31m6\033[0m |\n"
|
||||||
|
"| \033[31m7\033[0m |\n"
|
||||||
|
"| \033[31m8\033[0m |\n"
|
||||||
|
"| \033[31m9\033[0m |\n"
|
||||||
|
"| \033[31m0\033[0m |\n"
|
||||||
|
"| \033[31m1\033[0m |\n"
|
||||||
|
"| \033[31m2\033[0m |\n"
|
||||||
|
"| \033[31m3\033[0m |\n"
|
||||||
|
"| \033[31m4\033[0m |\n"
|
||||||
|
"| \033[31m5\033[0m |\n"
|
||||||
|
"| \033[31m6\033[0m |\n"
|
||||||
|
"| \033[31m7\033[0m |\n"
|
||||||
|
"| \033[31m8\033[0m |\n"
|
||||||
|
"+-----+\n";
|
||||||
|
assert_str_equal(table_str, table_str_etalon);
|
||||||
|
|
||||||
|
ft_destroy_table(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCENARIO("Issue 37 - https://github.com/seleznevae/libfort/issues/37") {
|
||||||
|
ft_table_t *table = ft_create_table();
|
||||||
|
ft_set_border_style(table, FT_BASIC_STYLE);
|
||||||
|
ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER);
|
||||||
|
|
||||||
|
ft_write_ln(table, "hdr1", "hdr2", "xxx");
|
||||||
|
ft_write_ln(table, "3", "",
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||||||||||||||||||||||||||\n"
|
||||||
|
"||||||");
|
||||||
|
|
||||||
|
ft_set_cell_prop(table, 1, FT_ANY_COLUMN, FT_CPROP_CONT_FG_COLOR, FT_COLOR_RED);
|
||||||
|
const char *table_str = ft_to_string(table);
|
||||||
|
assert_true(table_str != NULL);
|
||||||
|
|
||||||
|
const char *table_str_etalon =
|
||||||
|
"+------+------+--------------------------------+\n"
|
||||||
|
"| hdr1 | hdr2 | xxx |\n"
|
||||||
|
"+------+------+--------------------------------+\n"
|
||||||
|
"| \033[31m3\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n"
|
||||||
|
"|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||\033[0m |\n"
|
||||||
|
"+------+------+--------------------------------+\n";
|
||||||
|
assert_str_equal(table_str, table_str_etalon);
|
||||||
|
ft_destroy_table(table);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_table_basic(void)
|
void test_table_basic(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user