Added IgnoreMouseEvents property to Picture and Label so that they can be placed in front of other widgets while the widgets behind the picture/label still receives the mouse events
parent
af77406789
commit
7b22bb4de0
|
@ -257,6 +257,24 @@ namespace tgui
|
||||||
float getMaximumTextWidth() const;
|
float getMaximumTextWidth() const;
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Sets whether the widget should completely ignore mouse events and let them pass to the widgets behind it
|
||||||
|
///
|
||||||
|
/// @param ignore Should mouse events be ignored by this widget?
|
||||||
|
///
|
||||||
|
/// By default, mouse events are NOT ignored.
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
void ignoreMouseEvents(bool ignore = true);
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Returns whether the widget is ignoring mouse events and letting them pass to the widgets behind it
|
||||||
|
///
|
||||||
|
/// @return Are mouse events ignored by this widget?
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
bool isIgnoringMouseEvents() const;
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @internal
|
/// @internal
|
||||||
/// This function is called when the widget is added to a container.
|
/// This function is called when the widget is added to a container.
|
||||||
|
@ -346,6 +364,8 @@ namespace tgui
|
||||||
|
|
||||||
float m_maximumTextWidth = 0;
|
float m_maximumTextWidth = 0;
|
||||||
|
|
||||||
|
bool m_ignoringMouseEvents = false;
|
||||||
|
|
||||||
// Will be set to true after the first click, but gets reset to false when the second click does not occur soon after
|
// Will be set to true after the first click, but gets reset to false when the second click does not occur soon after
|
||||||
bool m_possibleDoubleClick = false;
|
bool m_possibleDoubleClick = false;
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,24 @@ namespace tgui
|
||||||
using Widget::setSize;
|
using Widget::setSize;
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Sets whether the widget should completely ignore mouse events and let them pass to the widgets behind it
|
||||||
|
///
|
||||||
|
/// @param ignore Should mouse events be ignored by this widget?
|
||||||
|
///
|
||||||
|
/// By default, mouse events are NOT ignored.
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
void ignoreMouseEvents(bool ignore = true);
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Returns whether the widget is ignoring mouse events and letting them pass to the widgets behind it
|
||||||
|
///
|
||||||
|
/// @return Are mouse events ignored by this widget?
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
bool isIgnoringMouseEvents() const;
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget
|
/// @brief Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget
|
||||||
///
|
///
|
||||||
|
@ -208,6 +226,8 @@ namespace tgui
|
||||||
|
|
||||||
Sprite m_sprite;
|
Sprite m_sprite;
|
||||||
|
|
||||||
|
bool m_ignoringMouseEvents = false;
|
||||||
|
|
||||||
// Set to true when clicks on transparent parts of the picture should go to the widgets behind the picture
|
// Set to true when clicks on transparent parts of the picture should go to the widgets behind the picture
|
||||||
bool m_ignoreTransparentParts = true;
|
bool m_ignoreTransparentParts = true;
|
||||||
|
|
||||||
|
|
|
@ -718,6 +718,9 @@ namespace tgui
|
||||||
if (node->propertyValuePairs["autosize"])
|
if (node->propertyValuePairs["autosize"])
|
||||||
label->setAutoSize(Deserializer::deserialize(ObjectConverter::Type::Bool, node->propertyValuePairs["autosize"]->value).getBool());
|
label->setAutoSize(Deserializer::deserialize(ObjectConverter::Type::Bool, node->propertyValuePairs["autosize"]->value).getBool());
|
||||||
|
|
||||||
|
if (node->propertyValuePairs["ignoremouseevents"])
|
||||||
|
label->ignoreMouseEvents(Deserializer::deserialize(ObjectConverter::Type::Bool, node->propertyValuePairs["ignoremouseevents"]->value).getBool());
|
||||||
|
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -865,6 +868,9 @@ namespace tgui
|
||||||
else
|
else
|
||||||
picture = Picture::create();
|
picture = Picture::create();
|
||||||
|
|
||||||
|
if (node->propertyValuePairs["ignoremouseevents"])
|
||||||
|
picture->ignoreMouseEvents(Deserializer::deserialize(ObjectConverter::Type::Bool, node->propertyValuePairs["ignoremouseevents"]->value).getBool());
|
||||||
|
|
||||||
loadWidget(node, picture);
|
loadWidget(node, picture);
|
||||||
|
|
||||||
return picture;
|
return picture;
|
||||||
|
|
|
@ -438,6 +438,9 @@ namespace tgui
|
||||||
if (label->getAutoSize())
|
if (label->getAutoSize())
|
||||||
SET_PROPERTY("AutoSize", "true");
|
SET_PROPERTY("AutoSize", "true");
|
||||||
|
|
||||||
|
if (label->isIgnoringMouseEvents())
|
||||||
|
SET_PROPERTY("IgnoreMouseEvents", Serializer::serialize(label->isIgnoringMouseEvents()));
|
||||||
|
|
||||||
SET_PROPERTY("TextSize", to_string(label->getTextSize()));
|
SET_PROPERTY("TextSize", to_string(label->getTextSize()));
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
@ -534,6 +537,10 @@ namespace tgui
|
||||||
{
|
{
|
||||||
auto picture = std::static_pointer_cast<Picture>(widget);
|
auto picture = std::static_pointer_cast<Picture>(widget);
|
||||||
auto node = WidgetSaver::getSaveFunction("widget")(picture);
|
auto node = WidgetSaver::getSaveFunction("widget")(picture);
|
||||||
|
|
||||||
|
if (picture->isIgnoringMouseEvents())
|
||||||
|
SET_PROPERTY("IgnoreMouseEvents", Serializer::serialize(picture->isIgnoringMouseEvents()));
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -190,6 +190,20 @@ namespace tgui
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void Label::ignoreMouseEvents(bool ignore)
|
||||||
|
{
|
||||||
|
m_ignoringMouseEvents = ignore;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool Label::isIgnoringMouseEvents() const
|
||||||
|
{
|
||||||
|
return m_ignoringMouseEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Label::setParent(Container* parent)
|
void Label::setParent(Container* parent)
|
||||||
{
|
{
|
||||||
const bool autoSize = getAutoSize();
|
const bool autoSize = getAutoSize();
|
||||||
|
|
|
@ -77,12 +77,26 @@ namespace tgui
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void Picture::ignoreMouseEvents(bool ignore)
|
||||||
|
{
|
||||||
|
m_ignoringMouseEvents = ignore;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool Picture::isIgnoringMouseEvents() const
|
||||||
|
{
|
||||||
|
return m_ignoringMouseEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
bool Picture::mouseOnWidget(sf::Vector2f pos) const
|
bool Picture::mouseOnWidget(sf::Vector2f pos) const
|
||||||
{
|
{
|
||||||
pos -= getPosition();
|
pos -= getPosition();
|
||||||
|
|
||||||
// Check if the mouse is on top of the picture
|
// Check if the mouse is on top of the picture
|
||||||
if (sf::FloatRect{0, 0, getSize().x, getSize().y}.contains(pos))
|
if (!m_ignoringMouseEvents && (sf::FloatRect{0, 0, getSize().x, getSize().y}.contains(pos)))
|
||||||
{
|
{
|
||||||
// We sometimes want clicks to go through transparent parts of the picture
|
// We sometimes want clicks to go through transparent parts of the picture
|
||||||
if (!m_ignoreTransparentParts && m_sprite.isTransparentPixel(pos))
|
if (!m_ignoreTransparentParts && m_sprite.isTransparentPixel(pos))
|
||||||
|
|
|
@ -128,6 +128,15 @@ TEST_CASE("[Label]")
|
||||||
REQUIRE(label->getMaximumTextWidth() == 500);
|
REQUIRE(label->getMaximumTextWidth() == 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("IgnoreMouseEvents")
|
||||||
|
{
|
||||||
|
REQUIRE(!label->isIgnoringMouseEvents());
|
||||||
|
label->ignoreMouseEvents(true);
|
||||||
|
REQUIRE(label->isIgnoringMouseEvents());
|
||||||
|
label->ignoreMouseEvents(false);
|
||||||
|
REQUIRE(!label->isIgnoringMouseEvents());
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("Events / Signals")
|
SECTION("Events / Signals")
|
||||||
{
|
{
|
||||||
SECTION("ClickableWidget")
|
SECTION("ClickableWidget")
|
||||||
|
@ -219,6 +228,7 @@ TEST_CASE("[Label]")
|
||||||
label->setHorizontalAlignment(tgui::Label::HorizontalAlignment::Center);
|
label->setHorizontalAlignment(tgui::Label::HorizontalAlignment::Center);
|
||||||
label->setVerticalAlignment(tgui::Label::VerticalAlignment::Bottom);
|
label->setVerticalAlignment(tgui::Label::VerticalAlignment::Bottom);
|
||||||
label->setMaximumTextWidth(300);
|
label->setMaximumTextWidth(300);
|
||||||
|
label->ignoreMouseEvents(true);
|
||||||
|
|
||||||
testSavingWidget("Label", label);
|
testSavingWidget("Label", label);
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,15 @@ TEST_CASE("[Picture]")
|
||||||
REQUIRE(picture->getWidgetOffset() == sf::Vector2f(0, 0));
|
REQUIRE(picture->getWidgetOffset() == sf::Vector2f(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("IgnoreMouseEvents")
|
||||||
|
{
|
||||||
|
REQUIRE(!picture->isIgnoringMouseEvents());
|
||||||
|
picture->ignoreMouseEvents(true);
|
||||||
|
REQUIRE(picture->isIgnoringMouseEvents());
|
||||||
|
picture->ignoreMouseEvents(false);
|
||||||
|
REQUIRE(!picture->isIgnoringMouseEvents());
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("Events / Signals")
|
SECTION("Events / Signals")
|
||||||
{
|
{
|
||||||
SECTION("ClickableWidget")
|
SECTION("ClickableWidget")
|
||||||
|
@ -148,6 +157,7 @@ TEST_CASE("[Picture]")
|
||||||
{
|
{
|
||||||
picture->getRenderer()->setTexture("resources/image.png");
|
picture->getRenderer()->setTexture("resources/image.png");
|
||||||
picture->setSize(80, 60);
|
picture->setSize(80, 60);
|
||||||
|
picture->ignoreMouseEvents(true);
|
||||||
|
|
||||||
testSavingWidget("Picture", picture, false);
|
testSavingWidget("Picture", picture, false);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue