summaryrefslogtreecommitdiff
path: root/src/graph_gui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graph_gui.cpp')
-rw-r--r--src/graph_gui.cpp81
1 files changed, 70 insertions, 11 deletions
diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp
index 2745fcee0..08b1290cb 100644
--- a/src/graph_gui.cpp
+++ b/src/graph_gui.cpp
@@ -1100,6 +1100,57 @@ struct PerformanceRatingDetailWindow : Window {
this->timeout = DAY_TICKS * 5;
}
+ uint score_info_left;
+ uint score_info_right;
+ uint bar_left;
+ uint bar_right;
+ uint bar_width;
+ uint bar_height;
+ uint score_detail_left;
+ uint score_detail_right;
+
+ virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize)
+ {
+ switch (widget) {
+ case PRW_SCORE_FIRST:
+ this->bar_height = FONT_HEIGHT_NORMAL + 4;
+ size->height = this->bar_height + 2 * WD_MATRIX_TOP;
+
+ uint score_info_width = 0;
+ for (uint i = SCORE_BEGIN; i < SCORE_END; i++) {
+ score_info_width = max(score_info_width, GetStringBoundingBox(STR_PERFORMANCE_DETAIL_VEHICLES + i).width);
+ }
+ SetDParam(0, 1000);
+ score_info_width += GetStringBoundingBox(STR_BLACK_COMMA).width + WD_FRAMERECT_LEFT;
+
+ SetDParam(0, 100);
+ this->bar_width = GetStringBoundingBox(STR_PERFORMANCE_DETAIL_PERCENT).width + 20; // Wide bars!
+
+ /* At this number we are roughly at the max; it can become wider,
+ * but then you need at 1000 times more money. At that time you're
+ * not that interested anymore in the last few digits anyway. */
+ uint max = 999999999; // nine 9s
+ SetDParam(0, max);
+ SetDParam(1, max);
+ uint score_detail_width = GetStringBoundingBox(STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY).width;
+
+ size->width = 7 + score_info_width + 5 + this->bar_width + 5 + score_detail_width + 7;
+ uint left = 7;
+ uint right = size->width - 7;
+
+ bool rtl = _dynlang.text_dir == TD_RTL;
+ this->score_info_left = rtl ? right - score_info_width : left;
+ this->score_info_right = rtl ? right : left + score_info_width;
+
+ this->score_detail_left = rtl ? left : right - score_detail_width;
+ this->score_detail_right = rtl ? left + score_detail_width : right;
+
+ this->bar_left = left + (rtl ? score_detail_width : score_info_width) + 5;
+ this->bar_right = this->bar_left + this->bar_width;
+ break;
+ }
+ }
+
virtual void OnPaint()
{
/* Draw standard stuff */
@@ -1139,22 +1190,31 @@ struct PerformanceRatingDetailWindow : Window {
needed = SCORE_MAX;
}
- DrawString(7, 107, r.top + 6, STR_PERFORMANCE_DETAIL_VEHICLES + score_type);
+ uint bar_top = r.top + WD_MATRIX_TOP;
+ uint text_top = bar_top + 2;
+
+ DrawString(this->score_info_left, this->score_info_right, text_top, STR_PERFORMANCE_DETAIL_VEHICLES + score_type);
/* Draw the score */
SetDParam(0, score);
- DrawString(7, 107, r.top + 6, STR_BLACK_INT, TC_FROMSTRING, SA_RIGHT);
+ DrawString(this->score_info_left, this->score_info_right, text_top, STR_BLACK_COMMA, TC_FROMSTRING, SA_RIGHT);
/* Calculate the %-bar */
- byte x = Clamp(val, 0, needed) * 50 / needed;
+ uint x = Clamp(val, 0, needed) * this->bar_width / needed;
+ bool rtl = _dynlang.text_dir == TD_RTL;
+ if (rtl) {
+ x = this->bar_right - x;
+ } else {
+ x = this->bar_left + x;
+ }
/* Draw the bar */
- if (x != 0) GfxFillRect(112, r.top + 4, 112 + x, r.top + 16, colour_done);
- if (x != 50) GfxFillRect(112 + x, r.top + 4, 112 + 50, r.top + 16, colour_notdone);
+ if (x != this->bar_left) GfxFillRect(this->bar_left, bar_top, x, bar_top + this->bar_height, rtl ? colour_notdone : colour_done);
+ if (x != this->bar_right) GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height, rtl ? colour_done : colour_notdone);
/* Draw it */
SetDParam(0, Clamp(val, 0, needed) * 100 / needed);
- DrawString(112, 162, r.top + 6, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING, SA_CENTER);
+ DrawString(this->bar_left, this->bar_right, text_top, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING, SA_CENTER);
/* SCORE_LOAN is inversed */
if (score_type == SCORE_LOAN) val = needed - val;
@@ -1169,10 +1229,10 @@ struct PerformanceRatingDetailWindow : Window {
case SCORE_MAX_INCOME:
case SCORE_MONEY:
case SCORE_LOAN:
- DrawString(167, this->width, r.top + 6, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY);
+ DrawString(this->score_detail_left, this->score_detail_right, text_top, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY);
break;
default:
- DrawString(167, this->width, r.top + 6, STR_PERFORMANCE_DETAIL_AMOUNT_INT);
+ DrawString(this->score_detail_left, this->score_detail_right, text_top, STR_PERFORMANCE_DETAIL_AMOUNT_INT);
}
}
@@ -1256,11 +1316,10 @@ static NWidgetBase *MakePerformanceDetailPanels(int *biggest_index)
assert_compile(lengthof(performance_tips) == SCORE_END - SCORE_BEGIN);
- NWidgetVertical *vert = new NWidgetVertical();
+ NWidgetVertical *vert = new NWidgetVertical(NC_EQUALSIZE);
for (int widnum = PRW_SCORE_FIRST; widnum <= PRW_SCORE_LAST; widnum++) {
NWidgetBackground *panel = new NWidgetBackground(WWT_PANEL, COLOUR_GREY, widnum);
- panel->SetMinimalSize(299, 20);
- panel->SetFill(false, false);
+ panel->SetFill(true, true);
panel->SetDataTip(0x0, performance_tips[widnum - PRW_SCORE_FIRST]);
vert->Add(panel);
}