コード例 #1
0
ファイル: ListView.cpp プロジェクト: ballisticwhisper/cegui
//----------------------------------------------------------------------------//
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;
    }
}
コード例 #2
0
//----------------------------------------------------------------------------//
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;
    }
}