further modify box layout to better support minimum and maximum sizes
This commit is contained in:
parent
a869385d09
commit
45e322f947
3 changed files with 36 additions and 36 deletions
|
@ -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<Slot> 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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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<Raven::Button>("dummy");
|
||||
dummy_button->rect().set_max_width(60);
|
||||
|
||||
window.run(true);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue