|
@@ -949,7 +949,7 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
for(auto& elementInfo : mElementsUnderPointer)
|
|
for(auto& elementInfo : mElementsUnderPointer)
|
|
|
{
|
|
{
|
|
|
- mNewElementsInFocus.push_back(elementInfo);
|
|
|
|
|
|
|
+ mNewElementsInFocus.push_back(ElementInfo(elementInfo.element, elementInfo.widget));
|
|
|
|
|
|
|
|
auto iterFind = std::find_if(begin(mElementsInFocus), end(mElementsInFocus),
|
|
auto iterFind = std::find_if(begin(mElementsInFocus), end(mElementsInFocus),
|
|
|
[=] (const ElementInfo& x) { return x.element == elementInfo.element; });
|
|
[=] (const ElementInfo& x) { return x.element == elementInfo.element; });
|
|
@@ -1169,7 +1169,18 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
if(!element->_isDisabled() && element->_isInBounds(localPos))
|
|
if(!element->_isDisabled() && element->_isInBounds(localPos))
|
|
|
{
|
|
{
|
|
|
- mNewElementsUnderPointer.push_back(ElementInfo(element, widget));
|
|
|
|
|
|
|
+ ElementInfoUnderPointer elementInfo(element, widget);
|
|
|
|
|
+
|
|
|
|
|
+ auto iterFind = std::find_if(mElementsUnderPointer.begin(), mElementsUnderPointer.end(),
|
|
|
|
|
+ [=](const ElementInfoUnderPointer& x) { return x.element == element; });
|
|
|
|
|
+
|
|
|
|
|
+ if (iterFind != mElementsUnderPointer.end())
|
|
|
|
|
+ {
|
|
|
|
|
+ elementInfo.usesMouseOver = iterFind->usesMouseOver;
|
|
|
|
|
+ elementInfo.receivedMouseOver = iterFind->receivedMouseOver;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ mNewElementsUnderPointer.push_back(elementInfo);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1179,63 +1190,80 @@ namespace BansheeEngine
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
std::sort(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
|
|
std::sort(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
|
|
|
- [](const ElementInfo& a, const ElementInfo& b)
|
|
|
|
|
|
|
+ [](const ElementInfoUnderPointer& a, const ElementInfoUnderPointer& b)
|
|
|
{
|
|
{
|
|
|
return a.element->_getDepth() < b.element->_getDepth();
|
|
return a.element->_getDepth() < b.element->_getDepth();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// Send MouseOut and MouseOver events
|
|
// Send MouseOut and MouseOver events
|
|
|
|
|
+
|
|
|
bool eventProcessed = false;
|
|
bool eventProcessed = false;
|
|
|
- for(auto& elementInfo : mElementsUnderPointer)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ for (auto& elementInfo : mNewElementsUnderPointer)
|
|
|
{
|
|
{
|
|
|
GUIElement* element = elementInfo.element;
|
|
GUIElement* element = elementInfo.element;
|
|
|
GUIWidget* widget = elementInfo.widget;
|
|
GUIWidget* widget = elementInfo.widget;
|
|
|
|
|
|
|
|
- auto iterFind = std::find_if(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
|
|
|
|
|
- [=] (const ElementInfo& x) { return x.element == element; });
|
|
|
|
|
|
|
+ if (elementInfo.receivedMouseOver)
|
|
|
|
|
+ {
|
|
|
|
|
+ elementInfo.isHovering = true;
|
|
|
|
|
+ if (elementInfo.usesMouseOver)
|
|
|
|
|
+ break;
|
|
|
|
|
|
|
|
- if(iterFind == mNewElementsUnderPointer.end())
|
|
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ auto iterFind = std::find_if(mActiveElements.begin(), mActiveElements.end(),
|
|
|
|
|
+ [&](const ElementInfo& x) { return x.element == element; });
|
|
|
|
|
+
|
|
|
|
|
+ // Send MouseOver event
|
|
|
|
|
+ if (mActiveElements.size() == 0 || iterFind != mActiveElements.end())
|
|
|
{
|
|
{
|
|
|
- auto iterFind2 = std::find_if(mActiveElements.begin(), mActiveElements.end(),
|
|
|
|
|
- [=](const ElementInfo& x) { return x.element == element; });
|
|
|
|
|
|
|
+ Vector2I localPos;
|
|
|
|
|
+ if (widget != nullptr)
|
|
|
|
|
+ localPos = getWidgetRelativePos(*widget, pointerScreenPos);
|
|
|
|
|
|
|
|
- // Send MouseOut event
|
|
|
|
|
- if(mActiveElements.size() == 0 || iterFind2 != mActiveElements.end())
|
|
|
|
|
- {
|
|
|
|
|
- Vector2I localPos = getWidgetRelativePos(*widget, pointerScreenPos);
|
|
|
|
|
|
|
+ mMouseEvent = GUIMouseEvent(buttonStates, shift, control, alt);
|
|
|
|
|
|
|
|
- mMouseEvent.setMouseOutData(localPos);
|
|
|
|
|
- if(sendMouseEvent(widget, element, mMouseEvent))
|
|
|
|
|
- eventProcessed = true;
|
|
|
|
|
|
|
+ mMouseEvent.setMouseOverData(localPos);
|
|
|
|
|
+ elementInfo.receivedMouseOver = true;
|
|
|
|
|
+ elementInfo.isHovering = true;
|
|
|
|
|
+ if (sendMouseEvent(widget, element, mMouseEvent))
|
|
|
|
|
+ {
|
|
|
|
|
+ eventProcessed = true;
|
|
|
|
|
+ elementInfo.usesMouseOver = true;
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- for(auto& elementInfo : mNewElementsUnderPointer)
|
|
|
|
|
|
|
+ for(auto& elementInfo : mElementsUnderPointer)
|
|
|
{
|
|
{
|
|
|
GUIElement* element = elementInfo.element;
|
|
GUIElement* element = elementInfo.element;
|
|
|
GUIWidget* widget = elementInfo.widget;
|
|
GUIWidget* widget = elementInfo.widget;
|
|
|
|
|
|
|
|
- auto iterFind = std::find_if(begin(mElementsUnderPointer), end(mElementsUnderPointer),
|
|
|
|
|
- [=] (const ElementInfo& x) { return x.element == element; });
|
|
|
|
|
|
|
+ if (!elementInfo.receivedMouseOver)
|
|
|
|
|
+ continue;
|
|
|
|
|
+
|
|
|
|
|
+ auto iterFind = std::find_if(mNewElementsUnderPointer.begin(), mNewElementsUnderPointer.end(),
|
|
|
|
|
+ [=] (const ElementInfoUnderPointer& x) { return x.element == element; });
|
|
|
|
|
|
|
|
- if(iterFind == mElementsUnderPointer.end())
|
|
|
|
|
|
|
+ if (iterFind == mNewElementsUnderPointer.end() || !iterFind->isHovering)
|
|
|
{
|
|
{
|
|
|
auto iterFind2 = std::find_if(mActiveElements.begin(), mActiveElements.end(),
|
|
auto iterFind2 = std::find_if(mActiveElements.begin(), mActiveElements.end(),
|
|
|
- [&](const ElementInfo& x) { return x.element == element; });
|
|
|
|
|
|
|
+ [=](const ElementInfo& x) { return x.element == element; });
|
|
|
|
|
|
|
|
- // Send MouseOver event
|
|
|
|
|
|
|
+ // Send MouseOut event
|
|
|
if(mActiveElements.size() == 0 || iterFind2 != mActiveElements.end())
|
|
if(mActiveElements.size() == 0 || iterFind2 != mActiveElements.end())
|
|
|
{
|
|
{
|
|
|
- Vector2I localPos;
|
|
|
|
|
- if(widget != nullptr)
|
|
|
|
|
- localPos = getWidgetRelativePos(*widget, pointerScreenPos);
|
|
|
|
|
-
|
|
|
|
|
- mMouseEvent = GUIMouseEvent(buttonStates, shift, control, alt);
|
|
|
|
|
|
|
+ Vector2I localPos = getWidgetRelativePos(*widget, pointerScreenPos);
|
|
|
|
|
|
|
|
- mMouseEvent.setMouseOverData(localPos);
|
|
|
|
|
- if(sendMouseEvent(widget, element, mMouseEvent))
|
|
|
|
|
|
|
+ mMouseEvent.setMouseOutData(localPos);
|
|
|
|
|
+ if (sendMouseEvent(widget, element, mMouseEvent))
|
|
|
|
|
+ {
|
|
|
eventProcessed = true;
|
|
eventProcessed = true;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|