diff --git a/Libraries/LibWeb/Layout/LayoutTableRow.cpp b/Libraries/LibWeb/Layout/LayoutTableRow.cpp index e241e642de..e571d398f1 100644 --- a/Libraries/LibWeb/Layout/LayoutTableRow.cpp +++ b/Libraries/LibWeb/Layout/LayoutTableRow.cpp @@ -41,12 +41,30 @@ LayoutTableRow::~LayoutTableRow() void LayoutTableRow::layout(LayoutMode) { - float tallest_cell_height = 0; - float content_width = 0; +} + +void LayoutTableRow::calculate_column_widths(Vector& column_widths) +{ + size_t column_index = 0; for_each_child_of_type([&](auto& cell) { cell.layout(LayoutMode::OnlyRequiredLineBreaks); + column_widths[column_index] = max(column_widths[column_index], cell.width()); + column_index += cell.colspan(); + }); +} + +void LayoutTableRow::layout_row(const Vector& column_widths) +{ + size_t column_index = 0; + float tallest_cell_height = 0; + float content_width = 0; + + for_each_child_of_type([&](auto& cell) { cell.set_offset(effective_offset().translated(content_width, 0)); - content_width += cell.width(); + + size_t cell_colspan = cell.colspan(); + for (size_t i = 0; i < cell_colspan; ++i) + content_width += column_widths[column_index++]; tallest_cell_height = max(tallest_cell_height, cell.height()); }); set_width(content_width); diff --git a/Libraries/LibWeb/Layout/LayoutTableRow.h b/Libraries/LibWeb/Layout/LayoutTableRow.h index ded261d16f..fe88582587 100644 --- a/Libraries/LibWeb/Layout/LayoutTableRow.h +++ b/Libraries/LibWeb/Layout/LayoutTableRow.h @@ -37,7 +37,7 @@ public: LayoutTableRow(const Element&, NonnullRefPtr); virtual ~LayoutTableRow() override; - virtual void layout(LayoutMode = LayoutMode::Default) override; + LayoutTableCell* first_cell(); const LayoutTableCell* first_cell() const; @@ -45,7 +45,11 @@ public: LayoutTableRow* next_row(); const LayoutTableRow* next_row() const; + void layout_row(const Vector& column_widths); + void calculate_column_widths(Vector& column_widths); + private: + virtual void layout(LayoutMode) override; virtual bool is_table_row() const override { return true; } virtual const char* class_name() const override { return "LayoutTableRow"; } }; diff --git a/Libraries/LibWeb/Layout/LayoutTableRowGroup.cpp b/Libraries/LibWeb/Layout/LayoutTableRowGroup.cpp index 1ae56218a0..57db85120b 100644 --- a/Libraries/LibWeb/Layout/LayoutTableRowGroup.cpp +++ b/Libraries/LibWeb/Layout/LayoutTableRowGroup.cpp @@ -25,8 +25,9 @@ */ #include -#include +#include #include +#include namespace Web { @@ -39,18 +40,39 @@ LayoutTableRowGroup::~LayoutTableRowGroup() { } -void LayoutTableRowGroup::layout(LayoutMode layout_mode) +size_t LayoutTableRowGroup::column_count() const +{ + size_t table_column_count = 0; + for_each_child_of_type([&](auto& row) { + size_t row_column_count = 0; + row.template for_each_child_of_type([&](auto& cell) { + row_column_count += cell.colspan(); + }); + table_column_count = max(table_column_count, row_column_count); + }); + return table_column_count; +} + +void LayoutTableRowGroup::layout(LayoutMode) { compute_width(); if (!is_inline()) compute_position(); + auto column_count = this->column_count(); + Vector column_widths; + column_widths.resize(column_count); + + for_each_child_of_type([&](auto& row) { + row.calculate_column_widths(column_widths); + }); + float content_height = 0; for_each_child_of_type([&](auto& row) { row.set_offset(0, content_height); - row.layout(layout_mode); + row.layout_row(column_widths); content_height += row.height(); }); diff --git a/Libraries/LibWeb/Layout/LayoutTableRowGroup.h b/Libraries/LibWeb/Layout/LayoutTableRowGroup.h index f35f4571e7..ea535dc86d 100644 --- a/Libraries/LibWeb/Layout/LayoutTableRowGroup.h +++ b/Libraries/LibWeb/Layout/LayoutTableRowGroup.h @@ -38,6 +38,8 @@ public: virtual void layout(LayoutMode = LayoutMode::Default) override; private: + size_t column_count() const; + virtual bool is_table_row_group() const override { return true; } virtual const char* class_name() const override { return "LayoutTableRowGroup"; } };