From 008b80fe1ca9d46610b8971e2ac92fb56da8e69f Mon Sep 17 00:00:00 2001 From: Paul Ouellette Date: Sat, 24 Aug 2019 12:38:02 -0400 Subject: [PATCH] Add ItemStack:get_description() to get tooltip (#8847) --- doc/lua_api.txt | 1 + src/gui/guiFormSpecMenu.cpp | 30 ++++++++---------------------- src/inventory.cpp | 8 ++++++++ src/inventory.h | 2 ++ src/script/lua_api/l_item.cpp | 11 +++++++++++ src/script/lua_api/l_item.h | 3 +++ 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index c7f6908ad..eaca09fe9 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -5254,6 +5254,7 @@ an itemstring, a table or `nil`. * `get_metadata()`: (DEPRECATED) Returns metadata (a string attached to an item stack). * `set_metadata(metadata)`: (DEPRECATED) Returns true. +* `get_description()`: returns the description shown in inventory list tooltips. * `clear()`: removes all items from the stack, making it empty. * `replace(item)`: replace the contents of this stack. * `item` can also be an itemstring or table. diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index e7eaefd75..c0fa2470b 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -2844,37 +2844,23 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int layer, } if (layer == 1) { - // Draw item stack if (selected) item.takeItem(m_selected_amount); if (!item.empty()) { + // Draw item stack drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect, m_client, rotation_kind); - } - - // Draw tooltip - std::wstring tooltip_text; - if (hovering && !m_selected_item) { - const std::string &desc = item.metadata.getString("description"); - if (desc.empty()) - tooltip_text = - utf8_to_wide(item.getDefinition(m_client->idef()).description); - else - tooltip_text = utf8_to_wide(desc); - - if (!item.name.empty()) { - if (tooltip_text.empty()) - tooltip_text = utf8_to_wide(item.name); - else if (m_tooltip_append_itemname) - tooltip_text += utf8_to_wide("\n[" + item.name + "]"); + // 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); } } - if (!tooltip_text.empty()) { - showTooltip(tooltip_text, m_default_tooltip_color, - m_default_tooltip_bgcolor); - } } } } diff --git a/src/inventory.cpp b/src/inventory.cpp index 40dc602d0..f2cc2ede3 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -246,6 +246,14 @@ std::string ItemStack::getItemString() const return os.str(); } +std::string ItemStack::getDescription(IItemDefManager *itemdef) const +{ + std::string desc = metadata.getString("description"); + if (desc.empty()) + desc = getDefinition(itemdef).description; + return desc.empty() ? name : desc; +} + ItemStack ItemStack::addItem(ItemStack newitem, IItemDefManager *itemdef) { diff --git a/src/inventory.h b/src/inventory.h index 95a0bb43e..3f299993a 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -47,6 +47,8 @@ struct ItemStack // Returns the string used for inventory std::string getItemString() const; + // Returns the tooltip + std::string getDescription(IItemDefManager *itemdef) const; /* Quantity methods diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp index e41d23fd1..f9708b560 100644 --- a/src/script/lua_api/l_item.cpp +++ b/src/script/lua_api/l_item.cpp @@ -175,6 +175,16 @@ int LuaItemStack::l_set_metadata(lua_State *L) return 1; } +// get_description(self) +int LuaItemStack::l_get_description(lua_State *L) +{ + NO_MAP_LOCK_REQUIRED; + LuaItemStack *o = checkobject(L, 1); + std::string desc = o->m_stack.getDescription(getGameDef(L)->idef()); + lua_pushstring(L, desc.c_str()); + return 1; +} + // clear(self) -> true int LuaItemStack::l_clear(lua_State *L) { @@ -470,6 +480,7 @@ const luaL_Reg LuaItemStack::methods[] = { luamethod(LuaItemStack, get_meta), luamethod(LuaItemStack, get_metadata), luamethod(LuaItemStack, set_metadata), + luamethod(LuaItemStack, get_description), luamethod(LuaItemStack, clear), luamethod(LuaItemStack, replace), luamethod(LuaItemStack, to_string), diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h index 5ff715b2a..6fab58045 100644 --- a/src/script/lua_api/l_item.h +++ b/src/script/lua_api/l_item.h @@ -66,6 +66,9 @@ private: // set_metadata(self, string) static int l_set_metadata(lua_State *L); + // get_description(self) + static int l_get_description(lua_State *L); + // clear(self) -> true static int l_clear(lua_State *L);