27 #include "table/strings.h"
33 static const StringID _performance_titles[] = {
34 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER,
35 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER,
36 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER,
37 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER,
38 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR,
39 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR,
40 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR,
41 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR,
42 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR,
43 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR,
44 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE,
45 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE,
46 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN,
47 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN,
48 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT,
49 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON,
52 static inline StringID GetPerformanceTitleFromValue(uint value)
54 return _performance_titles[std::min(value, 1000u) >> 6];
72 this->companies.clear();
76 this->companies.push_back(c);
104 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
109 int icon_y_offset = (this->line_height - this->icon.height) / 2;
114 uint icon_left = ir.
Indent(rtl ? this->text_width : this->ordinal_width, rtl).left;
117 for (uint i = 0; i != this->companies.size(); i++) {
118 const Company *c = this->companies[i];
120 DrawString(ordinal.left, ordinal.right, ir.top + text_y_offset, STR_COMPANY_LEAGUE_COMPANY_RANK);
127 DrawString(text.left, text.right, ir.top + text_y_offset, STR_COMPANY_LEAGUE_COMPANY_NAME);
136 this->ordinal_width = 0;
143 uint widest_width = 0;
145 for (
auto title : _performance_titles) {
147 if (
width > widest_width) {
148 widest_title = title;
149 widest_width =
width;
181 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
192 static constexpr
NWidgetPart _nested_performance_league_widgets[] = {
204 WDP_AUTO,
"performance_league", 0, 0,
207 _nested_performance_league_widgets
210 void ShowPerformanceLeagueTable()
212 AllocateWindowDescFront<PerformanceLeagueWindow>(_performance_league_desc, 0);
215 static void HandleLinkClick(
Link link)
247 default: NOT_REACHED();
261 std::vector<std::pair<uint, const LeagueTableElement *>> rows;
276 this->title = std::string{};
278 if (lt ==
nullptr)
return;
281 this->title = lt->title;
283 std::vector<const LeagueTableElement *> elements;
285 if (lte->table == this->table) {
286 elements.push_back(lte);
289 std::sort(elements.begin(), elements.end(), [](
auto a,
auto b) { return a->rating > b->rating; });
293 for (uint i = 0; i != elements.size(); i++) {
294 auto *lte = elements[i];
295 if (i > 0 && elements[i - 1]->rating != lte->rating) rank = i;
296 this->rows.emplace_back(rank, lte);
308 void SetStringParameters(
WidgetID widget)
const override
319 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
324 if (lt ==
nullptr)
return;
328 if (!lt->header.empty()) {
333 int icon_y_offset = (this->line_height - this->icon_size.height) / 2;
340 Rect icon_rect = ir.
Indent(this->rank_width + (rtl ? 0 : spacer), rtl).WithWidth(this->icon_size.width, rtl);
341 Rect text_rect = ir.
Indent(this->rank_width + spacer + this->icon_size.width, rtl).
WithWidth(this->text_width, rtl);
342 Rect score_rect = ir.
Indent(this->rank_width + 2 * spacer + this->icon_size.width + this->text_width, rtl).
WithWidth(this->score_width, rtl);
344 for (
auto [rank, lte] : this->rows) {
346 DrawString(rank_rect.left, rank_rect.right, ir.top + text_y_offset, STR_COMPANY_LEAGUE_COMPANY_RANK);
349 DrawString(text_rect.left, text_rect.right, ir.top + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK);
351 DrawString(score_rect.left, score_rect.right, ir.top + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK,
SA_RIGHT);
355 if (!lt->footer.empty()) {
358 ir.top =
DrawStringMultiLine(ir.left, ir.right, ir.top, UINT16_MAX, STR_JUST_RAW_STRING, TC_BLACK);
367 if (lt ==
nullptr)
return;
373 this->rank_width = this->text_width = this->score_width = 0;
374 bool show_icon_column =
false;
375 for (
auto [rank, lte] : this->rows) {
385 if (!show_icon_column) this->icon_size.width = 0;
391 if (!lt->header.empty()) {
395 }
else this->header_height = 0;
397 if (!lt->footer.empty()) {
403 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
409 if (index >= 0 && (uint)index < this->rows.size()) {
410 auto lte = this->rows[index].second;
411 HandleLinkClick(lte->link);
420 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
427 static constexpr
NWidgetPart _nested_script_league_widgets[] = {
442 _nested_script_league_widgets
448 AllocateWindowDescFront<ScriptLeagueWindow>(_script_league_desc, table);
451 void ShowFirstLeagueTable()
455 ShowScriptLeagueTable((*it.begin())->index);
457 ShowPerformanceLeagueTable();
void RebuildDone()
Notify the sortlist that the rebuild is done.
bool NeedRebuild() const
Check if a rebuild is needed.
void ForceRebuild()
Force that a rebuild is needed.
bool Sort(Comp compare)
Sort the list.
void ForceResort()
Force a resort next Sort call Reset the resort timer if used too.
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0.
int line_height
Height of the text lines.
uint header_height
Height of the table header.
uint text_width
The width of the actual text.
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
void OnPaint() override
The window must be repainted.
uint score_width
The width of the score text.
uint rank_width
The width of the rank ordinal.
Dimension icon_size
Dimenion of the company icon.
void BuildTable()
Rebuild the company league list.
Definition of stuff that is very close to a company, like the company struct itself.
void DrawCompanyIcon(CompanyID c, int x, int y)
Draw the icon of a company.
void ShowCompany(CompanyID company)
Show the window with the overview of the company.
GUI Functions related to companies.
Owner
Enum for all companies/owners.
@ INVALID_COMPANY
An invalid company.
@ MAX_COMPANIES
Maximum number of companies.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
bool _ctrl_pressed
Is Ctrl pressed?
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
@ SA_RIGHT
Right align the text (must be a single bit).
@ FS_NORMAL
Index of the normal font in the font tables.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
GUI functions that shouldn't be here.
void ShowExtraViewportWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
void ShowStoryBook(CompanyID company, uint16_t page_id=INVALID_STORY_PAGE, bool centered=false)
Raise or create the story book window for company, at page page_id.
League table GUI functions.
uint8_t LeagueTableID
ID of a league table.
@ LT_COMPANY
Link a company.
@ LT_STORY_PAGE
Link a story page.
@ LT_INDUSTRY
Link an industry.
A number of safeguards to prevent using unsafe methods.
Base types for having sorted lists in GUIs.
This file contains all sprite-related enums and defines.
Definition of base types and functions in a cross-platform compatible way.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
TextDirection _current_text_dir
Text direction of the currently selected language.
void SetDParamStr(size_t n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
Functions related to OTTD's strings.
@ TD_RTL
Text is written right-to-left by default.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
int32_t performance_history
Company score (scale 0-1000)
CompanyEconomyEntry old_economy[MAX_HISTORY_QUARTERS]
Economic data of the company of the last MAX_HISTORY_QUARTERS quarters.
Dimensions (a width and height) of a rectangle in 2D.
Struct about league table elements.
Coordinates of a point in 2D.
Tindex index
Index of this pool item.
static Titem * Get(size_t index)
Returns Titem with given index.
static size_t GetNumItems()
Returns number of valid items in the pool.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
High level window description.
Data structure for an opened window.
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
void DrawWidgets() const
Paint all widgets of a window.
ResizeInfo resize
Resize information.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
int width
width of the window (number of pixels to the right in x direction)
WindowNumber window_number
Window number within the window class.
Map writing/reading functions for tiles.
bool IsValidTile(Tile tile)
Checks if a tile is valid.
bool ScrollMainWindowToTile(TileIndex tile, bool instant)
Scrolls the viewport of the main window to a given location.
Functions related to (drawing on) viewports.
Functions, definitions and such used only by the GUI.
@ WDP_AUTO
Find a place automatically.
int32_t WindowNumber
Number to differentiate different windows of the same class.
@ WC_COMPANY_LEAGUE
Company league window; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.