bool EventManager::handleEvent(sf::Event& event) { // Check if a mouse button has moved if (event.type == sf::Event::MouseMoved) { // Loop through all widgets for (unsigned int i=0; i<m_Widgets.size(); ++i) { // Check if the mouse went down on the widget if (m_Widgets[i]->m_MouseDown) { // Some widgets should always receive mouse move events while dragging them, even if the mouse is no longer on top of them. if ((m_Widgets[i]->m_DraggableWidget) || (m_Widgets[i]->m_ContainerWidget)) { m_Widgets[i]->mouseMoved(static_cast<float>(event.mouseMove.x), static_cast<float>(event.mouseMove.y)); return true; } } } // Check if the mouse is on top of an widget Widget::Ptr widget = mouseOnWidget(static_cast<float>(event.mouseMove.x), static_cast<float>(event.mouseMove.y)); if (widget != nullptr) { // Send the event to the widget widget->mouseMoved(static_cast<float>(event.mouseMove.x), static_cast<float>(event.mouseMove.y)); return true; } return false; } // Check if a mouse button was pressed else if (event.type == sf::Event::MouseButtonPressed) { // Check if the left mouse was pressed if (event.mouseButton.button == sf::Mouse::Left) { // Check if the mouse is on top of an widget Widget::Ptr widget = mouseOnWidget(static_cast<float>(event.mouseButton.x), static_cast<float>(event.mouseButton.y)); if (widget != nullptr) { // Focus the widget focusWidget(widget.get()); // Check if the widget is a container if (widget->m_ContainerWidget) { // If another widget was focused then unfocus it now if ((m_FocusedWidget) && (m_Widgets[m_FocusedWidget-1] != widget)) { m_Widgets[m_FocusedWidget-1]->m_Focused = false; m_Widgets[m_FocusedWidget-1]->widgetUnfocused(); m_FocusedWidget = 0; } } widget->leftMousePressed(static_cast<float>(event.mouseButton.x), static_cast<float>(event.mouseButton.y)); return true; } else // The mouse didn't went down on an widget, so unfocus the focused widget unfocusAllWidgets(); } return false; } // Check if a mouse button was released else if (event.type == sf::Event::MouseButtonReleased) { // Check if the left mouse was released if (event.mouseButton.button == sf::Mouse::Left) { // Check if the mouse is on top of an widget Widget::Ptr widget = mouseOnWidget(static_cast<float>(event.mouseButton.x), static_cast<float>(event.mouseButton.y)); if (widget != nullptr) widget->leftMouseReleased(static_cast<float>(event.mouseButton.x), static_cast<float>(event.mouseButton.y)); // Tell all the other widgets that the mouse has gone up for (std::vector<Widget::Ptr>::iterator it = m_Widgets.begin(); it != m_Widgets.end(); ++it) { if (*it != widget) (*it)->mouseNoLongerDown(); } if (widget != nullptr) return true; } return false; } // Check if a key was pressed else if (event.type == sf::Event::KeyPressed) { // Only continue when the character was recognised if (event.key.code != sf::Keyboard::Unknown) { // Check if there is a focused widget if (m_FocusedWidget) { // Check the pressed key if ((event.key.code == sf::Keyboard::Left) || (event.key.code == sf::Keyboard::Right) || (event.key.code == sf::Keyboard::Up) || (event.key.code == sf::Keyboard::Down) || (event.key.code == sf::Keyboard::BackSpace) || (event.key.code == sf::Keyboard::Delete) || (event.key.code == sf::Keyboard::Space) || (event.key.code == sf::Keyboard::Return)) { // Tell the widget that the key was pressed m_Widgets[m_FocusedWidget-1]->keyPressed(event.key.code); } return true; } } return false; } // Check if a key was released else if (event.type == sf::Event::KeyReleased) { // Change the focus to another widget when the tab key was pressed if (event.key.code == sf::Keyboard::Tab) return tabKeyPressed(); else return false; } // Also check if text was entered (not a special key) else if (event.type == sf::Event::TextEntered) { // Check if the character that we pressed is allowed if ((event.text.unicode >= 30) && (event.text.unicode != 127)) { // Tell the widget that the key was pressed if (m_FocusedWidget) { m_Widgets[m_FocusedWidget-1]->textEntered(event.text.unicode); return true; } } return false; } // Check for mouse wheel scrolling else if (event.type == sf::Event::MouseWheelMoved) { // Find the widget under the mouse Widget::Ptr widget = mouseOnWidget(static_cast<float>(event.mouseWheel.x), static_cast<float>(event.mouseWheel.y)); if (widget != nullptr) { // Send the event to the widget widget->mouseWheelMoved(event.mouseWheel.delta, event.mouseWheel.x, event.mouseWheel.y); return true; } return false; } else // Event is ignored return false; }
void Grid::remove(const Widget::Ptr& widget) { remove(widget.get()); }