From 65cb4ccedf25386608dbf6041beae9ee4f27036d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 14 Jan 2022 18:11:59 +0000 Subject: [PATCH] Limit number of warnings whon in timetable window --- src/lang/english.txt | 2 ++ src/timetable_gui.cpp | 21 +++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/lang/english.txt b/src/lang/english.txt index 6eb63a64a5..2c7e6e82e8 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5742,6 +5742,8 @@ STR_TIMETABLE_WARNING_NO_SCHEDULED_DISPATCH_ORDER_ASSIGNED :{BLACK}The disp STR_TIMETABLE_WARNING_SCHEDULED_DISPATCH_ORDER_NO_WAIT_TIME :{BLACK}The scheduled dispatch order should have a timetabled wait time STR_TIMETABLE_WARNING_SCHEDULE_ID :{BLACK}Schedule {NUM}: {STRING} +STR_TIMETABLE_WARNINGS_OMITTED :{BLACK}{NUM} further warnings omitted... + # Date window (for timetable) STR_DATE_CAPTION :{WHITE}Set date STR_DATE_SET_DATE :{BLACK}Set date diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 290e74cb41..c7de060a91 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -279,6 +279,10 @@ struct TimetableWindow : Window { bool change_timetable_all; ///< Set wait time or speed for all timetable entries (ctrl-click) action int summary_warnings = 0; ///< NUmber of summary warnings shown + enum { + MAX_SUMMARY_WARNINGS = 10, + }; + TimetableWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc), sel_index(-1), @@ -345,7 +349,7 @@ struct TimetableWindow : Window { case WID_VT_SUMMARY_PANEL: { Dimension d = GetSpriteSize(SPR_WARNING_SIGN); - size->height = WD_FRAMERECT_TOP + 2 * FONT_HEIGHT_NORMAL + this->summary_warnings * std::max(d.height, FONT_HEIGHT_NORMAL) + WD_FRAMERECT_BOTTOM; + size->height = WD_FRAMERECT_TOP + 2 * FONT_HEIGHT_NORMAL + std::min(MAX_SUMMARY_WARNINGS, this->summary_warnings) * std::max(d.height, FONT_HEIGHT_NORMAL) + WD_FRAMERECT_BOTTOM; break; } } @@ -743,9 +747,7 @@ struct TimetableWindow : Window { const int warning_offset_y = (step_height - warning_dimensions.height) / 2; const bool rtl = _current_text_dir == TD_RTL; - int warning_count = 0; - - ProcessTimetableWarnings(v, [&](StringID text, bool warning) { + auto draw_warning = [&](StringID text, bool warning) { int left = r.left + WD_FRAMERECT_LEFT; int right = r.right - WD_FRAMERECT_RIGHT; if (warning) { @@ -758,8 +760,19 @@ struct TimetableWindow : Window { } DrawString(left, right, y + text_offset_y, text); y += step_height; + }; + + int warning_count = 0; + int warning_limit = this->summary_warnings > MAX_SUMMARY_WARNINGS ? MAX_SUMMARY_WARNINGS - 1 : std::min(MAX_SUMMARY_WARNINGS, this->summary_warnings); + + ProcessTimetableWarnings(v, [&](StringID text, bool warning) { + if (warning_count < warning_limit) draw_warning(text, warning); warning_count++; }); + if (warning_count > warning_limit) { + SetDParam(0, warning_count - warning_limit); + draw_warning(STR_TIMETABLE_WARNINGS_OMITTED, true); + } if (warning_count != this->summary_warnings) { TimetableWindow *mutable_this = const_cast(this);