diff --git a/src/graphics/ui/elements/UINode.cpp b/src/graphics/ui/elements/UINode.cpp index a5b0e4d5..49407b8d 100644 --- a/src/graphics/ui/elements/UINode.cpp +++ b/src/graphics/ui/elements/UINode.cpp @@ -74,6 +74,11 @@ UINode* UINode::listenDoubleClick(const onaction& action) { return this; } +UINode* UINode::listenDefocus(const onaction& action) { + defocusCallbacks.listen(action); + return this; +} + void UINode::click(int, int) { pressed = true; } @@ -98,6 +103,7 @@ bool UINode::isPressed() const { void UINode::defocus() { focused = false; + defocusCallbacks.notify(gui); } bool UINode::isFocused() const { diff --git a/src/graphics/ui/elements/UINode.hpp b/src/graphics/ui/elements/UINode.hpp index aad04343..9fc2edc4 100644 --- a/src/graphics/ui/elements/UINode.hpp +++ b/src/graphics/ui/elements/UINode.hpp @@ -114,6 +114,8 @@ namespace gui { ActionsSet actions; /// @brief 'ondoubleclick' callbacks ActionsSet doubleClickCallbacks; + /// @brief 'ondefocus' callbacks + ActionsSet defocusCallbacks; /// @brief element tooltip text std::wstring tooltip; /// @brief element tooltip delay @@ -169,8 +171,9 @@ namespace gui { /// @brief Get element z-index int getZIndex() const; - virtual UINode* listenAction(const onaction &action); - virtual UINode* listenDoubleClick(const onaction &action); + virtual UINode* listenAction(const onaction& action); + virtual UINode* listenDoubleClick(const onaction& action); + virtual UINode* listenDefocus(const onaction& action); virtual void onFocus() {focused = true;} virtual void doubleClick(int x, int y); diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index d76b76b7..f17092a7 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -180,6 +180,10 @@ static void read_uinode( node.listenAction(onclick); } + if (auto ondefocus = create_action(reader, element, "ondefocus")) { + node.listenDefocus(ondefocus); + } + if (auto ondoubleclick = create_action(reader, element, "ondoubleclick")) { node.listenDoubleClick(ondoubleclick); }