Formspec: change the appeareance of the cursor on fields and co. (#8665)
authorDS <vorunbekannt75@web.de>
Sat, 11 Jan 2020 19:17:11 +0000 (20:17 +0100)
committerSmallJoker <SmallJoker@users.noreply.github.com>
Sat, 11 Jan 2020 19:17:11 +0000 (20:17 +0100)
src/gui/guiFormSpecMenu.cpp
src/gui/guiFormSpecMenu.h

index f3951f30d943e36d66d4e3f6c4ad40cf0654f1e6..3c9e55d063a40fdde6cab80ce54c5bd0530f1080 100644 (file)
@@ -1304,7 +1304,9 @@ void GUIFormSpecMenu::parsePwdField(parserData* data, const std::string &element
                        name,
                        wlabel,
                        L"",
-                       258 + m_fields.size()
+                       258 + m_fields.size(),
+                       0,
+                       ECI_IBEAM
                        );
 
                spec.send = true;
@@ -1463,7 +1465,9 @@ void GUIFormSpecMenu::parseSimpleField(parserData *data,
                name,
                wlabel,
                utf8_to_wide(unescape_string(default_val)),
-               258 + m_fields.size()
+               258 + m_fields.size(),
+               0,
+               ECI_IBEAM
        );
 
        createTextField(data, spec, rect, false);
@@ -1525,7 +1529,9 @@ void GUIFormSpecMenu::parseTextArea(parserData* data, std::vector<std::string>&
                name,
                wlabel,
                utf8_to_wide(unescape_string(default_val)),
-               258 + m_fields.size()
+               258 + m_fields.size(),
+               0,
+               ECI_IBEAM
        );
 
        createTextField(data, spec, rect, type == "textarea");
@@ -3331,11 +3337,18 @@ void GUIFormSpecMenu::drawMenu()
 #endif
 
        /*
-               Draw fields/buttons tooltips
+               Draw fields/buttons tooltips and update the mouse cursor
        */
        gui::IGUIElement *hovered =
                        Environment->getRootGUIElement()->getElementFromPoint(m_pointer);
 
+#ifndef HAVE_TOUCHSCREENGUI
+       gui::ICursorControl *cursor_control = RenderingEngine::get_raw_device()->
+                       getCursorControl();
+       gui::ECURSOR_ICON current_cursor_icon = cursor_control->getActiveIcon();
+#endif
+       bool hovered_element_found = false;
+
        if (hovered != NULL) {
                s32 id = hovered->getID();
 
@@ -3351,23 +3364,40 @@ void GUIFormSpecMenu::drawMenu()
                        }
                }
 
-               // Find and update the current tooltip
-               if (id != -1 && delta >= m_tooltip_show_delay) {
+               // Find and update the current tooltip and cursor icon
+               if (id != -1) {
                        for (const FieldSpec &field : m_fields) {
 
                                if (field.fid != id)
                                        continue;
 
-                               const std::wstring &text = m_tooltips[field.fname].tooltip;
-                               if (!text.empty())
-                                       showTooltip(text, m_tooltips[field.fname].color,
-                                               m_tooltips[field.fname].bgcolor);
+                               if (delta >= m_tooltip_show_delay) {
+                                       const std::wstring &text = m_tooltips[field.fname].tooltip;
+                                       if (!text.empty())
+                                               showTooltip(text, m_tooltips[field.fname].color,
+                                                       m_tooltips[field.fname].bgcolor);
+                               }
+
+#ifndef HAVE_TOUCHSCREENGUI
+                               if (current_cursor_icon != field.fcursor_icon)
+                                       cursor_control->setActiveIcon(field.fcursor_icon);
+#endif
+
+                               hovered_element_found = true;
 
                                break;
                        }
                }
        }
 
+       if (!hovered_element_found) {
+               // no element is hovered
+#ifndef HAVE_TOUCHSCREENGUI
+               if (current_cursor_icon != ECI_NORMAL)
+                       cursor_control->setActiveIcon(ECI_NORMAL);
+#endif
+       }
+
        m_tooltip_element->draw();
 
        /*
index d6c7628667128690c3776239ea53d1ab4272b87b..155081e085d46e75dec3e65f7fb73b010b135860 100644 (file)
@@ -143,7 +143,8 @@ class GUIFormSpecMenu : public GUIModalMenu
                FieldSpec() = default;
 
                FieldSpec(const std::string &name, const std::wstring &label,
-                               const std::wstring &default_text, s32 id, int priority = 0) :
+                               const std::wstring &default_text, s32 id, int priority = 0,
+                               gui::ECURSOR_ICON cursor_icon = ECI_NORMAL) :
                        fname(name),
                        flabel(label),
                        fdefault(unescape_enriched(translate_string(default_text))),
@@ -151,7 +152,8 @@ class GUIFormSpecMenu : public GUIModalMenu
                        send(false),
                        ftype(f_Unknown),
                        is_exit(false),
-                       priority(priority)
+                       priority(priority),
+                       fcursor_icon(cursor_icon)
                {
                }
 
@@ -165,6 +167,7 @@ class GUIFormSpecMenu : public GUIModalMenu
                // Draw priority for formspec version < 3
                int priority;
                core::rect<s32> rect;
+               gui::ECURSOR_ICON fcursor_icon;
        };
 
        struct TooltipSpec