diff --git a/src/OpenLoco/src/Input/MouseInput.cpp b/src/OpenLoco/src/Input/MouseInput.cpp index 4a826255e..b6906245b 100644 --- a/src/OpenLoco/src/Input/MouseInput.cpp +++ b/src/OpenLoco/src/Input/MouseInput.cpp @@ -613,9 +613,10 @@ namespace OpenLoco::Input { _ticksSinceDragStart = 1000; - if (window->viewportIsFocusedOnAnyEntity()) + auto* main = Ui::WindowManager::getMainWindow(); + if (main == window && Ui::Windows::Main::viewportIsFocusedOnAnyEntity(*main)) { - window->viewportUnfocusFromEntity(); + Ui::Windows::Main::viewportUnfocusFromEntity(*main); } else { diff --git a/src/OpenLoco/src/Ui/Window.cpp b/src/OpenLoco/src/Ui/Window.cpp index f10d74ace..719b902e1 100644 --- a/src/OpenLoco/src/Ui/Window.cpp +++ b/src/OpenLoco/src/Ui/Window.cpp @@ -643,7 +643,7 @@ namespace OpenLoco::Ui auto main = WindowManager::getMainWindow(); // Unfocus the viewport. - main->viewportConfigurations[0].viewportTargetSprite = EntityId::null; + Ui::Windows::Main::viewportFocusOnEntity(*main, EntityId::null); // Centre viewport on tile/entity. if (savedView.isEntityView()) @@ -677,54 +677,6 @@ namespace OpenLoco::Ui vc->savedViewY = dest.y + rebasedY + (offsetY / (1 << v->zoom)); } - void Window::viewportFocusOnEntity(EntityId targetEntity) - { - if (viewports[0] == nullptr) - { - return; - } - - viewportConfigurations[0].viewportTargetSprite = targetEntity; - } - - bool Window::viewportIsFocusedOnEntity(EntityId targetEntity) const - { - if (targetEntity == EntityId::null || viewports[0] == nullptr) - { - return false; - } - - return viewportConfigurations[0].viewportTargetSprite == targetEntity; - } - - bool Window::viewportIsFocusedOnAnyEntity() const - { - if (viewports[0] == nullptr) - { - return false; - } - - return viewportConfigurations[0].viewportTargetSprite != EntityId::null; - } - - // Stop following the followed entity, leaving the viewport centred on it. - void Window::viewportUnfocusFromEntity() - { - if (viewports[0] == nullptr) - { - return; - } - - if (viewportConfigurations[0].viewportTargetSprite == EntityId::null) - { - return; - } - - auto entity = EntityManager::get(viewportConfigurations[0].viewportTargetSprite); - viewportConfigurations[0].viewportTargetSprite = EntityId::null; - viewportCentreOnTile(entity->position); - } - void Window::viewportZoomSet(int8_t zoomLevel, bool toCursor) { Viewport* v = this->viewports[0]; diff --git a/src/OpenLoco/src/Ui/Window.h b/src/OpenLoco/src/Ui/Window.h index b9cd8871e..9281cf85a 100644 --- a/src/OpenLoco/src/Ui/Window.h +++ b/src/OpenLoco/src/Ui/Window.h @@ -341,10 +341,6 @@ namespace OpenLoco::Ui void moveWindowToLocation(viewport_pos pos); void viewportCentreOnTile(const World::Pos3& loc); void viewportCentreTileAroundCursor(int16_t mapX, int16_t mapY, int16_t offsetX, int16_t offsetY); - void viewportFocusOnEntity(EntityId targetEntity); - bool viewportIsFocusedOnEntity(EntityId targetEntity) const; - bool viewportIsFocusedOnAnyEntity() const; - void viewportUnfocusFromEntity(); void viewportZoomSet(int8_t zoomLevel, bool toCursor); void viewportZoomIn(bool toCursor); void viewportZoomOut(bool toCursor); diff --git a/src/OpenLoco/src/Ui/WindowManager.h b/src/OpenLoco/src/Ui/WindowManager.h index 5c6d336d4..1b024c16f 100644 --- a/src/OpenLoco/src/Ui/WindowManager.h +++ b/src/OpenLoco/src/Ui/WindowManager.h @@ -222,6 +222,11 @@ namespace OpenLoco::Ui::Windows void hideGridlines(); void showDirectionArrows(); void hideDirectionArrows(); + + void viewportFocusOnEntity(Window& main, EntityId targetEntity); + bool viewportIsFocusedOnEntity(const Window& main, EntityId targetEntity); + bool viewportIsFocusedOnAnyEntity(const Window& main); + void viewportUnfocusFromEntity(Window& main); } namespace MapToolTip diff --git a/src/OpenLoco/src/Ui/Windows/Main.cpp b/src/OpenLoco/src/Ui/Windows/Main.cpp index e4a121467..c3ed3b641 100644 --- a/src/OpenLoco/src/Ui/Windows/Main.cpp +++ b/src/OpenLoco/src/Ui/Windows/Main.cpp @@ -1,4 +1,5 @@ #include "Config.h" +#include "Entities/EntityManager.h" #include "Graphics/Gfx.h" #include "Map/Tile.h" #include "Ui/Widget.h" @@ -119,4 +120,52 @@ namespace OpenLoco::Ui::Windows::Main { return kEvents; } + + void viewportFocusOnEntity(Window& main, EntityId targetEntity) + { + if (main.viewports[0] == nullptr) + { + return; + } + + main.viewportConfigurations[0].viewportTargetSprite = targetEntity; + } + + bool viewportIsFocusedOnEntity(const Window& main, EntityId targetEntity) + { + if (targetEntity == EntityId::null || main.viewports[0] == nullptr) + { + return false; + } + + return main.viewportConfigurations[0].viewportTargetSprite == targetEntity; + } + + bool viewportIsFocusedOnAnyEntity(const Window& main) + { + if (main.viewports[0] == nullptr) + { + return false; + } + + return main.viewportConfigurations[0].viewportTargetSprite != EntityId::null; + } + + // Stop following the followed entity, leaving the viewport centred on it. + void viewportUnfocusFromEntity(Window& main) + { + if (main.viewports[0] == nullptr) + { + return; + } + + if (main.viewportConfigurations[0].viewportTargetSprite == EntityId::null) + { + return; + } + + auto entity = EntityManager::get(main.viewportConfigurations[0].viewportTargetSprite); + main.viewportConfigurations[0].viewportTargetSprite = EntityId::null; + main.viewportCentreOnTile(entity->position); + } } diff --git a/src/OpenLoco/src/Ui/Windows/Vehicle.cpp b/src/OpenLoco/src/Ui/Windows/Vehicle.cpp index e035a2167..91605d60c 100644 --- a/src/OpenLoco/src/Ui/Windows/Vehicle.cpp +++ b/src/OpenLoco/src/Ui/Windows/Vehicle.cpp @@ -775,7 +775,7 @@ namespace OpenLoco::Ui::Windows::Vehicle // Focus viewport on vehicle, with locking. auto main = WindowManager::getMainWindow(); - main->viewportFocusOnEntity(targetEntity); + Ui::Windows::Main::viewportFocusOnEntity(*main, targetEntity); } } @@ -4981,9 +4981,9 @@ namespace OpenLoco::Ui::Windows::Vehicle Vehicles::Vehicle train(*head); EntityId viewportFollowEntity = train.veh2->id; auto main = Ui::WindowManager::getMainWindow(); - if (main->viewportIsFocusedOnEntity(viewportFollowEntity)) + if (Ui::Windows::Main::viewportIsFocusedOnEntity(*main, viewportFollowEntity)) { - main->viewportUnfocusFromEntity(); + Ui::Windows::Main::viewportUnfocusFromEntity(*main); } GameCommands::setErrorTitle(StringIds::cant_remove_string_id); diff --git a/src/OpenLoco/src/Vehicles/VehicleManager.cpp b/src/OpenLoco/src/Vehicles/VehicleManager.cpp index ffe6d2f69..8d927dbc9 100644 --- a/src/OpenLoco/src/Vehicles/VehicleManager.cpp +++ b/src/OpenLoco/src/Vehicles/VehicleManager.cpp @@ -225,9 +225,9 @@ namespace OpenLoco::VehicleManager Vehicles::Vehicle train(head); EntityId viewportFollowEntity = train.veh2->id; auto main = Ui::WindowManager::getMainWindow(); - if (main->viewportIsFocusedOnEntity(viewportFollowEntity)) + if (Ui::Windows::Main::viewportIsFocusedOnEntity(*main, viewportFollowEntity)) { - main->viewportUnfocusFromEntity(); + Ui::Windows::Main::viewportUnfocusFromEntity(*main); } Ui::WindowManager::close(Ui::WindowType::vehicle, enumValue(head.id));