1
0
Fork 0

Codechange: Keep track of all open infrastructure windows in a vector highlight the infrastructure of the most recently opened company. Changed code style base on comments.

pull/12164/head
Anthony Lazar 2024-02-23 23:55:34 -05:00
parent 452f25a5dd
commit 804557721c
3 changed files with 22 additions and 18 deletions

View File

@ -53,7 +53,7 @@
/** Company GUI constants. */ /** Company GUI constants. */
static void DoSelectCompanyManagerFace(Window *parent); static void DoSelectCompanyManagerFace(Window *parent);
static void ShowCompanyInfrastructure(CompanyID company); static void ShowCompanyInfrastructure(CompanyID company);
bool _infrastructure_window_open = false; std::vector<CompanyID> _viewport_infrastructure_window_order;
/** List of revenues. */ /** List of revenues. */
static const std::initializer_list<ExpensesType> _expenses_list_revenue = { static const std::initializer_list<ExpensesType> _expenses_list_revenue = {
@ -1831,13 +1831,20 @@ struct CompanyInfrastructureWindow : Window
RoadTypes roadtypes; ///< Valid roadtypes. RoadTypes roadtypes; ///< Valid roadtypes.
uint total_width; ///< String width of the total cost line. uint total_width; ///< String width of the total cost line.
/** /**
* Hide the window and all its child windows, and mark them for a later deletion. * Hide the window and all its child windows, and mark them for a later deletion.
* Stop white highlight of company owned infrastructure * Stop white highlight of company owned infrastructure
*/ */
void Close([[maybe_unused]] int data) override void Close([[maybe_unused]] int data) override
{ {
_infrastructure_window_open = false; auto to_remove_from_order = std::find(_viewport_infrastructure_window_order.begin(), _viewport_infrastructure_window_order.end(), (CompanyID)this->window_number);
/* Cautious error checking */
if (to_remove_from_order != _viewport_infrastructure_window_order.end()) {
_viewport_infrastructure_window_order.erase(to_remove_from_order);
}
MarkWholeScreenDirty(); MarkWholeScreenDirty();
this->Window::Close(); this->Window::Close();
} }
@ -2168,7 +2175,7 @@ static void ShowCompanyInfrastructure(CompanyID company)
{ {
if (!Company::IsValidID(company)) return; if (!Company::IsValidID(company)) return;
AllocateWindowDescFront<CompanyInfrastructureWindow>(&_company_infrastructure_desc, company); AllocateWindowDescFront<CompanyInfrastructureWindow>(&_company_infrastructure_desc, company);
_infrastructure_window_open = true; _viewport_infrastructure_window_order.push_back(company);
MarkWholeScreenDirty(); MarkWholeScreenDirty();
} }

View File

@ -26,6 +26,6 @@ void InvalidateCompanyWindows(const Company *c);
void CloseCompanyWindows(CompanyID company); void CloseCompanyWindows(CompanyID company);
void DirtyCompanyInfrastructureWindows(CompanyID company); void DirtyCompanyInfrastructureWindows(CompanyID company);
extern bool _infrastructure_window_open; extern std::vector<CompanyID> _viewport_infrastructure_window_order;
#endif /* COMPANY_GUI_H */ #endif /* COMPANY_GUI_H */

View File

@ -1038,31 +1038,28 @@ static TileHighlightType GetTileHighlightType(TileIndex t)
} }
} }
if (_current_company < MAX_COMPANIES && _infrastructure_window_open) { /* Highlight infrastructure owned by the company with the most recently currently opened infrastructure window */
/* Edge case of company owned tramway on non-company owned tile */ if (!_viewport_infrastructure_window_order.empty()) {
if (IsTileType(t, MP_ROAD) && !IsRoadDepot(t) && HasTileRoadType(t, RTT_TRAM)) {
if (IsRoadOwner(t, RTT_TRAM, _current_company)) {
return THT_WHITE;
}
}
switch (GetTileType(t)) { switch (GetTileType(t)) {
case MP_ROAD: case MP_ROAD:
/* Edge case of company owned tramway on non-company owned tile */
if (IsTileType(t, MP_ROAD) && !IsRoadDepot(t) && HasTileRoadType(t, RTT_TRAM)) {
if (IsRoadOwner(t, RTT_TRAM, _viewport_infrastructure_window_order.back())) {
return THT_WHITE;
}
}
[[fallthrough]];
case MP_RAILWAY: case MP_RAILWAY:
case MP_TUNNELBRIDGE: case MP_TUNNELBRIDGE:
case MP_WATER: case MP_WATER:
{ if (GetTileOwner(t) == _viewport_infrastructure_window_order.back()) {
CommandCost ret = CheckTileOwnership(t);
if (!ret.Failed()) {
return THT_WHITE; return THT_WHITE;
} }
break; break;
}
default: default:
{
return THT_NONE; return THT_NONE;
break; break;
}
} }
} }
return THT_NONE; return THT_NONE;