diff --git a/include/manager.hpp b/include/manager.hpp index 13b3981..445fd6c 100644 --- a/include/manager.hpp +++ b/include/manager.hpp @@ -33,6 +33,12 @@ private: State* previous_state; std::stack> states; + /** + * Détermine si l'événement donné s'est passé à l'intérieur + * de l'interface et doit être ignoré pour la suite ou non + */ + bool isInsideGUI(const sf::Event& event); + public: /** * Énumération des modificateurs diff --git a/src/manager.cpp b/src/manager.cpp index ca3d254..9f65ce8 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -67,7 +67,11 @@ void Manager::start() { return; } - states.top()->processEvent(event); + // seulement si l'événement ne s'est pas passé dans l'interface + // on le fait passer aux gestionnaires "normaux" + if (!isInsideGUI(event)) { + states.top()->processEvent(event); + } } // s'il n'y a plus d'état, on quitte @@ -143,6 +147,42 @@ void Manager::useGUIView() { window.setView(gui_view); } +bool Manager::isInsideGUI(const sf::Event& event) { + sf::Vector2f check_point; + bool should_check_point = false; + + if (event.type == sf::Event::MouseButtonPressed || + event.type == sf::Event::MouseButtonReleased) { + check_point.x = event.mouseButton.x; + check_point.y = event.mouseButton.y; + should_check_point = true; + } + + if (event.type == sf::Event::MouseMoved) { + check_point.x = event.mouseMove.x; + check_point.y = event.mouseMove.y; + should_check_point = true; + } + + if (event.type == sf::Event::MouseWheelScrolled) { + check_point.x = event.mouseWheelScroll.x; + check_point.y = event.mouseWheelScroll.y; + should_check_point = true; + } + + // si l'événement est de type souris, on regarde que + // le point en question ne se trouve pas dans un des widgets + if (should_check_point) { + for (auto const &widget : widgets) { + if (widget->GetAllocation().contains(check_point)) { + return true; + } + } + } + + return false; +} + void Manager::addWidget(sfg::Widget::Ptr widget) { widgets.push_back(widget); desktop.Add(widget);