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
102118dskGameInterface::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
930923void 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
936933void dskGameInterface::OnBuildingNote (const BuildingNote& note)
0 commit comments