add 'onmouseenter', 'onmouseleave' ui events

This commit is contained in:
MihailRis 2025-12-10 20:03:41 +03:00
parent d457b2ee7f
commit 78e0ac5a95
5 changed files with 36 additions and 1 deletions

View file

@ -144,6 +144,28 @@ void GUI::actMouse(float delta, const CursorState& cursor) {
}
}
this->hover = hover;
auto node = hover;
while (node) {
if (mouseOver.find(hover) != mouseOver.end()) {
break;
}
mouseOver.insert(node);
node->setMouseOver(true);
auto parent = node->getParent();
if (parent) {
node = parent->shared_from_this();
}
}
for (auto it = mouseOver.begin(); it != mouseOver.end(); ) {
auto node = *it;
if (node->isInside(cursor.pos)) {
++it;
continue;
}
node->setMouseOver(false);
it = mouseOver.erase(it);
}
if (input.jclicked(Mousecode::BUTTON_1)) {
if (pressed == nullptr && this->hover) {

View file

@ -2,6 +2,7 @@
#include "delegates.hpp"
#include <set>
#include <queue>
#include <memory>
#include <vector>
@ -80,6 +81,7 @@ namespace gui {
std::unique_ptr<Camera> uicamera;
std::shared_ptr<Menu> menu;
std::queue<runnable> postRunnables;
std::set<std::shared_ptr<UINode>> mouseOver;
PageLoaderFunc pagesLoader;

View file

@ -52,6 +52,10 @@ void UINode::setHover(bool flag) {
return;
}
hover = flag;
actions.notify(flag ? UIAction::MOUSE_ENTER : UIAction::MOUSE_LEAVE, gui);
}
void UINode::setMouseOver(bool flag) {
actions.notify(flag ? UIAction::MOUSE_OVER : UIAction::MOUSE_OUT, gui);
}

View file

@ -59,7 +59,9 @@ namespace gui {
DEFOCUS,
RIGHT_CLICK,
MOUSE_OVER,
MOUSE_OUT
MOUSE_OUT,
MOUSE_ENTER,
MOUSE_LEAVE,
};
using ActionsSet = TaggedCallbacksSet<UIAction, GUI&>;
@ -170,8 +172,11 @@ namespace gui {
virtual void setHover(bool flag);
bool isHover() const;
void setMouseOver(bool flag);
virtual void setParent(UINode* node);
UINode* getParent() const;
std::shared_ptr<UINode> getParentShared() const;
/// @brief Set element color (doesn't affect inner elements).
/// Also replaces hover color to avoid adding extra properties

View file

@ -186,6 +186,8 @@ static void read_uinode(
register_action(node, reader, element, "ondoubleclick", UIAction::DOUBLE_CLICK);
register_action(node, reader, element, "onmouseover", UIAction::MOUSE_OVER);
register_action(node, reader, element, "onmouseout", UIAction::MOUSE_OUT);
register_action(node, reader, element, "onmouseenter", UIAction::MOUSE_ENTER);
register_action(node, reader, element, "onmouseleave", UIAction::MOUSE_LEAVE);
}
static void read_container_impl(