35#include "table/strings.h"
59 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
105 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
107 if (!gui_scope)
return;
122 vert->SetPadding(2, 2, 2, 2);
126 auto panel = std::make_unique<NWidgetBackground>(
WWT_PANEL, COLOUR_BROWN, widnum);
129 panel->SetFill(1, 1);
130 panel->SetToolTip(STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP);
131 vert->Add(std::move(panel));
136static constexpr std::initializer_list<NWidgetPart> _nested_graph_legend_widgets = {
152 _nested_graph_legend_widgets
155static void ShowGraphLegend()
172 static const int GRAPH_MAX_DATASETS = 64;
193 uint8_t month_increment = 0;
194 int16_t x_values_increment = 0;
198 static inline constexpr GraphScale MONTHLY_SCALE_WALLCLOCK[] = {
199 {STR_GRAPH_LAST_24_MINUTES_TIME_LABEL, HISTORY_MONTH.total_division,
ECONOMY_MONTH_MINUTES, &HISTORY_MONTH},
200 {STR_GRAPH_LAST_72_MINUTES_TIME_LABEL, HISTORY_QUARTER.total_division,
ECONOMY_QUARTER_MINUTES, &HISTORY_QUARTER},
201 {STR_GRAPH_LAST_288_MINUTES_TIME_LABEL, HISTORY_YEAR.total_division,
ECONOMY_YEAR_MINUTES, &HISTORY_YEAR},
204 static inline constexpr GraphScale MONTHLY_SCALE_CALENDAR[] = {
213 uint8_t num_on_x_axis = 0;
234 std::array<OverflowSafeInt64, GRAPH_NUM_MONTHS> values;
240 std::vector<DataSet> data{};
242 std::span<const StringID> ranges{};
243 std::span<const GraphScale> scales{};
244 uint8_t selected_scale = 0;
253 inline void MakeZero(uint i)
const { this->dataset.values[i] = 0; }
254 inline void MakeInvalid(uint i)
const { this->dataset.values[i] =
INVALID_DATAPOINT; }
257 template <
typename Tprojection>
261 inline void Fill(uint i,
const auto &data)
const { this->
dataset.values[i] = std::invoke(this->proj, data); }
271 return {std::begin(dataset.values), std::begin(dataset.values) + this->num_on_x_axis};
282 assert(num_hori_lines > 0);
285 current_interval.
highest = INT64_MIN;
286 current_interval.
lowest = INT64_MAX;
288 for (
const DataSet &dataset : this->data) {
289 if (
HasBit(this->excluded_data, dataset.exclude_bit))
continue;
290 if (
HasBit(this->excluded_range, dataset.range_bit))
continue;
292 for (
const OverflowSafeInt64 &datapoint : this->
GetDataSetRange(dataset)) {
294 current_interval.
highest = std::max(current_interval.
highest, datapoint);
295 current_interval.
lowest = std::min(current_interval.
lowest, datapoint);
301 double abs_lower = (current_interval.
lowest > 0) ? 0 : (double)
abs(current_interval.
lowest);
302 double abs_higher = (current_interval.
highest < 0) ? 0 : (double)current_interval.
highest;
305 abs_higher = (11.0 * abs_higher) / 10.0;
306 abs_lower = (11.0 * abs_lower) / 10.0;
309 OverflowSafeInt64 grid_size;
311 if (abs_lower != 0 || abs_higher != 0) {
313 num_pos_grids = (int)floor(0.5 + num_hori_lines * abs_higher / (abs_higher + abs_lower));
316 if (num_pos_grids == 0 && abs_higher != 0) num_pos_grids++;
317 if (num_pos_grids == num_hori_lines && abs_lower != 0) num_pos_grids--;
321 OverflowSafeInt64 grid_size_higher = 0;
322 if (abs_higher > 0) {
323 grid_size_higher = abs_higher >
INT64_MAX_IN_DOUBLE ? INT64_MAX :
static_cast<int64_t
>(abs_higher);
324 grid_size_higher = (grid_size_higher + num_pos_grids - 1) / num_pos_grids;
327 OverflowSafeInt64 grid_size_lower = 0;
329 grid_size_lower = abs_lower >
INT64_MAX_IN_DOUBLE ? INT64_MAX :
static_cast<int64_t
>(abs_lower);
330 grid_size_lower = (grid_size_lower + num_hori_lines - num_pos_grids - 1) / (num_hori_lines - num_pos_grids);
333 grid_size = std::max(grid_size_higher, grid_size_lower);
336 num_pos_grids = num_hori_lines / 2;
340 current_interval.
highest = num_pos_grids * grid_size;
341 current_interval.
lowest = -(num_hori_lines - num_pos_grids) * grid_size;
342 return current_interval;
354 int64_t y_label = current_interval.
highest;
355 int64_t y_label_separation = (current_interval.
highest - current_interval.
lowest) / num_hori_lines;
359 for (
int i = 0; i < (num_hori_lines + 1); i++) {
361 if (d.width > max_width) max_width = d.width;
363 y_label -= y_label_separation;
381 static_assert(GRAPH_MAX_DATASETS >= (int)
NUM_CARGO && GRAPH_MAX_DATASETS >= (int)MAX_COMPANIES);
382 assert(this->num_vert_lines > 0);
404 r.right -= label_width;
406 r.left += label_width;
409 int x_sep = (r.right - r.left) / this->num_vert_lines;
410 int y_sep = (r.bottom - r.top) / num_hori_lines;
415 r.left = r.right - x_sep * this->num_vert_lines;
417 r.right = r.left + x_sep * this->num_vert_lines;
419 r.bottom = r.top + y_sep * num_hori_lines;
423 x_axis_offset = (int)((r.bottom - r.top) * (
double)interval.
highest / (
double)interval_size);
426 GfxFillRect(r.left, r.top, r.right, r.bottom, GRAPH_BASE_COLOUR);
440 for (
int i = 1; i < this->num_vert_lines + 1; i++) {
443 grid_colour = (i % 4 == 0) ? GRAPH_YEAR_LINE_COLOUR : GRAPH_GRID_COLOUR;
445 GfxFillRect(x, r.top, x + gridline_width - 1, r.bottom, grid_colour);
452 for (
int i = 0; i < (num_hori_lines + 1); i++) {
458 GfxFillRect(r.left, y, r.right + gridline_width - 1, y + gridline_width - 1, GRAPH_GRID_COLOUR);
463 GfxFillRect(r.left, r.top, r.left + gridline_width - 1, r.bottom + gridline_width - 1, GRAPH_AXIS_LINE_COLOUR);
466 y = x_axis_offset + r.top;
467 GfxFillRect(r.left, y, r.right + gridline_width - 1, y + gridline_width - 1, GRAPH_ZERO_LINE_COLOUR);
470 if (this->num_on_x_axis == 0)
return;
472 assert(this->num_on_x_axis > 0);
475 int64_t y_label = interval.
highest;
476 int64_t y_label_separation =
abs(interval.
highest - interval.
lowest) / num_hori_lines;
480 for (
int i = 0; i < (num_hori_lines + 1); i++) {
483 GetString(STR_GRAPH_Y_LABEL, this->format_str_y_axis, y_label),
487 GetString(STR_GRAPH_Y_LABEL, this->format_str_y_axis, y_label),
491 y_label -= y_label_separation;
495 x = rtl ? r.right : r.left;
499 x += (this->num_vert_lines - this->num_on_x_axis) * x_sep;
502 if (this->draw_dates) {
504 TimerGameEconomy::Year yr = this->year;
505 for (
int i = 0; i < this->num_on_x_axis; i++) {
508 GetString(mo == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH, STR_MONTH_ABBREV_JAN + mo, yr),
512 GetString(mo == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH, STR_MONTH_ABBREV_JAN + mo, yr),
516 mo += this->month_increment;
522 GfxFillRect(x + x_sep, r.top + gridline_width, x + x_sep + gridline_width - 1, r.bottom - 1, GRAPH_YEAR_LINE_COLOUR);
530 if (this->x_values_reversed) {
531 label = this->x_values_increment * this->num_on_x_axis;
532 iterator = -this->x_values_increment;
534 label = this->x_values_increment;
535 iterator = this->x_values_increment;
538 for (
int i = 0; i < this->num_on_x_axis; i++) {
553 uint pointoffs1 = pointwidth / 2;
554 uint pointoffs2 = pointwidth - pointoffs1;
557 if (
HasBit(this->excluded_data, dataset.exclude_bit))
return;
558 if (
HasBit(this->excluded_range, dataset.range_bit))
return;
562 x = r.right + (x_sep / 2);
564 x = r.left + (x_sep / 2);
568 x += (this->num_vert_lines - this->num_on_x_axis) * x_sep;
588 int reduce_range = std::max(mult_range - 31, 0);
592 datapoint = -(
abs(datapoint) >> reduce_range);
594 datapoint >>= reduce_range;
596 y = r.top + x_axis_offset - ((r.bottom - r.top) * datapoint) / (interval_size >> reduce_range);
599 GfxFillRect(x - pointoffs1, y - pointoffs1, x + pointoffs2, y + pointoffs2, colour);
616 for (
const DataSet &dataset : this->data) {
617 if (dataset.exclude_bit != this->highlight_data && dataset.range_bit != this->highlight_range) {
618 draw_dataset(dataset, dataset.colour);
624 if (this->highlight_state && (this->highlight_data != UINT8_MAX || this->highlight_range != UINT8_MAX)) {
625 for (
const DataSet &dataset : this->data) {
626 if (dataset.exclude_bit == this->highlight_data || dataset.range_bit == this->highlight_range) {
635 format_str_y_axis(format_str_y_axis)
649 void UpdateMatrixSize(
WidgetID widget, Dimension &size, Dimension &
resize,
auto labels)
652 for (
const StringID &str : labels) {
660 size.height *=
static_cast<uint
>(std::size(labels));
672 this->UpdateMatrixSize(widget, size,
resize, this->ranges);
676 this->UpdateMatrixSize(widget, size,
resize, this->scales | std::views::transform(&GraphScale::label));
680 uint x_label_width = 0;
683 if (this->draw_dates) {
685 for (uint mo = 0; mo < 12; ++mo) {
686 x_label_width = std::max(x_label_width,
GetStringBoundingBox(
GetString(mo == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH, STR_MONTH_ABBREV_JAN + mo, yr)).
width);
698 size.height = std::max<uint>(size.height, size.width / 3);
717 for (
const auto &str : this->ranges) {
718 bool lowered = !
HasBit(this->excluded_range, index) && !
HasBit(this->masked_range, index);
724 DrawString(text, str, (this->highlight_state && this->highlight_range == index) ? TC_WHITE : TC_BLACK,
SA_CENTER,
false,
FS_SMALL);
726 if (
HasBit(this->masked_range, index)) {
738 uint8_t selected_month_increment = this->scales[this->selected_scale].month_increment;
740 for (
const auto &
scale : this->scales) {
766 if (
HasBit(this->masked_range, row))
break;
775 const auto &
scale = this->scales[row];
776 if (this->selected_scale != row) {
777 this->selected_scale = row;
778 this->month_increment =
scale.month_increment;
779 this->x_values_increment =
scale.x_values_increment;
792 uint8_t new_highlight_range = UINT8_MAX;
795 if (!
HasBit(this->excluded_range, row)) new_highlight_range =
static_cast<uint8_t
>(row);
799 uint8_t new_highlight_data = UINT8_MAX;
802 if (dataset_index.has_value() && !
HasBit(this->excluded_data, *dataset_index)) new_highlight_data = *dataset_index;
805 if (this->highlight_data == new_highlight_data && this->highlight_range == new_highlight_range)
return;
808 this->highlight_data = new_highlight_data;
809 this->highlight_range = new_highlight_range;
810 this->highlight_state =
true;
824 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
826 if (!gui_scope)
return;
841 virtual std::optional<uint8_t>
GetDatasetIndex([[maybe_unused]]
int y) {
return std::nullopt; }
844class BaseCompanyGraphWindow :
public BaseGraphWindow {
846 BaseCompanyGraphWindow(
WindowDesc &desc,
StringID format_str_y_axis) : BaseGraphWindow(desc, format_str_y_axis) {}
866 for (CompanyID c = CompanyID::Begin(); c < MAX_COMPANIES; ++c) {
872 nums = std::min(this->num_vert_lines, std::max(nums, c->num_valid_stat_ent));
882 if (!initialize && this->excluded_data == excluded_companies.
base() && this->num_on_x_axis == nums &&
883 this->year == yr && this->month == mo) {
888 this->excluded_data = excluded_companies.
base();
889 this->num_on_x_axis = nums;
894 for (CompanyID k = CompanyID::Begin(); k < MAX_COMPANIES; ++k) {
896 if (c ==
nullptr)
continue;
898 DataSet &dataset = this->data.emplace_back();
900 dataset.exclude_bit = k.base();
902 for (
int j = this->num_on_x_axis, i = 0; --j >= 0;) {
929struct OperatingProfitGraphWindow : BaseCompanyGraphWindow {
931 BaseCompanyGraphWindow(desc, STR_JUST_CURRENCY_SHORT)
946static constexpr std::initializer_list<NWidgetPart> _nested_operating_profit_widgets = {
958 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
965 WDP_AUTO,
"graph_operating_profit", 0, 0,
968 _nested_operating_profit_widgets
972void ShowOperatingProfitGraph()
982struct IncomeGraphWindow : BaseCompanyGraphWindow {
984 BaseCompanyGraphWindow(desc, STR_JUST_CURRENCY_SHORT)
999static constexpr std::initializer_list<NWidgetPart> _nested_income_graph_widgets = {
1011 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1021 _nested_income_graph_widgets
1024void ShowIncomeGraph()
1033struct DeliveredCargoGraphWindow : BaseCompanyGraphWindow {
1035 BaseCompanyGraphWindow(desc, STR_JUST_COMMA)
1046 return c->
old_economy[j].delivered_cargo.GetSum<OverflowSafeInt64>();
1050static constexpr std::initializer_list<NWidgetPart> _nested_delivered_cargo_graph_widgets = {
1062 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1068static WindowDesc _delivered_cargo_graph_desc(
1069 WDP_AUTO,
"graph_delivered_cargo", 0, 0,
1072 _nested_delivered_cargo_graph_widgets
1075void ShowDeliveredCargoGraph()
1084struct PerformanceHistoryGraphWindow : BaseCompanyGraphWindow {
1086 BaseCompanyGraphWindow(desc, STR_JUST_COMMA)
1107static constexpr std::initializer_list<NWidgetPart> _nested_performance_history_widgets = {
1120 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1127 WDP_AUTO,
"graph_performance", 0, 0,
1130 _nested_performance_history_widgets
1133void ShowPerformanceHistoryGraph()
1142struct CompanyValueGraphWindow : BaseCompanyGraphWindow {
1144 BaseCompanyGraphWindow(desc, STR_JUST_CURRENCY_SHORT)
1159static constexpr std::initializer_list<NWidgetPart> _nested_company_value_graph_widgets = {
1171 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1178 WDP_AUTO,
"graph_company_value", 0, 0,
1181 _nested_company_value_graph_widgets
1184void ShowCompanyValueGraph()
1189struct BaseCargoGraphWindow : BaseGraphWindow {
1198 void InitializeWindow(WindowNumber number,
StringID footer_wallclock = STR_NULL,
StringID footer_calendar = STR_NULL)
1233 if (row >= this->vscroll->
GetCount())
return std::nullopt;
1236 if (!
HasBit(this->cargo_types, cs->Index()))
continue;
1237 if (row-- > 0)
continue;
1242 return std::nullopt;
1260 for (
CargoType cargo_type : SetCargoBitIterator(this->cargo_types)) {
1270 this->line_height = size.height;
1271 size.height = this->line_height * 11;
1273 fill.height =
resize.height = this->line_height;
1291 if (!
HasBit(this->cargo_types, cs->Index()))
continue;
1293 if (pos-- > 0)
continue;
1294 if (--max < 0)
break;
1296 bool lowered = !
HasBit(this->excluded_data, cs->Index());
1307 if (this->highlight_data == cs->Index()) pc = this->highlight_state ?
PC_WHITE :
PC_BLACK;
1313 line = line.
Translate(0, this->line_height);
1337 if (row >= this->vscroll->
GetCount())
return;
1342 if (!
HasBit(this->cargo_types, cs->Index()))
continue;
1343 if (row-- > 0)
continue;
1369struct PaymentRatesGraphWindow : BaseCargoGraphWindow {
1370 static inline CargoTypes excluded_cargo_types{};
1376 this->draw_dates =
false;
1378 this->x_values_reversed =
false;
1382 this->InitializeWindow(
window_number, STR_GRAPH_CARGO_PAYMENT_RATES_SECONDS, STR_GRAPH_CARGO_PAYMENT_RATES_DAYS);
1392 return PaymentRatesGraphWindow::excluded_cargo_types;
1400 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
1402 if (!gui_scope)
return;
1422 DataSet &dataset = this->data.emplace_back();
1423 dataset.colour = cs->legend_colour;
1424 dataset.exclude_bit = cs->Index();
1426 for (uint j = 0; j != this->num_on_x_axis; j++) {
1427 dataset.values[j] = GetTransportedGoodsIncome(10, 20, j * 4 + 4, cs->Index());
1433static constexpr std::initializer_list<NWidgetPart> _nested_cargo_payment_rates_widgets = {
1442 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_HEADER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetStringTip(STR_GRAPH_CARGO_PAYMENT_RATES_TITLE),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1451 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_MATRIX),
SetFill(1, 0),
SetResize(0, 2),
SetMatrixDataTip(1, 0, STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO),
SetScrollbar(
WID_GRAPH_MATRIX_SCROLLBAR),
1459 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1466 WDP_AUTO,
"graph_cargo_payment_rates", 0, 0,
1469 _nested_cargo_payment_rates_widgets
1473void ShowCargoPaymentRates()
1482struct PerformanceRatingDetailWindow :
Window {
1483 static CompanyID company;
1485 uint score_info_left = 0;
1486 uint score_info_right = 0;
1490 uint bar_height = 0;
1491 uint score_detail_left = 0;
1492 uint score_detail_right = 0;
1496 this->UpdateCompanyStats();
1502 void UpdateCompanyStats()
1520 uint score_info_width = 0;
1534 int max = -(999999999 - 500);
1555 this->score_info_left = rtl ? right - score_info_width :
left;
1556 this->score_info_right = rtl ? right :
left + score_info_width;
1558 this->score_detail_left = rtl ?
left : right - score_detail_width;
1559 this->score_detail_right = rtl ?
left + score_detail_width : right;
1562 this->bar_right = this->bar_left + this->bar_width - 1;
1570 if (this->company == CompanyID::Invalid())
return;
1589 int64_t val = _score_part[company][score_type];
1599 uint bar_top =
CentreBounds(r.top, r.bottom, this->bar_height);
1602 DrawString(this->score_info_left, this->score_info_right, text_top, STR_PERFORMANCE_DETAIL_VEHICLES +
to_underlying(score_type));
1608 uint x =
Clamp<int64_t>(val, 0, needed) * this->bar_width / needed;
1611 x = this->bar_right - x;
1613 x = this->bar_left + x;
1617 if (x != this->bar_left)
GfxFillRect(this->bar_left, bar_top, x, bar_top + this->bar_height - 1, rtl ? colour_notdone : colour_done);
1618 if (x != this->bar_right)
GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height - 1, rtl ? colour_done : colour_notdone);
1628 switch (score_type) {
1634 DrawString(this->score_detail_left, this->score_detail_right, text_top,
GetString(STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY, val, needed));
1637 DrawString(this->score_detail_left, this->score_detail_right, text_top,
GetString(STR_PERFORMANCE_DETAIL_AMOUNT_INT, val, needed));
1659 if (--this->timeout == 0) {
1660 this->UpdateCompanyStats();
1670 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
1672 if (!gui_scope)
return;
1674 for (CompanyID i = CompanyID::Begin(); i < MAX_COMPANIES; ++i) {
1682 this->company = CompanyID::Invalid();
1685 if (this->company == CompanyID::Invalid()) {
1687 this->company = c->index;
1693 if (this->company != CompanyID::Invalid()) {
1699CompanyID PerformanceRatingDetailWindow::company = CompanyID::Invalid();
1705struct IndustryProductionGraphWindow : BaseCargoGraphWindow {
1706 static inline constexpr StringID RANGE_LABELS[] = {
1707 STR_GRAPH_INDUSTRY_RANGE_PRODUCED,
1708 STR_GRAPH_INDUSTRY_RANGE_TRANSPORTED,
1709 STR_GRAPH_INDUSTRY_RANGE_DELIVERED,
1710 STR_GRAPH_INDUSTRY_RANGE_WAITING,
1713 static inline CargoTypes excluded_cargo_types{};
1716 BaseCargoGraphWindow(desc, STR_JUST_COMMA)
1720 this->month_increment = 1;
1723 this->ranges = RANGE_LABELS;
1726 if (!i->
IsCargoProduced()) this->masked_range = (1U << 0) | (1U << 1);
1727 if (!i->
IsCargoAccepted()) this->masked_range = (1U << 2) | (1U << 3);
1743 for (
const auto &a : i->
accepted) {
1746 for (
const auto &p : i->
produced) {
1754 return IndustryProductionGraphWindow::excluded_cargo_types;
1773 if (!initialize && this->excluded_data == this->
GetExcludedCargoTypes() && this->num_on_x_axis == this->num_vert_lines && this->year == yr && this->month == mo) {
1789 for (
const auto &p : i->
produced) {
1793 DataSet &produced = this->data.emplace_back();
1794 produced.colour = cs->legend_colour;
1795 produced.exclude_bit = cs->
Index();
1796 produced.range_bit = 0;
1798 DataSet &transported = this->data.emplace_back();
1799 transported.colour = cs->legend_colour;
1800 transported.exclude_bit = cs->
Index();
1801 transported.range_bit = 1;
1802 transported.dash = 2;
1809 for (
const auto &a : i->accepted) {
1813 DataSet &accepted = this->data.emplace_back();
1814 accepted.colour = cs->legend_colour;
1815 accepted.exclude_bit = cs->
Index();
1816 accepted.range_bit = 2;
1819 DataSet &waiting = this->data.emplace_back();
1820 waiting.colour = cs->legend_colour;
1821 waiting.exclude_bit = cs->
Index();
1822 waiting.range_bit = 3;
1834static constexpr std::initializer_list<NWidgetPart> _nested_industry_production_widgets = {
1847 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_RANGE_MATRIX),
SetFill(1, 0),
SetResize(0, 0),
SetMatrixDataTip(1, 0, STR_GRAPH_TOGGLE_RANGE),
1853 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_MATRIX),
SetFill(1, 0),
SetResize(0, 2),
SetMatrixDataTip(1, 0, STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO),
SetScrollbar(
WID_GRAPH_MATRIX_SCROLLBAR),
1857 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_SCALE_MATRIX),
SetFill(1, 0),
SetResize(0, 0),
SetMatrixDataTip(1, 0, STR_GRAPH_SELECT_SCALE),
1863 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
1870 WDP_AUTO,
"graph_industry_production", 0, 0,
1873 _nested_industry_production_widgets
1876void ShowIndustryProductionGraph(
WindowNumber window_number)
1881struct TownCargoGraphWindow : BaseCargoGraphWindow {
1882 static inline constexpr StringID RANGE_LABELS[] = {
1883 STR_GRAPH_TOWN_RANGE_PRODUCED,
1884 STR_GRAPH_TOWN_RANGE_TRANSPORTED,
1887 static inline CargoTypes excluded_cargo_types{};
1893 this->month_increment = 1;
1896 this->ranges = RANGE_LABELS;
1912 for (
const auto &s : t->
supplied) {
1920 return TownCargoGraphWindow::excluded_cargo_types;
1939 if (!initialize && this->excluded_data == this->
GetExcludedCargoTypes() && this->num_on_x_axis == this->num_vert_lines && this->year == yr && this->month == mo) {
1954 for (
const auto &s : t->
supplied) {
1958 DataSet &produced = this->data.emplace_back();
1959 produced.colour = cs->legend_colour;
1960 produced.exclude_bit = cs->
Index();
1961 produced.range_bit = 0;
1963 DataSet &transported = this->data.emplace_back();
1964 transported.colour = cs->legend_colour;
1965 transported.exclude_bit = cs->
Index();
1966 transported.range_bit = 1;
1967 transported.dash = 2;
1978static constexpr std::initializer_list<NWidgetPart> _nested_town_cargo_graph_widgets = {
1991 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_RANGE_MATRIX),
SetFill(1, 0),
SetResize(0, 0),
SetMatrixDataTip(1, 0, STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO),
1997 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_MATRIX),
SetFill(1, 0),
SetResize(0, 2),
SetMatrixDataTip(1, 0, STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO),
SetScrollbar(
WID_GRAPH_MATRIX_SCROLLBAR),
2001 NWidget(
WWT_MATRIX, COLOUR_BROWN,
WID_GRAPH_SCALE_MATRIX),
SetFill(1, 0),
SetResize(0, 0),
SetMatrixDataTip(1, 0, STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO),
2007 NWidget(
WWT_TEXT, INVALID_COLOUR,
WID_GRAPH_FOOTER),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 0, 2, 0),
SetTextStyle(TC_BLACK,
FS_SMALL),
SetAlignment(
SA_CENTER),
2014 WDP_AUTO,
"graph_town_cargo", 0, 0,
2017 _nested_town_cargo_graph_widgets
2032 const StringID performance_tips[] = {
2033 realtime ? STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_PERIODS : STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP_YEARS,
2034 STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP,
2035 realtime ? STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_PERIODS : STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP_YEARS,
2036 STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP,
2037 STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP,
2038 STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP,
2039 STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP,
2040 STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP,
2041 STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP,
2042 STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP,
2049 auto panel = std::make_unique<NWidgetBackground>(
WWT_PANEL, COLOUR_BROWN, widnum);
2050 panel->SetFill(1, 1);
2052 vert->Add(std::move(panel));
2063static constexpr std::initializer_list<NWidgetPart> _nested_performance_rating_detail_widgets = {
2076static WindowDesc _performance_rating_detail_desc(
2080 _nested_performance_rating_detail_widgets
2083void ShowPerformanceRatingDetail()
2088void InitializeGraphGui()
2091 PaymentRatesGraphWindow::excluded_cargo_types = {};
2092 IndustryProductionGraphWindow::excluded_cargo_types = {};
constexpr uint8_t FindLastBit(T x)
Search the last set bit in a value.
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr uint CountBits(T value)
Counts the number of set bits in a variable.
constexpr bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
uint8_t CargoType
Cargo slots to indicate a cargo type within a game.
bool IsValidCargoType(CargoType cargo)
Test whether cargo type is not INVALID_CARGO.
static const CargoType NUM_CARGO
Maximum number of cargo types in a game.
std::span< const CargoSpec * > _sorted_standard_cargo_specs
Standard cargo specifications sorted alphabetically by name.
CargoTypes _standard_cargo_mask
Bitmask of real cargo types available.
std::vector< const CargoSpec * > _sorted_cargo_specs
Cargo specifications sorted alphabetically by name.
Types/functions related to cargoes.
constexpr Tstorage base() const noexcept
Retrieve the raw value behind this bit set.
constexpr Timpl & Set()
Set all bits.
void UpdateStatistics(bool initialize) override
Update the statistics.
virtual OverflowSafeInt64 GetGraphData(const Company *c, int j)=0
Get the data to show in the graph for a given company at a location along the X-axis.
An interval timer will fire every interval, and will continue to fire until it is deleted.
static constexpr TimerGameTick::Ticks DAY_TICKS
1 day is 74 ticks; TimerGameCalendar::date_fract used to be uint16_t and incremented by 885.
static Year year
Current year, starting at 0.
static Month month
Current month (0..11).
static bool UsingWallclockUnits(bool newgame=false)
Check if we are using wallclock units.
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.
GUI Functions related to companies.
Functions to handle different currencies.
const CurrencySpec & GetCurrency()
Get the currently selected currency.
int UpdateCompanyRatingAndValue(Company *c, bool update)
if update is set to true, the economy is updated with this score (also the house is updated,...
const EnumClassIndexContainer< std::array< ScoreInfo, to_underlying(ScoreID::End)>, ScoreID > _score_info
Score info, values used for computing the detailed performance rating.
Functions related to the economy.
ScoreID
Score categories in the detailed performance rating.
@ Begin
The lowest valid value.
@ MinIncome
Income in the quater with the lowest profit of the last 12 quaters.
@ End
Score ID end marker.
@ Total
Total points out of possible points ,must always be the last entry.
@ Loan
The amount of money company can take as a loan.
@ MaxIncome
Income in the quater with the highest profit of the last 12 quaters.
@ MinProfit
The profit of the vehicle with the lowest income.
@ Money
Amount of money company has in the bank.
static constexpr int SCORE_MAX
The max score that can be in the performance history.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23).
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
int CentreBounds(int min, int max, int size)
Determine where to position a centred object.
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 DrawStringMultiLineWithClipping(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw a multiline string, possibly over multiple lines, if the region is within the current display cl...
void GfxFillRect(int left, int top, int right, int bottom, const std::variant< PixelColour, PaletteID > &colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
Functions related to the gfx engine.
@ FS_SMALL
Index of the small font in the font tables.
@ FS_NORMAL
Index of the normal font in the font tables.
@ SA_LEFT
Left align the text.
@ SA_RIGHT
Right align the text (must be a single bit).
@ SA_HOR_CENTER
Horizontally center the text.
@ SA_FORCE
Force the alignment, i.e. don't swap for RTL languages.
@ SA_CENTER
Center both horizontally and vertically.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
constexpr double INT64_MAX_IN_DOUBLE
The biggest double that when cast to int64_t still fits in a int64_t.
static std::unique_ptr< NWidgetBase > MakeNWidgetCompanyLines()
Construct a vertical list of buttons, one for each company.
static CompanyMask _legend_excluded_companies
Bitmasks of company and cargo indices that shouldn't be drawn.
std::unique_ptr< NWidgetBase > MakeCompanyButtonRowsGraphGUI()
Make a number of rows with buttons for each company for the performance rating detail window.
static const OverflowSafeInt64 INVALID_DATAPOINT(INT64_MAX)
Value used for a datapoint that shouldn't be drawn.
static const uint INVALID_DATAPOINT_POS
Used to determine if the previous point was drawn.
static std::unique_ptr< NWidgetBase > MakePerformanceDetailPanels()
Make a vertical list of panels for outputting score details.
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
Functions for storing historical data.
void FillFromHistory(const HistoryData< T > &history, ValidHistoryMask valid_history, const HistoryRange &hr, Tfillers &&... fillers)
Fill some data with historical data.
#define Point
Macro that prevents name conflicts between included headers.
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr T abs(const T a)
Returns the absolute value of (scalar) variable.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
PixelColour GetColourGradient(Colours colour, ColourShade shade)
Get colour gradient palette index.
constexpr PixelColour GREY_SCALE(uint8_t level)
Return the colour for a particular greyscale level.
static constexpr PixelColour PC_BLACK
Black palette colour.
static constexpr PixelColour PC_WHITE
White palette colour.
A number of safeguards to prevent using unsafe methods.
ClientSettings _settings_client
The current settings for this game.
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Functions related to sound.
This file contains all sprite-related enums and defines.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
uint64_t GetParamMaxValue(uint64_t max_value, uint min_count, FontSize size)
Get some number that is suitable for string size computations.
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
TextDirection _current_text_dir
Text direction of the currently selected language.
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
uint legend_width
Width of legend 'blob'.
virtual CargoTypes & GetExcludedCargoTypes() const =0
Get a reference to the cargo types that should not be shown.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnInit() override
Notification that the nested widget tree gets initialized.
std::optional< uint8_t > GetDatasetIndex(int y) override
Get the dataset associated with a given Y-location within WID_GRAPH_MATRIX.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
virtual CargoTypes GetCargoTypes(WindowNumber number) const =0
Get the CargoTypes to show in this window.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
CargoTypes cargo_types
Cargo types that can be selected.
void OnResize() override
Called after the window got resized.
Scrollbar * vscroll
Cargo list scrollbar.
uint line_height
Pixel height of each cargo type row.
DataSet & dataset
Dataset to fill.
Tprojection proj
Projection to apply.
uint GetYLabelWidth(ValuesInterval current_interval, int num_hori_lines) const
Get width for Y labels.
TimerGameEconomy::Year year
The starting year that values are plotted against.
void OnGameTick() override
Called once per (game) tick.
virtual void UpdateStatistics(bool initialize)=0
Update the statistics.
static const int MIN_GRID_PIXEL_SIZE
Minimum distance between graph lines.
static const int GRAPH_NUM_MONTHS
Number of months displayed in the graph.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
static const int ECONOMY_QUARTER_MINUTES
Minutes per economic quarter.
static const int GRAPH_PAYMENT_RATE_STEPS
Number of steps on Payment rate graph.
void OnMouseOver(Point pt, WidgetID widget) override
The mouse is currently moving over the window or has just moved outside of the window.
std::span< const OverflowSafeInt64 > GetDataSetRange(const DataSet &dataset) const
Get appropriate part of dataset values for the current number of horizontal points.
TimerGameEconomy::Month month
The starting month that values are plotted against.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
static const int ECONOMY_MONTH_MINUTES
Minutes per economic month.
uint64_t excluded_data
bitmask of datasets hidden by the player.
bool draw_dates
Should we draw months and years on the time axis?
static const int MIN_GRAPH_NUM_LINES_Y
Minimal number of horizontal lines to draw.
uint64_t excluded_range
bitmask of ranges hidden by the player.
uint8_t highlight_range
Data range that should be highlighted, or UINT8_MAX for none.
bool highlight_state
Current state of highlight, toggled every TIMER_BLINK_INTERVAL period.
uint8_t month_increment
month increment between vertical lines. must be divisor of 12.
virtual std::optional< uint8_t > GetDatasetIndex(int y)
Get the dataset associated with a given Y-location within WID_GRAPH_MATRIX.
static const int PAYMENT_GRAPH_X_STEP_DAYS
X-axis step label for cargo payment rates "Days in transit".
static const int ECONOMY_YEAR_MINUTES
Minutes per economic year.
ValuesInterval GetValuesInterval(int num_hori_lines) const
Get the interval that contains the graph's data.
uint64_t masked_range
bitmask of ranges that are not available for the current data.
static const TextColour GRAPH_AXIS_LABEL_COLOUR
colour of the graph axis label.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void DrawGraph(Rect r) const
Actually draw the graph.
bool x_values_reversed
These values are used if the graph is being plotted against values rather than the dates specified by...
int16_t x_values_increment
These values are used if the graph is being plotted against values rather than the dates specified by...
static const int PAYMENT_GRAPH_X_STEP_SECONDS
X-axis step label for cargo payment rates "Seconds in transit".
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
uint8_t highlight_data
Data set that should be highlighted, or UINT8_MAX for none.
Specification of a cargo type.
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo type.
CargoType Index() const
Determines index of this cargospec.
StringID name
Name of this type of cargo.
Colours colour
Company colour.
std::array< CompanyEconomyEntry, MAX_HISTORY_QUARTERS > old_economy
Economic data of the company of the last MAX_HISTORY_QUARTERS quarters.
uint8_t num_valid_stat_ent
Number of valid statistical entries in old_economy.
OverflowSafeInt64 GetGraphData(const Company *c, int j) override
Get the data to show in the graph for a given company at a location along the X-axis.
uint16_t rate
The conversion rate compared to the base currency.
OverflowSafeInt64 GetGraphData(const Company *c, int j) override
Get the data to show in the graph for a given company at a location along the X-axis.
Dimensions (a width and height) of a rectangle in 2D.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
OverflowSafeInt64 GetGraphData(const Company *c, int j) override
Get the data to show in the graph for a given company at a location along the X-axis.
void UpdateStatistics(bool initialize) override
Update the statistics.
CargoTypes GetCargoTypes(WindowNumber window_number) const override
Get the CargoTypes to show in this window.
CargoTypes & GetExcludedCargoTypes() const override
Get a reference to the cargo types that should not be shown.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
void OnInit() override
Notification that the nested widget tree gets initialized.
CargoType cargo
Cargo type.
uint16_t accepted
Total accepted.
uint16_t waiting
Average waiting.
CargoType cargo
Cargo type.
uint16_t transported
Total transported.
uint16_t production
Total produced.
Defines the internal data of a functional industry.
bool IsCargoAccepted() const
Test if this industry accepts any cargo.
ValidHistoryMask valid_history
Mask of valid history records.
ProducedCargoes produced
produced cargo slots
AcceptedCargoes accepted
accepted cargo slots
bool IsCargoProduced() const
Test if this industry produces any cargo.
OverflowSafeInt64 GetGraphData(const Company *c, int j) override
Get the data to show in the graph for a given company at a location along the X-axis.
void UpdateStatistics(bool) override
Update the statistics.
void UpdatePaymentRates()
Update the payment rates according to the latest information.
CargoTypes & GetExcludedCargoTypes() const override
Get a reference to the cargo types that should not be shown.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
const IntervalTimer< TimerWindow > update_payment_interval
Update the payment rates on a regular interval.
CargoTypes GetCargoTypes(WindowNumber) const override
Get the CargoTypes to show in this window.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
OverflowSafeInt64 GetGraphData(const Company *c, int j) override
Get the data to show in the graph for a given company at a location along the X-axis.
Colour for pixel/line drawing.
static Pool::IterateWrapper< Company > Iterate(size_t from=0)
static Industry * Get(auto index)
static bool IsValidID(auto index)
static Company * GetIfValid(auto index)
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 WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
CargoTypes & GetExcludedCargoTypes() const override
Get a reference to the cargo types that should not be shown.
CargoTypes GetCargoTypes(WindowNumber window_number) const override
Get the CargoTypes to show in this window.
void UpdateStatistics(bool initialize) override
Update the statistics.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
void OnInit() override
Notification that the nested widget tree gets initialized.
uint32_t transported
Total transported.
uint32_t production
Total produced.
SuppliedCargoes supplied
Cargo statistics about supplied cargo.
ValidHistoryMask valid_history
Mask of valid history records.
Contains the interval of a graph's data.
OverflowSafeInt64 lowest
Lowest value of this interval. Must be zero or less.
OverflowSafeInt64 highest
Highest value of this interval. Must be zero or greater.
High level window description.
Number to differentiate different windows of the same class.
Data structure for an opened window.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing).
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
ResizeInfo resize
Resize information.
int scale
Scale of this window – used to determine how to resize.
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
int left
x position of left edge of the window
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
int GetRowFromWidget(int clickpos, WidgetID widget, int padding, int line_height=-1) const
Compute the row of a widget that a user clicked in.
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
int height
Height of the window (number of pixels down in y direction).
int width
width of the window (number of pixels to the right in x direction)
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
WindowNumber window_number
Window number within the window class.
Definition of Interval and OneShot timers.
Definition of the game-economy-timer.
Definition of the tick-based game-timer.
Definition of the Window system.
static constexpr std::chrono::milliseconds TIMER_BLINK_INTERVAL
Interval used by blinking interface elements.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting).
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ Lowered
If set the frame is lowered and the background colour brighter (ie. buttons when pressed).
Twindow * AllocateWindowDescFront(WindowDesc &desc, WindowNumber window_number, Targs... extra_arguments)
Open a new window.
@ WDP_AUTO
Find a place automatically.
@ WC_PERFORMANCE_HISTORY
Performance history graph; Window numbers:
@ WC_PERFORMANCE_DETAIL
Performance detail window; Window numbers:
@ WC_PAYMENT_RATES
Payment rates graph; Window numbers:
@ WC_GRAPH_LEGEND
Legend for graphs; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
@ WC_OPERATING_PROFIT
Operating profit graph; Window numbers:
@ WC_INDUSTRY_PRODUCTION
Industry production history graph; Window numbers:
@ WC_TOWN_VIEW
Town view; Window numbers:
@ WC_INDUSTRY_VIEW
Industry view; Window numbers:
@ WC_INCOME_GRAPH
Income graph; Window numbers:
@ WC_DELIVERED_CARGO
Delivered cargo graph; Window numbers:
@ WC_COMPANY_VALUE
Company value graph; Window numbers:
@ WC_TOWN_CARGO_GRAPH
Town cargo history graph; Window numbers:
Functions related to zooming.
@ Normal
The normal zoom level.