Skip to content

Commit

Permalink
Introduce new esf::EventListener
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreasLrx committed Sep 26, 2024
1 parent e23abcc commit 611c134
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 3 deletions.
4 changes: 4 additions & 0 deletions src/ecstasy/integrations/sfml/demo/02_events/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,10 @@ int main(int argc, char **argv)
ecstasy::Registry registry;
esf::RenderWindow &window =
registry.addResource<esf::RenderWindow>(sf::VideoMode(1280, 720), "ECSTASY SFML integration: events");
window.setEventListener([&registry](const sf::Event &event) {
std::cout << "Event " << event.type << std::endl;
return false;
});
registry.addSystem<esf::PollEvents>();
(void)argv;
(void)argc;
Expand Down
77 changes: 76 additions & 1 deletion src/ecstasy/integrations/sfml/resources/RenderWindow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,93 @@
#define ECSTASY_INTEGRATIONS_SFML_RESOURCES_RENDERWINDOW_HPP_

#include <SFML/Graphics/RenderWindow.hpp>
#include <functional>

#include "ecstasy/resources/ObjectWrapper.hpp"

namespace ecstasy::integration::sfml
{

///
/// @brief Event listener type.
///
/// @param[in] event Event to handle.
/// @return true If the event was handled (ie must not be processed anymore).
///
/// @author Andréas Leroux ([email protected])
/// @since 1.0.0 (2024-09-26)
///
using EventListener = std::function<bool(const sf::Event &)>;

///
/// @brief SFML RenderWindow wrapper.
///
/// @author Andréas Leroux ([email protected])
/// @since 1.0.0 (2022-11-16)
///
using RenderWindow = ecstasy::ObjectWrapper<sf::RenderWindow>;
class RenderWindow : public ecstasy::ObjectWrapper<sf::RenderWindow> {
public:
///
/// @brief Construct a new Render Window.
///
/// @tparam Args Argument types of the object constructor.
///
/// @param[in] args Arguments of the object constructor.
///
template <typename... Args>
RenderWindow(Args &&...args)
: ecstasy::ObjectWrapper<sf::RenderWindow>(std::forward<Args>(args)...), _eventListener(nullptr)
{
}

///
/// @brief Destroy the Render Window.
///
~RenderWindow() = default;

///
/// @brief Set the event listener.
///
/// @param[in] listener Event listener.
///
void setEventListener(EventListener listener)
{
_eventListener = listener;
}

///
/// @brief Get the Event Listener
///
/// @return constexpr EventListener& Event listener.
///
/// @author Andréas Leroux ([email protected])
/// @since 1.0.0 (2024-09-26)
///
constexpr EventListener &getEventListener()
{
return _eventListener;
}

///
/// @brief Poll the next event.
///
/// @param[out] event Event to fill.
///
/// @return true If an event was polled.
///
bool pollEvent(sf::Event &event)
{
while (_object.pollEvent(event)) {
// Return true if a usable (ie not stoled by the listener) event was polled
if (!_eventListener || (!_eventListener(event)))
return true;
}
return false;
}

private:
EventListener _eventListener;
};
} // namespace ecstasy::integration::sfml

#endif /* !ECSTASY_INTEGRATIONS_SFML_RESOURCES_RENDERWINDOW_HPP_ */
2 changes: 1 addition & 1 deletion src/ecstasy/integrations/sfml/systems/PollEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ namespace ecstasy::integration::sfml
RR<RenderWindow> windowWrapper = registry.getResource<RenderWindow>();

sf::Event event;
while (windowWrapper->get().pollEvent(event)) {
while (windowWrapper->pollEvent(event)) {
switch (event.type) {
/// Mouse events
case sf::Event::MouseButtonPressed:
Expand Down
2 changes: 1 addition & 1 deletion src/ecstasy/resources/ObjectWrapper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ namespace ecstasy
return _object;
}

private:
protected:
T _object;
};
} // namespace ecstasy
Expand Down

0 comments on commit 611c134

Please sign in to comment.