diff options
| author | DS <vorunbekannt75@web.de> | 2022-10-21 17:11:41 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-21 17:11:41 +0200 |
| commit | 7153cb8a0bd6a0d405e2d84975812164233be4f6 (patch) | |
| tree | ed9aca93153bdd84392be670674bb96d19f98cf5 | |
| parent | 9f0d88407d9dadb1a8cf8c03131eda034f2f19e1 (diff) | |
| download | minetest-7153cb8a0bd6a0d405e2d84975812164233be4f6.tar.xz | |
Fix formspec focus (#12795)
| -rw-r--r-- | src/gui/guiFormSpecMenu.cpp | 2 | ||||
| -rw-r--r-- | src/gui/guiFormSpecMenu.h | 15 | ||||
| -rw-r--r-- | src/util/Optional.h | 54 |
3 files changed, 63 insertions, 8 deletions
diff --git a/src/gui/guiFormSpecMenu.cpp b/src/gui/guiFormSpecMenu.cpp index 846b657d7..b85ee57c4 100644 --- a/src/gui/guiFormSpecMenu.cpp +++ b/src/gui/guiFormSpecMenu.cpp @@ -3046,7 +3046,7 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize) } } else { // Don't keep old focus value - m_focused_element.clear(); + m_focused_element = nullopt; } // Remove children diff --git a/src/gui/guiFormSpecMenu.h b/src/gui/guiFormSpecMenu.h index c01ff817b..d745eab80 100644 --- a/src/gui/guiFormSpecMenu.h +++ b/src/gui/guiFormSpecMenu.h @@ -32,6 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiTable.h" #include "network/networkprotocol.h" #include "client/joystick_controller.h" +#include "util/Optional.h" #include "util/string.h" #include "util/enriched_string.h" #include "StyleSpec.h" @@ -352,13 +353,13 @@ protected: video::SColor m_default_tooltip_color; private: - IFormSource *m_form_src; - TextDest *m_text_dst; - std::string m_last_formname; - u16 m_formspec_version = 1; - std::string m_focused_element = ""; - JoystickController *m_joystick; - bool m_show_debug = false; + IFormSource *m_form_src; + TextDest *m_text_dst; + std::string m_last_formname; + u16 m_formspec_version = 1; + Optional<std::string> m_focused_element = nullopt; + JoystickController *m_joystick; + bool m_show_debug = false; struct parserData { bool explicit_size; diff --git a/src/util/Optional.h b/src/util/Optional.h index eda7fff89..c060efeb5 100644 --- a/src/util/Optional.h +++ b/src/util/Optional.h @@ -103,3 +103,57 @@ public: explicit operator bool() const { return m_has_value; } }; + +template <typename T> +constexpr bool operator==(const Optional<T> &opt, nullopt_t) +{ + return !opt.has_value(); +} +template <typename T> +constexpr bool operator==(nullopt_t, const Optional<T> &opt) +{ + return !opt.has_value(); +} +template <typename T> +constexpr bool operator!=(const Optional<T> &opt, nullopt_t) +{ + return opt.has_value(); +} +template <typename T> +constexpr bool operator!=(nullopt_t, const Optional<T> &opt) +{ + return opt.has_value(); +} + +template <typename T, typename U> +constexpr bool operator==(const Optional<T> &opt, const U &value) +{ + return opt.has_value() && *opt == value; +} +template <typename T, typename U> +constexpr bool operator==(const T &value, const Optional<U> &opt) +{ + return opt.has_value() && value == *opt; +} +template <typename T, typename U> +constexpr bool operator!=(const Optional<T> &opt, const U &value) +{ + return !opt.has_value() || *opt != value; +} +template <typename T, typename U> +constexpr bool operator!=(const T &value, const Optional<U> &opt) +{ + return !opt.has_value() || value != *opt; +} + + +template <typename T, typename U> +constexpr bool operator==(const Optional<T> &lhs, const Optional<U> &rhs) +{ + return lhs.has_value() ? *lhs == rhs : nullopt == rhs; +} +template <typename T, typename U> +constexpr bool operator!=(const Optional<T> &lhs, const Optional<U> &rhs) +{ + return lhs.has_value() ? *lhs != rhs : nullopt != rhs; +} |
