- return ItemSpec(InventoryLocation(), "", -1);
-}
-
-void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int layer,
- bool &item_hovered)
-{
- video::IVideoDriver* driver = Environment->getVideoDriver();
-
- Inventory *inv = m_invmgr->getInventory(s.inventoryloc);
- if (!inv) {
- warningstream<<"GUIFormSpecMenu::drawList(): "
- << "The inventory location "
- << "\"" << s.inventoryloc.dump() << "\" doesn't exist anymore"
- << std::endl;
- return;
- }
- InventoryList *ilist = inv->getList(s.listname);
- if (!ilist) {
- warningstream << "GUIFormSpecMenu::drawList(): "
- << "The inventory list \"" << s.listname << "\" @ \""
- << s.inventoryloc.dump() << "\" doesn't exist anymore"
- << std::endl;
- return;
- }
-
- core::rect<s32> imgrect(0, 0, imgsize.X, imgsize.Y);
- core::rect<s32> clipping_rect = s.e->getAbsoluteClippingRect();
- v2s32 base_pos = s.e->getAbsolutePosition().UpperLeftCorner;
-
- for (s32 i = 0; i < s.geom.X * s.geom.Y; i++) {
- s32 item_i = i + s.start_item_i;
- if (item_i >= (s32)ilist->getSize())
- break;
-
- s32 x;
- s32 y;
- if (s.real_coordinates) {
- x = (i%s.geom.X) * (imgsize.X * 1.25);
- y = (i/s.geom.X) * (imgsize.Y * 1.25);
- } else {
- x = (i%s.geom.X) * spacing.X;
- y = (i/s.geom.X) * spacing.Y;
- }
- v2s32 p(x,y);
- core::rect<s32> rect = imgrect + base_pos + p;
- ItemStack item = ilist->getItem(item_i);
-
- bool selected = m_selected_item
- && m_invmgr->getInventory(m_selected_item->inventoryloc) == inv
- && m_selected_item->listname == s.listname
- && m_selected_item->i == item_i;
- core::rect<s32> clipped_rect(rect);
- clipped_rect.clipAgainst(clipping_rect);
- bool hovering = clipped_rect.getArea() > 0 &&
- clipped_rect.isPointInside(m_pointer);
- ItemRotationKind rotation_kind = selected ? IT_ROT_SELECTED :
- (hovering ? IT_ROT_HOVERED : IT_ROT_NONE);
-
- if (layer == 0) {
- if (hovering) {
- item_hovered = true;
- driver->draw2DRectangle(m_slotbg_h, rect, &clipping_rect);
- } else {
- driver->draw2DRectangle(m_slotbg_n, rect, &clipping_rect);
- }
- }
-
- //Draw inv slot borders
- if (m_slotborder) {
- s32 x1 = rect.UpperLeftCorner.X;
- s32 y1 = rect.UpperLeftCorner.Y;
- s32 x2 = rect.LowerRightCorner.X;
- s32 y2 = rect.LowerRightCorner.Y;
- s32 border = 1;
- driver->draw2DRectangle(m_slotbordercolor,
- core::rect<s32>(v2s32(x1 - border, y1 - border),
- v2s32(x2 + border, y1)), &clipping_rect);
- driver->draw2DRectangle(m_slotbordercolor,
- core::rect<s32>(v2s32(x1 - border, y2),
- v2s32(x2 + border, y2 + border)), &clipping_rect);
- driver->draw2DRectangle(m_slotbordercolor,
- core::rect<s32>(v2s32(x1 - border, y1),
- v2s32(x1, y2)), &clipping_rect);
- driver->draw2DRectangle(m_slotbordercolor,
- core::rect<s32>(v2s32(x2, y1),
- v2s32(x2 + border, y2)), &clipping_rect);
- }
-
- if (layer == 1) {
- if (selected)
- item.takeItem(m_selected_amount);
-
- if (!item.empty()) {
- // Draw item stack
- drawItemStack(driver, m_font, item,
- rect, &clipping_rect, m_client, rotation_kind);
- // Draw tooltip
- if (hovering && !m_selected_item) {
- std::string tooltip = item.getDescription(m_client->idef());
- if (m_tooltip_append_itemname)
- tooltip += "\n[" + item.name + "]";
- showTooltip(utf8_to_wide(tooltip), m_default_tooltip_color,
- m_default_tooltip_bgcolor);
- }
- }
- }
- }