Fix: Bridge deck sprites were not toyland aware (#14821)

This commit is contained in:
Richard Wheeler
2025-11-24 19:43:12 +00:00
committed by dP
parent d39f7d2458
commit 18649c800b
25 changed files with 417 additions and 30 deletions
+64 -4
View File
@@ -13,11 +13,14 @@
#include "error.h"
#include "gui.h"
#include "gfx_layout.h"
#include "tilehighlight_func.h"
#include "command_func.h"
#include "company_func.h"
#include "town.h"
#include "string_func.h"
#include "company_base.h"
#include "station_base.h"
#include "waypoint_base.h"
#include "texteff.hpp"
#include "strings_func.h"
#include "window_func.h"
@@ -27,6 +30,8 @@
#include "zoom_func.h"
#include "viewport_func.h"
#include "landscape_cmd.h"
#include "station_cmd.h"
#include "waypoint_cmd.h"
#include "rev.h"
#include "timer/timer.h"
#include "timer/timer_window.h"
@@ -938,6 +943,8 @@ struct QueryStringWindow : public Window
QueryString editbox; ///< Editbox.
QueryStringFlags flags{}; ///< Flags controlling behaviour of the window.
WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action.
QueryStringWindow(std::string_view str, StringID caption, uint max_bytes, uint max_chars, WindowDesc &desc, Window *parent, CharSetFilter afilter, QueryStringFlags flags) :
Window(desc), editbox(max_bytes, max_chars)
{
@@ -952,7 +959,9 @@ struct QueryStringWindow : public Window
this->editbox.text.afilter = afilter;
this->flags = flags;
this->InitNested(WN_QUERY_STRING);
this->CreateNestedTree();
this->GetWidget<NWidgetStacked>(WID_QS_MOVE_SEL)->SetDisplayedPlane((this->flags.Test(QueryStringFlag::EnableMove)) ? 0 : SZSP_NONE);
this->FinishInitNested(WN_QUERY_STRING);
this->parent = parent;
@@ -1000,16 +1009,64 @@ struct QueryStringWindow : public Window
case WID_QS_CANCEL:
this->Close();
break;
case WID_QS_MOVE:
this->last_user_action = widget;
if (Station::IsExpected(Station::Get(this->parent->window_number))) {
/* this is a station */
SetViewportStationRect(Station::Get(this->parent->window_number), !this->IsWidgetLowered(WID_QS_MOVE));
} else {
/* this is a waypoint */
SetViewportWaypointRect(Waypoint::Get(this->parent->window_number), !this->IsWidgetLowered(WID_QS_MOVE));
}
HandlePlacePushButton(this, WID_QS_MOVE, SPR_CURSOR_SIGN, HT_RECT, CM_DDSP_MOVE_SIGN);
break;
}
}
void OnPlaceObject([[maybe_unused]] Point pt, TileIndex tile) override
{
switch (this->last_user_action) {
case WID_QS_MOVE: // Move name button
if (Station::IsExpected(Station::Get(this->parent->window_number))) {
/* this is a station */
Command<CMD_MOVE_STATION_NAME>::Post(STR_ERROR_CAN_T_MOVE_STATION_NAME, CcMoveStationName, this->parent->window_number, tile);
} else {
/* this is a waypoint */
Command<CMD_MOVE_WAYPOINT_NAME>::Post(STR_ERROR_CAN_T_MOVE_WAYPOINT_NAME, CcMoveWaypointName, this->parent->window_number, tile);
}
break;
default: NOT_REACHED();
}
}
void OnPlaceObjectAbort() override
{
if (Station::IsExpected(Station::Get(this->parent->window_number))) {
/* this is a station */
SetViewportStationRect(Station::Get(this->parent->window_number), false);
} else {
/* this is a waypoint */
SetViewportWaypointRect(Waypoint::Get(this->parent->window_number), false);
}
this->RaiseButtons();
}
void Close([[maybe_unused]] int data = 0) override
{
if (this->parent->window_class == WC_STATION_VIEW) SetViewportStationRect(Station::Get(this->parent->window_number), false);
if (this->parent->window_class == WC_WAYPOINT_VIEW) SetViewportWaypointRect(Waypoint::Get(this->parent->window_number), false);
if (!this->editbox.handled && this->parent != nullptr) {
Window *parent = this->parent;
this->parent = nullptr; // so parent doesn't try to close us again
parent->OnQueryTextFinished(std::nullopt);
}
this->Window::Close();
}
};
@@ -1023,9 +1080,12 @@ static constexpr std::initializer_list<NWidgetPart> _nested_query_string_widgets
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_QS_TEXT), SetMinimalSize(256, 0), SetFill(1, 0), SetPadding(2, 2, 2, 2),
EndContainer(),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(87, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(86, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_CANCEL),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(87, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_OK),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_DEFAULT), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_DEFAULT),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_CANCEL), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_CANCEL),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_OK), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_OK),
NWidget(NWID_SELECTION, INVALID_COLOUR, WID_QS_MOVE_SEL),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_QS_MOVE), SetMinimalSize(65, 12), SetFill(1, 1), SetStringTip(STR_BUTTON_MOVE),
EndContainer(),
EndContainer(),
};