void StatusBar_Impl::position_parts() { Rect rect(Point(0,0), statusbar->get_geometry().get_size()); Rect content = statusbar->get_content_box(); int xpos = content.right; if (show_size_grip) { int preferred_width = part_size_grip.get_css_width(); Rect rect_sizegrip(content.right - preferred_width, content.top, content.right, content.bottom); xpos = rect_sizegrip.left; } for (unsigned int index = statusbar_parts.size(); index > 0; index--) { StatusBar_Part &statusbar_part = statusbar_parts[index-1]; int left = xpos - statusbar_part.width; int right = xpos; Rect new_position(left, content.top, right, content.bottom); if (statusbar_part.component && statusbar_part.position != new_position) statusbar_part.component->set_geometry(part_status_part.get_content_box(new_position)); statusbar_part.position = new_position; xpos = left; } }
void StatusBar_Impl::on_render(Canvas &canvas, const Rect &update_rect) { Rect rect(Point(0,0), statusbar->get_geometry().get_size()); Rect content = statusbar->get_content_box(); Rect rect_status_text = content; if (show_size_grip) { int preferred_width = part_size_grip.get_css_width(); Rect rect_sizegrip(content.right - preferred_width, content.top, content.right, content.bottom); part_size_grip.render_box(canvas, rect_sizegrip); rect_status_text.right = rect_sizegrip.left; } if (!statusbar_parts.empty()) rect_status_text.right = statusbar_parts[0].position.left; part_status_text.render_box(canvas, rect_status_text); Rect status_text_content = part_status_text.get_content_box(rect_status_text); statusbar->render_text(canvas, status_text, status_text_content.left + 4, content.bottom - 6); for (unsigned int index = 0; index < statusbar_parts.size(); index++) { StatusBar_Part &statusbar_part = statusbar_parts[index]; part_status_part.render_box(canvas, statusbar_part.position); Rect part_content = part_status_part.get_content_box(statusbar_part.position); int icon_width = 0; if (!statusbar_part.icon.is_null()) { statusbar_part.icon.draw(canvas, (float)part_content.left + 4, (float)part_content.bottom - 6 - statusbar_part.icon.get_height()); icon_width = statusbar_part.icon.get_width() + 4; } if (!statusbar_part.text.empty()) { statusbar->render_text(canvas, statusbar_part.text, part_content.left + 4 + icon_width, part_content.bottom - 6); } } }
void ToolBar_Impl::update_layout(Canvas &canvas) { if (need_layout_update == false) return; need_layout_update = false; Rect rect = toolbar->get_size(); Rect component_content = toolbar->get_content_box(); Rect item_content = part_item_normal.get_content_box(component_content); int original_text_gap = part_item_normal.get_property_int(CssStr::text_gap, "3"); if (horizontal) { int x = component_content.left; int center_y = item_content.get_center().y; int item_size = part_item_normal.get_css_width(); std::vector<ToolBarItem>::size_type index, size; size = items.size(); for (index = 0; index < size; index++) { ToolBarItem &item = items[index]; item_content.left = x; Size text_size = toolbar->get_render_text_size(canvas, item.impl->text); int text_gap = original_text_gap; if (text_size.width == 0) text_gap = 0; if (layout == layout_left) { item.impl->icon_pos = Rect(Point(0, center_y-size_icon.height/2-item_content.top), size_icon); item_content.right = item_content.left + item.impl->icon_pos.get_width() + text_gap + text_size.width; item.impl->text_pos = Point(item.impl->icon_pos.right + text_gap, part_item_normal.get_vertical_text_align(canvas, item_content).baseline-item_content.top); } else if (layout == layout_center) { item.impl->icon_pos = Rect(Point(item_size/2-size_icon.width/2, 0), size_icon); item.impl->text_pos = Point(item_size/2-text_size.width/2, item.impl->icon_pos.bottom + text_gap + text_size.height); item_content.right = item_content.left + item_size; } Rect item_render = part_item_normal.get_border_box(item_content); Rect shrink_box = part_item_normal.get_content_shrink_box(); item_render.translate(shrink_box.left,0); item.impl->position = item_render; x = item_render.right; } } else { int y = component_content.top; int center_x = item_content.get_center().x; int size_item = part_item_normal.get_css_height(); std::vector<ToolBarItem>::size_type index, size; size = items.size(); for (index = 0; index < size; index++) { ToolBarItem &item = items[index]; item_content.top = y; Size text_size = toolbar->get_render_text_size(canvas, item.impl->text); int text_gap = original_text_gap; if (text_size.width == 0) text_gap = 0; if (layout == layout_left) { item.impl->icon_pos = Rect(Point(0,0), size_icon); item.impl->text_pos = Point(item.impl->icon_pos.right + text_gap, size_item/2+text_size.height/2); item_content.bottom = item_content.top + size_item; } else if (layout == layout_center) { item.impl->icon_pos = Rect(Point(center_x-size_icon.width/2, 0), size_icon); item.impl->text_pos = Point(center_x-text_size.width/2, item.impl->icon_pos.bottom + text_gap + text_size.height); item_content.bottom = item_content.top + item.impl->icon_pos.get_height() + text_gap + text_size.height; } Rect item_render = part_item_normal.get_border_box(item_content); Rect shrink_box = part_item_normal.get_content_shrink_box(); item_render.translate(0, shrink_box.top); item.impl->position = item_render; y = item_render.bottom; } } // toolbar->request_repaint(); }