Skip to content

Commit 242c110

Browse files
committed
Make sure zooming via mouse goes back to 1.0
Add a check that snaps the value to 1 if close enough. Fixes #1822
1 parent f7fdc70 commit 242c110

File tree

3 files changed

+76
-6
lines changed

3 files changed

+76
-6
lines changed

libs/s25main/gameData/GuiConsts.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
1+
// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org)
22
//
33
// SPDX-License-Identifier: GPL-2.0-or-later
44

55
#pragma once
66

77
#include <array>
88

9-
const std::array<float, 7> SUPPRESS_UNUSED ZOOM_FACTORS = {{0.5f, 0.75f, 1.f, 1.25f, 1.5f, 2.f, 3.f}};
10-
const size_t ZOOM_DEFAULT_INDEX = 2;
11-
const float ZOOM_ACCELERATION = 0.001f;
12-
const float ZOOM_WHEEL_INCREMENT = 0.03f;
9+
constexpr std::array<float, 7> SUPPRESS_UNUSED ZOOM_FACTORS = {{0.5f, 0.75f, 1.f, 1.25f, 1.5f, 2.f, 3.f}};
10+
constexpr size_t ZOOM_DEFAULT_INDEX = 2;
11+
constexpr float ZOOM_ACCELERATION = 0.001f;
12+
constexpr float ZOOM_WHEEL_INCREMENT = 0.03f;

libs/s25main/world/GameWorldView.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ void GameWorldView::SetZoomFactor(float zoomFactor, bool smoothTransition /* = t
9696
targetZoomFactor_ = ZOOM_FACTORS.back();
9797
else
9898
targetZoomFactor_ = zoomFactor;
99+
if(targetZoomFactor_ > 1 - ZOOM_WHEEL_INCREMENT && targetZoomFactor_ < 1 + ZOOM_WHEEL_INCREMENT)
100+
targetZoomFactor_ = 1.f; // Snap to 100%
99101
if(!smoothTransition)
100102
{
101103
zoomFactor_ = targetZoomFactor_;

tests/s25Main/integration/testDskGameInterface.cpp

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2005 - 2021 Settlers Freaks (sf-team at siedler25.org)
1+
// Copyright (C) 2005 - 2025 Settlers Freaks (sf-team at siedler25.org)
22
//
33
// SPDX-License-Identifier: GPL-2.0-or-later
44

@@ -14,6 +14,8 @@
1414
#include "uiHelper/uiHelpers.hpp"
1515
#include "worldFixtures/CreateEmptyWorld.h"
1616
#include "worldFixtures/WorldFixture.h"
17+
#include "gameData/GuiConsts.h"
18+
#include "rttr/test/random.hpp"
1719
#include <boost/test/unit_test.hpp>
1820

1921
// LCOV_EXCL_START
@@ -36,6 +38,9 @@ struct dskGameInterfaceMock : public dskGameInterface
3638
void Msg_PaintBefore() override {}
3739
void Msg_PaintAfter() override {}
3840
using dskGameInterface::actionwindow;
41+
using dskGameInterface::Msg_KeyDown;
42+
using dskGameInterface::Msg_WheelDown;
43+
using dskGameInterface::Msg_WheelUp;
3944
};
4045
struct GameInterfaceFixture : uiHelper::Fixture
4146
{
@@ -227,4 +232,67 @@ BOOST_FIXTURE_TEST_CASE(IwActionClose, GameInterfaceFixture)
227232
BOOST_TEST_REQUIRE(gameDesktop->actionwindow == nullptr);
228233
}
229234

235+
BOOST_FIXTURE_TEST_CASE(Zooming, GameInterfaceFixture)
236+
{
237+
const KeyEvent zoomInEv{KeyType::Char, 'z'};
238+
const KeyEvent zoomOutEv{KeyType::Char, 'Z'};
239+
const KeyEvent zoomDefaultEv{KeyType::Char, 'z', true, false, false}; // Ctrl+z
240+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
241+
for(size_t i = ZOOM_DEFAULT_INDEX + 1; i < ZOOM_FACTORS.size(); i++)
242+
{
243+
gameDesktop->Msg_KeyDown(zoomInEv);
244+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[i]);
245+
}
246+
// Wrap around
247+
gameDesktop->Msg_KeyDown(zoomInEv);
248+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[0]);
249+
gameDesktop->Msg_KeyDown(zoomInEv);
250+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[1]);
251+
252+
gameDesktop->Msg_KeyDown(zoomOutEv);
253+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[0]);
254+
gameDesktop->Msg_KeyDown(zoomOutEv);
255+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS.back());
256+
257+
gameDesktop->Msg_KeyDown(zoomDefaultEv);
258+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
259+
260+
gameDesktop->Msg_WheelDown({});
261+
auto curZoom = view->GetCurrentTargetZoomFactor();
262+
BOOST_TEST(curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
263+
BOOST_TEST(curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX - 1]);
264+
// Go to prev index
265+
gameDesktop->Msg_KeyDown(zoomOutEv);
266+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX - 1]);
267+
268+
gameDesktop->Msg_KeyDown(zoomDefaultEv);
269+
gameDesktop->Msg_WheelUp({});
270+
curZoom = view->GetCurrentTargetZoomFactor();
271+
BOOST_TEST(curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
272+
BOOST_TEST(curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1]);
273+
// Go to next index
274+
gameDesktop->Msg_KeyDown(zoomInEv);
275+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1]);
276+
277+
gameDesktop->Msg_WheelDown({});
278+
curZoom = view->GetCurrentTargetZoomFactor();
279+
BOOST_TEST(curZoom > ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
280+
BOOST_TEST(curZoom < ZOOM_FACTORS[ZOOM_DEFAULT_INDEX + 1]);
281+
// Go to prev index
282+
gameDesktop->Msg_KeyDown(zoomOutEv);
283+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
284+
285+
// Zoom in and out gets to 1.0 (default)
286+
static_assert(ZOOM_FACTORS[ZOOM_DEFAULT_INDEX] == 1.f);
287+
gameDesktop->Msg_WheelUp({});
288+
gameDesktop->Msg_WheelDown({});
289+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == 1.f);
290+
const auto numZoom = rttr::test::randomValue(2, 10);
291+
for(int i = 0; i < numZoom; i++)
292+
gameDesktop->Msg_WheelDown({});
293+
for(int i = 0; i < numZoom; i++)
294+
gameDesktop->Msg_WheelUp({});
295+
BOOST_TEST(view->GetCurrentTargetZoomFactor() == 1.f);
296+
}
297+
230298
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)