diff --git a/src/BoxLayout.cpp b/src/BoxLayout.cpp index b9c0ac9..66ce463 100644 --- a/src/BoxLayout.cpp +++ b/src/BoxLayout.cpp @@ -13,13 +13,14 @@ void BoxLayout::run() { return; } - Box free_space = m_target->rect().max_geometry(); + double total_space = m_direction == Direction::Horizontal ? m_target->rect().width() : m_target->rect().height(); + double free_space = total_space; Point current_position { 0.0, 0.0 }; int unslotted_widgets = 0; std::vector working_slots(m_slots); for (unsigned int i = 0; i < m_target->children().size(); i++) { - if (i >= m_slots.size()) { + if (i >= working_slots.size()) { auto child = m_target->children()[i]; if (m_direction == Direction::Horizontal) { if (child->rect().min_width() != -1 || child->rect().max_width() != -1) { @@ -58,41 +59,37 @@ void BoxLayout::run() { } for (unsigned int i = 0; i < m_target->children().size(); i++) { - if (i < m_slots.size()) { - Slot *slot = &working_slots[i]; - auto child = m_target->children()[i]; + Slot *slot = &working_slots[i]; + auto child = m_target->children()[i]; - if (slot->type == SlotType::Auto) continue; + if (slot->type == SlotType::Auto) { + continue; + } - if (m_direction == Direction::Horizontal) { - if (slot->type == SlotType::Percent) { - slot->pixel = ((free_space.width() / 100.0) * slot->percent); - } - if (child->rect().max_width() != -1 && slot->pixel > child->rect().max_width()) { - slot->pixel = child->rect().max_width(); - } - if (child->rect().min_width() != -1 && slot->pixel < child->rect().min_width()) { - slot->pixel = child->rect().min_width(); - } + if (slot->type == SlotType::Percent) { + slot->pixel = ((free_space / 100.0) * slot->percent); + } - free_space.set_width(free_space.width() - slot->pixel); - } else { - if (slot->type == SlotType::Percent) { - slot->pixel = ((free_space.height() / 100.0) * slot->percent); - } - if (child->rect().max_height() != -1 && slot->pixel > child->rect().max_height()) { - slot->pixel = child->rect().max_height(); - } - if (child->rect().min_height() != -1 && slot->pixel < child->rect().min_height()) { - slot->pixel = child->rect().min_height(); - } - - free_space.set_height(free_space.height() - slot->pixel); + if (m_direction == Direction::Horizontal) { + if (child->rect().max_width() != -1 && slot->pixel > child->rect().max_width()) { + slot->pixel = child->rect().max_width(); + } + if (child->rect().min_width() != -1 && slot->pixel < child->rect().min_width()) { + slot->pixel = child->rect().min_width(); + } + } else { + if (child->rect().max_height() != -1 && slot->pixel > child->rect().max_height()) { + slot->pixel = child->rect().max_height(); + } + if (child->rect().min_height() != -1 && slot->pixel < child->rect().min_height()) { + slot->pixel = child->rect().min_height(); } } + + free_space -= slot->pixel; } - double space_per_unslotted_widget = m_direction == Direction::Horizontal ? free_space.width() / unslotted_widgets : free_space.height() / unslotted_widgets; + double space_per_unslotted_widget = free_space / unslotted_widgets; for (unsigned int i = 0; i < m_target->children().size(); i++) { auto child = m_target->children()[i]; @@ -100,7 +97,7 @@ void BoxLayout::run() { if (slot.type == SlotType::Auto) { slot.pixel = space_per_unslotted_widget; } - + // make sure pixel values are aligned to the pixel grid slot.pixel = std::floor(slot.pixel); @@ -109,10 +106,10 @@ void BoxLayout::run() { child->rect().set_y(current_position.y()); if (m_direction == Direction::Horizontal) { child->rect().set_width(slot.pixel); - child->rect().set_height(free_space.height()); + child->rect().set_height(m_target->rect().max_geometry().height()); current_position.add(slot.pixel, 0); } else { - child->rect().set_width(free_space.width()); + child->rect().set_width(m_target->rect().max_geometry().width()); child->rect().set_height(slot.pixel); current_position.add(0, slot.pixel); } diff --git a/src/Widget.cpp b/src/Widget.cpp index 279369f..42eec1c 100644 --- a/src/Widget.cpp +++ b/src/Widget.cpp @@ -175,15 +175,16 @@ void Widget::handle_repaint_rect(RepaintRectEvent &event) { void Widget::handle_relayout_subtree(RelayoutSubtreeEvent &event) { on_layout(); // hack - for (auto child : m_children) { - child->dispatch_event(event); - } if (m_layout) { m_layout->run(); } m_window_relative = compute_window_relative(); + + for (auto child : m_children) { + child->dispatch_event(event); + } } void Widget::handle_mouse_move_event(MouseMoveEvent &event) { diff --git a/src/main.cpp b/src/main.cpp index 12749f2..828f328 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -45,6 +45,8 @@ int main() { remove_button->on_click = [container_widget]() { container_widget->remove_child(container_widget->children()[0]); }; + auto dummy_button = top_bar->add("dummy"); + dummy_button->rect().set_max_width(60); window.run(true); return 0;