diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 7909e5eb44..474d08c42d 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -53,7 +53,7 @@ /** Company GUI constants. */ static void DoSelectCompanyManagerFace(Window *parent); static void ShowCompanyInfrastructure(CompanyID company); -std::vector _viewport_infrastructure_window_order; +CompanyID _viewport_company_to_highlight_infrastructure = INVALID_OWNER; /** List of revenues. */ static const std::initializer_list _expenses_list_revenue = { @@ -1818,6 +1818,7 @@ static constexpr NWidgetPart _nested_company_infrastructure_widgets[] = { NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TOTAL_DESC), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CI_TOTAL), SetFill(0, 1), EndContainer(), + NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_CI_HIGHLIGHT_INFRASTRUCTURE), SetFill(1, 0), SetDataTip(STR_COMPANY_INFRASTRUCTURE_VIEW_HIGHLIGHT_INFRASTRUCTURE, STR_COMPANY_INFRASTRUCTURE_VIEW_HIGHLIGHT_INFRASTRUCTURE_TOOLTIP), EndContainer(), EndContainer(), }; @@ -1838,14 +1839,11 @@ struct CompanyInfrastructureWindow : Window */ void Close([[maybe_unused]] int data) override { - 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); + if(_viewport_company_to_highlight_infrastructure == (CompanyID)this->window_number){ + _viewport_company_to_highlight_infrastructure = INVALID_OWNER; + MarkWholeScreenDirty(); } - - MarkWholeScreenDirty(); this->Window::Close(); } @@ -2045,7 +2043,11 @@ struct CompanyInfrastructureWindow : Window TC_FROMSTRING, SA_RIGHT); } } - + void OnPaint() override + { + this->SetWidgetLoweredState(WID_CI_HIGHLIGHT_INFRASTRUCTURE, _viewport_company_to_highlight_infrastructure == (CompanyID)this->window_number); + this->DrawWidgets(); + } void DrawWidget(const Rect &r, WidgetID widget) const override { const Company *c = Company::Get((CompanyID)this->window_number); @@ -2144,6 +2146,22 @@ struct CompanyInfrastructureWindow : Window break; } } + void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override + { + switch (widget) { + case WID_CI_HIGHLIGHT_INFRASTRUCTURE: + CompanyID window_company_id = (CompanyID)this->window_number; + if(_viewport_company_to_highlight_infrastructure != window_company_id) { + _viewport_company_to_highlight_infrastructure = window_company_id; + MarkWholeScreenDirty(); + } + else { + _viewport_company_to_highlight_infrastructure = INVALID_OWNER; + MarkWholeScreenDirty(); + } + break; + } + } /** * Some data on this window has become invalid. @@ -2176,15 +2194,6 @@ static void ShowCompanyInfrastructure(CompanyID company) if (!Company::IsValidID(company)) return; AllocateWindowDescFront(&_company_infrastructure_desc, company); - /* Check if already open then move up in the order */ - auto to_moveup_in_order = std::find(_viewport_infrastructure_window_order.begin(), _viewport_infrastructure_window_order.end(), company); - - /* Cautious error checking */ - if (to_moveup_in_order != _viewport_infrastructure_window_order.end()) { - _viewport_infrastructure_window_order.erase(to_moveup_in_order); - } - - _viewport_infrastructure_window_order.push_back(company); MarkWholeScreenDirty(); } diff --git a/src/company_gui.h b/src/company_gui.h index c49e75607a..94e59c5fb0 100644 --- a/src/company_gui.h +++ b/src/company_gui.h @@ -26,6 +26,6 @@ void InvalidateCompanyWindows(const Company *c); void CloseCompanyWindows(CompanyID company); void DirtyCompanyInfrastructureWindows(CompanyID company); -extern std::vector _viewport_infrastructure_window_order; + extern CompanyID _viewport_company_to_highlight_infrastructure; #endif /* COMPANY_GUI_H */ diff --git a/src/lang/english.txt b/src/lang/english.txt index e04b85a6da..6333bd43a2 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3933,6 +3933,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Station STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Airports STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/year STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/period +STR_COMPANY_INFRASTRUCTURE_VIEW_HIGHLIGHT_INFRASTRUCTURE :{BLACK}Highlight infrastructure +STR_COMPANY_INFRASTRUCTURE_VIEW_HIGHLIGHT_INFRASTRUCTURE_TOOLTIP:{BLACK}Highlight all infrastructure tiles the company currently owns # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industries diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 73fac4bfc2..9d314d0e20 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -3930,6 +3930,8 @@ STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS :{WHITE}Station STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS :{WHITE}Airports STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_YEAR :{WHITE}{CURRENCY_LONG}/year STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL_PERIOD :{WHITE}{CURRENCY_LONG}/period +STR_COMPANY_INFRASTRUCTURE_VIEW_HIGHLIGHT_INFRASTRUCTURE :{BLACK}Highlight infrastructure +STR_COMPANY_INFRASTRUCTURE_VIEW_HIGHLIGHT_INFRASTRUCTURE_TOOLTIP:{BLACK}Highlight all infrastructure tiles the company currently owns # Industry directory STR_INDUSTRY_DIRECTORY_CAPTION :{WHITE}Industries diff --git a/src/viewport.cpp b/src/viewport.cpp index 0e3838944a..bd5d266666 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1039,19 +1039,19 @@ static TileHighlightType GetTileHighlightType(TileIndex t) } /* Highlight infrastructure owned by the company with the most recently currently opened infrastructure window */ - if (!_viewport_infrastructure_window_order.empty()) { + if (_viewport_company_to_highlight_infrastructure != INVALID_OWNER) { switch (GetTileType(t)) { case MP_ROAD: /* Edge case of company owned tramway on non-company owned road/rail tile */ if (!IsRoadDepot(t) && HasTileRoadType(t, RTT_TRAM)) { - if (IsRoadOwner(t, RTT_TRAM, _viewport_infrastructure_window_order.back())) { + if (IsRoadOwner(t, RTT_TRAM, _viewport_company_to_highlight_infrastructure)) { return THT_WHITE; } } /* Edge case of company owned road on non-company owned rail tile */ if (!IsRoadDepot(t) && HasTileRoadType(t, RTT_ROAD)) { - if (IsRoadOwner(t, RTT_ROAD, _viewport_infrastructure_window_order.back())) { + if (IsRoadOwner(t, RTT_ROAD, _viewport_company_to_highlight_infrastructure)){ return THT_WHITE; } } @@ -1059,7 +1059,7 @@ static TileHighlightType GetTileHighlightType(TileIndex t) case MP_RAILWAY: case MP_TUNNELBRIDGE: case MP_WATER: - if (GetTileOwner(t) == _viewport_infrastructure_window_order.back()) { + if (GetTileOwner(t) == _viewport_company_to_highlight_infrastructure) { return THT_WHITE; } break; diff --git a/src/widgets/company_widget.h b/src/widgets/company_widget.h index f53f83a494..9c92d53429 100644 --- a/src/widgets/company_widget.h +++ b/src/widgets/company_widget.h @@ -184,6 +184,7 @@ enum CompanyInfrastructureWidgets : WidgetID { WID_CI_STATION_COUNT, ///< Count of station. WID_CI_TOTAL_DESC, ///< Description of total. WID_CI_TOTAL, ///< Count of total. + WID_CI_HIGHLIGHT_INFRASTRUCTURE, }; /** Widgets of the #BuyCompanyWindow class. */