//----------------------------------------------------------------------------// void FalagardListView::createRenderGeometry(ListView* list_view) { Rectf items_area(getViewRenderArea()); glm::vec2 item_pos(getItemRenderStartPosition(list_view, items_area)); for (size_t i = 0; i < list_view->getItems().size(); ++i) { ListViewItemRenderingState* item = list_view->getItems().at(i); RenderedString& rendered_string = item->d_string; Sizef size(item->d_size); size.d_width = std::max(items_area.getWidth(), size.d_width); Rectf item_rect; item_rect.left(item_pos.x); item_rect.top(item_pos.y); item_rect.setSize(size); if (!item->d_icon.empty()) { Image& img = ImageManager::getSingleton().get(item->d_icon); Rectf icon_rect(item_rect); icon_rect.setWidth(size.d_height); icon_rect.setHeight(size.d_height); Rectf icon_clipper(icon_rect.getIntersection(items_area)); ImageRenderSettings renderSettings( icon_rect, &icon_clipper, true, ICON_COLOUR_RECT, 1.0f); auto imgGeomBuffers = img.createRenderGeometry(renderSettings); list_view->appendGeometryBuffers(imgGeomBuffers); item_rect.left(item_rect.left() + icon_rect.getWidth()); } Rectf item_clipper(item_rect.getIntersection(items_area)); createRenderGeometryAndAddToItemView(list_view, rendered_string, item_rect, list_view->getFont(), &item_clipper, item->d_isSelected); item_pos.y += size.d_height; } }
//----------------------------------------------------------------------------// void FalagardTreeView::renderTreeItem(TreeView* tree_view, const Rectf& items_area, glm::vec2& item_pos, const TreeViewItemRenderingState* item_to_render, size_t depth) { float expander_margin = tree_view->getSubtreeExpanderMargin(); for (size_t i = 0; i < item_to_render->d_renderedChildren.size(); ++i) { TreeViewItemRenderingState* item = item_to_render->d_renderedChildren.at(i); RenderedString& rendered_string = item->d_string; Sizef size(item->d_size); // center the expander compared to the item's height float half_diff = (size.d_height - d_subtreeExpanderImagerySize.d_height) / 2.0f; size.d_width = ceguimax(items_area.getWidth(), size.d_width); float indent = d_subtreeExpanderImagerySize.d_width + expander_margin * 2; if (item->d_totalChildCount > 0) { const ImagerySection* section = item->d_subtreeIsExpanded ? d_subtreeCollapserImagery : d_subtreeExpanderImagery; Rectf button_rect; button_rect.left(item_pos.x + expander_margin); button_rect.top(item_pos.y + (half_diff > 0 ? half_diff : 0)); button_rect.setSize(d_subtreeExpanderImagerySize); Rectf button_clipper(button_rect.getIntersection(items_area)); section->render(*tree_view, button_rect, 0, &button_clipper); indent = button_rect.getWidth() + expander_margin * 2; } Rectf item_rect; item_rect.left(item_pos.x + indent); item_rect.top(item_pos.y + (half_diff < 0 ? -half_diff : 0)); item_rect.setSize(size); if (!item->d_icon.empty()) { Image& img = ImageManager::getSingleton().get(item->d_icon); Rectf icon_rect(item_rect); icon_rect.setWidth(size.d_height); icon_rect.setHeight(size.d_height); Rectf icon_clipper(icon_rect.getIntersection(items_area)); img.render(tree_view->getGeometryBuffers(), icon_rect, &icon_clipper, true, ICON_COLOUR_RECT, 1.0f); item_rect.left(item_rect.left() + icon_rect.getWidth()); } Rectf item_clipper(item_rect.getIntersection(items_area)); renderString(tree_view, rendered_string, item_rect, tree_view->getFont(), &item_clipper, item->d_isSelected); item_pos.y += ceguimax(size.d_height, d_subtreeExpanderImagerySize.d_height); if (item->d_renderedChildren.empty()) continue; item_pos.x += indent; if (item->d_subtreeIsExpanded) { renderTreeItem(tree_view, items_area, item_pos, item, depth + 1); } item_pos.x -= indent; } }