fix documentlayout by requiring fixed width of target

This commit is contained in:
hippoz 2022-10-28 19:46:33 +03:00
parent fc59ad6e10
commit abbedd9db1
Signed by: hippoz
GPG key ID: 7C52899193467641

View file

@ -1,6 +1,7 @@
#include "DocumentLayout.hpp" #include "DocumentLayout.hpp"
#include "Point.hpp" #include "Point.hpp"
#include "Widget.hpp" #include "Widget.hpp"
#include "src/Events.hpp"
#include <iostream> #include <iostream>
namespace Raven { namespace Raven {
@ -9,15 +10,20 @@ bool DocumentLayout::run() {
if (!m_target) if (!m_target)
return false; return false;
Point bound { m_margin + m_target->rect().max_geometry().width(), m_margin };
Point current_position { m_margin, m_margin }; Point current_position { m_margin, m_margin };
double largest_height_so_far = -1.0; double largest_height_so_far = -1.0;
double desired_height = m_margin * 2;
auto& children = m_target->children(); auto& children = m_target->children();
for (auto child : children) { for (auto child : children) {
if (child->absolute()) if (child->absolute())
continue; continue;
if (child->layout() && child->layout()->dynamically_sizes_target()) {
auto event = RelayoutSubtreeEvent();
child->dispatch_event(event);
}
if (child->rect().height() > largest_height_so_far) { if (child->rect().height() > largest_height_so_far) {
largest_height_so_far = child->rect().height(); largest_height_so_far = child->rect().height();
} }
@ -27,7 +33,7 @@ bool DocumentLayout::run() {
bool should_do_new_row = new_row_because_of_control_widget || new_row_because_of_justification; bool should_do_new_row = new_row_because_of_control_widget || new_row_because_of_justification;
if (should_do_new_row) { if (should_do_new_row) {
current_position.add(0, largest_height_so_far + m_margin); current_position.add(0, largest_height_so_far + m_margin);
bound.add(0, largest_height_so_far + m_margin); desired_height += largest_height_so_far + m_margin;
current_position.set_x(m_margin); current_position.set_x(m_margin);
} }
@ -39,13 +45,17 @@ bool DocumentLayout::run() {
} }
} }
for (auto &child : m_target->children()) {
auto event = RelayoutSubtreeEvent();
child->dispatch_event(event);
}
/* account for the first row */ /* account for the first row */
bound.add(0, largest_height_so_far); desired_height += largest_height_so_far;
m_target->rect().set_width(bound.x()); m_target->rect().set_height(desired_height);
m_target->rect().set_height(bound.y());
return false; return true;
} }
} }