#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) { n->d.parent = this; 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); } void vbox::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; } if ((window_coords.x >= n->d.window_offset.x) && (window_coords.x < n->d.window_offset.x + n->d.size.x)) n->d.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); } void vbox::notify_child_size_change(widget &from, coord old_size) { if ((old_size.y == from.size.y) && (from.size.x <= size.x)) { from.window_offset.x = window_offset.x + size.x / 2 - from.size.x / 2; from.notify_window_change(); } else {//lazy, less efficient approach uint32_t h = 0, w = 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; } set_size(coord(w, h)); notify_window_change(); } } void vbox::on_mouse_move(coord window_coords) { for (dllist::node *n = widgets.first; n; n = n->next) if ((window_coords.x >= n->d.window_offset.x) && (window_coords.y >= n->d.window_offset.y) && (window_coords.x < n->d.window_offset.x + n->d.size.x) && (window_coords.y < n->d.window_offset.y + n->d.size.y)) { n->d.on_mouse_move(window_coords); return; } } }