#include namespace raleigh { vbox::vbox(dllist widgets) : widgets(widgets) { uint32_t w = 0, h = 0; for (dllist::node *n = widgets.first; n; n = n->next) { h += n->d.size.y; if (n->d.size.x > w) w = n->d.size.x; } size = coord(w, h); closest_opaque = 0; } void vbox::notify_window_change() { uint32_t h = window_offset.y; for (dllist::node *n = widgets.first; n; n = n->next) { n->d.w = w; n->d.window_offset = coord(window_offset.x + size.x / 2 - n->d.size.x / 2, h); n->d.notify_window_change(); h += n->d.size.y; } } void vbox::paint(_pixel_t *pixbuf, uint32_t pitch) { for (dllist::node *n = widgets.first; n; n = n->next) n->d.paint(pixbuf, pitch); } bool vbox::try_handle_click(coord window_coords, enum mouse_packet::mouse_button click_type, bool up) { uint32_t h = window_offset.y; dllist::node *n = widgets.first; while (h + n->d.size.y <= window_coords.y) { h += n->d.size.y; n = n->next; } return (window_coords.x >= n->d.window_offset.x) && (window_coords.x < n->d.window_offset.x + n->d.size.x) && n->d.try_handle_click(window_coords, click_type, up); } void vbox::notify_has_opaque_parent(widget *parent) { closest_opaque = parent; for (dllist::node *n = widgets.first; n; n = n->next) n->d.notify_has_opaque_parent(parent); } }