Skip to content

Commit 4072745

Browse files
committed
Factor out zoom level calculation
1 parent 53d67c4 commit 4072745

File tree

3 files changed

+28
-35
lines changed

3 files changed

+28
-35
lines changed

libs/s25main/desktops/dskGameInterface.cpp

Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,31 @@ enum
9797
ID_btPost,
9898
ID_txtNumMsg
9999
};
100+
101+
float getNextZoomLevel(const float currentZoom)
102+
{
103+
// Get first level bigger than current zoom
104+
// NOLINTNEXTLINE(readability-qualified-auto)
105+
auto it = std::upper_bound(ZOOM_FACTORS.begin(), ZOOM_FACTORS.end(), currentZoom);
106+
return (it == ZOOM_FACTORS.end()) ? ZOOM_FACTORS.front() : *it;
107+
}
108+
109+
float getPreviousZoomLevel(const float currentZoom)
110+
{
111+
// Get last level bigger or equal than current zoom
112+
// NOLINTNEXTLINE(readability-qualified-auto)
113+
auto it = std::lower_bound(ZOOM_FACTORS.begin(), ZOOM_FACTORS.end(), currentZoom);
114+
return (it == ZOOM_FACTORS.begin()) ? ZOOM_FACTORS.back() : *(--it);
100115
}
116+
} // namespace
101117

102118
dskGameInterface::dskGameInterface(std::shared_ptr<Game> game, std::shared_ptr<const NWFInfo> nwfInfo,
103119
unsigned playerIdx, bool initOGL)
104120
: Desktop(nullptr), game_(std::move(game)), nwfInfo_(std::move(nwfInfo)),
105121
worldViewer(playerIdx, const_cast<Game&>(*game_).world_),
106122
gwv(worldViewer, Position(0, 0), VIDEODRIVER.GetRenderSize()), cbb(*LOADER.GetPaletteN("pal5")),
107123
actionwindow(nullptr), roadwindow(nullptr), minimap(worldViewer), isScrolling(false),
108-
zoomLvl_(ZOOM_DEFAULT_INDEX), cheats_(const_cast<Game&>(*game_).world_), cheatCommandTracker_(cheats_)
124+
cheats_(const_cast<Game&>(*game_).world_), cheatCommandTracker_(cheats_)
109125
{
110126
road.mode = RoadBuildMode::Disabled;
111127
road.point = MapPoint(0, 0);
@@ -878,38 +894,15 @@ bool dskGameInterface::Msg_KeyDown(const KeyEvent& ke)
878894
return true;
879895
case 26: // ctrl+z
880896
gwv.SetZoomFactor(ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
881-
zoomLvl_ = ZOOM_DEFAULT_INDEX;
882897
return true;
883898
case 'z': // zoom
884899
if(ke.ctrl)
885-
zoomLvl_ = ZOOM_DEFAULT_INDEX;
886-
else if(zoomLvl_ == ZOOM_FACTORS.size() - 1)
887-
zoomLvl_ = 0;
888-
else if(zoomLvl_.has_value())
889-
(*zoomLvl_)++;
900+
gwv.SetZoomFactor(ZOOM_FACTORS[ZOOM_DEFAULT_INDEX]);
890901
else
891-
{
892-
// Get first level bigger than current zoom
893-
// NOLINTNEXTLINE(readability-qualified-auto)
894-
auto it = std::upper_bound(ZOOM_FACTORS.begin(), ZOOM_FACTORS.end(), gwv.GetCurrentTargetZoomFactor());
895-
zoomLvl_ =
896-
(it == ZOOM_FACTORS.end()) ? ZOOM_FACTORS.size() - 1 : std::distance(ZOOM_FACTORS.begin(), it);
897-
}
898-
gwv.SetZoomFactor(ZOOM_FACTORS[*zoomLvl_]);
902+
gwv.SetZoomFactor(getNextZoomLevel(gwv.GetCurrentTargetZoomFactor()));
899903
return true;
900904
case 'Z': // shift-z, reverse zoom
901-
if(zoomLvl_ == 0u)
902-
zoomLvl_ = ZOOM_FACTORS.size() - 1;
903-
else if(zoomLvl_.has_value())
904-
(*zoomLvl_)--;
905-
else
906-
{
907-
// Get last level bigger or equal than current zoom
908-
// NOLINTNEXTLINE(readability-qualified-auto)
909-
auto it = std::lower_bound(ZOOM_FACTORS.begin(), ZOOM_FACTORS.end(), gwv.GetCurrentTargetZoomFactor());
910-
zoomLvl_ = (it == ZOOM_FACTORS.begin()) ? 0 : std::distance(ZOOM_FACTORS.begin(), it) - 1;
911-
}
912-
gwv.SetZoomFactor(ZOOM_FACTORS[*zoomLvl_]);
905+
gwv.SetZoomFactor(getPreviousZoomLevel(gwv.GetCurrentTargetZoomFactor()));
913906
return true;
914907
}
915908

@@ -929,8 +922,12 @@ bool dskGameInterface::Msg_WheelDown(const MouseCoords&)
929922

930923
void dskGameInterface::WheelZoom(const float step)
931924
{
932-
gwv.SetZoomFactor(gwv.GetCurrentTargetZoomFactor() * (1 + step));
933-
zoomLvl_ = std::nullopt;
925+
auto targetZoomFactor = gwv.GetCurrentTargetZoomFactor() * (1 + step);
926+
targetZoomFactor = std::clamp(targetZoomFactor, ZOOM_FACTORS.front(), ZOOM_FACTORS.back());
927+
if(targetZoomFactor > 1 - ZOOM_WHEEL_INCREMENT && targetZoomFactor < 1 + ZOOM_WHEEL_INCREMENT)
928+
targetZoomFactor = 1.f; // Snap to 100%
929+
930+
gwv.SetZoomFactor(targetZoomFactor);
934931
}
935932

936933
void dskGameInterface::OnBuildingNote(const BuildingNote& note)

libs/s25main/desktops/dskGameInterface.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2005 - 2024 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

@@ -21,7 +21,6 @@
2121
#include "gameTypes/RoadBuildState.h"
2222
#include "liblobby/LobbyInterface.h"
2323
#include <array>
24-
#include <optional>
2524

2625
class IngameWindow;
2726
class glArchivItem_Bitmap;
@@ -166,7 +165,6 @@ class dskGameInterface :
166165

167166
bool isScrolling;
168167
Position startScrollPt;
169-
std::optional<size_t> zoomLvl_;
170168
Subscription evBld;
171169

172170
Cheats cheats_;

libs/s25main/world/GameWorldView.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ void GameWorldView::SetNextZoomFactor()
9090

9191
float GameWorldView::SetZoomFactor(float zoomFactor, bool smoothTransition /* = true*/)
9292
{
93-
targetZoomFactor_ = std::clamp(zoomFactor, ZOOM_FACTORS.front(), ZOOM_FACTORS.back());
94-
if(targetZoomFactor_ > 1 - ZOOM_WHEEL_INCREMENT && targetZoomFactor_ < 1 + ZOOM_WHEEL_INCREMENT)
95-
targetZoomFactor_ = 1.f; // Snap to 100%
93+
targetZoomFactor_ = zoomFactor;
9694
if(!smoothTransition)
9795
{
9896
zoomFactor_ = targetZoomFactor_;

0 commit comments

Comments
 (0)