]> git.lizzy.rs Git - minetest.git/blobdiff - src/guiFormSpecMenu.cpp
FormSpec: Add StaticTextSpec and superimpose over item image buttons
[minetest.git] / src / guiFormSpecMenu.cpp
index 4784d73145a4daba18114d1e41b26c60a0c6b1ac..226cc6cf0e771f5714b36089cdc4917249a994e6 100644 (file)
@@ -1497,7 +1497,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
                        258 + m_fields.size()
                );
 
-               gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, spec.flabel.c_str());
+               gui::IGUIButton *e = Environment->addButton(rect, this, spec.fid, L"");
 
                if (spec.fname == data->focused_fieldname) {
                        Environment->setFocus(e);
@@ -1515,6 +1515,12 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
                pos.X += stof(v_pos[0]) * (float) spacing.X;
                pos.Y += stof(v_pos[1]) * (float) spacing.Y;
                m_itemimages.push_back(ImageDrawSpec("", item_name, pos, geom));
+
+               StaticTextSpec label_spec(
+                       utf8_to_wide(label),
+                       rect
+               );
+               m_static_texts.push_back(label_spec);
                return;
        }
        errorstream<< "Invalid ItemImagebutton element(" << parts.size() << "): '" << element << "'"  << std::endl;
@@ -1883,6 +1889,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
        m_boxes.clear();
        m_tooltips.clear();
        m_inventory_rings.clear();
+       m_static_texts.clear();
 
        // Set default values (fits old formspec values)
        m_bgcolor = video::SColor(140,0,0,0);
@@ -2196,6 +2203,8 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase,
                        && m_selected_item->listname == s.listname
                        && m_selected_item->i == item_i;
                bool hovering = rect.isPointInside(m_pointer);
+               ItemRotationKind rotation_kind = selected ? IT_ROT_SELECTED :
+                       (hovering ? IT_ROT_HOVERED : IT_ROT_NONE);
 
                if (phase == 0) {
                        if (hovering) {
@@ -2238,7 +2247,7 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase,
                        {
                                drawItemStack(driver, m_font, item,
                                        rect, &AbsoluteClippingRect, m_gamedef,
-                                       selected, hovering, false);
+                                       rotation_kind);
                        }
 
                        // Draw tooltip
@@ -2284,7 +2293,7 @@ void GUIFormSpecMenu::drawSelectedItem()
        if (!m_selected_item) {
                drawItemStack(driver, m_font, ItemStack(),
                        core::rect<s32>(v2s32(0, 0), v2s32(0, 0)),
-                       NULL, m_gamedef, false, false, true);
+                       NULL, m_gamedef, IT_ROT_DRAGGED);
                return;
        }
 
@@ -2297,7 +2306,7 @@ void GUIFormSpecMenu::drawSelectedItem()
 
        core::rect<s32> imgrect(0,0,imgsize.X,imgsize.Y);
        core::rect<s32> rect = imgrect + (m_pointer - imgrect.getCenter());
-       drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, false, false, true);
+       drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, IT_ROT_DRAGGED);
 }
 
 void GUIFormSpecMenu::drawMenu()
@@ -2434,7 +2443,7 @@ void GUIFormSpecMenu::drawMenu()
                // Viewport rectangle on screen
                core::rect<s32> rect = imgrect + spec.pos;
                drawItemStack(driver, m_font, item, rect, &AbsoluteClippingRect,
-                               m_gamedef, false, false, false);
+                               m_gamedef, IT_ROT_NONE);
        }
 
        /*
@@ -2452,7 +2461,7 @@ void GUIFormSpecMenu::drawMenu()
        if (!item_hovered) {
                drawItemStack(driver, m_font, ItemStack(),
                        core::rect<s32>(v2s32(0, 0), v2s32(0, 0)),
-                       NULL, m_gamedef, false, true, false);
+                       NULL, m_gamedef, IT_ROT_HOVERED);
        }
 
 /* TODO find way to show tooltips on touchscreen */
@@ -2460,6 +2469,15 @@ void GUIFormSpecMenu::drawMenu()
        m_pointer = m_device->getCursorControl()->getPosition();
 #endif
 
+       /*
+               Draw static text elements
+       */
+       for (u32 i = 0; i < m_static_texts.size(); i++) {
+               const StaticTextSpec &spec = m_static_texts[i]; 
+               video::SColor color(255, 255, 255, 255);
+               m_font->draw(spec.text.c_str(), spec.rect, color, true, true, &spec.rect);
+       }
+
        /*
                Draw fields/buttons tooltips
        */