diff --git a/changelog.md b/changelog.md index b51e3904d..dc2e46f45 100644 --- a/changelog.md +++ b/changelog.md @@ -6,6 +6,7 @@ TGUI 1.3 (TBD) - All widgets can now be configured to ignore mouse events - Added HorizontalLayout and VerticalLayout to replace widget-specific enums - Added method to associate user data to combo box items +- Added onWindowFocus and onWindowUnfocus signals - Renamed isKeptInParent to getKeepInParent in ChildWindow - Renamed limitTextWidth to setTextWidthLimited in EditBox - String::fromNumber now supports int8_t (but no longer accepts pointers) diff --git a/include/TGUI/Backend/Window/BackendGui.hpp b/include/TGUI/Backend/Window/BackendGui.hpp index 45e9535f0..84dd4c6fa 100644 --- a/include/TGUI/Backend/Window/BackendGui.hpp +++ b/include/TGUI/Backend/Window/BackendGui.hpp @@ -22,7 +22,6 @@ // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - #ifndef TGUI_BACKEND_GUI_HPP #define TGUI_BACKEND_GUI_HPP @@ -68,7 +67,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual ~BackendGui(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Sets the part of the screen to which the gui will render in pixels /// @@ -81,7 +79,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setAbsoluteViewport(const FloatRect& viewport); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Sets the part of the screen to which the gui will render as a ratio relative to the window size /// @@ -96,7 +93,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setRelativeViewport(const FloatRect& viewport); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns to which part of the screen the gui will render /// @return Rect of the window to which the gui will draw @@ -105,7 +101,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD RelFloatRect getViewport() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Sets the part of the gui that will be used to fill the viewport in pixels /// @@ -121,7 +116,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setAbsoluteView(const FloatRect& view); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Sets the part of the gui that will be used to fill the viewport /// @@ -136,7 +130,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setRelativeView(const FloatRect& view); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the part of the gui that will be used to fill the viewport /// @return @@ -145,7 +138,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD RelFloatRect getView() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Passes the event to the widgets /// @@ -156,25 +148,21 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool handleEvent(Event event); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief When the tab key usage is enabled, pressing tab will focus another widget ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setTabKeyUsageEnabled(bool enabled); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns whether the tab key usage is enabled (if so, pressing tab will focus another widget) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD bool isTabKeyUsageEnabled() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Draws all the widgets that were added to the gui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual void draw(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the internal container of the Gui /// @@ -188,7 +176,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD RootContainer::Ptr getContainer() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the backend render target that is assigned to the gui /// @@ -196,7 +183,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD std::shared_ptr getBackendRenderTarget() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Changes the global font /// @@ -205,7 +191,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setFont(const Font& font); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the global font for this gui /// @@ -213,7 +198,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD Font getFont() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns a list of all the widgets /// @@ -222,7 +206,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD const std::vector& getWidgets() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Adds a widget to the container /// @@ -237,7 +220,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void add(const Widget::Ptr& widgetPtr, const String& widgetName = ""); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns a pointer to an earlier created widget /// @@ -253,7 +235,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD Widget::Ptr get(const String& widgetName) const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns a pointer to an earlier created widget /// @@ -274,7 +255,6 @@ TGUI_MODULE_EXPORT namespace tgui return m_container->get(widgetName); } - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Removes a single widget that was added to the container /// @@ -283,14 +263,12 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool remove(const Widget::Ptr& widget); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Removes all widgets that were added to the container /// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void removeAllWidgets(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the child widget that is focused inside this container /// @@ -301,7 +279,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD Widget::Ptr getFocusedChild() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the leaf child widget that is focused inside this container /// @@ -370,7 +347,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD Widget::Ptr getWidgetBelowMouseCursor(Vector2i mousePos, bool recursive) const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Focuses the next widget in the gui /// @@ -381,7 +357,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool focusNextWidget(bool recursive = true); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Focuses the previous widget in the gui /// @@ -392,13 +367,11 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool focusPreviousWidget(bool recursive = true); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Unfocus all the widgets ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void unfocusAllWidgets(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Places a widget before all other widgets, to the front of the z-order /// @@ -406,7 +379,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void moveWidgetToFront(const Widget::Ptr& widget); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Places a widget behind all other widgets, to the back of the z-order /// @@ -414,7 +386,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void moveWidgetToBack(const Widget::Ptr& widget); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Places a widget one step forward in the z-order /// @@ -427,7 +398,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// std::size_t moveWidgetForward(const Widget::Ptr& widget); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Places a widget one step backward in the z-order /// @@ -440,7 +410,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// std::size_t moveWidgetBackward(const Widget::Ptr& widget); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Changes the index of a widget in this container /// @@ -453,7 +422,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool setWidgetIndex(const Widget::Ptr& widget, std::size_t index); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the current index of a widget in this container /// @@ -461,7 +429,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD int getWidgetIndex(const Widget::Ptr& widget) const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Changes the opacity of all widgets /// @@ -470,7 +437,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setOpacity(float opacity); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the opacity of all the widgets /// @@ -479,7 +445,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD float getOpacity() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Changes the character size of all existing and future child widgets. /// @@ -490,7 +455,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setTextSize(unsigned int size); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns the character size for future child widgets (and for existing widgets where the size wasn't changed) /// @@ -498,7 +462,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD unsigned int getTextSize() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Loads the child widgets from a text file /// @@ -507,7 +470,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loadWidgetsFromFile(const String& filename, bool replaceExisting = true); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Saves the child widgets to a text file /// @@ -517,7 +479,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void saveWidgetsToFile(const String& filename); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Loads the child widgets from a string stream /// @@ -526,7 +487,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loadWidgetsFromStream(std::stringstream& stream, bool replaceExisting = true); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Loads the child widgets from a string stream /// @@ -535,7 +495,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loadWidgetsFromStream(std::stringstream&& stream, bool replaceExisting = true); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Saves this the child widgets to a text file /// @@ -544,7 +503,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void saveWidgetsToStream(std::stringstream& stream) const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Overrides which cursor gets shown /// @@ -558,7 +516,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setOverrideMouseCursor(Cursor::Type type); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Undoes the effect of the last call to setOverrideCursor /// @@ -567,7 +524,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void restoreOverrideMouseCursor(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Function that is used by widgets to change the mouse cursor /// @@ -580,7 +536,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void requestMouseCursor(Cursor::Type type); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Sets whether drawing the gui will automatically update the internal clock or whether the user does it manually /// @@ -588,7 +543,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setDrawingUpdatesTime(bool drawUpdatesTime); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Updates the internal clock (for timers, animations and blinking edit cursors) /// @@ -598,7 +552,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool updateTime(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @internal /// @brief Updates the internal clock (for timers, animations and blinking edit cursors) @@ -608,7 +561,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool updateTime(Duration elapsedTime); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Converts the pixel coordinate to a position within the view /// @param pixel coordinate on the window @@ -616,7 +568,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD Vector2f mapPixelToCoords(Vector2i pixel) const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Converts a position within the view to the corresponding pixel coordinate /// @param coord position within the coordinate system that is used by the widgets @@ -624,7 +575,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD Vector2f mapCoordsToPixel(Vector2f coord) const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Give the gui control over the main loop /// @@ -636,7 +586,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual void mainLoop(Color clearColor = {240, 240, 240}) = 0; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief This function is called by TGUI when focusing a text field (EditBox or TextArea). /// It may result in the software keyboard being opened. @@ -645,14 +594,12 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual void startTextInput(FloatRect inputRect); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief This function is called by TGUI when unfocusing a text field (EditBox or TextArea). /// It may result in the software keyboard being closed. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual void stopTextInput(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief This function is called by TGUI when the position of the caret changes in a text field (EditBox or TextArea). /// If an IME is used then this function may move the IME candidate list to the text cursor position. @@ -662,7 +609,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual void updateTextCursorPosition(FloatRect inputRect, Vector2f caretPos); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Changes whether using the arrow keys can be used to navigate between widgets /// @@ -678,7 +624,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setKeyboardNavigationEnabled(bool enabled); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// @brief Returns whether using the arrow keys can be used to navigate between widgets /// @@ -690,7 +635,6 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TGUI_NODISCARD bool isKeyboardNavigationEnabled() const; - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected: @@ -706,12 +650,12 @@ TGUI_MODULE_EXPORT namespace tgui ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// virtual void updateContainerSize(); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public: SignalFloatRect onViewChange = {"ViewChanged"}; //!< The view was changed. Optional parameter: new view rectangle - + Signal onWindowFocus = {"WindowFocused"}; //!< The window sent a GainedFocus event + Signal onWindowUnfocus = {"WindowUnfocused"}; //!< The window sent a LostFocus event ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// protected: diff --git a/src/Backend/Window/BackendGui.cpp b/src/Backend/Window/BackendGui.cpp index 657d83cd9..f3920dfda 100644 --- a/src/Backend/Window/BackendGui.cpp +++ b/src/Backend/Window/BackendGui.cpp @@ -187,11 +187,13 @@ namespace tgui case Event::Type::LostFocus: { m_windowFocused = false; + onWindowFocus.emit(m_container.get()); break; } case Event::Type::GainedFocus: { m_windowFocused = true; + onWindowUnfocus.emit(m_container.get()); break; } case Event::Type::Resized: diff --git a/src/Backend/Window/SDL/BackendGuiSDL.cpp b/src/Backend/Window/SDL/BackendGuiSDL.cpp index e4ba642b4..6f3271492 100644 --- a/src/Backend/Window/SDL/BackendGuiSDL.cpp +++ b/src/Backend/Window/SDL/BackendGuiSDL.cpp @@ -518,9 +518,14 @@ namespace tgui eventProcessed = true; } #if SDL_MAJOR_VERSION >= 3 - else if ((event.type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) || (event.type == SDL_EVENT_WINDOW_MOUSE_LEAVE)) + else if ((event.type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) || (event.type == SDL_EVENT_WINDOW_EXPOSED) + || (event.type == SDL_EVENT_WINDOW_MOUSE_ENTER) || (event.type == SDL_EVENT_WINDOW_MOUSE_LEAVE) + || (event.type == SDL_EVENT_WINDOW_FOCUS_GAINED) || (event.type == SDL_EVENT_WINDOW_FOCUS_LOST)) #else - else if ((event.type == SDL_WINDOWEVENT) && ((event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) || (event.window.event == SDL_WINDOWEVENT_LEAVE))) + else if ((event.type == SDL_WINDOWEVENT) + && ((event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) || (event.window.event == SDL_WINDOWEVENT_EXPOSED) + || (event.window.event == SDL_WINDOWEVENT_ENTER) || (event.window.event == SDL_WINDOWEVENT_LEAVE) + || (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) || (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST))) #endif { eventProcessed = true; diff --git a/src/Backend/Window/SFML/BackendGuiSFML.cpp b/src/Backend/Window/SFML/BackendGuiSFML.cpp index 4970c4b8e..0ccc77682 100644 --- a/src/Backend/Window/SFML/BackendGuiSFML.cpp +++ b/src/Backend/Window/SFML/BackendGuiSFML.cpp @@ -299,9 +299,13 @@ namespace tgui eventProcessed = true; } #if SFML_VERSION_MAJOR >= 3 - else if (event.is() || event.is()) + else if (event.is() + || event.is() || event.is() + || event.is() || event.is()) #else - else if ((event.type == sf::Event::Resized) || (event.type == sf::Event::MouseLeft)) + else if ((event.type == sf::Event::Resized) + || (event.type == sf::Event::MouseEntered) || (event.type == sf::Event::MouseLeft) + || (event.type == sf::Event::GainedFocus) || (event.type == sf::Event::LostFocus)) #endif { eventProcessed = true;