From 74ebbe6c57e77b6d17549511aaff6ff6ea6e777f Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 13:36:04 +0200 Subject: [PATCH 01/12] Move IsMouseOver to Window class --- libs/s25main/Window.cpp | 10 ++++++++++ libs/s25main/Window.h | 4 +++- libs/s25main/controls/ctrlButton.cpp | 13 ++++--------- libs/s25main/controls/ctrlButton.h | 1 - libs/s25main/controls/ctrlMapSelection.cpp | 7 +------ libs/s25main/controls/ctrlMapSelection.h | 1 - 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/libs/s25main/Window.cpp b/libs/s25main/Window.cpp index 631dee92f0..f12735f768 100644 --- a/libs/s25main/Window.cpp +++ b/libs/s25main/Window.cpp @@ -564,3 +564,13 @@ bool Window::IsInLockedRegion(const Position& pos, const Window* exception) cons } return false; } + +bool Window::IsMouseOver() const +{ + return IsMouseOver(VIDEODRIVER.GetMousePos()); +} + +bool Window::IsMouseOver(const MouseCoords& mousePos) const +{ + return IsPointInRect(mousePos.GetPos(), GetDrawRect()); +} diff --git a/libs/s25main/Window.h b/libs/s25main/Window.h index ad466a7293..11ac04e181 100644 --- a/libs/s25main/Window.h +++ b/libs/s25main/Window.h @@ -98,8 +98,10 @@ class Window void LockRegion(Window* window, const Rect& rect); /// Gibt eine gesperrte Region wieder frei. void FreeRegion(Window* window); - /// Check if the gicen point is in a region locked by any window other than exception + /// Check if the given point is in a region locked by any window other than exception bool IsInLockedRegion(const Position& pos, const Window* exception = nullptr) const; + bool IsMouseOver() const; + bool IsMouseOver(const MouseCoords& mousePos) const; /// Set the position for the window void SetPos(const DrawPoint& newPos); diff --git a/libs/s25main/controls/ctrlButton.cpp b/libs/s25main/controls/ctrlButton.cpp index 6b4c7e88e9..d20fd661a2 100644 --- a/libs/s25main/controls/ctrlButton.cpp +++ b/libs/s25main/controls/ctrlButton.cpp @@ -26,13 +26,13 @@ void ctrlButton::SetActive(bool activate) Window::SetActive(activate); if(!activate) state = ButtonState::Up; - else if(IsMouseOver(VIDEODRIVER.GetMousePos())) + else if(IsMouseOver()) state = ButtonState::Hover; } bool ctrlButton::Msg_MouseMove(const MouseCoords& mc) { - if(isEnabled && IsMouseOver(mc.GetPos())) + if(isEnabled && IsMouseOver(mc)) { if(state != ButtonState::Pressed) state = ButtonState::Hover; @@ -47,14 +47,9 @@ bool ctrlButton::Msg_MouseMove(const MouseCoords& mc) } } -bool ctrlButton::IsMouseOver(const Position& mousePos) const -{ - return IsPointInRect(mousePos, GetDrawRect()); -} - bool ctrlButton::Msg_LeftDown(const MouseCoords& mc) { - if(isEnabled && IsMouseOver(mc.GetPos())) + if(isEnabled && IsMouseOver(mc)) { state = ButtonState::Pressed; return true; @@ -67,7 +62,7 @@ bool ctrlButton::Msg_LeftUp(const MouseCoords& mc) { if(state == ButtonState::Pressed) { - if(isEnabled && IsMouseOver(mc.GetPos())) + if(isEnabled && IsMouseOver(mc)) { state = ButtonState::Hover; GetParent()->Msg_ButtonClick(GetID()); diff --git a/libs/s25main/controls/ctrlButton.h b/libs/s25main/controls/ctrlButton.h index 2420ee7d5a..5574f9696a 100644 --- a/libs/s25main/controls/ctrlButton.h +++ b/libs/s25main/controls/ctrlButton.h @@ -41,7 +41,6 @@ class ctrlButton : public Window, public ctrlBaseTooltip void Draw_() override; /// Abgeleitete Klassen müssen erweiterten Button-Inhalt zeichnen virtual void DrawContent() const = 0; - bool IsMouseOver(const Position& mousePos) const; /// Texturfarbe des Buttons TextureColor tc; diff --git a/libs/s25main/controls/ctrlMapSelection.cpp b/libs/s25main/controls/ctrlMapSelection.cpp index 126854cdf6..bd93b464d1 100644 --- a/libs/s25main/controls/ctrlMapSelection.cpp +++ b/libs/s25main/controls/ctrlMapSelection.cpp @@ -119,7 +119,7 @@ void ctrlMapSelection::setPreview(bool previewOnly) bool ctrlMapSelection::Msg_LeftUp(const MouseCoords& mc) { - if(!preview && IsMouseOver(mc.GetPos())) + if(!preview && IsMouseOver(mc)) { const auto pickPos = invertScale(mc.GetPos() - getMapPosition()); @@ -141,11 +141,6 @@ bool ctrlMapSelection::Msg_LeftUp(const MouseCoords& mc) return false; } -bool ctrlMapSelection::IsMouseOver(const Position& mousePos) const -{ - return IsPointInRect(mousePos, GetDrawRect()); -} - float ctrlMapSelection::getScaleFactor() { const auto ratio = PointF(GetSize()) / mapImages.background->GetSize(); diff --git a/libs/s25main/controls/ctrlMapSelection.h b/libs/s25main/controls/ctrlMapSelection.h index 35e7b3b3c8..a565166283 100644 --- a/libs/s25main/controls/ctrlMapSelection.h +++ b/libs/s25main/controls/ctrlMapSelection.h @@ -35,7 +35,6 @@ class ctrlMapSelection : public Window bool Msg_LeftUp(const MouseCoords& mc) override; protected: - bool IsMouseOver(const Position& mousePos) const; void Draw_() override; void updateEnabledMask(); From 3fef0c83258405c0869c7139a705ce029874b03d Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 13:50:31 +0200 Subject: [PATCH 02/12] Remove superflous comments --- libs/s25main/desktops/dskMainMenu.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libs/s25main/desktops/dskMainMenu.cpp b/libs/s25main/desktops/dskMainMenu.cpp index 2f886ff5b1..fda0735851 100644 --- a/libs/s25main/desktops/dskMainMenu.cpp +++ b/libs/s25main/desktops/dskMainMenu.cpp @@ -36,22 +36,15 @@ dskMainMenu::dskMainMenu() { RTTR_Assert(dskMenuBase::ID_FIRST_FREE <= 3); - // "Einzelspieler" AddTextButton(ID_btSingleplayer, DrawPoint(115, 180), Extent(220, 22), TextureColor::Green2, _("Singleplayer"), NormalFont); - // "Mehrspieler" AddTextButton(ID_btMultiplayer, DrawPoint(115, 210), Extent(220, 22), TextureColor::Green2, _("Multiplayer"), NormalFont); - // "Optionen" AddTextButton(ID_btOptions, DrawPoint(115, 250), Extent(220, 22), TextureColor::Green2, _("Options"), NormalFont); - // "Intro" AddTextButton(ID_btIntro, DrawPoint(115, 280), Extent(220, 22), TextureColor::Green2, _("Intro"), NormalFont) ->SetEnabled(false); - // "ReadMe" AddTextButton(ID_btReadme, DrawPoint(115, 310), Extent(220, 22), TextureColor::Green2, _("Readme"), NormalFont); - // "Credits" AddTextButton(ID_btCredits, DrawPoint(115, 340), Extent(220, 22), TextureColor::Green2, _("Credits"), NormalFont); - // "Programm verlassen" AddTextButton(ID_btQuit, DrawPoint(115, 390), Extent(220, 22), TextureColor::Red1, _("Quit program"), NormalFont); AddImage(ID_logo, DrawPoint(20, 20), LOADER.GetImageN("logo", 0)); From 27570b73457850149506f9ffc38f5094cbb193cd Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 13:51:17 +0200 Subject: [PATCH 03/12] Use boundary rect for mouseover check Required e.g. for the image contro. --- libs/s25main/Window.cpp | 2 +- libs/s25main/controls/ctrlImage.cpp | 12 ++++++------ libs/s25main/controls/ctrlImage.h | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/libs/s25main/Window.cpp b/libs/s25main/Window.cpp index f12735f768..9240cdec6a 100644 --- a/libs/s25main/Window.cpp +++ b/libs/s25main/Window.cpp @@ -572,5 +572,5 @@ bool Window::IsMouseOver() const bool Window::IsMouseOver(const MouseCoords& mousePos) const { - return IsPointInRect(mousePos.GetPos(), GetDrawRect()); + return IsPointInRect(mousePos.GetPos(), GetBoundaryRect()); } diff --git a/libs/s25main/controls/ctrlImage.cpp b/libs/s25main/controls/ctrlImage.cpp index 8b9cefe6b6..7489c6edeb 100644 --- a/libs/s25main/controls/ctrlImage.cpp +++ b/libs/s25main/controls/ctrlImage.cpp @@ -12,9 +12,6 @@ ctrlImage::ctrlImage(Window* parent, unsigned id, const DrawPoint& pos, ITexture ctrlImage::~ctrlImage() = default; -/** - * zeichnet das Fenster. - */ void ctrlImage::Draw_() { DrawImage(Rect(GetDrawPos(), GetImageRect().getSize())); @@ -22,11 +19,9 @@ void ctrlImage::Draw_() bool ctrlImage::Msg_MouseMove(const MouseCoords& mc) { - // gültiges Bild? if(GetImage()) { - // Jeweils Tooltip ein- und ausblenden, wenn die Maus über dem Bild ist - if(IsPointInRect(mc.GetPos(), Rect::move(GetImageRect(), GetDrawPos()))) + if(IsMouseOver(mc.GetPos())) ShowTooltip(); else HideTooltip(); @@ -34,3 +29,8 @@ bool ctrlImage::Msg_MouseMove(const MouseCoords& mc) return false; } + +Rect ctrlImage::GetBoundaryRect() const +{ + return Rect::move(GetImageRect(), GetDrawPos()); +} diff --git a/libs/s25main/controls/ctrlImage.h b/libs/s25main/controls/ctrlImage.h index db30d512fd..044b73e80f 100644 --- a/libs/s25main/controls/ctrlImage.h +++ b/libs/s25main/controls/ctrlImage.h @@ -18,6 +18,7 @@ class ctrlImage : public Window, public ctrlBaseTooltip, public ctrlBaseImage ~ctrlImage() override; bool Msg_MouseMove(const MouseCoords& mc) override; + Rect GetBoundaryRect() const; protected: void Draw_() override; From 5548ce4b84a6eac762d1a4aae60bb9b7f83fe1f3 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 14:08:28 +0200 Subject: [PATCH 04/12] Support tooltips for checkboxes --- libs/s25main/controls/ctrlCheck.cpp | 28 ++++++++++++++++++---------- libs/s25main/controls/ctrlCheck.h | 19 ++++++++++++++++--- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/libs/s25main/controls/ctrlCheck.cpp b/libs/s25main/controls/ctrlCheck.cpp index 69c32829ce..2e92733a67 100644 --- a/libs/s25main/controls/ctrlCheck.cpp +++ b/libs/s25main/controls/ctrlCheck.cpp @@ -17,13 +17,11 @@ ctrlCheck::ctrlCheck(Window* parent, unsigned id, const DrawPoint& pos, const Ex : Window(parent, id, pos, size), tc(tc), text(std::move(text)), font(font), check(false), readonly(readonly) {} -/** - * der Messagehandler. - * - * @param[in] msg Die Nachricht. - * @param[in] id Die ID des Quellsteuerelements. - * @param[in] param Ein nachrichtenspezifischer Parameter. - */ +ctrlCheck* ctrlCheck::setTooltip(std::string tooltip) +{ + tooltip_ = std::move(tooltip); + return this; +} bool ctrlCheck::Msg_LeftDown(const MouseCoords& mc) { @@ -37,9 +35,19 @@ bool ctrlCheck::Msg_LeftDown(const MouseCoords& mc) return false; } -/** - * zeichnet das Fenster. - */ +bool ctrlCheck::Msg_MouseMove(const MouseCoords& mc) +{ + if(IsMouseOver(mc.GetPos())) + { + ShowTooltip(); + return true; + } else + { + HideTooltip(); + return false; + } +} + void ctrlCheck::Draw_() { const unsigned short boxSize = 20; diff --git a/libs/s25main/controls/ctrlCheck.h b/libs/s25main/controls/ctrlCheck.h index d7ee434291..50b7fbacf1 100644 --- a/libs/s25main/controls/ctrlCheck.h +++ b/libs/s25main/controls/ctrlCheck.h @@ -5,21 +5,34 @@ #pragma once #include "Window.h" +#include "ctrlBaseTooltip.h" +#include class MouseCoords; class glFont; -class ctrlCheck : public Window +class ctrlCheck : public Window, ctrlBaseTooltip { public: ctrlCheck(Window* parent, unsigned id, const DrawPoint& pos, const Extent& size, TextureColor tc, std::string text, const glFont* font, bool readonly); - void setChecked(bool checked) { this->check = checked; } + ctrlCheck* setChecked(bool checked) + { + this->check = checked; + return this; + } bool isChecked() const { return check; } - void setReadOnly(bool readonly) { this->readonly = readonly; } + ctrlCheck* setReadOnly(bool readonly) + { + this->readonly = readonly; + return this; + } bool isReadOnly() const { return readonly; } + ctrlCheck* setTooltip(std::string tooltip); + bool Msg_LeftDown(const MouseCoords& mc) override; + bool Msg_MouseMove(const MouseCoords& mc) override; protected: void Draw_() override; From 491de9594f032bac4913ebd2f5fceaf0609a5720 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 14:08:59 +0200 Subject: [PATCH 05/12] Support changing the smart cursor option from the ingame settings --- libs/s25main/ingameWindows/iwSettings.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libs/s25main/ingameWindows/iwSettings.cpp b/libs/s25main/ingameWindows/iwSettings.cpp index b98d9a91ca..d69c8772b1 100644 --- a/libs/s25main/ingameWindows/iwSettings.cpp +++ b/libs/s25main/ingameWindows/iwSettings.cpp @@ -23,6 +23,7 @@ enum ID_grpFullscreen, ID_cbResolution, ID_cbInvertMouse, + ID_cbSmartCursor, ID_cbStatisticScale, }; constexpr auto ID_btOn = 1; @@ -30,7 +31,7 @@ constexpr auto ID_btOff = 0; } // namespace iwSettings::iwSettings() - : IngameWindow(CGI_SETTINGS, IngameWindow::posLastOrCenter, Extent(370, 199), _("Settings"), + : IngameWindow(CGI_SETTINGS, IngameWindow::posLastOrCenter, Extent(370, 228), _("Settings"), LOADER.GetImageN("resource", 41)) { // Controls are in 2 columns, the left might be the label for the control on the right @@ -72,6 +73,10 @@ iwSettings::iwSettings() AddCheckBox(ID_cbInvertMouse, curPos, cbSize, TextureColor::Grey, _("Invert Mouse Pan"), NormalFont, false) ->setChecked(SETTINGS.interface.invertMouse); curPos.y += cbSize.y + 3; + AddCheckBox(ID_cbSmartCursor, curPos, cbSize, TextureColor::Grey, _("Smart cursor placement"), NormalFont, false) + ->setChecked(SETTINGS.global.smartCursor) + ->setTooltip(_("Place cursor on default button for new dialogs / action windows (default)")); + curPos.y += cbSize.y + 3; AddCheckBox(ID_cbStatisticScale, curPos, cbSize, TextureColor::Grey, _("Statistics Scale"), NormalFont, false) ->setChecked(SETTINGS.ingame.scale_statistics); } @@ -114,6 +119,10 @@ void iwSettings::Msg_CheckboxChange(const unsigned ctrl_id, const bool checked) switch(ctrl_id) { case ID_cbInvertMouse: SETTINGS.interface.invertMouse = checked; break; + case ID_cbSmartCursor: + SETTINGS.global.smartCursor = checked; + VIDEODRIVER.SetMouseWarping(checked); + break; case ID_cbStatisticScale: SETTINGS.ingame.scale_statistics = checked; break; } } From 07bbaaf65ee7353a12cbfc0f7cb07444dff5a00d Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 14:24:09 +0200 Subject: [PATCH 06/12] Avoid reporting duplicate mouse move events in SDL2 When warping the mouse a new event will be recorded with the SDL2 backend which might lead to handling that event multiple times. For the right-click scrolling this leads to a potential infinite loop of zero-sized movements. Fixes #1791 --- extras/videoDrivers/SDL2/VideoSDL2.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/extras/videoDrivers/SDL2/VideoSDL2.cpp b/extras/videoDrivers/SDL2/VideoSDL2.cpp index c8763848c2..4984bbcb55 100644 --- a/extras/videoDrivers/SDL2/VideoSDL2.cpp +++ b/extras/videoDrivers/SDL2/VideoSDL2.cpp @@ -404,9 +404,16 @@ bool VideoSDL2::MessageLoop() } break; case SDL_MOUSEMOTION: - mouse_xy.pos = getGuiScale().screenToView(Position(ev.motion.x, ev.motion.y)); - CallBack->Msg_MouseMove(mouse_xy); - break; + { + const auto newPos = getGuiScale().screenToView(Position(ev.motion.x, ev.motion.y)); + // Avoid duplicate events especially when warping the mouse + if(newPos != mouse_xy.pos) + { + mouse_xy.pos = newPos; + CallBack->Msg_MouseMove(mouse_xy); + } + } + break; } } From 8671f336294039c0608f29e7cf6ce395fcb011ad Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 14:40:57 +0200 Subject: [PATCH 07/12] Allow newer install-boost action --- .github/workflows/unit-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index ab89b579e8..5bebd3d8f2 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -41,7 +41,7 @@ jobs: with: submodules: true - name: Install boost - uses: MarkusJx/install-boost@v2.4.5 + uses: MarkusJx/install-boost@v2 id: install-boost with: boost_version: ${{env.BOOST_VERSION}} From 79473d2fe9eadeb2c070e323c9a5b9f03037a0c0 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 20:02:39 +0200 Subject: [PATCH 08/12] Make tooltip a public parent class Remove the superflous extra method --- libs/s25main/controls/ctrlCheck.cpp | 6 ------ libs/s25main/controls/ctrlCheck.h | 6 ++---- libs/s25main/ingameWindows/iwSettings.cpp | 4 ++-- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/libs/s25main/controls/ctrlCheck.cpp b/libs/s25main/controls/ctrlCheck.cpp index 2e92733a67..9308ce9762 100644 --- a/libs/s25main/controls/ctrlCheck.cpp +++ b/libs/s25main/controls/ctrlCheck.cpp @@ -17,12 +17,6 @@ ctrlCheck::ctrlCheck(Window* parent, unsigned id, const DrawPoint& pos, const Ex : Window(parent, id, pos, size), tc(tc), text(std::move(text)), font(font), check(false), readonly(readonly) {} -ctrlCheck* ctrlCheck::setTooltip(std::string tooltip) -{ - tooltip_ = std::move(tooltip); - return this; -} - bool ctrlCheck::Msg_LeftDown(const MouseCoords& mc) { if(!readonly && IsPointInRect(mc.GetPos(), GetDrawRect())) diff --git a/libs/s25main/controls/ctrlCheck.h b/libs/s25main/controls/ctrlCheck.h index 50b7fbacf1..5c01fb631c 100644 --- a/libs/s25main/controls/ctrlCheck.h +++ b/libs/s25main/controls/ctrlCheck.h @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later @@ -10,7 +10,7 @@ class MouseCoords; class glFont; -class ctrlCheck : public Window, ctrlBaseTooltip +class ctrlCheck : public Window, public ctrlBaseTooltip { public: ctrlCheck(Window* parent, unsigned id, const DrawPoint& pos, const Extent& size, TextureColor tc, std::string text, @@ -29,8 +29,6 @@ class ctrlCheck : public Window, ctrlBaseTooltip } bool isReadOnly() const { return readonly; } - ctrlCheck* setTooltip(std::string tooltip); - bool Msg_LeftDown(const MouseCoords& mc) override; bool Msg_MouseMove(const MouseCoords& mc) override; diff --git a/libs/s25main/ingameWindows/iwSettings.cpp b/libs/s25main/ingameWindows/iwSettings.cpp index d69c8772b1..fa73dc5c7a 100644 --- a/libs/s25main/ingameWindows/iwSettings.cpp +++ b/libs/s25main/ingameWindows/iwSettings.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later @@ -75,7 +75,7 @@ iwSettings::iwSettings() curPos.y += cbSize.y + 3; AddCheckBox(ID_cbSmartCursor, curPos, cbSize, TextureColor::Grey, _("Smart cursor placement"), NormalFont, false) ->setChecked(SETTINGS.global.smartCursor) - ->setTooltip(_("Place cursor on default button for new dialogs / action windows (default)")); + ->SetTooltip(_("Place cursor on default button for new dialogs / action windows (default)")); curPos.y += cbSize.y + 3; AddCheckBox(ID_cbStatisticScale, curPos, cbSize, TextureColor::Grey, _("Statistics Scale"), NormalFont, false) ->setChecked(SETTINGS.ingame.scale_statistics); From 32acc8b58de965f2ab26b3ff00c25d79ba22a54b Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 20:03:47 +0200 Subject: [PATCH 09/12] Update copyright year --- extras/videoDrivers/SDL2/VideoSDL2.cpp | 2 +- libs/s25main/Window.cpp | 2 +- libs/s25main/Window.h | 2 +- libs/s25main/controls/ctrlButton.cpp | 2 +- libs/s25main/controls/ctrlButton.h | 2 +- libs/s25main/controls/ctrlImage.cpp | 2 +- libs/s25main/controls/ctrlImage.h | 2 +- libs/s25main/controls/ctrlMapSelection.cpp | 2 +- libs/s25main/controls/ctrlMapSelection.h | 2 +- libs/s25main/desktops/dskMainMenu.cpp | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extras/videoDrivers/SDL2/VideoSDL2.cpp b/extras/videoDrivers/SDL2/VideoSDL2.cpp index 4984bbcb55..210eac5324 100644 --- a/extras/videoDrivers/SDL2/VideoSDL2.cpp +++ b/extras/videoDrivers/SDL2/VideoSDL2.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/Window.cpp b/libs/s25main/Window.cpp index 9240cdec6a..00dbc81c2a 100644 --- a/libs/s25main/Window.cpp +++ b/libs/s25main/Window.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2024 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/Window.h b/libs/s25main/Window.h index 11ac04e181..d18d2601e6 100644 --- a/libs/s25main/Window.h +++ b/libs/s25main/Window.h @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/controls/ctrlButton.cpp b/libs/s25main/controls/ctrlButton.cpp index d20fd661a2..b07c65393c 100644 --- a/libs/s25main/controls/ctrlButton.cpp +++ b/libs/s25main/controls/ctrlButton.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/controls/ctrlButton.h b/libs/s25main/controls/ctrlButton.h index 5574f9696a..bc70835e5c 100644 --- a/libs/s25main/controls/ctrlButton.h +++ b/libs/s25main/controls/ctrlButton.h @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/controls/ctrlImage.cpp b/libs/s25main/controls/ctrlImage.cpp index 7489c6edeb..3de64e48eb 100644 --- a/libs/s25main/controls/ctrlImage.cpp +++ b/libs/s25main/controls/ctrlImage.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/controls/ctrlImage.h b/libs/s25main/controls/ctrlImage.h index 044b73e80f..1cce64b8ba 100644 --- a/libs/s25main/controls/ctrlImage.h +++ b/libs/s25main/controls/ctrlImage.h @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/controls/ctrlMapSelection.cpp b/libs/s25main/controls/ctrlMapSelection.cpp index bd93b464d1..e742595e4c 100644 --- a/libs/s25main/controls/ctrlMapSelection.cpp +++ b/libs/s25main/controls/ctrlMapSelection.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2024 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2024 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/controls/ctrlMapSelection.h b/libs/s25main/controls/ctrlMapSelection.h index a565166283..1abb86c36e 100644 --- a/libs/s25main/controls/ctrlMapSelection.h +++ b/libs/s25main/controls/ctrlMapSelection.h @@ -1,4 +1,4 @@ -// Copyright (C) 2024 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2024 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later diff --git a/libs/s25main/desktops/dskMainMenu.cpp b/libs/s25main/desktops/dskMainMenu.cpp index fda0735851..c66811b419 100644 --- a/libs/s25main/desktops/dskMainMenu.cpp +++ b/libs/s25main/desktops/dskMainMenu.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org) +// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org) // // SPDX-License-Identifier: GPL-2.0-or-later From 24f7461c698470339ee1cc3c25ab34083872bc45 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Sun, 24 Aug 2025 20:08:23 +0200 Subject: [PATCH 10/12] Improve tooltip doc --- libs/s25main/WindowManager.h | 5 ++++- libs/s25main/controls/ctrlBaseTooltip.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/s25main/WindowManager.h b/libs/s25main/WindowManager.h index 565cd06e97..9a43186210 100644 --- a/libs/s25main/WindowManager.h +++ b/libs/s25main/WindowManager.h @@ -102,7 +102,10 @@ class WindowManager : public Singleton, public VideoDriverLoaderI void Msg_MouseMove(const MouseCoords& mc) override; /// Verarbeitung Keyboard-Event void Msg_KeyDown(const KeyEvent& ke) override; - // setzt den Tooltip + // Show a tooltip + // ttw: Window that the tooltip is for, used when updating current tooltip + // tooltip: The tooltip text, empty to hide + // updateCurrent: If true, only update if the current tooltip is for ttw void SetToolTip(const ctrlBaseTooltip* ttw, const std::string& tooltip, bool updateCurrent = false); /// Verarbeitung Spielfenstergröße verändert (vom Betriebssystem aus) diff --git a/libs/s25main/controls/ctrlBaseTooltip.h b/libs/s25main/controls/ctrlBaseTooltip.h index dd67989142..23330bcd51 100644 --- a/libs/s25main/controls/ctrlBaseTooltip.h +++ b/libs/s25main/controls/ctrlBaseTooltip.h @@ -14,6 +14,7 @@ class ctrlBaseTooltip ctrlBaseTooltip(std::string tooltip = "") : tooltip_(std::move(tooltip)) {} virtual ~ctrlBaseTooltip(); + /// Set the text to be shown, updates the tooltip if currently shown void SetTooltip(const std::string& tooltip); const std::string& GetTooltip() const { return tooltip_; } /// Swap the tooltips of those controls From c8ec11ba6078b4d1eb01f5d4656347e356ad7038 Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Mon, 25 Aug 2025 13:35:24 +0200 Subject: [PATCH 11/12] Document functions --- libs/s25main/Window.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/s25main/Window.h b/libs/s25main/Window.h index d18d2601e6..c595ccb433 100644 --- a/libs/s25main/Window.h +++ b/libs/s25main/Window.h @@ -100,7 +100,9 @@ class Window void FreeRegion(Window* window); /// Check if the given point is in a region locked by any window other than exception bool IsInLockedRegion(const Position& pos, const Window* exception = nullptr) const; + /// Check if the mouse is hovering over this control, i.e. inside its boundary. bool IsMouseOver() const; + /// Check if the given mouse position inside the boundary of this control. bool IsMouseOver(const MouseCoords& mousePos) const; /// Set the position for the window From 136f1139802a16db6fc6c0b8c9fd1dc368ede7cc Mon Sep 17 00:00:00 2001 From: Alexander Grund Date: Mon, 25 Aug 2025 13:49:37 +0200 Subject: [PATCH 12/12] Test mouseover --- tests/s25Main/UI/testControls.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/s25Main/UI/testControls.cpp b/tests/s25Main/UI/testControls.cpp index 74599ec2c9..4009eab5d3 100644 --- a/tests/s25Main/UI/testControls.cpp +++ b/tests/s25Main/UI/testControls.cpp @@ -14,6 +14,7 @@ #include "driver/KeyEvent.h" #include "driver/MouseCoords.h" #include "helpers/mathFuncs.h" +#include "mockupDrivers/MockupVideoDriver.h" #include "ogl/glFont.h" #include "uiHelper/uiHelpers.hpp" #include "libsiedler2/ArchivItem_Bitmap_Player.h" @@ -27,6 +28,7 @@ #include #include #include +#include #include // LCOV_EXCL_START @@ -54,6 +56,26 @@ static std::unique_ptr createMockFont(const std::vector& chars BOOST_AUTO_TEST_SUITE(Controls) +BOOST_FIXTURE_TEST_CASE(MouseOver, uiHelper::Fixture) +{ + const auto pos = rttr::test::randomPoint(0, std::numeric_limits::max() / 2); + const auto size = rttr::test::randomPoint(10, std::numeric_limits::max() / 2); + const auto font = createMockFont({'H', 'e', 'l', 'o', '?'}); + ctrlTextButton bt(nullptr, 1, pos, size, TextureColor::Bricks, "Hello", font.get(), ""); + BOOST_TEST(bt.IsMouseOver(pos)); + BOOST_TEST(!bt.IsMouseOver(pos - DrawPoint(1, 0))); + BOOST_TEST(!bt.IsMouseOver(pos - DrawPoint(0, 1))); + BOOST_TEST(bt.IsMouseOver(pos + size / 2u)); + BOOST_TEST(bt.IsMouseOver(pos + size - DrawPoint(1, 1))); + BOOST_TEST(!bt.IsMouseOver(pos + size)); + BOOST_TEST(!bt.IsMouseOver(pos + size + DrawPoint(0, 1))); + // Without argument asks the video driver for the mouse position + uiHelper::GetVideoDriver()->SetMousePos(pos + size / 2u); + BOOST_TEST(bt.IsMouseOver()); + uiHelper::GetVideoDriver()->SetMousePos(pos + size * 2u); + BOOST_TEST(!bt.IsMouseOver()); +} + static void resizeMap(libsiedler2::ArchivItem_Map& glMap, const Extent& size) { libsiedler2::ArchivItem_Map map;