Rect FalagardListbox::getListRenderArea(void) const { Listbox* lb = (Listbox*)d_window; // get WidgetLookFeel for the assigned look. const WidgetLookFeel& wlf = getLookNFeel(); bool v_visible = lb->getVertScrollbar()->isVisible(true); bool h_visible = lb->getHorzScrollbar()->isVisible(true); // if either of the scrollbars are visible, we might want to use another text rendering area if (v_visible || h_visible) { String area_name("ItemRenderingArea"); if (h_visible) { area_name += "H"; } if (v_visible) { area_name += "V"; } area_name += "Scroll"; if (wlf.isNamedAreaDefined(area_name)) { return wlf.getNamedArea(area_name).getArea().getPixelRect(*lb); } } // default to plain ItemRenderingArea return wlf.getNamedArea("ItemRenderingArea").getArea().getPixelRect(*lb); }
void FalagardListbox::render() { Listbox* lb = (Listbox*)d_window; // render frame and stuff before we handle the items cacheListboxBaseImagery(); // // Render list items // Vector3 itemPos; Size itemSize; Rect itemClipper, itemRect; float widest = lb->getWidestItemWidth(); // calculate position of area we have to render into Rect itemsArea(getListRenderArea()); // set up some initial positional details for items itemPos.d_x = itemsArea.d_left - lb->getHorzScrollbar()->getScrollPosition(); itemPos.d_y = itemsArea.d_top - lb->getVertScrollbar()->getScrollPosition(); itemPos.d_z = System::getSingleton().getRenderer()->getZLayer(3) - System::getSingleton().getRenderer()->getCurrentZ(); float alpha = lb->getEffectiveAlpha(); // loop through the items size_t itemCount = lb->getItemCount(); for (size_t i = 0; i < itemCount; ++i) { ListboxItem* listItem = lb->getListboxItemFromIndex(i); itemSize.d_height = listItem->getPixelSize().d_height; // allow item to have full width of box if this is wider than items itemSize.d_width = ceguimax(itemsArea.getWidth(), widest); // calculate destination area for this item. itemRect.d_left = itemPos.d_x; itemRect.d_top = itemPos.d_y; itemRect.setSize(itemSize); itemClipper = itemRect.getIntersection(itemsArea); // skip this item if totally clipped if (itemClipper.getWidth() == 0) { itemPos.d_y += itemSize.d_height; continue; } // draw this item listItem->draw(lb->getRenderCache(), itemRect, itemPos.d_z, alpha, &itemClipper); // update position ready for next item itemPos.d_y += itemSize.d_height; } }